diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 30466d17298..3ca6152d8da 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "260-235" + "GEOS_TPL_TAG": "262-349" } }, "runArgs": [ diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b34d56c8e70..4824e37d2a7 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -9,6 +9,9 @@ on: required: false type: string default: build + DOCKER_CERTS_UPDATE_COMMAND: + required: false + type: string CMAKE_BUILD_TYPE: required: true type: string @@ -16,6 +19,10 @@ on: required: false type: boolean default: false + DOCKER_CERTS_DIR: + required: false + type: string + default: '' DOCKER_IMAGE_TAG: required: true type: string @@ -40,6 +47,10 @@ on: HOST_CONFIG: required: false type: string + NPROC: + required: false + type: string + default: '' RUNS_ON: required: true type: string @@ -47,6 +58,12 @@ on: required: false type: boolean default: true + REQUIRED_LABEL: + required: false + type: string + LOCAL_BASELINE_DIR: + required: false + type: string secrets: GOOGLE_CLOUD_GCP: required: false @@ -54,6 +71,17 @@ jobs: build_test_deploy: runs-on: ${{ inputs.RUNS_ON }} steps: + - name: does_pr_have_necessary_labels + if: ${{inputs.REQUIRED_LABEL && github.event_name == 'pull_request'}} + run: | + pr_json=$(curl -H "Accept: application/vnd.github+json" https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.number }}) + LABELS=$(echo ${pr_json} | jq -crM '[.labels[].name]') + echo " the labels are ${LABELS}" + echo " the required label is ${{inputs.REQUIRED_LABEL}}" + if [[ "${LABELS}" != *"${{inputs.REQUIRED_LABEL}}"* ]]; then + exit 1 + fi + - name: 'Cleanup build folder' run: | pwd @@ -64,7 +92,7 @@ jobs: ls -la ./ - name: Checkout Repository - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: submodules: true lfs: ${{ inputs.BUILD_TYPE == 'integrated_tests' }} @@ -72,7 +100,7 @@ jobs: - id: 'auth' if: ${{ inputs.GCP_BUCKET || inputs.USE_SCCACHE }} - uses: 'google-github-actions/auth@v2.1.0' + uses: 'google-github-actions/auth@v2.1.2' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true @@ -93,7 +121,20 @@ jobs: docker_args=() script_args=() + if [[ -n "${{ inputs.DOCKER_CERTS_DIR }}" ]]; then + DOCKER_CERTS_DIR=${{ inputs.DOCKER_CERTS_DIR }} + docker_args+=(-e DOCKER_CERTS_DIR=${DOCKER_CERTS_DIR}) + fi + if [[ -n "${{ inputs.DOCKER_CERTS_UPDATE_COMMAND }}" ]]; then + DOCKER_CERTS_UPDATE_COMMAND=${{ inputs.DOCKER_CERTS_UPDATE_COMMAND }} + docker_args+=(-e DOCKER_CERTS_UPDATE_COMMAND=${DOCKER_CERTS_UPDATE_COMMAND}) + fi + + if [[ -n "${{ inputs.NPROC }}" ]]; then + NPROC=${{ inputs.NPROC }} + script_args+=(--nproc ${NPROC}) + fi docker_args+=(${{ inputs.DOCKER_RUN_ARGS }}) @@ -101,7 +142,7 @@ jobs: SHORT_COMMIT=${COMMIT:0:7} script_args+=(--install-dir-basename GEOSX-${SHORT_COMMIT}) - # All the data exchanged with the docker container is eventually meant to be send to the cloud. + # All the data exchanged with the docker container is eventually meant to be sent to the cloud. if [[ ! -z "${{ inputs.GCP_BUCKET }}" ]]; then if [ "${{ inputs.BUILD_TYPE }}" = "build" ]; then DATA_BASENAME=GEOSX-and-TPL-${SHORT_COMMIT}.tar.gz @@ -112,9 +153,9 @@ jobs: script_args+=(--data-basename ${DATA_BASENAME}) - DATA_EXCHANGE_DIR=/mnt/geos-exchange # Exchange folder outside of the container + DATA_EXCHANGE_DIR=${GITHUB_WORKSPACE}/geos-exchange # Exchange folder outside of the container if [ ! -d "${DATA_EXCHANGE_DIR}" ]; then - sudo mkdir -p ${DATA_EXCHANGE_DIR} + mkdir -p ${DATA_EXCHANGE_DIR} fi DATA_EXCHANGE_MOUNT_POINT=/tmp/exchange # Exchange folder inside of the container docker_args+=(--volume=${DATA_EXCHANGE_DIR}:${DATA_EXCHANGE_MOUNT_POINT}) @@ -128,11 +169,6 @@ jobs: script_args+=(--sccache-credentials $(basename ${GOOGLE_GHA_CREDS_PATH})) fi - if [ ${{ inputs.RUNS_ON }} == 'self-hosted' ]; then - RUNNER_CERTIFICATES_DIR=/etc/pki/ca-trust/source/anchors/ - mkdir -p ${GITHUB_WORKSPACE}/certificates - cp ${RUNNER_CERTIFICATES_DIR}/*.crt* ${GITHUB_WORKSPACE}/certificates - fi # We need to know where the code folder is mounted inside the container so we can run the script at the proper location! # Since this information is repeated twice, we use a variable. GITHUB_WORKSPACE_MOUNT_POINT=/tmp/geos @@ -154,7 +190,8 @@ jobs: script_args+=(--cmake-build-type ${{ inputs.CMAKE_BUILD_TYPE }}) script_args+=(${{ inputs.BUILD_AND_TEST_CLI_ARGS }}) - + + DOCKER_REPOSITORY=${{ inputs.DOCKER_REPOSITORY }} SPLIT_DOCKER_REPOSITORY=(${DOCKER_REPOSITORY//// }) CONTAINER_NAME=geosx_build_${SPLIT_DOCKER_REPOSITORY[1]}_${GITHUB_SHA:0:7} echo "CONTAINER_NAME: ${CONTAINER_NAME}" @@ -168,6 +205,53 @@ jobs: script_args+=(--code-coverage) fi + if [[ -n "${{ inputs.LOCAL_BASELINE_DIR }}" ]]; then + # Extract the 'baseline' value + + # Define the path to the YAML file + YAML_FILE_PATH="${GITHUB_WORKSPACE}/.integrated_tests.yaml" + + # Verify the YAML file path + if [[ ! -f "${YAML_FILE_PATH}" ]]; then + echo "Error: File $YAML_FILE_PATH does not exist." + else + echo "Found integratedTests file: $YAML_FILE_PATH." + fi + + # Extract the baseline field + BASELINE_FULL_PATH=$(grep -A 2 'baselines:' "${YAML_FILE_PATH}" | grep 'baseline:' | awk '{print $2}') + + # Remove the 'integratedTests/' prefix + BASELINE_TAG=${BASELINE_FULL_PATH#integratedTests/} + echo "Baseline: ${BASELINE_TAG}" + + # Extract the folder name + PR_NUMBER=$(echo "$BASELINE_TAG" | grep -o 'pr[0-9]*') + PR_BASELINE_FOLDER_NAME=baselines_${PR_NUMBER} + echo "Baseline folder name: ${PR_BASELINE_FOLDER_NAME}" + + CURRENT_BASELINE_DIR=${{ inputs.LOCAL_BASELINE_DIR }}/${PR_BASELINE_FOLDER_NAME} + echo "Current baseline dir: ${CURRENT_BASELINE_DIR}" + + if [ -d ${CURRENT_BASELINE_DIR} ];then + echo "Current baseline dir found." + ls -l ${CURRENT_BASELINE_DIR} + + # We defined a mount point and mount it read-only inside the container. + CURRENT_BASELINE_DIR_MOUNT=/tmp/geos/baselines + docker_args+=(--volume=${CURRENT_BASELINE_DIR}:${CURRENT_BASELINE_DIR_MOUNT}:ro) + else + echo "Current baselines directory (${CURRENT_BASELINE_DIR}) not found" + fi + fi + + echo running "docker run \ + ${docker_args[@]} \ + -h=`hostname` \ + ${{ inputs.DOCKER_REPOSITORY }}:${{ inputs.DOCKER_IMAGE_TAG }} \ + ${GITHUB_WORKSPACE_MOUNT_POINT}/scripts/ci_build_and_test_in_container.sh \ + ${script_args[@]}" + # In case of integrated tests run, we still want to send the results to the cloud for inspection. # While for standard build (if even possible), pushing a failed build would be pointless. # GHA set `-e` to bash scripts by default to fail asap, @@ -186,21 +270,49 @@ jobs: # Send to the bucket and print the download link when it makes sense. if [[ ! -z "${{ inputs.GCP_BUCKET }}" ]]; then if [[ "${{ inputs.BUILD_TYPE }}" = "integrated_tests" || ${EXIT_STATUS} -eq 0 ]]; then - CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ - echo "Download the bundle at https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/${DATA_BASENAME}" + if [ -f ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} ]; then + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download the bundle at https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/${DATA_BASENAME}" + fi + + if [ -f ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME} ]; then + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download integrated test logs here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/test_logs_${DATA_BASENAME}" + fi + + if [ -f ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} ];then + + if [[ -n "${{ inputs.LOCAL_BASELINE_DIR }}" ]]; then + # 1. We copy the baselines to a local directory to store them + + # 1.a Create the new target directory to store the new baselines + THIS_PR_NUMBER=pr${{ github.event.number }} + NEW_PR_BASELINE_FOLDER_NAME=baselines_${THIS_PR_NUMBER} + TARGET_DIR="${{ inputs.LOCAL_BASELINE_DIR }}/${NEW_PR_BASELINE_FOLDER_NAME}" + echo "Create folder ${TARGET_DIR}" + mkdir -p "${TARGET_DIR}" + + # 1.b We copy the new baselines to the new target directory + SOURCE_FILE="${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME}" + echo "Copy ${SOURCE_FILE} to ${TARGET_DIR}" + cp "${SOURCE_FILE}" "${TARGET_DIR}" + fi + + # 2. We push the baselines to the cloud + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download test baselines here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/baseline_${DATA_BASENAME}" + echo "New baseline ID: baseline_${DATA_BASENAME::-7}" + else + echo "Baselines ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} were not uploaded. Likeyly because no rebaseline was necessary." + fi fi fi - - # manually remove the workspace to avoid issues with the next job when using self-hosted runners - if [ -d "${GITHUB_WORKSPACE}/integratedTests" ]; then - rm -rf ${GITHUB_WORKSPACE}/integratedTests - fi exit ${EXIT_STATUS} - name: Upload coverage to Codecov if: inputs.CODE_COVERAGE - uses: codecov/codecov-action@v4.0.1 + uses: codecov/codecov-action@v4.3.1 with: files: geos_coverage.info.cleaned fail_ci_if_error: true diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 427fa1bdfb6..a7c506b5eeb 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -44,7 +44,6 @@ jobs: runs-on: ubuntu-22.04 outputs: DOCKER_IMAGE_TAG: ${{ steps.extract_docker_image_tag.outputs.DOCKER_IMAGE_TAG }} - LABELS: ${{ steps.extract_pr_info.outputs.LABELS }} steps: - name: Check that the PR is not a draft (cancel rest of jobs otherwise) id: extract_pr_info @@ -58,17 +57,12 @@ jobs: draft_status=$(echo ${pr_json} | jq '.draft') echo "Draft status of PR is ${draft_status}." if [[ $draft_status == true ]]; then exit 1 ; fi - - # If the workflow is meant to continue, we extract additional information for the json of the pr. - echo "LABELS=$(echo ${pr_json} | jq -crM '[.labels[].name]')" >> "$GITHUB_OUTPUT" - else - echo "LABELS=['ci: ready to be merged']" >> "$GITHUB_OUTPUT" fi # The TPL tag is contained in the codespaces configuration to avoid duplications. - name: Checkout .devcontainer/devcontainer.json - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: sparse-checkout: | .devcontainer/devcontainer.json @@ -104,7 +98,7 @@ jobs: # The integrated test submodule repository contains large data (using git lfs). # To save time (and money) we do not let Github Actions automatically clone all our (lfs) subrepositories and do it by hand. - name: Checkout Repository - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: # Let script update submodules; Github Actions submodule history causes error submodules: false @@ -215,7 +209,6 @@ jobs: needs: - is_not_draft_pull_request - cpu_builds - if: "${{ contains( fromJSON( needs.is_not_draft_pull_request.outputs.LABELS ), 'ci: run integrated tests') || github.event_name != 'pull_request' }}" uses: ./.github/workflows/build_and_test.yml secrets: inherit with: @@ -227,8 +220,28 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests - RUNS_ON: self-hosted - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g" + RUNS_ON: streak2-32core + NPROC: 32 + DOCKER_RUN_ARGS: "--cpus=32 --memory=384g -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" + REQUIRED_LABEL: "ci: run integrated tests" + LOCAL_BASELINE_DIR: /data/GEOS/baselines + + baseline_log: + needs: [is_not_draft_pull_request] + runs-on: ubuntu-22.04 + steps: + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + with: + submodules: false + lfs: false + fetch-depth: 0 + sparse-checkout: | + scripts + - name: Check that the baseline logs are modified if rebaselines are detected + run: "scripts/check_baseline_log.sh" code_coverage: needs: @@ -246,13 +259,12 @@ jobs: GCP_BUCKET: geosx/ubuntu22.04-gcc11 RUNS_ON: Runner_4core_16GB - # If the 'ci: ready to be merged' PR label is found, the cuda jobs run immediately along side linux jobs. + # If the 'ci: run CUDA builds' PR label is found, the cuda jobs run immediately along side linux jobs. # Note: CUDA jobs should only be run if PR is ready to merge. cuda_builds: name: ${{ matrix.name }} needs: - is_not_draft_pull_request - if: "${{ contains( fromJSON( needs.is_not_draft_pull_request.outputs.LABELS ), 'ci: ready to be merged') }}" strategy: # In-progress jobs will not be cancelled if there is a failure fail-fast : false @@ -265,8 +277,12 @@ jobs: ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - RUNS_ON: Runner_8core_32GB - + RUNS_ON: streak2 + NPROC: 16 + DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" + - name: Ubuntu CUDA (20.04, clang 10.0.0 + gcc 9.4.0, open-mpi 4.0.3, cuda-11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-install-schema" CMAKE_BUILD_TYPE: Release @@ -274,14 +290,21 @@ jobs: ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - RUNS_ON: self-hosted - DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all" + RUNS_ON: streak + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/centos7.7-gcc8.3.1-cuda11.8.89 - RUNS_ON: Runner_4core_16GB + RUNS_ON: streak2 + NPROC: 16 + DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. - name: Pecan GPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5, cuda 11.5.119) @@ -306,6 +329,8 @@ jobs: with: BUILD_AND_TEST_CLI_ARGS: ${{ matrix.BUILD_AND_TEST_CLI_ARGS }} CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }} + DOCKER_CERTS_DIR: ${{ matrix.DOCKER_CERTS_DIR }} + DOCKER_CERTS_UPDATE_COMMAND: ${{ matrix.DOCKER_CERTS_UPDATE_COMMAND }} DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} DOCKER_REPOSITORY: ${{ matrix.DOCKER_REPOSITORY }} DOCKER_RUN_ARGS: ${{ matrix.DOCKER_RUN_ARGS }} @@ -314,7 +339,9 @@ jobs: ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }} GCP_BUCKET: ${{ matrix.GCP_BUCKET }} HOST_CONFIG: ${{ matrix.HOST_CONFIG }} + NPROC: ${{ matrix.NPROC }} RUNS_ON: ${{ matrix.RUNS_ON }} + REQUIRED_LABEL: "ci: run CUDA builds" secrets: inherit # Convenience job - passes when all other jobs have passed (must pass the CUDA jobs). @@ -326,6 +353,7 @@ jobs: - check_code_style_and_documentation - cpu_builds - cuda_builds + - run_integrated_tests if: ${{ always() }} steps: - run: | @@ -334,10 +362,12 @@ jobs: echo "check_code_style_and_documentation: ${{needs.check_code_style_and_documentation.result}}" echo "cpu_builds: ${{needs.cpu_builds.result}}" echo "cuda_builds: ${{needs.cuda_builds.result}}" + echo "run_integrated_tests: ${{needs.run_integrated_tests.result}} " ${{ needs.if_not_unassigned_pull_request.result == 'success' && needs.are_submodules_in_sync.result == 'success' && needs.check_code_style_and_documentation.result == 'success' && needs.cpu_builds.result == 'success' && - needs.cuda_builds.result == 'success' + needs.cuda_builds.result == 'success' && + needs.run_integrated_tests.result == 'success' }} diff --git a/.gitmodules b/.gitmodules index a2d2fa8ccf5..029ba71a9ab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "src/coreComponents/constitutive/PVTPackage"] path = src/coreComponents/constitutive/PVTPackage url = ../../GEOS-DEV/PVTPackage.git -[submodule "integratedTests"] - path = integratedTests - url = ../../GEOS-DEV/integratedTests.git [submodule "src/coreComponents/fileIO/coupling/hdf5_interface"] path = src/coreComponents/fileIO/coupling/hdf5_interface url = ../../GEOS-DEV/hdf5_interface.git diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml new file mode 100644 index 00000000000..5014bcd9516 --- /dev/null +++ b/.integrated_tests.yaml @@ -0,0 +1,7 @@ +baselines: + bucket: geosx + baseline: integratedTests/baseline_integratedTests-pr3160-5651-0cad939 + +allow_fail: + all: '' + streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01 diff --git a/.readthedocs.yml b/.readthedocs.yml index cac04680e9d..16bd2dc1fc5 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -4,10 +4,12 @@ version: 2 build: - os: "ubuntu-20.04" + os: "ubuntu-22.04" apt_packages: + - curl + - graphviz - npm - - plantuml + - openjdk-21-jre-headless - texlive tools: nodejs: "16" @@ -16,6 +18,8 @@ build: post_install: - npm install -g npm@9.8.1 - npm install -g @mermaid-js/mermaid-cli@10.3.1 + # If you change the `/tmp/plantuml.jar` path, be sure to also update where this path is used as well (e.g. in `conf.py`). + - curl -fsSL https://github.com/plantuml/plantuml/releases/download/v1.2024.3/plantuml-gplv2-1.2024.3.jar -o /tmp/plantuml.jar # Set requirements to build the docs python: @@ -33,5 +37,4 @@ formats: all submodules: include: - src/coreComponents/constitutive/PVTPackage - - integratedTests recursive: true diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md new file mode 100644 index 00000000000..5c9f11ef6d4 --- /dev/null +++ b/BASELINE_NOTES.md @@ -0,0 +1,121 @@ + +Notes +========== + +This file is designed to track changes to the integrated test baselines. +Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. +These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). + +PR #3160 (2024-06-18) +====================== +Two experimental options for compositional flow solver. Rebaseline because of the new input flags. + +PR #3165 (2024-06-18) +====================== +Small bug fix. Rebaseline required due to appearance of useTotalMassEquation in well solver params. No real results change. + +PR #3088 (2024-06-17) +====================== +Adding temperature-dependent Solid Volumetric Heat Capacity. Rebaseline because of the parameter change in SolidInternalEnergy. + + +PR #3100 (2024-06-14) +====================== +Adding pressure stabilization for single phase poromechanics. + + +PR #3133 (2024-06-14) +====================== +Fix node ordering for faceElements. + + +PR #3021 (2024-06-13) +====================== +Preparatory work for fractures + wells. New test case added. + + +PR #3152 (2024-06-13) +====================== +Some random things. Baseline update because of the new parameter (minScalingFactor). + + +PR #3138 (2024-06-11) +====================== +Properly sync nonlinear solver params for coupled solver. Baseline update mostly due to number of iterations change in baseline files. + + +PR #3140 (2024-06-11) +====================== +Fixed derivative in EzrokhiBrineDensity + + +PR #3080 (2024-06-07) +===================== +Rebaseline after adding viscoelastic wave propagator. + + +PR #3075 (2024-06-05) +===================== +Introduce configuration tolerance. Rebaseline because of the new parameter in NonlinearSolverParameters. + + +PR #3120 (2024-06-05) +===================== +Add missing compositionalMultiphaseFlow tests into ATS and adjust output naming. Rebaseline accordingly. + + +PR #3113 (2024-06-05) +===================== +Add general version updateConfiguration. Rebaseline of some edfm cases is needed. + + +PR #3050 (2024-05-20) +===================== +Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. + + +PR #3141 (2024-05-28) +===================== +Test cashing baselines locally. + + +PR #3125 (2024-05-16) +===================== +Remove field to store pressure gradient cell-wise for solvers that don't need it. + + +PR #2110 (2024-05-13) +===================== +new field to store pressure gradient cell-wise. + + +PR #3060 (2024-05-13) +====================== +Rebaselined after addition of elastic VTI wave propagator. + + +PR #4950 (2024-05-10) +====================== +Added smoke tests for SeismicityRate solver in inducedSeismicity. + + +PR #3086 (2024-05-09) +====================== +Added a presure-dependent permeability model and the transmissibility calculation in the CellElementStencil + + +PR #3105 (2024-05-08) +====================== +Added missing derivative for temperature, hence small numerical diffs in thermal tests results and numeracal behavior + + +PR #2917 (2024-05-07) +====================== +New fields for wellsControls: wellControls1_ConstantMassRate_table, targetMassRate, massDensity, ... + + +PR #3044 (2024-05-02) +====================== +Removed old integratedTests submodule +Implemented new baseline storage +Implemented new CI integrated tests diff --git a/host-configs/LLNL/lassen-base.cmake b/host-configs/LLNL/lassen-base.cmake index 72747c4f7d8..0aa8696dac3 100644 --- a/host-configs/LLNL/lassen-base.cmake +++ b/host-configs/LLNL/lassen-base.cmake @@ -43,7 +43,6 @@ set(ESSL_LIBRARIES /usr/tcetmp/packages/essl/essl-6.3.0.2/lib64/libesslsmpcuda.s # TPL set(ENABLE_PAPI OFF CACHE BOOL "") set(SILO_BUILD_TYPE powerpc64-unknown-linux-gnu CACHE STRING "") -set(ENABLE_FESAPI OFF CACHE BOOL "" FORCE) # GEOSX specific options set(ENABLE_PVTPackage ON CACHE BOOL "") diff --git a/host-configs/LLNL/quartz-base.cmake b/host-configs/LLNL/quartz-base.cmake index 38047f8e0ce..5501677af1c 100644 --- a/host-configs/LLNL/quartz-base.cmake +++ b/host-configs/LLNL/quartz-base.cmake @@ -41,8 +41,6 @@ set(YAPF_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/pyt set(SPHINX_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/sphinx-build CACHE PATH "" FORCE) -set(ENABLE_FESAPI OFF CACHE BOOL "" FORCE) - # caliper set(ENABLE_CALIPER ON CACHE BOOL "" FORCE) set(ENABLE_CALIPER_HYPRE ON CACHE BOOL "" FORCE) @@ -58,9 +56,9 @@ set(MKL_LIBRARIES ${MKL_ROOT}/lib/intel64/libmkl_intel_lp64.so # ATS set(ATS_ARGUMENTS "--machine slurm36" CACHE STRING "") -# set(USER $ENV{USER} CACHE STRING "") -# set(ATS_WORKING_DIR "/p/lustre2/${USER}/integratedTests/${CONFIG_NAME}" CACHE PATH "") -# set(ATS_BASELINE_DIR "/p/lustre2/${USER}/integratedTests/baselines" CACHE PATH "") +set(USER $ENV{USER} CACHE STRING "") +set(ATS_WORKING_DIR "/p/lustre2/${USER}/integratedTestsGEOS/${CONFIG_NAME}" CACHE PATH "") +set(ATS_BASELINE_DIR "/p/lustre2/${USER}/integratedTestsGEOS/baselines" CACHE PATH "") # Temporary argument for python module change testing # set(GEOS_PYTHON_PACKAGES_BRANCH "feature/sherman/outOfPlaceATS" CACHE STRING "" FORCE) diff --git a/host-configs/TOTAL/pangea4-base.cmake b/host-configs/TOTAL/pangea4-base.cmake new file mode 100644 index 00000000000..17caf065580 --- /dev/null +++ b/host-configs/TOTAL/pangea4-base.cmake @@ -0,0 +1,65 @@ +####################################### +# +# Pangea4 - base config for CPU cluster +# +# - RAJA CPU +# - CHAI CPU +# - CUDA OFF +# - OPENMP OFF +# - HYPRE ON +# +####################################### + +####################################### +# SCIENTIFIC LIBRARIES +####################################### + +set( ENABLE_HYPRE ON CACHE BOOL "" FORCE ) +set( ENABLE_MATHPRESSO ON CACHE BOOL "" FORCE ) +set( ENABLE_PAMELA ON CACHE BOOL "" FORCE ) +set( ENABLE_PETSC OFF CACHE BOOL "" FORCE ) +set( ENABLE_PVTPackage ON CACHE BOOL "" FORCE ) +set( ENABLE_SCOTCH ON CACHE BOOL "" FORCE ) +set( ENABLE_SUITESPARSE ON CACHE BOOL "" FORCE ) +set( ENABLE_TRILINOS OFF CACHE BOOL "" FORCE ) +set( ENABLE_VTK ON CACHE BOOL "" FORCE ) + +####################################### +# DEVELOPMENT TOOLS +####################################### + +set( ENABLE_DOXYGEN ON CACHE BOOL "" FORCE ) +set( ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE ) +set( ENABLE_SPHINX ON CACHE BOOL "" FORCE ) +set( ENABLE_UNCRUSTIFY ON CACHE BOOL "" FORCE ) +set( ENABLE_XML_UPDATES ON CACHE BOOL "" FORCE ) + +####################################### +# PERFORMANCE TOOLS +####################################### + +set( ENABLE_BENCHMARKS ON CACHE BOOL "" FORCE ) +set( ENABLE_CALIPER ON CACHE BOOL "" FORCE ) + +####################################### +# RAJA/CHAI SETUP +####################################### + +set( ENABLE_OPENMP OFF CACHE BOOL "" FORCE ) +set( ENABLE_CUDA OFF CACHE BOOL "" FORCE ) + +set( ENABLE_CHAI ON CACHE BOOL "" FORCE ) +set( CHAI_BUILD_TYPE "cpu-no-rm" CACHE STRING "" FORCE ) +set( CHAI_ARGS "" CACHE STRING "" FORCE ) + +set( ENABLE_RAJA ON CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_HIP OFF CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_OPENMP OFF CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_TBB OFF CACHE BOOL "" FORCE ) + +####################################### +# PYTHON SETUP +####################################### + +set( ENABLE_PYGEOSX ON CACHE BOOL "" ) +set( ENABLE_VTK_WRAP_PYTHON ON CACHE BOOL "" ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake new file mode 100644 index 00000000000..b84e1040be4 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake @@ -0,0 +1,99 @@ +####################################### +# +# Pangea4 - gcc - hpcxompi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - oneAPI MKL for BLAS and LAPACK +# - HPC-X OpenMPI for MPI +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - hpcx = 2.17.1 +# - intel-oneapi-mkl = 2023.2.0 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load hpcx intel-oneapi-mkl/2023.2.0 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - HPC-X OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT DEFINED ENV{HPCX_MPI_DIR} ) + message( FATAL_ERROR "HPC-X OpenMPI is not loaded. Please load the hpcx module." ) +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - intel oneAPI MKL library + +set( ENABLE_MKL ON CACHE BOOL "" FORCE ) + +if( NOT DEFINED ENV{MKLROOT} ) + message( FATAL_ERROR "MKL is not loaded. Please load the intel-oneapi-mkl/2023.2.0 module." ) +endif() + +set( MKL_INCLUDE_DIRS $ENV{MKLROOT}/include CACHE STRING "" ) +set( MKL_LIBRARIES $ENV{MKLROOT}/lib/intel64/libmkl_rt.so + $ENV{GCC_PATH}/lib/gcc/x86_64-redhat-linux/12/libgomp.so + CACHE STRING "" ) + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake new file mode 100644 index 00000000000..53080a4d708 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake @@ -0,0 +1,94 @@ +####################################### +# +# Pangea4 - gcc - hpcxompi - openblas +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenBLAS for BLAS and LAPACK +# - HPC-X OpenMPI for MPI +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - hpcx = 2.17.1 +# - openblas = 0.3.23 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load hpcx openblas/0.3.23 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - HPC-X OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT DEFINED ENV{HPCX_MPI_DIR} ) + message( FATAL_ERROR "HPC-X OpenMPI is not loaded. Please load the hpcx module." ) +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - OpenBLAS library + +find_library(OPENBLAS_LIB openblas) + +if(NOT OPENBLAS_LIB) + message(FATAL_ERROR "OpenBLAS is not loaded. Please load the openblas/0.3.23 module.") +endif() + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake new file mode 100644 index 00000000000..e4265966ef0 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake @@ -0,0 +1,99 @@ +####################################### +# +# Pangea4 - gcc - openmpi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenMPI for MPI +# - oneAPI MKL for BLAS and LAPACK +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - openmpi = 4.1.6 +# - intel-oneapi-mkl = 2023.2.0 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load openmpi/4.1.6 intel-oneapi-mkl/2023.2.0 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT "$ENV{LMOD_MPI_NAME}" STREQUAL "openmpi" ) + message(FATAL_ERROR "OpenMPI is not loaded. Please load the openmpi/4.1.6 module.") +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - intel oneAPI MKL library + +set( ENABLE_MKL ON CACHE BOOL "" FORCE ) + +if( NOT DEFINED ENV{MKLROOT} ) + message( FATAL_ERROR "MKL is not loaded. Please load the intel-oneapi-mkl/2023.2.0 module." ) +endif() + +set( MKL_INCLUDE_DIRS $ENV{MKLROOT}/include CACHE STRING "" ) +set( MKL_LIBRARIES $ENV{MKLROOT}/lib/intel64/libmkl_rt.so + $ENV{GCC_PATH}/lib/gcc/x86_64-redhat-linux/12/libgomp.so + CACHE STRING "" ) + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake new file mode 100644 index 00000000000..e3a7c22b0c7 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake @@ -0,0 +1,94 @@ +####################################### +# +# Pangea4 - gcc - openmpi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenMPI for MPI +# - OpenBLAS for BLAS and LAPACK +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - openmpi = 4.1.6 +# - openbla = 0.3.23 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load openmpi/4.1.6 openblas/0.3.23 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT "$ENV{LMOD_MPI_NAME}" STREQUAL "openmpi" ) + message(FATAL_ERROR "OpenMPI is not loaded. Please load the openmpi/4.1.6 module.") +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - OpenBLAS library + +find_library(OPENBLAS_LIB openblas) + +if(NOT OPENBLAS_LIB) + message(FATAL_ERROR "OpenBLAS is not loaded. Please load the openblas/0.3.23 module.") +endif() + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/apple/macOS_Matteo.cmake b/host-configs/apple/macOS_Matteo.cmake deleted file mode 100644 index 6edb525f1aa..00000000000 --- a/host-configs/apple/macOS_Matteo.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set( HOMEBREW_DIR "/Users/cusini1/local" ) -set( CONFIG_NAME "macOS_Matteo" ) - -include(${CMAKE_CURRENT_LIST_DIR}/macOS_base.cmake) diff --git a/host-configs/apple/macOS_customized.cmake b/host-configs/apple/macOS_customized.cmake new file mode 100644 index 00000000000..c1707a0b945 --- /dev/null +++ b/host-configs/apple/macOS_customized.cmake @@ -0,0 +1,7 @@ +set( HOMEBREW_DIR $ENV{HOMEBREW_DIR} ) +set( CONFIG_NAME $ENV{GEOS_CONFIG_NAME} ) + +set(Python3_ROOT_DIR $ENV{GEOS_PYTHON_DIR} CACHE PATH "") +set(Python3_EXECUTABLE ${Python3_ROOT_DIR}/bin/python3 CACHE PATH "") + +include(${CMAKE_CURRENT_LIST_DIR}/macOS_base.cmake) diff --git a/host-configs/tpls.cmake b/host-configs/tpls.cmake index 08e605d79bf..239774a66db 100644 --- a/host-configs/tpls.cmake +++ b/host-configs/tpls.cmake @@ -3,6 +3,14 @@ # message("in tpls.cmake GEOSX_TPL_DIR=${GEOSX_TPL_DIR}") +# +# General TPL Folder verifications +# +if(NOT EXISTS ${GEOSX_TPL_DIR}) + message(WARNING "'GEOSX_TPL_DIR' does not exist.\n") +endif() + + if(EXISTS ${GEOSX_TPL_DIR}/raja) set(RAJA_DIR ${GEOSX_TPL_DIR}/raja CACHE PATH "" FORCE) endif() @@ -48,10 +56,6 @@ if(EXISTS ${GEOSX_TPL_DIR}/fmt) set(FMT_DIR ${GEOSX_TPL_DIR}/fmt CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/fesapi) - set(FESAPI_DIR ${GEOSX_TPL_DIR}/fesapi CACHE PATH "" FORCE) -endif() - # # Math TPLs # diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml similarity index 98% rename from inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml rename to inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml index 5d043375c8f..8ca061df0c1 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml +++ b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml @@ -188,7 +188,8 @@ + name="vtkOutput" + plotFileRoot="2ph_cap_1d_ihu"/> diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml index 556e49fdea4..389f0e2a0af 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml @@ -251,7 +251,8 @@ + name="vtkOutput" + plotFileRoot="4comp_2ph_1d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml index 921966dad20..25668102c78 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml @@ -47,7 +47,7 @@ target="/Solvers/compflow"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml index dea8dc17e22..a70fd719ee6 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml @@ -2,7 +2,7 @@ - + diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml index cd134e9e2f1..3edd2f02657 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml @@ -18,21 +18,15 @@ nx="{ 50, 1, 20, 1, 40 }" ny="{ 50, 1, 50 }" nz="{ 20, 30, 10 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml index 775890d368f..69362de80c4 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml @@ -18,21 +18,15 @@ nx="{ 5, 1, 2, 1, 4 }" ny="{ 5, 1, 5 }" nz="{ 5, 30, 5 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml index 9680e6ef85f..961d7c6d00d 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml @@ -73,19 +73,15 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml index 91ec5e502d4..985cec900ae 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml @@ -61,19 +61,15 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml index 7cd5d9467cd..45e0669af83 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml @@ -18,21 +18,15 @@ nx="{ 50, 1, 20, 1, 40 }" ny="{ 50, 1, 50 }" nz="{ 20, 30, 10 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml index ac2e8ae02d5..3aabd020d74 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml @@ -18,21 +18,15 @@ nx="{ 5, 1, 2, 1, 4 }" ny="{ 5, 1, 5 }" nz="{ 5, 30, 5 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml index e0b3cecde11..d693f1542e3 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml @@ -313,7 +313,8 @@ + name="vtkOutput" + plotFileRoot="co2_flux_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml index 296cd04fbc4..b5ea99f5ff5 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml @@ -199,7 +199,8 @@ + name="vtkOutput" + plotFileRoot="co2_hybrid_1d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats index a0072bc2653..20d44298c97 100644 --- a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats +++ b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats @@ -30,6 +30,22 @@ decks = [ restart_step=109, check_step=209, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="deadoil_3ph_stone2_1d", + description= + "Compositional multiphase flow test (1D displacement, 3-phase dead-oil, Stone2 relperm curves)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=109, + check_step=209, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="deadoil_3ph_corey_1d_fractured", + description= + "Compositional multiphase flow test with EDFM (1D displacement, 3-phase dead-oil, Brooks-Corey pairwise 2-phase relperm curves)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=0, + check_step=209, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="co2_hybrid_1d", description= @@ -86,6 +102,14 @@ decks = [ restart_step=28, check_step=38, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="2ph_cap_1d_ihu", + description= + "Two-phase flow test for IHU (1D displacement, 2-phase, capillary pressure)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=34, + check_step=60, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), ] generate_geos_tests(decks) diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml index 23af6f08231..595620b201c 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml @@ -30,7 +30,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -71,12 +74,12 @@ @@ -176,7 +179,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_2ph_staircase_gravity_segregation_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml index 35d52ad08c2..2d0b2693a80 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml @@ -88,11 +88,11 @@ beginTime="1e5" target="/Solvers/compflow"/> - + target="/Outputs/restartOutput"/> @@ -312,7 +312,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_3ph_corey_1d_fractured"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml index 2b90105cff6..7c97d2eed8d 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml @@ -31,7 +31,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -92,12 +95,12 @@ @@ -303,7 +306,8 @@ name="siloOutput" plotLevel="3"/> + name="vtkOutput" + plotFileRoot="deadoil_3ph_staircase_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml index e4daec34867..4fe769a93b1 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml @@ -29,7 +29,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -81,12 +84,12 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml index 2be6da038ed..545ca4e81f2 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml @@ -34,7 +34,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -91,12 +94,12 @@ @@ -249,7 +252,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_3ph_staircase_obl_3d"/> diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml new file mode 100644 index 00000000000..b4edabaad3d --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml new file mode 100644 index 00000000000..14378119874 --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml index 54cffee9212..92890413f4a 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml @@ -54,6 +54,34 @@ targetTotalRateTableName="totalRateTable" injectionTemperature="353.15" injectionStream="{ 1.0, 0.0 }"/> + + @@ -220,6 +248,12 @@ values="{ 8.02849025 , 0, 0}" interpolation="lower"/> + diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml new file mode 100644 index 00000000000..675d20853a3 --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml index 2c66c759f13..93f9b1469eb 100644 --- a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml +++ b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml @@ -65,7 +65,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> + format="binary" + plotFileRoot="sneddon_embFrac"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml new file mode 100644 index 00000000000..dc6696b11b7 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats new file mode 100644 index 00000000000..ebc33ea78ae --- /dev/null +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -0,0 +1,27 @@ +import os +import geos_ats +from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests, CurveCheckParameters + +curvecheck_params = {} +curvecheck_params["filename"] = "seismicityRate.hdf5" +curvecheck_params["tolerance"] = [1e-3] +curvecheck_params["script_instructions"] = [ ["./scripts/SeismicityRate_curveChecks.py", "curve_check_solution", "seismicityRate"] ] +curvecheck_params["curves"] = "seismicityRate" + +decks = [ + TestDeck( + name="SeismicityRate_poromechanics_1d_smoke", + description="", + partitions=((1, 1, 1), (2, 1, 1)), + restart_step=40, + check_step=90, + restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), + TestDeck( + name="SeismicityRate_analytical_verification_smoke", + description="Prescribed logarithmic stressing history", + partitions=((1, 1, 1), ), + restart_step=0, + check_step=100, + curvecheck_params=CurveCheckParameters(**curvecheck_params)) + ] +generate_geos_tests(decks) diff --git a/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py b/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py new file mode 100644 index 00000000000..c1e40e9bba6 --- /dev/null +++ b/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py @@ -0,0 +1,120 @@ + +import argparse +import numpy as np +import xml.etree.ElementTree as ElementTree +import matplotlib.pyplot as plt + +class analyticalSolution(): + def __init__( self, parameters ): + self.cTau = 1e-3 + self.aSigma = 1e6 + self.t_a = 1e6/parameters['backgroundStressingRate'] + self.initial_normal_traction = parameters['initialFaultNormalTraction'] + self.initial_fault_shear_traction = parameters['initialFaultShearTraction'] + + def compute_shear_stress( self, time_n, dt ): + return self.aSigma * np.log( self.cTau*( time_n + dt ) + 1 ) + self.initial_fault_shear_traction + + def compute_seismic_rate(self, time_n, dt, shear_stress): + K = np.exp( shear_stress / self.aSigma - self.initial_fault_shear_traction / self.aSigma ) + denom = ( self.cTau*(time_n + dt - self.t_a ) + 1) * np.exp( (time_n+dt) / self.t_a ) + self.cTau*self.t_a + return K/denom + +def getParametersFromXML( xmlFilePath ): + tree = ElementTree.parse( xmlFilePath ) + root = tree.getroot() + + parameters = dict.fromkeys(["initialFaultNormalTraction", "initialFaultShearTraction", "backgroundStressingRate"]) + + solver = tree.find('Solvers/SeismicityRate') + parameters["backgroundStressingRate"] = float(solver.get("backgroundStressingRate")) + + for field_spec in root.findall(".//FieldSpecification"): + if field_spec.get('name') == 'initialShearTraction': + parameters["initialFaultShearTraction"] = float(field_spec.get("scale")) + elif field_spec.get('name') == 'initialNormalTraction': + parameters["initialFaultNormalTraction"] = float(field_spec.get("scale")) + + return parameters + +def curve_check_solution(**kwargs): + + xmlFilePath = "./SeismicityRate_analytical_verification_smoke.xml" + parameters = getParametersFromXML( xmlFilePath ) + + analytical_solution = analyticalSolution( parameters ) + + times = np.squeeze(kwargs['seismicityRate Time'][:]) + analytical_rates = [] + dt = 3600.0 + for time in times: + tau = analytical_solution.compute_shear_stress(time, dt) + analytical_rate = analytical_solution.compute_seismic_rate(time, dt, tau) + analytical_rates.append(analytical_rate) + + return np.array(analytical_rates) + + +def debug( xmlFilePath ): + #-------- Extract info from XML + parameters = getParametersFromXML( xmlFilePath ) + + analytical_solution = analyticalSolution( parameters ) + + time = 0.0 + dt = 3600.0 + final_time = 360000.0 + times = [] + analytical_rates = [] + tau_plot = [] + while time < final_time: + tau = analytical_solution.compute_shear_stress(time, dt) + analytical_rate = analytical_solution.compute_seismic_rate(time, dt, tau) + time += dt + times.append(time) + analytical_rates.append(analytical_rate) + tau_plot.append(tau) + + import csv + + # Write times to a CSV file without headers + with open('shearStress_time.csv', 'w', newline='') as file: + writer = csv.writer(file) + for time in times: + writer.writerow([time]) + + # Write tau_plot to a CSV file without headers + with open('shearStress_values.csv', 'w', newline='') as file: + writer = csv.writer(file) + for tau in tau_plot: + writer.writerow([tau]) + + import h5py + file_path = '/usr/workspace/cusini1/geosx/geosx_dev/GEOS_2/build-quartz-gcc-12-release/Output/seismicityRate.hdf5' + with h5py.File(file_path, 'r') as file: + # List all groups + print("Keys: %s" % file.keys()) + + # Get the data + time = np.squeeze(file['seismicityRate Time'][:]) + seismicityRate = np.squeeze(file['seismicityRate'][:]) + print(time) + print(seismicityRate) + + # Plot analytical (continuous line) and numerical (markers) aperture solution + fig, ax = plt.subplots(figsize=(16, 12), nrows=2, ncols=1) + + ax[0].plot(times, tau_plot) + ax[0].set_xlabel('time [s]', weight="bold") + ax[0].set_ylabel('shear stress', weight="bold") + + ax[1].plot(times, analytical_rates) + ax[1].set_xlabel('time [s]', weight="bold") + ax[1].set_ylabel('seismic rate', weight="bold") + plt.savefig("seismicRate.png") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-f', '--xml-file', type=str, help='Path to XML file') + args = parser.parse_args() + debug( args.xml_file ) diff --git a/inputFiles/inducedSeismicity/shearStress_time.csv b/inputFiles/inducedSeismicity/shearStress_time.csv new file mode 100644 index 00000000000..c2c5da0c9c3 --- /dev/null +++ b/inputFiles/inducedSeismicity/shearStress_time.csv @@ -0,0 +1,101 @@ +0.0 +3600.0 +7200.0 +10800.0 +14400.0 +18000.0 +21600.0 +25200.0 +28800.0 +32400.0 +36000.0 +39600.0 +43200.0 +46800.0 +50400.0 +54000.0 +57600.0 +61200.0 +64800.0 +68400.0 +72000.0 +75600.0 +79200.0 +82800.0 +86400.0 +90000.0 +93600.0 +97200.0 +100800.0 +104400.0 +108000.0 +111600.0 +115200.0 +118800.0 +122400.0 +126000.0 +129600.0 +133200.0 +136800.0 +140400.0 +144000.0 +147600.0 +151200.0 +154800.0 +158400.0 +162000.0 +165600.0 +169200.0 +172800.0 +176400.0 +180000.0 +183600.0 +187200.0 +190800.0 +194400.0 +198000.0 +201600.0 +205200.0 +208800.0 +212400.0 +216000.0 +219600.0 +223200.0 +226800.0 +230400.0 +234000.0 +237600.0 +241200.0 +244800.0 +248400.0 +252000.0 +255600.0 +259200.0 +262800.0 +266400.0 +270000.0 +273600.0 +277200.0 +280800.0 +284400.0 +288000.0 +291600.0 +295200.0 +298800.0 +302400.0 +306000.0 +309600.0 +313200.0 +316800.0 +320400.0 +324000.0 +327600.0 +331200.0 +334800.0 +338400.0 +342000.0 +345600.0 +349200.0 +352800.0 +356400.0 +360000.0 diff --git a/inputFiles/inducedSeismicity/shearStress_values.csv b/inputFiles/inducedSeismicity/shearStress_values.csv new file mode 100644 index 00000000000..2b9ae809bac --- /dev/null +++ b/inputFiles/inducedSeismicity/shearStress_values.csv @@ -0,0 +1,101 @@ +60.0e6 +61526056.30349505 +62104134.15427021 +62468099.53147162 +62734367.50941958 +62944438.97916644 +63117949.90627824 +63265759.41076705 +63394508.393511355 +63508555.89998265 +63610917.91264422 +63703768.066607684 +63788724.78908365 +63867025.639497414 +63939638.17246112 +64007333.18523247 +64070734.696582966 +64130354.99974513 +64186619.838331275 +64239886.86751276 +64290459.44114839 +64338597.076746546 +64384523.51487247 +64428433.007488035 +64470495.28266149 +64510859.50651685 +64549657.476057835 +64587006.21536042 +64623010.104116425 +64657762.636107266 +64691347.88222914 +64723841.71570559 +64755312.84441781 +64785823.68568135 +64815431.11147129 +64844187.08645859 +64872139.21684233 +64899331.22453758 +64925803.35857956 +64951592.75346247 +64976733.74242058 +65001258.13228366 +65025195.44542758 +65048573.13343665 +65071416.76635611 +65093750.20080676 +65115595.729732744 +65136974.21613927 +65157905.21283129 +65178407.06987548 +65198497.031265825 +65218191.32206875 +65237505.22715128 +65256453.16244934 +65275048.73960868 +65293304.824724495 +65311233.591814585 +65328846.57158286 +65346154.6959622 +65363168.33886765 +65379897.35354046 +65396351.106819406 +65412538.51063806 +65428468.05101308 +65444147.814759575 +65459585.51414416 +65474788.50966381 +65489763.83111899 +65504518.19713193 +65519058.033245936 +65533389.48872752 +65547518.45218153 +65561450.5660784 +65575191.24028321 +65588745.664667845 +65602118.8208797 +65615315.49333387 +65628340.27948934 +65641197.59946458 +65653891.705042735 +65666426.68811243 +65678806.48858602 +65691034.9018337 +65703115.5856685 +65715052.06691443 +65726847.7475872 +65738505.91071459 +65750029.725821525 +65761422.25410262 +65772686.45330341 +65783825.18232974 +65794841.20560317 +65805737.1971792 +65816515.74464344 +65827179.35280012 +65837730.447165936 +65848171.3772815 +65858504.41985175 +65868731.78172568 +65878855.60272533 +65888877.95833288 diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml index a36624ce39c..0c293f01565 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml @@ -13,8 +13,9 @@ + dimensions="{ 100, 200 }"/> + dimensions="{ 100, 200 }"/> + dimensions="{ 50, 200 }"/> + dimensions="{ 50, 200 }"/> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml index a4678fac840..83e9561f2c4 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml @@ -46,9 +46,9 @@ elementTypes="{ C3D8 }" xCoords="{ -1000, -100, 100, 1000 }" yCoords="{ -1000, -100, 100, 1000 }" - zCoords="{ 0, 1 }" - nx="{ 50, 200, 50 }" - ny="{ 50, 200, 50 }" + zCoords="{ 0, 2 }" + nx="{ 150, 200, 150 }" + ny="{ 150, 200, 150 }" nz="{ 2 }" cellBlockNames="{ cb1 }"/> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml index ef470599b58..b788e0ac183 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml @@ -46,9 +46,9 @@ elementTypes="{ C3D8 }" xCoords="{ -1000, -100, 100, 1000 }" yCoords="{ -1000, -100, 100, 1000 }" - zCoords="{ 0, 1 }" - nx="{ 5, 52, 5 }" - ny="{ 5, 52, 5 }" + zCoords="{ 0, 100 }" + nx="{ 20, 20, 20 }" + ny="{ 20, 20, 20 }" nz="{ 2 }" cellBlockNames="{ cb1 }"/> diff --git a/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml b/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml index 6bd3aa9ce7d..4379c94dcca 100644 --- a/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml +++ b/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml @@ -40,7 +40,7 @@ /> diff --git a/inputFiles/poromechanics/PoroElastic_gravity.xml b/inputFiles/poromechanics/PoroElastic_gravity.xml index 54aacf9ee1f..ce1a82c80c6 100644 --- a/inputFiles/poromechanics/PoroElastic_gravity.xml +++ b/inputFiles/poromechanics/PoroElastic_gravity.xml @@ -110,7 +110,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml index 53ca032ac5f..c2aea226cf6 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml @@ -12,7 +12,10 @@ nx="{ 3, 3 }" ny="{ 3, 3 }" nz="{ 2, 2, 2, 2 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml new file mode 100755 index 00000000000..a80766e45d7 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml index 08585c7347b..bf49f42200f 100644 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml @@ -90,32 +90,11 @@ target="/Outputs/vtkOutput"/> - - + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> - - - - - + + - - + name="multiphasePoroelasticityEquilibrationStep" + poromechanicsSolverName="multiphasePoroelasticity" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml new file mode 100644 index 00000000000..2bf5cfbd434 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml index 889d76a25b7..e0f04762409 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml @@ -97,32 +97,11 @@ target="/Outputs/vtkOutput_seq"/> - - + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> - - - - - + + - - + name="multiphasePoroelasticityEquilibrationStep" + poromechanicsSolverName="reservoirSystem" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml new file mode 100755 index 00000000000..1470a078714 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml index 5a69dfa2842..3b25c03e021 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml @@ -12,7 +12,10 @@ nx="{ 3, 3 }" ny="{ 3, 3 }" nz="{ 2, 2, 2, 2 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml new file mode 100755 index 00000000000..9855e123f79 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml index 62345094c30..3be995c1621 100644 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml @@ -79,23 +79,16 @@ target="/Outputs/vtkOutput"/> + target="/Tasks/singlePhasePoroelasticityEquilibrationStep"/> - - - - - - + name="singlePhasePoroelasticityEquilibrationStep" + poromechanicsSolverName="singlePhasePoroelasticity" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml new file mode 100644 index 00000000000..34f0f9adbe8 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml index a95a1d1d185..58e14123fef 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml @@ -86,23 +86,18 @@ name="outputs" timeFrequency="1e6" target="/Outputs/vtkOutput_seq"/> + + target="/Tasks/singlePhasePoroelasticityEquilibrationStep"/> - - - - - - + name="singlePhasePoroelasticityEquilibrationStep" + poromechanicsSolverName="reservoirPoromechanics" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml new file mode 100755 index 00000000000..354bff0f51d --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml index 9f005e4fc44..39e5a33f29a 100644 --- a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml +++ b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml @@ -40,7 +40,7 @@ /> diff --git a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml index a8259a6e66d..caf219bb716 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml @@ -202,7 +202,7 @@ diff --git a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats index ae39bd6c1d7..1ffd4767566 100644 --- a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats +++ b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats @@ -77,7 +77,7 @@ def _build_NonlinearAccelerationValidation_cases(): description = Description("Nonlinear acceleration validation problem ", "auto", "Sohail Waziri", True) restartcheck_params = {"atol": 1.0e-4, "rtol": 2.0e-6} - return _build_poro_elastic_coupling_case("validationCase.xml", (3, 6), + return _build_poro_elastic_coupling_case("validationCase.xml", (1, 2), ((1, 1, 1), ), description, restartcheck_params) diff --git a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml index af9a6c20b5c..9b460dbba01 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml @@ -16,12 +16,6 @@ lineSearchAction="None" subcycling="1" nonlinearAccelerationType="Aitken"/> - @@ -36,10 +30,8 @@ newtonTol="1.0e-7" newtonMaxIter="40"/> + solverType="direct" + directParallel="0"/> @@ -54,10 +46,8 @@ newtonTol="1.0e-7" newtonMaxIter="40"/> + solverType="direct" + directParallel="0"/> @@ -89,15 +79,13 @@ nx="{ 5, 11, 5 }" ny="{ 5, 11, 5 }" nz="{ 2, 5, 1, 1, 1, 1, 1 }" - cellBlockNames="{ b00,b01,b02,b03,b04,b05,b06, - b07,b08,b09,b10,b11,b12,b13, - b14,b15,b16,b17,b18,b19,b20, - b21,b22,b23,b24,b25,b26,b27, - b28,b29,b30,b31,b32,b33,b34, - b35,b36,b37,b38,b39,b40,b41, - b42,b43,b44,b45,b46,b47,b48, - b49,b50,b51,b52,b53,b54,b55, - b56,b57,b58,b59,b60,b61,b62 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-2_0_0, cb-0_1_0, cb-1_1_0, cb-2_1_0, cb-0_2_0, cb-1_2_0, cb-2_2_0, + cb-0_0_1, cb-1_0_1, cb-2_0_1, cb-0_1_1, cb-1_1_1, cb-2_1_1, cb-0_2_1, cb-1_2_1, cb-2_2_1, + cb-0_0_2, cb-1_0_2, cb-2_0_2, cb-0_1_2, cb-1_1_2, cb-2_1_2, cb-0_2_2, cb-1_2_2, cb-2_2_2, + cb-0_0_3, cb-1_0_3, cb-2_0_3, cb-0_1_3, cb-1_1_3, cb-2_1_3, cb-0_2_3, cb-1_2_3, cb-2_2_3, + cb-0_0_4, cb-1_0_4, cb-2_0_4, cb-0_1_4, cb-1_1_4, cb-2_1_4, cb-0_2_4, cb-1_2_4, cb-2_2_4, + cb-0_0_5, cb-1_0_5, cb-2_0_5, cb-0_1_5, cb-1_1_5, cb-2_1_5, cb-0_2_5, cb-1_2_5, cb-2_2_5, + cb-0_0_6, cb-1_0_6, cb-2_0_6, cb-0_1_6, cb-1_1_6, cb-2_1_6, cb-0_2_6, cb-1_2_6, cb-2_2_6 }"> @@ -167,18 +155,16 @@ @@ -195,7 +181,7 @@ + maxTime="3456000"> @@ -255,7 +241,7 @@ permeabilityComponents="{ 9.869233e-14, 9.869233e-14, 9.869233e-15 }"/> @@ -391,7 +377,7 @@ name="sigma_xx_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="0" scale="0.0"/> @@ -407,7 +393,7 @@ name="sigma_yy_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="1" scale="0.0"/> @@ -423,7 +409,7 @@ name="sigma_zz_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="2" scale="0.0"/> @@ -463,7 +449,7 @@ @@ -481,7 +467,7 @@ diff --git a/inputFiles/poromechanics/poroElasticCoupling.ats b/inputFiles/poromechanics/poroElasticCoupling.ats index 6f3bf4afe32..30c865afc8c 100644 --- a/inputFiles/poromechanics/poroElasticCoupling.ats +++ b/inputFiles/poromechanics/poroElasticCoupling.ats @@ -223,6 +223,43 @@ def _build_PoroStaircaseCO2PeacemanWell_sequential_cases(): ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) +def _build_PoroStaircaseSinglePhaseStabilized_fim_cases(): + description = Description( + "Staircase single-phase poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_singlephase_3d_fim_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + + +def _build_PoroStaircaseSinglePhaseStabilized_seq_cases(): + description = Description( + "Staircase single-phase poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_singlephase_3d_sequential_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + +def _build_PoroStaircaseCO2Stabilized_fim_cases(): + description = Description( + "Staircase CO2 poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_co2_3d_fim_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + +def _build_PoroStaircaseCO2Stabilized_seq_cases(): + description = Description( + "Staircase CO2 poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_co2_3d_sequential_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + def _build_PoroElasticPEBICO2FIM_cases(): description = Description( "CO2 poroelastic problem with VEM-TPFA (FIM) on a PEBI mesh ", "auto", diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv new file mode 100644 index 00000000000..14a2427db2d --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv @@ -0,0 +1,2 @@ +-27621898.34 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv new file mode 100644 index 00000000000..a0a8255c490 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv @@ -0,0 +1,2 @@ +-69831843.20 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv new file mode 100644 index 00000000000..83aac38ac24 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv @@ -0,0 +1,2 @@ +-57898141.60 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv b/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv new file mode 100644 index 00000000000..3c67d97be4f --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv @@ -0,0 +1,2 @@ +40444400.00 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/x.csv b/inputFiles/poromechanicsFractures/DATATABLES/x.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/x.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/y.csv b/inputFiles/poromechanicsFractures/DATATABLES/y.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/y.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/z.csv b/inputFiles/poromechanicsFractures/DATATABLES/z.csv new file mode 100644 index 00000000000..1fc446ae0e8 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/z.csv @@ -0,0 +1,2 @@ +-4000.00 +0.00 diff --git a/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu b/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu new file mode 100644 index 00000000000..0b851b7cea7 --- /dev/null +++ b/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu @@ -0,0 +1,50 @@ + + + + + + + AgAAAACAAADoZwAATBgAAMMTAAA=eJw13dMWIMqSBcDbtm3btm3btm3btm3btm3bdvc8TJx6iU+olVWZO//3v/8/ARiQgRiYQRiUwRicIRiSoRiaYRiW4RieERiRkRiZURiV0RidMRiTsRibcRiX8RifCZiQiZiYSZiUyZicKZiSqZiaaZiW6ZieGZiRmZiZWZiV2ZidOZiTuZibeZiX+ZifBViQhViYRViUxVicJViSpViaZViW5VieFViRlViZVViV1VidNViTtVibdViX9VifDdiQjdiYTdiUzdicLdiSrdiabdiW7dieHdiRndiZXdiV3didPdiTvdibfdiX/difAziQgziYQziUwzicIziSoziaYziW4zieEziRkziZUziV0zidMziTszibcziX8zifC7iQi7iYS7iUy7icK7iSq7iaa7iW67ieG7iRm7iZW7iV27idO7iTu7ibe7iX+7ifB3iQh3iYR3iUx3icJ3iSp3iaZ3iW53ieF3iRl3iZV3iV13idN3iTt3ibd3iX93ifD/iQj/iYT/iUz/icL/iSr/iab/iW7/ieH/iRn/iZX/iV3/idP/iTv/ibf/iX//jfxR+AARmIgRmEQRmMwRmCIRmKoRmGYRmO4RmBERmJkRmFURmN0RmDMRmLsRmHcRmP8ZmACZmIiZmESZmMyZmCKZmKqZmGaZmO6ZmBGZmJmZmFWZmN2ZmDOZmLuZmHeZmP+VmABVmIhVmERVmMxVmCJVmKpVmGZVmO5VmBFVmJlVmFVVmN1VmDNVmLtVmHdVmP9dmADdmIjdmETdmMzdmCLdmKrdmGbdmO7dmBHdmJndmFXdmN3dmDPdmLvdmHfdmP/TmAAzmIgzmEQzmMwzmCIzmKozmGYzmO4zmBEzmJkzmFUzmN0zmDMzmLszmHczmP87mAC7mIi7mES7mMy7mCK7mKq7mGa7mO67mBG7mJm7mFW7mN27mDO7mLu7mHe7mP+3mAB3mIh3mER3mMx3mCJ3mKp3mGZ3mO53mBF3mJl3mFV3mN13mDN3mLt3mHd3mP9/mAD/mIj/mET/mMz/mCL/mKr/mGb/mO7/mBH/mJn/mFX/mN3/mDP/mLv/mHf/mP/xX8ARiQgRiYQRiUwRicIRiSoRiaYRiW4RieERiRkRiZURiV0RidMRiTsRibcRiX8RifCZiQiZiYSZiUyZicKZiSqZiaaZiW6ZieGZiRmZiZWZiV2ZidOZiTuZibeZiX+ZifBViQhViYRViUxVicJViSpViaZViW5VieFViRlViZVViV1VidNViTtVibdViX9VifDdiQjdiYTdiUzdicLdiSrdiabdiW7dieHdiRndiZXdiV3didPdiTvdibfdiX/difAziQgziYQziUwzicIziSoziaYziW4zieEziRkziZUziV0zidMziTszibcziX8zifC7iQi7iYS7iUy7icK7iSq7iaa7iW67ieG7iRm7iZW7iV27idO7iTu7ibe7iX+7ifB3iQh3iYR3iUx3icJ3iSp3iaZ3iW53ieF3iRl3iZV3iV13idN3iTt3ibd3iX93ifD/iQj/iYT/iUz/icL/iSr/iab/iW7/ieH/iRn/iZX/iV3/idP/iTv/ibf/iX//jfQ38ABmQgBmYQBmUwBmcIhmQohmYYhmU4hmcERmQkRmYURmU0RmcMxmQsxmYcxmU8xmcCJmQiJmYSJmUyJmcKpmQqpmYapmU6pmcGZmQmZmYWZmU2ZmcO5mQu5mYe5mU+5mcBFmQhFmYRFmUxFmcJlmQplmYZlmU5lmcFVmQlVmYVVmU1VmcN1mQt1mYd1mU91mcDNmQjNmYTNmUzNmcLtmQrtmYbtmU7tmcHdmQndmYXdmU3dmcP9mQv9mYf9mU/9ucADuQgDuYQDuUwDucIjuQojuYYjuU4jucETuQkTuYUTuU0TucMzuQszuYczuU8zucCLuQiLuYSLuUyLucKruQqruYaruU6rucGbuQmbuYWbuU2bucO7uQu7uYe7uU+7ucBHuQhHuYRHuUxHucJnuQpnuYZnuU5nucFXuQlXuYVXuU1XucN3uQt3uYd3uU93ucDPuQjPuYTPuUzPucLvuQrvuYbvuU7vucHfuQnfuYXfuU3fucP/uQv/uYf/uU//vfBH4ABGYiBGYRBGYzBGYIhGYqhGYZhGY7hGYERGYmRGYVRGY3RGYMxGYuxGYdxGY/xmYAJmYiJmYRJmYzJmYIpmYqpmYZpmY7pmYEZmYmZmYVZmY3ZmYM5mYu5mYd5mY/5WYAFWYiFWYRFWYzFWYIlWYqlWYZlWY7lWYEVWYmVWYVVWY3VWYM1WYu1WYd1WY/12YAN2YiN2YRN2YzN2YIt2Yqt2YZt2Y7t2YEd2Ymd2YVd2Y3d2YM92Yu92Yd92Y/9OYADOYiDOYRDOYzDOYIjOYqjOYZjOY7jOYETOYmTOYVTOY3TOYMzOYuzOYdzOY/zuYALuYiLuYRLuYzLuYIruYqruYZruY7ruYEbuYmbuYVbuY3buYM7uYu7uYd7uY/7eYAHeYiHeYRHeYzHeYIneYqneYZneY7neYEXeYmXeYVXeY3XeYM3eYu3eYd3eY/3+YAP+YiP+YRP+YzP+YIv+Yqv+YZv+Y7v+YEf+Ymf+YVf+Y3f+YM/+Yu/+Yd/+Y//NfYFYEAGYmAGYVAGY3CGYEiGYmiGYViGY3hGYERGYmRGYVRGY3TGYEzGYmzGYVzGY3wmYEImYmImYVImY3KmYEqmYmqmYVqmY3pmYEZmYmZmYVZmY3bmYE7mYm7mYV7mY34WYEEWYmEWYVEWY3GWYEmWYmmWYVmWY3lWYEVWYmVWYVVWY3XWYE3WYm3WYV3WY302YEM2YmM2YVM2Y3O2YEu2Ymu2YVu2Y3t2YEd2Ymd2YVd2Y3f2YE/2Ym/2YV/2Y38O4EAO4mAO4VAO43CO4EiO4miO4ViO43hO4ERO4mRO4VRO43TO4EzO4mzO4VzO43wu4EIu4mIu4VIu43Ku4Equ4mqu4Vqu43pu4EZu4mZu4VZu43bu4E7u4m7u4V7u434e4EEe4mEe4VEe43Ge4Eme4mme4Vme43le4EVe4mVe4VVe43Xe4E3e4m3e4V3e430+4EM+4mM+4VM+43O+4Eu+4mu+4Vu+43t+4Ed+4md+4Vd+43f+4E/+4m/+4V/+438N/QEYkIEYmEEYlMEYnCEYkqEYmmEYluEYnhEYkZEYmVEYldEYnTEYk7EYm3EYl/EYnwmYkImYmEmYlMmYnCmYkqmYmmmYlumYnhmYkZmYmVmYldmYnTmYk7mYm3mYl/mYnwVYkIVYmEVYlMVYnCVYkqVYmmVYluVYnhVYkZVYmVVYldVYnTVYk7VYm3VYl/VYnw3YkI3YmE3YlM3YnC3Ykq3Ymm3Ylu3Ynh3YkZ3YmV3Yld3YnT3Yk73Ym33Yl/3YnwM4kIM4mEM4lMM4nCM4kqM4mmM4luM4nhM4kZM4mVM4ldM4nTM4k7M4m3M4l/M4nwu4kIu4mEu4lMu4nCu4kqu4mmu4luu4nhu4kZu4mVu4ldu4nTu4k7u4m3u4l/u4nwd4kId4mEd4lMd4nCd4kqd4mmd4lud4nhd4kZd4mVd4ldd4nTd4k7d4m3d4l/d4nw/4kI/4mE/4lM/4nC/4kq/4mm/4lu/4nh/4kZ/4mV/4ld/4nT/4k7/4m3/4l//43yBfAAZkIAZmEAZlMAZnCIZkKIZmGIZlOIZnBEZkJEZmFEZlNEZnDMZkLMZmHMZlPMZnAiZkIiZmEiZlMiZnCqZkKqZmGqZlOqZnBmZkJmZmFmZlNmZnDuZkLuZmHuZlPuZnARZkIRZmERZlMRZnCZZkKZZmGZZlOZZnBVZkJVZmFVZlNVZnDdZkLdZmHdZlPdZnAzZkIzZmEzZlMzZnC7ZkK7ZmG7ZlO7ZnB3ZkJ3ZmF3ZlN3ZnD/ZkL/ZmH/ZlP/bnAA7kIA7mEA7lMA7nCI7kKI7mGI7lOI7nBE7kJE7mFE7lNE7nDM7kLM7mHM7lPM7nAi7kIi7mEi7lMi7nCq7kKq7mGq7lOq7nBm7kJm7mFm7lNm7nDu7kLu7mHu7lPu7nAR7kIR7mER7lMR7nCZ7kKZ7mGZ7lOZ7nBV7kJV7mFV7lNV7nDd7kLd7mHd7lPd7nAz7kIz7mEz7lMz7nC77kK77mG77lO77nB37kJ37mF37lN37nD/7kL/7mH/7lP/43wB+AARmIgRmEQRmMwRmCIRmKoRmGYRmO4RmBERmJkRmFURmN0RmDMRmLsRmHcRmP8ZmACZmIiZmESZmMyZmCKZmKqZmGaZmO6ZmBGZmJmZmFWZmN2ZmDOZmLuZmHeZmP+VmABVmIhVmERVmMxVmCJVmKpVmGZVmO5VmBFVmJlVmFVVmN1VmDNVmLtVmHdVmP9dmADdmIjdmETdmMzdmCLdmKrdmGbdmO7dmBHdmJndmFXdmN3dmDPdmLvdmHfdmP/TmAAzmIgzmEQzmMwzmCIzmKozmGYzmO4zmBEzmJkzmFUzmN0zmDMzmLszmHczmP87mAC7mIi7mES7mMy7mCK7mKq7mGa7mO67mBG7mJm7mFW7mN27mDO7mLu7mHe7mP+3mAB3mIh3mER3mMx3mCJ3mKp3mGZ3mO53mBF3mJl3mFV3mN13mDN3mLt3mHd3mP9/mAD/mIj/mET/mMz/mCL/mKr/mGb/mO7/mBH/mJn/mFX/mN3/mDP/mLv/mHf/mP/wX3BGBABmJgBmFQBmNwhmBIhmJohmFYhmN4RmBERmJkRmFURmN0xmBMxmJsxmFcxmN8JmBCJmJiJmFSJmNypmBKpmJqpmFapmN6ZmBGZmJmZmFWZmN25mBO5mJu5mFe5mN+FmBBFmJhFmFRFmNxlmBJlmJplmFZlmN5VmBFVmJlVmFVVmN11mBN1mJt1mFd1mN9NmBDNmJjNmFTNmNztmBLtmJrtmFbtmN7dmBHdmJndmFXdmN39mBP9mJv9mFf9mN/DuBADuJgDuFQDuNwjuBIjuJojuFYjuN4TuBETuJkTuFUTuN0zuBMzuJszuFczuN8LuBCLuJiLuFSLuNyruBKruJqruFaruN6buBGbuJmbuFWbuN27uBO7uJu7uFe7uN+HuBBHuJhHuFRHuNxnuBJnuJpnuFZnuN5XuBFXuJlXuFVXuN13uBN3uJt3uFd3uN9PuBDPuJjPuFTPuNzvuBLvuJrvuFbvuN7fuBHfuJnfuFXfuN3/uBP/uJv/uFf/uN/gX0BGJCBGJhBGJTBGJwhGJKhGJphGJbhGJ4RGJGRGJlRGJXRGJ0xGJOxGJtxGJfxGJ8JmJCJmJhJmJTJmJwpmJKpmJppmJbpmJ4ZmJGZmJlZmJXZmJ05mJO5mJt5mJf5mJ8FWJCFWJhFWJTFWJwlWJKlWJplWJblWJ4VWJGVWJlVWJXVWJ01WJO1WJt1WJf1WJ8N2JCN2JhN2JTN2Jwt2JKt2Jpt2Jbt2J4d2JGd2Jld2JXd2J092JO92Jt92Jf92J8DOJCDOJhDOJTDOJwjOJKjOJpjOJbjOJ4TOJGTOJlTOJXTOJ0zOJOzOJtzOJfzOJ8LuJCLuJhLuJTLuJwruJKruJpruJbruJ4buJGbuJlbuJXbuJ07uJO7uJt7uJf7uJ8HeJCHeJhHeJTHeJwneJKneJpneJbneJ4XeJGXeJlXeJXXeJ03eJO3eJt3eJf3eJ8P+JCP+JhP+JTP+Jwv+JKv+Jpv+Jbv+J4f+JGf+Jlf+JXf+J0/+JO/+Jt/+Jf/+F9QbwAGZCAGZhAGZTAGZwiGZCiGZhiGZTiGZwRGZCRGZhRGZTRGZwzGZCzGZhzGZTzGZwImZCImZhImZTImZwqmZCqmZhqmZTqmZwZmZCZmZhZmZTZmZw7mZC7mZh7mZT7mZwEWZCEWZhEWZTEWZwmWZCmWZhmWZTmWZwVWZCVWZhVWZTVWZw3WZC3WZh3WZT3WZwM2ZCM2ZhM2ZTM2Zwu2ZCu2Zhu2ZTu2Zwd2ZCd2Zhd2ZTd2Zw/2ZC/2Zh/2ZT/25wAO5CAO5hAO5TAO5wiO5CiO5hiO5TiO5wRO5CRO5hRO5TRO5wzO5CzO5hzO5TzO5wIu5CIu5hIu5TIu5wqu5Cqu5hqu5Tqu5wZu5CZu5hZu5TZu5w7u5C7u5h7u5T7u5wEe5CEe5hEe5TEe5wme5Cme5hme5Tme5wVe5CVe5hVe5TVe5w3e5C3e5h3e5T3e5wM+5CM+5hM+5TM+5wu+5Cu+5hu+5Tu+5wd+5Cd+5hd+5Td+5w/+5C/+5h/+5T/+F9AfgAEZiIEZhEEZjMEZgiEZiqEZhmEZjuEZgREZiZEZhVEZjdEZgzEZi7EZh3EZj/GZgAmZiImZhEmZjMmZgimZiqmZhmmZjumZgRmZiZmZhVmZjdmZgzmZi7mZh3mZj/lZgAVZiIVZhEVZjMVZgiVZiqVZhmVZjuVZgRVZiZVZhVVZjdVZgzVZi7VZh3VZj/XZgA3ZiI3ZhE3ZjM3Zgi3Ziq3Zhm3Zju3ZgR3ZiZ3ZhV3Zjd3Zgz3Zi73Zh33Zj/05gAM5iIM5hEM5jMM5giM5iqM5hmM5juM5gRM5iZM5hVM5jdM5gzM5i7M5h3M5j/O5gAu5iIu5hEu5jMu5giu5iqu5hmu5juu5gRu5iZu5hVu5jdu5gzu5i7u5h3u5j/t5gAd5iId5hEd5jMd5gid5iqd5hmd5jud5gRd5iZd5hVd5jdd5gzd5i7d5h3d5j/f5gA/5iI/5hE/5jM/5gi/5iq/5hm/5ju/5gR/5iZ/5hV/5jd/5gz/5i7/5h3/5j/8t5gnAgAzEwAzCoAzG4AzBkAzF0AzDsAzH8IzAiIzEyIzCqIzG6IzBmIzF2IzDuIzH+EzAhEzExEzCpEzG5EzBlEzF1EzDtEzH9MzAjMzEzMzCrMzG7MzBnMzF3MzDvMzH/CzAgizEwizCoizG4izBkizF0izDsizH8qzAiqzEyqzCqqzG6qzBmqzF2qzDuqzH+mzAhmzExmzCpmzG5mzBlmzF1mzDtmzH9uzAjuzEzuzCruzG7uzBnuzF3uzDvuzH/hzAgRzEwRzCoRzG4RzBkRzF0RzDsRzH8ZzAiZzEyZzCqZzG6ZzBmZzF2ZzDuZzH+VzAhVzExVzCpVzG5VzBlVzF1VzDtVzH9dzAjdzEzdzCrdzG7dzBndzF3dzDvdzH/TzAgzzEwzzCozzG4zzBkzzF0zzDszzH87zAi7zEy7zCq7zG67zBm7zF27zDu7zH+3zAh3zEx3zCp3zG53zBl3zF13zDt3zH9/zAj/zEz/zCr/zG7/zBn/zF3/zDv/zH/xbyBWBABmJgBmFQBmNwhmBIhmJohmFYhmN4RmBERmJkRmFURmN0xmBMxmJsxmFcxmN8JmBCJmJiJmFSJmNypmBKpmJqpmFapmN6ZmBGZmJmZmFWZmN25mBO5mJu5mFe5mN+FmBBFmJhFmFRFmNxlmBJlmJplmFZlmN5VmBFVmJlVmFVVmN11mBN1mJt1mFd1mN9NmBDNmJjNmFTNmNztmBLtmJrtmFbtmN7dmBHdmJndmFXdmN39mBP9mJv9mFf9mN/DuBADuJgDuFQDuNwjuBIjuJojuFYjuN4TuBETuJkTuFUTuN0zuBMzuJszuFczuN8LuBCLuJiLuFSLuNyruBKruJqruFaruN6buBGbuJmbuFWbuN27uBO7uJu7uFe7uN+HuBBHuJhHuFRHuNxnuBJnuJpnuFZnuN5XuBFXuJlXuFVXuN13uBN3uJt3uFd3uN9PuBDPuJjPuFTPuNzvuBLvuJrvuFbvuN7fuBHfuJnfuFXfuN3/uBP/uJv/uFf/uN/i3gDMCADMTCDMCiDMThDMCRDMTTDMCzDMTwjMCIjMTKjMCqjMTpjMCZjMTbjMC7jMT4TMCETMTGTMCmTMTlTMCVTMTXTMC3TMT0zMCMzMTOzMCuzMTtzMCdzMTfzMC/zMT8LsCALsTCLsCiLsThLsCRLsTTLsCzLsTwrsCIrsTKrsCqrsTprsCZrsTbrsC7rsT4bsCEbsTGbsCmbsTlbsCVbsTXbsC3bsT07sCM7sTO7sCu7sTt7sCd7sTf7sC/7sT8HcCAHcTCHcCiHcThHcCRHcTTHcCzHcTwncCIncTKncCqncTpncCZncTbncC7ncT4XcCEXcTGXcCmXcTlXcCVXcTXXcC3XcT03cCM3cTO3cCu3cTt3cCd3cTf3cC/3cT8P8CAP8TCP8CiP8ThP8CRP8TTP8CzP8Twv8CIv8TKv8Cqv8Tpv8CZv8Tbv8C7v8T4f8CEf8TGf8Cmf8Tlf8CVf8TXf8C3f8T0/8CM/8TO/8Cu/8Tt/8Cd/8Tf/8C//8f8AkFtweXicLcVDECAGAgCwtW3btm3btm3btm3btm3bttu9mWvySYAIAf4voAM5sIM4qIM5uEM4pEM5tMM4rMM5vCM4oiM5sqM4qqM5umM4pmM5tuM4ruM5vhM4oRM5sZM4qZM5uVM4pVM5tdM4rdM5vTM4ozM5s7M4q7M5u3M4p3M5t/M4r/M5vwu4oAu5sIu4qIu5uEu4pEu5tMu4rMu5vCu4oiu5squ4qqu5umu4pmu5tuu4ruu5vhu4oRu5sZu4qZu5uVu4pVu5tdu4rdu5vTu4ozu5s7u4q7u5u3u4p3u5t/u4r/u5vwd4oAd5sId4qId5uEd4pEd5tMd4rMd5vCd4oid5sqd4qqd5umd4pmd5tud4rud5vhd4oRd5sZd4qZd5uVd4pVd5tdd4rdd5vTd4ozd5s7d4q7d5u3d4p3d5t/d4r/d5vw/4oA/5sI/4qI/5uE/4pE/5tM/4rM/5vC/4oi/5sq/4qq/5um/4pm/5tu/4ru/5vh/4oR/5sZ/4qZ/5uV/4pV/5td/4rd/5vT/4oz/5s7/4q7/5u3/4p3/5t//4H//rvw4Q8b8COpADO4iDOpiDO4RDOpRDO4zDOpzDO4IjOpIjO4qjOpqjO4ZjOpZjO47jOp7jO4ETOpETO4mTOpmTO4VTOpVTO43TOp3TO4MzOpMzO4uzOpuzO4dzOpdzO4/zOp/zu4ALupALu4iLupiLu4RLupRLu4zLupzLu4IrupIru4qrupqru4ZrupZru47rup7ru4EbupEbu4mbupmbu4VbupVbu43bup3bu4M7upM7u4u7upu7u4d7upd7u4/7up/7e4AHepAHe4iHepiHe4RHepRHe4zHepzHe4InepIne4qnepqne4ZnepZne47nep7ne4EXepEXe4mXepmXe4VXepVXe43Xep3Xe4M3epM3e4u3epu3e4d3epd3e4/3ep/3+4AP+pAP+4iP+piP+4RP+pRP+4zP+pzP+4Iv+pIv+4qv+pqv+4Zv+pZv+47v+p7v+4Ef+pEf+4mf+pmf+4Vf+pVf+43f+p3f+4M/+pM/+4u/+pu/+4d/+pd/+4//8b/+6wCR/iugAzmwgziogzm4QzikQzm0wziswzm8IziiIzmyoziqozm6YzimYzm24ziu4zm+EzihEzmxkzipkzm5UzilUzm10zit0zm9MzijMzmzszirszm7czinczm38ziv8zm/C7igC7mwi7ioi7m4S7ikS7m0y7isy7m8K7iiK7myq7iqq7m6a7ima7m267iu67m+G7ihG7mxm7ipm7m5W7ilW7m127it27m9O7ijO7mzu7iru7m7e7ine7m3+7iv+7m/B3igB3mwh3ioh3m4R3ikR3m0x3isx3m8J3iiJ3myp3iqp3m6Z3imZ3m253iu53m+F3ihF3mxl3ipl3m5V3ilV3m113it13m9N3ijN3mzt3irt3m7d3ind3m393iv93m/D/igD/mwj/ioj/m4T/ikT/m0z/isz/m8L/iiL/myr/iqr/m6b/imb/m27/iu7/m+H/ihH/mxn/ipn/m5X/ilX/m13/it3/m9P/ijP/mzv/irv/m7f/inf/m3//gf/+u/DhD5vwI6kAM7iIM6mIM7hEM6lEM7jMM6nMM7giM6kiM7iqM6mqM7hmM6lmM7juM6nuM7gRM6kRM7iZM6mZM7hVM6lVM7jdM6ndM7gzM6kzM7i7M6m7M7h3M6l3M7j/M6n/O7gAu6kAu7iIu6mIu7hEu6lEu7jMu6nMu7giu6kiu7iqu6mqu7hmu6lmu7juu6nuu7gRu6kRu7iZu6mZu7hVu6lVu7jdu6ndu7gzu6kzu7i7u6m7u7h3u6l3u7j/u6n/t7gAd6kAd7iId6mId7hEd6lEd7jMd6nMd7gid6kid7iqd6mqd7hmd6lmd7jud6nud7gRd6kRd7iZd6mZd7hVd6lVd7jdd6ndd7gzd6kzd7i7d6m7d7h3d6l3d7j/d6n/f7gA/6kA/7iI/6mI/7hE/6lE/7jM/6nM/7gi/6ki/7iq/6mq/7hm/6lm/7ju/6nu/7gR/6kR/7iZ/6mZ/7hV/6lV/7jd/6nd/7gz/6kz/7i7/6m7/7h3/6l3/7j//xv/7rAFH+K6ADObCDOKiDObhDOKRDObTDOKzDObwjOKIjObKjOKqjObpjOKZjObbjOK7jOb4TOKETObGTOKmTOblTOKVTObXTOK3TOb0zOKMzObOzOKuzObtzOKdzObfzOK/zOb8LuKALubCLuKiLubhLuKRLubTLuKzLubwruKIrubKruKqrubpruKZrubbruK7rub4buKEbubGbuKmbublbuKVbubXbuK3bub07uKM7ubO7uKu7ubt7uKd7ubf7uK/7ub8HeKAHebCHeKiHebhHeKRHebTHeKzHebwneKInebKneKqnebpneKZnebbneK7neb4XeKEXebGXeKmXeblXeKVXebXXeK3Xeb03eKM3ebO3eKu3ebt3eKd3ebf3eK/3eb8P+KAP+bCP+KiP+bhP+KRP+bTP+KzP+bwv+KIv+bKv+Kqv+bpv+KZv+bbv+K7v+b4f+KEf+bGf+Kmf+blf+KVf+bXf+K3f+b0/+KM/+bO/+Ku/+bt/+Kd/+bf/+B//678OEPW/AjqQAzuIgzqYgzuEQzqUQzuMwzqcwzuCIzqSIzuKozqaozuGYzqWYzuO4zqe4zuBEzqREzuJkzqZkzuFUzqVUzuN0zqd0zuDMzqTMzuLszqbszuHczqXczuP8zqf87uAC7qQC7uIi7qYi7uES7qUS7uMy7qcy7uCK7qSK7uKq7qaq7uGa7qWa7uO67qe67uBG7qRG7uJm7qZm7uFW7qVW7uN27qd27uDO7qTO7uLu7qbu7uHe7qXe7uP+7qf+3uAB3qQB3uIh3qYh3uER3qUR3uMx3qcx3uCJ3qSJ3uKp3qap3uGZ3qWZ3uO53qe53uBF3qRF3uJl3qZl3uFV3qVV3uN13qd13uDN3qTN3uLt3qbt3uHd3qXd3uP93qf9/uAD/qQD/uIj/qYj/uET/qUT/uMz/qcz/uCL/qSL/uKr/qar/uGb/qWb/uO7/qe7/uBH/qRH/uJn/qZn/uFX/qVX/uN3/qd3/uDP/qTP/uLv/qbv/uHf/qXf/uP//G//usA0f4roAM5sIM4qIM5uEM4pEM5tMM4rMM5vCM4oiM5sqM4qqM5umM4pmM5tuM4ruM5vhM4oRM5sZM4qZM5uVM4pVM5tdM4rdM5vTM4ozM5s7M4q7M5u3M4p3M5t/M4r/M5vwu4oAu5sIu4qIu5uEu4pEu5tMu4rMu5vCu4oiu5squ4qqu5umu4pmu5tuu4ruu5vhu4oRu5sZu4qZu5uVu4pVu5tdu4rdu5vTu4ozu5s7u4q7u5u3u4p3u5t/u4r/u5vwd4oAd5sId4qId5uEd4pEd5tMd4rMd5vCd4oid5sqd4qqd5umd4pmd5tud4rud5vhd4oRd5sZd4qZd5uVd4pVd5tdd4rdd5vTd4ozd5s7d4q7d5u3d4p3d5t/d4r/d5vw/4oA/5sI/4qI/5uE/4pE/5tM/4rM/5vC/4oi/5sq/4qq/5um/4pm/5tu/4ru/5vh/4oR/5sZ/4qZ/5uV/4pV/5td/4rd/5vT/4oz/5s7/4q7/5u3/4p3/5t//4H//rvw4Q/b8COpADO4iDOpiDO4RDOpRDO4zDOpzDO4IjOpIjO4qjOpqjO4ZjOpZjO47jOp7jO4ETOpETO4mTOpmTO4VTOpVTO43TOp3TO4MzOpMzO4uzOpuzO4dzOpdzO4/zOp/zu4ALupALu4iLupiLu4RLupRLu4zLupzLu4IrupIru4qrupqru4ZrupZru47rup7ru4EbupEbu4mbupmbu4VbupVbu43bup3bu4M7upM7u4u7upu7u4d7upd7u4/7up/7e4AHepAHe4iHepiHe4RHepRHe4zHepzHe4InepIne4qnepqne4ZnepZne47nep7ne4EXepEXe4mXepmXe4VXepVXe43Xep3Xe4M3epM3e4u3epu3e4d3epd3e4/3ep/3+4AP+pAP+4iP+piP+4RP+pRP+4zP+pzP+4Iv+pIv+4qv+pqv+4Zv+pZv+47v+p7v+4Ef+pEf+4mf+pmf+4Vf+pVf+43f+p3f+4M/+pM/+4u/+pu/+4d/+pd/+4//8b/+6wAx/iugAzmwgziogzm4QzikQzm0wziswzm8IziiIzmyoziqozm6YzimYzm24ziu4zm+EzihEzmxkzipkzm5UzilUzm10zit0zm9MzijMzmzszirszm7czinczm38ziv8zm/C7igC7mwi7ioi7m4S7ikS7m0y7isy7m8K7iiK7myq7iqq7m6a7ima7m267iu67m+G7ihG7mxm7ipm7m5W7ilW7m127it27m9O7ijO7mzu7iru7m7e7ine7m3+7iv+7m/B3igB3mwh3ioh3m4R3ikR3m0x3isx3m8J3iiJ3myp3iqp3m6Z3imZ3m253iu53m+F3ihF3mxl3ipl3m5V3ilV3m113it13m9N3ijN3mzt3irt3m7d3ind3m393iv93m/D/igD/mwj/ioj/m4T/ikT/m0z/isz/m8L/iiL/myr/iqr/m6b/imb/m27/iu7/m+H/ihH/mxn/ipn/m5X/ilX/m13/it3/m9P/ijP/mzv/irv/m7f/inf/m3//gf/+u/DhDzvwI6kAM7iIM6mIM7hEM6lEM7jMM6nMM7giM6kiM7iqM6mqM7hmM6lmM7juM6nuM7gRM6kRM7iZM6mZM7hVM6lVM7jdM6ndM7gzM6kzM7i7M6m7M7h3M6l3M7j/M6n/O7gAu6kAu7iIu6mIu7hEu6lEu7jMu6nMu7giu6kiu7iqu6mqu7hmu6lmu7juu6nuu7gRu6kRu7iZu6mZu7hVu6lVu7jdu6ndu7gzu6kzu7i7u6m7u7h3u6l3u7j/u6n/t7gAd6kAd7iId6mId7hEd6lEd7jMd6nMd7gid6kid7iqd6mqd7hmd6lmd7jud6nud7gRd6kRd7iZd6mZd7hVd6lVd7jdd6ndd7gzd6kzd7i7d6m7d7h3d6l3d7j/d6n/f7gA/6kA/7iI/6mI/7hE/6lE/7jM/6nM/7gi/6ki/7iq/6mq/7hm/6lm/7ju/6nu/7gR/6kR/7iZ/6mZ/7hV/6lV/7jd/6nd/7gz/6kz/7i7/6m7/7h3/6l3/7j//xv/7rALH+K6ADObCDOKiDObhDOKRDObTDOKzDObwjOKIjObKjOKqjObpjOKZjObbjOK7jOb4TOKETObGTOKmTOblTOKVTObXTOK3TOb0zOKMzObOzOKuzObtzOKdzObfzOK/zOb8LuKALubCLuKiLubhLuKRLubTLuKzLubwruKIrubKruKqrubpruKZrubbruK7rub4buKEbubGbuKmbublbuKVbubXbuK3bub07uKM7ubO7uKu7ubt7uKd7ubf7uK/7ub8HeKAHebCHeKiHebhHeKRHebTHeKzHebwneKInebKneKqnebpneKZnebbneK7neb4XeKEXebGXeKmXeblXeKVXebXXeK3Xeb03eKM3ebO3eKu3ebt3eKd3ebf3eK/3eb8P+KAP+bCP+KiP+bhP+KRP+bTP+KzP+bwv+KIv+bKv+Kqv+bpv+KZv+bbv+K7v+b4f+KEf+bGf+Kmf+blf+KVf+bXf+K3f+b0/+KM/+bO/+Ku/+bt/+Kd/+bf/+B//678OEPu/AjqQAzuIgzqYgzuEQzqUQzuMwzqcwzuCIzqSIzuKozqaozuGYzqWYzuO4zqe4zuBEzqREzuJkzqZkzuFUzqVUzuN0zqd0zuDMzqTMzuLszqbszuHczqXczuP8zqf87uAC7qQC7uIi7qYi7uES7qUS7uMy7qcy7uCK7qSK7uKq7qaq7uGa7qWa7uO67qe67uBG7qRG7uJm7qZm7uFW7qVW7uN27qd27uDO7qTO7uLu7qbu7uHe7qXe7uP+7qf+3uAB3qQB3uIh3qYh3uER3qUR3uMx3qcx3uCJ3qSJ3uKp3qap3uGZ3qWZ3uO53qe53uBF3qRF3uJl3qZl3uFV3qVV3uN13qd13uDN3qTN3uLt3qbt3uHd3qXd3uP93qf9/uAD/qQD/uIj/qYj/uET/qUT/uMz/qcz/uCL/qSL/uKr/qar/uGb/qWb/uO7/qe7/uBH/qRH/uJn/qZn/uFX/qVX/uN3/qd3/uDP/qTP/uLv/qbv/uHf/qXf/uP//G//usAcf4roAM5sIM4qIM5uEM4pEM5tMM4rMM5vCM4oiM5sqM4qqM5umM4pmM5tuM4ruM5vhM4oRM5sZM4qZM5uVM4pVM5tdM4rdM5vTM4ozM5s7M4q7M5u3M4p3M5t/M4r/M5vwu4oAu5sIu4qIu5uEu4pEu5tMu4rMu5vCu4oiu5squ4qqu5umu4pmu5tuu4ruu5vhu4oRu5sZu4qZu5uVu4pVu5tdu4rdu5vTu4ozu5s7u4q7u5u3u4p3u5t/u4r/u5vwd4oAd5sId4qId5uEd4pEd5tMd4rMd5vCd4oid5sqd4qqd5umd4pmd5tud4rud5vhd4oRd5sZd4qZd5uVd4pVd5tdd4rdd5vTd4ozd5s7d4q7d5u3d4p3d5t/d4r/d5vw/4oA/5sI/4qI/5uE/4pE/5tM/4rM/5vC/4oi/5sq/4qq/5um/4pm/5tu/4ru/5vh/4oR/5sZ/4qZ/5uV/4pV/5td/4rd/5vT/4oz/5s7/4q7/5u3/4p3/5t//4fy9jlJw= + + + + + AgAAAACAAACAOwAAzgAAAC8AAAA=eJzt0iEKQwEQQ8G29z90xXeFiEDEUuaZcVH5vJ4+JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEky9v7xX/bIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v9/j0BcUYHgl4nO3FMQ0AAAACIGf/0B7WgIfmatu2bdu2bdu2bdu2bdu2bdu2bdu2bTsDGPUO4Q== + + + AgAAAACAAACAOwAAUQAAADUAAAA=eJztxTERADAIBLC/w0PNsmAWHxVCsmT2dSUZ27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27YP/wFH9JHSeJztxTENAAAIA7AleMAsD2bxgZH26V5PJVnbtm3btm3btm3btm3btm3btm3btm3beaYkrMM= + + + AgAAAACAAACAOwAANAAAACUAAAA=eJztwQEBAAAAgJD+r+4ICgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgAAAAXic7cExAQAAAMKg9U/tZQugAAAAAAAAAAAAAAAAAACAGzuAAAE= + + + AgAAAACAAACAOwAATBgAAGULAAA=eJw13dMWIMqSBcDbtm3btm3btm3btm3btm3bdvc8TJx6iU+olVWZO//3v/8/ARiQgRiYQRiUwRicIRiSoRiaYRiW4RieERiRkRiZURiV0RidMRiTsRibcRiX8RifCZiQiZiYSZiUyZicKZiSqZiaaZiW6ZieGZiRmZiZWZiV2ZidOZiTuZibeZiX+ZifBViQhViYRViUxVicJViSpViaZViW5VieFViRlViZVViV1VidNViTtVibdViX9VifDdiQjdiYTdiUzdicLdiSrdiabdiW7dieHdiRndiZXdiV3didPdiTvdibfdiX/difAziQgziYQziUwzicIziSoziaYziW4zieEziRkziZUziV0zidMziTszibcziX8zifC7iQi7iYS7iUy7icK7iSq7iaa7iW67ieG7iRm7iZW7iV27idO7iTu7ibe7iX+7ifB3iQh3iYR3iUx3icJ3iSp3iaZ3iW53ieF3iRl3iZV3iV13idN3iTt3ibd3iX93ifD/iQj/iYT/iUz/icL/iSr/iab/iW7/ieH/iRn/iZX/iV3/idP/iTv/ibf/iX//jfxR+AARmIgRmEQRmMwRmCIRmKoRmGYRmO4RmBERmJkRmFURmN0RmDMRmLsRmHcRmP8ZmACZmIiZmESZmMyZmCKZmKqZmGaZmO6ZmBGZmJmZmFWZmN2ZmDOZmLuZmHeZmP+VmABVmIhVmERVmMxVmCJVmKpVmGZVmO5VmBFVmJlVmFVVmN1VmDNVmLtVmHdVmP9dmADdmIjdmETdmMzdmCLdmKrdmGbdmO7dmBHdmJndmFXdmN3dmDPdmLvdmHfdmP/TmAAzmIgzmEQzmMwzmCIzmKozmGYzmO4zmBEzmJkzmFUzmN0zmDMzmLszmHczmP87mAC7mIi7mES7mMy7mCK7mKq7mGa7mO67mBG7mJm7mFW7mN27mDO7mLu7mHe7mP+3mAB3mIh3mER3mMx3mCJ3mKp3mGZ3mO53mBF3mJl3mFV3mN13mDN3mLt3mHd3mP9/mAD/mIj/mET/mMz/mCL/mKr/mGb/mO7/mBH/mJn/mFX/mN3/mDP/mLv/mHf/mP/xX8ARiQgRiYQRiUwRicIRiSoRiaYRiW4RieERiRkRiZURiV0RidMRiTsRibcRiX8RifCZiQiZiYSZiUyZicKZiSqZiaaZiW6ZieGZiRmZiZWZiV2ZidOZiTuZibeZiX+ZifBViQhViYRViUxVicJViSpViaZViW5VieFViRlViZVViV1VidNViTtVibdViX9VifDdiQjdiYTdiUzdicLdiSrdiabdiW7dieHdiRndiZXdiV3didPdiTvdibfdiX/difAziQgziYQziUwzicIziSoziaYziW4zieEziRkziZUziV0zidMziTszibcziX8zifC7iQi7iYS7iUy7icK7iSq7iaa7iW67ieG7iRm7iZW7iV27idO7iTu7ibe7iX+7ifB3iQh3iYR3iUx3icJ3iSp3iaZ3iW53ieF3iRl3iZV3iV13idN3iTt3ibd3iX93ifD/iQj/iYT/iUz/icL/iSr/iab/iW7/ieH/iRn/iZX/iV3/idP/iTv/ibf/iX//jfQ38ABmQgBmYQBmUwBmcIhmQohmYYhmU4hmcERmQkRmYURmU0RmcMxmQsxmYcxmU8xmcCJmQiJmYSJmUyJmcKpmQqpmYapmU6pmcGZmQmZmYWZmU2ZmcO5mQu5mYe5mU+5mcBFmQhFmYRFmUxFmcJlmQplmYZlmU5lmcFVmQlVmYVVmU1VmcN1mQt1mYd1mU91mcDNmQjNmYTNmUzNmcLtmQrtmYbtmU7tmcHdmQndmYXdmU3dmcP9mQv9mYf9mU/9ucADuQgDuYQDuUwDucIjuQojuYYjuU4jucETuQkTuYUTuU0TucMzuQszuYczuU8zucCLuQiLuYSLuUyLucKruQqruYaruU6rucGbuQmbuYWbuU2bucO7uQu7uYe7uU+7ucBHuQhHuYRHuUxHucJnuQpnuYZnuU5nucFXuQlXuYVXuU1XucN3uQt3uYd3uU93ucDPuQjPuYTPuUzPucLvuQrvuYbvuU7vucHfuQnfuYXfuU3fucP/uQv/uYf/uU//vfBH4ABGYiBGYRBGYzBGYIhGYqhGYZhGY7hGYERGYmRGYVRGY3RGYMxGYuxGYdxGY/xmYAJmYiJmYRJmYzJmYIpmYqpmYZpmY7pmYEZmYmZmYVZmY3ZmYM5mYu5mYd5mY/5WYAFWYiFWYRFWYzFWYIlWYqlWYZlWY7lWYEVWYmVWYVVWY3VWYM1WYu1WYd1WY/12YAN2YiN2YRN2YzN2YIt2Yqt2YZt2Y7t2YEd2Ymd2YVd2Y3d2YM92Yu92Yd92Y/9OYADOYiDOYRDOYzDOYIjOYqjOYZjOY7jOYETOYmTOYVTOY3TOYMzOYuzOYdzOY/zuYALuYiLuYRLuYzLuYIruYqruYZruY7ruYEbuYmbuYVbuY3buYM7uYu7uYd7uY/7eYAHeYiHeYRHeYzHeYIneYqneYZneY7neYEXeYmXeYVXeY3XeYM3eYu3eYd3eY/3+YAP+YiP+YRP+YzP+YIv+Yqv+YZv+Y7v+YEf+Ymf+YVf+Y3f+YM/+Yu/+Yd/+Y//NfYFYEAGYmAGYVAGY3CGYEiGYmiGYViGY3hGYERGYmRGYVRGY3TGYEzGYmzGYVzGY3wmYEImYmImYVImY3KmYEqmYmqmYVqmY3pmYEZmYmZmYVZmY3bmYE7mYm7mYV7mY34WYEEWYmEWYVEWY3GWYEmWYmmWYVmWY3lWYEVWYmVWYVVWY3XWYE3WYm3WYV3WY302YEM2YmM2YVM2Y3O2YEu2Ymu2YVu2Y3t2YEd2Ymd2YVd2Y3f2YE/2Ym/2YV/2Y38O4EAO4mAO4VAO43CO4EiO4miO4ViO43hO4ERO4mRO4VRO43TO4EzO4mzO4VzO43wu4EIu4mIu4VIu43Ku4Equ4mqu4Vqu43pu4EZu4mZu4VZu43bu4E7u4m7u4V7u434e4EEe4mEe4VEe43Ge4Eme4mme4Vme43le4EVe4mVe4VVe43Xe4E3e4m3e4V3e430+4EM+4mM+4VM+43O+4Eu+4mu+4Vu+43t+4Ed+4md+4Vd+43f+4E/+4m/+4V/+438N/QEYkIEYmEEYlMEYnCEYkqEYmmEYluEYnhEYkZEYmVEYldEYnTEYk7EYm3EYl/EYnwmYkImYmEmYlMmYnCmYkqmYmmmYlumYnhmYkZmYmVmYldmYnTmYk7mYm3mYl/mYnwVYkIVYmEVYlMVYnCVYkqVYmmVYluVYnhVYkZVYmVVYldVYnTVYk7VYm3VYl/VYnw3YkI3YmE3YlM3YnC3Ykq3Ymm3Ylu3Ynh3YkZ3YmV3Yld3YnT3Yk73Ym33Yl/3YnwM4kIM4mEM4lMM4nCM4kqM4mmM4luM4nhM4kZM4mVM4ldM4nTM4k7M4m3M4l/M4nwu4kIu4mEu4lMu4nCu4kqu4mmu4luu4nhu4kZu4mVu4ldu4nTu4k7u4m3u4l/u4nwd4kId4mEd4lMd4nCd4kqd4mmd4lud4nhd4kZd4mVd4ldd4nTd4k7d4m3d4l/d4nw/4kI/4mE/4lM/4nC/4kq/4mm/4lu/4nh/4kZ/4mV/4ld/4nT/4k7/4m3/4l//43yBfAAZkIAZmEAZlMAZnCIZkKIZmGIZlOIZnBEZkJEZmFEZlNEZnDMZkLMZmHMZlPMZnAiZkIiZmEiZlMiZnCqZkKqZmGqZlOqZnBmZkJmZmFmZlNmZnDuZkLuZmHuZlPuZnARZkIRZmERZlMRZnCZZkKZZmGZZlOZZnBVZkJVZmFVZlNVZnDdZkLdZmHdZlPdZnAzZkIzZmEzZlMzZnC7ZkK7ZmG7ZlO7ZnB3ZkJ3ZmF3ZlN3ZnD/ZkL/ZmH/ZlP/bnAA7kIA7mEA7lMA7nCI7kKI7mGI7lOI7nBE7kJE7mFE7lNE7nDM7kLM7mHM7lPM7nAi7kIi7mEi7lMi7nCq7kKq7mGq7lOq7nBm7kJm7mFm7lNm7nDu7kLu7mHu7lPu7nAR7kIR7mER7lMR7nCZ7kKZ7mGZ7lOZ7nBV7kJV7mFV7lNV7nDd7kLd7mHd7lPd7nAz7kIz7mEz7lMz7nC77kK77mG77lO77nB37kJ37mF37lN37nD/7kL/7mH/7lP/43wB+AARmIgRmEQRmMwRmCIRmKoRmGYRmO4RmBERmJkRmFURmN0RmDMRmLsRmHcRmP8ZmACZmIiZmESZmMyZmCKZmKqZmGaZmO6ZmBGZmJmZmFWZmN2ZmDOZmLuZmHeZmP+VmABVmIhVmERVmMxVmCJVmKpVmGZVmO5VmBFVmJlVmFVVmN1VmDNVmLtVmHdVmP9dmADdmIjdmETdmMzdmCLdmKrdmGbdmO7dmBHdmJndmFXdmN3dmDPdmLvdmHfdmP/TmAAzmIgzmEQzmMwzmCIzmKozmGYzmO4zmBEzmJkzmFUzmN0zmDMzmLszmHczmP87mAC7mIi7mES7mMy7mCK7mKq7mGa7mO67mBG7mJm7mFW7mN27mDO7mLu7mHe7mP+3mAB3mIh3mER3mMx3mCJ3mKp3mGZ3mO53mBF3mJl3mFV3mN13mDN3mLt3mHd3mP9/mAD/mIj/mET/mMz/mCL/mKr/mGb/mO7/mBH/mJn/mFX/mN3/mDP/mLv/mHf/mP/wX3BGBABmJgBmFQBmNwhmBIhmJohmFYhmN4RmBERmJkRmFURmN0xmBMxmJsxmFcxmN8JmBCJmJiJmFSJmNypmBKpmJqpmFapmN6ZmBGZmJmZmFWZmN25mBO5mJu5mFe5mN+FmBBFmJhFmFRFmNxlmBJlmJplmFZlmN5VmBFVmJlVmFVVmN11mBN1mJt1mFd1mN9NmBDNmJjNmFTNmNztmBLtmJrtmFbtmN7dmBHdmJndmFXdmN39mBP9mJv9mFf9mN/DuBADuJgDuFQDuNwjuBIjuJojuFYjuN4TuBETuJkTuFUTuN0zuBMzuJszuFczuN8LuBCLuJiLuFSLuNyruBKruJqruFaruN6buBGbuJmbuFWbuN27uBO7uJu7uFe7uN+HuBBHuJhHuFRHuNxnuBJnuJpnuFZnuN5XuBFXuJlXuFVXuN13uBN3uJt3uFd3uN9PuBDPuJjPuFTPuNzvuBLvuJrvuFbvuN7fuBHfuJnfuFXfuN3/uBP/uJv/uFf/uN/gX0BGJCBGJhBGJTBGJwhGJKhGJphGJbhGJ4RGJGRGJlRGJXRGJ0xGJOxGJtxGJfxGJ8JmJCJmJhJmJTJmJwpmJKpmJppmJbpmJ4ZmJGZmJlZmJXZmJ05mJO5mJt5mJf5mJ8FWJCFWJhFWJTFWJwlWJKlWJplWJblWJ4VWJGVWJlVWJXVWJ01WJO1WJt1WJf1WJ8N2JCN2JhN2JTN2Jwt2JKt2Jpt2Jbt2J4d2JGd2Jld2JXd2J092JO92Jt92Jf92J8DOJCDOJhDOJTDOJwjOJKjOJpjOJbjOJ4TOJGTOJlTOJXTOJ0zOJOzOJtzOJfzOJ8LuJCLuJhLuJTLuJwruJKruJpruJbruJ4buJGbuJlbuJXbuJ07uJO7uJt7uJf7uJ8HeJCHeJhHeJTHeJwneJKneJpneJbneJ4XeJGXeJlXeJXXeJ03eJO3eJt3eJf3eJ8P+JCP+JhP+JTP+Jwv+JKv+Jpv+Jbv+J4f+JGf+Jlf+JXf+J0/+JO/+Jt/+Jf/+F9QbwAGZCAGZhAGZTAGZwiGZCiGZhiGZTiGZwRGZCRGZhRGZTRGZwzGZCzGZhzGZTzGZwImZCImZhImZTImZwqmZCqmZhqmZTqmZwZmZCZmZhZmZTZmZw7mZC7mZh7mZT7mZwEWZCEWZhEWZTEWZwmWZCmWZhmWZTmWZwVWZCVWZhVWZTVWZw3WZC3WZh3WZT3WZwM2ZCM2ZhM2ZTM2Zwu2ZCu2Zhu2ZTu2Zwd2ZCd2Zhd2ZTd2Zw/2ZC/2Zh/2ZT/25wAO5CAO5hAO5TAO5wiO5CiO5hiO5TiO5wRO5CRO5hRO5TRO5wzO5CzO5hzO5TzO5wIu5CIu5hIu5TIu5wqu5Cqu5hqu5Tqu5wZu5CZu5hZu5TZu5w7u5C7u5h7u5T7u5wEe5CEe5hEe5TEe5wme5Cme5hme5Tme5wVe5CVe5hVe5TVe5w3e5C3e5h3e5T3e5wM+5CM+5hM+5TM+5wu+5Cu+5hu+5Tu+5wd+5Cd+5hd+5Td+5w/+5C/+5h/+5T/+F9AfgAEZiIEZhEEZjMEZgiEZiqEZhmEZjuEZgREZiZEZhVEZjdEZgzEZi7EZh3EZj/GZgAmZiImZhEmZjMmZgimZiqmZhmmZjumZgRmZiZmZhVmZjdmZgzmZi7mZh3mZj/lZgAVZiIVZhEVZjMVZgiVZiqVZhmVZjuVZgRVZiZVZhVVZjdVZgzVZi7VZh3VZj/XZgA3ZiI3ZhE3ZjM3Zgi3Ziq3Zhm3Zju3ZgR3ZiZ3ZhV3Zjd3Zgz3Zi73Zh33Zj/05gAM5iIM5hEM5jMM5giM5iqM5hmM5juM5gRM5iZM5hVM5jdM5gzM5i7M5h3M5j/O5gAu5iIu5hEu5jMu5giu5iqu5hmu5juu5gRu5iZu5hVu5jdu5gzu5i7u5h3u5j/t5gAd5iId5hEd5jMd5gid5iqd5hmd5jud5gRd5iZd5hVd5jdd5gzd5i7d5h3d5j/f5gA/5iI/5hE/5jM/5gi/5iq/5hm/5ju/5gR/5iZ/5hV/5jd/5gz/5i7/5h3/5j/8t5gnAgAzEwAzCoAzG4AzBkAzF0AzDsAzH8IzAiIzEyIzCqIzG6IzBmIzF2IzDuIzH+EzAhEzExEzCpEzG5EzBlEzF1EzDtEzH9MzAjMzEzMzCrMzG7MzBnMzF3MzDvMzH/CzAgizEwizCoizG4izBkizF0izDsizH8qzAiqzEyqzCqqzG6qzBmqzF2qzDuqzH+mzAhmzExmzCpmzG5mzBlmzF1mzDtmzH9uzAjuzEzuzCruzG7uzBnuzF3uzDvuzH/hzAgRzEwRzCoRzG4RzBkRzF0RzDsRzH8ZzAiZzEyZzCqZzG6ZzBmZzF2ZzDuZzH+VzAhVzExVzCpVzG5VzBlVzF1VzDtVzH9dzAjdzEzdzCrdzG7dzBndzF3dzDvdzH/TzAgzzEwzzCozzG4zzBkzzF0zzDszzH87zAi7zEy7zCq7zG67zBm7zF27zDu7zH+3zAh3zEx3zCp3zG53zBl3zF13zDt3zH9/zAj/zEz/zCr/zG7/zBn/zF3/zDv/zH/xbyBWBABmJgBmFQBmNwhmBIhmJohmFYhmN4RmBERmJkRmFURmN0xmBMxmJsxmFcxmN8JmBCJmJiJmFSJmNypmBKpmJqpmFapmN6ZmBGZmJmZmFWZmN25mBO5mJu5mFe5mN+FmBBFmJhFmFRFmNxlmBJlmJplmFZlmN5VmBFVmJlVmFVVmN11mBN1mJt1mFd1mN9NmBDNmJjNmFTNmNztmBLtmJrtmFbtmN7dmBHdmJndmFXdmN39mBP9mJv9mFf9mN/DuBADuJgDuFQDuNwjuBIjuJojuFYjuN4TuBETuJkTuFUTuN0zuBMzuJszuFczuN8LuBCLuJiLuFSLuNyruBKruJqruFaruN6buBGbuJmbuFWbuN27uBO7uJu7uFe7uN+HuBBHuJhHuFRHuNxnuBJnuJpnuFZnuN5XuBFXuJlXuFVXuN13uBN3uJt3uFd3uN9PuBDPuJjPuFTPuNzvuBLvuJrvuFbvuN7fuBHfuJnfuFXfuN3/uBP/uJv/uFf/uN/i3gDMCADMTCDMCiDMThDMCRDMTTDMCzDMTwjMCIjMTKjMCqjMTpjMCZjMTbjMC7jMT4TMCETMTGTMCmTMTlTMCVTMTXTMC3TMT0zMCMzMTOzMCuzMTtzMCdzMTfzMC/zMT8LsCALsTCLsCiLsThLsCRLsTTLsCzLsTwrsCIrsTKrsCqrsTprsCZrsTbrsC7rsT4bsCEbsTGbsCmbsTlbsCVbsTXbsC3bsT07sCM7sTO7sCu7sTt7sCd7sTf7sC/7sT8HcCAHcTCHcCiHcThHcCRHcTTHcCzHcTwncCIncTKncCqncTpncCZncTbncC7ncT4XcCEXcTGXcCmXcTlXcCVXcTXXcC3XcT03cCM3cTO3cCu3cTt3cCd3cTf3cC/3cT8P8CAP8TCP8CiP8ThP8CRP8TTP8CzP8Twv8CIv8TKv8Cqv8Tpv8CZv8Tbv8C7v8T4f8CEf8TGf8Cmf8Tlf8CVf8TXf8C3f8T0/8CM/8TO/8Cu/8Tt/8Cd/8Tf/8C//8f8AkFtweXicLcVDEBgGAgDA2LZt27Zt2zYb27Zt27adtLFt42Yuu58NECHA/wV0IAd2EAd1MAd3CId0KId2GId1OId3BEd0JEd2FEd1NEd3DMd0LMd2HMd1PMd3Aid0Iid2Eid1Mid3Cqd0Kqd2Gqd1Oqd3Bmd0Jmd2Fmd1Nmd3Dud0Lud2Hud1Pud3ARd0IRd2ERd1MRd3CZd0KZd2GZd1OZd3BVd0JVd2FVd1NVd3Ddd0Ldd2Hdd1Pdd3Azd0Izd2Ezd1Mzd3C7d0K7d2G7d1O7d3B3d0J3d2F3d1N3d3D/d0L/d2H/f1P+7n/h7ggR7kwR7ioR7m4R7hkR7l0R7jsR7n8Z7giZ7kyZ7iqZ7m6Z7hmZ7l2Z7juZ7n+V7ghV7kxV7ipV7m5V7hlV7l1V7jtV7n9d7gjd7kzd7ird7m7d7hnd7l3d7jvd7n/T7ggz7kwz7ioz7m4z7hkz7l0z7jsz7n877gi77ky77iq77m677hm77lf/2fb/uO7/qe7/uBH/qRH/uJn/qZn/uFX/qVX/uN3/qd3/uDP/qTP/uLv/qbv/uHf/qXf/uPA0T8W0AHcmAHcVAHc3CHcEiHcmiHcViHc3hHcERHcmRHcVRHc3THcEzHcmzHcVzHc3wncEIncmIncVInc3KncEqncmqncVqnc3pncEZncmZncVZnc3bncE7ncm7ncV7nc34XcEEXcmEXcVEXc3GXcEmXcmmXcVmXc3lXcEVXcmVXcVVXc3XXcE3Xcm3XcV3Xc303cEM3cmM3cVM3c3O3cEu3cmu3cVu3c3t3cEd3cmd3cVd3c3f3cE/3cm/3cV//437u7wEe6EEe7CEe6mEe7hEe6VEe7TEe63Ee7wme6Eme7Cme6mme7hme6Vme7Tme63me7wVe6EVe7CVe6mVe7hVe6VVe7TVe63Ve7w3e6E3e7C3e6m3e7h3e6V3e7T3e633e7wM+6EM+7CM+6mM+7hM+6VM+7TM+63M+7wu+6Eu+7Cu+6mu+7hu+6Vv+1//5tu/4ru/5vh/4oR/5sZ/4qZ/5uV/4pV/5td/4rd/5vT/4oz/5s7/4q7/5u3/4p3/5t/84QKS/BXQgB3YQB3UwB3cIh3Qoh3YYh3U4h3cER3QkR3YUR3U0R3cMx3Qsx3Ycx3U8x3cCJ3QiJ3YSJ3UyJ3cKp3Qqp3Yap3U6p3cGZ3QmZ3YWZ3U2Z3cO53Qu53Ye53U+53cBF3QhF3YRF3UxF3cJl3Qpl3YZl3U5l3cFV3QlV3YVV3U1V3cN13Qt13Yd13U913cDN3QjN3YTN3UzN3cLt3Qrt3Ybt3U7t3cHd3Qnd3YXd3U3d3cP93Qv93Yf9/U/7uf+HuCBHuTBHuKhHubhHuGRHuXRHuOxHufxnuCJnuTJnuKpnubpnuGZnuXZnuO5nuf5XuCFXuTFXuKlXublXuGVXuXVXuO1Xuf13uCN3uTN3uKt3ubt3uGd3uXd3uO93uf9PuCDPuTDPuKjPubjPuGTPuXTPuOzPufzvuCLvuTLvuKrvubrvuGbvuV//Z9v+47v+p7v+4Ef+pEf+4mf+pmf+4Vf+pVf+43f+p3f+4M/+pM/+4u/+pu/+4d/+pd/+48DRP5bQAdyYAdxUAdzcIdwSIdyaIdxWIdzeEdwREdyZEdxVEdzdMdwTMdybMdxXMdzfCdwQidyYidxUidzcqdwSqdyaqdxWqdzemdwRmdyZmdxVmdzdudwTudybudxXudzfhdwQRdyYRdxURdzcZdwSZdyaZdxWZdzeVdwRVdyZVdxVVdzdddwTddybddxXddzfTdwQzdyYzdxUzdzc7dwS7dya7dxW7dze3dwR3dyZ3dxV3dzd/dwT/dyb/dxX//jfu7vAR7oQR7sIR7qYR7uER7pUR7tMR7rcR7vCZ7oSZ7sKZ7qaZ7uGZ7pWZ7tOZ7reZ7vBV7oRV7sJV7qZV7uFV7pVV7tNV7rdV7vDd7oTd7sLd7qbd7uHd7pXd7tPd7rfd7vAz7oQz7sIz7qYz7uEz7pUz7tMz7rcz7vC77oS77sK77qa77uG77pW/7X//m27/iu7/m+H/ihH/mxn/ipn/m5X/ilX/m13/it3/m9P/ijP/mzv/irv/m7f/inf/m3/zhAlL8FdCAHdhAHdTAHdwiHdCiHdhiHdTiHdwRHdCRHdhRHdTRHdwzHdCzHdhzHdTzHdwIndCIndhIndTIndwqndCqndhqndTqndwZndCZndhZndTZndw7ndC7ndh7ndT7ndwEXdCEXdhEXdTEXdwmXdCmXdhmXdTmXdwVXdCVXdhVXdTVXdw3XdC3Xdh3XdT3XdwM3dCM3dhM3dTM3dwu3dCu3dhu3dTu3dwd3dCd3dhd3dTd3dw/3dC/3dh/39T/u5/4e4IEe5MEe4qEe5uEe4ZEe5dEe47Ee5/Ge4Ime5Mme4qme5ume4Zme5dme47me5/le4IVe5MVe4qVe5uVe4ZVe5dVe47Ve5/Xe4I3e5M3e4q3e5u3e4Z3e5d3e473e5/0+4IM+5MM+4qM+5uM+4ZM+5dM+47M+5/O+4Iu+5Mu+4qu+5uu+4Zu+5X/9n2/7ju/6nu/7gR/6kR/7iZ/6mZ/7hV/6lV/7jd/6nd/7gz/6kz/7i7/6m7/7h3/6l3/7jwNE/VtAB3JgB3FQB3Nwh3BIh3Joh3FYh3N4R3BER3JkR3FUR3N0x3BMx3Jsx3Fcx3N8J3BCJ3JiJ3FSJ3Nyp3BKp3Jqp3Fap3N6Z3BGZ3JmZ3FWZ3N253BO53Ju53Fe53N+F3BBF3JhF3FRF3Nxl3BJl3Jpl3FZl3N5V3BFV3JlV3FVV3N113BN13Jt13Fd13N9N3BDN3JjN3FTN3Nzt3BLt3Jrt3Fbt3N7d3BHd3Jnd3FXd3N393BP93Jv93Ff/+N+7u8BHuhBHuwhHuphHu4RHulRHu0xHutxHu8JnuhJnuwpnuppnu4ZnulZnu05nut5nu8FXuhFXuwlXuplXu4VXulVXu01Xut1Xu8N3uhN3uwt3upt3u4d3uld3u093ut93u8DPuhDPuwjPupjPu4TPulTPu0zPutzPu8LvuhLvuwrvuprvu4bvulb/tf/+bbv+K7v+b4f+KEf+bGf+Kmf+blf+KVf+bXf+K3f+b0/+KM/+bO/+Ku/+bt/+Kd/+bf/OEC0vwV0IAd2EAd1MAd3CId0KId2GId1OId3BEd0JEd2FEd1NEd3DMd0LMd2HMd1PMd3Aid0Iid2Eid1Mid3Cqd0Kqd2Gqd1Oqd3Bmd0Jmd2Fmd1Nmd3Dud0Lud2Hud1Pud3ARd0IRd2ERd1MRd3CZd0KZd2GZd1OZd3BVd0JVd2FVd1NVd3Ddd0Ldd2Hdd1Pdd3Azd0Izd2Ezd1Mzd3C7d0K7d2G7d1O7d3B3d0J3d2F3d1N3d3D/d0L/d2H/f1P+7n/h7ggR7kwR7ioR7m4R7hkR7l0R7jsR7n8Z7giZ7kyZ7iqZ7m6Z7hmZ7l2Z7juZ7n+V7ghV7kxV7ipV7m5V7hlV7l1V7jtV7n9d7gjd7kzd7ird7m7d7hnd7l3d7jvd7n/T7ggz7kwz7ioz7m4z7hkz7l0z7jsz7n877gi77ky77iq77m677hm77lf/2fb/uO7/qe7/uBH/qRH/uJn/qZn/uFX/qVX/uN3/qd3/uDP/qTP/uLv/qbv/uHf/qXf/uPA0T/W0AHcmAHcVAHc3CHcEiHcmiHcViHc3hHcERHcmRHcVRHc3THcEzHcmzHcVzHc3wncEIncmIncVInc3KncEqncmqncVqnc3pncEZncmZncVZnc3bncE7ncm7ncV7nc34XcEEXcmEXcVEXc3GXcEmXcmmXcVmXc3lXcEVXcmVXcVVXc3XXcE3Xcm3XcV3Xc303cEM3cmM3cVM3c3O3cEu3cmu3cVu3c3v/D7sXJBU= + + + + + AwAAAACAAADcWwAAvxUAAEoWAABFEAAAeJxN2rGNZFmOheFwYFQKK5W4DqxewPAasA4s6uhjwUptBeX2Y5QWmH4MpvxY7IuMS57/AQmcyGEwv+K9j6P0649/fr3eP6//fX4KWcjBmnZ+Hv8+UX/QB7mc//gn8+dvj2GzkIM17fx+ygbXH/RBLue3wfn+vTEIBsEgGASDYBAMgkEwCAbBEDAEDAFDwBAwBAwBQ8AQMAQMAcO7755F4ywaZ9E2TP4+i7Zh6w/6IJfz5yzahvczhslCDta08zxj2PqDPsjl/G3YfL+/c0jMITGHxBwSc0jMITGHxBwSc0jMIW14f2fvw8F9OLgPx4bJ3/fh2LD1B32Qy/lzH44NgkEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoG74/7560YXOwpp2/96QNrj/og1zOnz1Jw9fr1z/GcLOQgzXtfHf15/eJ+oM+yOU8u/qTP397DJuFHKxp57urx+D6gz7I5Ty7eg2CQTAIBsEgGASDYBAMgkEwCIaAIWAIGAKGgCFgCBgChoAhYAgYnr4+i8ZZNM6ibZh8d7XPom3YPsjlPLt6Dc+zhslCDta0833WsPUHfZDLeXa155CYQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOacPzHd+Hg/twcB+ODZPvrvZ9ODZsH+Rynl3t9wIGwSAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWx4f/aetGFzsKad7672nrTBfZDLeXa1DV+vv/5nDDcLOVjTzndXf36fqD/og1zOs6s/+fO3x7BZyMGadr67egyuP+iDXM6zq9cgGASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4enrs2icReMs2obJd1f7LNqG7YNczrOr1/A8a5gs5GBNO99nDVt/0Ae5nGdXew6JOSTmkJhDYg6JOSTmkJhDYg6JOSTmkDY83/F9OLgPB/fh2DD57mrfh2PD9kEu59nVfi9gEAyCQTAIBsEgGASDYBAMgqFgKBgKhoKhYCgYCoaCoWAoGMqG92fvSRs2B2va+e5q70kb3Ae5nGdX2/D1+vHfY7hZyMGadr67+vP7RP1BH+Rynl39yZ+/PYbNQg7WtPPd1WNw/UEf5HKeXb0GwSAYBINgEAyCQTAIBsEgGARDwBAwBAwBQ8AQMAQMAUPAEDAEDE9fn0XjLBpn0TZMvrvaZ9E2bB/kcp5dvYbnWcNkIQdr2vk+a9j6gz7I5Ty72nNIzCExh8QcEnNIzCExh8QcEnNIzCExh7Th+Y7vw8F9OLgPx4bJd1f7Phwbtg9yOc+u9nsBg2AQDIJBMAgGwSAYBINgEAwFQ8FQMBQMBUPBUDAUDAVDwVA2vD97T9qwOVjTzndXe0/a4D7I5Ty72obn5+9juFnIwZp2vrv68/tE/UEf5HKeXf3J92//fc7Chs3Bmna+u3oMrj/og1zOs6vXIBgEg2AQDIJBMAgGwSAYBINgCBgChoAhYAgYAoaAIWAIGAKGgOF9xnsWjbNonEXbMPnuap9F27B9kMt5dvUa3ndrDJOFHKxp5/usYesP+iCX8+xqzyExh8QcEnNIzCExh8QcEnNIzCExh8Qc0ob3u7T34eA+HNyHY8Pku6t9H44N2we5nGdX+72AQTAIBsEgGASDYBAMgkEwCIaCoWAoGAqGgqFgKBgKhoKhYCgbvnfW7kkbNgdr2vnuau9JG9wHuZxnV9vw9frXf43hZiEHa9r57urP7xP1B32Qy3l29Sd//vYYNgs5WNPOd1ePwfUHfZDLeXb1GgSDYBAMgkEwCAbBIBgEg2AQDAFDwBAwBAwBQ8AQMAQMAUPAEDA8fX0WjbNonEXbMPnuap9F27B9kMt5dvUanmcNk4UcrGnn+6xh6w/6IJfz7GrPITGHxBwSc0jMITGHxBwSc0jMITGHxBzShuc7vg8H9+HgPhwbJt9d7ftwbNg+yOU8u9rvBQyCQTAIBsEgGASDYBAMgkEwFAwFQ8FQMBQMBUPBUDAUDAVD2fD+7D1pw+ZgTTvfXe09aYP7IJfz7Gobvl4//3MMNws5WNPOd1d/fp+oP+iDXM6zqz/587fHsFnIwZp2vrt6DK4/6INczrOr1yAYBINgEAyCQTAIBsEgGASDYAgYAoaAIWAIGAKGgCFgCBgChoDh6euzaJxF4yzahsl3V/ss2obtg1zOs6vX8DxrmCzkYE0732cNW3/QB7mcZ1d7Dok5JOaQmENiDok5JOaQmENiDok5JOaQNjzf8X04uA8H9+HYMPnuat+HY8P2QS7n2dV+L2AQDIJBMAgGwSAYBINgEAyCoWAoGAqGgqFgKBgKhoKhYCgYyob3Z+9JGzYHa9r57mrvSRvcB7mcZ1fb8PX68z/GcLOQgzXtfHf15/eJ+oM+yOU8u/qTP397DJuFHKxp57urx+D6gz7I5Ty7eg2CQTAIBsEgGASDYBAMgkEwCIaAIWAIGAKGgCFgCBgChoAhYAgYnr4+i8ZZNM6ibZh8d7XPom3YPsjlPLt6Dc+zhslCDta0833WsPUHfZDLeXa155CYQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOacPzHd+Hg/twcB+ODZPvrvZ9ODZsH+Rynl3t9wIGwSAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWx4f/aetGFzsKad7672nrTBfZDLeXa1Dc///rcx3CzkYE073139+X2i/qAPcjnPrv7kewZ/m7OwYXOwpp3vrh6D6w/6IJfz7Oo1CAbBIBgEg2AQDIJBMAgGwSAYAoaAIWAIGAKGgCFgCBgChoAhYHj33bNonEXjLNqGyXdX+yzahu2DXM6zq9fwfsYwWcjBmnaeZwxbf9AHuZxnV3sOiTkk5pCYQ2IOiTkk5pCYQ2IOiTkk5pA2vL+z9+HgPhzch2PD5LurfR+ODdsHuZxnV/u9gEEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoG74/7560YXOwpp3vrvaetMF9kMt5drUNX6+//q93V39nIQdr2vnu6s/vE/UHfZDLeXb1J3/+/WPYLORgTTvfXT0G1x/0QS7n2dVrEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwPD09Vk0zqJxFm3D5LurfRZtw/ZBLufZ1Wt4njVMFnKwpp3vs4atP+iDXM6zqz2HxBwSc0jMITGHxBwSc0jMITGHxBwSc0gbnu/4Phzch4P7cGyYfHe178OxYfsgl/Psar8XMAgGwSAYBINgEAyCQTAIBsFQMBQMBUPBUDAUDAVDwVAwFAxlw/uz96QNm4M17Xx3tfekDe6DXM6zq214fn57V39nIQdr2vnu6s/vE/UHfZDLeXb1J9//r/rtXT2GzcGadr67egyuP+iDXM6zq9cgGASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4X3GexaNs2icRdsw+e5qn0XbsH2Qy3l29Rred2sMk4UcrGnn+6xh6w/6IJfz7GrPITGHxBwSc0jMITGHxBwSc0jMITGHxBzShve7tPfh4D4c3Idjw+S7q30fjg3bB7mcZ1f7vYBBMAgGwSAYBINgEAyCQTAIhoKhYCgYCoaCoWAoGAqGgqFgKBu+d9Zv72rvSRtc0853V3tP2uA+yOU8u9qGr9evNdws5GBNO99d/WsNU3/QB7mcZ1f/2rOwYbOQgzXtfHf1GFx/0Ae5nGdXr0EwCAbBIBgEg2AQDIJBMAgGwRAwBAwBQ8AQMAQMAUPAEDAEDAHD09dn0TiLxlm0DZPvrvZZtA3bB7mcZ1ev4XnWMFnIwZp2vs8atv6gD3I5z672HBJzSMwhMYfEHBJzSMwhMYfEHBJzSMwhbXi+4/twcB8O7sOxYfLd1b4Px4btg1zOs6v9XsAgGASDYBAMgkEwCAbBIBgEQ8FQMBQMBUPBUDAUDAVDwVAwlA3vz96TNmwO1rTz3dXekza4D3I5z6624ev1cw03CzlY0853V/9cw9Qf9EEu59nVP397V49hs5CDNe18d/UYXH/QB7mcZ1evQTAIBsEgGASDYBAMgkEwCAbBEDAEDAFDwBAwBAwBQ8AQMAQMAcP7v8fYs2icReMs2obJd1f7LNqG7YNczrOr1/A8a5gs5GBNO99nDVt/0Ae5nGdXew6JOSTmkJhDYg6JOSTmkJhDYg6JOSTmkDY83/F9OLgPB/fh2DD57mrfh2PD9kEu59nVfi9gEAyCQTAIBsEgGASDYBAMgqFgKBgKhoKhYCgYCoaCoWAoGMqG7/8eY/ekDZuDNe18d7X3pA3ug1zOs6tt+Hr9WMPNQg7WtPPd1T/WMPUHfZDLeXb1j9/e1WPYLORgTTvfXT0G1x/0QS7n2dVrEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwPD09Vk0zqJxFm3D5LurfRZtw/ZBLufZ1Wt4njVMFnKwpp3vs4atP+iDXM6zqz2HxBwSc0jMITGHxBwSc0jMITGHxBwSc0gbnu/4Phzch4P7cGyYfHe178OxYfsgl/Psar8XMAgGwSAYBINgEAyCQTAIBsFQMBQMBUPBUDAUDAVDwVAwFAxlw/uz96QNm4M17Xx3tfekDe6DXM6zq214/p1ruFnIwZp2vrv6tYapP+iDXM6zq1+/vavHsFnIwZp2vrt6DK4/6INczrOr1yAYBINgEAyCQTAIBsEgGASDYAgYAoaAIWAIGAKGgCFgCBgChoDh3XfPonEWjbNoGybfXe2zaBu2D3I5z65ew/sZw2QhB2vaeZ4xbP1BH+Rynl3tOSTmkJhDYg6JOSTmkJhDYg6JOSTmkJhD2vD+zt6Hg/twcB+ODZPvrvZ9ODZsH+Rynl3t9wIGwSAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWz4/rx70obNwZp2vrvae9IG90Eu59nVNny9/vXvMdws5GBNO99d/fl9ov6gD3I5z67+5K/vvz2GzUIO1rTz3dVjcP1BH+Rynl29BsEgGASDYBAMgkEwCAbBIBgEQ8AQMAQMAUPAEDAEDAFDwBAwBAxPX59F4ywaZ9E2TL672mfRNmwf5HKeXb2G51nDZCEHa9r5PmvY+oM+yOU8u9pzSMwhMYfEHBJzSMwhMYfEHBJzSMwhMYe04fmO78PBfTi4D8eGyXdX+z4cG7YPcjnPrvZ7AYNgEAyCQTAIBsEgGASDYBAMBUPBUDAUDAVDwVAwFAwFQ8FQNrw/e0/asDlY0853V3tP2uA+yOU8u9qGr9dfa7hZyMGadr67+q81TP1BH+Rynl39156FDZuFHKxp57urx+D6gz7I5Ty7eg2CQTAIBsEgGASDYBAMgkEwCIaAIWAIGAKGgCFgCBgChoAhYAgYnr4+i8ZZNM6ibZh8d7XPom3YPsjlPLt6Dc+zhslCDta0833WsPUHfZDLeXa155CYQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOacPzHd+Hg/twcB+ODZPvrvZ9ODZsH+Rynl3t9wIGwSAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWx4f/aetGFzsKad7672nrTBfZDLeXa1DV+vP9dws5CDNe18d/Wfa5j6gz7I5Ty7+s89Cxs2CzlY0853V4/B9Qd9kMt5dvUaBINgEAyCQTAIBsEgGASDYBAMAUPAEDAEDAFDwBAwBAwBQ8AQMDx9fRaNs2icRdsw+e5qn0XbsH2Qy3l29RqeZw2ThRysaef7rGHrD/ogl/Psas8hMYfEHBJzSMwhMYfEHBJzSMwhMYfEHNKG5zu+Dwf34eA+HBsm313t+3Bs2D7I5Ty72u8FDIJBMAgGwSAYBINgEAyCQTAUDAVDwVAwFAwFQ8FQMBQMBUPZ8P7sPWnD5mBNO99d7T1pg/sgl/PsahuenzXcLORgTTvfXf3HGqb+oA9yOc+u/mPPwobNQg7WtPPd1WNw/UEf5HKeXb0GwSAYBINgEAyCQTAIBsEgGARDwBAwBAwBQ8AQMAQMAUPAEDAEDO8z3rNonEXjLNqGyXdX+yzahu2DXM6zq9fwvltjmCzkYE0732cNW3/QB7mcZ1d7Dok5JOaQmENiDok5JOaQmENiDok5JOaQNrzfpb0PB/fh4D4cGybfXe37cGzYPsjlPLva7wUMgkEwCAbBIBgEg2AQDIJBMBQMBUPBUDAUDAVDwVAwFAwFQ9nwvbP+7V3tPWmDa9r57mrvSRvcB7mcZ1fb8PX6tYabhRysaee7q3+tYeoP+iCX8+zqX3sWNmwWcrCmne+uHoPrD/ogl/Ps6jUIBsEgGASDYBAMgkEwCAbBIBgChoAhYAgYAoaAIWAIGAKGgCFgePr6LBpn0TiLtmHy3dU+i7Zh+yCX8+zqNTzPGiYLOVjTzvdZw9Yf9EEu59nVnkNiDok5JOaQmENiDok5JOaQmENiDok5pA3Pd3wfDu7DwX04Nky+u9r34diwfZDLeXa13wsYBINgEAyCQTAIBsEgGASDYCgYCoaCoWAoGAqGgqFgKBgKhrLh/dl70obNwZp2vrvae9IG90Eu59nVNny9fq7hZiEHa9r57uqfa5j6gz7I5Ty7+ueehQ2bhRysaee7q8fg+oM+yOU8u3oNgkEwCAbBIBgEg2AQDIJBMAiGgCFgCBgChoAhYAgYAoaAIWAIGJ6+PovGWTTOom2YfHe1z6Jt2D7I5Ty7eg3Ps4bJQg7WtPN91rD1B32Qy3l2teeQmENiDok5JOaQmENiDok5JOaQmENiDmnD8x3fh4P7cHAfjg2T7672fTg2bB/kcp5d7fcCBsEgGASDYBAMgkEwCAbBIBgKhoKhYCgYCoaCoWAoGAqGgqFseH/2nrRhc7Cmne+u9p60wX2Qy3l2tQ1frx9ruFnIwZp2vrv6xxqm/qAPcjnPrv6xZ2HDZiEHa9r57uoxuP6gD3I5z65eg2AQDIJBMAgGwSAYBINgEAyCIWAIGAKGgCFgCBgChoAhYAgYAoanr8+icRaNs2gbJt9d7bNoG7YPcjnPrl7D86xhspCDNe18nzVs/UEf5HKeXe05JOaQmENiDok5JOaQmENiDok5JOaQmEPa8HzH9+HgPhzch2PD5LurfR+ODdsHuZxnV/u9gEEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoG96fvSdt2Bysaee7q70nbXAf5HKeXW3D8+9cw81CDta0893VrzVM/UEf5HKeXf3as7Bhs5CDNe18d/UYXH/QB7mcZ1evQTAIBsEgGASDYBAMgkEwCAbBEDAEDAFDwBAwBAwBQ8AQMAQMAcO7755F4ywaZ9E2TL672mfRNmwf5HKeXb2G9zOGyUIO1rTzPGPY+oM+yOU8u9pzSMwhMYf8f7f+gCJ4nE3aMW5kyXKF4buKsLkUGpH74NkJVxGuaMqWOw6NpNvAADIaEDDT0kp0qyojzn+BxjsksvJ9HZl1UKie6/q/fV3xc12V1zPXdn488/t0juUs5HL+/Iv55/Wa5xpkIQfXbOfHM79PrF/YB7mcn4bJP691bRAMgkEwCAbBIBgEg2AQDIKhYCgYCoaCoWAoGAqGgqFgKBjKhufPxzBZyME12/l+/PvE+oV9kMv58b/OP88/f/63DScLObhmOz8N/fvE+oV9kMv5Zej88/z/bsNkIQfXbOfnWdjg9Qv7IJfz6yxgEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwHDv67PYOIuNs9g2dH6exbZh1i/sg1zOr7PYNtzPGDoLObhmO59nDLN+YR/kcn4aJr962HNIzCExh8QcEnNIzCExh8QcEnNIzCFtuF/j+7BwHxbuw7Kh8+lq34dlw+yDXM7d1X5fwCAYBINgEAyCQTAIBsEgGARDwVAwFAwFQ8FQMBQMBUPBUDCUDY+f3ZM2TA6u2c6nq92TNngf5HLurrbh5/pGV3+jq7/R1d/o6m909Te6+htd/Y2u/kZXf6Orv9HVbZgs5OCa7Xy6ug1ev7APcjl3V49BMAgGwSAYBINgEAyCQTAIBsEQMAQMAUPAEDAEDAFDwBAwBAwBw72vz2LjLDbOYtvQ+XS1z2LbMPsgl3N39RjuZwydhRxcs53PM4ZZv7APcjl3V3sOiTkk5pCYQ2IOiTkk5pCYQ2IOiTkk5pA23K/xfVi4Dwv3YdnQ+XS178OyYfZBLufuar8vYBAMgkEwCAbBIBgEg2AQDIKhYCgYCoaCoWAoGAqGgqFgKBjKhsfP7kkbJgfXbOfT1e5JG7wPcjl3V9vwc32hq7/Q1V/o6i909Re6+gtd/YWu/kJXf6Grv9DVX+jqNkwWcnDNdj5d3QavX9gHuZy7q8cgGASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4d7XZ7FxFhtnsW3ofLraZ7FtmH2Qy7m7egz3M4bOQg6u2c7nGcOsX9gHuZy7qz2HxBwSc0jMITGHxBwSc0jMITGHxBwSc0gb7tf4Pizch4X7sGzofLra92HZMPsgl3N3td8XMAgGwSAYBINgEAyCQTAIBsFQMBQMBUPBUDAUDAVDwVAwFAxlw+Nn96QNk4NrtvPpavekDd4HuZy7q224/6CrP9HVn+jqT3T1J7r6E139ia7+RFd/oqs/0dWf6Oo2TBZycM12Pl3dBq9f2Ae5nLurxyAYBINgEAyCQTAIBsEgGASDYAgYAoaAIWAIGAKGgCFgCBgChoDhccboap/FxllsGzqfrvZZbBtmH+Ry7q4ew+NuoavH0Dm4ZjufZwyzfmEf5HLurvYcEnNIzCExh8QcEnNIzCExh8QcEnNIzCFteLyX0NW+Dwv3YdnQ+XS178OyYfZBLufuar8vYBAMgkEwCAbBIBgEg2AQDIKhYCgYCoaCoWAoGAqGgqFgKBjKhmdnoavdkzZ4zXY+Xe2etMH7IJdzd7UNP9cHuvoDXf2Brv5AV3+gqz/Q1R/o6g909Qe6+gNd/YGubsNkIQfXbOfT1W3w+oV9kMu5u3oMgkEwCAbBIBgEg2AQDIJBMAiGgCFgCBgChoAhYAgYAoaAIWAIGO59fRYbZ7FxFtuGzqerfRbbhtkHuZy7q8dwP2PoLOTgmu18njHM+oV9kMu5u9pzSMwhMYfEHBJzSMwhMYfEHBJzSMwhMYe04X6N78PCfVi4D8uGzqerfR+WDbMPcjl3V/t9AYNgEAyCQTAIBsEgGASDYBAMBUPBUDAUDAVDwVAwFAwFQ8FQNjx+dk/aMDm4ZjufrnZP2uB9kMu5u9qGn+sdXf2Orn5HV7+jq9/R1e/o6nd09Tu6+h1d/Y6ufkdXt2GykINrtvPp6jZ4/cI+yOXcXT0GwSAYBINgEAyCQTAIBsEgGARDwBAwBAwBQ8AQMAQMAUPAEDAEDPe+PouNs9g4i21D59PVPottw+yDXM7d1WO4nzF0FnJwzXY+zxhm/cI+yOXcXe05JOaQmENiDok5JOaQmENiDok5JOaQmEPacL/G92HhPizch2VD59PVvg/LhtkHuZy7q/2+gEEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoGx4/uydtmBxcs51PV7snbfA+yOXcXW3Dz/WGrn5DV7+hq9/Q1W/o6jd09Ru6+g1d/YaufkNXv6Gr2zBZyME12/l0dRu8fmEf5HLurh6DYBAMgkEwCAbBIBgEg2AQDIIhYAgYAoaAIWAIGAKGgCFgCBgChntfn8XGWWycxbah8+lqn8W2YfZBLufu6jHczxg6Czm4ZjufZwyzfmEf5HLurvYcEnNIzCExh8QcEnNIzCExh8QcEnNIzCFtuF/j+7BwHxbuw7Kh8+lq34dlw+yDXM7d1X5fwCAYBINgEAyCQTAIBsEgGARDwVAwFAwFQ8FQMBQMBUPBUDCUDY+f3ZM2TA6u2c6nq92TNngf5HLurrbh/nuiqy909YWuvtDVF7r6Qldf6OoLXX2hqy909YWubsNkIQfXbOfT1W3w+oV9kMu5u3oMgkEwCAbBIBgEg2AQDIJBMAiGgCFgCBgChoAhYAgYAoaAIWAIGB77oqt9FhtnsW3ofLraZ7FtmH2Qy7m7egyPB109hs7BNdu5H3T1GGYf5HLurvYcEnNIzCExh8QcEnNIzCExh8QcEnNIzCFteLwGXe37sHAflg2dT1f7PiwbZh/kcu6u9vsCBsEgGASDYBAMgkEwCAbBIBgKhoKhYCgYCoaCoWAoGAqGgqFseP6MrnZP2uA12/l0tXvSBu+DXM7d1Tbcf/604WQhB9ds59PVr98n1i/sg1zO82+Lf9zVbZgs5OCa7Xy6ug1ev7APcjnPvy3+cVePQTAIBsEgGASDYBAMgkEwCIaAIWAIGAKGgCFgCBgChoAhYAgYHmc8Z7FxFhtnsW3ofLraZ7FtmH2Qy3n+bbENj7vVhs5CDq7ZzucZw6xf2Ae5nOffFmcOiTkk5pCYQ2IOiTkk5pCYQ2IOiTkk5pA2PN5Lcx8W7sPCfVg2dD5d7fuwbJh9kMt5/m1x3hcwCAbBIBgEg2AQDIJBMAgGwVAwFAwFQ8FQMBQMBUPBUDAUDGXDs7OmJ22YHFyznU9Xuydt8D7I5Tz/tjiG+++Jrr7Q1Re6+kJXX+jqC119oasvdPWFrr7Q1Re6ug2ThRxcs51PV7fB6xf2QS7n+VyNrh6DYBAMgkEwCAbBIBgEg2AQDAFDwBAwBAwBQ8AQMAQMAUPAEDA89kVX+yw2zmLb0Pl0tc9i2zD7IJfzfK5GV4+hs5CDa7ZzP+jqMcw+yOU8n6vR1Z5DYg6JOSTmkJhDYg6JOSTmkJhDYg5pw+M16Grfh4X7sGzofLra92HZMPsgl/N8rkZX+30Bg2AQDIJBMAgGwSAYBINgKBgKhoKhYCgYCoaCoWAoGAqGsuH5M7raPWmD12zn09XuSRu8D3I5z+dqdPXnv204WcjBNdv5dPXr94n1C/sgl/N8rv4Xn6v/7bOwYXJwzXY+Xd0Gr1/YB7mc53P1v+7qMQgGwSAYBINgEAyCQTAIBsEQMAQMAUPAEDAEDAFDwBAwBAwBw+OM5yw2zmLjLLYNnU9X+yy2DbMPcjnP5+o2PO5WGzoLObhmO59nDLN+YR/kcp7P1TOHxBwSc0jMITGHxBwSc0jMITGHxBwSc0gbHu+luQ8L92HhPiwbOp+u9n1YNsw+yOU8n6vnfQGDYBAMgkEwCAbBIBgEg2AQDAVDwVAwFAwFQ8FQMBQMBUPBUDY8O2t60obJwTXb+XS1e9IG74NczvO5egz33xNdfaGrL3T1ha6+0NUXuvpCV1/o6gtdfaGrL3R1GyYLObhmO5+uboPXL+yDXM7zuRpdPQbBIBgEg2AQDIJBMAgGwSAYAoaAIWAIGAKGgCFgCBgChoAhYHjsi672WWycxbah8+lqn8W2YfZBLuf5XI2uHkNnIQfXbOd+0NVjmH2Qy3k+V6OrPYfEHBJzSMwhMYfEHBJzSMwhMYfEHNKGx2vQ1b4PC/dh2dD5dLXvw7Jh9kEu5/lcja72+wIGwSAYBINgEAyCQTAIBsFQMBQMBUPBUDAUDAVDwVAwFAxlw/NndLV70gav2c6nq92TNngf5HKez9Xo6s9/2nCykINrtvPp6tfvE+sX9kEu5/lc/Q8+V//TZ2HD5OCa7Xy6ug1ev7APcjnP5+p/3NVjEAyCQTAIBsEgGASDYBAMgiFgCBgChoAhYAgYAoaAIWAIGAKGxxnPWWycxcZZbBs6n672WWwbZh/kcp7P1W143K02dBZycM12Ps8YZv3CPsjlPJ+rZw6JOSTmkJhDYg6JOSTmkJhDYg6JOSTmkDY83ktzHxbuw8J9WDZ0Pl3t+7BsmH2Qy3k+V8/7AgbBIBgEg2AQDIJBMAgGwSAYCoaCoWAoGAqGgqFgKBgKhoKhbHh21vSkDZODa7bz6Wr3pA3eB7mc53P1GH6u9/9xVz+zkINrtvPp6tfvE+sX9kEu5+7qV371cBsmCzm4Zjufrm6D1y/sg1zO3dVjEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwHDv67PYOIuNs9g2dD5d7bPYNsw+yOXcXT2G+xlDZyEH12zn84xh1i/sg1zO3dWeQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOiTmkDfdrfB8W7sPCfVg2dD5d7fuwbJh9kMu5u9rvCxgEg2AQDIJBMAgGwSAYBINgKBgKhoKhYCgYCoaCoWAoGAqGsuHxs3vShsnBNdv5dLV70gbvg1zO3dU23H/P3+7qZxZycM12Pl39+n1i/cI+yOU834H8xncgv93VbZgcXLOdT1e3wesX9kEu5/kO5Le7egyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwPDYd85i4yw2zmLb0Pl0tc9i2zD7IJfzfAfy2109hs5CDq7Zzv20YdYv7INczvMdyG93teeQmENiDok5JOaQmENiDok5JOaQmEPa8HjN3IeF+7BwH5YNnU9X+z4sG2Yf5HKe70B+u6v9voBBMAgGwSAYBINgEAyCQTAUDAVDwVAwFAwFQ8FQMBQMBUPZ8Px5etKGycE12/l0tXvSBu+DXM7zHchvd/X3f7fhZCEH12zn09Wv3yfWL+yDXM7d1a/88/z/bsNkIQfXbOfT1W3w+oV9kMu5u3oMgkEwCAbBIBgEg2AQDIJBMAiGgCFgCBgChoAhYAgYAoaAIWAIGO59fRYbZ7FxFtuGzqerfRbbhtkHuZy7q8dwP2PoLOTgmu18njHM+oV9kMu5u9pzSMwhMYfEHBJzSMwhMYfEHBJzSMwhMYe04X6N78PCfVi4D8uGzqerfR+WDbMPcjl3V/t9AYNgEAyCQTAIBsEgGASDYBAMBUPBUDAUDAVDwVAwFAwFQ8FQNjx+dk/aMDm4ZjufrnZP2uB9kMu5u9qG+8/f7upnFnJwzXY+Xf36fWL9wj7I5TzfV/+N76v/dle3YXJwzXY+Xd0Gr1/YB7mc5/vqv93VYxAMgkEwCAbBIBgEg2AQDIIhYAgYAoaAIWAIGAKGgCFgCBgChscZz1lsnMXGWWwbOp+u9llsG2Yf5HKe76vb8Lhbbegs5OCa7XyeMcz6hX2Qy3m+r545JOaQmENiDok5JOaQmENiDok5JOaQmEPa8HgvzX1YuA8L92HZ0Pl0te/DsmH2QS7n+b563hcwCAbBIBgEg2AQDIJBMAgGwVAwFAwFQ8FQMBQMBUPBUDAUDGXDs7OmJ22YHFyznU9Xuydt8D7I5TzfV4/h53r/5a5+ZiEH12zn09Wv3yfWL+yDXM7zffUvfF/9y13dhsnBNdv5dHUbvH5hH+Rynu+r2yAYBINgEAyCQTAIBsEgGASDYAgYAoaAIWAIGAKGgCFgCBgChoDh8b3xnMXGWWycxbah8+lqn8W2YfZBLuf5vroN9zOGzkIOrtnO5xnDrF/YB7mc5/vqmUNiDok5JOaQmENiDok5JOaQmENiDok5pA33a3wfFu7Dwn1YNnQ+Xe37sGyYfZDLeb6v/uWu9vsCBsEgGASDYBAMgkEwCAbBUDAUDAVDwVAwFAwFQ8FQMBQMZcPze+PpSRsmB9ds59PV7kkbvA9yOc/31b/c1X+2u/qZhRxcs51PV79+n1i/sA9yOXdXv/Krh9swWcjBNdv5dHUbvH5hH+Ry7q4eg2AQDIJBMAgGwSAYBINgEAyCIWAIGAKGgCFgCBgChoAhYAgYAoZ7X5/FxllsnMW2ofPpap/FtmH2QS7n7uoxXJcNnYUcXLOdzzOGWb+wD3I5d1d7Dok5JOaQmENiDok5JOaQmENiDok5JOaQNtyv8X1YuA8L92HZ0Pl0te/DsmH2QS7n7mq/L2AQDIJBMAgGwSAYBINgEAyCoWAoGAqGgqFgKBgKhoKhYCgYyobHz+5JGyYH12zn09XuSRu8D3I5d1fb8Pjjrn5mIQfXbOfT1a/fJ9Yv7INczvMdyF/4DuQvd3UbJgfXbOfT1W3w+oV9kMt5vgP5y109BsEgGASDYBAMgkEwCAbBIBgChoAhYAgYAoaAIWAIGAKGgCFgeJ6xu9pnsXEW24bOp6t9FtuG2Qe5nOc7kDY875a7egydg2u283nGMOsX9kEu5/kOZOaQmENiDok5JOaQmENiDok5JOaQmENiDmnD873krvZ9WLgPy4bOp6t9H5YNsw9yOc93IPO+gEEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoG16d5a52T9rgNdv5dLV70gbvg1zO8x3IGH6ut/9yVz+zkINrtvPp6tfvE+sX9kEu5+7qV371cBsmCzm4Zjufrm6D1y/sg1zO3dVjEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwHDv67PYOIuNs9g2dD5d7bPYNsw+yOXcXT2G+xlDZyEH12zn84xh1i/sg1zO3dWeQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOiTmkDfdrfB8W7sPCfVg2dD5d7fuwbJh9kMu5u9rvCxgEg2AQDIJBMAgGwSAYBINgKBgKhoKhYCgYCoaCoWAoGAqGsuHxs3vShsnBNdv5dLV70gbvg1zO3dU2/Fzf/+mufmYhB9ds59PVr98n1i/sg1zO3dWv/OrhNkwWcnDNdj5d3QavX9gHuZy7q8cgGASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4fHfY8xZbJzFxllsGzqfrvZZbBtmH+Ry7q4ew/2MobOQg2u283nGMOsX9kEu5+5qzyExh8QcEnNIzCExh8QcEnNIzCExh8Qc0ob7Nb4PC/dh4T4sGzqfrvZ9WDbMPsjl3F3t9wUMgkEwCAbBIBgEg2AQDIJBMBQMBUPBUDAUDAVDwVAwFAwFQ9nw/O8xpidtmBxcs51PV7snbfA+yOXcXW3Dz/XxH+7qZxZycM12Pl39+n1i/cI+yOXcXf3Krx5uw2QhB9ds5+v6f+EZkGB4nG3aP66jx9HFYWazg8oG0CK4AAXViVahswZvYAAHTBxXai2CmZPBuJkKEKDAgAD98UrMl3yrzm8GJmB8575f357nVjcPCNqXSz0uP/5zXy6Vl8mxnIVczp/+xfx4rus1yEIOrtnOx0swCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4bnvGDoLObhmOx+veZ5Yv7APcjm/z2Lb8HyNobOQg2u28/kaw6xf2Ae5nF+GyY/X73sOiTkk5pCYQ2IOiTkk5pCYQ2IOiTmkDc/f8X1YuA8L92HZ0Pl1H5YNs35hH+Ryft+HZYNgEAyCQTAIBsEgGASDYBAMgqFgKBgKhoKhYCgYCoaCoWAoGMqG4+c2TBZycM12fr78PLF+YR/kcj7+r/Nj3p9vw2N6aHJwjd/Pb0M/T6xf2Ae5nN+GB/azYbKQg2vcI++zsMHrF/ZBLufu6jEIBsEgGASDYBAMgkEwCAbBIBgChoAhYAgYAoaAIWAIGAKGgCFg+HbG/Fv5b377n7OrfRbuD++DXM7d1WOYvZCFHI+v/73O/WrDrF/YB7mcu6s9h7Shs5CDa/A3n13tZ2nD7INczt3Vvg/Lhs5CjsfX8+18drXvw/L/f/ZBLufuar8vYBAMgoHnKhgEg2AQDIJBMAiGgqFgKBhwnyafXe2zgKFgKBgKhrLBdxRZyPH45h7b4OeJ9Qv7IJdzd7UNj8tP/2jDmYUcXLOdz65+P0+sX9gHuZy7q9/58fq32zBZyME12/ns6jZ4/cI+yOXcXT0GwSAYBINgEAyCQTAIBsEgGARDwBAwBAwBQ8AQMAQMAUPAEDAEDM99fRYbZ7FxFtuGzmfP+Sy2DbMPcjn3fRzD8zWGzkIOrtnO52sMs35hH+Ry7q72HBJzSMwhMYfEHBJzSMwhMYfEHBJzSMwhbXj+ju/Dwn1YuA/Lhs5nV/s+LBtmH+Ry7q72+wIGwSAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWw4fnZP2jA5uGY7n13tnrTB+yCXc3e1DY/L9393V7+ykINrtvPZ1e/nifUL+yCXc3f1O797uA2ThRxcs53Prm6D1y/sg1zO3dVjEAyCQTAIBsEgGASDYBAMgkEwBAwBQ8AQMAQMAUPAEDAEDAFDwPDc12excRYbZ7Ft6Hx2tc9i2zD7IJdzd/UYnq8xdBZycM12Pl9jmPUL+yCXc3e155CYQ2IOiTkk5pCYQ2IOiTkk5pCYQ2IOacPzd3wfFu7Dwn1YNnQ+u9r3Ydkw+yCXc3e13xcwCAbBIBgEg2AQDIJBMAgGwVAwFAwFQ8FQMBQMBUPBUDAUDGXD8bN70obJwTXb+exq96QN3ge5nLurbXhcPv/NXf3KQg6u2c5nV7+fJ9Yv7INczt3V7/zu4TZMFnJwzXY+u7oNXr+wD3I5d1ePQTAIBsEgGASDYBAMgkEwCAbBEDAEDAFDwBAwBAwBQ8AQMAQMAcNzX5/FxllsnMW2ofPZ1T6LbcPsg1zO3dVjeL7G0FnIwTXb+XyNYdYv7INczt3VnkNiDok5JOaQmENiDok5JOaQmENiDok5pA3P3/F9WLgPC/dh2dD57Grfh2XD7INczt3Vfl/AIBgEg2AQDIJBMAgGwSAYBEPBUDAUDAVDwVAwFAwFQ8FQMJQNx8/uSRsmB9ds57Or3ZM2eB/kcu6utuGYtbv6lYUcXLOdz65+P0+sX9gHuZzn+2rh+2q5q9swObhmO59d3QavX9gHuZzn+2q5q8cgGASDYBAMgkEwCAbBIBgEQ8AQMAQMAUPAEDAEDAFDwBAwBAyvv81d7bPYOIttQ+ezq30W24bZB7mc/b0dvq9uQ2chB9ds5361YdYv7INczvN9tdzVnkNiDok5JOaQmENiDok5JOaQmENiDmnD6w71fVi4Dwv3YdnQ+exq34dlw+yDXM7zfbXc1X5fwCAYBINgEAyCQTAIBsEgGAqGgqFgKBgKhoKhYCgYCoaCoWx4m/Z0tXvSBq/ZzmdXuydt8D7I5TzfV8td/emHNpxZyME12/ns6vfzxPqFfZDLubv6nR/vf/uHPgsbJgfXbOezq9vg9Qv7IJdzd/UYBINgEAyCQTAIBsEgGASDYBAMAUPAEDAEDAFDwBAwBAwBQ8AQMBxnPGexcRYbZ7Ft6Hx2tc9i2zD7IJfz/PcnbTjuVhs6Czm4ZjufrzHM+oV9kMu5u9pzSMwhMYfEHBJzSMwhMYfEHBJzSMwhMYe04XgvzX1YuA8L92HZ0Pnsat+HZcPsg1zO3dV+X8AgGASDYBAMgkEwCAbBIBgEQ8FQMBQMBUPBUDAUDAVDwVAwlA2vzpqetGFycM12PrvaPWmD90Eu5+5qG55/59Vd/cpCDq7ZzmdXv58n1i/sg1zO87n6is/VV3d1GyYH12zns6vb4PUL+yCX83yuboNgEAyCQTAIBsEgGASDYBAMgiFgCBgChoAhYAgYAoaAIWAIGAKGY985i42z2DiLbUPns6t9FtuG2Qe5nOdzdRuOVxs6Czm4Zjv3qw2zfmEf5HKez9Uzh8QcEnNIzCExh8QcEnNIzCExh8QcEnNIG47fmfuwcB8W7sOyofPZ1b4Py4bZB7mc53P11V3t9wUMgkEwCAbBIBgEg2AQDIKhYCgYCoaCoWAoGAqGgqFgKBjKhtfP05M2TA6u2c5nV7snbfA+yOU8n6uv7upPH9twZiEH12zns6vfzxPrF/ZBLuf5XP0Rn6s/9lnYMDm4ZjufXd0Gr1/YB7mc53P1R3f1GASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4TjjOYuNs9g4i21D57OrfRbbhtkHuZznc3UbjrvVhs5CDq7ZzudrDLN+YR/kcp7P1TOHxBwSc0jMITGHxBwSc0jMITGHxBwSc0gbjvfS3IeF+7BwH5YNnc+u9n1YNsw+yOU8n6vnfQGDYBAMgkEwCAbBIBgEg2AQDAVDwVAwFAwFQ8FQMBQMBUPBUDa8Omt60obJwTXb+exq96QN3ge5nOdz9Rief+cHd/UrCzm4ZjufXf1+nli/sA9yOc/n6g/4XP3BXd2GycE12/ns6jZ4/cI+yOU8n6vbIBgEg2AQDIJBMAgGwSAYBINgCBgChoAhYAgYAoaAIWAIGAKGgOHYd85i4yw2zmLb0Pnsap/FtmH2QS7n+VzdhuPVhs5CDq7Zzv1qw6xf2Ae5nOdz9cwhMYfEHBJzSMwhMYfEHBJzSMwhMYfEHNKG43fmPizch4X7sGzofHa178OyYfZBLuf5XP3BXe33BQyCQTAIBsEgGASDYBAMgqFgKBgKhoKhYCgYCoaCoWAoGMqG18/TkzZMDq7ZzmdXuydt8D7I5Tyfqz+gq//6t7v6yEIOrtnO3dWv54n1C/sgl/N09Ss/3mdwGiYLObhmO3dXnwavX9gHuZynq9sgGASDYBAMgkEwCAbBIBgEg2AIGAKGgCFgCBgChoAhYAgYAoaA4dh3zmLjLDbOYtvQubt6zmLbMPsgl/N0dRuOVxs6Czm4Zjv3qw2zfmEf5HKerp45JOaQmENiDok5JOaQmENiDok5JOaQmEPacPzO3IeF+7BwH5YNnbur5z4sG2Yf5HKerp73BQyCQTAIBsEgGASDYBAMgkEwFAwFQ8FQMBQMBUPBUDAUDAVD2fD6eXrShsnBNdu5u3p60gbvg1zO09VjeP6dd3T1HV19R1ff0dV3dPUdXX1HV9/R1Xd09R1dfUdX39HVd3T1HV19R1ff0dV3dPUdXX1HV9/R1Xd09R1d3QbBIBgEg2AQDIJBMAgGwSAYAoaAIWAIGAKGgCFgCBgChoAhYDj2nbPYOIuNs9g2dO6unrPYNsw+yOU8XX1HV7ehs5CDa7Zzv9ow6xf2QS7n6eo7unrmkJhDYg6JOSTmkJhDYg6JOSTmkJhD2nD8ztyHhfuwcB+WDZ27q+c+LBtmH+Rynq6+o6vnfQGDYBAMgkEwCAbBIBgEg2AoGAqGgqFgKBgKhoKhYCgYCoay4fXz9KQNk4NrtnN39fSkDd4HuZynq+/o6hu6+oauvqGrb+jqG7r6hq6+oatv6OobuvqGrr6hq2/o6hu6+oauvqGrb+jqG7r6hq6+oatv6OobuvqGrm6DYBAMgkEwCAbBIBgEg2AQDAFDwBAwBAwBQ8AQMAQMAUPAEDAc+85ZbJzFxllsGzp3V89ZbBtmH+Rynq6+oavb0FnIwTXbuV9tmPUL+yCX83T1DV09c0jMITGHxBwSc0jMITGHxBwSc0jMIW04fmfuw8J9WLgPy4bO3dVzH5YNsw9yOU9X39DV876AQTAIBsEgGASDYBAMgkEwFAwFQ8FQMBQMBUPBUDAUDAVD2fD6eXrShsnBNdu5u3p60gbvg1zO09U3dPUVXX1FV1/R1Vd09RVdfUVXX9HVV3T1FV19RVdf0dVXdPUVXX1FV1/R1Vd09RVdfUVXX9HVV3T1FV19RVe3QTAIBsEgGASDYBAMgkEwCIaAIWAIGAKGgCFgCBgChoAhYAgYXv97DHT1nMXGWWwbOndXz1lsG2Yf5HKerr6iq9vQWcjBNdu5X22Y9Qv7IJfzdPUVXT1zSMwhMYfEHBJzSMwhMYfEHBJzSMwhbTh+Z+7Dwn1YuA/Lhs7d1XMflg2zD3I5T1df0dXzvoBBMAgGwSAYBINgEAyCQTAUDAVDwVAwFAwFQ8FQMBQMBUPZ8P7fY6Crpydt8Jrt3F09PWmD90Eu5+nqK7r6/sVdfWQhB9ds5+7q1/PE+oV9kMvZ34F8cVefhslCDq7Zzt3Vp8HrF/ZBLmd/B/LFXd0GwSAYBINgEAyCQTAIBsEgGAKGgCFgCBgChoAhYAgYAoaAIWB4fRfRZ7FxFhtnsW3o3F09Z7FtmH2Qy9nfgXxxV7ehs5CDa7Zzv9ow6xf2QS5nfwfSc0jMITGHxBwSc0jMITGHxBwSc0jMITGHtOH1XUTfh4X7sHAflg2du6vnPiwbZh/kcvZ3IP2+gEEwCAbBIBgEg2AQDIJBMAiGgqFgKBgKhoKhYCgYCoaCoWAoG97fRXRP2jA5uGY7d1dPT9rgfZDL2d+BtOExnTdZyME1+O/pu6vPu+n1C/sgl/N0de9RNkwWcnDNdu7f6fdH2eB9kMt5uroNgkEwCAbBIBgEg2AQDIJBMAiGgCFgCBgChoAhYAgYAoaAIWAIGLr7ClnIwTXbuX9uw6xf2Ae5nKerL5ev7tdX56z/87fy3/z21V3dhtkHuZynq9vQv1/IQg6u2V//e/M8sX5hH+Rynq5uQ7sLWcjBNfvrv3OeJ9Yv7INcztPVbRAMgkEwCAbOVzAIBsEgGASDYCgYCoaCoWDAufp5Yv3CPsjlPF19GuZ+FLKQg2v2N/fJBq9f2Ae5nKerx78v3/3Xd23y8Tfj+QXP//zLzyc/n3/G8894/hOe/4Tnn/D8E57/iOc/4vn3eP49nn+H59/h+QXPL/x3/8S/+yfW4/kFzz/9gfV/YD2eX/D80+9Y/7uff/8b/L9hn/9gn//4+edfMc9fsf8v2P8X7P8z9v95/w/hGE0H + + + 0 + + + 9380.8315196 + + + + + + + DAAAAACAAAAAXAAARBEAAE4RAABPEQAARxEAAI4RAABmEQAAkREAAGcRAABJEQAAThEAADURAADSDAAAeJyFnEMUXmcXRvN9UW0rKVPbTO02qd3Utm3bblOktt3Utp3atv/Bf/bg7rXueu7kTO7eoz171np79Pj/16k7Wt1R6+5Td9+6R9Q9XFy37ujywO1X90h54HrWHUMeuP3rHiUPXK+6Y8oDd0Ddo+WB6113LHngDqx7jDxwfeqOLQ/cQXWPlQeub91x5IE7uO5x8sCNVHdceeAOqXu8PHAj1x1PHrhD654gD9wodceXB+6wuifKQ2f0MmHdCerSGb2cXPckcfQykTxw9HKKPHD0MrE8cPRyqjxw9DKJPHD0cpo8cPQyqTxw9HK6PHD0Mpk8cPRyhjxw9DK5PHD0cqY8cPQyhTxw9HKWPHD00k8eOHo5Wx44uusvDxzdnSMPndHLVHWnrEtn9HJe3XPF0cvU8sDRy/nywNHLNPLA0csF8sDRy7TywNHLhfLA0ct08sDRy0XywNHLAHng6GWoPHD0Mr08cPRysTxw9DKDPHD0cok8cPQyozxw9HKpPHD9684kDxzdXSYPndHLLHVnrktn9HJ53WHi6GVWeeDo5Qp54OhlNnng6OVKeeDoZXZ54OjlKnng6GUOeeDo5Wp54OhlTnnghta9Rh44eplLHjh6uVYeOHqZWx44erlOHjh6mUceOHq5Xh44uptXHji6u0EeOqOX+evOV5fO6OWmujeKo5cF5IGjl5vlgaOXBeWBo5db5IGjl4XkgaOXW+WBo5eF5YGjl9vkgaOXReSBo5fb5YGjl0XlgaOXO+SBo5fF5IGjlzvlgaOXgfLA0ctd8sDR3eLywNHd3fLQGb0sWXeJunRGL/fWvUccvSwlDxy93CcPHL0sLQ8cvdwvDxy9LCMPHL08IA8cvSwrDxy9DJcHjl6WkweOXh6UB45elpcHjl4ekgeOXlaQB45eHpYHbmDdFeWBo5dH5IGju5XkgaO7R+WhM3pZpe7KdemMXh6v+5g4ellVHjh6eUIeOHoZJA8cvTwpDxy9DJYHjl6ekgeOXlaTB2543aflgaOX1eWBo5dn5IGjlzXkgaOXZ+WBo5c15YGjl+fkgaOXteSBo5fn5YGju7XlgaO7F+ShM3pZt+46demMXl6q+6I4ellPHjh6eVkeOHpZXx44enlFHjh62UAeOHp5VR44etlQHjh6eU0eOHrZSB44enldHjh62VgeOHp5Qx44ehkiDxy9vCkPHL1sIg8cvbwlDxzdbSoPHN29LQ+d0cvmdTerS2f08m7dd8TRyxbywNHLe/LA0cuW8sDRy/vywNHLVvLA0csIeeDoZWt54OjlA3ng6GUbeeDo5UN54OhlW3ng6OUjeeCG1N1OHjh6+VgeOHrZXh44evlEHji620EeOLr7VB46o5ed6u5Yl87o5fO6n4mjl53lgaOXL+SBo5dd5IGjly/lgaOXXeWBG1H3K3ng6GU3eeDo5Wt54Ohld3ng6OUbeeDoZQ954OjlW3ng6GVPeeDo5Tt54OhlL3ng6OV7eeDobm954OjuB3nSvvFj3Z/q/lv3H3Ft+wbcz3X/kyftG3C/1GVwwZP2DbhfwRlsOk2ubd+A+61ut9P0pH0D7ve6PTtNT9o34P6o26vT9MC17Rtwf9bt3Wl60r4B91fdPp2mJ+0bcH/X7dtpetK+QWf0MnJxI3WaXNu+AUcvo3SanrRvwNHLqJ2mJ+0bPdTLaPKkfaOjXkaXJ+0bXfUyhjxp3+ipXsaUJ+0bvdTLWPKkfaO3ehlbnrRvwNHdOPKkfYPO6GW8uuN2mlzbvgFHL+PLk/YNOHqZQJ60b8DRy4TypH0Djl4mkiftG3D0MrE8ad+Ao5dJ5En7Bhy9TCpP2jfg6GUyedK+AUd3k8uT9g06o5d+dafoNLm2fQOOXvrLk/YNOHqZUp60b8DRy1TypH0Djl6mliftG3D0Mo08cPTifQOOXqaVB65t34Cjl+nkSfsGHL0MkCftG3B0N708ad+gM3qZse4MnSbXtm/A0ctM8qR9A45eZpYn7Rtw9DKLPGnfgKOXWeVJ+wYcvcwmT9o34OhldnnSvgFHL3PIk/YNOHqZU560b8DR3VzypH2Dzuhlnrpzd5pc274BRy/zypP2DTh6mU+etG/A0cv88qR9A45eFpAn7Rtw9LKgPGnfgKOXheRJ+wYcvSwsT9o34OhlEXnSvgFHd4vKk/YNOqOXgXUX6zS5tn0Djl4WlyftG3D0soQ8ad+Ao5cl5Un7Bhy9LCUPHL1434Cjl6XlgWvbN+DoZRl50r4BRy/LypP2DTh6WU6etG/A0d3y8qR9g87oZcW6K3SaXNu+AUcvK8mT9g04ellZnrRvwNHLKvKkfQOOXlaVJ+0bcPQySJ60b8DRy2B50r4BRy+ryZP2DTh6WV2etG/A0d0a8qR9g87oZa26a3aaXNu+AUcva8uT9g04ellHnrRvwNHLuvKkfQOOXtaTJ+0bcPSyvjxp34Cjlw3kSfsGHL1sKE/aN+DoZSN50r4BR3cby5P2DTqjl03qDuk0ubZ9A45eNpUn7Rtw9LKZPGnfgKOXzeWBoxfvG3D0soU8cG37Bhy9bClP2jfg6GUredK+AUcvW8uT9g04etlGnrRvwNHdtvKkfWO7+m/7unvV3bPT5Nr2Dbgd6u4tT9o34Hasu488ad+A26nuvvKkfQNu57r7yZP2Dbhd6u4vT9o34Hate4A8ad+A263ugfKkfQNu97oHyZP2Dbg96h4sT9o36IxeDq17SKfJte0bcPRymDxp34Cjl8PlSfsGHL0cIU/aN+Do5Uh50r4BRy9HyZP2DTh6OVqetG/A0csx8qR9A45ejpUn7RtwdHecPGnfoDN6OaHu8eLa9g04ejlRnrRvwNHLSfKkfQOOXk6WJ+0bcPRyijxp34Cjl1PlSfsGHL2cJk/aN+Do5XR50r4BRy9nyJP2DTi6O1OetG/QGb2cXfcscW37Bhy9nCNP2jfg6OVcedK+AUcv58mT9g04ejlfnrRvwNHLBfKkfQOOXi6UJ+0bcPRykTxp34Cjl6HypH0Dju4uliftG3RGL5fWvURc274BRy+XyZP2DTh6GSZP2jfg6OVyedK+AUcvV8iT9g04erlSnrRvwNHLVfKkfQOOXq6WJ+0bcPRyjTxp34Cju2vlSfsGndHL9XWvE9e2b8DRyw3ypH0Djl5ulCftG3D0cpM8ad+Ao5eb5Un7Bhy93CJP2jfg6OVWedK+AUcvt8mT9g04erldnrRvwNHdHfKkfYPO6OWuuneKa9s34OjlbnnSvgFHL/fIk/YNOHq5V560b8DRy33ypH0Djl7ulyftG3D08oA8ad+Ao5fh8qR9A45eHpQn7RtwdPeQPGnfoDN6eaTuw+La9g04enlUnrRvwNHLY/KkfQOOXh6XJ+0bcPTyhDxp34CjlyflSfsGHL08JU/aN+Do5Wl50r4BRy/PyJP2DTi6e1aetG/QGb08X/c5cW37Bhy9vCBP2jfg6OVFedK+AUcvL8mT9g04enlZnrRvwNHLK/KkfQOOXl6VJ+0bcPTymjxp34Cjl9flSfsGHN29IU/aN+iMXt6q+6a4tn0Djl7eliftG3D08o48ad+Ao5d35Un7Bhy9vCdP2jfg6OV9edK+AUcvI+RJ+wYcvXwgT9o34OjlQ3nSvgFHdx/Jk/aNj+t+Uvf7ut+Ja9s34D6t+4M8ad+A+6zuj/KkfQPu87o/yZP2Dbgv6v4sT9o34L6s+4s8ad+A+6rur/KkfQPu67q/yZP2Dbhv6v4uT9o34L6t+4c8ad+gM3r5q+6f4tr2DTh6+VuetG/A0cs/8qR9A45e/pUn7Rtw9PKfPGnfgKMXHpz7T1zbvgFHLx0erOs2ubZ9A45eut2mJ+0bcPTSs9v0pH0Dju56dZuetG/QGb30Ka53t8m17Rtw9NK32/SkfQOOXkbqNj1p34Cjl5G7TU/aN+DoZZRu05P2DTh6GbXb9KR9o4d6GU2etG901Mvo8qR9o6texpAn7RtwdDemPGnf6K1exq47VrfJte0bfdTLOPKkfaOvehlXnrRvwNHLePKkfQOOXsaXJ+0bcPQygTxp34CjlwnlSfsGHL1MJE/aN+DoZWJ50r4BR3eTyJP2DTqjl8nqTtptcm37Bhy9TC5P2jfg6GUKedK+AUcv/eRJ+wYcvfSXJ+0bcPQypTxp34Cjl6nkSfsGHL1MLU/aN+DoZRp50r4BR3fTypP2DTqjlwF1p+s2ubZ9A45eppcn7Rtw9DKDPGnfgKOXGeVJ+wYcvcwkT9o34OhlZnnSvgFHL7PIk/YNOHqZVZ60b8DRy2zypH0Dju5mlyftG3RGL3PWnaPb5Nr2DTh6mUuetG/A0cvc8qR9A45e5pEn7Rtw9DKvPGnfgKOX+eRJ+wYcvcwvT9o34OhlAXnSvgFHLwvKk/YNOLpbSJ60b9AZvSxSd+Fuk2vbN+DoZVF50r4BRy+LyZP2DTh6GShP2jfg6GVxedK+AUcvS8iT9g04ellSnrRvwNHLUvKkfQOOXpaWJ+0bcHS3jDxp36Azelmu7rLdJte2b8DRy/LypH0Djl5WkCftG3D0sqI8ad+Ao5eV5En7Bhy9rCxP2jfg6GUVedK+AUcvq8qT9g04ehkkT9o34OhusDxp36Azelm97mrdJte2b8DRyxrypH0Djl7WlCftG3D0spY8ad+Ao5e15Un7Bhy9rCNP2jfg6GVdedK+AUcv68mT9g04ellfnrRvwNHdBvKkfWPD+m+jutvU3brb5Nr2DbiN624rT9o34IbU3U6etG/AbVJ3e3nSvgG3ad0d5En7BtxmdXeUJ+0bcJvX3UmetG/AbVF3Z3nSvgG3Zd1d5En7BtxWdXeVJ+0bdEYvu9fdrdvk2vYNOHrZQ560b8DRy57ypH0Djl72kiftG3D0src8ad+Ao5d95En7Bhy97CtP2jfg6GU/edK+AUcv+8uT9g04ujtAnrRv0Bm9HFT3wG6Ta9s34OjlYHnSvgFHL4fIk/YNOHo5VJ60b8DRy2HypH0Djl4OlyftG3D0coQ8ad+Ao5cj5Un7Bhy9HCVP2jfg6O5oedK+QWf0cmzdY8S17Rtw9HKcPGnfgKOX4+VJ+wYcvZwgT9o34OjlRHnSvgFHLyfJk/YNOHo5WZ60b8DRyynypH0Djl5OlSftG3B0d5o8ad+gM3o5o+7p4tr2DTh6OVOetG/A0ctZ8qR9A45ezpYn7Rtw9HKOPGnfgKOXc+VJ+wYcvZwnT9o34OjlfHnSvgFHLxfIk/YNOLq7UJ60b9AZvQyte5G4tn0Djl4uliftG3D0cok8ad+Ao5dL5Un7Bhy9XCZP2jfg6GWYPGnfgKOXy+VJ+wYcvVwhT9o34OjlSnnSvgFHd1fJk/YNOqOXa+peLa5t34Cjl2vlSfsGHL1cJ0/aN+Do5Xp50r4BRy83yJP2DTh6uVGetG/A0ctN8qR9A45ebpYn7Rtw9HKLPGnfgKO7W+VJ+wad0cvtdW8T17ZvwNHLHfKkfQOOXu6UJ+0bcPRylzxp34Cjl7vlSfsGHL3cI0/aN+Do5V550r4BRy/3yZP2DTh6uV+etG/A0d0D8qR9g87o5cG6w8W17Rtw9PKQPGnfgKOXh+VJ+wYcvTwiT9o34OjlUXnSvgFHL4/Jk/YNOHp5XJ60b8DRyxPypH0Djl6elCftG3B095Q8ad+gM3p5pu7T4tr2DTh6eVaetG/A0ctz8qR9A45enpcn7Rtw9PKCPGnfgKOXF+VJ+wYcvbwkT9o34OjlZXnSvgFHL6/Ik/YNOLp7VZ60b7xW9/W6H9b9QFzbvgH3Rt2P5En7BtybdT+WJ+0bcG/V/USetG/AvV33U3nSvgH3Tt3P5En7Bty7dT+XJ+0bcO/V/UKetG/AvV/3S3nSvgE3ou5X8qR9g87o5Zu6X4tr2zfg6OVbef4HoXet6nichZlDEF3rFgaTnHOSa9u2bdu2/a5t27Zt27Zt5yY3ubbxqt5bPdhdtevbkzX5u0c92t+2/fr879uu7p5196g7sO5ndb+t+4247evuJQ/coLrfyQO3Q9295YEbXPd7eeB2rLuPPHCf1/1BHrid6u4rD9yQuj/KA7dz3f3kgRta9yd54Hapu788cF/U/VkeuF3rHiAP3Jd1f5Fnt7q71z2o7oF1v6r7dd3f6v4qjl4OlgeOXn6XB45eDpEHjl7+kAeOXg6VB45e/pQHjl4OkweOXv6SB45eDpcHjl7+lgeOXo6QB45e/pEHjl6OlAeOXv6VB45ejpIHjl76dJoeOLo7Wh44uuvbaXrojF6OrXuMOqOXTnH9Ok2OXo6TB45eup2mB45ejpcHjl56naYHjl5OkAeOXvp3mh44ejlRHjh6GdBpeuDo5SR54OhlmE7TA0cvJ8sDRy/DdpoeOHo5RR44ehmu0/TA0cup8sDRy/CdpgeO7k6TB47uRpCHzujljLqn1+2nXkaqO2KnydHLmfJ01MvI8sDRy1nydNXLKPLA0cvZ8vTUy6jywNHLOfL0Vy+jyQNHL+fKM0C9jC4PHL2cJw8cvYwhDxy9nC8PHL2MKQ8cvVwgDxy9jCUPHN1dKA8c3Y0tD53Ry8V1L6pLZ/Qybt1xOk2OXi6RB45expMHjl4ulQeOXsaXB45eLpMHjl4mkAeOXi6XB45eJpQHjl6ukAeOXiaSB45erpQHjl4mlgeOXq6SB45eJpEHjl6ulgeOXiaVB47urpEHju4mk4fO6OW6utfWpTN6maLu5J0mRy/XywNHL1PKA0cvN8gDRy9TyQNHLzfKA0cvU8sDRy83yQNHL9PIA0cvN8sDRy/TygNHL7fIA0cv08kDRy+3ygNHL9PLA0cvt8kDRy8zyANHd7fLA0d3M8pDZ/RyZ9076tIZvcxcd6ZOk6OXu+SBo5dZ5IGjl7vlgaOXWeWBo5d75IGjl9nkgaOXe+WBo5fZ5YGjl/vkgaOXOeSBo5f75YGjlznlgaOXB+SBo5e55IGjlwflgaOXueWBo7uH5IGju3nkoTN6eaTuw3XpjF7mqztvp8nRy6PywNHL/PLA0ctj8sDRywLywNHL4/LA0cuC8sDRyxPywNHLQvLA0cuT8sDRy8LywNHLU/LA0csi8sDRy9PywNHLovLA0csz8sDRy2LywNHds/LA0d3i8tAZvTxf97m6dEYvS9ZdotPk6OUFeeDoZSl54OjlRXng6GVpeeDo5SV54OhlGXng6OVleeDoZVl54OjlFXng6GU5eeDo5VV54OhleXng6OU1eeDoZQV54OjldXng6GVFeeDo7g154OhuJXnerHdv1f207id1V653q9Rdv+56nSb3dt2B8sCtWncDeeDeqfuZPHCr1d1QHrh36w6SB271uhvJA/de3cHywK1Rd2N54N6v+7k8cGvW3UQeuA/qDpEHbq26m8oD92HdofLArV13M3ngPqr7hTxw69TdXB64j+t+KQ/cunW3kIfO6IX/xfx3pjN62arulp0mRy/fyANHL1vLk/YNOHrZRp60b8DRy3/kSfsGHL1sK0/aN+DoZTt50r4BRy/by5P2DTh62UGetG/A0cuO8qR9A47udpIn7Rt0Ri+71N250+Ta9g04etlVnrRvwNHLbvKkfQOOXnaXJ+0bcPSyhzxp34Cjlz3lSfsGHL3sJU/aN+DoZW950r4BRy/7yJP2DTi621eetG/QGb3sX3e/TpNr2zfg6OUAedK+AUcvB8qT9g04ejlInrRvwNHLwfKkfQOOXg6RJ+0bcPRyqDxp34Cjl8PkSfsGHL0cLk/aN+Do7gh50r5BZ/RyVN0jxbXtG3D0crQ8ad+Ao5dj5En7Bhy9HCtP2jfg6OU4edK+AUcvx8uT9g04ejlBnrRvwNHLifKkfQOOXk6SJ+0bcHR3sjxp36Azejm17ini2vYNOHo5TZ60b8DRy+nypH0Djl7OkCftG3D0cqY8ad+Ao5ez5En7Bhy9nC1P2jfg6OUcedK+AUcv58qT9g04ujtPnrRv0Bm9XFD3fHFt+wYcvVwoT9o34OjlInnSvgFHLxfLk/YNOHq5RJ60b8DRy6XypH0Djl4ukyftG3D0crk8ad+Ao5cr5En7BhzdXSlP2jfojF6urnuVuLZ9A45erpEn7Rtw9HKtPGnfgKOX6+RJ+wYcvVwvT9o34OjlBnnSvgFHLzfKk/YNOHq5SZ60b8DRy83ypH0Dju5ukSftG3RGL7fVvVVc274BRy+3y5P2DTh6uUOetG/A0cud8qR9A45e7pIn7Rtw9HK3PGnfgKOXe+RJ+wYcvdwrT9o34OjlPnnSvgFHd/fLk/YNOqOXB+s+IK5t34Cjl4fkSfsGHL08LE/aN+Do5RF50r4BRy+PypP2DTh6eUyetG/A0cvj8qR9A45enpAn7Rtw9PKkPGnfgKO7p+RJ+8bTdZ+p+3rd18S17Rtwz9Z9Q560b8A9V/dNedK+Afd83bfkSfsG3At135Yn7RtwL9Z9R560b8C9VPddedK+Afdy3ffkSfsG3Ct135cn7Rtwr9b9QJ60b9AZvXxU90NxbfsGHL18LE/aN+Do5RN50r4BRy+fypP2DTh6GShP2jfg6OUzedK+AUcvg+RJ+wYcvQyWJ+0bcPTyuTxp34CjuyHypH2Dzujli7pDxbXtG3D08qU8ad+Ao5ev5En7Bhy9fC1P2jfg6OUbedK+AUcv38qT9g04evlOnrRvwNHL9/KkfQOOXn6QJ+0bcHT3ozxp36Azevm57k/i2vYNOHr5RZ60b8DRy6/ypH0Djl5+kyftG3D08rs8ad+Ao5c/5En7Bhy9/ClP2jfg6OUvedK+AUcvf8uT9g04uvtHnrRv0Bm99On+//wrrm3fgKOXvt2mJ+0bcPTSr9v0pH0Djl463aYn7Rtw9NLtNj1p34Cjl1636Un7Bhy99O82PWnfgKOXAd2mJ+0bcPQyTLfpSfsGHN0N22160r5BZ/QyfN3huk2ubd/oo15GkCftG33Vy4jypH2jn3oZSZ60b3TUy8jypH2jq15GkSftGz31Mqo8ad/or15GkyftG3D0Mro8ad+Ao7sx5En7Bp3Ry1h1x+w2ubZ9A45expYn7Rtw9DKOPGnfgKOXceVJ+wYcvYwnT9o34OhlfHnSvgFHLxPIk/YNOHqZUJ60b8DRy0TypH0Dju4mliftG3RGL5PWnaTb5Nr2DTh6mUyetG/A0cvk8qR9A45eppAn7Rtw9DKlPGnfgKOXqeRJ+wYcvUwtT9o34OhlGnnSvgFHL9PKk/YNOLqbTp60b9AZvcxQd/puk2vbN+DoZUZ50r4BRy8zyZP2DTh6mVmetG/A0css8qR9A45eZpUn7Rtw9DKbPGnfgKOX2eVJ+wYcvcwhT9o34OhuTnnSvkFn9DJ33bm6Ta5t34Cjl3nkSfsGHL3MK0/aN+DoZT550r4BRy/zy5P2DTh6WUCetG/A0cuC8qR9A45eFpIn7Rtw9LKwPGnfgKO7ReRJ+8ai9W6xuivWXaHb5Nr2DbjF664kT9o34Jaou7I8ad+AW7LuKvKkfQNuqbqrypP2Dbil664mT9o34Japu7o8ad+AW7buGvKkfQNuubprypP2Dbjl664lT9o36Ixe1qm7drfJte0bcPSyrjxp34Cjl/XkSfsGHL2sL0/aN+DoZQN50r4BRy8bypP2DTh62UietG/A0cvG8qR9A45eNpEn7RtwdLepPGnfoDN62bzuZt0m17ZvwNHLFvKkfQOOXraUJ+0bcPSylTxp34Cjl63lSfsGHL1sI0/aN+Do5T/ypH0Djl62lSftG3D0sp08ad+Ao7vt5Un7Bp3Ry451d+g2ubZ9A45edpIn7Rtw9LKzPGnfgKOXXeRJ+wYcvewqT9o34OhlN3nSvgFHL7vLk/YNOHrZQ560b8DRy57ypH0Dju72kiftG3RGL/vU3bvb5Nr2DTh62VeetG/A0ct+8qR9A45e9pcn7Rtw9HKAPGnfgKOXA+VJ+wYcvRwkT9o34OjlYHnSvgFHL4fIk/YNOLo7VJ60b9AZvRxe9zB11rZvwNHLEfKkfQOOXo6UJ+0bcPRylDxp34Cjl6PlSfsGHL0cI0/aN+Do5Vh50r4BRy/HyZP2DTh6OV6etG/A0d0J8qR9g87o5aS6J4pr2zfg6OVkedK+AUcvp8iT9g04ejlVnrRvwNHLafKkfQOOXk6XJ+0bcPRyhjxp34CjlzPlSfsGHL2cJU/aN+Do7mx50r5BZ/Rybt1zxLXtG3D0cp48ad+Ao5fz5Un7Bhy9XCBP2jfg6OVCedK+AUcvF8mT9g04erlYnrRvwNHLJfKkfQOOXi6VJ+0bcHR3mTxp36Azermi7uXi2vYNOHq5Up60b8DRy1XypH0Djl6uliftG3D0co08ad+Ao5dr5Un7Bhy9XCdP2jfg6OV6edK+AUcvN8iT9g04urtRnrRv0Bm93Fz3JnFt+wYcvdwiT9o34OjlVnnSvgFHL7fJk/YNOHq5XZ60b8DRyx3ypH0Djl7ulCftG3D0cpc8ad+Ao5e75Un7Bhzd3SNP2jfurXtf3SfrPiGubd+Au7/uU/KkfQPugbpPy5P2DbgH6z4jT9o34B6q+6w8ad+Ae7juc/KkfQPukbrPy5P2DbhH674gT9o34B6r+6I8ad+Ae7zuS/KkfYPO6OWVui+La9s34OjlVXnSvgFHL6/Jk/YNOHp5XZ60b8DRyxvypH0Djl7elCftG3D08pY8ad+Ao5e35Un7Bhy9vCNP2jfg6O5dedK+QWf08n7d98S17Rtw9PKBPGnfgKOXD+VJ+wYcvXwkT9o34OjlY3nSvgFHL5/Ik/YNOHr5VJ60b8DRy0B50r4BRy+fyZP2DTi6GyRP2jfojF4+rztYXNu+AUcvQ+RJ+wYcvQyVJ+0bcPTyhTxp34Cjly/lSfsGHL18JU/aN+Do5Wt50r4BRy/fyJP2DTh6+VaetG/A0d138qR9g87o5Ye634tr2zfg6OVHedK+AUcvP8mT9g04evlZnrRvwNHLL/KkfQOOXn6VJ+0bcPTymzxp34Cjl9/lSfsGHL38IU/aN+Do7k950r5BZ/Tyd92/xLXtG3D08o88ad+Ao5d/5Un7Bhy99Ok1PWnfgKOXvr2mJ+0bcPTSr9f0pH0Djl46vaYn7Rtw9NLtNT1p34Cjl16v6Un7Bhzd9e81PWnfoDN6Gaa4Ab0m17ZvwNHLsL2mJ+0bcPQyXK/pSfsGHL0M32t60r7RR72MIE/aN/qqlxHlSftGP/Uykjxp3+iol5HlSftGV72MIk/aN+DoblR50r4xQL2MXne0XpNr2zfg6GUMedK+AUcvY8qT9g04ehlLnrRvwNHL2PKkfQOOXsaRJ+0bcPQyrjxp34Cjl/HkSfsGHL2ML0/aN+DobgJ50r5BZ/QyUd0Je02ubd+Ao5eJ5Un7Bhy9TCJP2jfg6GVSedK+AUcvk8mT9g04eplcnrRvwNHLFPKkfQOOXqaUJ+0bcPQylTxp34Cju6nlSfsGndHLtHWn6TW5tn0Djl6mkyftG3D0Mr08ad+Ao5cZ5En7Bhy9zChP2jfg6GUmedK+AUcvM8uT9g04eplFnrRvwNHLrPKkfQOO7maTJ+0bs9e7OeouXHehXpNr2zfg5qy7iDxp34Cbq+6i8qR9A27uuovJk/YNuHnqLi5P2jfg5q27hDxp34Cbr+6S8qR9A27+ukvJk/YNuAXqLi1P2jfgFqy7jDxp36Azelmu7rK9Jte2b8DRy/LypH0Djl5WkCftG3D0sqI8ad+Ao5eV5En7Bhy9rCxP2jfg6GUVedK+AUcvq8qT9g04ellNnrRvwNHd6vKkfYPO6GXNumv0mlzbvgFHL2vJk/YNOHpZW560b8DRyzry/BeIix43eJyFmVMQZecWBmcyc86Jbdu2bc0kk8xMbNu2bdu2bTs3tm07t+re1Q+7q3Z952VVnfq7n/ppfy/17/O/38t136v7bt2VOv+/K9ddo+7QTpN7pe778sANqLumPHCv1v1AHriBddeSB+61uh/KA7dK3bXlgXu97kfywK1adx154N6o+7E8cIPqrivPm/Xurbqf1v2k7mr1bvW669ddr9Pk3q77mTxwg+tuIA/cO3U/lwduSN0N5YGjly/kgaOXjeSBo5cv5YGjl43lgaOXr+SBo5dN5IGjl6/lgaOXTeWBo5dv5IGjl83kgaOXb+WBo5fN5YGju+/kgaO7LeShM3r5oe73demMXraqu2WnydHLj/LA0cvW8sDRy0/ywNHLNvLA0cvP8sDRy7bywNHLL/LA0ct28sDRy6/ywNHL9vLA0ctv8sDRyw7ywNHL7/LA0cuO8sDRyx/ywNHLTvLA0d2f8sDR3c7y0Bm9/F33r7p0Ri+71t2l0+To5R954OhlN3ng6OVfeeDoZXd54OilT6fpgaOXPeSBo5e+naYHjl72lOcX9TJMp+mBo5e95PlVvfTrND1w9LK3PL+pl/6dpgeOXvaR53f10uk0PXD0sq88f6i7bqfpgaO7/eT5S70MW//31Bm9HFB3/06To5fhOk0PHL0cKM8/6m74TtMDRy8HyfOvuhuh0/TA0cvB8sDRy4jywNHLIfLA0ctI8sDRy6HywNHLyPLA0cth8sDRyyjywNHL4fLA0cuo8sDRyxHywNHdaPLA0d2R8tAZvYxRd3R1Ri9H1z1KHL2MKQ8cvRwjDxy9jCUPHL0cKw8cvYwtDxy9HCcPHL2MIw8cvRwvDxy9jCsPHL2cIA8cvYwnDxy9nCgPHL2MLw8cvZwkDxy9TCAPHL2cLA8c3U0oDxzdnSIPndHLxHUnUmf0clrdU8XRyyTywNHL6fLA0cuk8sDRyxnywNHLZPLA0cuZ8sDRy+TywNHLWfLA0csU8sDRy9nywNHLlPLA0cs58sDRy1TywNHLufLA0cvU8sDRy3nywNHdNPLA0d358tAZvUxXd1p1Ri8X1r1AHL1MLw8cvVwkDxy9zCAPHL1cLA8cvcwoDxy9XCIPHL3MJA8cvVwqDxy9zCwPHL1cJg8cvcwiDxy9XC4PHL3MKg8cvVwhDxy9zCYPHL1cKQ8c3c0uDxzdXSXPHHXnrLtI3YXrXl33mrq3171N3Fx1F5UH7tq6d8gDN3fdxeSBu67unfLAzVN3cXngrq97lzxw89ZdQh64G+reLQ/cfHWXlAfuxrr3yAM3f92l5IG7qe698sAtUHdpeeBurnufPHAL1l1GHrhb6t4vD9xCdZeVB+7Wug/IQ2f0snzd5dQZvTxU90Fx9LKCPHD08rA8cPSyojxw9PKIPHD0spI8cPTyqDxw9LKyPHD08pg8cPQyQB44enlcHjh6GSgPHL08IQ8cvawiDxy9PCkPHL2sKg8cvTwlDxzdDZIHju6elofO6IXvxXx3pjN6ebbuM+LoZbA8cPTynDxw9DJEHjh6eV4eOHoZKg8cvbwgT9o34OjlRXnSvgFHL/+RJ+0bcPTykjxp34Cjl5flSfsGHL28Ik/aN+Do7lV50r5BZ/Tyet3XxLXtG3D08oY8ad+Ao5c35Un7Bhy9vCVP2jfg6OVtedK+AUcv78iT9g04enlXnrRvwNHLe/KkfQOOXt6XJ+0bcHT3gTxp36Azevmo7ofi2vYNOHr5WJ60b8DRyyfypH0Djl4+lSftG3D08pk8ad+Ao5fP5Un7Bhy9fCFP2jfg6OVLedK+AUcvX8mT9g04uvtanrRv0Bm9fFv3G3Ft+wYcvXwnT9o34Ojle3nSvgFHLz/Ik/YNOHr5UZ60b8DRy0/ypH0Djl5+liftG3D08os8ad+Ao5df5Un7Bhzd/SZP2jfojF7+qPu7uLZ9A45e/pQn7Rtw9PKXPGnfgKOXv+VJ+wYcvfwjT9o34OjlX3nSvgFHL326TU/aN+DopW+36Un7Bhy9DNNtetK+AUd3/bpNT9o36IxeOsX17za5tn0Djl663aYn7Rtw9NLrNj1p34Cjl2G7TU/aN+DoZbhu05P2DTh6Gb7b9KR9A45eRug2PWnf6KNeRpQn7Rt91ctI8qR9A47uRpYn7Rv91cuodUfpNrm2faOjXkaTJ+0bXfUyujxp3+iplzHkSfsGHL2MKU/aN+DoZSx50r4BRy9jy5P2DTh6GUeetG/A0cu48qR9A47uxpMn7Rt0Ri8T1B2/2+Ta9g04eplQnrRvwNHLRPKkfQOOXiaWJ+0bcPQyiTxp34Cjl0nlSfsGHL1MJk/aN+DoZXJ50r4BRy9TyJP2DTi6m1KetG9MVe+mrjtb3Vm7Ta5t34Cbpu7s8qR9A27aunPIk/YNuOnqzilP2jfgpq87lzxp34Cboe7c8qR9A27GuvPIk/YNuJnqzitP2jfgZq47nzxp34Cbpe788qR9g87oZcG6C3SbXNu+AUcvC8mT9g04ellYnrRvwNHLIvKkfQOOXhaVJ+0bcPSymDxp34Cjl8XlSfsGHL0sIU/aN+DoZUl50r4BR3dLyZP2DTqjl2XqLt1tcm37Bhy9LCtP2jfg6GU5edK+AUcvy8uT9g04ellBnrRvwNHLivKkfQOOXlaSJ+0bcPSysjxp34CjlwHypH0Dju4GypP2DTqjl1XrrtJtcm37Bhy9DJIn7Rtw9LKaPGnfgKOX1eVJ+wYcvQyWJ+0bcPQyRJ60b8DRy1B50r4BRy9ryJP2DTh6WVOetG/A0d1a8qR9g87oZZ26a3ebXNu+AUcv68qT9g04ellPnrRvwNHL+vKkfQOOXjaQJ+0bcPSyoTxp34Cjl43kSfsGHL1sLE/aN+DoZRN50r4BR3ebypP2DTqjl83rbtZtcm37Bhy9bCFP2jfg6GVLedK+AUcvW8mT9g04etlanrRvwNHLNvKkfQOOXraVJ+0bcPSynTxp34Cjl+3lSfsGHN3tIE/aN+iMXnaqu2O3ybXtG3D0srM8ad+Ao5dd5En7Bhy97CpP2jfg6GU3edK+AUcvu8uT9g04etlDnrRvwNHLnvKkfQOOXvaSJ+0bcHS3tzxp36Azetm37j7dJte2b8DRy37ypH0Djl72lyftG3D0coA8ad+Ao5cD5Un7Bhy9HCRP2jfg6OVgedK+AUcvh8iT9g04ejlUnrRvwNHdYfKkfYPO6OWIuoeLa9s34OjlSHnSvgFHL0fJk/YNOHo5Wp60b8DRyzHypH0Djl6OlSftG3D0cpw8ad+Ao5fj5Un7Bhy9nCBP2jfg6O5EedK+QWf0cnLdk8S17Rtw9HKKPGnfgKOXU+VJ+wYcvZwmT9o34OjldHnSvgFHL2fIk/YNOHo5U560b8DRy1nypH0Djl7OliftG3B0d448ad84t+55da+se4W4tn0D7vy6V8mT9g24C+peLU/aN+AurHuNPGnfgLuo7rXypH0D7uK618mT9g24S+peL0/aN+AurXuDPGnfgLus7o3ypH0D7vK6N8mT9g06o5db6t4srm3fgKOXW+VJ+wYcvdwmT9o34OjldnnSvgFHL3fIk/YNOHq5U560b8DRy13ypH0Djl7uliftG3D0co88ad+Ao7t75Un7Bp3Ry/117xPXtm/A0csD8qR9A45eHpQn7Rtw9PKQPGnfgKOXh+VJ+wYcvTwiT9o34OjlUXnSvgFHL4/Jk/YNOHp5XJ60b8DR3RPypH2DzujlqbpPimvbN+Do5Wl50r4BRy/PyJP2DTh6eVaetG/A0ctz8qR9A45enpcn7Rtw9PKCPGnfgKOXF+VJ+wYcvfxHnrRvwNHdS/KkfYPO6OWVui+La9s34OjlVXnSvgFHL6/Jk/YNOHp5XZ60b8DRyxvypH0Djl7elCftG3D08pY8ad+Ao5e35Un7Bhy9vCNP2jfg6O5dedK+QWf08n7d98S17Rtw9PKBPGnfgKOXD+VJ+wYcvXwkT9o34OjlY3nSvgFHL5/Ik/YNOHr5VJ60b8DRy2fypH0Djl4+lyftG3B094U8ad+gM3r5qu6X4tr2DTh6+VqetG/A0cs38qR9A45evpUn7Rtw9PKdPGnfgKOX7+VJ+wYcvfwgT9o34OjlR3nSvgFHLz/Jk/YNOLr7WZ60b9AZvfxa9xdxbfsGHL38Jk/aN+Do5Xd50r4BRy9/yJP2DTh6+VOetG/A0ctf8qR9A45e/pYn7Rtw9PKPPGnfgKOXf+VJ+wYc3fXpNT1p36Azehmm+L69Jte2b8DRS79e05P2DTh66d9retK+AUcvnV7Tk/YNOHrp9pqetG/A0Uuv1/SkfQOOXobtNT1p34Cjl+F6TU/aN+DoZfhe05P2DTi6G6HX9KR9o696GanuiL0m17ZvDKNeRpYn7Rv91Mso8qR9o796GVWetG901Mto8qR9o6teRpcn7Rs99TKGPGnfgKOXMeVJ+wYcvYwlT9o34OhubHnSvjFOvRu37hR1J+81ubZ9A268ulPKk/YNuPHrTiVP2jfgJqg7tTxp34CbsO408qR9A26iutPKk/YNuInrTidP2jfgJqk7vTxp34CbtO4M8qR9A26yujPKk/YNOqOXmevO1GtybfsGHL3MIk/aN+DoZVZ50r4BRy+zyZP2DTh6mV2etG/A0csc8qR9A45e5pQn7Rtw9DKXPGnfgKOXueVJ+wYc3c0jT9o36Ixe5qs7b6/Jte0bcPQyvzxp34CjlwXkSfsGHL0sKE/aN+DoZSF50r4BRy8Ly5P2DTh6WUSetG/A0cui8qR9A45eFpMn7RtwdLe4PGnfoDN6WbLuEr0m17ZvwNHLUvKkfQOOXpaWJ+0bcPSyjDxp34Cjl2XlSfsGHL0sJ0/aN+DoZXl50r4BRy8ryJP2DTh6WVGetG/A0d1K8qR9g87oZUDdlXtNrm3fgKOXgfKkfQOOXlaRJ+0bcPSyqjxp34Cjl0HypH0Djl5WkyftG3D0sro8ad+Ao5fB8qR9A45ehsiT9g04uhsqT9o36Ixe1qy7Rq/Jte0bcPSyljxp34Cjl7XlSfsGHL2sI0/aN+DoZV150r4BRy/ryZP2DTh6WV+etG/A0csG8qR9A45eNpQn7RtwdLeRPGnfoDN62aTuxr0m17ZvwNHLpvKkfQOOXjaTJ+0bcPSyuTxp34Cjly3kSfsGHL1sKU/aN+DoZSt50r4BRy9by5P2DTh62UaetG/A0d228qR9g87oZfu62/WaXNu+AUcvO8iT9g04etlRnrRvwNHLTvKkfQOOXnaWJ+0bcPSyizxp34Cjl13lSfsGHL3sJk/aN+DoZXd50r4BR3d7yJP2DTqjl73q7tlrcm37Bhy97C1P2jfg6GUfedK+AUcv+8qT9g04etlPnrRvwNHL/vKkfQOOXg6QJ+0bcPRyoDxp34Cjl4PkSfsGHN0dLE/aN+iMXg6te4i4tn0Djl4OkyftG3D0crg8ad+Ao5cj5En7Bhy9HClP2jfg6OUoedK+AUcvR8uT9g04ejlGnrRvwNHLsfKkfQOO7o6TJ+0bx9c9oe7Zdc8S17ZvwJ1Y9xx50r4Bd1Ldc+VJ+wbcyXXPkyftG3Cn1D1fnrRvwJ1a9wJ50r4Bd1rdC+VJ+wbc6XUvkiftG3Bn1L1YnrRvwJ1Z9xJ50r5BZ/RyWd1LxbXtG3D0crk8ad+Ao5cr5En7Bhy9XClP2jfg6OUqedK+AUcvV8uT9g04erlGnrRvwNHLtfKkfQOOXq6TJ+0bcHR3vTxp36Azermx7g3i2vYNOHq5SZ60b8DRy83ypH0Djl5ukSftG3D0cqs8ad+Ao5fb5En7Bhy93C5P2jfg6OUOedK+AUcvd8qT9g04urtLnrRv0Bm93FP3bnFt+wYcvdwrT9o34OjlPnnSvgFHL/fLk/YNOHp5QJ60b8DRy4Py/BdF/3SPeJyFmVMQJYcaBjfaPefE1sa2nRvbtm3btm3bXiTZjW3bto1bde/fD9NVU9+8/FVT0/3UT/Mt1K/P/56F6y5Xd9m6A+oOrPtg3QfELVJ3eXngBtV9SB64ReuuIA/c4LoPywO3WN0V5YG7u+4j8ixed4m6K9ddqe49de+t+1jdR8UtWXcVeeCG1H1cHril6q4qD9zQuk/IA7d03dXkgbuv7pPywC1Td3V54O6v+5Q8cPSyhjxw9PK0PHD0sqY8cPTyjDxw9LKWPHD08qw8cPSytjxw9PKcPHB0t448cHT3vDx0Ri/r1V1XndHLi3VfEEcv68sDRy8vyQNHLxvIA0cvL8sDRy8bygNHL6/IA0cvG8kDRy+vygNHLxvLA0cvr8kDRy+byANHL6/LA0cvm8oDRy9vyANHL5vJA0cvb8oDR3ebywNHd2/JQ2f0smXdLdQZvbxT921x9LKVPHD08q48cPSytTxw9PKePHD0so08cPTyvjxw9LKtPHD08oE8cPSynTxw9PKhPHD0sr08cPTykTxw9LKDPHD08rE8cPSyozxw9PKJPHB0t5M8cHT3qTx0Ri+71N1ZndHL53U/E0cvu8oDRy9fyANHL7vJA0cvX8oDRy+7ywNHL1/JA0cve8gDRy9fywNHL3vKA0cv38gDRy97yQNHL9/KA0cve8sDRy/fyQNHL/vIA0cv38sDR3f7ygNHdz/IQ2f0sn/d/dQZvfxU90dx9HKAPHD08rM8cPRyoDxw9PKLPHD0cpA8cPTyqzxw9HKwPHD08ps8cPRyiDxw9PK7PHD0cqg8cPTyhzxw9HKYPHD08qc8cPRyuDxw9PKXPHB0d4Q8cHT3tzx0Ri9H1T1SndHLv3X/EUcvR8sDRy99Ok0PHL0cIw8cvQzTaXrg6OVYeeDoZdhO0wNHL8fJA0cvw3WaHjh6OV4eOHoZvtP0wNHLCfLA0csInaYHjl5OlAeOXvp2mh44ejlJHjh66ddpeuDo7mR54Oiu02l6Tqn3p9a9oO75dbv1Xa/u2HXH6jS50+peKA/ciHXHkQfu9LoXyQM3Ut1x5YE7o+7F8sCNXHc8eeDOrHuJPHCj1B1fHriz6l4qD9yodSeQB+7supfJAzda3QnlgTun7uXywI1et788cOfWvUIeuDHqTiQP3Hl1r5QHbsy6E8tDZ/Rydd2r6tIZvUxad5JOk6OXa+SBo5fJ5IGjl2vlgaOXyeWBo5fr5IGjlynkgaOX6+WBo5cp5YGjlxvkgaOXqeSBo5cb5YGjl6nlgaOXm+SBo5dp5IGjl5vlgaOXaeWBo7tb5IGju+nkoTN6ua3urXXpjF5mqDt9p8nRy+3ywNHLjPLA0csd8sDRy0zywNHLnfLA0cvM8sDRy13ywNHLLPLA0csAeeDoZVZ54OhloDxw9DKbPHD0MkgeOHqZXR44ehksDxy9zCEPHN3dLQ8c3c0pD53RC/+L+e9MZ/Qyd925Ok2OXobIA0cv88gDRy9D5YGjl3nlgaOX++SBo5f55IGjl/vlgaOX+eWBo5cH5IGjlwXkSfsGHL0sKE/aN+Do5T/ypH0Djl4WkiftG3B0t7A8ad+gM3pZtO4inSbXtm/A0cti8qR9A45eFpcn7Rtw9LKEPGnfgKOXJeVJ+wYcvSwlT9o34OhlaXnSvgFHL8vIk/YNOHpZVp60b8DR3XLypH2DzuhlhbrLd5pc274BRy8rypP2DTh6WUmetG/A0cvK8qR9A45eVpEn7Rtw9LKqPGnfgKOX1eRJ+wYcvawuT9o34OhlDXnSvgFHd2vKk/YNOqOXteuu1WlybfsGHL2sI0/aN+DoZV150r4BRy/ryZP2DTh6WV+etG/A0csG8qR9A45eNpQn7Rtw9LKRPGnfgKOXjeVJ+wYc3W0iT9o36IxeNqu7aafJte0bcPSyuTxp34Cjly3kSfsGHL1sKU/aN+DoZSt50r4BRy9by5P2DTh62UaetG/A0cu28qR9A45etpMn7RtwdLe9PGnfoDN62bHuDp0m17ZvwNHLTvKkfQOOXnaWJ+0bcPSyizxp34Cjl13lSfsGHL3sJk/aN+DoZXd50r4BRy97yJP2DTh62VOetG/A0d1e8qR9g87oZZ+6e3eaXNu+AUcv+8qT9g04etlPnrRvwNHL/vKkfQOOXg6QJ+0bcPRyoDxp34Cjl4PkSfsGHL0cLE/aN+Do5RB50r4BR3eHypP2jcPqHl73pLonimvbN+COqHuyPGnfgDuy7inypH0D7qi6p8qT9g24o+ueJk/aN+COqXu6PGnfgDu27hnypH0D7ri6Z8qT9g244+ueJU/aN+BOqHu2PGnfoDN6ObfuOeLa9g04ejlPnrRvwNHL+fKkfQOOXi6QJ+0bcPRyoTxp34Cjl4vkSfsGHL1cLE/aN+Do5RJ50r4BRy+XypP2DTi6u0yetG/QGb1cUfdycW37Bhy9XClP2jfg6OUqedK+AUcvV8uT9g04erlGnrRvwNHLtfKkfQOOXq6TJ+0bcPRyvTxp34CjlxvkSfsGHN3dKE/aN+iMXm6ue5O4tn0Djl5ukSftG3D0cqs8ad+Ao5fb5En7Bhy93C5P2jfg6OUOedK+AUcvd8qT9g04erlLnrRvwNHLAHnSvgFHdwPlSfsGndHL4LqDxLXtG3D0crc8ad+Ao5d75En7Bhy93CtP2jfg6GWIPGnfgKOXofKkfQOOXu6TJ+0bcPRyvzxp34CjlwfkSfsGHN09KE/aN+iMXh6u+5C4tn0Djl4ekSftG3D08qg8ad+Ao5fH5En7Bhy9PC5P2jfg6OUJedK+AUcvT8qT9g04enlKnrRvwNHL0/KkfQOO7p6RJ+0bdEYvz9V9VlzbvgFHL8/Lk/YNOHp5QZ60b8DRy4vypH0Djl5ekiftG3D08rI8ad+Ao5dX5En7Bhy9vCpP2jfg6OU1edK+AUd3r8uT9g06o5c3674hrm3fgKOXt+RJ+wYcvbwtT9o34OjlHXnSvgFHL+/Kk/YNOHp5T560b8DRy/vypH0Djl4+kCftG3D08qE8ad+Ao7uP5En7Bp3Ryyd1PxbXtm/A0cun8qR9A45ePpMn7Rtw9PK5PGnfgKOXL+RJ+wYcvXwpT9o34OjlK3nSvgFHL1/Lk/YNOHr5Rp60b8DR3bfypH2Dzujl+7rfiWvbN+Do5Qd50r4BRy8/ypP2DTh6+UmetG/A0cvP8qR9A45efpEn7Rtw9PKrPGnfgKOX3+RJ+wYcvfwuT9o34OjuD3nSvvFn3b/q9uv+//btNrm2fQPu77qdbtOT9g24f+p2u01P2jfg/q3b6zY9ad+A61Pfj9htetK+ATdM3ZHkSfsG3LB1R5Yn7Rtww9UdRZ60b8ANX3dUedK+ATdC3dHkSftGX/UyRt3Ru02ubd/op17GlCftG3D0MpY8ad+Ao5ex5Un7Bhy9jCNP2jfg6GVcedK+AUcv48mT9g04ehlfnrRvwNHLBPKkfQOO7iaUJ+0bdEYvE9Xt321ybfsGHL1MLE/aN+DoZRJ50r4BRy+TypP2DTh6mUyetG/A0cvk8qR9A45eppAn7Rtw9DKlPGnfgKOXqeRJ+wYc3U0tT9o36Ixepq07TbfJte0bcPQynTxp34Cjl+nlSfsGHL3MIE/aN+DoZUZ50r4BRy8zyZP2DTh6mVmetG/A0css8qR9A45eZpUn7RtwdDebPGnfoDN6maPu7N0m17ZvwNHLnPKkfQOOXuaSJ+0bcPQytzxp34Cjl3nkSfsGHL3MK0/aN+DoZT550r4BRy/zy5P2DTh6WUCetG/A0d2C8qR9g87oZaG6/+k2ubZ9A45eFpYn7Rtw9LKIPGnfgKOXReVJ+wYcvSwmT9o34OhlcXnSvgFHL0vIk/YNOHpZUp60b8DRy1LypH0Dju6WliftG3RGL8vWXabb5Nr2DTh6WU6etG/A0cvy8qR9A45eVpAn7Rtw9LKiPGnfgKOXleRJ+wYcvawsT9o34OhlFXnSvgFHL6vKk/YNOLpbTZ60b9AZvaxRd/Vuk2vbN+DoZU150r4BRy9ryZP2DTh6WVuetG/A0cs68qR9A45e1pUn7Rtw9LKePGnfgKOX9eVJ+wYcvWwgT9o34OhuQ3nSvkFn9LJx3Y26Ta5t34Cjl03kSfsGHL1sKk/aN+DoZTN50r4BRy+by5P2DTh62UKetG/A0cuW8qR9A45etpIn7Rtw9LK1PGnfgKO7beRJ+wad0ct2dbftNrm2fQOOXraXJ+0bcPSygzxp34Cjlx3lSfsGHL3sJE/aN+DoZWd50r4BRy+7yJP2DTh62VWetG/A0ctu8qR9A47udpcn7Rt71N2z7iF1D+42ubZ9A26vuofKk/YNuL3rHiZP2jfg9ql7uDxp34Dbt+4R8qR9A26/ukfKk/YNuP3rHiVP2jfgDqh7tDxp34A7sO4x8qR9A+6gusfKk/YNOqOX4+seJ65t34CjlxPkSfsGHL2cKE/aN+Do5SR50r4BRy8ny5P2DTh6OUWetG/A0cup8qR9A45eTpMn7Rtw9HK6PGnfgKO7M+RJ+wad0ctZdc8U17ZvwNHL2fKkfQOOXs6RJ+0bcPRyrjxp34Cjl/PkSfsGHL2cL0/aN+Do5QJ50r4BRy8XypP2DTh6uUietG/A0d3F8qR9g87o5dK6l4hr2zfg6OUyedK+AUcvl8uT9g04erlCnrRvwNHLlfKkfQOOXq6SJ+0bcPRytTxp34Cjl2vkSfsGHL1cK0/aN+Do7jp50r5BZ/RyQ93rxbXtG3D0cqM8ad+Ao5eb5En7Bhy93CxP2jfg6OUWedK+AUcvt8qT9g04erlNnrRvwNHL7fKkfQOOXu6QJ+0bcHR3pzxp36AzehlQ9y5xbfsGHL0MlCftG3D0MkietG/A0ctgedK+AUcvd8uT9g04erlHnrRvwNHLvfKkfQOOXobIk/YNOHoZKk/aN+Do7j550r5BZ/TyQN37xbXtG3D08qA8ad+Ao5eH5En7Bhy9PCxP2jfg6OURedK+AUcvj8qT9g04enlMnrRvwNHL4/KkfQOOXp6QJ+0bcHT3pDxp36Azenm67lPi2vYNOHp5Rp60b8DRy7PypH0Djl6ekyftG3D08rw8ad+Ao5cX5En7Bhy9vChP2jfg6OUledK+AUcvL8uT9g04untFnrRv0Bm9vFb3VXFt+wYcvbwuT9o34OjlDXnSvgFHL2/Kk/YNOHp5S560b8DRy9vypH0Djl7ekSftG3D08q48ad+Ao5f35En7BhzdvS9P2jfojF4+rPuBuLZ9A45ePpIn7Rtw9PKxPGnfgKOXT+RJ+wYcvXwqT9o34OjlM3nSvgFHL5/Lk/YNOHr5Qp60b8DRy5fypH0Dju6+kiftG1/X/abu73V/E9e2b8B9W/cPedK+Afdd3T/lSfsG3Pd1/5In7RtwP9T9W560b8D9WPcfedK+AfdT3X/lSfsG3M91+/SanrRvwP1Sd5he05P2Dbhf6w7ba3rSvkFn9DJ8ccP1mlzbvgFHLyP0mp60b8DRS99e05P2DTh66ddretK+AUcvnV7Tk/YNOHrp9pqetG/A0Uuv1/SkfQOOXkbsNT1p3+ijXkaSJ+0bcHQ3sjxp3xhOvYxad5Rek2vbN4ZXL6PJk/aNEdTL6PKkfaOvehlDnrRv9FMvY8qT9g04ehlLnrRvwNHL2PKkfQOOXsaRJ+0bcPQyrjxp34Cju/HkSfsGndHLBHXH7zW5tn0Djl4mlCftG3D00l+etG/A0ctE8qR9A45eJpYn7Rtw9DKJPGnfgKOXSeu+3L/Jte0bcPQymTxp34Cjl8nlSfsGHN1NIU/aN+iMXqaqO2WvybXtG3D0MrU8ad+Ao5dp5En7Bhy9TCtP2jfg6GU6edK+AUd308uT9g06o5cZ6r7Sv8m17RuTqpcZ5fkvrRCNdXichZlTrGVpGwa7Z7qnp/feY8+csW3btm3btm3btm3btm3rT/5562JVsvKcmzc5+aquKvtiPZcN7vf/v8vr3lT3xrrjd/67E9Sduu5UnSZ3Rd2b5YGbsO408lxZ766qe2vdW+pOVO8mrjtd3Wk7Te7qurfJAzdJ3enlgbum7u3ywE1adwZ54K6te4c8cJPVnVEeuOvq3ikP3OR1Z5IH7vq6d8kDN0XdmeWBu6Hu3fK80vffnbLezyIPHL3cIw8cvcwqDxy93CsPHL3MJg8c3d0nDxzdzS4PndHLA3Xvr0tn9DJn3Tk6TY5eHpQHjl7mkgeOXh6SB45e5pYHjl4elgeOXuaRB45eHpEHjl7mlQeOXh6VB45e5pMHjl4ekweOXuaXB45eHpcHjl4WkAeOXp6QB45eFpQHju6elAeO7haSh87o5em6T9WlM3pZpO7CnSZHL8/IA0cvi8oDRy/PygNHL4vJA0cvz8kDRy+LywNHL8/LA0cvS8gDRy8vyANHL0vKA0cvL8oDRy9LyQNHLy/JA0cvS8sDRy8vywNHL8vIA0d3r8gDR3fLykNn9PJa3Vfr0hm9LF93uU6To5fX5YGjlxXkgaOXN+SBo5cV5YGjlzflgaOXleSBo5e35IGjl5XlgaOXt+WBo5dV5IGjl3fkgaOXVeWBo5d35YGjl9XkgaOX9+SBo5fV5YGju/flgaO7NeShM3r5sO4HdemMXtaqu2anydHLR/LA0cva8sDRy8fywNHLOvLA0csn8sDRy7rywNHLp/LA0ct68sDRy2fywNHL+vLA0cvn8sDRywbywNHLF/LA0cuG8sDRy5fywNHLRvLA0d1X8sDR3cbyfF3vvqn7e93f6m5S7zatu0Pd7TtN7tu6f8gDt1ndHeWB+67un/LAbV53J3ngvq/7lzxwW9TdWR64H+r+LQ/clnV3kQfux7r/yAO3Vd1d5YH7qe6/8sBtXXc3eeB+rtuv0/TAbVN3d3ngfqnbv9P0wG1bdw954H6tO0Sn6YHbru6e8vymXgbU/4dUZ/Syd929Ok2OXgZ2mh44etlHnj/Uy1CdpgeOXvaV50/1MqjT9MDRy37y/KVehu40PXD0sr88f6uXwZ2mB45eDpDnH3XX6TQ9cPRyoDz/qrtup+mBo5eD5IGjl548cPRysDxwdDeMPHB0d4g8dEYvw9UdVp3Ry2F1DxVHL8PLA0cvh8sDRy8jyANHL0fIA0cvI8oDRy9HygNHLyPJA0cvR8kDRy8jywNHL0fLA0cvo8gDRy/HyANHL6PKA0cvx8oDRy+jyQNHL8fJA0d3o8sDR3fHy0Nn9DJm3THUGb2cWPcEcfQyljxw9HKSPHD00icPHL2cLA8cvYwtDxy9nCIPHL2MIw8cvZwqDxy9jCsPHL2cJg8cvYxX9+W+Jkcvp9d9ta/J0cv48sDRyxnywNHLBPLA0cuZ8sDR3YTywNHdWfLQGb3wvZjvznRGL+fUPVscvUwiDxy9nCsPHL1MKg8cvZwnDxy9TCYPHL2cLw8cvUwuDxy9XCAPHN1NIQ8c3V0oD53RC9+L+e5MZ/RyUd3XxNHLVPLA0cvF8qR9A45eLpEn7RtwdHepPGnfoDN6ubzuZeLa9g04erlCnrRvwNHLlfKkfQOOXq6SJ+0bcPRytTxp34Cju2vkSfsGndHLtfKkfQOOXq6TJ+0bcPRyvTxp34CjuxvkSfsGndHLTXVvFNe2b8DRy83ypH0Djl5ukSftG3D0cqs8ad+Ao5fb5En7Bhy93C5P2jfg6OUOedK+AUcvd8qT9g04erlLnrRvwNHd3fKkfYPO6OXeuveIa9s34OjlPnnSvgFHL/fLk/YNOHp5QJ60b8DRy4PypH0Djl4ekiftG3D08rA8ad+Ao5dH5En7Bhy9PCpP2jfg6O4xedK+QWf08kTdx8W17Rtw9PKkPGnfgKOXp+RJ+wYcvTwtT9o34OjlGXnSvgFHL8/Kk/YNOHp5Tp60b8DRy/PypH0Djl5ekCftG3B096I8ad+gM3p5ue5L4tr2DTh6eUWetG/A0cur8qR9A45eXpMn7Rtw9PK6PGnfgKOXN+RJ+wYcvbwpT9o34OjlLXnSvgFHL2/Lk/YNOLp7R560b7xb9726X9b9QlzbvgH3ft2v5En7BtwHdb+WJ+0bcB/W/UaetG/AfVT3W3nSvgH3cd3v5En7Btwndb+XJ+0bcJ/W/UGetG/AfVb3R3nSvgH3ed2f5En7Bp3Ryy91fxbXtm/A0cuv8qR9A45efpMn7Rtw9PK7PGnfgKOXP+RJ+wYcvfwpT9o34OjlL3nSvgFHL3/Lk/YNOHr5R560b8DR3b/ypH2Dzuilf/e/26/b5Nr2DTh6GaLb9KR9A45ehuw2PWnfgKOXAd2mJ+0bcPQysNv0pH0Djl6G6jY9ad+Ao5dB3aYn7Rtw9DJ0t+lJ+wYcvQzuNj1p34Cju0636Un7Rj/10qvb7Ta5tn2jv3oZRp60bwyhXoaVJ+0bQ6qX4eRJ+8YA9TK8PGnfGKheXu9retK+MZR6GbHuCN0m17ZvDFIvI8mT9g04ehlZnrRvwNHdKPKkfYPO6GW0uqN2m1zbvgFHL6PLk/YNOHoZQ560b8DRy5jypH0Djl7GkiftG3B01ydP2jfojF7GrvuGuLZ9Y0T1Mo48ad8YSb2MK0/aN+Dobjx50r4xqnqZoO743SbXtm+Mpl4mlCftG6Orl4nkSfvGGOplYnnSvgFHL5PIk/YNOLqbVJ60b9AZvUwmT9o34OhlcnnSvgFHL1PIk/YNOLqbUp60b9AZvUxdd6puk2vbN+DoZRp50r4BRy/TypP2DTh6mU6etG/A0cv08qR9A45eZpAn7Rtw9DKjPGnfgKOXmeRJ+wYcvcwsT9o34OhuFnnSvkFn9DJb3Vm7Ta5t34Cjl9nlSfsGHL3MIU/aN+DoZU550r4BRy9zyZP2DTh6mVuetG/A0cs88qR9A45e5pUn7Rtw9DKfPGnfgKO7+eVJ+wad0cuCdRfoNrm2fQOOXhaSJ+0bcPSysDxp34Cjl0XkSfsGHL0sKk/aN+DoZTF50r4BRy+Ly5P2DTh6WUKetG/A0cuS8qR9A47ulpIn7Rt0Ri/L1F262+Ta9g04ellWnrRvwNHLcvKkfQOOXpaXJ+0bcPSygjxp34CjlxXlSfsGHL2sJE/aN+DoZWV50r4BRy+ryJP2DTi6W1WetG+sVu9Wr7tR3Q27Ta5t34Bbo+7G8qR9A27NupvIk/YNuLXqbipP2jfg1q67mTxp34Bbp+7m8qR9A27dulvIk/YNuPXqbilP2jfg1q+7lTxp34DboO7W8qR9g87oZdu623SbXNu+AUcv28mT9g04etlenrRvwNHLDvKkfQOOXnaUJ+0bcPSykzxp34Cjl53lSfsGHL3sIk/aN+DoZVd50r4BR3e7yZP2DTqjlz3q7t5tcm37Bhy97ClP2jfg6GUvedK+AUcve8uT9g04etlHnrRvwNHLvvKkfQOOXvaTJ+0bcPSyvzxp34CjlwPkSfsGHN0dKE/aN+iMXg6ue5C4tn0Djl4OkSftG3D0cqg8ad+Ao5fD5En7Bhy9HC5P2jfg6OXNvqYn7Rtw9HJk3SPEte0bcPRylDxp34Cjl6PlSfsGHN0dI0/aN+iMXo6re6y4tn0Djl6OlyftG3D0coI8ad+Ao5cT5Un7Bhy9nCRP2jfg6O5kedK+QWf0ckrdt/qaXNu+AUcvp8qT9g04ejlNnrRvwNHd6fKkfYPO6OXMumeIa9s34OjlLHnSvgFHL2fLk/YNOHo5R560b8DRy7nypH0Dju7OkyftG3RGL+fLk/YNOHq5QJ60b8DRy4XypH0Dju4ukiftG3RGL5fUvVhc274BRy+XypP2DTh6uUyetG/A0cvl8qR9A45erpAn7Rtw9HKlPGnfgKOXq+RJ+wYcvVwtT9o34OjlGnnSvgFHd9fKk/YNOqOX6+teJ65t34CjlxvkSfsGHL3cKE/aN+Do5SZ50r4BRy83y5P2DTh6uUWetG/A0cut8qR9A45ebpMn7Rtw9HK7PGnfgKO7O+RJ+wad0ctdde8U17ZvwNHL3fKkfQOOXu6RJ+0bcPRyrzxp34Cjl/vkSfsGHL3cL0/aN+Do5QF50r4BRy8PypP2DTh6eUietG/A0d3D8qR9g87o5dG6j4hr2zfg6OUxedK+AUcvj8uT9g04enlCnrRvwNHLk/KkfQOOXp6SJ+0bcPTytDxp34Cjl2fkSfsGHL08K0/aN+Do7jl50r7xfN0X6r5d9y1xbfsG3It135En7RtwL9V9V560b8C9XPc9edK+AfdK3fflSfsG3Kt1P5An7Rtwr9X9UJ60b8C9XvcjedK+AfdG3Y/lSfsG3Jt1P5En7Rt0Ri+f1f1UXNu+AUcvn8uT9g04evlCnrRvwNHLl/KkfQOOXr6SJ+0bcPTytTxp34Cjl2/kSfsGHL18K0/aN+Do5Tt50r4BR3ffy5P2DTqjlx/r/iCubd+Ao5ef5En7Bhy9/CxP2jfg6OUXedK+AUcvv8qT9g04evlNnrRvwNHL7/KkfQOOXv6QJ+0bcPTypzxp34Cju7/kSfsGndHLP3X/Fte2b8DRy7/ypH0Djl769ZqetG/A0Uv/XtOT9g04ehmi1/SkfQOOXobsNT1p34CjlwHFvd3X5Nr2DTh6GdhretK+AUcvQ/WanrRvwNHdoF7Tk/YNOqOXwcUN3WtybfsGHL10ek1P2jfg6KXba3rSvtFPvfTkSftGf/UyjDxp34Cju2HlSfsGndHLcHXf6WtybfvGAPUyvDxp3xioXkaQJ+0bcHQ3ojxp3xhavYxcd6Rek2vbNwarl1HkSftGR72MKk/aN7rqZTR50r7RUy+jy5P2DTi6G0OetG/QGb2MKU/aN+DoZSx50r4BRy998qR9A47uxpYn7Rt0Ri/j1h2n1+Ta9g04ehlPnrRvwNHL+PKkfQOOXiaQJ+0bcPQyoTxp34Cjl4nkSfsGHL1MLE/aN+DoZRJ50r4BRy+TypP2DTi6m0yetG/QGb1MUXfyXpNr2zfg6GVKedK+AUcvU8mT9g04eplanrRvwNHLNPKkfQOOXqaVJ+0bcPQynTxp34Cjl+nlSfsGHL3MIE/aN+DobkZ50r5BZ/Qyc92Zek2ubd+Ao5dZ5En7Bhy9zCpP2jfg6GU2edK+AUcvs8uT9g04eplDnrRvwNHLnPKkfQOOXuaSJ+0bcPQytzxp34Cju3nkSfsGndHLfHXn7TW5tn0Djl7mlyftG3D0soA8ad+Ao5cF5Un7Bhy9LCRP2jfg6GVhedK+AUcvi8iT9g04ellUnrRvwNHLYvKkfQOO7haXJ+0bS9S7JeuuUnflXpNr2zfglqq7qjxp34Bbuu5q8qR9A26ZuqvLk/YNuGXrriFP2jfglqu7pjxp34Bbvu5a8qR9A26FumvLk/YNuBXrriNP2jfgVqq7rjxp36Azelm/7nq9Jte2b8DRywbypH0Djl42lCftG3D0spE8ad+Ao5eN5Un7Bhy9bCJP2jfg6GVTedK+AUcvm8mT9g04etlcnrRvwNHdFvKkfYPO6GWrulv2mlzbvgFHL1vLk/YNOHrZRp60b8DRy7bypH0Djl62kyftG3D0sr08ad+Ao5cd5En7Bhy97ChP2jfg6GUnedK+AUd3O8uT9g06o5dd6+7Sa3Jt+wYcvewmT9o34Ohld3nSvgFHL3vIk/YNOHrZU560b8DRy17ypH0Djl725ne/r8m17Rtw9LKPPGnfgKOXfeVJ+wYc3e0nT9o36IxeDqi7f6/Jte0bcPRyoDxp34Cjl4PkSfsGHL0cLE/aN+Do5RB50r4BR3fv9TU9ad+gM3o5rO6h6qxt34Cjl8PlSfsGHL0cIU/aN+Do7kh50r5BZ/RydN2jxLXtG3D0cow8ad+Ao5dj5Un7Bhy9HCdP2jfg6OV4edK+AUd3J8iT9g06o5cTe01P2jfg6OUkedK+AUcvJ8uT9g04ujtFnv8BqdyWdXichZlT0F0HG0aTIqnOqf3Vtm3bdpPatu00SVPbtm3bttLUdvvP/H3XxV4ze55z897stc7MmTXnYj9jj9br/59x6k5Wd9K6J9Y9qe4ZdU8XN27dyeWBG1D3THngxqs7hTxwJ9c9Sx648etOKQ/cwLpnywM3Qd2p5IEbVPcceeAmrDu1PHCD654rD9xEdaeRB+6UuufJAzdx3WnlgRtS93x54HrqTicP3Kl1L5AHbpK608sDd1rdC+WhM3qZse4M6oxeLq57kTh6mUkeOHq5RB44eplZHjh6uVQeOHqZRR44erlMHjh6mVUeOHq5XB44eplNHjh6uUIeOHqZXR44erlSHjh6mUMeOHq5Sh44eplTHjh6uVoeOLqbSx44urtGHjqjl3nqzq3O6OW6uteKo5d55YGjl+vlgaOX+eSBo5cb5IGjl/nlgaOXG+WBo5cF5IGjl5vkgaOXBeWBo5eb5YGjl4XkgaOXW+SBo5eF5YGjl1vlgaOXReSBo5fb5IGju0XlgaO72+WhM3pZvO5i6oxe7qx7hzh6WUIeOHq5Sx44ellSHjh6uVseOHpZSh44erlHHjh6WVoeOHq5Vx44ellGHjh6uU8eOHpZVh44erlfHjh6WU4eOHp5QB44elleHjh6eVAeOLpbQR44untInhXrrlR33brr1H247iN1n6/7nLiV664nD9yjdV+QB26VuuvLA/dY3RflgVu17gbywD1e9yV54Faru6E8cE/UfVkeuNXrbiQP3JN1X5EHbo26G8sD91TdV+WBW7PuJvLAPV33NXng1qq7qTxwz9R9XR64tetuJg/cs3XfkIfO6KVf3c3VGb28VfdNcfTSXx44enlbHjh62UIeOHp5Rx44etlSHjh6eVceOHrZSh44enlPHjh62VoeOHp5Xx44etlGHjh6+UAeOHrZVh44evlQHjh62U4eOHr5SB44utteHji6+1geOqOXHevuoM7o5dO6n4ijl53kgaOXz+SBo5ed5YGjl8/lgaOXXeSBo5eh8sDRy67ywNHLF/LA0ctu8sDRyzB54Ohld3ng6OVLeeDoZQ954OjlK3ng6GVPeeDo5Wt54OhuL3ng6O4beeiMXvapu7c6o5fv6n4rjl72lQeOXr6XB45e9pMHjl5+kAeOXvaXB45efpQHjl4OkAeOXn6SB45eDpQHjl5+lgeOXg6iu54mRy+/0EVPk6OXg+WBo5df5YGjl0PkgaOX3+SBo7tD5YGju9/loTN6ObzuYeqMXv6s+4c4ejlCHjh6+UseOHo5Uh44evlbHjh6OUoeOHr5Rx44ejlaHjh6+VceOLr7oKfpgaO7j3qaHjqjl2PrHqPO6KV357/bq9Pk6OU4eeDoZbhO0wNHL8fLA0cvw3eaHji6O0EeOLobodP00Bm98L6Y9850Ri99ihux0+ToZYA8cPTSt9P0wNHLyfLA0ctInaYHjl4GygNHLyN3mh44ehkkDxy9jNJpeuDobrA8cHQ3aqfpoTN64X0xnl7qZbRO0wNHL0Pk6a1eOvLA0cup8gynXrrywNHdafLA0d3o8qR9Y0T1MmbdMTpNrm3f6KNexpIn7Rt91cvY8qR9YyT1Mo48ad+Ao5dx5Un7Bhy9jCdP2jfg6GV8edK+AUcvE8iT9g04eplQnrRvwNHdRPKkfYPO6KWn7sSdJte2b8DRyyTypH0Djl4mlSftG3D0Mpk8ad+Ao5fJ5Un7Bhy9TCFP2jfg6GVKedK+AUcvU8mT9g04eplanrRvwNHdNPKkfYPO6GW6utN2mlzbvgFHL9PLk/YNOHqZQZ60b8DRy4zypH0Djl5mkiftG3D0MrM8ad+Ao5dZ5En7Bhy9zCpP2jfg6GU2edK+AUd3s8uT9g06o5c5687RaXJt+wYcvcwlT9o34OhlbnnSvgFHL/PIk/YNOHqZV560b8DRy3zypH0Djl7mlyftG3D0soA8ad+Ao5cF5Un7BhzdLSRP2jcWrucWqbt83eU6Ta5t34BbtO4K8qR9A26xuivKk/YNuMXrriRP2jfglqi7sjxp34Bbsu4q8qR9A26puqvKk/YNuKXrriZP2jfglqm7ujxp34Bbtu4a8qR9g87oZa26a3aaXNu+AUcva8uT9g04ellHnrRvwNHLuvKkfQOOXtaTJ+0bcPSyvjxp34Cjlw3kSfsGHL1sKE/aN+DoZSN50r4BR3cby5P2DTqjl03rbtJpcm37Bhy9bCZP2jfg6GVzedK+AUcv/eRJ+wYcvfSXJ+0bcPSyhTxp34Cjly3lSfsGHL1sJU/aN+DoZWt50r4BR3fbyJP2DTqjl+3qbttpcm37Bhy9bC9P2jfg6GUHedK+AUcvO8qT9g04etlJnrRvwNHLzvKkfQOOXnap+3FPk2vbN+DoZVd50r4BRy+7yZP2DTi6212etG/QGb3sWXePTpNr2zfg6GUvedK+AUcve8uT9g04etlHnrRvwNHLvvKkfQOO7vaTJ+0bdEYv+/O/Ia5t34CjlwPkSfsGHL0cKE/aN+Do7iB50r5BZ/RySN2DO02ubd+Ao5dD5Un7Bhy9HCZP2jfg6OVwedK+AUcvR8iT9g04ujtSnrRv0Bm9HCVP2jfg6OVoedK+AUcvx8iT9g04ujtWnrRv0Bm9HF/3OHFt+wYcvZwgT9o34OjlRHnSvgFHLyfJk/YNOHoZIE/aN+Do5WR50r4BRy8D5Un7Bhy9DJIn7Rtw9DJYnrRvwNHdKfKkfYPO6OXUukPEte0bcPRymjxp34Cjl9PlSfsGHL2cIU/aN+Do5Ux50r4BRy9nyZP2DTh6OVuetG/A0cs58qR9A45ezpUn7RtwdHeePGnfoDN6uaDu+eLa9g04erlQnrRvwNHLRfKkfQOOXi6WJ+0bcPRyiTxp34Cjl0vlSfsGHL1cJk/aN+Do5XJ50r4BRy9XyJP2DTi6u1KetG/QGb1cXfcqcW37Bhy9XCNP2jfg6OVaedK+AUcv18mT9g04erlenrRvwNHLDfKkfQOOXm6UJ+0bcPRykzxp34Cjl5vlSfsGHN3dIk/aN26te1vdB+s+IK5t34C7ve5D8qR9A+6Oug/Lk/YNuDvrPiJP2jfg7qr7qDxp34C7u+5j8qR9A+6euo/Lk/YNuHvrPiFP2jfg7qv7pDxp34C7v+5T8qR9g87o5Zm6T4tr2zfg6OVZedK+AUcvz8mT9g04enlenrRvwNHLC/KkfQOOXl6UJ+0bcPTykjxp34Cjl5flSfsGHL28Ik/aN+Do7lV50r5BZ/Tyet3XxLXtG3D08oY8ad+Ao5c35Un7Bhy9vCVP2jfg6OVtedK+AUcv78iT9g04enlXnrRvwNHLe/KkfQOOXt6XJ+0bcHT3gTxp36Azevmo7ofi2vYNOHr5WJ60b8DRyyfypH0Djl4+lSftG3D08pk8ad+Ao5fP5Un7Bhy9DOX7e5pc274BRy9fyJP2DTh6GSZP2jfg6O5LedK+QWf08nXdr8S17Rtw9PKNPGnfgKOXb+VJ+wYcvXwnT9o34Ojle3nSvgFHdz/Ik/YNOqOXH/GKa9s34OjlJ3nSvgFHLz/Lk/YNOLr7RZ60b9AZvfxW91dxbfsGHL38Lk/aN+Do5Q950r4BRy9/ypP2DTh6+UuetG/A0d3f8qR9g87o5R950r4BRy//ypP2DTh66dVtetK+AUd3vbtNT9o36Ixehi9uuG6Ta9s34OhlhG7Tk/YNOHoZsdv0pH0Djl76dJuetG/A0UvfbtOT9g04ehmp2/SkfQOOXkbuNj1p34Cjl1G6TU/aN+DoZdRu05P2DTi6G02etG8Mp166dTvdJte2bwyvXkaXJ+0bI6iXMeRJ+8aI6mVMedK+0Ue9jCVP2jf6qpex5Un7Bhy9jCNP2jfg6GVcedK+AUcv48mT9g04uhtfnrRv0Bm9TFh3gm6Ta9s34OhlInnSvgFHLxPLk/YNOHrpkSftG3D0Mok8ad+Ao5dJ5Un7Bhy9TCZP2jfg6GVyedK+AUcvU8iT9g04uptSnrRv0Bm9TF13qm6Ta9s34OhlGnnSvgFHL9PKk/YNOHqZTp60b8DRy/TypH0Djl5mkCftG3D0MqM8ad+Ao5eZ5En7Bhy9zCxP2jfg6G4WedK+MWs9N1vdBesu0G1ybfsG3Ox1F5In7Rtwc9RdWJ60b8DNWXcRedK+ATdX3UXlSfsG3Nx1F5Mn7Rtw89RdXJ60b8DNW3cJedK+ATdf3SXlSfsG3Px1l5In7Rt0Ri/L1F262+Ta9g04ellWnrRvwNHLcvKkfQOOXpaXJ+0bcPSygjxp34CjlxXlSfsGHL2sJE/aN+DoZWV50r4BRy+ryJP2DTi6W1WetG/QGb2sXne1bpNr2zfg6GUNedK+AUcva8qT9g04ellLnrRvwNHL2vKkfQOOXtaRJ+0bcPSyrjxp34Cjl/XkSfsGHL2sL0/aN+DobgN50r5BZ/SyUd0Nu02ubd+Ao5eN5Un7Bhy9bCJP2jfg6GVTedK+AUcvm8mT9g04etlcnrRvwNFLv7qf9zS5tn0Djl76y5P2DTh62UKetG/A0d2W8qR9g87oZeu6W3WbXNu+AUcv28iT9g04etlWnrRvwNHLdvKkfQOOXraXJ+0bcHS3gzxp36Azetmx7lBxbftGP/Wykzxp3+ivXnaWJ+0bcHS3izxp39hKvexWd9duk2vbN7ZWL7vLk/aNbdTLHvKkfWNb9bKnPGnf2E697CVP2jfg6G5vedK+QWf0so88ad+Ao5d95Un7Bhy97CdP2jfg6G5/edK+QWf0cmDdA7pNrm3fgKOXg+RJ+wYcvRwsT9o34OjlEHnSvgFHL4fKk/YNOHo5TJ60b8DRy+HypH0Djl6OkCftG3D0cqQ8ad+Ao7uj5En7Bp3RyzF1jxbXtm/A0cux8qR9A45ejpMn7Rtw9HK8PGnfgKOXE+RJ+wYcvZwoT9o34OjlJHnSvgFHLwPkSfsGHL2cLE/aN+DobqA8ad+gM3oZXHeQuLZ9A45eTpEn7Rtw9DJEnrRvwNHLqfKkfQOOXk6TJ+0bcPRyujxp34CjlzPkSfsGHL2cKU/aN+Do5Sx50r4BR3dny5P2DTqjl3PrniOubd+Ao5fz5En7Bhy9nC9P2jfg6OUCedK+AUcvF8qT9g04erlInrRvwNHLxfKkfQOOXi6RJ+0bcPRyqTxp34Cju8vkSfvG5XWvqHtz3ZvEte0bcFfWvUWetG/AXVX3VnnSvgF3dd3b5En7Btw1dW+XJ+0bcNfWvUOetG/AXVf3TnnSvgF3fd275En7BtwNde+WJ+0bcDfWvUeetG/QGb3cV/decW37Bhy93C9P2jfg6OUBedK+AUcvD8qT9g04enlInrRvwNHLw/KkfQOOXh6RJ+0bcPTyqDxp34Cjl8fkSfsGHN09Lk/aN+iMXp6s+4S4tn0Djl6ekiftG3D08rQ8ad+Ao5dn5En7Bhy9PCtP2jfg6OU5edK+AUcvz8uT9g04enlBnrRvwNHLi/KkfQOO7l6SJ+0bdEYvr9R9WVzbvgFHL6/Kk/YNOHp5TZ60b8DRy+vypH0Djl7ekCftG3D08kVP05P2DTh6eavum+La9g04enlbnrRvwNHLO/KkfQOO7t6VJ+0bdEYv79d9T1zbvgFHLx/Ik/YNOHr5UJ60b8DRy0fypH0Djl4+liftG3B094k8ad+gM3r5tO4wcW37Bhy9fCZP2jfg6OVzedK+AUd3Q+VJ+wad0cswfk9xbfsGHL18KU/aN+Do5St50r4BRy9fy5P2DTh6+UaetG/A0d238qR9g87o5Tt50r4BRy/fy5P2DTh6+UGetG/A0d2P8qR9g87o5ee6P4lr2zfg6OUXedK+AUcvv8qT9g04evlNnrRvwNHL7/KkfQOOXv6QJ+0bcPTypzxp34Cjl7/kSfsGHL38LU/aN+Do7h950r5BZ/TSa/T/zr/i2vYNOHrpPXrT8z9t6gHDeJyFmVOwZecWRltx0nufGCe2nXTMjm3bNm9s27Zt27Ztu9Md3qp753hYo2rVd15m1al/jIdd42l9+w3s87+//eseVffIukPq/l63X+f/t2+nyR1Q92h54IbW7d9peuAOrHuMPHDD6g7oND1wB9U9Vh64P+oO12l64A6ue5w8cH/WHb7T9MAdUvd4eeD+qjtCp+mBO7TuCfLA/V13xE7TA3dY3RPlgfun7kidpufw+v8RdU+ue1Ldf+v2qfej1B250+To5RR5+qiXUeWBo5dT5emrXkaTB45eTpOnn3oZKA8cvZwuT3/10pEHjl7OkGeAeunKA0cvZ8oznHrpkQeOXs6SZ3j1Mro8cPRytjxw9DKGPHB0d448cHQ3pjx0Ri/n1T23Lp3Ry9h1x+o0OXo5Xx44ehlHHjh6uUAeOHoZVx44erlQHjh6GU8eOHq5SB44ehlfHjh6uVgeOHqZQB44erlEHjh66ZUHjl4ulQeOXiaUB45eLpMHjl4mkgeO7i6XB47uJpbninp3Zd1b6t5cd5J6N2ndGepO32lyV9W9VR64yerOKA/c1XVvkwdu8rozyQN3Td3b5YGbou7M8sBdW/cOeeCmrDuLPHDX1b1THrip6s4qD9z1de+SB27qurPJA3dD3bvlgZum7uzywN1Y9x554KatO4c8cDfVvVceuOnqzikPndHL/XXvq0tn9DJ33bk6TY5eHpAHjl4GyQNHLw/KA0cv88gDRy8PyQNHL/PKA0cvD8sDRy/zyQNHL4/IA0cv88sDRy+PygNHLwvIA0cvj8kDRy8LygNHL4/LA0cvC8kDR3dPyANHdwvLQ2f08lTdJ+vSGb0sWneRTpOjl6flgaOXxeSBo5dn5IGjl8XlgaOXZ+WBo5fB8sDRy3PywNHLEvLA0cvz8sDRy5LywNHLC/LA0ctS8sDRy4vywNHL0vLA0ctL8sDRyzLywNHdy/LA0d2y8tAZvbxa95W6dEYvy9ddrtPk6OU1eeDoZQV54OjldXng6GVFeeDo5Q154OhlJXng6OVNeeDoZWV54Ojlq96mB45evulteuDo5e26bw1scvSyat1VOk2OXt6RB45eVpMHjl7elQeOXlaXB47u3pMHju7WkIfO6OWDuu/XpTN6Wavump0mRy8fygNHL2vLA0cvH8kDRy/ryANHLx/LA0cv68oDRy+fyANHL+vJA0d3n8oDR3fry0Nn9PJZ3a/rPZ3RywZ1v+1tcvTyuTyrqpcN5XlHvXwhz2rqZSN54OjuS3ng6G5jed5XL1/ze9ZdU71sWneTTpOjl2/kWUu9bCbPh+rlW3nWVi+by/ORevlOnnXUyxbywNHL9/LA0cuW8sDR3Q/ywNHdVvLQGb38KA+d0cvW8sDRy0/ywNHLNvLA0cvP8sDRy7bywNHdL/LA0d128tAZvfxW99e6dEYvO9TdvtPk6GWIPHD0sqM8cPTyuzxw9LKTPHD0MlQeOHrZWR44ehkmDxy97CIPHL38IQ8cvewqDxy9/CkPHL3sJg8cvfwlDxy97C4PHL38LQ8cvewhDxzd/SMPHN3tKQ+d0Qvfi/nuTGf0snfdvTpNjl74XtxHHL3sI0/aN+DoZV950r4BRy//kSftG3D0sp88ad+Ao5f95Un7Bhy9HCBP2jfg6OVAedK+AUcvB8mT9g04ujtYnrRv0Bm9HFr3EHXWtm/A0cth8qR9A45eDpcn7Rtw9HKEPGnfgKOXI+VJ+wYcvRwlT9o34OjlaHnSvgFHL8fIk/YNOHo5Vp60b8DR3XHypH2DzujlhLrHi2vbN+Do5UR50r4BRy8nyZP2DTh6OVmetG/A0csp8qR9A45eTpUn7Rtw9HKaPGnfgKOX0+VJ+wYcvZwhT9o34OjuTHnSvnFW3bPrXlb3UnFt+wbcOXUvlyftG3Dn1r1CnrRvwJ1X90p50r4Bd37dq+RJ+wbcBXWvliftG3AX1r1GnrRvwF1U91p50r4Bd3Hd6+RJ+wbcJXWvlyftG3RGLzfWvUFc274BRy83yZP2DTh6uVmetG/A0cst8qR9A45ebpUn7Rtw9HKbPGnfgKOX2+VJ+wYcvdwhT9o34OjlTnnSvgFHd3fJk/YNOqOXe+reLa5t34Cjl3vlSfsGHL3cJ0/aN+Do5X550r4BRy8PyJP2DTh6eVCetG/A0ctD8qR9A45eHpYn7Rtw9PKIPGnfgKO7R+VJ+wad0cvjdR8T17ZvwNHLE/KkfQOOXp6UJ+0bcPTylDxp34Cjl6flSfsGHL08I0/aN+Do5dm63/U2ubZ9A45enpMn7Rtw9PK8PGnfgKO7F+RJ+wad0ctLdV8U17ZvwNHLy/KkfQOOXl6RJ+0bcPTyqjxp34Cjl9fkSfsGHN29Lk/aN+iMXt6o+31vk2vbN+Do5U150r4BRy9vyZP2DTi6e1uetG/QGb28W/cdcW37Bhy9vCdP2jfg6OV9edK+AUcvH8iT9g04evlQnrRvwNHdR/KkfYPO6OVjedK+AUcvn8iT9g04evlUnrRvwNHdZ/KkfYPO6OWLup+La9s34OjlS3nSvgFHL1/Jk/YNOHr5Wp60b8DRyzfypH0Djl6+lSftG3D08p08ad+Ao5fv5Un7Bhy9/CBP2jfg6O5HedK+QWf08nPdn8S17Rtw9PKLPGnfgKOXX+VJ+wYcvfwmT9o34OhliDxp34Cjl9/lSfsGHL0MlSftG3D0MkyetG/A0csf8qR9A47u/pQn7Rt0Ri9/1/1LXNu+AUcv/8iT9g04evlXnrRvwNFLn27Tk/YNOHrp22160r4BRy/9uk1P2jfg6KV/t+lJ+wYcvQzoNj1p34Cjl+G6TU/aN+Dobvhu05P2DTqjlxGLG6Hb5Nr2DTh6Ganb9KR9A45eRu42PWnfgKOXUbpNT9o3+qiXUeVJ+0Zf9TKaPGnf6KdeBsqT9o3+6qUjT9o3BqiXrjxp34Cjux550r4xer0bo+5EdSfsNrm2fQNuzLoTy5P2Dbix6k4iT9o34MauO6k8ad+AG6fuZPKkfQNu3LqTy5P2Dbjx6k4hT9o34MavO6U8ad+Am6DuVPKkfQOut+7U8qR9g87oZdq603SbXNu+AUcv08mT9g04eplenrRvwNHLDPKkfQOOXmaUJ+0bcPQykzxp34Cjl5nlSfsGHL3MIk/aN+DoZVZ50r4BR3ezyZP2DTqjlznqzt5tcm37Bhy9zClP2jfg6GUuedK+AUcvc8uT9g04ehkkT9o34OhlHnnSvgFHL/PKk/YNOHqZT560b8DRy/zypH0Dju4WkCftG3RGLwvVXbDb5Nr2DTh6WVietG/A0csi8qR9A45eFpUn7Rtw9LKYPGnfgKOXxeVJ+wYcvQyu+0Nvk2vbN+DoZQl50r4BRy9LypP2DTi6W0qetG/QGb0sU3fpbpNr2zfg6GVZedK+AUcvy8mT9g04ellenrRvwNHLCvKkfQOO7n7sbXrSvkFn9LJS3RW7Ta5t3xisXlaWJ+0bS6iXVeRJ+wYc3a0qT9o3llYvq9ddrdvk2vaNZdTLGvKkfWNZ9bKmPGnfWE69rCVP2jfg6GVtedK+AUd368iT9g06o5d1u01P2jfg6GU9edK+AUcv68uT9g04uttAnrRv0Bm9bFR3w26Ta9s34OhlY3nSvgFHL5vIk/YNOHrZVJ60b8DRy2bypH0Djl42lyftG3D0soU8ad+Ao5ct5Un7Bhy9bCVP2jfg6G5redK+QWf0sm3dbbpNrm3fgKOX7eRJ+wYcvWwvT9o34OhlB3nSvgFHLzvKk/YNOHrZSZ60b8DRy87ypH0Djl52kSftG3D0sqs8ad+Ao7vd5En7Bp3Ryx51d+82ubZ9A45e9pQn7Rtw9LKXPGnfgKOXveVJ+wYcvewjT9o34OhlX3nSvgFHL/+RJ+0bcPSynzxp34Cjl/3lSfsGHN0dIE/aN+iMXg6qe2C3ybXtG3D0crA8ad+Ao5dD5En7Bhy9HCpP2jfg6OUwedK+AUcvh8uT9g04ejlCnrRvwNHLkfKkfQOOXo6SJ+0bcHR3tDxp3zim7rF1z6h7uri2fQPuuLpnypP2Dbjj654lT9o34E6oe7Y8ad+AO7HuOfKkfQPupLrnypP2DbiT654nT9o34E6pe748ad+AO7XuBfKkfQPutLoXypP2DTqjl4vrXiSubd+Ao5dL5En7Bhy9XCpP2jfg6OUyedK+AUcvl8uT9g04erlCnrRvwNHLlfKkfQOOXq6SJ+0bcPRytTxp34Cju2vkSfsGndHLdXWvFde2b8DRy/XypH0Djl5ukCftG3D0cqM8ad+Ao5eb5En7Bhy93CxP2jfg6OUWedK+AUcvt8qT9g04erlNnrRvwNHd7fKkfYPO6OXOuneIa9s34OjlLnnSvgFHL3fLk/YNOHq5R560b8DRy73ypH0Djl7ukyftG3D0cn/dn3qbXNu+AUcvD8iT9g04enlQnrRvwNHdQ/KkfYPO6OWRug+La9s34OjlUXnSvgFHL4/Jk/YNOHp5XJ60b8DRyxPypH0Dju5+7m160r5BZ/TyVN0n1VnbvgFHL0/Lk/YNOHp5Rp60b8DR3bPypH2Dzujl+brPiWvbN+Do5QV50r4BRy8vypP2DTh6eUmetG/A0cvL8qR9A47uXpEn7Rt0Ri+vdpuetG/A0ctr8qR9A45eXpcn7RtwdPeGPGnfoDN6eavum+La9g04enlbnrRvwNHLO/KkfQOOXt6VJ+0bcPTynjxp34Cjl/flSfsGHL18IE/aN+Do5UN50r4BRy8fyZP2DTi6+1ietG/QGb18WvcTcW37Bhy9fCZP2jfg6OVzedK+AUcvX8iT9g04evlSnrRvwNHLV/KkfQOOXr6WJ+0bcPTyjTxp34Cjl2/lSfsGHN19J0/aN+iMXn6o+724tn0Djl5+lCftG3D08pM8ad+Ao5ef5Un7Bhy9/CJP2jfg6OVXedK+AUcvv8mT9g04ehkiT9o34Ojld3nSvgFHd0PlSfsGndHLH3WHiWvbN+Do5U950r4BRy9/yZP2DTh6+VuetG/A0cs/8qR9A45e/pUn7Rtw9NKnp+lJ+wYcvfTtaXrSvgFHL/16mp60b8DRXf+epiftGwPq3XB1u3U7PU2ubd+AG75ujzxp34Aboe7o8qR9A27EumPIk/YNuJHqjilP2jfgRq47ljxp34Abpe7Y8qR9A27UuuPIk/YNuNHqjitP2jfgBtYdT560b9AZvUxQd/yeJte2b8DRS688ad+Ao5cJ5Un7Bhy9TCRP2jfg6GViedK+AUcvk8iT9g04eplUnrRvwNHLZPKkfQOOXiaXJ+0bcHQ3hTxp36Azepmq7pQ9Ta5t34Cjl6nlSfsGHL1MI0/aN+DoZVp50r4BRy/TyZP2DTh6mV6etG/A0csM8qR9A45eZpQn7Rtw9DKTPGnfgKO7meVJ+wad0cusdWfpaXJt+wYcvcwmT9o34OhldnnSvgFHL3PIk/YNOHqZU560b8DRy1zypH0Djl7mrvtLb5Nr2zfg6GWQPGnfgKOXeeRJ+wYc3c0rT9o36Ixe5q87X0+Ta9s34OhlAXnSvgFHLwvKk/YNOHpZSJ60b8DRy8LypH0Dju4WkSftG3RGL4vW/VVc274xt3pZTJ60bwxSL4vLk/YNOLobLE/aN+ZTL0vWXaKnybXtG/Orl6XkSfvGAuplaXnSvrGgellGnrRvLKRelpUn7RtwdLecPGnfoDN6WV6etG/A0csK8qR9A45eVpQn7RtwdLeSPGnfoDN6WaXuyj1Nrm3fgKOXVeVJ+wYcvawmT9o34OhldXnSvgFHL2vIk/YNOHpZU560b8DRy1rypH0Djl7WliftG3D0so48ad+Ao7t15Un7Bp3Ry/p11+tpcm37Bhy9bCBP2jfg6GVDedK+AUcvG8mT9g04etlYnrRvwNHLJvKkfQOOXjaVJ+0bcPSymTxp34Cjl83lSfsGHN1tIU/aN+iMXraqu2VPk2vbN+DoZWt50r4BRy/byJP2DTh62Vae/wK0OiH8eJyFmVOwbecWBo9j7LXi7JjnxLZt27Zt27Zt27Zt2zpxcqtuRj/Mrpr1rZdRtervfuqn+X02ap///z6v+1PdH+uu3/Pf3aDu1nW36mlyX9T9WR64DetuIw/cl3V/kQduo7rbygP3Vd2h8sBtXHc7eeC+rvurPHCb1N1eHrhv6v4mD9ymdXeQ59t6913dP+r+Xnezerd53Z3q7tjT5L6v+6c8cFvU3VkeuB/q/iUP3JZ1d5EHjl7+lgeOXnaVB45e/pEHjl52kweOXv6VB45edpcHjl769DQ9cPSyhzxw9NK3p+mBo5c95RmqXvr1ND1w9LKXPHB017+n6YGju73lGVB3YN1R645Sd5+6+9Y9ou7h4gbV7ZEHbr+6R8oDN0zdjjxw+9c9Sh64Yet25YE7oO7R8sANV3c0eeAOrHuMPHDD1x1dHriD6h4rD9wIdceQB+7gusfJAzdi3THlgTuk7vHywI1Udyx54A6te4I8cCPXHVseuMPqnigPndHLuHXHUWf0cnLdk8TRS688cPRyijxw9DKePHD0cqo8cPQyvjxw9HKaPHD0MoE8cPRyujxw9DKhPHD0coY8cPQykTxw9HKmPHD0MrE8cPRyljxw9DKJPHD0crY8cHQ3qTxwdHeOPHRGL5PXnUyd0ct5dc8VRy9TyANHL+fLA0cvU8oDRy8XyANHL4PlgaOXC+WBo5ch8sDRy0XywNHLVPLA0cvF8sDRy9TywNHLJfLA0cs08sDRy6XywNHLtPLA0ctl8sDR3XTywNHd5fLQGb3MUHd6dUYvV9a9Qhy9zCgPHL1cJQ8cvcwkDxy9XC0PHL3MLA8cvVwjDxy9zCIPHL1cKw8cvcwqDxy9XCcPHL3MVven3iZHL9fX/aW3ydHL7PLA0csN8sDRyxzywNHLjfLA0d2c8sDR3U3y0Bm9zF13LnVGL7fUvVkcvcwjDxy93CoPHL3MKw8cvdwmDxy9zCcPHL3cLg8cvcwvDxy93CEPHN0tIA8c3d0pD53Ry4J1f67/6Yxe7qo7VBy9LCQPHL3cLQ8cvSwsDxy93CMPHN0tIg8c3d0rD53Ry2J1F1Vn9HJ/3fvE0cvi8sDRywPywNHLEvLA0cuD8sDRy5LywNHLQ/LA0ctS8sDRy8PywNHd0vLA0d0j8tAZvSwjD53Ry6PywNHLsvLA0ctj8sDRy3LywNHL4/LA0d3y8sDR3RPy0Bm9rFh3BXVGL0/VfVIcvawkDxy9PC0PHL2sLA8cvTwjDxy9rCIPHL08Kw8cvawqDxy9PCcPHL2sJg8cvTwvDxy9rC4PHL28IA8cvawhDxy9vCgPHL2sKQ8cvbwkDxzdrSUPHN29LA+d0cs6dddWZ/Tyat1XxNHLuvLA0ctr8sDRy3rywNHL6/LA0cv68sDRyxvywNHLBvLA0cub8sDRy4bywNHLW/LA0ctG8sDRy9vywNHLxvLA0cs78sDRyybywNHLu/LA0d2m8sDR3Xvy0Bm98L2Y7850Ri8f1H1fHL1sIQ8cvXwoDxy9bCkPHL18JA8cvWwlDxy9fCxP2jfg6OUTedK+AUcvn8qT9g04evlMnrRvwNHL5/KkfQOOXr6QJ+0bcHT3pTxp36Azevm67lfi2vYNOHr5Rp60b8DRy7fypH0Djl6+kyftG3D08r08ad+Ao5cf5En7Bhy9/ChP2jfg6OUnedK+AUcvP8uT9g04uvtFnrRvDK37a91+nf9u306Ta9s34H6r27/T9KR9A+73ugM6TU/aN+D+qDuw0/SkfQPuz7qDOk1P2jfg/qo7TKfpSfsG3N91h+00PWnfgPun7nCdpiftG3D/1h2+0/SkfQOuT70fodP0pH2jr3oZqe6InSbXtm/0Uy8jy5P2jf7qZRR50r4xQL2MKk/aNwaqlx550r4xSL105En7xjDqpStP2jfg6GU0edK+AUcvo8uT9g04uhtDnrRv0Bm9jFV3zE6Ta9s34OhlbHnSvgFHL+PIk/YNOHoZV560b8DRS688ad+Ao5fx5En7Bhy9jC9P2jfg6GUCedK+AUcvE8qT9g04uptInrRv0Bm9TFJ34k6Ta9s34OhlUnnSvgFHL5PJk/YNOHqZXJ60b8DRyxTypH0Djl6mlCftG3D0Mrjur71Nrm3fgKOXIfKkfQOOXqaSJ+0bcHQ3tTxp36Azepm27jSdJte2b8DRy3TypH0Djl6mlyftG3D0MoM8ad+Ao5cZ5Un7BhzdzSRP2jfojF5mrvubuLZ9Y7B6mUWetG8MUS+zypP2DTi6m02etG9Mo17mqDt7p8m17RvTqpc55Un7xnTqZS550r4xvXqZW560b8ygXuaRJ+0bcHQ3rzxp36AzeplPnrRvwNHL/PKkfQOOXhaQJ+0bcHS3oDxp36Azelm47kKdJte2b8DRyyLypH0Djl4WlSftG3D0spg8ad+Ao5fF5Un7Bhy9LCFP2jfg6GVJedK+AUcvS8mT9g04ellanrRvwNHdMvKkfYPO6GW5ust2mlzbvgFHL8vLk/YNOHpZQZ60b8DRy4rypH0Djl5WkiftG3D0srI8ad+Ao5dV5En7Bhy9rCpP2jfg6GU1edK+AUd3q8uT9g06o5c1667RaXJt+wYcvawlT9o34OhlbXnSvgFHL+vIk/YNOHpZV560b8DRy3rypH0Djl7WlyftG3D0soE8ad+Ao5cN5Un7BhzdbSRP2jfojF42qbtxp8m17Rtw9LKpPGnfgKOXzeRJ+wYcvWwuT9o34OhlC3nSvgFHL1vKk/YNOHrZSp60b8DRy9bypH0Djl62kSftG3B0t608ad/Yru72dfequ2enybXtG3A71N1bnrRvwO1Ydx950r4Bt1PdfeVJ+wbcznX3kyftG3C71N1fnrRvwO1a9wB50r4Bt1vdA+VJ+wbc7nUPkiftG3B71D1YnrRv0Bm9HFr3EHFt+wYcvRwmT9o34OjlcHnSvgFHL0fIk/YNOHo5Up60b8DRy1HypH0Djl6OliftG3D0cow8ad+Ao5dj5Un7BhzdHSdP2jfojF5OqHu8uLZ9A45eTpQn7Rtw9HKSPGnfgKOXk+VJ+wYcvZwiT9o34OjlVHnSvgFHL6fJk/YNOHo5XZ60b8DRyxnypH0Dju7OlCftG3RGL2fXPUtc274BRy/nyJP2DTh6OVeetG/A0ct58qR9A45ezpcn7Rtw9PJ7b9OT9g04ermw7gXi2vYNOHq5SJ60b8DRy8XypH0Dju4ukSftG3RGL5fVvVRc274BRy+Xy5P2DTh6uUKetG/A0cuV8qR9A45erpIn7RtwdHe1PGnfoDN6uabuH+La9g04erlWnrRvwNHLdfKkfQOO7q6XJ+0bdEYvN9a9QVzbvgFHLzfJk/YNOHq5WZ60b8DRyy3ypH0Djl5ulSftG3B0d5s8ad+gM3q5XZ60b8DRyx3ypH0Djl7ulCftG3B0d5c8ad+gM3q5p+7d4tr2DTh6uVeetG/A0ct98qR9A45e7pcn7Rtw9PKAPGnfgKOXB+VJ+wYcvTwkT9o34OjlYXnSvgFHL4/Ik/YNOLp7VJ60b9AZvTxe9zFxbfsGHL08IU/aN+Do5Ul50r4BRy9PyZP2DTh6eVqetG/A0csz8qR9A45enpUn7Rtw9PKcPGnfgKOX5+VJ+wYc3b0gT9o36IxeXqr7ori2fQOOXl6WJ+0bcPTyijxp34Cjl1flSfsGHL28Jk/aN+Do5XV50r4BRy9vyJP2DTh6eVOetG/A0ctb8qR9A47u3pYn7Rt0Ri/v1n1HXNu+AUcv78mT9g04enlfnrRvwNHLB/KkfQOOXj6UJ+0bcPTykTxp34Cjl4/lSfsGHL18Ik/aN+Do5VN50r4BR3efyZP2jc/rflH357o/iWvbN+C+rPuLPGnfgPuq7lB50r4B93XdX+VJ+wbcN3V/kyftG3Df1v1dnrRvwH1X9w950r4B933dP+VJ+wbcD3X/kiftG3A/1v1bnrRv0Bm9/Fv3H3Ft+wYcvfTpNj1p34Cjl77dpiftG3D00q/b9KR9A45e+nebnrRvwNHLgG7Tk/YNOHoZ2G160r4BRy+Duk1P2jfg6GWYbtOT9g04uhu22/SkfYPO6GX44obrNrm2fQOOXkboNj1p3+ijXkaUJ+0bfdXLSPKkfaOfehlZnrRv9Fcvo8iT9o0B6mVUedK+MVC99MiT9o1B6qUjT9o34OiuK0/aN+iMXkavO1q3ybXtG3D0MoY8ad+Ao5cx5Un7Bhy9jCVP2jfg6GVsedK+AUcvf/Y2PWnfgKOXceuO021ybfsGHL30ypP2DTh6GU+etG/A0d348qR9g87oZcK6E3SbXNu+AUcvE8mT9g04eplYnrRvwNHLJPKkfQOOXiaVJ+0bcHQ3mTxp36Azepm87l+9Ta5t3xhXvUwhT9o3etXLlPKkfQOO7gbLk/aNCdTLVHWHdJtc274xoXqZWp60b0ykXqaRJ+0bE6uXaeVJ+wYcvUwnT9o34OhuennSvkFn9DKDPGnfgKOXGeVJ+wYcvcwkT9o34OhuZnnSvkFn9DJr3Vm6Ta5t34Cjl9nkSfsGHL3MLk/aN+DoZQ550r4BRy9zypP2DTh6mUuetG/A0cvc8qR9A45e5pEn7Rtw9DKvPGnfgKO7+eRJ+wad0csCdefvNrm2fQOOXhaUJ+0bcPSykDxp34Cjl4XlSfsGHL0sIk/aN+DoZVF50r4BRy+LyZP2DTh6WVyetG/A0csS8qR9A47ulpQn7Rt0Ri9L112q2+Ta9g04ellGnrRvwNHLsvKkfQOOXpaTJ+0bcPSyvDxp34CjlxXkSfsGHL2sKE/aN+DoZSV50r4BRy8ry5P2DTi6W0WetG/QGb2sVnfVbpNr2zfg6GV1edK+AUcva8iT9g04ellTnrRvwNHLWvKkfQOOXtaWJ+0bcPSyjjxp34Cjl3XlSfsGHL2sJ0/aN+Dobn150r6xQb3bsO42dbfuNrm2fQNuo7rbypP2DbiN624nT9o34Dapu708ad+A27TuDvKkfQNus7o7ypP2DbjN6+4kT9o34Laou7M8ad+A27LuLvKkfQNuq7q7ypP2DTqjl93r7tZtcm37Bhy97CFP2jfg6GVPedK+AUcve8mT9g04etlbnrRvwNHLPvKkfQOOXvaVJ+0bcPSynzxp34Cjl/3lSfsGHN0dIE/aN+iMXg6qe6A6a9s34OjlYHnSvgFHL4fIk/YNOHo5VJ60b8DRy2HypH0Djl4OlyftG3D0coQ8ad+Ao5cj5Un7Bhy9HCVP2jfg6O5oedK+QWf0cmzdY8S17Rtw9HKcPGnfgKOX4+VJ+wYcvZwgT9o34OjlRHnSvgFHLyfJk/YNOHo5WZ60b8DRyynypH0Djl5OlSftG3B0d5o8ad+gM3o5o+7p4tr2DTh6OVOetG/A0ctZ8qR9A45ezpYn7Rtw9HKOPGnfgKOXc+VJ+wYcvZwnT9o34OjlfHnSvgFHLxfIk/YNOLq7UJ60b9AZvVxc9yJxbfsGHL1cIk/aN+Do5VJ50r4BRy+XyZP2DTh6uVyetG/A0csV8qR9A45erpQn7Rtw9HKVPGnfgKOXq+VJ+wYc3V0jT9o36Ixerqt7rbi2fQOOXq6XJ+0bcPRygzxp34CjlxvlSfsGHL3cJE/aN+Do5WZ50r4BRy+3yJP2DTh6uVWetG/A0ctt8qR9A47ubpcn7Rt0Ri931r1DXNu+AUcvd8mT9g04erlbnrRvwNHLPfKkfQOOXu6VJ+0bcPRynzxp34Cjl/vlSfsGHL08IE/aN+Do5UF50r4BR3cPyZP2DTqjl0fqPiyubd+Ao5dH5Un7Bhy9PCZP2jfg6OVxedK+AUcvT8iT9g04enlSnrRvwNHLU/KkfQOOXp6WJ+0bcPTyjDxp34Cju2flSfsGndHL83WfE9e2b8DRywvypH0Djl5elCftG3D08pI8ad+Ao5eX5Un7Bhy9vCLP/wAKZtzSeJyFmUMQZdkWBcvVVr332rZt23b/tm3btm3btrurbdu28SP+3zm4GXFjncmenMxRztaKQ/r8761Ud526a9d9su7Quq/UfVncynXXlQfuqbqvygO3St315IF7uu5r8sCtWnd9eeCeqfu6PBvU3bDuNnW3rvtG3TfrflL3Y3Eb1d1WHri36n4qD9zGdbeTB+7tup/JA7dJ3e3lgXun7ufywG1adwd54N6t+4U8cJvV3VEeuPfqfikP3OZ1d5IH7v26X8kDt0XdneWB+6Du1/LAbVl3F3ngPqz7jTxwW9XdVR64j+p+Kw+d0cvudXdTZ/Tyfd3vxNHLHvLA0csP8sDRy57ywNHLj/LA0cte8sDRy0/ywNHL3vLA0cvP8sDRyz7ywNHLL/LA0cu+8sDRy6/ywNHLfvLA0ctv8sDRy/7ywNHL7/LA0d0B8sDR3R/y0Bm9HFT3QHVGL3/V/VMcvRwsDxy9/C0PHL0cIg8cvfwjDxy9HCoPHL38Kw8cvRwmDxy99Ok0PXD0crg8cPTSt9P0wNHLEfLA0Uu/TtMDRy9HygNHL/07TQ8cvRwlDxy9DOg0PXB0d7Q8cHQ3sNP00Bm9HFv3GHVGL4OLG9RpcvRynDxw9DJMp+mBo5fj5YGjl2E7TQ8cvZwgDxy9DNdpeuDo5UR54Ohl+E7TA0cvJ8nTR72MIA8cvZwsT1/1MqI8cPRyijz91MtI8sDRy6ny9FcvI8sDR3enyQNHd6PIQ2f0ckbd0+sOUi+j1R210+To5Ux5BquXIfLA0ctZ8sDRS0ceOHo5Wx44eunKA0cv58gDRy89eeDo5Vx54OhldHng6OU8eeDoZQx54OjlfHng6GVMeeDo5QJ54OhlLHng6O5CeeDobmx56IxeLq57UV06o5dx647TaXL0cok8cPQynjxw9HKpPHD0Mr48cPRymTxw9DKBPHD0crk8cPQyoTxw9HKFPHD0MpE8cPRypTxw9DKxPHD0cpU8cPQyiTxw9HK1PHD0Mqk8cHR3jTxwdDeZPHRGL9fVvbYundHLFHUn7zQ5erleHjh6mVIeOHq5QR44eplKHjh6uVEeOHqZWh44erlJHjh6mUYeOHq5WR44eplWHjh6uUUeOHqZTh44erlVHjh6mV4eOHq5TR44eplBHji6u10eOLqbUR46o5c7695Rl87oZea6M3WaHL3cJQ8cvcwiDxy93C0PHL3MKg8cvdwjDxy9zCYPHL3cKw8cvcwuDxy93CcPHL3MIQ8cvdwvDxy9zCkPHL08IA8cvcwlDxy9PCgPHL3MLQ8c3T0kDxzdzSMPndHLI3Ufrktn9DJf3Xk7TY5eHpUHjl7mlweOXh6TB45eFpAHjl4elweOXhaUB45enpAHjl4WkgeOXp6UB45eFpYHjl6GygNHL4vIA0cvT8kDRy+LygNHL0/LA0cvi8kDR3fPyANHd4vLQ2f08lzdZ+vSGb0sWXeJTpOjl+flgaOXpeSBo5cX5IGjl6XlgaOXF+WBo5dl5IGjl5fkgaOXZeWBo5eX5YGjl+XkSfsGHL0sL0/aN+DoZQV50r4BRy8rypP2DTi6W0metG+sXP9Wqbte3XU7Ta5t34Bbte768qR9A261uhvIk/YNuNXrbihP2jfg1qi7kTxp34Bbs+7G8qR9A26tupvIk/YNuP/U3VSetG/ArV13M3nSvgG3Tt3N5Un7Bp3Ry5Z1t+g0ubZ9A45etpIn7Rtw9LK1PGnfgKOXbeRJ+wYcvWwrT9o34OhlO3nSvgFHL9vLk/YNOHrZQZ60b8DRy47ypH0Dju52kiftG3RGL7vU3bnT5Nr2DTh62VWetG/A0ctu8qR9A45edpcn7Rtw9LKHPGnfgKOXPeVJ+wYcvewlT9o34Ohlb3nSvgFHL/vIk/YNOLrbV560b9AZvexfd79Ok2vbN+Do5QB50r4BRy8HypP2DTh6OUietG/A0cvB8qR9A45eDpEn7Rtw9HKoPGnfgKOXw+RJ+wYcvRwuT9o34OjuCHnSvkFn9HJU3SPFte0bcPRytDxp34Cjl2PkSfsGHL0cK0/aN+Do5Th50r4BRy/Hy5P2DTh6OUGetG/A0cuJ8qR9A45eTpIn7RtwdHeyPGnfoDN6ObXuKeLa9g04ejlNnrRvwNHL6fKkfQOOXs6QJ+0bcPRypjxp34Cjl7PkSfsGHL2cLU/aN+Do5Rx50r4BRy/nypP2DTi6O0+etG/QGb1cUPd8cW37Bhy9XChP2jfg6OUiedK+AUcvF8uT9g04erlEnrRvwNHLpfKkfQOOXi6TJ+0bcPRyuTxp34CjlyvkSfsGHN1dKU/aN+iMXq6ue5W4tn0Djl6ukSftG3D0cq08ad+Ao5fr5En7Bhy9XC9P2jfg6OUGedK+AUcvN8qT9g04erlJnrRvwNHLzfKkfQOO7m6RJ+0bdEYvt9W9VVzbvgFHL7fLk/YNOHq5Q560b8DRy53ypH0Djl7ukiftG3D0crc8ad+Ao5d75En7Bhy93CtP2jfg6OU+edK+AUd398uT9g06o5cH6z4grm3fgKOXh+RJ+wYcvTwsT9o34OjlEXnSvgFHL4/Kk/YNOHp5TJ60b8DRy+PypH0Djl6ekCftG3D08qQ8ad+Ao7uh8qR946m6T9d9re6r4tr2Dbhn6r4uT9o34J6t+4Y8ad+Ae67um/KkfQPu+bpvyZP2DbgX6r4tT9o34F6s+448ad+Ae6nuu/KkfQPu5brvyZP2DbhX6r4vT9o36IxePqz7gbi2fQOOXj6SJ+0bcPTysTxp34Cjl0/kSfsGHL18Kk/aN+Do5TN50r4BRy+fy5P2DTh6+UKetG/A0cuX8qR9A47uvpIn7Rt0Ri/f1P1aXNu+AUcv38qT9g04evlOnrRvwNHL9/KkfQOOXn6QJ+0bcPTyozxp34Cjl5/kSfsGHL38LE/aN+Do5Rd50r4BR3e/ypP2DTqjl9/r/iaubd+Ao5c/5En7Bhy9/ClP2jfg6OUvedK+AUcvf8uT9g04evlHnrRvwNHLv/KkfQOOXvp0m560b8DRS99u05P2DTi669dtetK+QWf0MqC4/t0m17ZvwNHLwG7Tk/YNOHoZ1G160r4BRy+Du01P2jfg6GWYbtOT9g04ehm22/SkfQOOXobrNj1p34Cjl+G7TU/aN/qolxHkSfsGHN2NKE/aN/qrl5HrjtRtcm37xgD1Moo8ad8YqF5GlSftG4PUy2jypH1jsHoZIk/aN+DopSNP2jfg6KUrT9o34OilJ0/aN+DoZXR50r4BR3djyJP2DTqjl7Hqjtltcm37Bhy9jC1P2jfg6GUcedK+AUcv48qT9g04ehlPnrRvwNHL+PKkfQOOXiaQJ+0bcPQyoTxp34Cjl4nkSfsGHN1NLE/aN+iMXiatO0m3ybXtG3D0Mpk8ad+Ao5fJ5Un7Bhy9TCFP2jfg6GVKedK+AUcvU8mT9g04eplanrRvwNHLNPKkfQOOXqaVJ+0bcHQ3nTxp36Azepmh7vTdJte2b8DRy4zypH0Djl5mkiftG3D0MrM8ad+Ao5dZ5En7Bhy9zCpP2jfg6GU2edK+AUcvs8uT9g04eplDnrRvwNHdnPKkfYPO6GXuunN1m1zbvgFHL/PIk/YNOHqZV560b8DRy3zypH0Djl7mlyftG3D0soA8ad+Ao5cF5Un7Bhy9LCRP2jfg6GVhedK+AUd3i8iT9o1F699idVesu0K3ybXtG3CL111JnrRvwC1Rd2V50r4Bt2TdVeRJ+wbcUnVXlSftG3BL111NnrRvwC1Td3V50r4Bt2zdNeRJ+wbccnXXlCftG3DL111LnrRv0Bm9rF33P90m17ZvwNHLOvKkfQOOXtaVJ+0bcPSynjxp34Cjl/XlSfsGHL1sIE/aN+DoZUN50r4BRy8byZP2DTh62VietG/A0d0m8qR9g87oZbO6m3abXNu+AUcvm8uT9g04etlCnrRvwNHLlvKkfQOOXraSJ+0bcPSytTxp34Cjl23kSfsGHL1sK0/aN+DoZTt50r4BR3fby5P2DTqjlx3r7tBtcm37Bhy97CRP2jfg6GVnedK+AUcvu8iT9g04etlVnrRvwNHLbvKkfQOOXnaXJ+0bcPSyhzxp34Cjlz3lSfsGHN3tJU/aN+iMXvapu3e3ybXtG3D0sq88ad+Ao5f95En7Bhy97C9P2jfg6OUAedK+AUcvB8qT9g04ejlInrRvwNHLwfKkfQOOXg6RJ+0bcHR3qDxp36Azejm87mHi2vYNOHo5Qp60b8DRy5HypH0Djl6OkiftG3D0crQ8ad+Ao5dj5En7Bhy9HCtP2jfg6OU4edK+AUcvx8uT9g04ujtBnrRv0Bm9nFT3RHFt+wYcvZwsT9o34OjlFHnSvgFHL6fKk/YNOHo5TZ60b8DRy+nypH0Djl7OkCftG3D0cqY8ad+Ao5ez5En7BhzdnS1P2jfojF7OrXuOuLZ9A45ezpMn7Rtw9HK+PGnfgKOXC+RJ+wYcvVwoT9o34OjlInnSvgFHLxfLk/YNOHq5RJ60b8DRy6XypH0Dju4ukyftG3RGL1fUvVxc274BRy9XypP2DTh6uUqetG/A0cvV8qR9A45erpEn7Rtw9HKtPGnfgKOX6+RJ+wYcvVwvT9o34OjlBnnSvgFHdzfKk/YNOqOXm+veJK5t34Cjl1vkSfsGHL3cKk/aN+Do5TZ50r4BRy+3y5P2DTh6uUOetG/A0cud8qR9A45e7pIn7Rtw9HK3PGnfgKO7e+RJ+8a9de+r+2TdJ8S17Rtw99cdKk/aN+AeqPuUPGnfgHuw7tPypH0D7qG6z8iT9g24h+s+K0/aN+AeqfucPGnfgHu07vPypH0D7rG6L8iT9g24x+u+KE/aN+iMXl6u+5K4tn0Djl5ekSftG3D08qo8ad+Ao5fX5En7Bhy9vC5P2jfg6OUNedK+AUcvb8qT9g04enlLnrRvwNHL2/KkfQOO7t6RJ+0bdEYv79V9V1zbvgFHL+/Lk/YNOHr5QJ60b8DRy4fypH0Djl4+kiftG3D08rE8ad+Ao5dP5En7Bhy9fCpP2jfg6OUzedK+AUd3n8uT9g06o5cv634hrm3fgKOXr+RJ+wYcvXwtT9o34OjlG3nSvgFHL9/Kk/YNOHr5Tp60b8DRy/fypH0Djl5+kCftG3D08qM8ad+Ao7uf5En7Bp3Ryy91fxbXtm/A0cuv8qR9A45efpMn7Rtw9PK7PGnfgKOXP+RJ+wYcvfwpT9o34OjlL3nSvgFHL3/Lk/YNOHr5R560b8DR3b/ypH2Dzuilb+//t0+vybXtG3D00q/X9KR9A45e+veanrRvwNHLgF7Tk/YNOHoZ2Gt60r4BRy+Dek1P2jfg6GVwr+lJ+wYcvQzTa3rSvgFHL8P2mp60b8DR3XC9piftG33Uywh1h+81ubZ9o696GVGetG/0Uy8jyZP2jf7qZWR50r4xQL2MIk/aNwaql1HlSfvGIPUymjxp3xisXobIk/YNOHrpyJP2DTi668qT9g06o5fR6/Z6Ta5t34CjlzHkSfsGHL2MKU/aN+DoZSx50r4BRy9jy5P2DTh6GUeetG/A0cu48qR9A45expMn7Rtw9DK+PGnfgKO7CeRJ+wad0ctEdSfsNbm2fQOOXiaWJ+0bcPQyiTxp34Cjl0nlSfsGHL1MJk/aN+DoZXJ50r4BRy9TyJP2DTh6mVKetG/A0ctU8qR9A47uppYn7Rt0Ri/T1p2m1+Ta9g04eplOnrRvwNHL9PKkfQOOXmaQJ+0bcPQyozxp34Cjl5nkSfsGHL3MLE/aN+DoZRZ50r4BRy+zypP2DTi6m02etG/MXv/mqLtw3YV6Ta5t34Cbs+4i8qR9A26uuovKk/YNuLnrLiZP2jfg5qm7uDxp34Cbt+4S8qR9A26+ukvKk/YNuPnrLiXPfwExojDMeJyFmVMQZGkWBrt7usdGVY1t20ZjbNu2bdu2bXt2bNu2p8cbsXvy4WbEja9eTkTFn/mUT/d7dJw+//s9VvfFui/UXbjz/7tI3aXrDuk0ucfrviQP3KJ1l5HniXr3ZN1X6r5cd7F6t3jd5eou22lyT9V9VR64JeouLw/c03VfkwduyboryAP3TN3X5YFbqu6K8sA9W/cNeeAG1l1JHrjn6r4pD9yguivLA/d83bfkgRtcdxV54OjlbXng6GVVeeDo5R154OhlNXng6O5deeDobnV56Ixe3q/7Xl06o5c1667RaXL08oE8cPSyljxw9PKhPHD0srY8cPTykTxw9LKOPHD08rE8cPSyrjxw9PKJPHD0sp48cPTyqTxw9LK+PHD08pk8cPSygTxw9PK5PHD0sqE8cHT3hTxwdLeRPHRGL1/V/bIundHLJnU37jQ5evlaHjh62VQeOHr5Rh44etlMHjh6+VYeOHrZXB44evlOHjh62UIeOHr5Xh44etlSHjh6+UEeOHrZSh44evlRHjh62VoeOHr5SR44etlGHji6+1keOLrbVh46o5df6/5Sl87oZfu623WaHL38Jg8cvewgDxy9DJUHjl52lAeOXn6XB45edpIHjl7+kAeOXnaWB45e/pQHjl52kQeOXv6SB45edpUHjl7+lgeOXnaTB45e/pEHjl52lweO7v6VB47u9pCHzuilb/3fR53Ry1519+w0OXrp12l64Ohlb3l+Uy/DdJoeOHrZR56h6qV/p+mBo5d95fldvQzoND1w9LKfPH+ol2E7TQ8cvewvz5/qZbhO0wNHLwfI85d6Gb7T9MDRy4Hy/K1eRug0PXD0cpA8/6i7ETtNDxzdHSwPndHLyHVHUmf0cmjdQ8TRyyjywNHLYfLA0cuo8sDRy+HywNHLaPLA0csR8sDRy+jywNHLkfLA0csY8sDRy1HywNHLmPLA0cvR8sDRy1jywNHLMfLA0cvY8sDRy7HywNHdOPLA0d1x8tAZvXTrdtQZvZxQ93hx9NKTB45eTpQHjl7GlQeOXk6SB45expMHjl5OlgeOXsaXB45eTpEHjl4mkAeOXk6VB45eJpQHjl5OkweOXiaSB45eTpcHjl4mlgeOXs6QB47uJpEHju7OlIfO6GWyupOqM3o5u+5Z4uhlcnng6OUceeDoZQp54OjlXHng6GVKeeDo5Tx54OhlKnng6OV8eeDoZWp54OjlAnng6GUaeeDo5UJ54OhlWnng6OUieeDoZTp54OjlYnng6G56eeDo7hJ56IxeZqw7gzqjl8vqXiqOXmaSB45eLpcHjl5mlgeOXq6QB45eZpEHjl6ulAeOXmaVB45erpIHjl5mkweOXq6WB45eZpcHjl6ukQeOXuaQB45erpUHjl7mlAeOXq6TB47u5pIHju6ul2fuuvPU5Xsx351vqHtj3Xvq3i1u3rpLyAN3U9175YGbr+6S8sDdXPc+eeDmr7uUPHC31L1fHrgF6g6UB+7Wug/IA7dg3UHywN1W90F54BaqO1geuNvrPiQPHDvFEHng7qj7sDxp34C7s+4j8qR9A+6uuv+RJ+0bdEYvj9V9VFzbvgFHL4/Lk/YNOHp5Qp60b8DRy5PypH0Djl6ekiftG3D08rQ8ad+Ao5dn5En7Bhy9PCtP2jfg6OU5edK+AUd3z8uT9g06o5cX674grm3fgKOXl+RJ+wYcvbwsT9o34OjlFXnSvgFHL6/Kk/YNOHp5TZ60b8DRy+vypH0Djl7ekCftG3D08qY8ad+Ao7u35En7Bp3Ryzt13xbXtm/A0cu78qR9A45e3pMn7Rtw9PK+PGnfgKOXD+RJ+wYcvXwoT9o34OjlI3nSvgFHLx/Lk/YNOHr5RJ60b8DR3afypH2Dzujl87qfiWvbN+Do5Qt50r4BRy9fypP2DTh6+UqetG/A0cvX8qR9A45evpEn7Rtw9PKtPGnfgKOX7+RJ+wYcvXwvT9o34OjuB3nSvkFn9PJT3R/Fte0bcPTyszxp34Cjl1/kSfsGHL38Kk/aN+Do5Td50r4BRy9D5Un7Bhy9/C5P2jfg6OUPedK+AUcvf8qT9g04uvtLnrRv0Bm9/FP3b3Ft+wYcvfwrT9o34OilT7fpSfsGHL307TY9ad+Ao5d+3aYn7Rtw9DJMt+lJ+wYcvfTvNj1p34CjlwHdpiftG3D0Mmy36Un7BhzdDddtetK+QWf0MkJxw3ebXNu+AUcvI3abnrRvwNHLSN2mJ+0bfdTLyPKkfaOvehlFnrRv9FMvo8qT9o1h1Mto8qR9o796GV2etG8MUC9jyJP2DTi6G1OetG/QGb2MXXesbpNr2zfg6GUcedK+AUcvHXnSvgFHL1150r4BRy89edK+AUcv48qT9g04ehlPnrRvwNHL+PKkfQOOXiaQJ+0bcHQ3oTxp36Azepm47kTdJte2b8DRyyTypH0Djl4mlSftG3D0Mpk8ad+Ao5fJ5Un7Bhy9TCFP2jfg6GVKedK+AUcvU8mT9g04eplanrRvwNHdNPKkfWPaejdd3TnrztFtcm37Btz0deeSJ+0bcDPUnVuetG/AzVh3HnnSvgE3U9155Un7BtzMdeeTJ+0bcLPUnV+etG/AzVp3AXnSvgE3W90F5Un7BtzsdReSJ+0bdEYvi9RduNvk2vYNOHpZVJ60b8DRy2LypH0Djl4WlyftG3D0soQ8ad+Ao5cl5Un7Bhy9LCVP2jfg6GWgPGnfgKOXQfKkfQOO7gbLk/YNOqOXpesO6Ta5tn0Djl6WkSftG3D0sqw8ad+Ao5fl5En7Bhy9LC9P2jfg6GUFedK+AUcvK8qT9g04ellJnrRvwNHLyvKkfQOO7laRJ+0bdEYvq9Vdtdvk2vYNOHpZXZ60b8DRyxrypH0Djl7WlCftG3D0spY8ad+Ao5e15Un7Bhy9rCNP2jfg6GVdedK+AUcv68mT9g04ultfnrRv0Bm9bFh3g26Ta9s34OhlI3nSvgFHLxvLk/YNOHrZRJ60b8DRy6bypH0Djl42kyftG3D0srk8ad+Ao5ct5En7Bhy9bClP2jfg6G4redK+QWf0sk3drbtNrm3fgKOXbeVJ+wYcvWwnT9o34Ohle3nSvgFHLzvIk/YNOHrZUZ60b8DRy07ypH0Djl52liftG3D0sos8ad+Ao7td5Un7Bp3Ry+51d+s2ubZ9A45e9pAn7Rtw9LKnPGnfgKOXveRJ+wYcvewtT9o34OhlH3nSvgFHL/vKk/YNOHrZT560b8DRy/7ypH0Dju4OkCftG3RGLwfVPbDb5Nr2DTh6OVietG/A0csh8qR9A45eDpUn7Rtw9HKYPGnfgKOXw+VJ+wYcvRwhT9o34OjlSHnSvgFHL0fJk/YNOLo7Wp60b9AZvRxb9xhxbfsGHL0cJ0/aN+Do5Xh50r4BRy8nyJP2DTh6OVGetG/A0ctJ8qR9A45eTpYn7Rtw9HKKPGnfgKOXU+VJ+wYc3Z0mT9o36Ixezqh7uri2fQOOXs6UJ+0bcPRyljxp34Cjl7PlSfsGHL2cI0/aN+Do5Vx50r4BRy/nyZP2DTh6OV+etG/A0csF8qR9A47uLpQn7RsX1b247nV1rxXXtm/AXVL3ennSvgF3ad0b5En7BtxldW+UJ+0bcJfXvUmetG/AXVH3ZnnSvgF3Zd1b5En7BtxVdW+VJ+0bcFfXvU2etG/AXVP3dnnSvkFn9HJn3TvEte0bcPRylzxp34Cjl7vlSfsGHL3cI0/aN+Do5V550r4BRy/3yZP2DTh6uV+etG/A0csD8qR9A45eHpQn7RtwdPeQPGnfoDN6eaTuw+La9g04evmPPGnfgKOXR+VJ+wYcvTwmT9o34OjlcXnSvgFHL0/Ik/YNOHp5Up60b8DRy1PypH0Djl6eliftG3B094w8ad+gM3p5ru6z4tr2DTh6eV6etG/A0csL8qR9A45eXpQn7Rtw9PKSPGnfgKOXl+VJ+wYcvbwiT9o34OjlVXnSvgFHL6/Jk/YNOLp7XZ60b9AZvbxZ9w1xbfsGHL28JU/aN+Do5W150r4BRy/vyJP2DTh6eVeetG/A0ct78qR9A45e3pcn7Rtw9PKBPGnfgKOXD+VJ+wYc3X0kT9o36IxePqn7sbi2fQOOXj6VJ+0bcPTymTxp34Cjl8/lSfsGHL18IU/aN+Do5Ut50r4BRy9fyZP2DTh6+VqetG/A0cs38qR9A47uvpUn7Rt0Ri/f1/1OXNu+AUcvP8iT9g04evlRnrRvwNHLT/KkfQOOXn6WJ+0bcPTyizxp34Cjl1/lSfsGHL38Jk/aN+DoZag8ad+Ao7vf5Un7Bp3Ry591/xDXtm/A0ctf8qR9A45e/pYn7Rtw9PKPPGnfgKOXf+VJ+wYcvfTpNT1p34Cjl769piftG3D00q/X9KR9A45ehuk1PWnfgKO7/r2mJ+0bdEYvwxY3oNfk2vYNOHoZrtf0pH0Djl6G7zU9ad+Ao5cRek1P2jfg6GXEXtOT9g04ehmp1/SkfaOPehlZnrRv9FUvo8iT9o1+6mVUedK+AUd3o8mT9o0B6mWMuqP3mlzbvjGsehlTnrRvDKdexpIn7Rtw9DK2PGnfgKOXceRJ+wYcvXTkSfsGHL105Un7Bhy99ORJ+wYcvYwrT9o34OhuPHnSvjF+vZug7tR1p+o1ubZ9A27CutPIk/YNuInqTitP2jfgJq47nTxp34CbpO708qR9A27SujPIk/YNuMnqzihP2jfgJq87kzxp34Cbou7M8qR9A27KurPIk/YNOqOX2erO2mtybfsGHL3MLk/aN+DoZQ550r4BRy9zypP2DTh6mUuetG/A0cvc8qR9A45e5pEn7Rtw9DKvPGnfgKOX+eRJ+wYc3c0vT9o36IxeFqy7QK/Jte0bcPSykDxp34Cjl4XlSfsGHL0sIk/aN+DoZVF50r4BRy+LyZP2DTh6WVyetG/A0csS8qR9A45elpQn7RtwdLeUPGnfoDN6GVR3YK/Jte0bcPQyWJ60b8DRyxB50r4BRy9Ly5P2DTh6WUaetG/A0cuy8qR9A45elpMn7Rtw9LK8PGnfgKOXFeRJ+wYc3a0oT9o36IxeVq67Uq/Jte0bcPSyijxp34Cjl1XlSfsGHL2sJk/aN+DoZXV50r4BRy9ryJP2DTh6WVOetG/A0cta8qR9A45e1pYn7RtwdLeOPGnfoDN6Wa/uur0m17ZvwNHL+vKkfQOOXjaQJ+0bcPSyoTxp34Cjl43kSfsGHL1sLE/aN+DoZRN50r4BRy+bypP2DTh62UyetG/A0d3m8qR9g87oZcu6W/SaXNu+AUcvW8mT9g04etlanrRvwNHLNvKkfQOOXraVJ+0bcPSynTxp34Cjl+3lSfsGHL3sIE/aN+DoZUd50r4BR3c7yZP2DTqjl13q7txrcm37Bhy97CpP2jfg6GU3edK+AUcvu8uT9g04etlDnrRvwNHLnvKkfQOOXvaSJ+0bcPSytzxp34Cjl33kSfsGHN3tK0/aN+iMXvavu1+vybXtG3D0coA8ad+Ao5cD5Un7Bhy9HCRP2jfg6OVgedK+AUcvh8iT9g04ejlUnrRvwNHLYfKkfQOOXg6XJ+0bcHR3hDxp36Azejmq7pHi2vYNOHo5Wp60b8DRyzHypH0Djl6OlSftG3D0cpw8ad+Ao5fj5Un7Bhy9nCBP2jfg6OVEedK+AUcvJ8mT9g04ujtZnrRvnFL31LoX1D1fXNu+AXda3QvlSfsG3Ol1L5In7RtwZ9S9WJ60b8CdWfcSedK+AXdW3UvlSfsG3Nl1L5Mn7Rtw59S9XJ60b8CdW/cKedK+AXde3SvlSfsGndHL1XWvEte2b8DRyzXypH0Djl6ulSftG3D0cp08ad+Ao5fr5Un7Bhy93CBP2jfg6OVGedK+AUcvN8mT9g04erlZnrRvwNHdLfL8Fw9dgIx4nIWZQ/Bm9xoGJzMT2/P9v9jOjW3btm3btm0n45nYtm3bdnKr7n17cbrq1HM27+Z0r3r1e+bo1+t/35x1F6m7cN0b695U95a6N4ubq+6i8sD1r3urPHBz111MHrgBdW+TB26euovLAzew7u3ywM1bdwl54AbVvUMeuPnqLikP3OC6d8oDN3/dpeSBG1L3LnngFqi7tDxwQ+veLQ/cgnWXkQduWN175IFbqO6y8sANr3uvPHRGL8vXXU6d0cv9de8TRy8ryANHLw/IA0cvK8oDRy8PygNHLyvJA0cvD8kDRy8rywNHLw/LA0cvq8gDRy+PyANHL6vKA0cvj8oDRy+ryQNHL4/JA0cvq8sDRy+PywNHd2vIA0d3T8hDZ/SyVt011Rm9PFX3SXH0srY8cPTytDxw9LKOPHD08ow8cPSyrjxw9PKsPHD0sp48cPTynDxw9LK+PHD08rw8cPSygTxw9PKCPHD0sqE8cPTyojxw9LKRPHD08pI8cHS3sTxwdPeyPHRGL5vW3USd0curdV8RRy+byQNHL6/JA0cvm8sDRy+vywNHL1vIA0cvb8gDRy9bygNHL2/KA0cvW8kDRy9vyQNHL1vLA0cvb8sDRy/byANHL+/IA0cv28oDRy/vygNHd9vJA0d378lDZ/SyQ93t1Rm9fFD3fXH0sqM8cPTyoTxw9LKTPHD08pE8cPSyszxw9PKxPHD0sos8cPTyiTxw9LKrPHD08qk8cPSymzxw9PKZPHD0srs8cPTyuTxw9LKHPHD08oU8cHS3pzxwdPelPHRGL3vX3Uud0cvXdb8SRy/7yANHL9/IA0cv+8oDRy/fygNHL/vJA0cv38kDRy/7ywNHL9/LA0cvB8gDRy8/yANHLwfKA0cvP8oDRy8HyQNHLz/JA0cvB8sDRy8/ywNHd4fIA0d3v8hDZ/RyWN1D1Rm9/Fb3V3H0crg8cPTyuzxw9HKEPHD08oc8cPRypDxw9PKnPHD0cpQ8cPTylzxw9HK0PHD08rc8cPRyjDxw9PKPPHD0cqw8cPTyrzxw9HKcPHD00qvT9MDR3fHywNHdCJ2mh87o5cS6J6gzeulTXO9Ok6OXk+SBo5e+naYHjl5OlgeOXkbsND1w9HKKPHD0MlKn6YGjl1PlgaOXkTtNDxy9nCYPHL2M0ml64OjldHng6GXUTtMDRy9nyANHL6N1mh44ejlTHjh6Gb3T9MDR3VnywNHdGPKcXf+dU/fyupfVHbP+G6tup26/TpM7t+4V8sCNXbdHHrjz6l4pD9w4dbvywJ1f9yp54MatO4k8cBfUvVoeuPHqTioP3IV1r5EHbvy6k8kDd1Hda+WBm6Du5PLAXVz3OnngJqw7hTxwl9S9Xh64iepOKQ/cpXVvkAdu4rpTyUNn9MJ7Me/OdEYv09SdutPk6KW/PHD0Mq08cPQyQB44eplOHjh6GSgPHL1MLw8cvQySB45eZpAHjl4GywNHLzPKA0cvQ+SBo5eZ5IGjl6HywNHLzPLA0csweeDoZRZ54OhuuDxwdDerPGnfoDN6mb3ubJ0m17ZvwNHLf+RJ+wYcvcwhT9o34OhlTnnSvgFHL3PJk/YNOHqZW560b8DRyzzypH0Djl7mlSftG3D0Mp88ad+Ao7v55Un7Bp3Ry4J1F+g0ubZ9A45eFpIn7Rtw9LKwPGnfgKOXReRJ+wYcvSwqT9o34OhlMXnSvgFHL4vLk/YNOHpZQp60b8DRy5LypH0Dju6WkiftG3RGL8vUXbrT5Nr2DTh6WVaetG/A0cty8qR9A45elpcn7Rtw9LKCPGnfgKOXFeVJ+wYcvawkT9o34OhlZXnSvgFHL6vIk/YNOLpbVZ60b9AZvaxed7VOk2vbN+DoZQ150r4BRy9rypP2DTh6WUuetG/A0cva8qR9A45e1pEn7Rtw9LKuPGnfgKOX9eRJ+wYcvawvT9o34OhuA3nSvkFn9LJR3Q07Ta5t34Cjl43lSfsGHL1sIk/aN+DoZVN50r4BRy+byZP2DTh62VyetG/A0csW8qR9A45etpQn7Rtw9LKVPGnfgKO7reVJ+wad0cu2dbfpNLm2fQOOXraTJ+0bcPSyvTxp34Cjlx3kSfsGHL3sKE/aN+DoZSd50r4BRy87y5P2DTh62UWetG/A0cuu8qR9A47udpMn7Rt0Ri971N290+Ta9g04etlTnrRvwNHLXvKkfQOOXvaWJ+0bcPSyjzxp34Cjl33lSfsGHL3sJ0/aN+DoZX950r4BRy8HyJP2DTi6O1CetG/QGb0cXPegTpNr2zfg6OUQedK+AUcvh8qT9g04ejlMnrRvwNHL4fKkfQOOXo6QJ+0bcPRypDxp34Cjl6PkSfsGHL0cLU/aN+Do7hh50r5xbN3j6p5Z9wxxbfsG3PF1z5In7RtwJ9Q9W560b8CdWPccedK+AXdS3XPlSfsG3Ml1z5Mn7Rtwp9Q9X560b8CdWvcCedK+AXda3QvlSfsG3Ol1L5In7Rt0Ri+X1L1YXNu+AUcvl8qT9g04erlMnrRvwNHL5fKkfQOOXq6QJ+0bcPRypTxp34Cjl6vkSfsGHL1cLU/aN+Do5Rp50r4BR3fXypP2DTqjl+vrXieubd+Ao5cb5En7Bhy93ChP2jfg6OUmedK+AUcv/eVJ+wYcvQyQJ+0bcPQyUJ60b8DRyyB50r4BRy+D5Un7BhzdDZEn7Rt0Ri/D6g4V17ZvwNHLcHnSvgFHLzfLk/YNOHq5RZ60b8DRy63ypH0Djl5ukyftG3D0crs8ad+Ao5c75En7Bhy93ClP2jfg6O4uedK+QWf0ck/du8W17Rtw9HKvPGnfgKOX++RJ+wYcvdwvT9o34OjlAXnSvgFHLw/Kk/YNOHp5SJ60b8DRy8PypH0Djl4ekSftG3B096g8ad+gM3p5vO5j4tr2DTh6eUKetG/A0cuT8qR9A45enpIn7Rtw9PK0PGnfgKOXZ+RJ+wYcvTwrT9o34OjlOXnSvgFHL8/Lk/YNOLp7QZ60b9AZvbxU90VxbfsGHL28LE/aN+Do5RV50r4BRy+vypP2DTh6eU2etG/A0cvr8qR9A45e3pAn7Rtw9PKmPGnfgKOXt+RJ+wYc3b0tT9o36Ixe3q37jri2fQOOXt6TJ+0bcPTyvjxp34Cjlw/kSfsGHL18KE/aN+Do5SN50r4BRy8fy5P2DTh6+USetG/A0cun8qR9A47uPpMn7Rt0Ri9f1P1cXNu+AUcvX8qT9g04evlKnrRvwNHL1/KkfQOOXr6RJ+0bcPTyrTxp34Cjl+/kSfsGHL18L0/aN+Do5Qd50r4BR3c/ypP2DTqjl5/r/iSubd+Ao5df5En7Bhy9/CpP2jfg6OU3edK+AUcvv8uT9g04evlDnrRvwNHLn/KkfQOOXv6SJ+0bcPTytzxp34Cju3/kSfvGv3V79fz/jF53tJ4m17ZvwI1Qdwx50r4B17vumPKkfQOuT92x5En7BlzfumPLk/YNuBHrjiNP2jfgRqo7rjxp34Abue548qR9A26UuuPLk/YNuFHrTiBP2jfojF4mqjthT5Nr2zfg6GViedK+AUcv/eRJ+wYcvXTkSfsGHL30yJP2DTh66cqT9g04eplEnrRvwNHLpPKkfQOOXiaTJ+0bcHQ3uTxp36Azepmy7hQ9Ta5t34Cjl6nkSfsGHL1MLU/aN+DoZRp50r4BRy/TypP2DTh6mU6etG/A0cv08qR9A45eZpAn7Rtw9DKjPGnfgKO7meRJ+wad0cssdWfuaXJt+wYcvcwqT9o34OhlNnnSvgFHL7PLk/YNOHr5jzxp34CjlznkSfsGHL3MKU/aN+DoZS550r4BRy9zy5P2DTi6m0eetG/QGb3MV3fenibXtm/A0cv88qR9A45eFpAn7Rtw9LKgPGnfgKOXheRJ+wYcvSwsT9o34OhlEXnSvgFHL4vKk/YNOHpZTJ60b8DR3eLypH2DzuhlybpL9DS5tn0Djl6WkiftG3D0srQ8ad+Ao5dl5En7Bhy9LCtP2jfg6GU5edK+AUcvy8uT9g04ellBnrRvwNHLivKkfQOO7laSJ+0bdEYvq9RduafJte0bcPSyqjxp34Cjl9XkSfsGHL2sLk/aN+DoZQ150r4BRy9rypP2DTh6WUuetG/A0cva8qR9A45e1pEn7RtwdLeuPGnfoDN6Wb/uej1Nrm3fgKOXDeRJ+wYcvWwoT9o34OhlI3nSvgFHLxvLk/YNOHrZRJ60b8DRy6bypH0Djl42kyftG3D0srk8ad+Ao7st5En7Bp3Ry1Z1t+xpcm37Bhy9bC1P2jfg6GUbedK+AUcv28qT9g04etlOnrRvwNHL9vKkfQOOXnaQJ+0bcPSyozxp34Cjl53kSfsGHN3tLE/aN+iMXnatu0tPk2vbN+DoZTd50r4BRy+7y5P2DTh62UOetG/A0cue8qR9A45e9pIn7Rtw9LK3PGnfgKOXfeRJ+wYcvewrT9o34OhuP3nSvrF/3QPqHl33qJ4m17ZvwB1Y9xh50r4Bd1DdY+VJ+wbcwXWPkyftG3CH1D1enrRvwB1a9wR50r4Bd1jdE+VJ+wbc4XVPkiftG3BH1D1ZnrRvwB1Z9xR50r5BZ/RyWt1TxbXtG3D0cro8ad+Ao5cz5En7Bhy9nClP2jfg6OUsedK+AUcvZ8uT9g04ejlHnrRvwNHLufKkfQOOXs6TJ+0bcHR3vjxp36Azermw7gXi2vYNOHq5SJ60b8DRy8XypH0Djl4ukSftG3D0cqk8ad+Ao5fL5En7Bhy9XC5P2jfg6OUKedK+AUcvV8qT9g04urtKnrRv0Bm9XFP3anFt+wYcvVwrT9o34OjlOnnSvgFHL9fLk/YNOHq5QZ60b8DRy43ypH0Djl5ukiftG3D00l+etG/A0csAedK+AUd3A+VJ+wad0cvguoPEte0bcPQyRJ60b8DRy1B50r4BRy/D5En7Bhy9DJcn7Rtw9HKzPGnfgKOXW+RJ+wYcvdwqT9o34OjlNnnSvgFHd7fLk/YNOqOXO+veIa5t34Cjl7vkSfsGHL3cLU/aN+Do5R550r4BRy/3ypP2DTh6uU+etG/A0cv98qR9A45eHpAn7Rtw9PKgPGnfgKO7h+RJ+wad0csjdR8W17ZvwNHLo/KkfQOOXh6TJ+0bcPTyuDxp34CjlyfkSfsGHL08KU/aN+Do5Sl50r4BRy9Py5P2DTh6eUaetG/A0d2z8qR9g87o5fm6z4lr2zfg6OUFedK+AUcvL8qT9g04enlJnrRvwNHLy/KkfQOOXl6RJ+0bcPTyqjxp34Cjl9fkSfsGHL28Lk/aN+Do7g150r5BZ/TyVt03xbXtG3D08rY8ad+Ao5d35En7Bhy9vCtP2jfg6OU9edK+AUcv78uT9g04evlAnrRvwNHLh/KkfQOOXj6SJ+0bcHT3sTxp36Azevm07ifi2vYNOHr5TJ60b8DRy+fypH0Djl6+kCftG3D08qU8ad+Ao5ev5En7Bhy9fC1P2jfg6OUbedK+AUcv38qT9g04uvtOnrRvfF/3h7p/1/1LXNu+Afdj3X/kSfsG3E91/5Un7RtwP9ft1W160r4B90vdEbpNT9o34H6t27vb9KR9A+63un26TU/aN+B+r9u32/SkfQPuj7ojdpuetG/A/Vl3pG7Tk/YNOqOXUYobudvk2vYNOHoZtdv0pH0Djl5G6zY9ad+Ao5fRu01P2jd6qZcx5En7xgjqZUx50r7RW72MJU/aN/qol7HlSftGX/Uyjjxp34Cju3HlSfvGyOpl/LrjdZtc274BRy8TyJP2DTh6mVCetG/A0ctE8qR9A45eJpYn7Rtw9NJPnrRvwNFLR560b8DRS488ad+Ao5euPGnfgKO7SeRJ+wad0ctkdSftNrm2fQOOXiaX578iCLMYeJyFmVMQXWcbRlPbSJtzatu2bdu2bdtm1DYpk9pMmrapbds2Zv7/XRd7zex5zs07c+Zb62pd7eeyXj3+97u87rV1r6k7cef/d5K6U9edqtPkrqh7nTxwk9adRh64K+sOkAeuZ91p5YG7qu5AeeAmqzudPHBX171eHrjJ604vD1zvujfIA9er7gzywPWpe6M8cJ26M8oD17fuTfLAdevOJE+/ete/7i11b647Rb2bsu4sdWfuNDl6GSQPHL3MKg8cvQyWB45eZpMHjl5ulQeOXmaXB45ebpMHjl7mkAeOXm6XB45e5pQHjl7ukAeOXuaSB45e7pQHjl7mlgeOXu6SB45e5pEHju7ulgeO7uaVh87o5d6699SlM3qZv+58nSZHL/fJA0cvC8gDRy/3ywNHLwvKA0cvD8gDRy8LyQNHLw/KA0cvC8sDRy8PyQNHL4vIA0cvD8sDRy+LygNHL4/IA0cvi8kDRy+PygNHL4vLA0d3j8kDR3dLyENn9DK07pC6dEYvS9VdstPk6OVxeeDoZWl54OhlmDxw9LKMPHD08oQ8cPSyrDxw9PKkPHD0spw8cPTylDxw9LK8PHD0MlweOHpZQR44enlaHjh6WVEeOHp5Rh44ellJHji6e1YeOLpbWR46o5fn6z5Xl87oZdW6q3SaHL28IA8cvawmDxy9vCgPHL2sLg8cvbwkDxy9rCEPHL28LA8cvawpDxy9vCIPHL2sJQ8cvbwqDxy9rC0PHL28Jg8cvawjDxy9vC4PHL2sKw8c3b0hDxzdrScPndHLW3XfrEtn9LJB3fU7TY5e3pYHjl42lAeOXt6RB45eNpIHjl7elQeOXjaWB45e3pMHjl42kQeOXt6XB45eNpUHjl4+kAeOXjaTB45ePpQHjl42lweOXj6SB45etpAHju4+lgeO7raUh87o5dO6n9SlM3rZuu5WnSZHL5/JA0cv28gDRy+fywNHL9vKA0cvX8gDRy/byQNHL1/KA0cv28sDRy9fyQNHLzvIA0cvX8sDRy87ygNHL9/IA0cvO8kDRy/fygNHLzvLA0d338kDR3e7yPN9vfuh7t91/6q7a73bre6BdQ/oNLkf6/4jD9zudQ+SB+6nuv/KA7dH3YPlgfu5bo9O0wO3Z91D5IH7pe4InaYHbq+6h8oD92vdETtND9zedQ+TB+63uiN1mh64feoeLg/c73VH7jQ9cPvWPUIeuD/qjtJpeuD2q3ukPHB/1h210/TA7V/3KHn+Ui+j1/+jqTN6Oabu0Z0mRy9jdJoeOHo5Vp5/1N2YnaYHjl6Ok+dfdTdWp+mBo5fj5YGjl7HlgaOXE+SBo5dx5IGjlxPlgaOXceWBo5eT5IGjl/HkgaOXk+WBo5fx5YGjl1PkgaO7CeSBo7tT5aEzepmo7oTqjF5Or3uaOHqZWB44ejlDHjh6mUQeOHo5Ux44eplUHjh6OUseOHrpKQ8cvZwtDxy9TCYPHL2cIw8cvUwuDxy9nCsPHL30kgeOXs6TB45eOvLA0cv58sDRXVceOLq7QB46oxe+F/Pdmc7o5aK6F4qjl6nkgaOXi+VJ+wYcvVwiT9o34OjlUnnSvgFHL5fJk/YNOHq5XJ60b8DRyxXypH0Djl6ulCftG3D0cpU8ad+Ao7ur5Un7Bp3RS5+6vcW17Rtw9NJXnrRvwNFLP3nSvgFHL/3lSfsGHL1cI0/aN+Do5Vp50r4BRy/XyZP2DTh6GSBP2jfg6GWgPGnfgKO76+VJ+wad0cuNdW8Q17ZvwNHLTfKkfQOOXm6WJ+0bcPRyizxp34Cjl0HypH0Djl4Gy5P2DTh6uVWetG/A0ctt8qR9A45ebpcn7RtwdHeHPGnfoDN6uavuneLa9g04erlbnrRvwNHLPfKkfQOOXu6VJ+0bcPRynzxp34Cjl/vlSfsGHL08IE/aN+Do5UF50r4BRy8PyZP2DTi6e1ietG/QGb08WvcRcW37Bhy9PCZP2jfg6GWIPGnfgKOXofKkfQOOXh6XJ+0bcPQyTJ60b8DRyxPypH0Djl6elCftG3D08pQ8ad+Ao7vh8qR9g87o5Zm6T4tr2zfg6OVZedK+AUcvz8mT9g04enlenrRvwNHLC/KkfQOOXl6UJ+0bcPTykjxp34Cjl5flSfsGHL28Ik/aN+Do7lV50r5BZ/Tyet3XxLXtG3D08oY8ad+Ao5c35Un7Bhy9vCVP2jfg6OVtedK+AUcv78iT9g04enlXnrRvwNHLe/KkfQOOXt6XJ+0bcHT3gTxp3/iw7kd1v637jbi2fQPu47rfyZP2DbhP6n4vT9o34D6t+4M8ad+A+6zuj/KkfQPu87o/yZP2Dbgv6v4sT9o34L6s+4s8ad+A+6rur/KkfQPu67q/yZP2DTqjlz/q/i6ubd+Ao5c/5Un7Bhy9/CVP2jfg6OVvedK+AUcv/8iT9g04evlXnrRvwNFLj27Tk/YNOHoZodv0pH0Djl5G7DY9ad+Ao7uRuk1P2jfojF5GKW7kbpNr2zfg6GXUbtOT9g04ehmt2/SkfQOOXkbvNj1p34CjlzG6TU/aN+DoZcxu05P2DTh6Gavb9KR9o4d6GVuetG+MoF7GkSftG3B0N648ad8YWb2MX3e8bpNr2zdGUS8TyJP2jVHVy4TypH1jNPUykTxp34Cjl4nlSfsGHL1MIk/aN+DoZVJ50r4BRy895Un7Bhy9TCZP2jfg6G5yedK+QWf00qnbq9vk2vYNOHrpypP2DTh6mUKetG/A0cuU8qR9A45eppIn7Rtw9DK1PGnfgKOXaeRJ+wYcvUwrT9o34OhlOnnSvgFHd9PLk/YNOqOXGevO0G1ybfsGHL3MJE/aN+DoZWZ50r4BRy+zyJP2DTh6mVWetG/A0cts8qR9A45eZpcn7Rtw9DKHPGnfgKOXOeVJ+wYc3c0lT9o36Ixe5qk7d7fJte0bcPQyrzxp34Cjl/nkSfsGHL3ML0/aN+DoZQF50r4BRy8LypP2DTh6WUietG/A0cvC8qR9A45eFpEn7RtwdLeoPGnfoDN6WbzuYt0m17ZvwNHLEvKkfQOOXpaUJ+0bcPSylDxp34Cjl6XlSfsGHL0sI0/aN+DoZVl50r4BRy/LyZP2DTh6WV6etG/A0d0K8qR9g87oZaW6K3abXNu+AUcvK8uT9g04ellFnrRvwNHLqvKkfQOOXlaTJ+0bcPSyujxp34CjlzXkSfsGHL2sKU/aN+DoZS150r4BR3dry5P2DTqjl3XrrtNtcm37Bhy9rCdP2jfg6GV9edK+AUcvG8iT9g04etlQnrRvwNHLRvKkfQOOXjaWJ+0bcPSyiTxp34Cjl03lSfsGHN1tJk/aNzavd1vU3bnuTt0m17ZvwG1Zdxd50r4Bt1XdXeVJ+wbc1nV3kyftG3Db1N1dnrRvwG1bdw950r4Bt13dPeVJ+wbc9nX3kiftG3A71N1bnrRvwO1Ydx950r5BZ/SyX919u02ubd+Ao5f95Un7Bhy9HCBP2jfg6OVAedK+AUcvB8mT9g04ejlYnrRvwNHLIfKkfQOOXg6VJ+0bcPRymDxp34Cju8PlSfsGndHLkXWP6Da5tn0Djl6OkiftG3D0crQ8ad+Ao5dj5En7Bhy9HCtP2jfg6OU4edK+AUcvx8uT9g04ejlBnrRvwNHLifKkfQOO7k6SJ+0bdEYvp9Q9WVzbvgFHL6fKk/YNOHo5TZ60b8DRy+nypH0Djl7OkCftG3D0cqY8ad+Ao5ez5En7Bhy9nC1P2jfg6OUcedK+AUd358qT9g06o5fz654nrm3fgKOXC+RJ+wYcvVwoT9o34OjlInnSvgFHLxfLk/YNOHq5RJ60b8DRy6XypH0Djl4ukyftG3D0crk8ad+Ao7sr5En7Bp3Ry1V1rxTXtm/A0cvV8qR9A45eesuT9g04eukjT9o34Oilrzxp34Cjl37ypH0Djl76y5P2DTh6uUaetG/A0cu18qR9A47urpMn7Rt0Ri8D6w4Q17ZvwNHL9fKkfQOOXm6QJ+0bcPRyozxp34Cjl5vkSfsGHL3cLE/aN+Do5RZ50r4BRy+D5En7Bhy9DJYn7RtwdHerPGnfoDN6ub3ubeLa9g04erlDnrRvwNHLnfKkfQOOXu6SJ+0bcPRytzxp34Cjl3vkSfsGHL3cK0/aN+Do5T550r4BRy/3y5P2DTi6e0CetG/QGb08VPdBcW37Bhy9PCxP2jfg6OURedK+AUcvj8qT9g04enlMnrRvwNHLEHnSvgFHL0PlSfsGHL08Lk/aN+DoZZg8ad+Ao7sn5En7Bp3Ry1N1nxTXtm/A0ctwedK+AUcvT8uT9g04enlGnrRvwNHLs/KkfQOOXp6TJ+0bcPTyvDxp34CjlxfkSfsGHL28KE/aN+Do7iV5/gMcZbeN + + + AgAAAACAAACAOwAApRMAAC8JAAA=eJw13acDvWAYFuzjxo0bN27cuHHjxn3cuHHj5vtcuIlEIpFIJJ5IJBKJRCKRaDjX7y3X3/A+436C1/eFjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7Cl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr5/4JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6yd9CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+slfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++fsqXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYevn/olYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+Hrp30JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPgKwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXT/8SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1M74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9zC8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD18/60vAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9fP/hIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PVzvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP3cLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPf3z4A4aMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLN58fhY6f9yVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4evnfwkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PoFXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7hl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr1/0JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6xd/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+iVfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx/+KPQHDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPj8aHL/0S8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD1y/7EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9cu/BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/YovAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9fv/JLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXr/oSMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1q78EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPvzR4A8YMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+Po1XwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7tl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr1/3JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh69d/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+g1fAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++fuOXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev3/QlYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+GPwb6AISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLN58dA42/+EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9Vu+BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/dYvAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9fv+1LwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXb/8SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1O74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9zi8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD38M9AcMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+PxYZfteXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev3/0lYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+Hr93wJGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPj6vV8ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H75+35eAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6/f/yVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4esPfAkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+GORL2DIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePP5scD4B78EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9oS8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD19/+EvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9cf+RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PVHvwQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP2xLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX3/8S8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebDHwv8AUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9ff+JLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXn/wSMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1p74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz96S8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD19/5kvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9ef/RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXnvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+/BHcEzBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPn8CCz6818ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H77+wpeAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6+/+CVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4esvfQkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PrLXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvv7Kl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr7/6JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPhj8C+gCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizedHUOFf+xIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXXvwQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP2NLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX3/zS8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD19/6EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9be/BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/Z0vAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9/BPUGDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPj8Civ/ul4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr7/3JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6+9/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+gdfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++/uGXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYevf/QlYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+HrH38JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPgjoD9gyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4euffAkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PqnXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvv7Zl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr3/+JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6198CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+pdfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++/tWXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYc/DvMEDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz96y8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD1//5kvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9e//RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXvvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP37LwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX//hS8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD13/8EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnwx0G+gCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev/+9LwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPX//8lYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+HrP30JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPj6z18ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H77+y5eAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6//+iVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4eu/fQkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+OMQb8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD13//EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9T++BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/c8vAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9f/+tLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPX//4SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1f74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz93y8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD1/dl/8HE+m5JnicLcUpGIUAYBBgIpFIJBKJRCKRSCQSiUS8NrxxXnht6KbijdeGWogvvkgkEl8k+n3j/8sfDsFfihw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8lbfQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4O/+hY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfDX3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv76W+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwd94Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+IO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3wLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///DgY30JHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7mW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwd96Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+NtvoSPHTpw6c+7CpSvXbty6c+/BoyfPXrx68+7DH399+vLtnx8Hf+ctdOTYiVNnzl24dOXajVt37j149OTZi1dv3n34469PX7798+Pg776Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8vbfQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4O//xY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cTC9hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/IO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3oLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///Dj4h2+hI8dOnDpz7sKlK9du3Lpz78GjJ89evHrz7sMff3368u2fHwf/6C105NiJU2fOXbh05dqNW3fuPXj05NmLV2/effjjr09fvv3z4+Afv4WOHDtx6sy5C5euXLtx6869B4+ePHvx6s27D3/89enLt39+HPyTt9CRYydOnTl34dKVazdu3bn34NGTZy9evXn34Y+/Pn359s+Pg3/6Fjpy7MSpM+cuXLpy7catO/cePHry7MWrN+8+/PHXpy/f/vlxML+Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8s7fQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4N//hY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfAv3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7lW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwb96Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+OO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3kLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///DhY3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv71W+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwb95Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+NO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3sLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///Dj4t2+hI8dOnDpz7sKlK9du3Lpz78GjJ89evHrz7sMff3368u2fHwf/7i105NiJU2fOXbh05dqNW3fuPXj05NmLV2/effjjr09fvv3z4+Dfv4WOHDtx6sy5C5euXLtx6869B4+ePHvx6s27D3/89enLt39+HKxvoSPHTpw6c+7CpSvXbty6c+/BoyfPXrx68+7DH399+vLtnx8H/+EtdOTYiVNnzl24dOXajVt37j149OTZi1dv3n34469PX7798+PgP76Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8p7fQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4P//BY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfBf3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7rW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwX97Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w42N5CR46dOHXm3IVLV67duHXn3oNHT569ePXm3Yc//vr05ds/Pw7++1voyLETp86cu3DpyrUbt+7ce/DoybMXr968+/DHX5++fPvnx8H/eAsdOXbi1JlzFy5duXbj1p17Dx49efbi1Zt3H/7469OXb//8OPifb6Ejx06cOnPuwqUr127cunPvwaMnz168evPuwx9/ffry7Z8fB//rLXTk2IlTZ85duHTl2o1bd+49ePTk2YtXb959+OOvT1++/fPj4H+/hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/Plb6MixE6fOnLtw6cq1G7fu3Hvw6MmzF6/evPvwx1+fvnz758fBX7yFjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhzsb6Ejx06cOnPuwqUr127cunPvwaMnz168evPuwx9/ffry7Z8fB//nLXTk2IlTZ85duHTl2o1bd+49ePTk2YtXb959+OOvT1++/fPj4P++hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/L+30JFjJ06dOXfh0pVrN27duffg/w9fWSkE + + + AQAAAACAAABwFwAAHgAAAA==eJztwTEBAAAAwqAC65/XEL5AAQAAAAAArwFLPxlQ + + + + + diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml index 9f47a0127e8..0a1704fd9c5 100644 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml @@ -120,7 +120,7 @@ + + + + + + AQAAAACAAACABQAAWwEAAA==eJxdi00ow3Ech1dKsTfDhaadRFyUKBellItSykUp5aKUclFKuShSLkRKiUgpERclykUp5aKNMS9jjHkZY8xblP9z+X2+l0/P0/OdzLD93y83L7wivCGcm2my32uxD1/CBvAV0g8LT8AH9IfsLH5J+nS7yR44yN8R68UXSd8nPAQf8xdix/DT0qeE0xwWn/B3yrrweQ6z7xLuhc/4O2cH8CPSx4TD9Em8zWnNBd7uNPs24Uu6TnwPG8H3Sx8SvqKL4hPsNf5H+iaXya1wlP6G7cB3S78nHIRv+YuxEXxc+jq3yY3wHX/3bAu+Xfot4V34gb8A/AiHpa/KMrkWjtM/sQ34ZulXhZ/pN/E7bAK/L32px+QXukp8DfuKr5d+TjhJt4xfZ9/w29IXZJtcDL/Tp9hyfLX048Iz8Ad/n+wifk16d47J+fAXf99sIb5M+kHhUeEp4QXhP65+1tE= + + + 2459.0002033 + + + 8892.4800253 + + + + + AQAAAACAAADAAgAAnAAAAA==eJwtxdciAgAAAMBKympIaNBCyChCZCcRSbL+/0966O7lAoGpoEOecdizjjjqOc97wYtecsxxJ5z0slNecdqrXvO6M84657w3vOmCiy657Iq3vO0dV73rPe+75gMf+sjHrrvhE5+66TOf+8ItX/rKbV/7xre+870f/OiOn9z1s3t+8av7fvO7B/7w0J8e+ctjf/vHv/7zvyfgYw71 + + + + + AQAAAACAAAD4AQAAbQAAAA==eJwtxUOCAwEAALCpbdvmosb/n9VDk0uC4CvksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrHv/7zv08+++Krb7774adffvsDGEMHog== + + + + + AQAAAACAAAAgBAAA4gAAAA==eJxN070JwzAYhOGbIrVGUaFBPIqmcK1RVDitwZDCYLCcTBLJhe9VdXw8HJ/8I81Jer0Vf4vuPC/O/XienLsP8AE+wAd4wQte8IK/vvZP7sfz5Nx9ha/wFb7CF/gCX+ALfIbP8Bk+w0/wE/wEP8FH+Agf4SN8gA/wAT7AC17wghfve+G+l73nyXn0wwte8ILPDf0N/Q39Df3wghe84POJ/hP9J/pP+3jg+R/2nifnsc+OfXbss2Of3b5+8H1+7D1PzmP/Dftv9p4n57H/iv1Xe8+T8/i/Fvsn36/Lvuc/fxk9eg== + + + 1980.0568174 + + + 3236.6803982 + + + + + + + AQAAAACAAADgBwAAPwEAAA==eJxdzNsyAgAURuEQQgghRCGEEEIIIYSQ8/u/iQt73ax988+s+WYnEv/XE9sfm1TvjR2Qo/fFDsol5YdiU+r4YTk6f0fkUvKjsWl1/Jgcnb/jcmn5idiMOn5Sjs7fKbmM/HRsVh0/I0fn76xcVn4uNqeOn5ej83dBLie/GJtXxy/J0flbkMvLL8cW1fErcnT+rsoV5ddiS+r4dTk6fzfkSvKbsWV1/JYcnb/bcmX5ndiKOn5Xjs7fPbmK/H5sVR1/IEfn76FcVf4otqaOP5aj8/dEriZ/GltXx5/J0fl7LleXv4htqOMv5ej8vZJryF/HNtXxN3J0/t7KNeXvYlvq+Hs5On8f5Fryj7FtdfyTHJ2/z3Jt+ZfYjjr+VY7O3ze5jvx7bFcd/yFH5++nXFf+O/ZLHf8jR+fvr9wfDAUq0w== + + + AQAAAACAAAD4AQAAlAAAAA==eJwtxRFgAgAAALAgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCILgcDgcgiAIgiAIgiAI2mTBwFfIYUccdcxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsf/ONf//nfR5989sVX33z3w0+//PYHVzMfgQ== + + + AQAAAACAAAA/AAAADAAAAA==eJxjZ6cIAAA3XwG6 + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml index b811af3ef4a..4c674d7bacc 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml @@ -63,7 +63,7 @@ @@ -96,7 +96,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml new file mode 100644 index 00000000000..78bb944d446 --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm new file mode 100644 index 00000000000..14785b5f2ab --- /dev/null +++ b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm @@ -0,0 +1,14 @@ + + + + + + + diff --git a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml index 33608531c56..942ab9d95c8 100644 --- a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml +++ b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml @@ -63,7 +63,7 @@ diff --git a/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml b/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml new file mode 100755 index 00000000000..73147f4d729 --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml b/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml new file mode 100755 index 00000000000..db98e62b1b3 --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml b/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml new file mode 100755 index 00000000000..97ac626c60d --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml b/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml new file mode 100755 index 00000000000..34dd7411aee --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml b/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml index 1f28c8d3e13..b6c38999957 100644 --- a/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml +++ b/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 1 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -69,12 +69,12 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml b/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml index 96110f04bbf..17b28f92439 100644 --- a/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml +++ b/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 3 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -85,12 +85,12 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml b/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml index 2c934611c49..c7589636004 100644 --- a/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml +++ b/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 3 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -85,12 +85,12 @@ @@ -137,7 +137,7 @@ name="Porosity" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/Region1/block1" + objectPath="ElementRegions/Region1/cb-0_0_0" fieldName="rockPorosity_referencePorosity" scale="0.05"/> diff --git a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats index 2f0bb232b86..da476381b7e 100644 --- a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats @@ -75,6 +75,22 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2), (3, 3, 3)), restart_step=10, check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PressurePerm_1d_smoke", + description= + 'Single phase flow test (1D, compressible, pressure dependent perm)', + partitions=((1, 1, 1), (2, 1, 1), (3, 1, 1)), + restart_step=10, + check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PressurePerm_2d_smoke", + description= + 'Single phase flow test (2D, compressible, pressure dependent perm)', + partitions=((1, 1, 1), (2, 2, 1), (3, 3, 1)), + restart_step=10, + check_step=20, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/singlePhaseFlow/staircase_3d.xml b/inputFiles/singlePhaseFlow/staircase_3d.xml index 95628bc339d..199f1a726ea 100644 --- a/inputFiles/singlePhaseFlow/staircase_3d.xml +++ b/inputFiles/singlePhaseFlow/staircase_3d.xml @@ -25,7 +25,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -73,12 +76,12 @@ diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml index 98db3647020..767e0f4f701 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml @@ -24,21 +24,21 @@ - - - - + + + solidInternalEnergyModelName="rockInternalEnergy_nonLinear"/> @@ -51,12 +51,21 @@ + + + + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml index 4c33c44d234..68e33c33f50 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml @@ -5,7 +5,14 @@ - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml new file mode 100644 index 00000000000..e4cfc03c23b --- /dev/null +++ b/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats index 532b1b1f989..2fb9d311c88 100644 --- a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats @@ -22,6 +22,14 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2)), restart_step=6, check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="thermalCompressible_nonLinear_2d_smoke", + description= + 'non-linear thermal diffusion around a wellbore)', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats index 392c4217da4..e3453332620 100644 --- a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats +++ b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats @@ -36,7 +36,7 @@ decks = [ description= 'Single phase flow test (3D, incompressible, fracture/matrix flow, EDFM)', partitions=((1, 1, 1), (2, 2, 1)), - restart_step=1, + restart_step=0, check_step=1, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( @@ -44,7 +44,7 @@ decks = [ description= 'Single phase flow test (3D, incompressible, fracture/matrix flow, EDFM)', partitions=((1, 1, 1), (2, 2, 1)), - restart_step=1, + restart_step=0, check_step=1, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( diff --git a/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml b/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml index 00d189ec214..6789ab90542 100644 --- a/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml +++ b/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml @@ -51,7 +51,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> @@ -155,7 +156,7 @@ + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1 }"/> diff --git a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml index 0d50bd21c23..172adadc4f4 100644 --- a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml +++ b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml @@ -15,7 +15,8 @@ nx="{ 1, 1 }" ny="{ 1, 1 }" nz="{ 1, 1 }" - cellBlockNames="{ cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1 }"/> diff --git a/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml b/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml index fa36fd0213d..d0c1646ec04 100644 --- a/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml +++ b/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml @@ -47,7 +47,7 @@ diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml index 720cb732ccf..9fdb4234c0a 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml @@ -41,7 +41,7 @@ @@ -49,7 +49,7 @@ diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml index 97101133740..da964fb4008 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml @@ -49,7 +49,10 @@ nx="{ 3, 3 }" ny="{ 3, 3 }" nz="{ 2, 2, 2, 2 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -73,23 +76,21 @@ target="/Outputs/vtkOutput"/> + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> + - - - - - - @@ -171,7 +161,7 @@ permeabilityComponents="{ 9.8e-13, 9.8e-13, 9.8e-13 }"/> @@ -192,13 +182,13 @@ permeabilityComponents="{ 9.8e-16, 9.8e-16, 9.8e-16 }"/> @@ -335,16 +325,9 @@ - - - + diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml index dd727469509..cb00829f403 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml @@ -37,13 +37,13 @@ @@ -241,7 +241,7 @@ + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-2_0_0, + cb-0_1_0, cb-1_1_0, cb-2_1_0, + cb-0_2_0, cb-1_2_0, cb-2_2_0, + cb-0_0_1, cb-1_0_1, cb-2_0_1, + cb-0_1_1, cb-1_1_1, cb-2_1_1, + cb-0_2_1, cb-1_2_1, cb-2_2_1, + cb-0_0_2, cb-1_0_2, cb-2_0_2, + cb-0_1_2, cb-1_1_2, cb-2_1_2, + cb-0_2_2, cb-1_2_2, cb-2_2_2 }"/> @@ -115,20 +115,20 @@ diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml similarity index 67% rename from inputFiles/wavePropagation/benchmarks/acouselas3D.xml rename to inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml index 7ee7cc3e86e..80fe7332730 100644 --- a/inputFiles/wavePropagation/benchmarks/acouselas3D.xml +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml @@ -13,21 +13,13 @@ 6400x1600x4800m domain NOTES: nx="{ 320 }" - ny="{ 240 }" - nz="{ 120, 120 } - => local threshold for local builds 3D Q1 Δt=1e-4 (18e6 elems, 10Gb per 1 GPU) - -> Q4 180 procs / GPU 16h - -> Q1 180 procs / GPU 1h40min - -> Q3 gar6more results - nx="{ 160 }" ny="{ 120 }" - nz="{ 60, 60 } - => local threshold for local builds 3D Q2 Δt=1e-4 (2e6 elems, 4Gb per 1 GPU) - -> Q3 swaps - nx="{ 80 }" - ny="{ 60 }" - nz="{ 30, 30 } - => coarse 10 min frontal run 3D Q5 Δt=1e-3 (288e3 elems, 8Gb per 6 GPU) + nz="{ 120, 120 }" + => Q3 24 procs / GPUs -> 10min run on P3 (validation run) + nx="{ 320 }" + ny="{ 80 }" + nz="{ 120, 120 }" + => Q2 18 procs / GPUs -> 5min run on P3 (debug run) # Validation againt [gar6more3d](https://gitlab.inria.fr/jdiaz/gar6more3d) @@ -37,7 +29,7 @@ 0 first layer : acoustic (0) elastodynamic (1), poroelastic (2) 4 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) 10. Central frequency of the source - 1020. Amplitude of the source (× ρᶠ ?) + 2.295e9 Amplitude of the source (≡ λᶠ) 0.115 Delay of the source 500. Height of the source 533.3333 Height of the line of receivers (relative to interface) @@ -47,10 +39,10 @@ 0. Ordinate of the last receiver 1 Numbers of receivers 0. Start time - 3. Stop time + 1.85 Stop time 1e-3 Time step (of the seismo samples) - 1000 Number of intervals for the numerical computation of the convolution - 1000 Number of intervals for the numerical computation of the space integration + 100 Number of intervals for the numerical computation of the convolution + 100 Number of intervals for the numerical computation of the space integration 2.295e9 1020. λᶠ and ρᶠ 1 second layer : acoustic (0) elastodynamic (1), poroelastic (2) 9.6334225e9 9.633155e9 2500. μˢ, λˢ and ρˢ @@ -60,9 +52,9 @@ ``` 4 infinite medium (1), free surface (2), wall boundary (3) or bilayered medium(4) 0 first layer : acoustic (0) elastodynamic (1), poroelastic (2) - 4 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) + 3 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) 10. Central frequency of the source - 1020. Amplitude of the source (× ρᶠ ?) + 2.295e9 Amplitude of the source (≡ λᶠ) 0.115 Delay of the source 500. Height of the source -533.3333 Height of the line of receivers (relative to interface) @@ -72,10 +64,10 @@ 0. Ordinate of the last receiver 1 Numbers of receivers 0. Start time - 3. Stop time + 1.85 Stop time 1e-3 Time step (of the seismo samples) - 500 Number of intervals for the numerical computation of the convolution - 500 Number of intervals for the numerical computation of the space integration + 100 Number of intervals for the numerical computation of the convolution + 100 Number of intervals for the numerical computation of the space integration 2.295e9 1020. λᶠ and ρᶠ 1 second layer : acoustic (0) elastodynamic (1), poroelastic (2) 9.6334225e9 9.633155e9 2500. μˢ, λˢ and ρˢ @@ -83,37 +75,6 @@ --> - - - - - - - @@ -137,22 +98,21 @@ - + @@ -169,8 +129,7 @@ - + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml new file mode 100644 index 00000000000..a1367ef4128 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml new file mode 100644 index 00000000000..5a4e3ff62ee --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml new file mode 100644 index 00000000000..141cf84d7a6 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml new file mode 100644 index 00000000000..83922fb1c8c --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml new file mode 100644 index 00000000000..e75b0cb0c93 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/elas3D_att_smoke.xml b/inputFiles/wavePropagation/elas3D_att_smoke.xml new file mode 100644 index 00000000000..86e331399f9 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_att_smoke.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml b/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml new file mode 100644 index 00000000000..fdee7d173f5 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/elas3D_vti_small_base.xml b/inputFiles/wavePropagation/elas3D_vti_small_base.xml new file mode 100644 index 00000000000..c4cd9bb5af5 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_vti_small_base.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml index 04a17b7ea8b..06384dcce1c 100644 --- a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml @@ -12,8 +12,7 @@ + newtonMaxIter="10"/> diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml index b2028906503..17f408759b1 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml @@ -24,15 +24,14 @@ + newtonMaxIter="10"/> @@ -67,8 +66,10 @@ - + @@ -151,35 +152,35 @@ + defaultGrainBulkModulus="159.4202899e9"/> + defaultGrainBulkModulus="2.298850575e9"/> + defaultGrainBulkModulus="5.535714286e9"/> diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml index 133d834fdd3..87e49a84312 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml @@ -94,35 +94,35 @@ + defaultGrainBulkModulus="159.4202899e9"/> + defaultGrainBulkModulus="2.298850575e9"/> + defaultGrainBulkModulus="5.535714286e9"/> diff --git a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml index 5d6697daa66..787e7e42b5b 100644 --- a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml +++ b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml @@ -75,7 +75,7 @@ diff --git a/integratedTests b/integratedTests deleted file mode 160000 index abea2ddbfab..00000000000 --- a/integratedTests +++ /dev/null @@ -1 +0,0 @@ -Subproject commit abea2ddbfab58ba445a9254d514dd5ac392a25ee diff --git a/scripts/SchemaToRSTDocumentation.py b/scripts/SchemaToRSTDocumentation.py index 0710515381c..e6492853736 100644 --- a/scripts/SchemaToRSTDocumentation.py +++ b/scripts/SchemaToRSTDocumentation.py @@ -191,6 +191,10 @@ def buildTableValues(type_map, link_string='XML', include_defaults=True): if k in type_map[att_name]: table_row[jj] = type_map[att_name][k] + # Fix type strings + if ('Type' in k): + table_row[jj] = table_row[jj].replace('_lt_', '<').replace('_gt_', '>').replace('_cm_', ',').replace('-', ' ') + # Format any registration entries as links if ('Registered' in k): table_row[jj] = ", ".join([':ref:`%s_%s`' % (link_string, x) for x in table_row[jj]]) diff --git a/scripts/check_baseline_log.sh b/scripts/check_baseline_log.sh new file mode 100755 index 00000000000..85fa5aee8db --- /dev/null +++ b/scripts/check_baseline_log.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DIFF=$(git diff --name-only origin/develop) + +if [[ $DIFF == *".integrated_tests.yaml"* ]]; then + echo "Changes to the integrated test baseline detected" + if [[ $DIFF != *"BASELINE_NOTES.md"* ]]; then + echo "You need to add a note to the BASELINE_NOTES.md file to justify changes to the test baselines" + exit 1 + fi +fi + diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 84e5966968a..347ea362660 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -8,14 +8,12 @@ printenv SCRIPT_NAME=$0 echo "Running CLI ${SCRIPT_NAME} $@" -echo "running nproc" -nproc # docs.docker.com/config/containers/resource_constraints # Inside the container, tools like free report the host's available swap, not what's available inside the container. # Don't rely on the output of free or similar tools to determine whether swap is present. -echo "running free -m" -free -m +echo "running free -g" +free -g # The or_die function run the passed command line and # exits the program in case of non zero error code @@ -50,6 +48,8 @@ Usage: $0 Do not install the xsd schema. --no-run-unit-tests Do not run the unit tests (but they will be built). + --nproc N + Number of cores to use for the build. --repository /path/to/repository Internal mountpoint where the geos repository will be available. --run-integrated-tests @@ -68,7 +68,7 @@ exit 1 or_die cd $(dirname $0)/.. # Parsing using getopt -args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,no-install-schema,no-run-unit-tests,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") +args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,no-install-schema,no-run-unit-tests,nproc:,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") # Variables with default values BUILD_EXE_ONLY=false @@ -76,9 +76,11 @@ GEOSX_INSTALL_SCHEMA=true HOST_CONFIG="host-configs/environment.cmake" RUN_UNIT_TESTS=true RUN_INTEGRATED_TESTS=false +UPLOAD_TEST_BASELINES=false TEST_CODE_STYLE=false TEST_DOCUMENTATION=false CODE_COVERAGE=false +NPROC="$(nproc)" eval set -- ${args} while : @@ -104,8 +106,10 @@ do --install-dir-basename) GEOSX_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; --no-install-schema) GEOSX_INSTALL_SCHEMA=false; shift;; --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; + --nproc) NPROC=$2; shift 2;; --repository) GEOS_SRC_DIR=$2; shift 2;; --run-integrated-tests) RUN_INTEGRATED_TESTS=true; shift;; + --upload-test-baselines) UPLOAD_TEST_BASELINES=true; shift;; --code-coverage) CODE_COVERAGE=true; shift;; --sccache-credentials) SCCACHE_CREDS=$2; shift 2;; --test-code-style) TEST_CODE_STYLE=true; shift;; @@ -145,9 +149,9 @@ EOT # The path to the `sccache` executable is available through the SCCACHE environment variable. SCCACHE_CMAKE_ARGS="-DCMAKE_CXX_COMPILER_LAUNCHER=${SCCACHE} -DCMAKE_CUDA_COMPILER_LAUNCHER=${SCCACHE}" - if [[ ${HOSTNAME} == 'streak.llnl.gov' ]]; then - DOCKER_CERTS_DIR=/usr/local/share/ca-certificates - for file in "${GEOS_SRC_DIR}"/certificates/*.crt.pem; do + if [ -n "${DOCKER_CERTS_DIR}" ] && [ -n "${DOCKER_CERTS_UPDATE_COMMAND}" ]; then + echo "updating certificates." + for file in "${DOCKER_CERTS_DIR}"/llnl/*.crt.pem; do if [ -f "$file" ]; then filename=$(basename -- "$file") filename_no_ext="${filename%.*}" @@ -156,19 +160,19 @@ EOT echo "Copied $filename to $new_filename" fi done - update-ca-certificates - # gcloud config set core/custom_ca_certs_file cert.pem' - - NPROC=8 - else - NPROC=$(nproc) + ${DOCKER_CERTS_UPDATE_COMMAND} fi - echo "Using ${NPROC} cores." echo "sccache initial state" ${SCCACHE} --show-stats fi +if [ -z "${NPROC}" ]; then + NPROC=$(nproc) + echo "NPROC unset, setting to ${NPROC}..." +fi +echo "Using ${NPROC} cores." + if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then echo "Running the integrated tests has been requested." # We install the python environment required by ATS to run the integrated tests. @@ -176,8 +180,18 @@ if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then or_die apt-get install -y virtualenv python3-dev python-is-python3 ATS_PYTHON_HOME=/tmp/run_integrated_tests_virtualenv or_die virtualenv ${ATS_PYTHON_HOME} - export ATS_FILTER="np<=2" - ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=4 --ats openmpi_maxprocs=4\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" + + python3 -m pip cache purge + + # Setup a temporary directory to hold tests + tempdir=$(mktemp -d) + echo "Setting up a temporary directory to hold tests and baselines: $tempdir" + trap "rm -rf $tempdir" EXIT + ATS_BASELINE_DIR=$tempdir/GEOS_integratedTests_baselines + ATS_WORKING_DIR=$tempdir/GEOS_integratedTests_working + + export ATS_FILTER="np<=32" + ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=32 --ats openmpi_maxprocs=32\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME} -DATS_BASELINE_DIR=${ATS_BASELINE_DIR} -DATS_WORKING_DIR=${ATS_WORKING_DIR}" fi @@ -255,7 +269,7 @@ fi # Run the unit tests (excluding previously ran checks). if [[ "${RUN_UNIT_TESTS}" = true ]]; then - if [[ ${HOSTNAME} == 'streak.llnl.gov' ]]; then + if [ ${HOSTNAME} == 'streak.llnl.gov' ] || [ ${HOSTNAME} == 'streak2.llnl.gov' ]; then or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck|testLifoStorage|testExternalSolvers" else or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck" @@ -265,27 +279,39 @@ fi if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then # We split the process in two steps. First installing the environment, then running the tests. or_die ninja ats_environment + # The tests are not run using ninja (`ninja --verbose ats_run`) because it swallows the output while all the simulations are running. # We directly use the script instead... - # Temporarily, we are not adding the `--failIfTestsFail` options to `geos_ats.sh`. - # Therefore, `ats` will exit with error code 0, even if some tests fail. - # Add `--failIfTestsFail` when you want `failIfTestsFail` to reflect the content of the tests. - integratedTests/geos_ats.sh - # Even (and even moreover) if the integrated tests fail, we want to pack the results for further investigations. - # So we store the status code for further use. - INTEGRATED_TEST_EXIT_STATUS=$? - echo "The return code of the integrated tests is ${INTEGRATED_TEST_EXIT_STATUS}" + echo "Available baselines:" + ls -lR /tmp/geos/baselines + + echo "Running integrated tests..." + integratedTests/geos_ats.sh --baselineCacheDirectory /tmp/geos/baselines + tar -czf ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME_WE}.tar.gz integratedTests/TestResults - # Whatever the result of the integrated tests, we want to pack both the logs and the computed results. - # They are not in the same folder, so we do it in 2 steps. - # The `--transform` parameter is here to separate the two informations (originally in a folder with the same name) - # in two different folder with meaningful names when unpacking. - or_die tar cfM ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar --directory ${GEOS_SRC_DIR} --transform "s/^integratedTests/${DATA_BASENAME_WE}\/repo/" integratedTests - or_die tar rfM ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar --directory ${GEOSX_BUILD_DIR} --transform "s/^integratedTests/${DATA_BASENAME_WE}\/logs/" integratedTests - or_die gzip ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar + echo "Checking results..." + bin/geos_ats_log_check integratedTests/TestResults/test_results.ini -y ${GEOS_SRC_DIR}/.integrated_tests.yaml &> $tempdir/log_check.txt + cat $tempdir/log_check.txt - # want to clean the integrated tests folder to avoid polluting the next build. - or_die integratedTests/geos_ats.sh -a clean + if grep -q "Overall status: PASSED" "$tempdir/log_check.txt"; then + echo "IntegratedTests passed. No rebaseline required." + INTEGRATED_TEST_EXIT_STATUS=0 + else + echo "IntegratedTests failed. Rebaseline is required." + + # Rebaseline and pack into an archive + echo "Rebaselining..." + integratedTests/geos_ats.sh -a rebaselinefailed + + echo "Packing baselines..." + integratedTests/geos_ats.sh -a pack_baselines --baselineArchiveName ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME_WE}.tar.gz --baselineCacheDirectory /tmp/geos/baselines + INTEGRATED_TEST_EXIT_STATUS=1 + fi + + echo "Done!" + + # INTEGRATED_TEST_EXIT_STATUS=$? + echo "The return code of the integrated tests is ${INTEGRATED_TEST_EXIT_STATUS}" fi # Cleaning the build directory. diff --git a/scripts/setupPythonEnvironment.bash b/scripts/setupPythonEnvironment.bash index edd5c91296f..eb1dcfaaaff 100755 --- a/scripts/setupPythonEnvironment.bash +++ b/scripts/setupPythonEnvironment.bash @@ -22,6 +22,9 @@ declare -a LINK_SCRIPTS=("preprocess_xml" "convert_abaqus" "run_geos_ats" "setup_ats_environment" + "geos_ats_log_check" + "geos_ats_restart_check" + "geos_ats_curve_check" "activate" "python") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7fb71e7cbe9..930734a71b1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -127,7 +127,7 @@ if( ENABLE_CUDA ) list( APPEND extraComponentsLinkList cuda ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND extraComponentsLinkList CUDA::nvToolsExt ) endif() @@ -232,6 +232,10 @@ install( FILES ${CMAKE_BINARY_DIR}/schema.xsd ################################ # Add python environment setup ################################ +# message(WARNING "Temporarily changing the geosPythonBranch to cusini/fix-streak-cert-fail") +# set(GEOS_PYTHON_PACKAGES_BRANCH "cusini/fix-streak-cert-fail" CACHE STRING "" FORCE) + + if ( Python3_EXECUTABLE ) message(STATUS "Found python version ${Python3_VERSION}") if (${Python3_VERSION} VERSION_LESS "3.6.0") diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 2a7529576b7..9fa1eab84c4 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -1,7 +1,16 @@ #################################### +# # 3rd Party Dependencies +# +# Setup all GEOS TPL +# #################################### + +################################ +# Helper macros & functions +################################ + macro(find_and_import) set(singleValueArgs NAME HEADER) set(multiValueArgs INCLUDE_DIRECTORIES @@ -101,8 +110,22 @@ macro(extract_version_from_header) endmacro( extract_version_from_header) + +macro(mandatory_tpl_doesnt_exist + CURRENT_TPL_NAME + CURRENT_TPL_DIR_VAR) + + message(FATAL_ERROR + "GEOSX requires ${CURRENT_TPL_NAME}, either :\n" + " - Verify that you provided a valid TPL installation directory (GEOSX_TPL_DIR = \"${GEOSX_TPL_DIR}\"),\n" + " - Or set ${CURRENT_TPL_DIR_VAR} to the ${CURRENT_TPL_NAME} installation directory (${CURRENT_TPL_DIR_VAR} = \"${${CURRENT_TPL_DIR_VAR}}\").\n") + +endmacro(mandatory_tpl_doesnt_exist) + + set(thirdPartyLibs "") + ################################ # BLAS/LAPACK ################################ @@ -184,7 +207,7 @@ if(DEFINED CONDUIT_DIR) set(thirdPartyLibs ${thirdPartyLibs} conduit::conduit) else() - message(FATAL_ERROR "GEOSX requires conduit, set CONDUIT_DIR to the conduit installation directory.") + mandatory_tpl_doesnt_exist("Conduit" CONDUIT_DIR) endif() ################################ @@ -215,7 +238,7 @@ if(DEFINED HDF5_DIR) set(ENABLE_HDF5 ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} hdf5) else() - message(FATAL_ERROR "GEOSX requires hdf5, set HDF5_DIR to the hdf5 installation directory.") + mandatory_tpl_doesnt_exist("hdf5" HDF5_DIR) endif() ################################ @@ -259,7 +282,7 @@ if(DEFINED PUGIXML_DIR) set(thirdPartyLibs ${thirdPartyLibs} pugixml) endif() else() - message(FATAL_ERROR "GEOSX requires pugixml, set PUGIXML_DIR to the pugixml installation directory.") + mandatory_tpl_doesnt_exist("pugixml" PUGIXML_DIR) endif() ################################ @@ -291,7 +314,7 @@ if(DEFINED RAJA_DIR) set(ENABLE_RAJA ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} RAJA ) else() - message(FATAL_ERROR "GEOSX requires RAJA, set RAJA_DIR to the RAJA installation directory.") + mandatory_tpl_doesnt_exist("RAJA" RAJA_DIR) endif() ################################ @@ -322,7 +345,7 @@ if(DEFINED UMPIRE_DIR) set(ENABLE_UMPIRE ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} umpire) else() - message(FATAL_ERROR "GEOSX requires Umpire, set UMPIRE_DIR to the Umpire installation directory.") + mandatory_tpl_doesnt_exist("Umpire" UMPIRE_DIR) endif() @@ -345,7 +368,7 @@ if(DEFINED CHAI_DIR) set(ENABLE_CHAI ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} chai) else() - message(FATAL_ERROR "GEOSX requires CHAI, set CHAI_DIR to the CHAI installation directory.") + mandatory_tpl_doesnt_exist("CHAI" CHAI_DIR) endif() ################################ @@ -613,7 +636,7 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) set( HYPRE_DEPENDS ${HYPRE_DEPENDS} superlu_dist ) endif() if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) - set( EXTRA_LIBS ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_curand_LIBRARY} ) + set( EXTRA_LIBS ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_curand_LIBRARY} ${CUDA_cusolver_LIBRARY} ) elseif( ${ENABLE_HYPRE_DEVICE} STREQUAL "HIP" ) find_package( rocblas REQUIRED ) find_package( rocsolver REQUIRED ) @@ -800,7 +823,7 @@ if(DEFINED FMT_DIR) set(thirdPartyLibs ${thirdPartyLibs} fmt::fmt ) else() - message(FATAL_ERROR "GEOSX requires {fmt}, set FMT_DIR to the {fmt} installation directory.") + mandatory_tpl_doesnt_exist("{fmt}" FMT_DIR) endif() ################################ @@ -877,24 +900,6 @@ if(NOT ENABLE_${upper_LAI}) endif() option(GEOSX_LA_INTERFACE_${upper_LAI} "${upper_LAI} LA interface is selected" ON) -################################ -# Fesapi -################################ -# if(DEFINED FESAPI_DIR) -# message(STATUS "FESAPI_DIR = ${FESAPI_DIR}") - -# find_and_import(NAME FesapiCpp -# INCLUDE_DIRECTORIES ${FESAPI_DIR}/include -# LIBRARY_DIRECTORIES ${FESAPI_DIR}/lib -# HEADER fesapi/nsDefinitions.h -# LIBRARIES FesapiCpp -# DEPENDS hdf5) - -# set(FESAPI_DIR ON CACHE BOOL "") -# set(thirdPartyLibs ${thirdPartyLibs} FesapiCpp) -# else() - message(STATUS "Not using Fesapi") -# endif() message(STATUS "thirdPartyLibs = ${thirdPartyLibs}") diff --git a/src/conf.py b/src/conf.py index 99989855bd3..f27f7843963 100644 --- a/src/conf.py +++ b/src/conf.py @@ -112,7 +112,7 @@ 'sphinxcontrib.programoutput' ] -plantuml = "/usr/bin/plantuml" +plantuml = "/usr/bin/java -Djava.awt.headless=true -jar /tmp/plantuml.jar" plantuml_output_format = "svg_img" plot_html_show_source_link = True diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index 81653fb0b8f..da5b68dbd54 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -28,7 +28,7 @@ if ( ENABLE_CUDA ) list( APPEND parallelDeps cuda ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND parallelDeps CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index c51ea1ca849..53ee0981125 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -16,7 +16,8 @@ set( codingUtilities_headers # set( codingUtilities_sources Parsing.cpp - StringUtilities.cpp ) + StringUtilities.cpp + ) set( dependencyList ${parallelDeps} common fast_float ) diff --git a/src/coreComponents/codingUtilities/StringUtilities.hpp b/src/coreComponents/codingUtilities/StringUtilities.hpp index db1fac9d409..d3e3e1e71a6 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.hpp +++ b/src/coreComponents/codingUtilities/StringUtilities.hpp @@ -255,6 +255,27 @@ constexpr bool endsWith( std::string_view str, std::string_view suffix ) str.compare( str.size()-suffix.size(), suffix.size(), suffix ) == 0; } +/** + * @brief Overloading operator (<<) for std::optional. + * + * This function displays the value contained in a std::optional object if one exists. + * Otherwise, it produces no output. + * + * @tparam T The type of the value contained std::optional. + * @param os An output stream (for example, std::cout). + * @param optValue std::optional value to display. + * @return The output stream + */ +template< typename T > +std::ostream & operator<<( std::ostream & os, std::optional< T > const & optValue ) +{ + if( optValue ) + { + os << optValue.value(); + } + return os; +} + } // namespace stringutilities } // namespace geos diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index 3755134d630..6eddbf6e1ce 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -82,8 +82,8 @@ T expected( T expectedSerial, constexpr real64 DEFAULT_ABS_TOL = 1E-12; constexpr real64 DEFAULT_REL_TOL = std::numeric_limits< real64 >::epsilon(); -::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, const char *, const char *, - real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) +inline ::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, const char *, const char *, + real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) { real64 const delta = std::abs( v1 - v2 ); real64 const value = std::max( std::abs( v1 ), std::abs( v2 ) ); @@ -99,23 +99,23 @@ ::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, return ::testing::AssertionSuccess(); } -::testing::AssertionResult checkRelativeErrorFormat( char const * a, char const * b, char const * c, - real64 const v1, real64 const v2, real64 const relTol ) +inline ::testing::AssertionResult checkRelativeErrorFormat( char const * a, char const * b, char const * c, + real64 const v1, real64 const v2, real64 const relTol ) { return checkRelativeErrorFormat( a, b, c, "DEFAULT_ABS_TOL", v1, v2, relTol, DEFAULT_ABS_TOL ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol ) { EXPECT_PRED_FORMAT3( checkRelativeErrorFormat, v1, v2, relTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) { EXPECT_PRED_FORMAT4( checkRelativeErrorFormat, v1, v2, relTol, absTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, string const & name ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, string const & name ) { SCOPED_TRACE( name ); EXPECT_PRED_FORMAT3( checkRelativeErrorFormat, v1, v2, relTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol, string const & name ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol, string const & name ) { SCOPED_TRACE( name ); EXPECT_PRED_FORMAT4( checkRelativeErrorFormat, v1, v2, relTol, absTol ); diff --git a/src/coreComponents/codingUtilities/tests/CMakeLists.txt b/src/coreComponents/codingUtilities/tests/CMakeLists.txt index f6009a67062..85042471be1 100644 --- a/src/coreComponents/codingUtilities/tests/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/tests/CMakeLists.txt @@ -9,6 +9,7 @@ set( dependencyList gtest codingUtilities ${parallelDeps} ) # Add gtest C++ based tests foreach( test ${testSources} ) + get_filename_component( test_name ${test} NAME_WE ) blt_add_executable( NAME ${test_name} SOURCES ${test} diff --git a/src/coreComponents/common/DataTypes.cpp b/src/coreComponents/common/DataTypes.cpp index f2de87138e6..c0231da13d8 100644 --- a/src/coreComponents/common/DataTypes.cpp +++ b/src/coreComponents/common/DataTypes.cpp @@ -185,8 +185,8 @@ rtTypes::RegexMapType rtTypes::createBasicTypesRegexMap() string_view const groupNameDesc = "Input value must be a string that cannot be empty and contains only upper/lower letters, digits, and the characters . - _"; string_view const groupNameRegex = "[a-zA-Z0-9.\\-_]+"; - string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ /"; - string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/]*"; + string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ / *"; + string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/*]*"; // Build master list of regexes diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index deba16a2f8a..a4371da71b3 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -53,17 +53,18 @@ //#include #include #include +#include #include +#include +#include +#include +#include #include #include -#include -#include #include #include -#include -#include -/** +/* * top level geosx namespace contains all code that is specific to GEOSX */ namespace geos @@ -670,6 +671,29 @@ struct TypeName } +/** + * @brief Format to be able to directly use a std::optional. + * @param T The type of the value contained std::optional and GEOS_FMT_NS::formatter. + */ +template< typename T > +struct GEOS_FMT_NS::formatter< std::optional< T > > : GEOS_FMT_NS::formatter< T > +{ + /** + * @brief Format the std::optional to a string. + * @param opt The std::optional< T > value to format + * @param ctx formatting state consisting of the formatting arguments and the output iterator + * @return return the corresponding value string. If std::optional is empty retun an empty string + */ + auto format( std::optional< T > const & opt, format_context & ctx ) + { + if( opt ) + { + return GEOS_FMT_NS::formatter< T >::format( *opt, ctx ); + } + return GEOS_FMT_NS::format_to( ctx.out(), "" ); + } +}; + #endif /* GEOS_COMMON_DATATYPES_HPP */ diff --git a/src/coreComponents/common/Format.hpp b/src/coreComponents/common/Format.hpp index e2a73a8789c..a61f88f29cc 100644 --- a/src/coreComponents/common/Format.hpp +++ b/src/coreComponents/common/Format.hpp @@ -101,7 +101,20 @@ constexpr auto GEOS_FMT_NS::detail::has_const_formatter_impl< GEOS_FMT_NS::forma { return true; } +#endif // End of the workaround for fmt compilation issues + +/** + * Evaluates at compile time if a fmt::formatter exists for a given type + */ +#if __cplusplus < 202002L +template< class T > +static constexpr bool has_formatter_v = fmt::has_formatter< fmt::remove_cvref_t< T >, fmt::format_context >(); +#else +template< typename T > +concept has_formatter_v = requires ( T& v, std::format_context ctx ) +{ + std::formatter< std::remove_cvref_t< T > >().format( v, ctx ); +}; #endif -// End of the workaround for fmt compilation issues #endif //GEOS_COMMON_FORMAT_HPP_ diff --git a/src/coreComponents/common/TimingMacros.hpp b/src/coreComponents/common/TimingMacros.hpp index 297aa49f8f1..d9089fd4d95 100644 --- a/src/coreComponents/common/TimingMacros.hpp +++ b/src/coreComponents/common/TimingMacros.hpp @@ -40,7 +40,7 @@ namespace timingHelpers } -#if defined( GEOS_USE_CUDA_NVTOOLSEXT ) +#if defined( GEOS_USE_CUDA ) && defined( GEOS_USE_CUDA_NVTOOLSEXT ) #include "nvToolsExt.h" diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index ae2b5541a22..94a3e055099 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -35,8 +35,16 @@ TimeFormatInfo::TimeFormatInfo( double const totalSeconds, int const years, int {} string TimeFormatInfo::toString() const +{ + return GEOS_FMT( "{} ({})", toUnfoldedString(), toSecondsString() ); +} +string TimeFormatInfo::toUnfoldedString() const { std::ostringstream oss; + if( m_totalSeconds < 0.0 ) + { + oss << "-("; + } if( m_years != 0 ) { oss << m_years << "y, " << m_days << "d, "; @@ -45,10 +53,17 @@ string TimeFormatInfo::toString() const { oss << m_days << "d, "; } - oss << GEOS_FMT( "{:0>2}h{:0>2}m{:0>2}s ({} s)", - m_hours, m_minutes, m_seconds, m_totalSeconds ); + oss << GEOS_FMT( "{:0>2}h{:0>2}m{:0>2}s", m_hours, m_minutes, m_seconds ); + if( m_totalSeconds < 0.0 ) + { + oss << ")"; + } return oss.str(); } +string TimeFormatInfo::toSecondsString() const +{ + return GEOS_FMT( "{} s", m_totalSeconds ); +} std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) { @@ -77,11 +92,16 @@ template TimeFormatInfo TimeFormatInfo::fromDuration< SystemClock::duration >( S TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { - int totalYears = int( seconds / YearSeconds ); - int daysOut = int( ( seconds - totalYears * YearSeconds ) / DaySeconds ); - int hoursOut = int( ( seconds - totalYears * YearSeconds - daysOut * DaySeconds ) / HourSeconds ); - int minutesOut = int( ( seconds - totalYears * YearSeconds - daysOut * DaySeconds - hoursOut * HourSeconds ) / MinuteSeconds ); - int secondsOut = int( seconds - totalYears * YearSeconds - daysOut * DaySeconds - hoursOut * HourSeconds - minutesOut * MinuteSeconds ); + double remainingSeconds = seconds < 0.0 ? -seconds : seconds; + int const totalYears = int( remainingSeconds / YearSeconds ); + remainingSeconds -= totalYears * YearSeconds; + int const daysOut = int( remainingSeconds / DaySeconds ); + remainingSeconds -= daysOut * DaySeconds; + int const hoursOut = int( remainingSeconds / HourSeconds ); + remainingSeconds -= hoursOut * HourSeconds; + int const minutesOut = int( remainingSeconds / MinuteSeconds ); + remainingSeconds -= minutesOut * MinuteSeconds; + int const secondsOut = int( remainingSeconds ); return TimeFormatInfo( seconds, totalYears, daysOut, hoursOut, minutesOut, secondsOut ); } diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 43e8fc680e3..e072dfe460b 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -82,6 +82,18 @@ enum Unit : integer /// Solubility in g/L Solubility, + + /// Mass in kg + Mass, + + /// Mole in mol + Mole, + + /// Mass rate in kg/s + MassRate, + + /// Mole rate in mol/s + MoleRate, }; @@ -104,6 +116,10 @@ constexpr inline std::string_view getDescription( Unit unit ) case Enthalpy: return "enthalpy [J/kg]"; case Density: return "density [kg/m3]"; case Solubility: return "solubility [g/L]"; + case Mass: return "mass [kg]"; + case Mole: return "mole [mol]"; + case MassRate: return "mass rate [kg/s]"; + case MoleRate: return "mole rate [mol/s]"; } } @@ -122,6 +138,14 @@ constexpr inline std::string_view getSymbol( Unit unit ) case TemperatureInC: return "C"; case Distance: return "m"; case Time: return "s"; + case Viscosity: return "Pa*s"; + case Enthalpy: return "J/kg"; + case Density: return "kg/m3"; + case Solubility: return "g/L"; + case Mass: return "kg"; + case Mole: return "mol"; + case MassRate: return "kg/s"; + case MoleRate: return "mol/s"; } } @@ -143,6 +167,14 @@ inline string formatValue( real64 value, Unit unit ) case TemperatureInC: return GEOS_FMT( "temperature of {} [K]", convertCToK( value ) ); case Distance: return GEOS_FMT( "distance of {} [s]", value ); case Time: return GEOS_FMT( "time of {} [s]", value ); + case Viscosity: return GEOS_FMT( "viscosity of {} [Pa*s]", value ); + case Enthalpy: return GEOS_FMT( "enthalpy of {} [J/kg]", value ); + case Density: return GEOS_FMT( "density of {} [kg/m3]", value ); + case Solubility: return GEOS_FMT( "solubility of {} [g/L]", value ); + case Mass: return GEOS_FMT( "mass of {} [kg]", value ); + case Mole: return GEOS_FMT( "mole of {} [mol]", value ); + case MassRate: return GEOS_FMT( "mass rate of {} [kg/s]", value ); + case MoleRate: return GEOS_FMT( "mole rate of {} [mol/s]", value ); } } @@ -175,18 +207,17 @@ static constexpr double YearSeconds = YearDays * DaySeconds; struct TimeFormatInfo { /// Total time (including the decimal part) this instance represents in seconds - double m_totalSeconds = 0.0; + double const m_totalSeconds = 0.0; /// Number of integral years to show - int m_years = 0; + int const m_years = 0; /// Number of integral days to show - int m_days = 0; + int const m_days = 0; /// Number of integral hours to show - int m_hours = 0; + int const m_hours = 0; /// Number of integral minutes to show - int m_minutes = 0; + int const m_minutes = 0; /// Number of integral seconds to show - int m_seconds = 0; - + int const m_seconds = 0; /** * @brief Construct a TimeFormatInfo from raw data (which must be coherent) @@ -216,9 +247,19 @@ struct TimeFormatInfo friend std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & ctx ); /** - * @return a user friendly string representation of this structure. + * @return a comprehensive string representation of this structure. */ string toString() const; + + /** + * @return a user friendly string representation of this structure (YDHMS format, without subsecond details). + */ + string toUnfoldedString() const; + + /** + * @return a precise string representation of this structure (decimal seconds). + */ + string toSecondsString() const; }; diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index 2ab6ef2cbc3..57a8ad0588d 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -112,6 +112,26 @@ TEST( Units, SystemDurationFormatTest ) "5500y, 20d, 12h02m25s (173565007345 s)", Years( 5500 ) + Days( 20 ) + hours( 12 ) + seconds( 145 ) ), + DurationCase( + "-(00h00m00s) (-1.11e-07 s)", + -nanoseconds( 111 ) ), + + DurationCase( + "-(00h00m01s) (-1 s)", + -seconds( 1 ) ), + + DurationCase( + "-(00h02m25s) (-145.016 s)", + -seconds( 145 ) - milliseconds( 16 ) ), + + DurationCase( + "-(22h25m45s) (-80745.016 s)", + -hours( 20 ) - minutes( 145 ) - seconds( 45 ) - milliseconds( 16 ) ), + + DurationCase( + "-(5500y, 20d, 12h02m25s) (-173565007345 s)", + -Years( 5500 ) - Days( 20 ) - hours( 12 ) - seconds( 145 ) ), + }; const SystemClock::duration maxDuration = SystemClock::duration::max(); @@ -127,7 +147,7 @@ TEST( Units, SystemDurationFormatTest ) EXPECT_STREQ( durationCase.m_expectedString.c_str(), TimeFormatInfo::fromSeconds( durationCase.m_simDuration ).toString().c_str() ) << errorInfo; - if( durationCase.m_simDuration <= maxSystemTime ) + if( 0.0 < durationCase.m_simDuration && durationCase.m_simDuration <= maxSystemTime ) { EXPECT_STREQ( durationCase.m_expectedString.c_str(), TimeFormatInfo::fromDuration( durationCase.m_systemDuration ).toString().c_str() ) << errorInfo; diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 28ff5208229..f75dd705d84 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -62,6 +62,7 @@ set( constitutive_headers fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp fluid/multifluid/CO2Brine/functions/WaterDensity.hpp fluid/multifluid/compositional/functions/CompositionalProperties.hpp + fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp fluid/multifluid/compositional/functions/KValueInitialization.hpp fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -70,7 +71,10 @@ set( constitutive_headers fluid/multifluid/compositional/models/CompositionalDensity.hpp fluid/multifluid/compositional/models/ConstantViscosity.hpp fluid/multifluid/compositional/models/FunctionBase.hpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp + fluid/multifluid/compositional/models/ModelParameters.hpp fluid/multifluid/compositional/models/NullModel.hpp fluid/multifluid/compositional/models/PhaseModel.hpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -101,6 +105,7 @@ set( constitutive_headers permeability/ParallelPlatesPermeability.hpp permeability/PermeabilityBase.hpp permeability/PermeabilityFields.hpp + permeability/PressurePermeability.hpp permeability/ProppantPermeability.hpp permeability/SlipDependentPermeability.hpp permeability/WillisRichardsPermeability.hpp @@ -214,13 +219,16 @@ set( constitutive_sources fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp fluid/multifluid/CO2Brine/functions/WaterDensity.cpp - fluid/multifluid/compositional/functions/CompositionalProperties.cpp fluid/multifluid/compositional/models/CompositionalDensity.cpp fluid/multifluid/compositional/models/ConstantViscosity.cpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp fluid/multifluid/reactive/ReactiveBrineFluid.cpp fluid/multifluid/reactive/ReactiveMultiFluid.cpp fluid/multifluid/reactive/ReactiveFluidDriver.cpp @@ -239,6 +247,7 @@ set( constitutive_sources permeability/ExponentialDecayPermeability.cpp permeability/ParallelPlatesPermeability.cpp permeability/PermeabilityBase.cpp + permeability/PressurePermeability.cpp permeability/ProppantPermeability.cpp permeability/SlipDependentPermeability.cpp permeability/WillisRichardsPermeability.cpp @@ -253,10 +262,10 @@ set( constitutive_sources relativePermeability/VanGenuchtenStone2RelativePermeability.cpp relativePermeability/RelpermDriver.cpp relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp - relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp + relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp - relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp + relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp relativePermeability/RelpermDriverTableRelativeRunTest.cpp relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp solid/CompressibleSolid.cpp @@ -300,7 +309,8 @@ if( ENABLE_PVTPackage ) set( constitutive_sources ${constitutive_sources} - fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp ) + fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp ) add_subdirectory( PVTPackage ) diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index 0f97f509309..d2e22316b4a 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -44,6 +44,7 @@ #include "permeability/CarmanKozenyPermeability.hpp" #include "permeability/ExponentialDecayPermeability.hpp" #include "permeability/ParallelPlatesPermeability.hpp" +#include "permeability/PressurePermeability.hpp" #include "permeability/ProppantPermeability.hpp" #include "permeability/SlipDependentPermeability.hpp" #include "permeability/WillisRichardsPermeability.hpp" @@ -296,6 +297,7 @@ struct ConstitutivePassThru< CompressibleSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability > >::execute( constitutiveRelation, @@ -309,6 +311,7 @@ struct ConstitutivePassThru< CompressibleSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability > >::execute( constitutiveRelation, @@ -353,6 +356,7 @@ struct ConstitutivePassThru< CoupledSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability >, PorousSolid< DruckerPragerExtended >, @@ -379,6 +383,7 @@ struct ConstitutivePassThru< CoupledSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability >, PorousSolid< DruckerPragerExtended >, diff --git a/src/coreComponents/constitutive/docs/Constitutive.rst b/src/coreComponents/constitutive/docs/Constitutive.rst index e6115637721..68279ea3774 100644 --- a/src/coreComponents/constitutive/docs/Constitutive.rst +++ b/src/coreComponents/constitutive/docs/Constitutive.rst @@ -18,6 +18,7 @@ These models are grouped together based on their input/output interface. PorosityModels PermeabilityModels PorousSolids + TemperatureDependentSolidVolumetricHeatCapacity In an input XML file, constitutive models are listed in the ```` block. diff --git a/src/coreComponents/constitutive/docs/PVTDriver.rst b/src/coreComponents/constitutive/docs/PVTDriver.rst index c0b46436a7d..ae9563480c1 100644 --- a/src/coreComponents/constitutive/docs/PVTDriver.rst +++ b/src/coreComponents/constitutive/docs/PVTDriver.rst @@ -107,6 +107,7 @@ In this case, we have a two-phase, two-component mixture. The total density is reported in column 4, while phase fractions, phase densities, and phase viscosities are reported in subsequent columns. If the ``outputCompressibility`` flag is activated, an extra column will be added for the total fluid compressibility after the density. This is defined as :math:`c_t=\frac{1}{\rho_t}\left(\partial{\rho_t}/\partial P\right)` where :math:`\rho_t` is the total density. +If the ``outputMassDensity`` flag is activated, extra columns will be added for the mass density of each phase. The number of columns will also depend on whether the ``outputPhaseComposition`` flag is activated or not. If it is activated, there will be an extra column for the mole fraction of each component in each phase. The phase order will match the one defined in the input XML (here, the co2-rich phase followed by the water-rich phase). This file can be readily plotted using any number of plotting tools. Each row corresponds to one timestep of the driver, starting from initial conditions in the first row. diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst new file mode 100644 index 00000000000..22feb9c1b8c --- /dev/null +++ b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst @@ -0,0 +1,55 @@ +.. _TemperatureDependentSolidVolumetricHeatCapacity: + + +########################################################## +Temperature-dependent Solid Volumetric Heat Capacity Model +########################################################## + + +Overview +====================== + +In this model, solid volumetric specific heat capacity is assumed to be a linear function of temperature: + +.. math:: + C = C_{0} + \frac{ dC }{ dT } (T - T_{0}) + +where + :math:`C` is the solid volumetric heat capacity at temperature T; + :math:`C_{0}` is the reference solid volumetric heat capacity at the reference temperature; + :math:`T_{0}` is the reference temperature; + :math:`\frac{ dC }{ dT }` is the gradient of the volumetric heat capacity with respect to temperature, which equals to zero for the cases with constant solid volumetric heat capacity; + + + +Parameters +====================== + +The temperature-dependent solid volumetric heat capacity model is called in the +```` block of the input XML file. +This model must be assigned a unique name via the +``name`` attribute. +This name is used to attach the model to regions of the physical +domain via a ``solidInternalEnergyModelName`` attribute in the ```` +block. + +The following attributes are supported: + +.. include:: /coreComponents/schema/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst + + +Example +======================= + +.. code-block:: xml + + + ... + + ... + diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index b30d367dd4c..907ca230af5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -162,7 +162,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_phase1->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for phase no. 1.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", + m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); throw SimulationError( ex, errorMsg ); } @@ -173,7 +174,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_phase2->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for phase no. 2.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", + m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); throw SimulationError( ex, errorMsg ); } @@ -182,7 +184,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_flash->checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for flash phase.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", + m_flashModelParaFile ); throw SimulationError( ex, errorMsg ); } } @@ -191,11 +194,13 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const template< typename PHASE1, typename PHASE2, typename FLASH > void CO2BrineFluid< PHASE1, PHASE2, FLASH >::initializePreSubGroups() { - GEOS_THROW_IF( this->catalogName() == CO2BrineEzrokhiThermalFluid::catalogName(), +#if defined(GEOS_DEVICE_COMPILE) + GEOS_THROW_IF( this->getCatalogName() == CO2BrineEzrokhiThermalFluid::catalogName(), GEOS_FMT( "The `{}` model is disabled for now. Please use the other thermal CO2-brine model instead: `{}`", CO2BrineEzrokhiThermalFluid::catalogName(), CO2BrinePhillipsThermalFluid::catalogName() ), InputError ); +#endif } template< typename PHASE1, typename PHASE2, typename FLASH > diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index f43009e5204..4f2a140f99d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -92,6 +92,17 @@ makeSolubilityTables( string const & functionName, return { tables[0], tables[1] }; } + // If the tables have already been created, then simply retrieve them + string const co2TableName = functionName + "_co2Dissolution_table"; + string const h2oTableName = functionName + "_waterVaporization_table"; + + if( functionManager.hasGroup< TableFunction >( co2TableName ) && functionManager.hasGroup< TableFunction >( h2oTableName )) + { + TableFunction const * co2SolubilityTable = functionManager.getGroupPointer< TableFunction >( co2TableName ); + TableFunction const * h2oSolubilityTable = functionManager.getGroupPointer< TableFunction >( h2oTableName ); + return {co2SolubilityTable, h2oSolubilityTable}; + } + // Initialize the (p,T) coordinates constitutive::PVTProps::PVTFunctionHelpers::initializePropertyTable( inputParams, tableCoords ); @@ -178,24 +189,21 @@ makeSolubilityTables( string const & functionName, << std::setw( 15 ) << "Pressure (Pa)" << " " << std::setw( 15 ) << "Temperature (C)" << " " << std::setw( 23 ) << "CO2 solubility (mol/kg)" << " " - << std::setw( 15 ) << "H2O solubility (mol/kg)" << " " - << "\n"; + << std::setw( 23 ) << "H2O solubility (mol/kg)" << " "; for( integer row = 0; row < LvArray::math::min( maxBad, badCount ); ++row ) { badValueTable + << "\n" << std::setw( 15 ) << badValues( row, 0 ) << " " << std::setw( 15 ) << badValues( row, 1 ) << " " << std::setw( 23 ) << badValues( row, 2 ) << " " - << std::setw( 15 ) << badValues( row, 3 ) << " " - << "\n"; + << std::setw( 23 ) << badValues( row, 3 ) << " "; } - GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: {} negative solubility values encountered. These will be truncated to zero.\n Check out report table {} with max {} values", - badCount, badValueTable.str(), maxBad ) ); + GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: {} negative solubility values encountered. These will be truncated to zero.\nCheck out report table with max {} values.\n{}", + badCount, maxBad, badValueTable.str() ) ); } - string const co2TableName = functionName + "_co2Dissolution_table"; TableFunction const * co2SolubilityTable = makeTable( co2TableName, tableCoords, std::move( co2Solubility ), functionManager ); - string const h2oTableName = functionName + "_waterVaporization_table"; TableFunction const * h2oSolubilityTable = makeTable( h2oTableName, tableCoords, std::move( h2oSolubility ), functionManager ); return {co2SolubilityTable, h2oSolubilityTable}; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 0f66d19ba4e..bffb350a4ac 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -171,6 +171,7 @@ void EzrokhiBrineDensityUpdate::compute( real64 const & pressure, arraySlice1d< real64, USD3 > const & dValue, bool useMass ) const { + constexpr integer numDof = 4; using Deriv = multifluid::DerivativeOffset; real64 waterSatDensity_dTemperature = 0.0; @@ -188,32 +189,39 @@ void EzrokhiBrineDensityUpdate::compute( real64 const & pressure, real64 const coefPhaseComposition = m_coef0 + temperature * ( m_coef1 + m_coef2 * temperature ); + real64 const mw_co2 = m_componentMolarWeight[m_CO2Index]; + real64 const mw_h2o = m_componentMolarWeight[m_waterIndex]; + // we have to convert molar component phase fraction (phaseComposition[m_CO2Index]) to mass fraction - real64 const waterMWInv = 1.0 / (phaseComposition[m_CO2Index] * m_componentMolarWeight[m_CO2Index] - + phaseComposition[m_waterIndex] * m_componentMolarWeight[m_waterIndex]); + real64 const waterMWInv = 1.0 / (phaseComposition[m_CO2Index] * mw_co2 + phaseComposition[m_waterIndex] * mw_h2o); + real64 dWaterMWInv[numDof]{}; + for( integer dof = 0; dof < numDof; ++dof ) + { + dWaterMWInv[dof] = -(dPhaseComposition[m_CO2Index][dof] * mw_co2 + dPhaseComposition[m_waterIndex][dof] * mw_h2o)*waterMWInv*waterMWInv; + } - real64 const massPhaseCompositionCO2 = phaseComposition[m_CO2Index] * m_componentMolarWeight[m_CO2Index] * waterMWInv; + real64 const massPhaseCompositionCO2 = phaseComposition[m_CO2Index] * mw_co2 * waterMWInv; real64 const exponent = coefPhaseComposition * massPhaseCompositionCO2; + real64 dExponent[numDof]{}; + for( integer dof = 0; dof < numDof; ++dof ) + { + dExponent[dof] = coefPhaseComposition * mw_co2 * + (dPhaseComposition[m_CO2Index][dof] * waterMWInv + phaseComposition[m_CO2Index] * dWaterMWInv[dof]); + } + dExponent[Deriv::dT] += ( m_coef1 + 2.0 * m_coef2 * temperature) * massPhaseCompositionCO2; - real64 const exponent_dPressure = coefPhaseComposition * dPhaseComposition[m_CO2Index][Deriv::dP]; - real64 const exponent_dTemperature = coefPhaseComposition * dPhaseComposition[m_CO2Index][Deriv::dT] + - ( m_coef1 + 2 * m_coef2 * temperature) * massPhaseCompositionCO2; - // compute only common part of derivatives w.r.t. CO2 and water phase compositions - // later to be multiplied by (phaseComposition[m_waterIndex]) and ( -phaseComposition[m_CO2Index] ) respectively - real64 const exponent_dPhaseComp = coefPhaseComposition * m_componentMolarWeight[m_CO2Index] * m_componentMolarWeight[m_waterIndex] * waterMWInv * waterMWInv; - real64 exponentPowered = pow( 10, exponent ); + real64 exponentPowered = pow( 10.0, exponent ); value = waterDensity * exponentPowered; - real64 const dValueCoef = LvArray::math::log( 10 ) * value; - dValue[Deriv::dP] = dValueCoef * exponent_dPressure + waterDensity_dPressure * exponentPowered; - dValue[Deriv::dT] = dValueCoef * exponent_dTemperature + waterDensity_dTemperature * exponentPowered; + real64 const dValueCoef = LvArray::math::log( 10.0 ) * value; + + dValue[Deriv::dP] = dValueCoef * dExponent[Deriv::dP] + waterDensity_dPressure * exponentPowered; + dValue[Deriv::dT] = dValueCoef * dExponent[Deriv::dT] + waterDensity_dTemperature * exponentPowered; - // here, we multiply common part of derivatives by specific coefficients - real64 const dValue_dPhaseComp = dValueCoef * exponent_dPhaseComp; - dValue[Deriv::dC+m_CO2Index] = dValue_dPhaseComp * phaseComposition[m_waterIndex] * dPhaseComposition[m_CO2Index][Deriv::dC+m_CO2Index]; - dValue[Deriv::dC+m_waterIndex] = dValue_dPhaseComp * ( -phaseComposition[m_CO2Index] ) * dPhaseComposition[m_waterIndex][Deriv::dC+m_waterIndex]; + dValue[Deriv::dC+m_CO2Index] = dValueCoef * dExponent[Deriv::dC+m_CO2Index]; + dValue[Deriv::dC+m_waterIndex] = dValueCoef * dExponent[Deriv::dC+m_waterIndex]; if( !useMass ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index a221fa6ed0b..e31d513cd3b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -1047,6 +1047,7 @@ MultiFluidBase::KernelWrapper:: { integer const numPhase = numPhases(); integer const numComp = numComponents(); + integer const numDOF = numComp + 2; for( integer ip = 0; ip < numPhase; ++ip ) { @@ -1059,7 +1060,7 @@ MultiFluidBase::KernelWrapper:: real64 const densInv = 1.0 / phaseMassDens.value[ip]; real64 const densInvSquared = densInv * densInv; phaseInternalEnergy.value[ip] = phaseEnthalpy.value[ip] - pressure * densInv; - for( integer idof = 0; idof < numComp; ++idof ) + for( integer idof = 0; idof < numDOF; ++idof ) { phaseInternalEnergy.derivs[ip][idof] = phaseEnthalpy.derivs[ip][idof] + pressure * phaseMassDens.derivs[ip][idof] * densInvSquared; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp index 4f69f3efa17..24055925e16 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp @@ -49,7 +49,7 @@ struct MultiFluidConstants /** * @brief Max number of SSI iterations */ - static constexpr integer maxSSIIterations = 200; + static constexpr integer maxSSIIterations = 1000; /** * @brief Max number of Newton iterations diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 6eeb7e4dd79..79a1682cc1a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -41,16 +41,21 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, - CO2BrinePhillipsThermalFluid -// ,CO2BrineEzrokhiThermalFluid "Uncommenting this will lead to compiler segfault. Need to split compilation -// units for all the options" + CO2BrinePhillipsThermalFluid, +// Including these in a CUDA build will lead to compiler segfault. +// Need to split compilation units for all the options +#if !defined(GEOS_DEVICE_COMPILE) + CO2BrineEzrokhiThermalFluid, + CompositionalTwoPhasePengRobinsonLBCViscosity, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, +#endif + CompositionalTwoPhasePengRobinsonConstantViscosity, + CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } @@ -60,16 +65,21 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, - CO2BrinePhillipsThermalFluid - //,CO2BrineEzrokhiThermalFluid "Uncommenting this will lead to compiler segfault. Need to split compilation -// units for all the options" + CO2BrinePhillipsThermalFluid, +// Including these in a CUDA build will lead to compiler segfault. +// Need to split compilation units for all the options" +#if !defined(GEOS_DEVICE_COMPILE) + CO2BrineEzrokhiThermalFluid, + CompositionalTwoPhasePengRobinsonLBCViscosity, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, +#endif + CompositionalTwoPhasePengRobinsonConstantViscosity, + CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp index 6f3db3ca97f..e911cc5260e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp @@ -63,6 +63,8 @@ struct MultiFluidVarSlice internal::ArraySliceOrRef< T, DIM, USD > value; /// variable value internal::ArraySliceOrRef< T, DIM + 1, USD_DC > derivs; /// derivative w.r.t. pressure, temperature, compositions + + using ValueType = internal::ArraySliceOrRef< T, DIM, USD >; }; /** @@ -87,13 +89,15 @@ struct MultiFluidVarView ArrayView< T, NDIM + 1, USD_DC > const & derivsSrc ): value( valueSrc ), derivs( derivsSrc ) - {}; + {} ArrayView< T, NDIM, USD > value; ///< View into property values ArrayView< T, NDIM + 1, USD_DC > derivs; ///< View into property derivatives w.r.t. pressure, temperature, compositions using SliceType = MultiFluidVarSlice< T, NDIM - 2, USD - 2, USD_DC - 2 >; + using ValueType = ArrayView< T, NDIM, USD >; + GEOS_HOST_DEVICE SliceType operator()( localIndex const k, localIndex const q ) const { @@ -119,6 +123,12 @@ struct MultiFluidVar using SliceType = typename ViewType::SliceType; using SliceTypeConst = typename ViewTypeConst::SliceType; + using ValueType = Array< real64, NDIM, PERM >; + template< int MAXSIZE > + using StackValueType = StackArray< real64, NDIM, MAXSIZE, PERM >; + using ViewValueType = typename ViewType::ValueType; + using SliceValueType = typename SliceType::ValueType; + ViewType toView() { return { value.toView(), derivs.toView() }; diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index ebee0639d42..83de5223ad4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -61,6 +61,11 @@ PVTDriver::PVTDriver( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Function controlling temperature time history" ); + registerWrapper( viewKeyStruct::outputMassDensityString(), &m_outputMassDensity ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0 ). + setDescription( "Flag to indicate that the mass density of each phase should be output" ); + registerWrapper( viewKeyStruct::outputCompressibilityString(), &m_outputCompressibility ). setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0 ). @@ -90,6 +95,10 @@ PVTDriver::PVTDriver( const string & name, void PVTDriver::postProcessInput() { // Validate some inputs + GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << + ": option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << ": option can be either 0 (false) or 1 (true)" ); @@ -112,6 +121,12 @@ void PVTDriver::postProcessInput() // Default column order = time, pressure, temp, totalDensity, phaseFraction_{1:NP}, phaseDensity_{1:NP}, phaseViscosity_{1:NP} integer numCols = 3*m_numPhases+4; + // If the mass density is requested then add NP columns + if( m_outputMassDensity != 0 ) + { + numCols += m_numPhases; + } + // If the total compressibility is requested then add a column if( m_outputCompressibility != 0 ) { @@ -185,6 +200,7 @@ bool PVTDriver::execute( real64 const GEOS_UNUSED_PARAM( time_n ), GEOS_LOG_RANK_0( " Steps .................. " << m_numSteps ); GEOS_LOG_RANK_0( " Output ................. " << m_outputFile ); GEOS_LOG_RANK_0( " Baseline ............... " << m_baselineFile ); + GEOS_LOG_RANK_0( " Output Mass Density .... " << m_outputMassDensity ); GEOS_LOG_RANK_0( " Output Compressibility . " << m_outputCompressibility ); GEOS_LOG_RANK_0( " Output Phase Comp. ..... " << m_outputPhaseComposition ); } @@ -248,6 +264,11 @@ void PVTDriver::outputResults() columnIndex += m_numPhases; fprintf( fp, "# columns %d-%d = phase densities\n", columnIndex+1, columnIndex + m_numPhases ); columnIndex += m_numPhases; + if( m_outputMassDensity != 0 ) + { + fprintf( fp, "# columns %d-%d = phase mass densities\n", columnIndex+1, columnIndex + m_numPhases ); + columnIndex += m_numPhases; + } fprintf( fp, "# columns %d-%d = phase viscosities\n", columnIndex+1, columnIndex + m_numPhases ); columnIndex += m_numPhases; @@ -288,6 +309,10 @@ void PVTDriver::compareWithBaseline() { headerRows++; } + if( m_outputMassDensity ) + { + headerRows++; + } if( m_outputPhaseComposition ) { headerRows += getFluid().numFluidPhases(); @@ -314,9 +339,9 @@ void PVTDriver::compareWithBaseline() real64 const error = fabs( m_table[row][col]-value ) / ( fabs( value )+1 ); GEOS_THROW_IF( error > MultiFluidConstants::baselineTolerance, - "Results do not match baseline at data row " << row+1 - << " (row " << row+headerRows << " with header)" - << " and column " << col+1, std::runtime_error ); + GEOS_FMT( "Results do not match baseline ({} vs {}) at data row {} (row {} with header) and column {}", + m_table[row][col], value, row+1, row+headerRows, col+1 ), + std::runtime_error ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp index ed1c763571c..c81814ac5fd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp @@ -90,6 +90,7 @@ class PVTDriver : public TaskBase constexpr static char const * outputString() { return "output"; } constexpr static char const * baselineString() { return "baseline"; } constexpr static char const * feedString() { return "feedComposition"; } + constexpr static char const * outputMassDensityString() { return "outputMassDensity"; } constexpr static char const * outputCompressibilityString() { return "outputCompressibility"; } constexpr static char const * outputPhaseCompositionString() { return "outputPhaseComposition"; } }; @@ -102,6 +103,7 @@ class PVTDriver : public TaskBase string m_pressureFunctionName; ///< Time-dependent function controlling pressure string m_temperatureFunctionName; ///< Time-dependent function controlling temperature string m_outputFile; ///< Output file (optional, no output if not specified) + integer m_outputMassDensity{0}; ///< Flag to indicate that the mass density of each phase should be output integer m_outputCompressibility{0}; ///< Flag to indicate that the total compressibility should be output integer m_outputPhaseComposition{0}; ///< Flag to indicate that phase compositions should be output diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp index da522d27913..8035817461c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp @@ -63,17 +63,23 @@ void PVTDriver::runTest( FLUID_TYPE & fluid, arrayView2d< real64 > const & table // perform fluid update using table (P,T) and save resulting total density, etc. // note: column indexing should be kept consistent with output file header below. + bool const outputMassDensity = (m_outputMassDensity != 0); + bool const outputCompressibility = (m_outputCompressibility != 0); + bool const outputPhaseComposition = (m_outputPhaseComposition != 0); + integer const numSteps = m_numSteps; - integer const outputCompressibility = m_outputCompressibility; - integer const outputPhaseComposition = m_outputPhaseComposition; using ExecPolicy = typename FLUID_TYPE::exec_policy; forAll< ExecPolicy >( composition.size( 0 ), - [ outputCompressibility, outputPhaseComposition, numPhases, numComponents, numSteps, kernelWrapper, - table, composition] + [outputMassDensity, outputCompressibility, outputPhaseComposition, + numPhases, numComponents, numSteps, kernelWrapper, + table, composition] GEOS_HOST_DEVICE ( localIndex const i ) { // Index for start of phase properties - integer const PHASE = outputCompressibility != 0 ? TEMP + 3 : TEMP + 2; + integer const PHASE_FRACTION = outputCompressibility ? TEMP + 3 : TEMP + 2; + integer const PHASE_DENSITY = PHASE_FRACTION + numPhases; + integer const PHASE_VISCOSITY = outputMassDensity ? PHASE_DENSITY + 2*numPhases : PHASE_DENSITY + numPhases; + integer const PHASE_COMP = PHASE_VISCOSITY + numPhases; // Temporary space for phase mole fractions stackArray1d< real64, constitutive::MultiFluidBase::MAX_NUM_COMPONENTS > phaseComposition( numComponents ); @@ -83,22 +89,29 @@ void PVTDriver::runTest( FLUID_TYPE & fluid, arrayView2d< real64 > const & table kernelWrapper.update( i, 0, table( n, PRES ), table( n, TEMP ), composition[i] ); table( n, TEMP + 1 ) = kernelWrapper.totalDensity()( i, 0 ); - if( outputCompressibility != 0 ) + if( outputCompressibility ) { table( n, TEMP + 2 ) = kernelWrapper.totalCompressibility( i, 0 ); } for( integer p = 0; p < numPhases; ++p ) { - table( n, PHASE + p ) = kernelWrapper.phaseFraction()( i, 0, p ); - table( n, PHASE + p + numPhases ) = kernelWrapper.phaseDensity()( i, 0, p ); - table( n, PHASE + p + 2 * numPhases ) = kernelWrapper.phaseViscosity()( i, 0, p ); + table( n, PHASE_FRACTION + p ) = kernelWrapper.phaseFraction()( i, 0, p ); + table( n, PHASE_DENSITY + p ) = kernelWrapper.phaseDensity()( i, 0, p ); + table( n, PHASE_VISCOSITY + p ) = kernelWrapper.phaseViscosity()( i, 0, p ); + } + if( outputMassDensity ) + { + for( integer p = 0; p < numPhases; ++p ) + { + table( n, PHASE_DENSITY + numPhases + p ) = kernelWrapper.phaseMassDensity()( i, 0, p ); + } } - if( outputPhaseComposition != 0 ) + if( outputPhaseComposition ) { for( integer p = 0; p < numPhases; ++p ) { - integer const compStartIndex = PHASE + 3 * numPhases + p * numComponents; + integer const compStartIndex = PHASE_COMP + p * numComponents; kernelWrapper.phaseCompMoleFraction( i, 0, p, phaseComposition ); for( integer ic = 0; ic < numComponents; ++ic ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index 9f9ec01ffbb..0b7d2403e5a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -19,18 +19,35 @@ #include "CompositionalMultiphaseFluid.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "codingUtilities/Utilities.hpp" namespace geos { +namespace fields +{ +namespace multifluid +{ +DECLARE_FIELD( kValues, + "kValues", + array4dLayoutPhaseComp, + 0, + NOPLOT, + WRITE_AND_READ, + "Phase equilibrium ratios" ); +} +} + namespace constitutive { template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >:: CompositionalMultiphaseFluid( string const & name, Group * const parent ) - : MultiFluidBase( name, parent ) + : MultiFluidBase( name, parent ), + m_componentProperties( std::make_unique< compositional::ComponentProperties >( m_componentNames, m_componentMolarWeight ) ), + m_parameters( createModelParameters() ) { using InputFlags = dataRepository::InputFlags; @@ -38,29 +55,30 @@ CompositionalMultiphaseFluid( string const & name, Group * const parent ) getWrapperBase( viewKeyStruct::componentMolarWeightString() ).setInputFlag( InputFlags::REQUIRED ); getWrapperBase( viewKeyStruct::phaseNamesString() ).setInputFlag( InputFlags::REQUIRED ); - registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentCriticalPressure ). + registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentProperties->m_componentCriticalPressure ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical pressures" ); - registerWrapper( viewKeyStruct::componentCriticalTemperatureString(), &m_componentCriticalTemperature ). + registerWrapper( viewKeyStruct::componentCriticalTemperatureString(), &m_componentProperties->m_componentCriticalTemperature ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical temperatures" ); - registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Component critical volumnes" ); - - registerWrapper( viewKeyStruct::componentAcentricFactorString(), &m_componentAcentricFactor ). + registerWrapper( viewKeyStruct::componentAcentricFactorString(), &m_componentProperties->m_componentAcentricFactor ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component acentric factors" ); - registerWrapper( viewKeyStruct::componentVolumeShiftString(), &m_componentVolumeShift ). + registerWrapper( viewKeyStruct::componentVolumeShiftString(), &m_componentProperties->m_componentVolumeShift ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Component volume shifts" ); - registerWrapper( viewKeyStruct::componentBinaryCoeffString(), &m_componentBinaryCoeff ). + registerWrapper( viewKeyStruct::componentBinaryCoeffString(), &m_componentProperties->m_componentBinaryCoeff ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Table of binary interaction coefficients" ); + + registerField( fields::multifluid::kValues{}, &m_kValues ); + + // Link parameters specific to each model + m_parameters->registerParameters( this ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -81,12 +99,22 @@ template<> struct PhaseName< 3 > { static constexpr char const * catalogName() { template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > string CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::catalogName() { - return GEOS_FMT( "Compositonal{}Fluid{}{}", + return GEOS_FMT( "Compositional{}Fluid{}{}", compositional::PhaseName< FLASH::KernelWrapper::getNumberOfPhases() >::catalogName(), FLASH::catalogName(), PHASE1::Viscosity::catalogName() ); } +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + MultiFluidBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); + + // Zero k-Values to force initialisation with Wilson k-Values + m_kValues.zero(); +} + template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessInput() { @@ -107,32 +135,50 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessI InputError ); }; - checkInputSize( m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); - checkInputSize( m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); - checkInputSize( m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); + checkInputSize( m_componentProperties->m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); + checkInputSize( m_componentProperties->m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); + checkInputSize( m_componentProperties->m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); - if( m_componentCriticalVolume.empty() ) + if( m_componentProperties->m_componentVolumeShift.empty() ) { - m_componentCriticalVolume.resize( NC ); - calculateCriticalVolume( m_componentCriticalPressure, - m_componentCriticalTemperature, - m_componentCriticalVolume ); + m_componentProperties->m_componentVolumeShift.resize( NC ); + m_componentProperties->m_componentVolumeShift.zero(); } - checkInputSize( m_componentCriticalVolume, NC, viewKeyStruct::componentCriticalVolumeString() ); + checkInputSize( m_componentProperties->m_componentVolumeShift, NC, viewKeyStruct::componentVolumeShiftString() ); - if( m_componentVolumeShift.empty() ) + array2d< real64 > & componentBinaryCoeff = m_componentProperties->m_componentBinaryCoeff; + if( componentBinaryCoeff.empty() ) { - m_componentVolumeShift.resize( NC ); - m_componentVolumeShift.zero(); + componentBinaryCoeff.resize( NC, NC ); + componentBinaryCoeff.zero(); } - checkInputSize( m_componentVolumeShift, NC, viewKeyStruct::componentVolumeShiftString() ); + checkInputSize( componentBinaryCoeff, NC * NC, viewKeyStruct::componentBinaryCoeffString() ); - if( m_componentBinaryCoeff.empty() ) + // Binary interaction coefficients should be symmetric and have zero diagonal + GEOS_THROW_IF_NE_MSG( componentBinaryCoeff.size( 0 ), NC, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), + InputError ); + GEOS_THROW_IF_NE_MSG( componentBinaryCoeff.size( 1 ), NC, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), + InputError ); + for( integer ic = 0; ic < NC; ++ic ) { - m_componentBinaryCoeff.resize( NC, NC ); - m_componentBinaryCoeff.zero(); + GEOS_THROW_IF_GT_MSG( LvArray::math::abs( componentBinaryCoeff( ic, ic )), MultiFluidConstants::epsilon, + GEOS_FMT( "{}: {} entry at ({},{}) is {}: should be zero", getFullName(), viewKeyStruct::componentBinaryCoeffString(), + ic, ic, componentBinaryCoeff( ic, ic ) ), + InputError ); + for( integer jc = ic + 1; jc < NC; ++jc ) + { + real64 const difference = LvArray::math::abs( componentBinaryCoeff( ic, jc )-componentBinaryCoeff( jc, ic )); + GEOS_THROW_IF_GT_MSG( difference, MultiFluidConstants::epsilon, + GEOS_FMT( "{}: {} entry at ({},{}) is {} and is different from entry at ({},{}) which is {}", + getFullName(), viewKeyStruct::componentBinaryCoeffString(), + ic, jc, componentBinaryCoeff( ic, jc ), jc, ic, componentBinaryCoeff( jc, ic ) ), + InputError ); + } } - checkInputSize( m_componentBinaryCoeff, NC * NC, viewKeyStruct::componentBinaryCoeffString() ); + + m_parameters->postProcessInput( this, *m_componentProperties ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -144,6 +190,14 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::initializePo createModels(); } +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::resizeFields( localIndex const size, localIndex const numPts ) +{ + MultiFluidBase::resizeFields( size, numPts ); + + m_kValues.resize( size, numPts, numFluidPhases()-1, numFluidComponents() ); +} + template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > std::unique_ptr< ConstitutiveBase > CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::deliverClone( string const & name, @@ -157,7 +211,6 @@ template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > typename CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::KernelWrapper CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapper() { - //auto phaseModels = std::make_tuple((m_phases)...); return KernelWrapper( *m_componentProperties, *m_flash, *m_phase1, @@ -172,58 +225,64 @@ CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapp m_phaseEnthalpy.toView(), m_phaseInternalEnergy.toView(), m_phaseCompFraction.toView(), - m_totalDensity.toView() ); + m_totalDensity.toView(), + m_kValues.toView() ); } // Create the fluid models template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModels() { - m_componentProperties = std::make_unique< compositional::ComponentProperties >( - m_componentNames, - m_componentMolarWeight, - m_componentCriticalPressure, - m_componentCriticalTemperature, - m_componentCriticalVolume, - m_componentAcentricFactor, - m_componentVolumeShift, - m_componentBinaryCoeff ); - m_flash = std::make_unique< FLASH >( getName() + '_' + FLASH::catalogName(), - *m_componentProperties ); + *m_componentProperties, + *m_parameters ); m_phase1 = std::make_unique< PHASE1 >( GEOS_FMT( "{}_PhaseModel1", getName() ), - *m_componentProperties ); + *m_componentProperties, + 0, + *m_parameters ); m_phase2 = std::make_unique< PHASE2 >( GEOS_FMT( "{}_PhaseModel2", getName() ), - *m_componentProperties ); + *m_componentProperties, + 1, + *m_parameters ); m_phase3 = std::make_unique< PHASE3 >( GEOS_FMT( "{}_PhaseModel3", getName() ), - *m_componentProperties ); + *m_componentProperties, + 2, + *m_parameters ); } +// Create the fluid models template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > -void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::calculateCriticalVolume( - arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ) const +std::unique_ptr< compositional::ModelParameters > +CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModelParameters() { - integer const numComponents = criticalPressure.size( 0 ); - for( integer ic=0; ic parameters; + parameters = FLASH::createParameters( std::move( parameters )); + parameters = PHASE1::createParameters( std::move( parameters )); + parameters = PHASE2::createParameters( std::move( parameters )); + parameters = PHASE3::createParameters( std::move( parameters )); + return parameters; } // Explicit instantiation of the model template. template class CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; template class CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; +template class CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashPRPR, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +template class CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashSRKSRK, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompositionalTwoPhasePengRobinsonConstantViscosity, @@ -235,6 +294,16 @@ REGISTER_CATALOG_ENTRY( ConstitutiveBase, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, + CompositionalTwoPhasePengRobinsonLBCViscosity, + string const &, + dataRepository::Group * const ) + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, + string const &, + dataRepository::Group * const ) + } // namespace constitutive } // namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 2f2ddf4a790..6d66c971ece 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -22,7 +22,9 @@ #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp" #include "constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp" #include "constitutive/fluid/multifluid/compositional/models/NullModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp" @@ -77,13 +79,15 @@ class CompositionalMultiphaseFluid : public MultiFluidBase GEOS_UNUSED_VAR( pressure, temperature ); } + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override; + virtual integer getWaterPhaseIndex() const override final; struct viewKeyStruct : MultiFluidBase::viewKeyStruct { static constexpr char const * componentCriticalPressureString() { return "componentCriticalPressure"; } static constexpr char const * componentCriticalTemperatureString() { return "componentCriticalTemperature"; } - static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } static constexpr char const * componentAcentricFactorString() { return "componentAcentricFactor"; } static constexpr char const * componentVolumeShiftString() { return "componentVolumeShift"; } static constexpr char const * componentBinaryCoeffString() { return "componentBinaryCoeff"; } @@ -104,49 +108,48 @@ class CompositionalMultiphaseFluid : public MultiFluidBase virtual void initializePostSubGroups() override; -private: - /** - * @brief Estimate critical volumes using Ihmels' (2010) correlation - * @details reference: http://dx.doi.org/10.1021/je100167w - * @param[in] criticalPressure The component critical pressures - * @param[in] criticalTemperature The component critical temperatures - * @param[in] criticalVolume The component critical volumes - */ - void calculateCriticalVolume( arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ) const; + virtual void resizeFields( localIndex const size, localIndex const numPts ) override; private: // Create the fluid models void createModels(); + static std::unique_ptr< compositional::ModelParameters > createModelParameters(); + // Flash model std::unique_ptr< FLASH > m_flash{}; // Phase models - std::unique_ptr< PHASE1 > m_phase1; - std::unique_ptr< PHASE2 > m_phase2; - std::unique_ptr< PHASE3 > m_phase3; + std::unique_ptr< PHASE1 > m_phase1{}; + std::unique_ptr< PHASE2 > m_phase2{}; + std::unique_ptr< PHASE3 > m_phase3{}; + // Standard EOS component input std::unique_ptr< compositional::ComponentProperties > m_componentProperties{}; - // standard EOS component input - array1d< real64 > m_componentCriticalPressure; - array1d< real64 > m_componentCriticalTemperature; - array1d< real64 > m_componentCriticalVolume; - array1d< real64 > m_componentAcentricFactor; - array1d< real64 > m_componentVolumeShift; - array2d< real64 > m_componentBinaryCoeff; + // Extra parameters specific to this model + std::unique_ptr< compositional::ModelParameters > m_parameters{}; + + // backup data + PhaseComp::ValueType m_kValues; }; -using CompositionalTwoPhasePengRobinsonConstantViscosity = CompositionalMultiphaseFluid< +using CompositionalTwoPhasePengRobinsonConstantViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashPRPR, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashSRKSRK, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; +using CompositionalTwoPhasePengRobinsonLBCViscosity = CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; -using CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity = CompositionalMultiphaseFluid< + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity = CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 2a6faab23b4..17948157954 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -45,6 +45,10 @@ CompositionalMultiphaseFluidPVTPackage::CompositionalMultiphaseFluidPVTPackage( setInputFlag( InputFlags::REQUIRED ). setDescription( "List of equation of state types for each phase" ); + registerWrapper( viewKeyStruct::constantPhaseViscosityString(), &m_constantPhaseViscosity ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Viscosity for each phase" ); + registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentCriticalPressure ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical pressures" ); @@ -104,7 +108,16 @@ void CompositionalMultiphaseFluidPVTPackage::postProcessInput() checkInputSize( m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); checkInputSize( m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); checkInputSize( m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); - checkInputSize( m_equationsOfState, NP, viewKeyStruct::equationsOfStateString() ); + + if( m_constantPhaseViscosity.empty() ) + { + m_constantPhaseViscosity.resize( NP ); + for( integer ip = 0; ip < NP; ++ip ) + { + m_constantPhaseViscosity[ip] = 0.001; // Default value = 1 cP + } + } + checkInputSize( m_constantPhaseViscosity, NP, viewKeyStruct::constantPhaseViscosityString() ); if( m_componentVolumeShift.empty() ) { @@ -167,6 +180,7 @@ CompositionalMultiphaseFluidPVTPackage::deliverClone( string const & name, CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: KernelWrapper( pvt::MultiphaseSystem & fluid, arrayView1d< pvt::PHASE_TYPE > const & phaseTypes, + arrayView1d< geos::real64 const > const & constantPhaseViscosity, arrayView1d< geos::real64 const > const & componentMolarWeight, bool useMass, PhaseProp::ViewType phaseFraction, @@ -188,7 +202,8 @@ CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: std::move( phaseCompFraction ), std::move( totalDensity ) ), m_fluid( fluid ), - m_phaseTypes( phaseTypes ) + m_phaseTypes( phaseTypes ), + m_constantPhaseViscosity( constantPhaseViscosity ) {} CompositionalMultiphaseFluidPVTPackage::KernelWrapper @@ -196,6 +211,7 @@ CompositionalMultiphaseFluidPVTPackage::createKernelWrapper() { return KernelWrapper( *m_fluid, m_phaseTypes, + m_constantPhaseViscosity, m_componentMolarWeight, m_useMass, m_phaseFraction.toView(), diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 1be5e7ccd4a..32c4af5957c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -64,6 +64,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase static constexpr char const * componentAcentricFactorString() { return "componentAcentricFactor"; } static constexpr char const * componentVolumeShiftString() { return "componentVolumeShift"; } static constexpr char const * componentBinaryCoeffString() { return "componentBinaryCoeff"; } + static constexpr char const * constantPhaseViscosityString() { return "constantPhaseViscosity"; } }; /** @@ -98,6 +99,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase KernelWrapper( pvt::MultiphaseSystem & fluid, arrayView1d< pvt::PHASE_TYPE > const & phaseTypes, + arrayView1d< real64 const > const & constantPhaseViscosity, arrayView1d< real64 const > const & componentMolarWeight, bool const useMass, PhaseProp::ViewType phaseFraction, @@ -112,6 +114,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase pvt::MultiphaseSystem & m_fluid; arrayView1d< pvt::PHASE_TYPE > m_phaseTypes; + arrayView1d< real64 const > m_constantPhaseViscosity; }; /** @@ -139,6 +142,9 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase // names of equations of state to use for each phase string_array m_equationsOfState; + // Phase viscosity + array1d< real64 > m_constantPhaseViscosity; + // standard EOS component input array1d< real64 > m_componentCriticalPressure; array1d< real64 > m_componentCriticalTemperature; @@ -239,7 +245,7 @@ CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: phaseMassDensity.derivs[ip][Deriv::dT] = massDens.dT; // TODO - phaseViscosity.value[ip] = 0.001; + phaseViscosity.value[ip] = m_constantPhaseViscosity[ip]; phaseViscosity.derivs[ip][Deriv::dP] = 0.0; phaseViscosity.derivs[ip][Deriv::dT] = 0.0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index 3ccefa5bb16..73f2d4495a8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -54,7 +54,8 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW MultiFluidBase::PhaseProp::ViewType phaseEnthalpy, MultiFluidBase::PhaseProp::ViewType phaseInternalEnergy, MultiFluidBase::PhaseComp::ViewType phaseCompFrac, - MultiFluidBase::FluidProp::ViewType totalDensity ); + MultiFluidBase::FluidProp::ViewType totalDensity, + MultiFluidBase::PhaseComp::ViewValueType kValues ); GEOS_HOST_DEVICE virtual void compute( real64 const pressure, @@ -76,6 +77,43 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW real64 const temperature, arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition ) const override; +protected: + GEOS_HOST_DEVICE + void compute( real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, + MultiFluidBase::PhaseProp::SliceType const phaseFrac, + MultiFluidBase::PhaseProp::SliceType const phaseDens, + MultiFluidBase::PhaseProp::SliceType const phaseMassDensity, + MultiFluidBase::PhaseProp::SliceType const phaseVisc, + MultiFluidBase::PhaseProp::SliceType const phaseEnthalpy, + MultiFluidBase::PhaseProp::SliceType const phaseInternalEnergy, + MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, + MultiFluidBase::FluidProp::SliceType const totalDensity, + MultiFluidBase::PhaseComp::SliceType::ValueType const & kValues ) const; + + /** + * @brief Convert derivatives from phase mole fraction to total mole fraction + * @details Given property derivatives @c dProperty where composition derivatives are with + * respect to a phase compositions, this will transform that properties so that + * they the composition derivatives are with respect to total composition. The derivatives + * of the phase composition should be provided in @c dPhaseComposition. + * @param[in] numComps The number of components + * @param[in] dPhaseComposition Derivatives of the phase composition + * @param[in,out] dProperty The derivatives of the property + * @param[in] workSpace Temporary workspace + */ + template< int USD1, int USD2 > + GEOS_HOST_DEVICE + static void convertDerivativesToTotalMoleFraction( integer const numComps, + arraySlice2d< real64 const, USD1 > const & dPhaseComposition, + arraySlice1d< real64, USD2 > const & dProperty, + arraySlice1d< real64 > const & workSpace ); + + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void setZero( real64 & val ){ val = 0.0; } + private: // The component properties compositional::ComponentProperties::KernelWrapper m_componentProperties; @@ -87,6 +125,9 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW typename PHASE1::KernelWrapper m_phase1; typename PHASE2::KernelWrapper m_phase2; typename PHASE3::KernelWrapper m_phase3; + + // Backup variables + MultiFluidBase::PhaseComp::ViewValueType m_kValues; }; template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -105,7 +146,8 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & MultiFluidBase::PhaseProp::ViewType phaseEnthalpy, MultiFluidBase::PhaseProp::ViewType phaseInternalEnergy, MultiFluidBase::PhaseComp::ViewType phaseCompFrac, - MultiFluidBase::FluidProp::ViewType totalDensity ): + MultiFluidBase::FluidProp::ViewType totalDensity, + MultiFluidBase::PhaseComp::ViewValueType kValues ): MultiFluidBase::KernelWrapper( componentMolarWeight, useMass, std::move( phaseFrac ), @@ -120,7 +162,8 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & m_flash( flash.createKernelWrapper() ), m_phase1( phase1.createKernelWrapper() ), m_phase2( phase2.createKernelWrapper() ), - m_phase3( phase3.createKernelWrapper() ) + m_phase3( phase3.createKernelWrapper() ), + m_kValues( kValues ) {} template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -140,14 +183,50 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, MultiFluidBase::FluidProp::SliceType const totalDensity ) const { - GEOS_UNUSED_VAR( phaseEnthalpy, phaseInternalEnergy ); + integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; + integer constexpr maxNumPhase = MultiFluidBase::MAX_NUM_PHASES - 1; + MultiFluidBase::PhaseComp::StackValueType< maxNumPhase *maxNumComp > kValues( 1, 1, numPhases() - 1, numComponents() ); - using Deriv = multifluid::DerivativeOffset; + LvArray::forValuesInSlice( kValues[0][0], setZero ); // Force initialisation of k-Values + + compute( pressure, + temperature, + composition, + phaseFrac, + phaseDens, + phaseMassDensity, + phaseVisc, + phaseEnthalpy, + phaseInternalEnergy, + phaseCompFrac, + totalDensity, + kValues[0][0] ); +} +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void +CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, + MultiFluidBase::PhaseProp::SliceType const phaseFrac, + MultiFluidBase::PhaseProp::SliceType const phaseDens, + MultiFluidBase::PhaseProp::SliceType const phaseMassDensity, + MultiFluidBase::PhaseProp::SliceType const phaseVisc, + MultiFluidBase::PhaseProp::SliceType const phaseEnthalpy, + MultiFluidBase::PhaseProp::SliceType const phaseInternalEnergy, + MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, + MultiFluidBase::FluidProp::SliceType const totalDensity, + MultiFluidBase::PhaseComp::SliceType::ValueType const & kValues ) const +{ integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; + integer constexpr maxNumDof = MultiFluidBase::MAX_NUM_COMPONENTS + 2; integer constexpr maxNumPhase = MultiFluidBase::MAX_NUM_PHASES; integer const numComp = numComponents(); integer const numPhase = numPhases(); + integer const numDof = numComp + 2; // 1. Convert input mass fractions to mole fractions and keep derivatives @@ -174,6 +253,7 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, compMoleFrac.toSliceConst(), + kValues, phaseFrac, phaseCompFrac ); @@ -182,7 +262,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[0].toSliceConst(), - phaseCompFrac.derivs[0].toSliceConst(), phaseDens.value[0], phaseDens.derivs[0], phaseMassDensity.value[0], @@ -192,7 +271,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[1].toSliceConst(), - phaseCompFrac.derivs[1].toSliceConst(), phaseDens.value[1], phaseDens.derivs[1], phaseMassDensity.value[1], @@ -204,7 +282,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[2].toSliceConst(), - phaseCompFrac.derivs[2].toSliceConst(), phaseDens.value[2], phaseDens.derivs[2], phaseMassDensity.value[2], @@ -217,7 +294,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[0].toSliceConst(), - phaseCompFrac.derivs[0].toSliceConst(), phaseMassDensity.value[0], phaseMassDensity.derivs[0].toSliceConst(), phaseVisc.value[0], @@ -227,7 +303,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[1].toSliceConst(), - phaseCompFrac.derivs[1].toSliceConst(), phaseMassDensity.value[1], phaseMassDensity.derivs[1].toSliceConst(), phaseVisc.value[1], @@ -239,7 +314,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[2].toSliceConst(), - phaseCompFrac.derivs[2].toSliceConst(), phaseMassDensity.value[2], phaseMassDensity.derivs[2].toSliceConst(), phaseVisc.value[2], @@ -247,23 +321,52 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( m_useMass ); } - // 5. if mass variables used instead of molar, perform the conversion + // 5. Convert derivatives from phase composition to total composition + stackArray1d< real64, maxNumDof > workSpace( numDof ); + for( integer ip = 0; ip < FLASH::KernelWrapper::getNumberOfPhases(); ++ip ) + { + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseDens.derivs[ip], + workSpace ); + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseMassDensity.derivs[ip], + workSpace ); + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseVisc.derivs[ip], + workSpace ); + } + + // 6. if mass variables used instead of molar, perform the conversion if( m_useMass ) { real64 phaseMolecularWeight[maxNumPhase]{}; real64 dPhaseMolecularWeight[maxNumPhase][maxNumComp+2]{}; + arrayView1d< real64 const > const & componentMolarWeight = m_componentProperties.m_componentMolarWeight; + for( integer ip = 0; ip < numPhase; ++ip ) { - phaseMolecularWeight[ip] = 1.0; - dPhaseMolecularWeight[ip][Deriv::dP] = 0.0; - dPhaseMolecularWeight[ip][Deriv::dT] = 0.0; + phaseMolecularWeight[ip] = 0.0; + for( integer kc = 0; kc < numDof; ++kc ) + { + dPhaseMolecularWeight[ip][kc] = 0.0; + } + + auto const & phaseComposition = phaseCompFrac.value[ip].toSliceConst(); + auto const & dPhaseComposition = phaseCompFrac.derivs[ip].toSliceConst(); + for( integer ic = 0; ic < numComp; ++ic ) { - dPhaseMolecularWeight[ip][Deriv::dC+ic] = 0.0; + phaseMolecularWeight[ip] += phaseComposition[ic] * componentMolarWeight[ic]; + for( integer kc = 0; kc < numDof; ++kc ) + { + dPhaseMolecularWeight[ip][kc] += dPhaseComposition( ic, kc ) * componentMolarWeight[ic]; + } } } - convertToMassFractions( dCompMoleFrac_dCompMassFrac, phaseMolecularWeight, dPhaseMolecularWeight, @@ -275,7 +378,7 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( phaseInternalEnergy.derivs ); } - // 6. Compute total fluid mass/molar density and derivatives + // 7. Compute total fluid mass/molar density and derivatives computeTotalDensity( phaseFrac, phaseDens, @@ -303,7 +406,37 @@ update( localIndex const k, m_phaseEnthalpy( k, q ), m_phaseInternalEnergy( k, q ), m_phaseCompFraction( k, q ), - m_totalDensity( k, q ) ); + m_totalDensity( k, q ), + m_kValues[k][q] ); +} + +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +template< int USD1, int USD2 > +GEOS_HOST_DEVICE +void +CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >:: +convertDerivativesToTotalMoleFraction( integer const numComps, + arraySlice2d< real64 const, USD1 > const & dPhaseComposition, + arraySlice1d< real64, USD2 > const & dProperty, + arraySlice1d< real64 > const & workSpace ) +{ + using Deriv = multifluid::DerivativeOffset; + integer const numDofs = numComps + 2; + for( integer kc = 0; kc < numDofs; ++kc ) + { + workSpace[kc] = dProperty[kc]; + } + for( integer ic = 0; ic < numComps; ++ic ) + { + dProperty[Deriv::dC+ic] = 0.0; + } + for( integer kc = 0; kc < numDofs; ++kc ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + dProperty[kc] += (dPhaseComposition( ic, kc ) * workSpace[Deriv::dC+ic]); + } + } } } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index d1c69c43ca1..5f48a008cfc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -17,18 +17,9 @@ */ #include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" -#ifdef GEOSX_USE_PVTPackage #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp" -#endif -#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" namespace geos { -#ifdef GEOSX_USE_PVTPackage template void PVTDriver::runTest< constitutive::CompositionalMultiphaseFluidPVTPackage >( constitutive::CompositionalMultiphaseFluidPVTPackage &, arrayView2d< real64 > const & ); -#endif -template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity >( - constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity &, arrayView2d< real64 > const & ); -template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >( - constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity &, arrayView2d< real64 > const & ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp new file mode 100644 index 00000000000..eec79c6c150 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalPR.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity >( + constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp new file mode 100644 index 00000000000..449d4459c57 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalPRLBC.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity >( + constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp new file mode 100644 index 00000000000..edcfd2af4f5 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalSRK.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >( + constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp new file mode 100644 index 00000000000..1ab0ab8b15f --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalSRKLBC.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity >( + constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp index 84f886df626..3f2d3d45c88 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp @@ -20,6 +20,7 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIES_HPP_ #include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" namespace geos { @@ -32,97 +33,51 @@ namespace compositional struct CompositionalProperties { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** - * @brief Compute the molar density of a mixture from the composition and the compressibility factor + * @brief Compute the molar density and derivatives * @param[in] numComps number of components * @param[in] pressure pressure * @param[in] temperature temperature * @param[in] composition composition of the mixture * @param[in] volumeShift dimensional volume shift parameters * @param[in] compressibilityFactor compressibility factor (z-factor) + * @param[in] compressibilityFactorDerivs derivatives of the compressibility factor (z-factor) * @param[out] molarDensity the calculated molar density - * @note The volume shifts can result in a negative molar density which will be truncated to zero + * @param[out] molarDensityDerivs derivatives of the molar density */ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static void computeMolarDensity( integer const numComps, real64 const pressure, real64 const temperature, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & volumeShift, real64 const compressibilityFactor, - real64 & molarDensity ); + arraySlice1d< real64 const > const & compressibilityFactorDerivs, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & molarDensityDerivs ); /** - * @brief Compute the molar density derivatives - * @param[in] numComps number of components - * @param[in] pressure pressure - * @param[in] temperature temperature - * @param[in] composition composition of the mixture - * @param[in] volumeShift dimensional volume shift parameters - * @param[in] compressibilityFactor compressibility factor (z-factor) - * @param[in] dCompressibilityFactor_dp derivative of the compressibility factor (z-factor) wrt pressure - * @param[in] dCompressibilityFactor_dp derivative of the compressibility factor (z-factor) wrt temperature - * @param[in] dCompressibilityFactor_dz derivative of the compressibility factor (z-factor) wrt composition - * @param[in] molarDensity the calculated molar density - * @param[out] dMolarDensity_dp derivative of the molar density wrt pressure - * @param[out] dMolarDensity_dt derivative of the molar density wrt temperature - * @param[out] dMolarDensity_dz derivative of the molar density wrt composition - */ - GEOS_HOST_DEVICE - static void computeMolarDensity( integer const numComps, - real64 const pressure, - real64 const temperature, - arraySlice1d< real64 const > const & composition, - arraySlice1d< real64 const > const & volumeShift, - real64 const compressibilityFactor, - real64 const dCompressibilityFactor_dp, - real64 const dCompressibilityFactor_dt, - arraySlice1d< real64 const > const & dCompressibilityFactor_dz, - real64 const molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const & dMolarDensity_dz ); - - /** - * @brief Compute the mass density of a mixture from the composition and the molar density + * @brief Compute the mass density and derivatives * @param[in] numComps number of components * @param[in] composition composition of the mixture * @param[in] molecularWeight the component molecular weights * @param[in] molarDensity the mixture molar density - * @param[out] massDensity the calculated mass density + * @param[in] molarDensityDerivs derivatives of the molar density + * @param[out] massDensity mass density + * @param[out] massDensityDerivs derivatives of the mass density */ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static void computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & molecularWeight, real64 const molarDensity, - real64 & massDensity ); - - /** - * @brief Compute the mass density derivatives - * @param[in] numComps number of components - * @param[in] molecularWeight the component molecular weights - * @param[in] molarDensity the mixture molar density - * @param[in] dMolarDensity_dp derivative of the molar density wrt pressure - * @param[in] dMolarDensity_dt derivative of the molar density wrt temperature - * @param[in] dMolarDensity_dz derivative of the molar density wrt composition - * @param[in] massDensity mass density - * @param[out] dMassDensity_dp derivative of the mass density wrt pressure - * @param[out] dMassDensity_dt derivative of the mass density wrt temperature - * @param[out] dMassDensity_dz derivative of the mass density wrt composition - */ - GEOS_HOST_DEVICE - static void computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & molecularWeight, - real64 const molarDensity, - real64 const dMolarDensity_dp, - real64 const dMolarDensity_dt, - arraySlice1d< real64 const > const dMolarDensity_dz, - real64 const massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const & dMassDensity_dz ); + arraySlice1d< real64 const, USD2 > const & molarDensityDerivs, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & massDensityDerivs ); }; } //namespace compositional @@ -131,4 +86,7 @@ struct CompositionalProperties } // namespace geos +// Implementation +#include "CompositionalPropertiesImpl.hpp" + #endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIES_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp similarity index 50% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp rename to src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp index 165801fa177..f602cd70308 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp @@ -13,9 +13,12 @@ */ /** - * @file CompositionalProperties.hpp + * @file CompositionalPropertiesImpl.hpp */ +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ + #include "CompositionalProperties.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" @@ -34,22 +37,24 @@ namespace compositional * Peneloux, A et al. 1982. Fluid phase equilibria, 8(1):7–23. * https://doi.org/10.1016/0378-3812(82)80002-2 */ +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void CompositionalProperties::computeMolarDensity( integer const numComps, real64 const pressure, real64 const temperature, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & volumeShift, real64 const compressibilityFactor, - real64 & molarDensity ) + arraySlice1d< real64 const > const & compressibilityFactorDerivs, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & molarDensityDerivs ) { - real64 vEos = constants::gasConstant * temperature * compressibilityFactor / pressure; real64 vCorrected = vEos; for( integer ic = 0; ic < numComps; ++ic ) { - vCorrected += composition[ic] * volumeShift[ic]; + vCorrected -= composition[ic] * volumeShift[ic]; } if( MultiFluidConstants::epsilon < vCorrected ) @@ -59,89 +64,66 @@ void CompositionalProperties::computeMolarDensity( integer const numComps, else { molarDensity = 0.0; - } -} - -GEOS_HOST_DEVICE -void CompositionalProperties::computeMolarDensity( integer const numComps, - real64 const pressure, - real64 const temperature, - arraySlice1d< real64 const > const & GEOS_UNUSED_PARAM ( composition ), - arraySlice1d< real64 const > const & volumeShift, - real64 const compressibilityFactor, - real64 const dCompressibilityFactor_dp, - real64 const dCompressibilityFactor_dt, - arraySlice1d< real64 const > const & dCompressibilityFactor_dz, - real64 const molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const & dMolarDensity_dz ) -{ - if( molarDensity < MultiFluidConstants::epsilon ) - { - dMolarDensity_dp = 0.0; - dMolarDensity_dt = 0.0; - for( integer ic = 0; ic < numComps; ++ic ) - { - dMolarDensity_dz[ic] = 0.0; - } + auto const setZero = []( real64 & val ){ val = 0.0; }; + LvArray::forValuesInSlice( molarDensityDerivs, setZero ); return; } real64 dvCorrected_dx = 0.0; // Pressure derivative - dvCorrected_dx = constants::gasConstant * temperature * (dCompressibilityFactor_dp - compressibilityFactor / pressure) / pressure; - dMolarDensity_dp = -molarDensity * molarDensity * dvCorrected_dx; + dvCorrected_dx = constants::gasConstant * temperature * (compressibilityFactorDerivs[Deriv::dP] - compressibilityFactor / pressure) / pressure; + molarDensityDerivs[Deriv::dP] = -molarDensity * molarDensity * dvCorrected_dx; // Temperature derivative - dvCorrected_dx = constants::gasConstant * (temperature * dCompressibilityFactor_dt + compressibilityFactor) / pressure; - dMolarDensity_dt = -molarDensity * molarDensity * dvCorrected_dx; + dvCorrected_dx = constants::gasConstant * (temperature * compressibilityFactorDerivs[Deriv::dT] + compressibilityFactor) / pressure; + molarDensityDerivs[Deriv::dT] = -molarDensity * molarDensity * dvCorrected_dx; // Composition derivative for( integer ic = 0; ic < numComps; ++ic ) { - dvCorrected_dx = constants::gasConstant * temperature * dCompressibilityFactor_dz[ic] / pressure + volumeShift[ic]; - dMolarDensity_dz[ic] = -molarDensity * molarDensity * dvCorrected_dx; + integer const kc = Deriv::dC + ic; + dvCorrected_dx = constants::gasConstant * temperature * compressibilityFactorDerivs[kc] / pressure - volumeShift[ic]; + molarDensityDerivs[kc] = -molarDensity * molarDensity * dvCorrected_dx; } } +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void CompositionalProperties::computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & molecularWeight, real64 const molarDensity, - real64 & massDensity ) + arraySlice1d< real64 const, USD2 > const & molarDensityDerivs, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & massDensityDerivs ) { massDensity = 0.0; for( integer ic = 0; ic < numComps; ++ic ) { massDensity += molecularWeight[ic] * composition[ic] * molarDensity; } -} -GEOS_HOST_DEVICE -void CompositionalProperties::computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & molecularWeight, - real64 const molarDensity, - real64 const dMolarDensity_dp, - real64 const dMolarDensity_dt, - arraySlice1d< real64 const > const dMolarDensity_dz, - real64 const massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const & dMassDensity_dz ) -{ - // Pressure derivative - dMassDensity_dp = massDensity * dMolarDensity_dp / molarDensity; + if( massDensity < MultiFluidConstants::epsilon ) + { + auto const setZero = []( real64 & val ){ val = 0.0; }; + LvArray::forValuesInSlice( massDensityDerivs, setZero ); + return; + } - // Temperature derivative - dMassDensity_dt = massDensity * dMolarDensity_dt / molarDensity; + real64 const oneOverMolarDensity = 1.0 / molarDensity; + + // Pressure and temperature derivatives + for( integer const kc : {Deriv::dP, Deriv::dT} ) + { + massDensityDerivs[kc] = massDensity * molarDensityDerivs[kc] * oneOverMolarDensity; + } // Composition derivative for( integer ic = 0; ic < numComps; ++ic ) { - dMassDensity_dz[ic] = massDensity * dMolarDensity_dz[ic] / molarDensity + molecularWeight[ic] * molarDensity; + integer const kc = Deriv::dC + ic; + massDensityDerivs[kc] = massDensity * molarDensityDerivs[kc] * oneOverMolarDensity + molecularWeight[ic] * molarDensity; } } @@ -150,3 +132,5 @@ void CompositionalProperties::computeMassDensity( integer const numComps, } // namespace constitutive } // namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index 8adfa65457e..d1a53eeb39e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -21,6 +21,7 @@ #include "common/DataTypes.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" namespace geos @@ -73,6 +74,7 @@ struct SoaveRedlichKwongEOS template< typename EOS_TYPE > struct CubicEOSPhaseModel { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** * @brief Generate a catalog name @@ -89,15 +91,121 @@ struct CubicEOSPhaseModel * @param[in] componentProperties The compositional component properties * @param[out] logFugacityCoefficients log of the fugacity coefficients */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeLogFugacityCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const logFugacityCoefficients ); + arraySlice1d< real64 > const & logFugacityCoefficients ); + + /** + * @brief Secondary entry point of the cubic EOS model + * @details Computes the derivatives of the logarithm of the fugacity coefficients + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[in] logFugacityCoefficients log of the fugacity coefficients + * @param[out] logFugacityCoefficientDerivs derivatives of the log of the fugacity coefficients + */ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeLogFugacityCoefficients( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const > const & logFugacityCoefficients, + arraySlice2d< real64 > const & logFugacityCoefficientDerivs ); + + /** + * @brief Compute compressibility factor for the cubic EOS model + * @details Computes the compressibility factor (z-factor) for the cubic EOS model including derivatives + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[out] compressibilityFactor the current compressibility factor + * @param[out] compressibilityFactorDerivs derivatives of the compressibility factor + */ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ); + + /** + * @brief Calculate the dimensional volume shift + * @details Computes the dimensional form of the volume shifts given the user defined non-dimensional form. + * @param[in] numComps The number of components + * @param[in] componentProperties The compositional model properties + * @param[out] dimensionalVolumeShift The calculated dimensional volume shifts + */ + GEOS_FORCE_INLINE + static void calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + arraySlice1d< real64 > const & dimensionalVolumeShift ); + + /** + * @brief Calculate the pure coefficients + * @details Computes the pure coefficients + * @param[in] ic Component index + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] aCoefficient pure coefficient (A) + * @param[out] bCoefficient pure coefficient (B) + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient ); + + /** + * @brief Calculate the pure coefficients derivatives + * @details Computes the pure coefficients derivatives + * @param[in] ic Component index + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] aCoefficient pure coefficient (A) + * @param[out] bCoefficient pure coefficient (B) + * @param[out] daCoefficient_dp pure coefficient (A) derivative w.r.t. pressure + * @param[out] dbCoefficient_dp pure coefficient (B) derivative w.r.t. pressure + * @param[out] daCoefficient_dt pure coefficient (A) derivative w.r.t. temperature + * @param[out] dbCoefficient_dt pure coefficient (B) derivative w.r.t. temperature + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient, + real64 & daCoefficient_dp, + real64 & dbCoefficient_dp, + real64 & daCoefficient_dt, + real64 & dbCoefficient_dt ); /** * @brief Compute the mixture coefficients using pressure, temperature, composition and input @@ -111,16 +219,17 @@ struct CubicEOSPhaseModel * @param[out] aMixtureCoefficient mixture coefficient (A) * @param[out] bMixtureCoefficient mixture coefficient (B) */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const aPureCoefficient, - arraySlice1d< real64 > const bPureCoefficient, + arraySlice1d< real64 > const & aPureCoefficient, + arraySlice1d< real64 > const & bPureCoefficient, real64 & aMixtureCoefficient, real64 & bMixtureCoefficient ); @@ -135,32 +244,25 @@ struct CubicEOSPhaseModel * @param[in] bPureCoefficient pure coefficient (B) * @param[in] aMixtureCoefficient mixture coefficient (A) * @param[in] bMixtureCoefficient mixture coefficient (B) - * @param[out] daMixtureCoefficient_dp derivative of mixture coefficient (A) wrt pressure - * @param[out] dbMixtureCoefficient_dp derivative of mixture coefficient (B) wrt pressure - * @param[out] daMixtureCoefficient_dt derivative of mixture coefficient (A) wrt temperature - * @param[out] dbMixtureCoefficient_dt derivative of mixture coefficient (B) wrt temperature - * @param[out] daMixtureCoefficient_dz derivative of mixture coefficient (A) wrt composition - * @param[out] dbMixtureCoefficient_dz derivative of mixture coefficient (B) wrt composition + * @param[out] aMixtureCoefficientDerivs derivatives of mixture coefficient (A) + * @param[out] bMixtureCoefficientDerivs derivatives of mixture coefficient (B) * @note Assumes that pressure and temperature are strictly positive */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const aMixtureCoefficient, real64 const bMixtureCoefficient, - real64 & daMixtureCoefficient_dp, - real64 & dbMixtureCoefficient_dp, - real64 & daMixtureCoefficient_dt, - real64 & dbMixtureCoefficient_dt, - arraySlice1d< real64 > const daMixtureCoefficient_dz, - arraySlice1d< real64 > const dbMixtureCoefficient_dz ); + arraySlice1d< real64 > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 > const & bMixtureCoefficientDerivs ); /** * @brief Compute the compressibility factor using compositions, BICs, and mixture coefficients @@ -173,14 +275,15 @@ struct CubicEOSPhaseModel * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[out] compressibilityFactor compressibility factor */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeCompressibilityFactor( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 & compressibilityFactor ); @@ -191,15 +294,9 @@ struct CubicEOSPhaseModel * @param[in] aMixtureCoefficient mixture coefficient (A) * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[in] compressibilityFactor the current compressibility factor - * @param[in] daMixtureCoefficient_dp derivative of mixture coefficient (A) wrt pressure - * @param[in] dbMixtureCoefficient_dp derivative of mixture coefficient (B) wrt pressure - * @param[in] daMixtureCoefficient_dt derivative of mixture coefficient (A) wrt temperature - * @param[in] dbMixtureCoefficient_dt derivative of mixture coefficient (B) wrt temperature - * @param[in] daMixtureCoefficient_dz derivative of mixture coefficient (A) wrt composition - * @param[in] dbMixtureCoefficient_dz derivative of mixture coefficient (B) wrt composition - * @param[out] dCompressibilityFactor_dp derivative of the compressibility factor wrt pressure - * @param[out] dCompressibilityFactor_dt derivative of the compressibility factor wrt temperature - * @param[out] dCompressibilityFactor_dz derivative of the compressibility factor wrt composition + * @param[in] aMixtureCoefficientDerivs derivatives of mixture coefficient (A) + * @param[in] bMixtureCoefficientDerivs derivatives of mixture coefficient (B) + * @param[out] compressibilityFactorDerivs derivatives of the compressibility factor * @note Assumes that pressure and temperature are strictly positive */ GEOS_HOST_DEVICE @@ -209,15 +306,9 @@ struct CubicEOSPhaseModel real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 const & compressibilityFactor, - real64 const & daMixtureCoefficient_dp, - real64 const & dbMixtureCoefficient_dp, - real64 const & daMixtureCoefficient_dt, - real64 const & dbMixtureCoefficient_dt, - arraySlice1d< real64 const > const daMixtureCoefficient_dz, - arraySlice1d< real64 const > const dbMixtureCoefficient_dz, - real64 & dCompressibilityFactor_dp, - real64 & dCompressibilityFactor_dt, - arraySlice1d< real64 > const dCompressibilityFactor_dz ); + arraySlice1d< real64 const > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 const > const & bMixtureCoefficientDerivs, + arraySlice1d< real64 > const & compressibilityFactorDerivs ); /** * @brief Compute the log of the fugacity coefficients using compositions, BICs, compressibility factor and mixture coefficients @@ -231,18 +322,19 @@ struct CubicEOSPhaseModel * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[out] logFugacityCoefficients log of the fugacity coefficients */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeLogFugacityCoefficients( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, real64 const & compressibilityFactor, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, - arraySlice1d< real64 > const logFugacityCoefficients ); + arraySlice1d< real64 > const & logFugacityCoefficients ); /** * @brief Helper functions solving a cubic equation using trigonometry @@ -267,15 +359,16 @@ struct CubicEOSPhaseModel }; template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeLogFugacityCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const logFugacityCoefficients ) + arraySlice1d< real64 > const & logFugacityCoefficients ) { // step 0: allocate the stack memory needed for the update stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > aPureCoefficient( numComps ); @@ -284,7 +377,7 @@ computeLogFugacityCoefficients( integer const numComps, real64 bMixtureCoefficient = 0.0; real64 compressibilityFactor = 0.0; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // step 1: compute the mixture coefficients aPureCoefficient, bPureCoefficient, aMixtureCoefficient, bMixtureCoefficient computeMixtureCoefficients( numComps, // number of components @@ -319,33 +412,335 @@ computeLogFugacityCoefficients( integer const numComps, logFugacityCoefficients ); // output } +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computeLogFugacityCoefficients( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const > const & logFugacityCoefficients, + arraySlice2d< real64 > const & logFugacityCoefficientDerivs ) +{ + integer constexpr numMaxComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr numMaxDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numDofs = 2 + numComps; + + GEOS_UNUSED_VAR( logFugacityCoefficients ); + + stackArray1d< real64, numMaxComps > aPureCoefficient( numComps ); + stackArray1d< real64, numMaxComps > bPureCoefficient( numComps ); + stackArray2d< real64, 2*numMaxComps > aPureCoefficientDerivs( numComps, 2 ); + stackArray2d< real64, 2*numMaxComps > bPureCoefficientDerivs( numComps, 2 ); + real64 aMixtureCoefficient = 0.0; + real64 bMixtureCoefficient = 0.0; + real64 compressibilityFactor = 0.0; + stackArray1d< real64, numMaxDofs > aMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > bMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > compressibilityFactorDerivs( numDofs ); + + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + + // 1.1: Compute the pure and mixture coefficients + computeMixtureCoefficients( numComps, // number of components + pressure, // cell input + temperature, + composition, + componentProperties, // user input, + aPureCoefficient, // output + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient ); + + // 1.2: Compute pure coefficient derivatives + for( integer ic = 0; ic < numComps; ++ic ) + { + computePureCoefficients( ic, + pressure, + temperature, + componentProperties, + aPureCoefficient[ic], + bPureCoefficient[ic], + aPureCoefficientDerivs( ic, Deriv::dP ), + bPureCoefficientDerivs( ic, Deriv::dP ), + aPureCoefficientDerivs( ic, Deriv::dT ), + bPureCoefficientDerivs( ic, Deriv::dT )); + } + + // 1.3: Compute mixture coefficient derivatives + computeMixtureCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + aPureCoefficient, + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs ); + + // 2.1: Update the compressibility factor + computeCompressibilityFactor( numComps, // number of components + composition, // cell input + binaryInteractionCoefficients, // user input + aPureCoefficient, // computed by computeMixtureCoefficients + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor ); // output + // 2.2: Update the compressibility factor derivatives + computeCompressibilityFactor( numComps, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs, + compressibilityFactorDerivs ); + + // 3. Calculate derivatives of the logarithm of the fugacity coefficients + stackArray1d< real64, numMaxComps > ki( numComps ); + stackArray2d< real64, numMaxComps * numMaxDofs > dki( numComps, numDofs ); + + // ki + for( integer ic = 0; ic < numComps; ++ic ) + { + ki[ic] = 0.0; + dki( ic, Deriv::dP ) = 0.0; + dki( ic, Deriv::dT ) = 0.0; + for( integer jc = 0; jc < numComps; ++jc ) + { + real64 const aCoeffI = sqrt( aPureCoefficient[ic] ); + real64 const aCoeffJ = sqrt( aPureCoefficient[jc] ); + real64 const kij = ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * aCoeffI * aCoeffJ; + ki[ic] += composition[jc] * kij; + dki( ic, Deriv::dC + jc ) = kij; + dki( ic, Deriv::dP ) += 0.5 * composition[jc] * kij * ( aPureCoefficientDerivs( ic, Deriv::dP )/aPureCoefficient[ic] + aPureCoefficientDerivs( jc, Deriv::dP )/aPureCoefficient[jc] ); + dki( ic, Deriv::dT ) += 0.5 * composition[jc] * kij * ( aPureCoefficientDerivs( ic, Deriv::dT )/aPureCoefficient[ic] + aPureCoefficientDerivs( jc, Deriv::dT )/aPureCoefficient[jc] ); + } + } + + auto const calculateDerivatives = [&]( integer const kc ){ + real64 const E = log( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) + - log( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + + real64 const dE_dX = (compressibilityFactorDerivs[kc] + EOS_TYPE::delta1*bMixtureCoefficientDerivs[kc])/( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) + -(compressibilityFactorDerivs[kc] + EOS_TYPE::delta2*bMixtureCoefficientDerivs[kc])/( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + + //real64 const F = log( compressibilityFactor - bMixtureCoefficient ); + real64 const dF_dX = (compressibilityFactorDerivs[kc] - bMixtureCoefficientDerivs[kc])/(compressibilityFactor - bMixtureCoefficient); + + real64 const G = 1.0 / ( ( EOS_TYPE::delta1 - EOS_TYPE::delta2 ) * bMixtureCoefficient ); + real64 const dG_dX = -G * bMixtureCoefficientDerivs[kc] / bMixtureCoefficient; + + real64 const A = aMixtureCoefficient; + real64 const dA_dX = aMixtureCoefficientDerivs[kc]; + + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const B = bPureCoefficient[ic] / bMixtureCoefficient; + real64 dB_dX = -B*bMixtureCoefficientDerivs[kc] / bMixtureCoefficient; + if( kc < Deriv::dC ) + { + dB_dX += bPureCoefficientDerivs( ic, kc ) / bMixtureCoefficient; + } + + // lnPhi = ( compressibilityFactor - 1 ) * B - F - G * ( 2 * ki[ic] - A * B ) * E; + logFugacityCoefficientDerivs( ic, kc ) = + compressibilityFactorDerivs[kc]*B + ( compressibilityFactor - 1 ) * dB_dX + - dF_dX + - dG_dX * ( 2 * ki[ic] - A * B ) * E + - G * ( 2 * dki( ic, kc ) - dA_dX * B - A * dB_dX ) * E + - G * ( 2 * ki[ic] - A * B ) * dE_dX; + } + }; + + calculateDerivatives( Deriv::dP ); + calculateDerivatives( Deriv::dT ); + + for( integer jc = 0; jc < numComps; ++jc ) + { + calculateDerivatives( Deriv::dC+jc ); + } +} + +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) +{ + // step 0: allocate the stack memory needed for the update + integer constexpr numMaxComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr numMaxDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numDofs = 2 + numComps; + + stackArray1d< real64, numMaxComps > aPureCoefficient( numComps ); + stackArray1d< real64, numMaxComps > bPureCoefficient( numComps ); + real64 aMixtureCoefficient = 0.0; + real64 bMixtureCoefficient = 0.0; + stackArray1d< real64, numMaxDofs > aMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > bMixtureCoefficientDerivs( numDofs ); + + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + + // step 1: compute the mixture coefficients aPureCoefficient, bPureCoefficient, aMixtureCoefficient, bMixtureCoefficient + // 1.1: Compute the pure and mixture coefficients + computeMixtureCoefficients( numComps, // number of components + pressure, // cell input + temperature, + composition, + componentProperties, // user input, + aPureCoefficient, // output + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient ); + + // 1.2: Compute mixture coefficient derivatives + computeMixtureCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + aPureCoefficient, + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs ); + + // 2.1: Update the compressibility factor + computeCompressibilityFactor( numComps, // number of components + composition, // cell input + binaryInteractionCoefficients, // user input + aPureCoefficient, // computed by computeMixtureCoefficients + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor ); // output + + // 2.2: Update the compressibility factor derivatives + computeCompressibilityFactor( numComps, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs, + compressibilityFactorDerivs ); +} + +template< typename EOS_TYPE > +void +CubicEOSPhaseModel< EOS_TYPE >:: +calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + arraySlice1d< real64 > const & dimensionalVolumeShift ) +{ + integer const numComps = componentProperties.getNumberOfComponents(); + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const Vs = componentProperties.getComponentVolumeShift()[ic]; + real64 const Pc = componentProperties.getComponentCriticalPressure()[ic]; + real64 const Tc = componentProperties.getComponentCriticalTemperature()[ic]; + real64 constexpr omegaB = EOS_TYPE::omegaB; + dimensionalVolumeShift[ic] = constants::gasConstant * Vs * omegaB * Tc / Pc; + } +} + template< typename EOS_TYPE > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: +computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient ) +{ + real64 daCoefficient_dp = 0.0; + real64 dbCoefficient_dp = 0.0; + real64 daCoefficient_dt = 0.0; + real64 dbCoefficient_dt = 0.0; + computePureCoefficients( ic, + pressure, + temperature, + componentProperties, + aCoefficient, + bCoefficient, + daCoefficient_dp, + dbCoefficient_dp, + daCoefficient_dt, + dbCoefficient_dt ); +} + + +template< typename EOS_TYPE > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient, + real64 & daCoefficient_dp, + real64 & dbCoefficient_dp, + real64 & daCoefficient_dt, + real64 & dbCoefficient_dt ) +{ + arraySlice1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; + arraySlice1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; + arraySlice1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; + + real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); + real64 const pr = pressure / criticalPressure[ic]; + real64 const tr = temperature / criticalTemperature[ic]; + + real64 const sqrtTr = sqrt( tr ); + real64 const mt = 1.0 + m * (1.0 - sqrtTr); + + aCoefficient = EOS_TYPE::omegaA * pr / (tr*tr) * mt * mt; + bCoefficient = EOS_TYPE::omegaB * pr / tr; + + daCoefficient_dp = aCoefficient / pressure; + dbCoefficient_dp = bCoefficient / pressure; + + daCoefficient_dt = -aCoefficient * (2.0/temperature + m/(mt * sqrtTr * criticalTemperature[ic])); + dbCoefficient_dt = -bCoefficient / temperature; +} + +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const aPureCoefficient, - arraySlice1d< real64 > const bPureCoefficient, + arraySlice1d< real64 > const & aPureCoefficient, + arraySlice1d< real64 > const & bPureCoefficient, real64 & aMixtureCoefficient, real64 & bMixtureCoefficient ) { - arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; - arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; - arrayView1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // mixture coefficients for( integer ic = 0; ic < numComps; ++ic ) { - real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); - real64 const pr = pressure / criticalPressure[ic]; - real64 const tr = temperature / criticalTemperature[ic]; - aPureCoefficient[ic] = EOS_TYPE::omegaA * pr / (tr*tr) * pow( 1.0 + m * ( 1.0 - sqrt( tr ) ), 2.0 ); - bPureCoefficient[ic] = EOS_TYPE::omegaB * pr / tr; + computePureCoefficients( ic, pressure, temperature, componentProperties, aPureCoefficient[ic], bPureCoefficient[ic] ); } aMixtureCoefficient = 0.0; @@ -354,89 +749,85 @@ computeMixtureCoefficients( integer const numComps, { for( integer jc = 0; jc < numComps; ++jc ) { - aMixtureCoefficient += ( composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ) ); + aMixtureCoefficient += composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); } bMixtureCoefficient += composition[ic] * bPureCoefficient[ic]; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const aMixtureCoefficient, real64 const bMixtureCoefficient, - real64 & daMixtureCoefficient_dp, - real64 & dbMixtureCoefficient_dp, - real64 & daMixtureCoefficient_dt, - real64 & dbMixtureCoefficient_dt, - arraySlice1d< real64 > const daMixtureCoefficient_dz, - arraySlice1d< real64 > const dbMixtureCoefficient_dz ) + arraySlice1d< real64 > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 > const & bMixtureCoefficientDerivs ) { - arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; - arrayView1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - - stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > daPureCoefficient_dx( numComps ); + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // Calculate pressure derivatives - daMixtureCoefficient_dp = aMixtureCoefficient / pressure; - dbMixtureCoefficient_dp = bMixtureCoefficient / pressure; + aMixtureCoefficientDerivs[Deriv::dP] = aMixtureCoefficient / pressure; + bMixtureCoefficientDerivs[Deriv::dP] = bMixtureCoefficient / pressure; // Calculate temperature derivatives + real64 aCoefficient = 0.0; + real64 bCoefficient = 0.0; + real64 dummy = 0.0; + stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > daPureCoefficient_dt( numComps ); for( integer ic = 0; ic < numComps; ++ic ) { - real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); - real64 const sqrtTr = sqrt( temperature / criticalTemperature[ic] ); - real64 const mt = 1.0 + m * (1.0 - sqrtTr); - daPureCoefficient_dx[ic] = -aPureCoefficient[ic] * (2.0/temperature + m/(mt*sqrtTr*criticalTemperature[ic])); + computePureCoefficients( ic, pressure, temperature, componentProperties, + aCoefficient, bCoefficient, dummy, dummy, daPureCoefficient_dt[ic], dummy ); } - daMixtureCoefficient_dt = 0.0; - dbMixtureCoefficient_dt = -bMixtureCoefficient / temperature; + aMixtureCoefficientDerivs[Deriv::dT] = 0.0; + bMixtureCoefficientDerivs[Deriv::dT] = -bMixtureCoefficient / temperature; for( integer ic = 0; ic < numComps; ++ic ) { for( integer jc = 0; jc < numComps; ++jc ) { real64 const coeff = composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) / sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); - daMixtureCoefficient_dt += 0.5 * coeff * (daPureCoefficient_dx[ic]*aPureCoefficient[jc] + daPureCoefficient_dx[jc]*aPureCoefficient[ic]); + aMixtureCoefficientDerivs[Deriv::dT] += 0.5 * coeff * (daPureCoefficient_dt[ic]*aPureCoefficient[jc] + daPureCoefficient_dt[jc]*aPureCoefficient[ic]); } } // Calculate composition derivatives for( integer ic = 0; ic < numComps; ++ic ) { - daMixtureCoefficient_dz[ic] = 0.0; - dbMixtureCoefficient_dz[ic] = 0.0; + aMixtureCoefficientDerivs[Deriv::dC+ic] = 0.0; + bMixtureCoefficientDerivs[Deriv::dC+ic] = 0.0; } for( integer ic = 0; ic < numComps; ++ic ) { for( integer jc = 0; jc < numComps; ++jc ) { real64 const coeff = ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); - daMixtureCoefficient_dz[ic] += coeff * composition[jc]; - daMixtureCoefficient_dz[jc] += coeff * composition[ic]; + aMixtureCoefficientDerivs[Deriv::dC+ic] += coeff * composition[jc]; + aMixtureCoefficientDerivs[Deriv::dC+jc] += coeff * composition[ic]; } - dbMixtureCoefficient_dz[ic] = bPureCoefficient[ic]; + bMixtureCoefficientDerivs[Deriv::dC+ic] = bPureCoefficient[ic]; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 & compressibilityFactor ) @@ -505,80 +896,61 @@ computeCompressibilityFactor( integer const numComps, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 const & compressibilityFactor, - real64 const & daMixtureCoefficient_dp, - real64 const & dbMixtureCoefficient_dp, - real64 const & daMixtureCoefficient_dt, - real64 const & dbMixtureCoefficient_dt, - arraySlice1d< real64 const > const daMixtureCoefficient_dz, - arraySlice1d< real64 const > const dbMixtureCoefficient_dz, - real64 & dcompressibilityFactor_dp, - real64 & dcompressibilityFactor_dt, - arraySlice1d< real64 > const dcompressibilityFactor_dz ) + arraySlice1d< real64 const > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 const > const & bMixtureCoefficientDerivs, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) { - // a Z3 + b Z2 + cZ + d = 0 - // Derivatives for a,b,c,d - // dadx is zero; - real64 dbdx = 0.0; - real64 dcdx = 0.0; - real64 dddx = 0.0; - - constexpr real64 d1pd2 = EOS_TYPE::delta1 + EOS_TYPE::delta2; - constexpr real64 d1xd2 = EOS_TYPE::delta1 * EOS_TYPE::delta2; + real64 constexpr d1pd2 = EOS_TYPE::delta1 + EOS_TYPE::delta2; + real64 constexpr d1xd2 = EOS_TYPE::delta1 * EOS_TYPE::delta2; - constexpr real64 a = 1.0; + real64 constexpr a = 1.0; real64 const b = ( d1pd2 - 1.0 ) * bMixtureCoefficient - 1.0; real64 const c = aMixtureCoefficient + d1xd2 * bMixtureCoefficient * bMixtureCoefficient - d1pd2 * bMixtureCoefficient * ( bMixtureCoefficient + 1.0 ); // Implicit differentiation scale real64 const denominator = (3.0*a*compressibilityFactor + 2.0*b)*compressibilityFactor + c; - constexpr real64 epsilon = MultiFluidConstants::epsilon; - real64 const scalingFactor = fabs( denominator ) < epsilon ? 0.0 : -1.0 / denominator; - - // Pressure derivatives - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dp; - dcdx = daMixtureCoefficient_dp + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dp; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dp + daMixtureCoefficient_dp*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dp)); - dcompressibilityFactor_dp = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; - - // Temperature derivatives - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dt; - dcdx = daMixtureCoefficient_dt + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dt; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dt + daMixtureCoefficient_dt*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dt)); - dcompressibilityFactor_dt = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; - - // Composition derivatives - for( integer ic = 0; ic < numComps; ++ic ) + real64 const scalingFactor = LvArray::math::abs( denominator ) < MultiFluidConstants::epsilon ? 0.0 : -1.0 / denominator; + + integer const numDofs = numComps + 2; + + for( integer kc = 0; kc < numDofs; ++kc ) { - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dz[ic]; - dcdx = daMixtureCoefficient_dz[ic] + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dz[ic]; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dz[ic] + daMixtureCoefficient_dz[ic]*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dz[ic])); - dcompressibilityFactor_dz[ic] = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; + // Given derivative of the mixture parameters a and b w.r.t. variable X, calculate the derivative of the + // compressibility factor (z-factor) w.r.t. X + real64 const da_dX = aMixtureCoefficientDerivs[kc]; + real64 const db_dX = bMixtureCoefficientDerivs[kc]; + // a Z3 + b Z2 + cZ + d = 0 + // Derivatives for a,b,c,d + real64 const dbdx = ( d1pd2 - 1.0 ) * db_dX; + real64 const dcdx = da_dX + ( 2.0*(d1xd2-d1pd2) * bMixtureCoefficient - d1pd2 )*db_dX; + real64 const dddx = -(aMixtureCoefficient*db_dX + da_dX*bMixtureCoefficient + + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*db_dX)); + compressibilityFactorDerivs[kc] = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeLogFugacityCoefficients( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, real64 const & compressibilityFactor, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, - arraySlice1d< real64 > const logFugacityCoefficients ) + arraySlice1d< real64 > const & logFugacityCoefficients ) { stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > ki( numComps ); // ki for( integer ic = 0; ic < numComps; ++ic ) { + ki[ic] = 0.0; for( integer jc = 0; jc < numComps; ++jc ) { ki[ic] += composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); @@ -586,9 +958,13 @@ computeLogFugacityCoefficients( integer const numComps, } // E - real64 const E = log( ( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) - / ( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ) ); - real64 const F = log( compressibilityFactor - bMixtureCoefficient ); + real64 const expE = ( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) / + ( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + real64 const expF = compressibilityFactor - bMixtureCoefficient; + GEOS_ERROR_IF( expE < MultiFluidConstants::epsilon || expF < MultiFluidConstants::epsilon, + GEOS_FMT( "Cubic EOS failed with exp(E)={} and exp(F)={}", expE, expF )); + real64 const E = log( expE ); + real64 const F = log( expF ); real64 const G = 1.0 / ( ( EOS_TYPE::delta1 - EOS_TYPE::delta2 ) * bMixtureCoefficient ); real64 const A = aMixtureCoefficient; @@ -644,6 +1020,9 @@ solveCubicPolynomial( real64 const & m3, } } +using CubicEOSPR = CubicEOSPhaseModel< PengRobinsonEOS >; +using CubicEOSSRK = CubicEOSPhaseModel< SoaveRedlichKwongEOS >; + } // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index 0ef7352233e..69e9d330496 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -42,6 +42,7 @@ struct KValueInitialization * @param[in] componentProperties The compositional component properties * @param[out] kValues the calculated k-values **/ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void @@ -49,7 +50,7 @@ struct KValueInitialization real64 const pressure, real64 const temperature, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const kValues ) + arraySlice1d< real64, USD > const & kValues ) { arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; @@ -62,6 +63,39 @@ struct KValueInitialization } } + /** + * @brief Calculate gas-liquid k-values near the convergence pressure + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] kValues the calculated k-values + **/ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeConstantLiquidKvalue( integer const numComps, + real64 const pressure, + real64 const temperature, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64, USD > const & kValues ) + { + GEOS_UNUSED_VAR( pressure, temperature ); + arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; + real64 averagePressure = 0.0; // Average pressure + for( integer ic = 0; ic < numComps; ++ic ) + { + averagePressure += criticalPressure[ic]; + } + averagePressure /= numComps; + constexpr real64 kValueGap = 0.01; + for( integer ic = 0; ic < numComps; ++ic ) + { + kValues[ic] = criticalPressure[ic] < averagePressure ? 1.0/(1.0 + kValueGap) : 1.0/(1.0 - kValueGap); + } + } + /** * @brief Calculate water-gas k-value * @param[in] pressure pressure diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 7cd8e9508cf..1b9a9a5bc57 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -24,6 +24,7 @@ #include "KValueInitialization.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" +#include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" namespace geos { @@ -36,6 +37,7 @@ namespace compositional struct NegativeTwoPhaseFlash { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** * @brief Perform negative two-phase EOS flash @@ -49,23 +51,28 @@ struct NegativeTwoPhaseFlash * @param[out] vapourComposition the calculated vapour phase composition * @return an indicator of success of the flash */ - template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2, integer USD3 > GEOS_HOST_DEVICE static bool compute( integer const numComps, real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD1 > const & composition, ComponentProperties::KernelWrapper const & componentProperties, + arraySlice2d< real64, USD3 > const & kValues, real64 & vapourPhaseMoleFraction, - arrayView1d< real64 > const liquidComposition, - arrayView1d< real64 > const vapourComposition ) + arraySlice1d< real64, USD2 > const & liquidComposition, + arraySlice1d< real64, USD2 > const & vapourComposition ) { constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); - stackArray1d< real64, maxNumComps > kVapourLiquid( numComps ); stackArray1d< real64, maxNumComps > fugacityRatios( numComps ); - stackArray1d< integer, maxNumComps > presentComponentIds( numComps ); + stackArray1d< integer, maxNumComps > availableComponents( numComps ); + auto const & kVapourLiquid = kValues[0]; + + calculatePresentComponents( numComps, composition, availableComponents ); + + auto const presentComponents = availableComponents.toSliceConst(); // Initialise compositions to feed composition for( integer ic = 0; ic < numComps; ++ic ) @@ -74,109 +81,313 @@ struct NegativeTwoPhaseFlash vapourComposition[ic] = composition[ic]; } - // Check for machine-zero feed values - integer presentCount = 0; + // Check if k-Values need to be initialised + bool needInitialisation = true; for( integer ic = 0; ic < numComps; ++ic ) { - if( MultiFluidConstants::epsilon < composition[ic] ) + if( kVapourLiquid[ic] < MultiFluidConstants::epsilon ) { - presentComponentIds[presentCount++] = ic; + needInitialisation = true; + break; } } - presentComponentIds.resize( presentCount ); - KValueInitialization::computeWilsonGasLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); + bool kValueReset = true; + constexpr real64 boundsTolerance = MultiFluidConstants::SSITolerance; + if( needInitialisation ) + { + KValueInitialization::computeWilsonGasLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + } + + vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); + real64 const initialVapourFraction = vapourPhaseMoleFraction; bool converged = false; for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) { - // Solve Rachford-Rice Equation - vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid, composition, presentComponentIds ); + real64 const error = computeFugacityRatio< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + numComps, + pressure, + temperature, + composition, + componentProperties, + kVapourLiquid.toSliceConst(), + presentComponents, + vapourPhaseMoleFraction, + liquidComposition, + vapourComposition, + logLiquidFugacity.toSlice(), + logVapourFugacity.toSlice(), + fugacityRatios.toSlice() ); - // Assign phase compositions - for( integer const ic : presentComponentIds ) + // Compute fugacity ratios and check convergence + converged = (error < MultiFluidConstants::fugacityTolerance); + + if( converged ) { - liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kVapourLiquid[ic] - 1.0 ) ); - vapourComposition[ic] = kVapourLiquid[ic] * liquidComposition[ic]; + break; } - normalizeComposition( numComps, liquidComposition ); - normalizeComposition( numComps, vapourComposition ); + // Update K-values + if( (vapourPhaseMoleFraction < -boundsTolerance || vapourPhaseMoleFraction > 1.0+boundsTolerance) + && 0.2 < LvArray::math::abs( vapourPhaseMoleFraction-initialVapourFraction ) + && !kValueReset ) + { + KValueInitialization::computeConstantLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + kValueReset = true; + } + else + { + for( integer const ic : presentComponents ) + { + kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); + } + } + } + + // Retrieve physical bounds from negative flash values + if( vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 0.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + else if( 1.0 - vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 1.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + + return converged; + } + + /** + * @brief Calculate derivatives from the two-phase negative flash + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the mixture + * @param[in] componentProperties The compositional component properties + * @param[in] vapourFraction the calculated vapour (gas) mole fraction + * @param[in] liquidComposition the calculated liquid phase composition + * @param[in] vapourComposition the calculated vapour phase composition + * @param[out] vapourFractionDerivs derivatives of the calculated vapour (gas) mole fraction + * @param[out] liquidCompositionDerivs derivatives of the calculated liquid phase composition + * @param[out] vapourCompositionDerivs derivatives of the calculated vapour phase composition + */ + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2 > + GEOS_HOST_DEVICE + static void computeDerivatives( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const vapourFraction, + arraySlice1d< real64 const, USD1 > const & liquidComposition, + arraySlice1d< real64 const, USD1 > const & vapourComposition, + arraySlice1d< real64, USD1 > const & vapourFractionDerivs, + arraySlice2d< real64, USD2 > const & liquidCompositionDerivs, + arraySlice2d< real64, USD2 > const & vapourCompositionDerivs ) + { + constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + constexpr integer maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + + integer const numDofs = numComps + 2; + + auto const setZero = []( real64 & val ) { val = 0.0; }; + LvArray::forValuesInSlice( vapourFractionDerivs, setZero ); + LvArray::forValuesInSlice( liquidCompositionDerivs, setZero ); + LvArray::forValuesInSlice( vapourCompositionDerivs, setZero ); + + // Check if we are single or 2-phase + if( vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else if( 1.0 - vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else + { + // Calculate the liquid and vapour fugacities and derivatives + stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); + stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); + stackArray2d< real64, maxNumComps * maxNumDofs > logLiquidFugacityDerivs( numComps, numDofs ); + stackArray2d< real64, maxNumComps * maxNumDofs > logVapourFugacityDerivs( numComps, numDofs ); - // Compute the phase fugacities EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, pressure, temperature, liquidComposition, componentProperties, logLiquidFugacity ); + EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + liquidComposition, + componentProperties, + logLiquidFugacity, + logLiquidFugacityDerivs ); EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, pressure, temperature, vapourComposition, componentProperties, logVapourFugacity ); + EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + vapourComposition, + componentProperties, + logVapourFugacity, + logVapourFugacityDerivs ); - // Compute fugacity ratios and check convergence - converged = true; + constexpr integer maxNumVals = 2*MultiFluidConstants::MAX_NUM_COMPONENTS+1; + integer const numVals = 2*numComps; + stackArray1d< real64, maxNumVals > b( numVals + 1 ); + stackArray1d< real64, maxNumVals > x( numVals + 1 ); + stackArray2d< real64, maxNumVals * maxNumVals > A( numVals + 1, numVals + 1 ); - for( integer const ic : presentComponentIds ) + LvArray::forValuesInSlice( A.toSlice(), setZero ); + LvArray::forValuesInSlice( b.toSlice(), setZero ); + + for( integer ic = 0; ic < numComps; ++ic ) { - fugacityRatios[ic] = exp( logLiquidFugacity[ic] - logVapourFugacity[ic] ) * liquidComposition[ic] / vapourComposition[ic]; - if( MultiFluidConstants::fugacityTolerance < fabs( fugacityRatios[ic] - 1.0 ) ) + integer const xi = ic; + integer const yi = ic + numComps; + integer const vi = numVals; + + integer e = ic; + A( e, xi ) = 1.0 - vapourFraction; + A( e, yi ) = vapourFraction; + A( e, vi ) = vapourComposition[ic] - liquidComposition[ic]; + + e = ic + numComps; + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + for( integer jc = 0; jc < numComps; ++jc ) { - converged = false; + integer const xj = jc; + integer const yj = jc + numComps; + real64 const dPhiLdx = logLiquidFugacityDerivs( ic, Deriv::dC+jc ); + real64 const dPhiVdy = logVapourFugacityDerivs( ic, Deriv::dC+jc ); + A( e, xj ) = liquidComposition[ic] * phiL * dPhiLdx; + A( e, yj ) = -vapourComposition[ic] * phiV * dPhiVdy; } - } + A( e, xi ) += phiL; + A( e, yi ) -= phiV; - if( converged ) - { - break; + e = numVals; + A( e, xi ) = -1.0; + A( e, yi ) = 1.0; } - - // Update K-values - for( integer const ic : presentComponentIds ) + // Pressure and temperature derivatives + for( integer const pc : {Deriv::dP, Deriv::dT} ) { - kVapourLiquid[ic] *= fugacityRatios[ic]; + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + b( ic ) = 0.0; + b( ic + numComps ) = -liquidComposition[ic] * phiL * logLiquidFugacityDerivs( ic, pc ) + + vapourComposition[ic] * phiV * logVapourFugacityDerivs( ic, pc ); + } + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); } - } - - // Retrieve physical bounds from negative flash values - if( vapourPhaseMoleFraction <= 0.0 ) - { - vapourPhaseMoleFraction = 0.0; - for( integer ic = 0; ic < numComps; ++ic ) + // Composition derivatives + for( integer kc = 0; kc < numComps; ++kc ) { - liquidComposition[ic] = composition[ic]; + integer const pc = Deriv::dC + kc; + + for( integer ic = 0; ic < numComps; ++ic ) + { + b( ic ) = -composition[ic]; + b( ic + numComps ) = 0.0; + } + b( kc ) += 1.0; + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); } } - else if( 1.0 <= vapourPhaseMoleFraction ) + } + +private: + /** + * @brief Calculate which components are present. + * @details Creates a list of indices whose components have non-zero mole fraction. + * @param[in] numComps number of components + * @param[in] composition the composition of the fluid + * @param[out] presentComponents the list of present components + * @return the number of present components + */ + template< typename ARRAY > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static integer calculatePresentComponents( integer const numComps, + arraySlice1d< real64 const > const & composition, + ARRAY & presentComponents ) + { + // Check for machine-zero feed values + integer presentCount = 0; + for( integer ic = 0; ic < numComps; ++ic ) { - vapourPhaseMoleFraction = 1.0; - for( integer ic = 0; ic < numComps; ++ic ) + if( MultiFluidConstants::epsilon < composition[ic] ) { - vapourComposition[ic] = composition[ic]; + presentComponents[presentCount++] = ic; } } - - return converged; + presentComponents.resize( presentCount ); + return presentCount; } -private: /** * @brief Normalise a composition in place to ensure that the components add up to unity * @param[in] numComps number of components * @param[in/out] composition composition to be normalized * @return the sum of the given values */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static real64 normalizeComposition( integer const numComps, - arraySlice1d< real64 > const composition ) + arraySlice1d< real64, USD > const & composition ) { real64 totalMoles = 0.0; for( integer ic = 0; ic < numComps; ++ic ) @@ -190,6 +401,77 @@ struct NegativeTwoPhaseFlash } return totalMoles; } + + /** + * @brief Calculate the logarithms of the fugacity ratios + * @param[in] numComps number of components + * @param[in] composition composition to be normalized + */ + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD > + GEOS_HOST_DEVICE + static real64 computeFugacityRatio( + integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< integer const > const & presentComponents, + real64 & vapourPhaseMoleFraction, + arraySlice1d< real64, USD > const & liquidComposition, + arraySlice1d< real64, USD > const & vapourComposition, + arraySlice1d< real64 > const & logLiquidFugacity, + arraySlice1d< real64 > const & logVapourFugacity, + arraySlice1d< real64 > const & fugacityRatios ) + { + // Solve Rachford-Rice Equation + vapourPhaseMoleFraction = RachfordRice::solve( kValues, composition, presentComponents ); + + // Assign phase compositions + for( integer const ic : presentComponents ) + { + liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kValues[ic] - 1.0 ) ); + vapourComposition[ic] = kValues[ic] * liquidComposition[ic]; + } + normalizeComposition( numComps, liquidComposition ); + normalizeComposition( numComps, vapourComposition ); + + // Compute the phase fugacities + EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + liquidComposition.toSliceConst(), + componentProperties, + logLiquidFugacity ); + EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + vapourComposition.toSliceConst(), + componentProperties, + logVapourFugacity ); + + // Compute fugacity ratios and calculate the error + real64 error = 0.0; + for( integer const ic : presentComponents ) + { + fugacityRatios[ic] = ( logLiquidFugacity[ic] - logVapourFugacity[ic] ) + log( liquidComposition[ic] ) - log( vapourComposition[ic] ); + error += (fugacityRatios[ic]*fugacityRatios[ic]); + } + return LvArray::math::sqrt( error ); + } + + GEOS_HOST_DEVICE + static bool solveLinearSystem( arraySlice2d< real64 const > const & A, + arraySlice1d< real64 const > const & b, + arraySlice1d< real64 > const & x ) + { +#if defined(GEOS_DEVICE_COMPILE) + return false; +#else + BlasLapackLA::solveLinearSystem( A, b, x ); + return true; +#endif + } }; } // namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp index af7c05bb428..e166ad1157b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -21,6 +21,7 @@ #include "common/DataTypes.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" namespace geos { @@ -44,36 +45,24 @@ struct RachfordRice /** * @brief Function solving the Rachford-Rice equation - * @input[in] kValues the array fo K-values + * @input[in] kValues the array of K-values * @input[in] feed the component fractions * @input[in] presentComponentIds the indices of components with a non-zero fractions * @return the gas mole fraction **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - solve( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds ) + solve( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds ) { real64 gasPhaseMoleFraction = 0; // min and max Kvalues for non-zero composition - real64 maxK = 0.0; - real64 minK = 1 / epsilon; - - for( integer i = 0; i < presentComponentIds.size(); ++i ) - { - integer const ic = presentComponentIds[i]; - if( kValues[ic] > maxK ) - { - maxK = kValues[ic]; - } - if( kValues[ic] < minK ) - { - minK = kValues[ic]; - } - } + real64 minK, maxK; + findKValueRange( kValues, presentComponentIds, minK, maxK ); // check for trivial solutions. // this corresponds to bad Kvalues @@ -179,12 +168,13 @@ struct RachfordRice * @input[in] x the value at which the Rachford-Rice function is evaluated * @return the value of the Rachford-Rice function at x **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - evaluate( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds, + evaluate( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds, real64 const & x ) { real64 value = 0.0; @@ -205,12 +195,13 @@ struct RachfordRice * @input[in] x the value at which the derivative of the Rachford-Rice function is evaluated * @return the value of the derivative of the Rachford-Rice function at x **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - evaluateDerivative( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds, + evaluateDerivative( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds, real64 const & x ) { real64 value = 0.0; @@ -224,6 +215,38 @@ struct RachfordRice return value; } + /** + * @brief Calculate the minimum and maximum k-value + * @input[in] kValues the array fo K-values + * @input[in] presentComponentIds the indices of components with a non-zero fractions + * @input[out] minK the minimum k-value for non-zero components + * @input[out] maxK the maximum k-value for non-zero components + **/ + template< integer USD > + GEOS_FORCE_INLINE + GEOS_HOST_DEVICE + void + static + findKValueRange( arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< integer const > const & presentComponentIds, + real64 & minK, + real64 & maxK ) + { + minK = 1.0 / epsilon; + maxK = 0.0; + for( integer const ic : presentComponentIds ) + { + if( kValues[ic] > maxK ) + { + maxK = kValues[ic]; + } + if( kValues[ic] < minK ) + { + minK = kValues[ic]; + } + } + } + }; } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index 2dec4ae3c57..f5a1e43a2e9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -37,21 +37,9 @@ class ComponentProperties final { public: ComponentProperties( string_array const & componentNames, - array1d< real64 > const & componentMolarWeight, - array1d< real64 > const & componentCriticalPressure, - array1d< real64 > const & componentCriticalTemperature, - array1d< real64 > const & componentCriticalVolume, - array1d< real64 > const & componentAcentricFactor, - array1d< real64 > const & componentVolumeShift, - array2d< real64 > const & componentBinaryCoeff ): + array1d< real64 > const & componentMolarWeight ): m_componentNames ( componentNames ), - m_componentMolarWeight ( componentMolarWeight ), - m_componentCriticalPressure ( componentCriticalPressure ), - m_componentCriticalTemperature( componentCriticalTemperature ), - m_componentCriticalVolume( componentCriticalVolume ), - m_componentAcentricFactor( componentAcentricFactor ), - m_componentVolumeShift( componentVolumeShift ), - m_componentBinaryCoeff( componentBinaryCoeff ) + m_componentMolarWeight ( componentMolarWeight ) {} ~ComponentProperties() = default; @@ -64,19 +52,26 @@ class ComponentProperties final */ integer getNumberOfComponents() const { return m_componentNames.size(); } + /** + * Data accessors + */ + arrayView1d< real64 > const & getComponentMolarWeight() const { return m_componentMolarWeight; } + arrayView1d< real64 > const & getComponentCriticalPressure() const { return m_componentCriticalPressure; } + arrayView1d< real64 > const & getComponentCriticalTemperature() const { return m_componentCriticalTemperature; } + arrayView1d< real64 > const & getComponentAcentricFactor() const { return m_componentAcentricFactor; } + arrayView1d< real64 > const & getComponentVolumeShift() const { return m_componentVolumeShift; } + struct KernelWrapper { KernelWrapper( arrayView1d< real64 const > const & componentMolarWeight, arrayView1d< real64 const > const & componentCriticalPressure, arrayView1d< real64 const > const & componentCriticalTemperature, - arrayView1d< real64 const > const & componentCriticalVolume, arrayView1d< real64 const > const & componentAcentricFactor, arrayView1d< real64 const > const & componentVolumeShift, arrayView2d< real64 const > const & componentBinaryCoeff ): m_componentMolarWeight ( componentMolarWeight ), m_componentCriticalPressure ( componentCriticalPressure ), m_componentCriticalTemperature( componentCriticalTemperature ), - m_componentCriticalVolume( componentCriticalVolume ), m_componentAcentricFactor( componentAcentricFactor ), m_componentVolumeShift( componentVolumeShift ), m_componentBinaryCoeff( componentBinaryCoeff ) @@ -94,7 +89,6 @@ class ComponentProperties final m_componentMolarWeight.move( space, touch ); m_componentCriticalPressure.move( space, touch ); m_componentCriticalTemperature.move( space, touch ); - m_componentCriticalVolume.move( space, touch ); m_componentAcentricFactor.move( space, touch ); m_componentVolumeShift.move( space, touch ); m_componentBinaryCoeff.move( space, touch ); @@ -104,7 +98,6 @@ class ComponentProperties final arrayView1d< real64 const > m_componentMolarWeight; arrayView1d< real64 const > m_componentCriticalPressure; arrayView1d< real64 const > m_componentCriticalTemperature; - arrayView1d< real64 const > m_componentCriticalVolume; arrayView1d< real64 const > m_componentAcentricFactor; arrayView1d< real64 const > m_componentVolumeShift; arrayView2d< real64 const > m_componentBinaryCoeff; @@ -119,22 +112,20 @@ class ComponentProperties final return KernelWrapper( m_componentMolarWeight, m_componentCriticalPressure, m_componentCriticalTemperature, - m_componentCriticalVolume, m_componentAcentricFactor, m_componentVolumeShift, m_componentBinaryCoeff ); } -private: +public: // Standard compositional input string_array const & m_componentNames; array1d< real64 > const & m_componentMolarWeight; - array1d< real64 > const & m_componentCriticalPressure; - array1d< real64 > const & m_componentCriticalTemperature; - array1d< real64 > const & m_componentCriticalVolume; - array1d< real64 > const & m_componentAcentricFactor; - array1d< real64 > const & m_componentVolumeShift; - array2d< real64 > const & m_componentBinaryCoeff; + array1d< real64 > m_componentCriticalPressure; + array1d< real64 > m_componentCriticalTemperature; + array1d< real64 > m_componentAcentricFactor; + array1d< real64 > m_componentVolumeShift; + array2d< real64 > m_componentBinaryCoeff; }; } // namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index 50a35083871..da9ec1e02cc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -25,20 +25,7 @@ namespace constitutive { namespace compositional -{ - -CompositionalDensity::CompositionalDensity( string const & name, - ComponentProperties const & componentProperties ): - FunctionBase( name, componentProperties ) -{} - -CompositionalDensity::KernelWrapper -CompositionalDensity::createKernelWrapper() const -{ - return KernelWrapper(); -} - -} // namespace PVTProps +{} // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 9a7fcf557a1..7adcd78a3e1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -22,6 +22,8 @@ #include "FunctionBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp" namespace geos { @@ -32,40 +34,46 @@ namespace constitutive namespace compositional { +template< typename EOS_TYPE > class CompositionalDensityUpdate final : public FunctionBaseUpdate { public: - CompositionalDensityUpdate() = default; + explicit CompositionalDensityUpdate( arrayView1d< real64 const > const & volumeShift ) + : m_componentDimensionalVolumeShift( volumeShift ) + {} - template< int USD1 > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, bool useMass ) const; - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 & molarDensity, - arraySlice1d< real64, USD3 > const & dMolarDensity, - real64 & massDensity, - arraySlice1d< real64, USD3 > const & dMassDensity, - bool useMass ) const; +private: + arrayView1d< real64 const > m_componentDimensionalVolumeShift; }; +template< typename EOS_TYPE > class CompositionalDensity : public FunctionBase { public: CompositionalDensity( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ) + : FunctionBase( name, componentProperties ) + { + GEOS_UNUSED_VAR( phaseIndex, modelParameters ); + // Calculate the dimensional volume shift + m_componentDimensionalVolumeShift.resize( componentProperties.getNumberOfComponents()); + EOS_TYPE::calculateDimensionalVolumeShift( componentProperties, + m_componentDimensionalVolumeShift ); + } static string catalogName() { return "CompositionalDensity"; } @@ -75,53 +83,68 @@ class CompositionalDensity : public FunctionBase } /// Type of kernel wrapper for in-kernel update - using KernelWrapper = CompositionalDensityUpdate; + using KernelWrapper = CompositionalDensityUpdate< EOS_TYPE >; /** * @brief Create an update kernel wrapper. * @return the wrapper */ - KernelWrapper createKernelWrapper() const; -}; - -template< int USD1 > -GEOS_HOST_DEVICE -void CompositionalDensityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 & molarDensity, - real64 & massDensity, - bool useMass ) const -{ - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition ); + KernelWrapper createKernelWrapper() const + { + return KernelWrapper( m_componentDimensionalVolumeShift ); + } - massDensity = 1000.0; - molarDensity = massDensity/40.0; -} +private: + array1d< real64 > m_componentDimensionalVolumeShift; +}; -template< int USD1, int USD2, int USD3 > +template< typename EOS_TYPE > +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE -void CompositionalDensityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 & molarDensity, - arraySlice1d< real64, USD3 > const & dMolarDensity, - real64 & massDensity, - arraySlice1d< real64, USD3 > const & dMassDensity, - bool useMass ) const +void CompositionalDensityUpdate< EOS_TYPE >:: +compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, + bool useMass ) const { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); - - massDensity = 1000.0; - molarDensity = massDensity/40.0; - - LvArray::forValuesInSlice( dMolarDensity, setZero ); - LvArray::forValuesInSlice( dMassDensity, setZero ); + GEOS_UNUSED_VAR( useMass ); + + integer const numComps = componentProperties.m_componentMolarWeight.size(); + integer const numDofs = 2 + numComps; + + real64 compressibilityFactor = 0.0; + stackArray1d< real64, 2+MultiFluidConstants::MAX_NUM_COMPONENTS > tempDerivs( numDofs ); + + EOS_TYPE::computeCompressibilityFactor( numComps, + pressure, + temperature, + phaseComposition, + componentProperties, + compressibilityFactor, + tempDerivs.toSlice() ); + + CompositionalProperties::computeMolarDensity( numComps, + pressure, + temperature, + phaseComposition, + m_componentDimensionalVolumeShift.toSliceConst(), + compressibilityFactor, + tempDerivs.toSlice(), + molarDensity, + dMolarDensity ); + + CompositionalProperties::computeMassDensity( numComps, + phaseComposition, + componentProperties.m_componentMolarWeight.toSliceConst(), + molarDensity, + dMolarDensity.toSliceConst(), + massDensity, + dMassDensity ); } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 6ee6094aa06..0879c590adf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -17,6 +17,7 @@ */ #include "ConstantViscosity.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" namespace geos { @@ -28,14 +29,65 @@ namespace compositional { ConstantViscosity::ConstantViscosity( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) +{ + Parameters const * parameters = modelParameters.get< Parameters >(); + m_constantPhaseViscosity = parameters->m_constantPhaseViscosity[phaseIndex]; +} + +ConstantViscosityUpdate::ConstantViscosityUpdate( real64 const constantPhaseViscosity ): + m_constantPhaseViscosity( constantPhaseViscosity ) {} ConstantViscosity::KernelWrapper ConstantViscosity::createKernelWrapper() const { - return KernelWrapper( ); + return KernelWrapper( m_constantPhaseViscosity ); +} + +std::unique_ptr< ModelParameters > +ConstantViscosity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< Parameters >() != nullptr ) + { + return parameters; + } + return std::make_unique< Parameters >( std::move( parameters ) ); +} + +ConstantViscosity::Parameters::Parameters( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{} + +void ConstantViscosity::Parameters::registerParametersImpl( MultiFluidBase * fluid ) +{ + fluid->registerWrapper( viewKeyStruct::constantPhaseViscosityString(), &m_constantPhaseViscosity ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Constant phase viscosity" ); +} + +void ConstantViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + GEOS_UNUSED_VAR( componentProperties ); + + integer const numPhase = fluid->numFluidPhases(); + + if( m_constantPhaseViscosity.empty() ) + { + m_constantPhaseViscosity.resize( numPhase ); + for( integer ip = 0; ip < numPhase; ++ip ) + { + m_constantPhaseViscosity[ip] = ConstantViscosity::defaultViscosity; + } + } + GEOS_THROW_IF_NE_MSG( m_constantPhaseViscosity.size(), numPhase, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::constantPhaseViscosityString() ), + InputError ); } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index 45a38d28a11..a4f0a733c17 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -33,37 +33,33 @@ namespace compositional class ConstantViscosityUpdate final : public FunctionBaseUpdate { public: - ConstantViscosityUpdate() = default; + explicit ConstantViscosityUpdate( real64 const constantPhaseViscosity ); - template< int USD1 > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, bool useMass ) const; - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 const & density, - arraySlice1d< real64 const, USD3 > const & dDensity, - real64 & viscosity, - arraySlice1d< real64, USD3 > const & dViscosity, - bool useMass ) const; +private: + real64 const m_constantPhaseViscosity; }; class ConstantViscosity : public FunctionBase { +public: + static constexpr real64 defaultViscosity = 0.001; public: ConstantViscosity( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); static string catalogName() { return ""; } @@ -80,45 +76,51 @@ class ConstantViscosity : public FunctionBase * @return the wrapper */ KernelWrapper createKernelWrapper() const; -}; -template< int USD1 > -GEOS_HOST_DEVICE -GEOS_FORCE_INLINE -void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 const & density, - real64 & viscosity, - bool useMass ) const -{ - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition ); - GEOS_UNUSED_VAR( density ); + // Parameters for constant viscosity model + class Parameters : public ModelParameters + { +public: + Parameters( std::unique_ptr< ModelParameters > parameters ); + ~Parameters() override = default; - viscosity = 0.001; -} + array1d< real64 > m_constantPhaseViscosity; + +private: + void registerParametersImpl( MultiFluidBase * fluid ) override; + void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + + struct viewKeyStruct + { + static constexpr char const * constantPhaseViscosityString() { return "constantPhaseViscosity"; } + }; + }; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); -template< int USD1, int USD2, int USD3 > +private: + real64 m_constantPhaseViscosity{defaultViscosity}; +}; + +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE GEOS_FORCE_INLINE void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, real64 const & density, - arraySlice1d< real64 const, USD3 > const & dDensity, + arraySlice1d< real64 const, USD2 > const & dDensity, real64 & viscosity, - arraySlice1d< real64, USD3 > const & dViscosity, + arraySlice1d< real64, USD2 > const & dViscosity, bool useMass ) const { GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); + GEOS_UNUSED_VAR( phaseComposition ); GEOS_UNUSED_VAR( density, dDensity ); - viscosity = 0.001; + viscosity = m_constantPhaseViscosity; LvArray::forValuesInSlice( dViscosity, setZero ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp index 3ccb6c97f8a..7525a48a445 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp @@ -19,9 +19,8 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_FUNCTIONBASE_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_FUNCTIONBASE_HPP_ -#include "dataRepository/ObjectCatalog.hpp" - #include "ComponentProperties.hpp" +#include "ModelParameters.hpp" namespace geos { @@ -83,6 +82,12 @@ class FunctionBase virtual FunctionType functionType() const = 0; + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ) + { + return parameters; + } + protected: /// Name of the PVT function string m_functionName; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp new file mode 100644 index 00000000000..d6ce442163f --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -0,0 +1,129 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LohrenzBrayClarkViscosity.cpp + */ + +#include "LohrenzBrayClarkViscosity.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +LohrenzBrayClarkViscosityUpdate::LohrenzBrayClarkViscosityUpdate( MixingType const mixing_type, + arrayView1d< real64 const > const & componentCriticalVolume ) + : m_mixing_type( mixing_type ), + m_componentCriticalVolume( componentCriticalVolume ) +{} + +LohrenzBrayClarkViscosity::LohrenzBrayClarkViscosity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ), + m_parameters( modelParameters.get< Parameters >() ) +{ + GEOS_UNUSED_VAR( phaseIndex ); +} + +LohrenzBrayClarkViscosity::KernelWrapper +LohrenzBrayClarkViscosity::createKernelWrapper() const +{ + auto const mixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_parameters->m_componentMixingType ); + return KernelWrapper( mixingType, m_parameters->m_componentCriticalVolume ); +} + +std::unique_ptr< ModelParameters > +LohrenzBrayClarkViscosity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< Parameters >() != nullptr ) + { + return parameters; + } + return std::make_unique< Parameters >( std::move( parameters ) ); +} + +LohrenzBrayClarkViscosity::Parameters::Parameters( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{ + constexpr LohrenzBrayClarkViscosityUpdate::MixingType defaultMixing = LohrenzBrayClarkViscosityUpdate::MixingType::HERNING_ZIPPERER; + m_componentMixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::toString( defaultMixing ); +} + +void LohrenzBrayClarkViscosity::Parameters::registerParametersImpl( MultiFluidBase * fluid ) +{ + fluid->registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Component critical volumes" ); + + fluid->registerWrapper( viewKeyStruct::componentMixingTypeString(), &m_componentMixingType ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setApplyDefaultValue( m_componentMixingType ). + setDescription( "Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options:\n* " + + EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::concat( "\n* " ) ); +} + +void LohrenzBrayClarkViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + integer const numComponents = fluid->numFluidComponents(); + + if( m_componentCriticalVolume.empty() ) + { + m_componentCriticalVolume.resize( numComponents ); + + arrayView1d< real64 > const & componentCriticalPressure = componentProperties.getComponentCriticalPressure(); + arrayView1d< real64 > const & componentCriticalTemperature = componentProperties.getComponentCriticalTemperature(); + + calculateCriticalVolume( numComponents, + componentCriticalPressure, + componentCriticalTemperature, + m_componentCriticalVolume ); + } + + GEOS_THROW_IF_NE_MSG( m_componentCriticalVolume.size(), numComponents, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::componentCriticalVolumeString() ), + InputError ); + + // If the value is invalid, this will throw + EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_componentMixingType ); +} + +void LohrenzBrayClarkViscosity::Parameters::calculateCriticalVolume( + integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ) +{ + for( integer ic=0; ic const & componentCriticalVolume ); + + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const; + + GEOS_HOST_DEVICE + void setMixingType( MixingType const mixing_type ) + { + m_mixing_type = mixing_type; + } + +private: + /** + * @brief Estimate pure component properties at dilute-gas conditions + * @details This estimates pure component properties at dilute-gas conditions (pressure near atmospheric) using + * Stiel and Thodos [1961] correlation: https://doi.org/10.1002/aic.690070416 + * Dilute viscosity is solely temperature dependent + * Units are converted so componentViscosity is in centipoise to match original reference + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[out] componentDiluteViscosity The compoment dilute viscosity + * @param[out] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + */ + GEOS_HOST_DEVICE + void computeComponentDiluteViscosity_StielThodos( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 > const componentDiluteViscosity, + arraySlice1d< real64 > const dComponentDiluteViscosity_dTemperature ) const + { + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const criticalPressure = componentProperties.m_componentCriticalPressure[ic]; + real64 const criticalTemperature = componentProperties.m_componentCriticalTemperature[ic]; + real64 const molarWeight = componentProperties.m_componentMolarWeight[ic]; + + real64 reducedTemperature = temperature / criticalTemperature; + real64 inverseComponentChi = 0.0; + real64 discardDerivative = 0.0; + inverseChiParameter( criticalPressure, criticalTemperature, molarWeight, inverseComponentChi, + discardDerivative, discardDerivative, discardDerivative ); + + if( molarWeight < 2.1e-3 ) // hydrogen correlation, Stiel & Thodos, 1961, Eq. 12 + { + componentDiluteViscosity[ic] = 90.71e-5 * pow( 0.1375*temperature - 1.67, 0.625 ); + dComponentDiluteViscosity_dTemperature[ic] = 90.71e-5 * 0.625 * 0.1375 * pow( 0.1375*temperature - 1.67, -0.375 ); + } + else if( reducedTemperature <= 1.5 ) // nonpolar gas correlation at low temp, Eq. 9 + { + componentDiluteViscosity[ic] = 34e-5 * pow( reducedTemperature, 0.94 ) * inverseComponentChi; + dComponentDiluteViscosity_dTemperature[ic] = 34e-5 * 0.94 * pow( reducedTemperature, -0.06 ) * inverseComponentChi / criticalTemperature; + } + else // nonpolar gas correlation at high temp, Eq. 10 + { + componentDiluteViscosity[ic] = 17.78e-5 * pow( 4.58*reducedTemperature-1.67, 0.625 ) * inverseComponentChi; + dComponentDiluteViscosity_dTemperature[ic] = 17.78e-5 * 4.58 * 0.625 * pow( 4.58*reducedTemperature-1.67, -0.375 ) * inverseComponentChi / criticalTemperature; + } + } + } + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Herning and Zipperer [1936] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Herning and Zipperer [1936] mixing rule. + * Herning, F. and Zipperer, L,: “Calculation of the Viscosity of Technical Gas Mixtures from the + * Viscosity of Individual Gases, german”, Gas u. Wasserfach (1936) 79, No. 49, 69. + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_HerningZipperer( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Wilke [1950] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Wilke [1950] mixing rule. https://doi.org/10.1063/1.1747673 + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_Wilke( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Brokaw[1968] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Brokaw[1968] mixing rule. + * Brokaw, R. S. (1968). Viscosity of Gas Mixtures. United States: National Aeronautics and Space Administration. + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_Brokaw( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimates phase viscosity using Lohrenz, Bray & Clark [1964] + * @details This estimates the phase viscosity at given (P,T) conditions using the Lohrenz, Bray & Clark [1964] correlation. + * This is an additional term added to the dilute gas estimate. + * https://doi.org/10.2118/915-PA + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] phaseComposition The composition of the phase + * @param[in] phaseDensity The phase density + * @param[in] dPhaseDensity The derivatives of the phase density + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseViscosity_LohrenzBrayClark( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const phaseDensity, + arraySlice1d< real64 const, USD2 > const & dPhaseDensity, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Computes inverse chi parameter + * @details Computes "1/chi" parameter (inverse of the viscosity-reducing parameter) from [ST 1961, LBC 1964]. + * Using units of (K, atm, amu). + * @param[in] criticalPressure The component critical pressure + * @param[in] criticalTemperature The component critical temperature + * @param[in] molarWeight The component molar weight + * @param[out] value The inverse chi parameter + * @param[out] derivP Derivative of the inverse chi parameter w.r.t. pressure + * @param[out] derivT Derivative of the inverse chi parameter w.r.t. temperature + * @param[out] derivM Derivative of the inverse chi parameter w.r.t. molar weight + */ + GEOS_HOST_DEVICE + void inverseChiParameter( real64 const criticalPressure, + real64 const criticalTemperature, + real64 const molarWeight, + real64 & value, + real64 & derivP, + real64 & derivT, + real64 & derivM ) const + { + real64 T = pow( criticalTemperature, 1.0/6.0 ); + real64 dT = (1.0/6.0) * pow( criticalTemperature, -5.0/6.0 ); + + real64 constexpr sqrt1000 = 31.6227766017; // note: kg/mol to atomic mass units + real64 M = sqrt1000 * sqrt( molarWeight ); + real64 dM = 0.5 * sqrt1000 / sqrt( molarWeight ); + + real64 P = pow( criticalPressure / PA_TO_ATM, 2.0/3.0 ); // note: pascal to atm conversion + real64 dP = pow( PA_TO_ATM, -2.0/3.0 ) * pow( criticalPressure, -1.0/3.0 ) * 2.0/3.0; + + value = M*P/T; + derivP = M*dP/T; + derivT = -M*P*dT/(T*T); + derivM = dM*P/T; + } + +private: + MixingType m_mixing_type; + arrayView1d< real64 const > m_componentCriticalVolume; + +private: + // Conversion factor from cP to Pa.s + static constexpr real64 CP_TO_PAS = 1.0e-3; + // Conversion from Pa to atm + static constexpr real64 PA_TO_ATM = 1.01325e+5; +}; + +class LohrenzBrayClarkViscosity : public FunctionBase +{ +public: + LohrenzBrayClarkViscosity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); + + static string catalogName() { return "LBC"; } + + FunctionType functionType() const override + { + return FunctionType::VISCOSITY; + } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = LohrenzBrayClarkViscosityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + // Parameters for the LBC viscosity model + class Parameters : public ModelParameters + { +public: + Parameters( std::unique_ptr< ModelParameters > parameters ); + ~Parameters() override = default; + + string m_componentMixingType; + array1d< real64 > m_componentCriticalVolume; + +private: + void registerParametersImpl( MultiFluidBase * fluid ) override; + void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + + struct viewKeyStruct + { + static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } + static constexpr char const * componentMixingTypeString() { return "viscosityMixingRule"; } + }; + + /** + * @brief Estimate critical volumes using Ihmels' (2010) correlation + * @details reference: http://dx.doi.org/10.1021/je100167w + * @param[in] numComponents The number of components + * @param[in] criticalPressure The component critical pressures + * @param[in] criticalTemperature The component critical temperatures + * @param[in] criticalVolume The component critical volumes + */ + static void calculateCriticalVolume( integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ); + }; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + Parameters const * m_parameters{}; +}; + +/// Declare strings associated with enumeration values. +ENUM_STRINGS( LohrenzBrayClarkViscosityUpdate::MixingType, + "HerningZipperer", + "Wilke", + "Brokaw" ); + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +// Implementation +#include "LohrenzBrayClarkViscosityImpl.hpp" + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITY_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp new file mode 100644 index 00000000000..eb454179210 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -0,0 +1,408 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LohrenzBrayClarkViscosityImpl.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ + +#include "LohrenzBrayClarkViscosity.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const +{ + GEOS_UNUSED_VAR( pressure ); // No-direct pressure dependence (instead through density) + GEOS_UNUSED_VAR( useMass ); + + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numComponents = componentProperties.m_componentMolarWeight.size(); + integer const numDofs = numComponents + 2; + + // Space for temporary variable derivatives + stackArray1d< real64, maxNumDofs > tempDerivs( numDofs ); + + // Estimate pure component properties at dilute-gas conditions (pressure near atmospheric) using + // Stiel and Thodos [1961] correlation: https://doi.org/10.1002/aic.690070416 + // Dilute viscosity is solely temperature dependent + // Units are converted so componentViscosity is in centipoise to match original reference + + stackArray1d< real64, maxNumComps > componentDiluteViscosity( numComponents ); + + computeComponentDiluteViscosity_StielThodos( numComponents, + componentProperties, + temperature, + componentDiluteViscosity, + tempDerivs ); + + // Estimate phase viscosity (in cp) at dilute gas conditions using either + // the Herning and Zipperer [1936], Wilke [1950], or Brokaw[1968] mixture rule. + // The classic LBC model uses Herning-Zipperer, but the other two may be more accurate. + + if( m_mixing_type == MixingType::HERNING_ZIPPERER ) + { + computePhaseDiluteViscosity_HerningZipperer( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + else if( m_mixing_type == MixingType::WILKE ) + { + computePhaseDiluteViscosity_Wilke( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + else if( m_mixing_type == MixingType::BROKAW ) + { + computePhaseDiluteViscosity_Brokaw( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + + // Estimate phase viscosity at given (P,T) conditions using LBC [1964] correlation. + // This is an additional term added to the dilute gas estimate above. + computePhaseViscosity_LohrenzBrayClark( numComponents, + componentProperties, + phaseComposition, + density, + dDensity, + viscosity, + dViscosity ); + + // Scale centipoise to pascal.seconds + viscosity *= CP_TO_PAS; + for( integer kc = 0; kc < numDofs; ++kc ) + { + dViscosity[kc] *= CP_TO_PAS; + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_HerningZipperer( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + real64 A = 0.0; + real64 dA_dT = 0.0; + real64 B = 0.0; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const sqrtMolarWeight = sqrt( componentProperties.m_componentMolarWeight[ic] ); + A += phaseComposition[ic] * sqrtMolarWeight * componentDiluteViscosity[ic]; + B += phaseComposition[ic] * sqrtMolarWeight; + dA_dT += phaseComposition[ic] * sqrtMolarWeight * dComponentDiluteViscosity_dTemperature[ic]; + } + + phaseViscosity = A/B; + dPhaseViscosity[Deriv::dP] = 0.0; + dPhaseViscosity[Deriv::dT] = dA_dT/B; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const sqrtMolarWeight = sqrt( componentProperties.m_componentMolarWeight[ic] ); + real64 const dA_dxi = sqrtMolarWeight * componentDiluteViscosity[ic]; + real64 const dB_dxi = sqrtMolarWeight; + dPhaseViscosity[Deriv::dC+ic] = dA_dxi / B - A * dB_dxi / (B * B); + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Wilke( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + // compute the "phi" interaction matrix (and its temperature derivatives) + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + stackArray2d< real64, maxNumComps *maxNumComps > phi( numComponents, numComponents ); + stackArray2d< real64, maxNumComps *maxNumComps > dPhi_dT( numComponents, numComponents ); + + LvArray::forValuesInSlice( phi.toSlice(), setZero ); + LvArray::forValuesInSlice( dPhi_dT.toSlice(), setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + for( integer jc = 0; jc < numComponents; ++jc ) + { + real64 const mw_i = componentProperties.m_componentMolarWeight[ic]; + real64 const mw_j = componentProperties.m_componentMolarWeight[jc]; + + real64 const weightRatio = mw_i / mw_j; + + real64 const invVisc_j = 1.0 / componentDiluteViscosity[jc]; + real64 const viscosityRatio = componentDiluteViscosity[ic] * invVisc_j; + + real64 const dViscosityRatio_dT = dComponentDiluteViscosity_dTemperature[ic] * invVisc_j + - componentDiluteViscosity[ic] * dComponentDiluteViscosity_dTemperature[jc] * invVisc_j * invVisc_j; + + real64 const A = 1.0 + sqrt( viscosityRatio )*pow( weightRatio, -0.25 ); + real64 const dA_dT = 0.5*pow( weightRatio, -0.25 )/sqrt( viscosityRatio )*dViscosityRatio_dT; + + real64 const B = A*A; + real64 const dB_dT = 2.0*A*dA_dT; + real64 const C = sqrt( 8.0 )*sqrt( 1.0 + weightRatio ); + + phi( ic, jc ) = B/C; + dPhi_dT( ic, jc ) = dB_dT/C; + } + } + + // compute phase viscosity via Wilke mixing rule + + phaseViscosity = 0; + LvArray::forValuesInSlice( dPhaseViscosity, setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 A = 0; + real64 dA_dT = 0; + + for( integer jc = 0; jc < numComponents; ++jc ) + { + A += phi( ic, jc )*phaseComposition[jc]; + dA_dT += dPhi_dT( ic, jc )*phaseComposition[jc]; + } + + phaseViscosity += phaseComposition[ic] * componentDiluteViscosity[ic] / A; + dPhaseViscosity[Deriv::dT] += phaseComposition[ic] * dComponentDiluteViscosity_dTemperature[ic] / A + - phaseComposition[ic] * componentDiluteViscosity[ic] / (A*A) * dA_dT; + + dPhaseViscosity[Deriv::dC+ic] += componentDiluteViscosity[ic] / A; + + // the following is some tricky loop merging. the derivatives for other components "jc" will depend on the value of A + // computed above for component "ic", so we add these entries for other derivatives immediately. + + for( integer jc = 0; jc < numComponents; ++jc ) + { + dPhaseViscosity[Deriv::dC+jc] -= phaseComposition[ic] * componentDiluteViscosity[ic] / (A*A) * phi( ic, jc ); + } + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Brokaw( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + // Compute the "phi" interaction matrix (constant, as only function of molecular weights) + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + stackArray2d< real64, maxNumComps *maxNumComps > phi( numComponents, numComponents ); + + LvArray::forValuesInSlice( phi.toSlice(), setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + for( integer jc = 0; jc < ic; ++jc ) + { + real64 const mw_i = componentProperties.m_componentMolarWeight[ic]; + real64 const mw_j = componentProperties.m_componentMolarWeight[jc]; + real64 const A = mw_i / mw_j; + real64 const B = pow( 4.0*mw_i*mw_j/((mw_i+mw_j)*(mw_i+mw_j)), 0.25 ); + real64 const A45 = pow( A, 0.45 ); + + phi( ic, jc ) = B/sqrt( A ) * (1.0 + (A-A45)/(2.0 + 2.0*A + B*(1+A45) / (1+B))); + phi( jc, ic ) = phi( ic, jc ); + } + phi( ic, ic ) = 1.0; + } + + phaseViscosity = 0.0; + LvArray::forValuesInSlice( dPhaseViscosity, setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 A = 0; + real64 dA_dT = 0; + + for( integer jc = 0; jc < numComponents; ++jc ) + { + real64 const aij = phi( ic, jc )*phaseComposition[jc] / sqrt( componentDiluteViscosity[jc] ); + A += aij; + dA_dT -= 0.5*aij*dComponentDiluteViscosity_dTemperature[jc] / componentDiluteViscosity[jc]; + } + + real64 const sqrtComponentDiluteViscosity = sqrt( componentDiluteViscosity[ic] ); + phaseViscosity += phaseComposition[ic] * sqrtComponentDiluteViscosity / A; + + dPhaseViscosity[Deriv::dT] += 0.5*phaseComposition[ic] / sqrtComponentDiluteViscosity * dComponentDiluteViscosity_dTemperature[ic] / A + - phaseComposition[ic] * sqrtComponentDiluteViscosity / (A*A) * dA_dT; + + dPhaseViscosity[Deriv::dC+ic] += sqrtComponentDiluteViscosity / A; + + // the following is some tricky loop merging. the derivatives for other components "jc" will depend on the value of A + // computed above for component "ic", so we add these entries for other derivatives immediately. + + for( integer jc = 0; jc < numComponents; ++jc ) + { + dPhaseViscosity[Deriv::dC+jc] -= phaseComposition[ic] * phi( ic, jc ) * sqrt( componentDiluteViscosity[ic]/componentDiluteViscosity[jc] ) / (A*A); + } + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseViscosity_LohrenzBrayClark( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const phaseDensity, + arraySlice1d< real64 const, USD2 > const & dPhaseDensity, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + // Compute phase pseudo properties via Kay's mixing rule + real64 phaseCriticalPressure = 0.0; + real64 phaseCriticalTemperature = 0.0; + real64 phaseCriticalVolume = 0.0; + real64 phaseMolarWeight = 0.0; + + auto const & criticalPressure = componentProperties.m_componentCriticalPressure; + auto const & criticalTemperature = componentProperties.m_componentCriticalTemperature; + auto const & criticalVolume = m_componentCriticalVolume; + auto const & molarWeight = componentProperties.m_componentMolarWeight; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + phaseCriticalPressure += phaseComposition[ic] * criticalPressure[ic]; + phaseCriticalTemperature += phaseComposition[ic] * criticalTemperature[ic]; + phaseCriticalVolume += phaseComposition[ic] * criticalVolume[ic]; + phaseMolarWeight += phaseComposition[ic] * molarWeight[ic]; + } + + // Compute LBC polynomial + + real64 reducedDensity = phaseDensity * phaseCriticalVolume / phaseMolarWeight; + real64 inversePhaseChi, dInversePhaseChi_dPc, dInversePhaseChi_dTc, dInversePhaseChi_dMw; + + inverseChiParameter( phaseCriticalPressure, + phaseCriticalTemperature, + phaseMolarWeight, + inversePhaseChi, + dInversePhaseChi_dPc, + dInversePhaseChi_dTc, + dInversePhaseChi_dMw ); + + real64 polynomialOne = 0.1023000 + + 0.0233640*reducedDensity + + 0.0585330*pow( reducedDensity, 2 ) + - 0.0407580*pow( reducedDensity, 3 ) + + 0.0093324*pow( reducedDensity, 4 ); + + real64 polynomialTwo = pow( polynomialOne, 4.0 ) - 1.0e-4; + + // add polynomial contribution to dilute term to get final phase viscosity + + phaseViscosity += polynomialTwo * inversePhaseChi; + + // get derivatives, noting phaseDensity is a function of (pressure, temperature, composition) + // and inversePhaseChi is a function of composition. + // these derivatives are *added* to the ones already present from the dilute terms above. + + real64 dPolynomialOne_dReducedDensity = 0.0233640 + + 0.1170660*reducedDensity + - 0.1222740*pow( reducedDensity, 2 ) + + 0.0373296*pow( reducedDensity, 3 ); + real64 dPolynomialTwo_dReducedDensity = 4.0 * pow( polynomialOne, 3.0 ) * dPolynomialOne_dReducedDensity; + + real64 dViscosity_dDensity = dPolynomialTwo_dReducedDensity * inversePhaseChi * phaseCriticalVolume / phaseMolarWeight; + real64 dViscosity_dCriticalRatio = dPolynomialTwo_dReducedDensity * inversePhaseChi * phaseDensity; + + real64 dViscosity_dPc = polynomialTwo * dInversePhaseChi_dPc; + real64 dViscosity_dTc = polynomialTwo * dInversePhaseChi_dTc; + real64 dViscosity_dMw = polynomialTwo * dInversePhaseChi_dMw - dViscosity_dCriticalRatio * phaseCriticalVolume / pow( phaseMolarWeight, 2 ); + real64 dViscosity_dVc = dViscosity_dCriticalRatio / phaseMolarWeight; + + dPhaseViscosity[Deriv::dP] += dViscosity_dDensity * dPhaseDensity[Deriv::dP]; + dPhaseViscosity[Deriv::dT] += dViscosity_dDensity * dPhaseDensity[Deriv::dT]; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + dPhaseViscosity[Deriv::dC+ic] += dViscosity_dDensity * dPhaseDensity[Deriv::dC+ic] + + dViscosity_dPc * criticalPressure[ic] + + dViscosity_dTc * criticalTemperature[ic] + + dViscosity_dMw * molarWeight[ic] + + dViscosity_dVc * criticalVolume[ic]; + } +} + +} // end namespace compositional + +} // namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp new file mode 100644 index 00000000000..8cb23ff898f --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -0,0 +1,92 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ModelParameters.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ + +namespace geos +{ + +namespace constitutive +{ + +class MultiFluidBase; + +namespace compositional +{ + +class ComponentProperties; + +class ModelParameters +{ +public: + ModelParameters( std::unique_ptr< ModelParameters > parameters = nullptr ): baseParameters( std::move( parameters ) ) {} + virtual ~ModelParameters() = default; + + void registerParameters( MultiFluidBase * fluid ) + { + registerParametersImpl( fluid ); + if( baseParameters ) + { + baseParameters->registerParameters( fluid ); + } + } + + void postProcessInput( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + { + postProcessInputImpl( fluid, componentProperties ); + if( baseParameters ) + { + baseParameters->postProcessInput( fluid, componentProperties ); + } + } + + template< typename PARAMETERS > + PARAMETERS const * get() const + { + PARAMETERS const * parameters = dynamic_cast< PARAMETERS const * >(this); + if( parameters == nullptr && baseParameters ) + { + return baseParameters->get< PARAMETERS >(); + } + return parameters; + } + +private: + virtual void registerParametersImpl( MultiFluidBase * fluid ) + { + GEOS_UNUSED_VAR( fluid ); + } + + virtual void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + { + GEOS_UNUSED_VAR( fluid ); + GEOS_UNUSED_VAR( componentProperties ); + } + +private: + std::unique_ptr< ModelParameters > baseParameters{}; +}; + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 48048202020..6026dd4e213 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -37,21 +37,28 @@ string NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::catalogNa template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: NegativeTwoPhaseFlashModel( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) -{} +{ + GEOS_UNUSED_VAR( modelParameters ); +} template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > typename NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::KernelWrapper NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::createKernelWrapper() const { - return KernelWrapper( m_componentProperties.getNumberOfComponents() ); + return KernelWrapper( m_componentProperties.getNumberOfComponents(), 0, 1 ); } template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > NegativeTwoPhaseFlashModelUpdate< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: -NegativeTwoPhaseFlashModelUpdate( integer const numComponents ): - m_numComponents( numComponents ) +NegativeTwoPhaseFlashModelUpdate( integer const numComponents, + integer const liquidIndex, + integer const vapourIndex ): + m_numComponents( numComponents ), + m_liquidIndex( liquidIndex ), + m_vapourIndex( vapourIndex ) {} // Explicit instantiation of the model template. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index e9d6d17ef6c..1682af63be4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -24,6 +24,7 @@ #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" #include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" namespace geos { @@ -42,54 +43,61 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate using PhaseProp = MultiFluidVar< real64, 3, multifluid::LAYOUT_PHASE, multifluid::LAYOUT_PHASE_DC >; using PhaseComp = MultiFluidVar< real64, 4, multifluid::LAYOUT_PHASE_COMP, multifluid::LAYOUT_PHASE_COMP_DC >; - explicit NegativeTwoPhaseFlashModelUpdate( integer const numComponents ); + NegativeTwoPhaseFlashModelUpdate( integer const numComponents, + integer const liquidIndex, + integer const vapourIndex ); // Mark as a 2-phase flash GEOS_HOST_DEVICE static constexpr integer getNumberOfPhases() { return 2; } - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & compFraction, - arraySlice1d< real64, USD2 > const & phaseFraction, - arraySlice2d< real64, USD3 > const & phaseCompFraction ) const - { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature ); - // TODO: Constant values for now. To be linked with the static function call - phaseFraction[m_liquidIndex] = 0.5; - phaseFraction[m_vapourIndex] = 0.5; - for( integer ic = 0; ic < m_numComponents; ++ic ) - { - phaseCompFraction[m_liquidIndex][ic] = compFraction[ic]; - phaseCompFraction[m_vapourIndex][ic] = compFraction[ic]; - } - } - - template< int USD1 > + template< int USD1, int USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & compFraction, + arraySlice2d< real64, USD2 > const & kValues, PhaseProp::SliceType const phaseFraction, PhaseComp::SliceType const phaseCompFraction ) const { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature ); - - // TODO: Constant values for now. To be linked with the static function call - phaseFraction.value[m_liquidIndex] = 0.5; - phaseFraction.value[m_vapourIndex] = 0.5; - for( integer ic = 0; ic < m_numComponents; ++ic ) + integer const numDofs = 2 + m_numComponents; + + // Iterative solve to converge flash + bool const flashStatus = NegativeTwoPhaseFlash::compute< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + GEOS_ERROR_IF( !flashStatus, + GEOS_FMT( "Negative two phase flash failed to converge at pressure {:.5e} and temperature {:.3f}", + pressure, temperature )); + + // Calculate derivatives + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex].toSliceConst(), + phaseCompFraction.value[m_vapourIndex].toSliceConst(), + phaseFraction.derivs[m_vapourIndex], + phaseCompFraction.derivs[m_liquidIndex], + phaseCompFraction.derivs[m_vapourIndex] ); + + // Complete by calculating liquid phase fraction + phaseFraction.value[m_liquidIndex] = 1.0 - phaseFraction.value[m_vapourIndex]; + for( integer ic = 0; ic < numDofs; ic++ ) { - phaseCompFraction.value[m_liquidIndex][ic] = compFraction[ic]; - phaseCompFraction.value[m_vapourIndex][ic] = compFraction[ic]; + phaseFraction.derivs[m_liquidIndex][ic] = -phaseFraction.derivs[m_vapourIndex][ic]; } - - LvArray::forValuesInSlice( phaseFraction.derivs, setZero ); - LvArray::forValuesInSlice( phaseCompFraction.derivs, setZero ); } private: @@ -103,7 +111,8 @@ class NegativeTwoPhaseFlashModel : public FunctionBase { public: NegativeTwoPhaseFlashModel( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ); static string catalogName(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 00eae8f5948..05c2b6ef9c2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -35,18 +35,6 @@ class NullModelUpdate final : public FunctionBaseUpdate public: NullModelUpdate() = default; - template< int USD1 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 & value, - bool useMass ) const - { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, phaseComposition, value, useMass ); - } - template< int USD1, int USD2, int USD3 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, @@ -71,9 +59,21 @@ class NullModel : public FunctionBase public: NullModel( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ) + { + GEOS_UNUSED_VAR( phaseIndex, modelParameters ); + } + + NullModel( string const & name, + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) - {} + { + GEOS_UNUSED_VAR( modelParameters ); + } virtual ~NullModel() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp index 638b6f9a8eb..ea3fb238325 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp @@ -30,6 +30,8 @@ namespace constitutive namespace compositional { +class ModelParameters; + /** * @brief Struct storing the submodels describing the fluid phase behavior. * @tparam DENSITY Class describing the density model @@ -51,13 +53,21 @@ struct PhaseModel * @param[in] componentProperties EOS parameters for components */ PhaseModel( string const & phaseModelName, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): density( phaseModelName + "_" + Density::catalogName(), - componentProperties ), + componentProperties, + phaseIndex, + modelParameters ), viscosity( phaseModelName + "_" + Viscosity::catalogName(), - componentProperties ), + componentProperties, + phaseIndex, + modelParameters ), enthalpy( phaseModelName + "_" + Enthalpy::catalogName(), - componentProperties ) + componentProperties, + phaseIndex, + modelParameters ) {} /// The phase density model @@ -122,6 +132,17 @@ struct PhaseModel viscosity, enthalpy ); } + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ) + { + std::unique_ptr< ModelParameters > phaseParameters = std::move( parameters ); + phaseParameters = Density::createParameters( std::move( phaseParameters ) ); + phaseParameters = Viscosity::createParameters( std::move( phaseParameters ) ); + phaseParameters = Enthalpy::createParameters( std::move( phaseParameters ) ); + return phaseParameters; + } + }; // A no-op phase model diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index f118a6a6819..93b463ccdd3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -214,7 +214,8 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, m_phase->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", + stringutilities::join( m_phasePVTParaFiles ) ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp index 56518a12e4a..022c2efcbad 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp @@ -50,10 +50,13 @@ class CarmanKozenyPermeabilityUpdate : public PermeabilityBaseUpdate arraySlice1d< real64 > const & dPerm_dPorosity ) const; GEOS_HOST_DEVICE - virtual void updateFromPorosity( localIndex const k, - localIndex const q, - real64 const & porosity ) const override + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const override { + GEOS_UNUSED_VAR( pressure ); + compute( porosity, m_permeability[k][q], m_dPerm_dPorosity[k][q] ); diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp index b023e926115..8bbdcbdcffd 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp @@ -68,6 +68,5 @@ void PermeabilityBase::allocateConstitutiveData( dataRepository::Group & parent, ConstitutiveBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -REGISTER_CATALOG_ENTRY( ConstitutiveBase, PermeabilityBase, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index ee7c661d600..343458291e6 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -47,11 +47,12 @@ class PermeabilityBaseUpdate localIndex numGauss() const { return m_permeability.size( 1 ); } GEOS_HOST_DEVICE - virtual void updateFromPorosity( localIndex const k, - localIndex const q, - real64 const & porosity ) const + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const { - GEOS_UNUSED_VAR( k, q, porosity ); + GEOS_UNUSED_VAR( k, q, pressure, porosity ); } GEOS_HOST_DEVICE @@ -113,10 +114,6 @@ class PermeabilityBase : public ConstitutiveBase virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; - static string catalogName() { return "PermeabilityBase"; } - - virtual string getCatalogName() const override { return catalogName(); } - /** * @brief Const/non-mutable accessor for permeability. * @return Accessor diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp new file mode 100644 index 00000000000..8e1444c491c --- /dev/null +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -0,0 +1,127 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PressurePermeability.cpp + */ + +#include "PressurePermeability.hpp" + +namespace geos +{ + +using namespace dataRepository; + +namespace constitutive +{ + + +PressurePermeability::PressurePermeability( string const & name, Group * const parent ): + PermeabilityBase( name, parent ) +{ + registerWrapper( viewKeyStruct::referencePermeabilityComponentsString(), &m_referencePermeabilityComponents ). + setInputFlag( InputFlags::REQUIRED ). + setRestartFlags( RestartFlags::NO_WRITE ). + setDescription( "Reference xx, yy and zz components of a diagonal permeability tensor." ); + + registerWrapper( viewKeyStruct::pressureDependenceConstantsString(), &m_pressureDependenceConstants ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Pressure dependence coefficients for each permeability component." ); + + registerWrapper( viewKeyStruct::referencePressureString(), &m_referencePressure ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Reference pressure for the pressure permeability model" ); + + registerWrapper( viewKeyStruct::referencePermeabilityString(), &m_referencePermeability ). + setApplyDefaultValue( 0.0 ). + setPlotLevel( PlotLevel::LEVEL_0 ). + setDescription( "Reference permeability field" ); + + registerWrapper( viewKeyStruct::maxPermeabilityString(), &m_maxPermeability ). + setApplyDefaultValue( 1.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Max. permeability can be reached." ); + + registerWrapper( viewKeyStruct::pressureModelTypeString(), &m_presModelType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( PressureModelType::Hyperbolic ). + setDescription( "Type of the pressure dependence model. " ); +} + +std::unique_ptr< ConstitutiveBase > +PressurePermeability::deliverClone( string const & name, + Group * const parent ) const +{ + return PermeabilityBase::deliverClone( name, parent ); +} + +void PressurePermeability::postProcessInput() +{ + for( localIndex i=0; i < 3; i++ ) + { + GEOS_ERROR_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, + getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model." ); + } +} + +void PressurePermeability::allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + m_referencePermeability.resize( 0, 1, 3 ); + + PermeabilityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); + + integer const numQuad = 1; // NOTE: enforcing 1 quadrature point + + for( localIndex ei = 0; ei < parent.size(); ++ei ) + { + for( localIndex q = 0; q < numQuad; ++q ) + { + m_referencePermeability[ei][q][0] = m_referencePermeabilityComponents[0]; + m_referencePermeability[ei][q][1] = m_referencePermeabilityComponents[1]; + m_referencePermeability[ei][q][2] = m_referencePermeabilityComponents[2]; + } + } +} + +void PressurePermeability::initializeState() const +{ + localIndex const numE = m_permeability.size( 0 ); + integer constexpr numQuad = 1; // NOTE: enforcing 1 quadrature point + + auto permView = m_permeability.toView(); + real64 const permComponents[3] = { m_referencePermeabilityComponents[0], + m_referencePermeabilityComponents[1], + m_referencePermeabilityComponents[2] }; + + forAll< parallelDevicePolicy<> >( numE, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + for( localIndex q = 0; q < numQuad; ++q ) + { + for( integer dim=0; dim < 3; ++dim ) + { + // The default value is -1 so if it still -1 it needs to be set to something physical + if( permView[ei][q][dim] < 0 ) + { + permView[ei][q][dim] = permComponents[dim]; + } + } + } + } ); +} + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, PressurePermeability, string const &, Group * const ) + +} +} /* namespace geos */ diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp new file mode 100644 index 00000000000..8751dd7f247 --- /dev/null +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -0,0 +1,251 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PressurePermeability.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ +#define GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ + +#include "constitutive/permeability/PermeabilityBase.hpp" + + +namespace geos +{ +namespace constitutive +{ + +enum class PressureModelType : integer +{ + Exponential, + Hyperbolic +}; + +ENUM_STRINGS( PressureModelType, + "Exponential", + "Hyperbolic" ); + +class PressurePermeabilityUpdate : public PermeabilityBaseUpdate +{ +public: + + PressurePermeabilityUpdate( PressureModelType const & presModelType, + R1Tensor const pressureDependenceConstants, + real64 const & referencePressure, + real64 const & maxPermeability, + arrayView3d< real64 > const & referencePermeability, + arrayView3d< real64 > const & permeability, + arrayView3d< real64 > const & dPerm_dPressure ) + : PermeabilityBaseUpdate( permeability, dPerm_dPressure ), + m_presModelType( presModelType ), + m_pressureDependenceConstants( pressureDependenceConstants ), + m_referencePressure( referencePressure ), + m_maxPermeability( maxPermeability ), + m_referencePermeability( referencePermeability ) + {} + + GEOS_HOST_DEVICE + void compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const; + + GEOS_HOST_DEVICE + void compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + real64 const maxPermeability, + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const; + + GEOS_HOST_DEVICE + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const override + { + GEOS_UNUSED_VAR( q, porosity ); + + real64 const deltaPressure = pressure - m_referencePressure; + + real64 referencePermeability[3]; + + referencePermeability[0] = m_referencePermeability[k][0][0]; + referencePermeability[1] = m_referencePermeability[k][0][1]; + referencePermeability[2] = m_referencePermeability[k][0][2]; + + switch( m_presModelType ) + { + case PressureModelType::Exponential: + { + compute( deltaPressure, + m_pressureDependenceConstants, + referencePermeability, + m_permeability[k][0], + m_dPerm_dPressure[k][0] ); + + break; + } + case PressureModelType::Hyperbolic: + { + compute( deltaPressure, + m_pressureDependenceConstants, + referencePermeability, + m_maxPermeability, + m_permeability[k][0], + m_dPerm_dPressure[k][0] ); + + break; + } + default: + { + GEOS_ERROR( "PressureModelType is invalid! It should be either Exponential or Hyperbolic" ); + } + } + } + +private: + + /// Pressure dependence model type + PressureModelType m_presModelType; + + /// Pressure dependent coefficients for each permeability component + R1Tensor m_pressureDependenceConstants; + + /// Reference pressure in the model + real64 const m_referencePressure; + + /// Maximum permeability + real64 const m_maxPermeability; + + arrayView3d< real64 > m_referencePermeability; + +}; + + +class PressurePermeability : public PermeabilityBase +{ +public: + + PressurePermeability( string const & name, Group * const parent ); + + std::unique_ptr< ConstitutiveBase > deliverClone( string const & name, + Group * const parent ) const override; + + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override; + + static string catalogName() { return "PressurePermeability"; } + + virtual string getCatalogName() const override { return catalogName(); } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = PressurePermeabilityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const + { + return KernelWrapper( m_presModelType, + m_pressureDependenceConstants, + m_referencePressure, + m_maxPermeability, + m_referencePermeability, + m_permeability, + m_dPerm_dPressure ); + } + + struct viewKeyStruct : public PermeabilityBase::viewKeyStruct + { + static constexpr char const * referencePermeabilityComponentsString() { return "referencePermeabilityComponents"; } + static constexpr char const * pressureDependenceConstantsString() { return "pressureDependenceConstants"; } + static constexpr char const * referencePressureString() { return "referencePressure"; } + static constexpr char const * referencePermeabilityString() { return "referencePermeability"; } + static constexpr char const * maxPermeabilityString() { return "maxPermeability"; } + static constexpr char const * pressureModelTypeString() { return "pressureModelType"; } + } viewKeys; + + virtual void initializeState() const override final; + +protected: + + virtual void postProcessInput() override; + +private: + + /// Permeability components at the reference pressure + R1Tensor m_referencePermeabilityComponents; + + /// Pressure dependent coefficients for each permeability component + R1Tensor m_pressureDependenceConstants; + + /// Reference pressure in the model + real64 m_referencePressure; + + /// Maximum permeability + real64 m_maxPermeability; + + array3d< real64 > m_referencePermeability; + + /// Pressure dependence model type + PressureModelType m_presModelType; + +}; + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void PressurePermeabilityUpdate::compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const +{ + for( localIndex i=0; i < permeability.size(); i++ ) + { + real64 const perm = referencePermeability[i] * exp( pressureDependenceConstants[i] * deltaPressure ); + + permeability[i] = perm; + dPerm_dPressure[i] = perm * pressureDependenceConstants[i]; + } +} + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void PressurePermeabilityUpdate::compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + real64 const maxPermeability, + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const +{ + for( localIndex i=0; i < permeability.size(); i++ ) + { + real64 const pressureOffSet = log( maxPermeability/referencePermeability[i] - 1 )/pressureDependenceConstants[i]; + + real64 const perm = maxPermeability/( 1 + exp( -pressureDependenceConstants[i]*( deltaPressure - pressureOffSet ) ) ); + permeability[i] = perm; + dPerm_dPressure[i] = perm*perm/maxPermeability*pressureDependenceConstants[i]*exp( -pressureDependenceConstants[i]*deltaPressure ); + } +} + +}/* namespace constitutive */ + +} /* namespace geos */ + + +#endif //GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp index 49043f3c980..3a168585f6a 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp @@ -23,6 +23,7 @@ #include "constitutive/permeability/CarmanKozenyPermeability.hpp" #include "constitutive/permeability/ExponentialDecayPermeability.hpp" #include "constitutive/permeability/ParallelPlatesPermeability.hpp" +#include "constitutive/permeability/PressurePermeability.hpp" #include "constitutive/permeability/SlipDependentPermeability.hpp" #include "constitutive/permeability/WillisRichardsPermeability.hpp" @@ -47,6 +48,7 @@ CompressibleSolid< PORO_TYPE, PERM_TYPE >::~CompressibleSolid() = default; // Register all CompressibleSolid model types. typedef CompressibleSolid< PressurePorosity, ConstantPermeability > CompressibleRockConstant; typedef CompressibleSolid< PressurePorosity, CarmanKozenyPermeability > CompressibleRockCK; +typedef CompressibleSolid< PressurePorosity, PressurePermeability > CompressibleRockPressurePerm; typedef CompressibleSolid< PressurePorosity, ExponentialDecayPermeability > FaultED; typedef CompressibleSolid< PressurePorosity, ParallelPlatesPermeability > FractureRock; typedef CompressibleSolid< PressurePorosity, SlipDependentPermeability > Fault; @@ -54,6 +56,7 @@ typedef CompressibleSolid< PressurePorosity, WillisRichardsPermeability > FaultW REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockConstant, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockCK, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockPressurePerm, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, FractureRock, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, FaultED, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, Fault, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index b8c37b4c07a..79b46f7f98e 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -62,7 +62,7 @@ class CompressibleSolidUpdates : public CoupledSolidUpdates< NullModel, PORO_TYP { m_porosityUpdate.updateFromPressureAndTemperature( k, q, pressure, temperature ); real64 const porosity = m_porosityUpdate.getPorosity( k, q ); - m_permUpdate.updateFromPorosity( k, q, porosity ); + m_permUpdate.updateFromPressureAndPorosity( k, q, pressure, porosity ); } GEOS_HOST_DEVICE diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index 35306907a4e..cea3367d3e6 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -202,7 +202,7 @@ class CoupledSolidBase : public ConstitutiveBase /** * @brief initialize the constitutive models fields. */ - void initializeState() const + virtual void initializeState() const { getBasePorosityModel().initializeState(); getBasePermModel().initializeState(); diff --git a/src/coreComponents/constitutive/solid/PorousSolid.cpp b/src/coreComponents/constitutive/solid/PorousSolid.cpp index ed9cadb7bca..f427e523873 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.cpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.cpp @@ -46,6 +46,12 @@ PorousSolid< SOLID_TYPE >::PorousSolid( string const & name, Group * const paren template< typename SOLID_TYPE > PorousSolid< SOLID_TYPE >::~PorousSolid() = default; +template< typename SOLID_TYPE > +void PorousSolid< SOLID_TYPE >::initializeState() const +{ + CoupledSolid< SOLID_TYPE, BiotPorosity, ConstantPermeability >::initializeState(); +} + // Register all PorousSolid model types. typedef PorousSolid< ElasticIsotropic > PorousElasticIsotropic; typedef PorousSolid< ElasticTransverseIsotropic > PorousElasticTransverseIsotropic; diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 2ed3b1fb4a3..154f047692c 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -82,6 +82,7 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, real64 ( & dTotalStress_dPressure )[6], real64 ( & dTotalStress_dTemperature )[6], DiscretizationOps & stiffness, + integer const performStressInitialization, real64 & porosity, real64 & porosity_n, real64 & dPorosity_dVolStrain, @@ -116,8 +117,17 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, dPorosity_dPressure, dPorosity_dTemperature ); + // skip porosity update when doing poromechanics initialization + if( performStressInitialization ) + { + porosity = porosityInit; + dPorosity_dVolStrain = 0.0; + dPorosity_dPressure = 0.0; + dPorosity_dTemperature = 0.0; + } + // Save the derivative of solid density wrt pressure for the computation of the body force - dSolidDensity_dPressure = m_porosityUpdate.dGrainDensity_dPressure(); + dSolidDensity_dPressure = m_porosityUpdate.dGrainDensity_dPressure( k ); } GEOS_HOST_DEVICE @@ -357,6 +367,11 @@ class PorousSolid : public CoupledSolid< SOLID_TYPE, BiotPorosity, ConstantPerme getPermModel() ); } + /** + * @brief initialize the constitutive models fields. + */ + virtual void initializeState() const override final; + /** * @brief Const/non-mutable accessor for density * @return Accessor diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp index 1928050957d..30ac96a62d6 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp @@ -30,7 +30,8 @@ SolidInternalEnergy::SolidInternalEnergy( string const & name, Group * const par ConstitutiveBase( name, parent ), m_internalEnergy(), m_dInternalEnergy_dTemperature(), - m_volumetricHeatCapacity(), + m_referenceVolumetricHeatCapacity(), + m_dVolumetricHeatCapacity_dTemperature(), m_referenceTemperature(), m_referenceInternalEnergy() { @@ -47,9 +48,14 @@ SolidInternalEnergy::SolidInternalEnergy( string const & name, Group * const par setApplyDefaultValue( 0.0 ). setDescription( "Derivative of the solid internal energy w.r.t. temperature [J/(m^3.K)]" ); - registerWrapper( viewKeyStruct::volumetricHeatCapacityString(), &m_volumetricHeatCapacity ). + registerWrapper( viewKeyStruct::referenceVolumetricHeatCapacityString(), &m_referenceVolumetricHeatCapacity ). setInputFlag( InputFlags::REQUIRED ). - setDescription( "Solid volumetric heat capacity [J/(kg.K)]" ); + setDescription( "Reference solid volumetric heat capacity [J/(kg.K)]" ); + + registerWrapper( viewKeyStruct::dVolumetricHeatCapacity_dTemperatureString(), &m_dVolumetricHeatCapacity_dTemperature ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.0 ). + setDescription( "Derivative of the solid volumetric heat capacity w.r.t. temperature [J/(m^3.K^2)]" ); registerWrapper( viewKeyStruct::referenceTemperatureString(), &m_referenceTemperature ). setInputFlag( InputFlags::REQUIRED ). diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp index cd2efaa4024..8457722f19c 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp @@ -35,12 +35,14 @@ class SolidInternalEnergyUpdates SolidInternalEnergyUpdates( arrayView2d< real64 > const & internalEnergy, arrayView2d< real64 > const & dInternalEnergy_dTemperature, - real64 const & volumetricHeatCapacity, + real64 const & referenceVolumetricHeatCapacity, + real64 const & dVolumetricHeatCapacity_dTemperature, real64 const & referenceTemperature, real64 const & referenceInternalEnergy ): m_internalEnergy( internalEnergy ), m_dInternalEnergy_dTemperature( dInternalEnergy_dTemperature ), - m_volumetricHeatCapacity( volumetricHeatCapacity ), + m_referenceVolumetricHeatCapacity( referenceVolumetricHeatCapacity ), + m_dVolumetricHeatCapacity_dTemperature( dVolumetricHeatCapacity_dTemperature ), m_referenceTemperature( referenceTemperature ), m_referenceInternalEnergy( referenceInternalEnergy ) {} @@ -59,8 +61,10 @@ class SolidInternalEnergyUpdates real64 & internalEnergy, real64 & dInternalEnergy_dTemperature ) const { - internalEnergy = m_referenceInternalEnergy + m_volumetricHeatCapacity * ( temperature - m_referenceTemperature ); - dInternalEnergy_dTemperature = m_volumetricHeatCapacity; + real64 volumetricHeatCapacity = m_referenceVolumetricHeatCapacity + m_dVolumetricHeatCapacity_dTemperature * ( temperature - m_referenceTemperature ); + + internalEnergy = m_referenceInternalEnergy + volumetricHeatCapacity * ( temperature - m_referenceTemperature ); + dInternalEnergy_dTemperature = volumetricHeatCapacity + m_dVolumetricHeatCapacity_dTemperature * ( temperature - m_referenceTemperature ); } private: @@ -71,13 +75,16 @@ class SolidInternalEnergyUpdates /// Derivative of the solid internal energy w.r.t. the temperature arrayView2d< real64 > m_dInternalEnergy_dTemperature; - /// Solid volumetric heat capacity - real64 m_volumetricHeatCapacity; + /// Solid volumetric heat capacity at the reference tempearture + real64 m_referenceVolumetricHeatCapacity; + + /// Derivative of the solid volumetric heat capacity w.r.t. the temperature + real64 m_dVolumetricHeatCapacity_dTemperature; /// Reference temperature real64 m_referenceTemperature; - /// Reference internal energy + /// Internal energy at the reference temperature real64 m_referenceInternalEnergy; }; @@ -99,7 +106,8 @@ class SolidInternalEnergy : public ConstitutiveBase static constexpr char const * internalEnergyString() { return "internalEnergy"; } static constexpr char const * oldInternalEnergyString() { return "internalEnergy_n"; } static constexpr char const * dInternalEnergy_dTemperatureString() { return "dInternalEnergy_dTemperature"; } - static constexpr char const * volumetricHeatCapacityString() { return "volumetricHeatCapacity"; } + static constexpr char const * referenceVolumetricHeatCapacityString() { return "referenceVolumetricHeatCapacity"; } + static constexpr char const * dVolumetricHeatCapacity_dTemperatureString() { return "dVolumetricHeatCapacity_dTemperature"; } static constexpr char const * referenceTemperatureString() { return "referenceTemperature"; } static constexpr char const * referenceInternalEnergyString() { return "referenceInternalEnergy"; } } viewKeys; @@ -114,7 +122,8 @@ class SolidInternalEnergy : public ConstitutiveBase { return KernelWrapper( m_internalEnergy, m_dInternalEnergy_dTemperature, - m_volumetricHeatCapacity, + m_referenceVolumetricHeatCapacity, + m_dVolumetricHeatCapacity_dTemperature, m_referenceTemperature, m_referenceInternalEnergy ); } @@ -152,8 +161,11 @@ class SolidInternalEnergy : public ConstitutiveBase /// Derivative of the solid internal energy w.r.t. the temperature array2d< real64 > m_dInternalEnergy_dTemperature; - /// Solid volumetric heat capacity - real64 m_volumetricHeatCapacity; + /// Solid volumetric heat capacity at the reference temperature + real64 m_referenceVolumetricHeatCapacity; + + /// Derivative of the solid volumetric heat capacity w.r.t. the temperature + real64 m_dVolumetricHeatCapacity_dTemperature; /// Reference temperature real64 m_referenceTemperature; diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index 861bfed8fe5..ec781ad0d8f 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -18,6 +18,7 @@ #include "BiotPorosity.hpp" #include "PorosityFields.hpp" +#include "constitutive/solid/SolidBase.hpp" namespace geos { @@ -31,8 +32,9 @@ namespace constitutive BiotPorosity::BiotPorosity( string const & name, Group * const parent ): PorosityBase( name, parent ) { - registerWrapper( viewKeyStruct::grainBulkModulusString(), &m_grainBulkModulus ). + registerWrapper( viewKeyStruct::defaultGrainBulkModulusString(), &m_defaultGrainBulkModulus ). setInputFlag( InputFlags::REQUIRED ). + setApplyDefaultValue( -1.0 ). setDescription( "Grain bulk modulus" ); registerWrapper( viewKeyStruct::defaultThermalExpansionCoefficientString(), &m_defaultThermalExpansionCoefficient ). @@ -46,8 +48,12 @@ BiotPorosity::BiotPorosity( string const & name, Group * const parent ): setDescription( "Flag enabling uniaxial approximation in fixed stress update" ); registerField( fields::porosity::biotCoefficient{}, &m_biotCoefficient ). - setApplyDefaultValue( 1.0 ); // this is useful for sequential simulations, for the first flow solve - // ultimately, we want to be able to load the biotCoefficient from input directly, and this won't be necessary anymore + setApplyDefaultValue( 1.0 ). + setDescription( "Biot coefficient" ); + + registerField( fields::porosity::grainBulkModulus{}, &m_grainBulkModulus ). + setApplyDefaultValue( -1.0 ). + setDescription( "Grain Bulk modulus." ); registerField( fields::porosity::thermalExpansionCoefficient{}, &m_thermalExpansionCoefficient ); @@ -78,6 +84,10 @@ void BiotPorosity::postProcessInput() getWrapper< array1d< real64 > >( fields::porosity::thermalExpansionCoefficient::key() ). setApplyDefaultValue( m_defaultThermalExpansionCoefficient ); + + // set results as array default values + getWrapper< array1d< real64 > >( fields::porosity::grainBulkModulus::key() ). + setApplyDefaultValue( m_defaultGrainBulkModulus ); } void BiotPorosity::initializeState() const diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index 4d64b0d9416..a6ae9e38815 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -56,7 +56,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates arrayView1d< real64 > const & averageMeanTotalStressIncrement_k, arrayView1d< real64 > const & bulkModulus, arrayView1d< real64 > const & shearModulus, - real64 const & grainBulkModulus, + arrayView1d< real64 > const & grainBulkModulus, integer const useUniaxialFixedStress ): PorosityBaseUpdates( newPorosity, porosity_n, dPorosity_dPressure, @@ -77,10 +77,10 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 getBiotCoefficient( localIndex const k ) const { return m_biotCoefficient[k]; } GEOS_HOST_DEVICE - real64 getGrainBulkModulus() const { return m_grainBulkModulus; } + real64 getGrainBulkModulus( localIndex const k ) const { return m_grainBulkModulus[k]; } GEOS_HOST_DEVICE - real64 dGrainDensity_dPressure() const { return 1.0 / m_grainBulkModulus; } + real64 dGrainDensity_dPressure( localIndex const k ) const { return 1.0 / m_grainBulkModulus[k]; } GEOS_HOST_DEVICE void updateFromPressureTemperatureAndStrain( localIndex const k, @@ -92,7 +92,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 & dPorosity_dPressure, real64 & dPorosity_dTemperature ) const { - real64 const biotSkeletonModulusInverse = (m_biotCoefficient[k] - m_referencePorosity[k]) / m_grainBulkModulus; + real64 const biotSkeletonModulusInverse = (m_biotCoefficient[k] - m_referencePorosity[k]) / m_grainBulkModulus[k]; real64 const porosityThermalExpansion = 3 * m_thermalExpansionCoefficient[k] * ( m_biotCoefficient[k] - m_referencePorosity[k] ); real64 const porosity = m_porosity_n[k][q] @@ -123,9 +123,10 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 const & thermalExpansionCoefficient, real64 const & averageMeanTotalStressIncrement_k, real64 const & bulkModulus, - real64 const & fixedStressModulus ) const + real64 const & fixedStressModulus, + real64 const & grainBulkModulus ) const { - real64 const biotSkeletonModulusInverse = (biotCoefficient - referencePorosity) / m_grainBulkModulus; + real64 const biotSkeletonModulusInverse = (biotCoefficient - referencePorosity) / grainBulkModulus; real64 const porosityThermalExpansion = 3 * thermalExpansionCoefficient * ( biotCoefficient - referencePorosity ); real64 const pressureCoefficient = biotCoefficient * biotCoefficient / bulkModulus; real64 const temperatureCoefficient = 3 * biotCoefficient * thermalExpansionCoefficient; @@ -175,7 +176,8 @@ class BiotPorosityUpdates : public PorosityBaseUpdates m_thermalExpansionCoefficient[k], m_averageMeanTotalStressIncrement_k[k], m_bulkModulus[k], - fixedStressModulus ); + fixedStressModulus, + m_grainBulkModulus[k] ); } GEOS_HOST_DEVICE @@ -184,7 +186,8 @@ class BiotPorosityUpdates : public PorosityBaseUpdates { m_bulkModulus[k] = bulkModulus; m_shearModulus[k] = shearModulus; - m_biotCoefficient[k] = 1 - bulkModulus / m_grainBulkModulus; + + m_biotCoefficient[k] = 1.0 - bulkModulus / m_grainBulkModulus[k]; } GEOS_HOST_DEVICE @@ -198,7 +201,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates protected: /// Grain bulk modulus (read from XML) - real64 const m_grainBulkModulus; + arrayView1d< real64 > const m_grainBulkModulus; /// View on the thermal expansion coefficients (read from XML) arrayView1d< real64 const > const m_thermalExpansionCoefficient; @@ -236,7 +239,7 @@ class BiotPorosity : public PorosityBase struct viewKeyStruct : public PorosityBase::viewKeyStruct { - static constexpr char const *grainBulkModulusString() { return "grainBulkModulus"; } + static constexpr char const *defaultGrainBulkModulusString() { return "defaultGrainBulkModulus"; } static constexpr char const *meanTotalStressIncrementString() { return "meanTotalStressIncrement"; } @@ -249,6 +252,8 @@ class BiotPorosity : public PorosityBase static constexpr char const *defaultThermalExpansionCoefficientString() { return "defaultPorosityTEC"; } static constexpr char const *useUniaxialFixedStressString() { return "useUniaxialFixedStress"; } + + static constexpr char const *defaultBiotCoefficientString() { return "defaultBiotCoefficient"; } } viewKeys; virtual void initializeState() const override final; @@ -313,6 +318,9 @@ class BiotPorosity : public PorosityBase /// Thermal expansion coefficients (read from XML) array1d< real64 > m_thermalExpansionCoefficient; + /// Default value of the Biot coefficient (read from XML) + real64 m_defaultBiotCoefficient; + /// Biot coefficients (update in the update class, not read in input) array1d< real64 > m_biotCoefficient; @@ -329,7 +337,10 @@ class BiotPorosity : public PorosityBase array1d< real64 > m_averageMeanTotalStressIncrement_k; /// Grain bulk modulus (read from XML) - real64 m_grainBulkModulus; + real64 m_defaultGrainBulkModulus; + + /// Grain bulk modulus (can be specified in XML) + array1d< real64 > m_grainBulkModulus; /// Flag enabling uniaxial approximation in fixed stress update integer m_useUniaxialFixedStress; diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 595b8354fe1..395f209e1f7 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -137,10 +137,6 @@ class PorosityBase : public ConstitutiveBase virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; - static string catalogName() { return "PorosityBase"; } - - virtual string getCatalogName() const override { return catalogName(); } - struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct { static constexpr char const * defaultReferencePorosityString() { return "defaultReferencePorosity"; } diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp index f36a43b440f..98d2a82e339 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp @@ -82,7 +82,7 @@ DECLARE_FIELD( biotCoefficient, "biotCoefficient", array1d< real64 >, 0, - NOPLOT, + LEVEL_0, WRITE_AND_READ, "Biot coefficient" ); @@ -110,6 +110,14 @@ DECLARE_FIELD( averageMeanTotalStressIncrement_k, NO_WRITE, "Mean total stress increment averaged over quadrature points at the previous sequential iteration" ); +DECLARE_FIELD( grainBulkModulus, + "grainBulkModulus", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Biot coefficient" ); + } diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index add6c460a3f..2cd470b2e28 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -1,12 +1,15 @@ # Specify list of tests set( gtest_geosx_tests + testCompositionalDensity.cpp testCompositionalProperties.cpp testDamageUtilities.cpp testDruckerPrager.cpp testElasticIsotropic.cpp testKValueInitialization.cpp + testLohrenzBrayClarkViscosity.cpp testModifiedCamClay.cpp testNegativeTwoPhaseFlash.cpp + testNegativeTwoPhaseFlash9Comp.cpp testParticleFluidEnums.cpp testPropertyConversions.cpp testCubicEOS.cpp @@ -14,7 +17,7 @@ set( gtest_geosx_tests set( dependencyList gtest blas lapack constitutive ${parallelDeps} ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index e9f2f1fbf76..90779c04560 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -44,12 +44,12 @@ struct Fluid static constexpr integer C8 = 9; static constexpr integer C10 = 10; - static constexpr integer Pc = 0; - static constexpr integer Tc = 1; - static constexpr integer Vc = 2; - static constexpr integer Ac = 3; - static constexpr integer Mw = 4; - static constexpr integer Vs = 5; + static constexpr integer Pc = 0; // Critical pressure + static constexpr integer Tc = 1; // Critical temperature + static constexpr integer Vc = 2; // Critical colume + static constexpr integer Ac = 3; // Accentric factor + static constexpr integer Mw = 4; // Molecular weight + static constexpr integer Vs = 5; // Volume shift static std::array< real64, 66 > data; }; @@ -66,6 +66,10 @@ class TestFluid static std::unique_ptr< TestFluid< NC > > create( std::array< integer, NC > const & components ) { std::unique_ptr< TestFluid< NC > > testFluid( new TestFluid() ); + for( integer ic = 0; ic < NC; ++ic ) + { + testFluid->componentNames.emplace_back( GEOS_FMT( "COMP{}", ic+1 )); + } createArray( testFluid->criticalPressure, components, Fluid::Pc, Fluid::data ); createArray( testFluid->criticalTemperature, components, Fluid::Tc, Fluid::data ); createArray( testFluid->criticalVolume, components, Fluid::Vc, Fluid::data ); @@ -76,21 +80,54 @@ class TestFluid return testFluid; } - constitutive::compositional::ComponentProperties::KernelWrapper createKernelWrapper() const + template< typename LIST > + void setBinaryCoefficients( LIST const & bics ) { - return constitutive::compositional::ComponentProperties::KernelWrapper( - molecularWeight, - criticalPressure, - criticalTemperature, - criticalVolume, - acentricFactor, - volumeShift, - binaryCoeff ); + auto bic = bics.begin(); + for( int i = 0; i < NC; ++i ) + { + for( int j = 0; j < i; ++j ) + { + binaryCoeff( i, j ) = *bic++; + binaryCoeff( j, i ) = binaryCoeff( i, j ); + } + binaryCoeff( i, i ) = 0.0; + } + } + + constitutive::compositional::ComponentProperties & getComponentProperties() + { + if( !m_component_properties ) + { + m_component_properties = std::make_unique< constitutive::compositional::ComponentProperties >( + componentNames, + molecularWeight ); + createArray( m_component_properties->m_componentCriticalPressure, criticalPressure ); + createArray( m_component_properties->m_componentCriticalTemperature, criticalTemperature ); + createArray( m_component_properties->m_componentAcentricFactor, acentricFactor ); + createArray( m_component_properties->m_componentVolumeShift, volumeShift ); + m_component_properties->m_componentBinaryCoeff.resize( NC, NC ); + for( integer ic = 0; ic < NC; ++ic ) + { + for( integer jc = 0; jc < NC; ++jc ) + { + m_component_properties->m_componentBinaryCoeff( ic, jc ) = binaryCoeff( ic, jc ); + } + } + } + return *m_component_properties; + } + + constitutive::compositional::ComponentProperties::KernelWrapper createKernelWrapper() + { + return getComponentProperties().createKernelWrapper(); } private: TestFluid() = default; +public: + string_array componentNames; array1d< real64 > criticalPressure; array1d< real64 > criticalTemperature; array1d< real64 > criticalVolume; @@ -99,6 +136,9 @@ class TestFluid array1d< real64 > volumeShift; array2d< real64 > binaryCoeff; +private: + std::unique_ptr< constitutive::compositional::ComponentProperties > m_component_properties{}; + private: template< typename ARRAY, typename LIST, typename DATAARRAY > static void createArray( ARRAY & array, LIST const & indices, integer const row, DATAARRAY const & data ) @@ -117,6 +157,15 @@ class TestFluid array.emplace_back( value ); } } + template< typename ARRAY, typename LIST > + static void populateArray( ARRAY & array, LIST const & data ) + { + integer i = 0; + for( auto const value : data ) + { + array[i++] = value; + } + } }; std::array< real64, 66 > Fluid::data = { @@ -133,8 +182,8 @@ std::array< real64, 66 > Fluid::data = { 3.4400e-01, 2.3900e-01, 4.0000e-02, 9.4200e-02, -2.1900e-01, 9.9500e-02, 1.5230e-01, 1.8440e-01, 1.1400e-02, 4.4300e-01, 8.1600e-01, // -- Mw - 1.8015e+01, 4.4010e+01, 2.8013e+01, 3.4100e+01, 1.6043e+01, 3.0070e+01, - 4.4097e+01, 5.8124e+01, 7.2151e+01, 1.1423e+02, 1.4228e+02, + 1.8015e-02, 4.4010e-02, 2.8013e-02, 3.4100e-02, 1.6043e-02, 3.0070e-02, + 4.4097e-02, 5.8124e-02, 7.2151e-02, 1.1423e-01, 1.4228e-01, // -- Vs 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, diff --git a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp index ec2cea463ca..c608334e028 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp @@ -59,6 +59,59 @@ void testNumericalDerivative( real64 const x, real64 const dx, real64 const deri checkRelativeError( derivative, rightDerivative, relTolerance, absTolerance, "Right derivative" ); } +/** + * @brief Tests a multi-valued function against a derivative + * @details Will calculate the left-sided and the right-sided numerical derivatives of a function + * and compare this against a analytically calculated values provided. + * @tparam numValues the number of values that the function returns + * @tparam FUNCTION the type of function (typically a lambda) + * @param x The value at which the function should be evaluated + * @param dx The value to use to perturb @c x in the calculation of the numerical derivatives + * @param derivatives The values of the analytically calculated derivatives to use for comparison + * @param function The function which is being tested. This should be a function that takes 2 parameters. + * The first is the value at which the function is being evaluated (x) and the second is an array + * of size @c numValues which is the result of the execution of the function. + * @param absTolerance The absolute tolerance to use for the comparison + * @param relTolerance The relative tolerance to use for the comparison + */ +template< integer numValues, typename FUNCTION > +void testNumericalDerivative( real64 const x, + real64 const dx, + arraySlice1d< real64 const > const & derivatives, + FUNCTION && function, + real64 const absTolerance = absTol, + real64 const relTolerance = relTol ) +{ + stackArray1d< real64, numValues > leftValues( numValues ); + stackArray1d< real64, numValues > centreValues( numValues ); + stackArray1d< real64, numValues > rightValues( numValues ); + function( x-dx, leftValues ); + function( x, centreValues ); + function( x+dx, rightValues ); + + // Use the same space to calculate the left-sided and right sided derivatives + for( integer i = 0; i < numValues; ++i ) + { + // Choose from the left, central and right derivatives, the one that's nearest the analytical value + real64 minError = LvArray::NumericLimits< real64 >::max; + real64 selectedDerivative = 0.0; + for( real64 const distance : {centreValues[i] - leftValues[i], + rightValues[i] - centreValues[i], + 0.5*(rightValues[i] - leftValues[i])} ) + { + real64 const deriv = distance / dx; + real64 const error = LvArray::math::abs( deriv - derivatives[i] ); + if( error < minError ) + { + minError = error; + selectedDerivative = deriv; + } + } + checkRelativeError( derivatives[i], selectedDerivative, relTolerance, absTolerance, + GEOS_FMT( "Numerical derivative for component {}", i ) ); + } +} + }// namespace internal }// namespace testing diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp new file mode 100644 index 00000000000..2a77b2c1c99 --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -0,0 +1,258 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +template< int NC > +using DensityData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const, // expected molar density + real64 const // expected mass density + >; + +template< int NC > +struct FluidData {}; + +template<> +struct FluidData< 9 > +{ + static std::unique_ptr< TestFluid< 9 > > createFluid() + { + auto fluid = TestFluid< 9 >::create( {Fluid::H2O, Fluid::CO2, Fluid::N2, Fluid::C5, Fluid::C2, Fluid::C3, Fluid::C4, Fluid::C5, Fluid::C10} ); + const std::array< real64 const, 36 > bics = { + 0.01, 0, 0.003732, 0, 0.01, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.01, 0, 0.028, 0.01, 0.01, 0, 0, 0.01, 0, 0.04532, 0.01, 0.01, 0, 0, 0 + }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< int NC, typename EOS_TYPE > +class CompositionalDensityTestFixture : public ::testing::TestWithParam< DensityData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + CompositionalDensityTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + m_parameters = CompositionalDensity< EOS_TYPE >::createParameters( std::make_unique< ModelParameters >() ); + m_density = std::make_unique< CompositionalDensity< EOS_TYPE > >( "PhaseDensity", componentProperties, 0, *m_parameters ); + } + + ~CompositionalDensityTestFixture() = default; + + void testDensityValues( DensityData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + real64 const expectedMolarDensity = std::get< 3 >( data ); + real64 const expectedMassDensity = std::get< 4 >( data ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto kernelWrapper = this->m_density->createKernelWrapper(); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + + kernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + tempDerivs.toSlice(), + massDensity, + tempDerivs.toSlice(), + false ); + + checkRelativeError( molarDensity, expectedMolarDensity, relTol, absTol ); + checkRelativeError( massDensity, expectedMassDensity, relTol, absTol ); + } + + void testDensityDerivatives( DensityData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto kernelWrapper = m_density->createKernelWrapper(); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + stackArray1d< real64, numDofs > molarDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > massDensityDerivs( numDofs ); + + kernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + molarDensityDerivs.toSlice(), + massDensity, + massDensityDerivs.toSlice(), + false ); + + auto calculateDensity = [&]( real64 const p, real64 const t, auto const & zmf ) -> std::pair< real64, real64 > { + real64 densityMolar = 0.0; + real64 densityMass = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + kernelWrapper.compute( componentProperties, p, t, + zmf.toSliceConst(), + densityMolar, + tempDerivs.toSlice(), + densityMass, + tempDerivs.toSlice(), + false ); + return {densityMolar, densityMass}; + }; + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + internal::testNumericalDerivative( + pressure, dp, molarDensityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return calculateDensity( p, temperature, phaseComposition ).first; + } ); + internal::testNumericalDerivative( + pressure, dp, massDensityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return calculateDensity( p, temperature, phaseComposition ).second; + } ); + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + internal::testNumericalDerivative( + temperature, dT, molarDensityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return calculateDensity( pressure, t, phaseComposition ).first; + } ); + internal::testNumericalDerivative( + temperature, dT, massDensityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return calculateDensity( pressure, t, phaseComposition ).second; + } ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < numComps; ++ic ) + { + internal::testNumericalDerivative( + 0.0, dz, molarDensityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return calculateDensity( pressure, temperature, zmf ).first; + } ); + internal::testNumericalDerivative( + 0.0, dz, massDensityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return calculateDensity( pressure, temperature, zmf ).second; + } ); + } + } + +protected: + std::unique_ptr< CompositionalDensity< EOS_TYPE > > m_density{}; + std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< ModelParameters > m_parameters{}; +}; + +using CompositionalDensity9CompPR = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< PengRobinsonEOS > >; +using CompositionalDensity9CompSRK = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; + +TEST_P( CompositionalDensity9CompPR, testDensityDerivatives ) +{ + testDensityDerivatives( GetParam() ); +} + +TEST_P( CompositionalDensity9CompSRK, testDensityDerivatives ) +{ + testDensityDerivatives( GetParam() ); +} + +INSTANTIATE_TEST_SUITE_P( + CompositionalDensityTest, + CompositionalDensity9CompPR, + ::testing::ValuesIn( { + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 8.355571e+03, 4.559906e+02 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.703898e+02, 2.691914e+01 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 8.337694e+03, 4.567935e+02 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.073321e+02, 4.951606e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 6.178234e+02, 2.158813e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.197865e+02, 5.039192e+01 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.095078e+04, 5.976195e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.480270e+04, 8.666618e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.087917e+04, 5.960323e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.065128e+04, 5.812747e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.305823e+04, 8.057060e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.058381e+04, 5.798506e+02 } + } ) + ); +INSTANTIATE_TEST_SUITE_P( + CompositionalDensityTest, + CompositionalDensity9CompSRK, + ::testing::ValuesIn( { + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 7.433979e+03, 4.056963e+02 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.629968e+02, 2.666082e+01 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 7.416959e+03, 4.063495e+02 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 8.919848e+02, 4.867851e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 6.133569e+02, 2.143206e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.045641e+02, 4.955794e+01 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.868675e+03, 5.385656e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.257420e+04, 7.887929e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.803814e+03, 5.371171e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.615674e+03, 5.247585e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.109248e+04, 7.370183e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.554300e+03, 5.234471e+02 } + } ) + ); + +} // testing + +} // geos diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp index c41428ed2da..320e1a4b085 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp @@ -51,6 +51,8 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar { public: static constexpr integer numComps = NC; + static constexpr integer numDof = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: CompositionalPropertiesTestDataTestFixture() : m_fluid( createFluid< NC >() ) @@ -65,7 +67,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar real64 const molarDensity = computeMolarDensity( pressure, temperature, - composition ); + composition.toSliceConst() ); checkRelativeError( molarDensity, expectedMolarDensity, internal::relTol, internal::absTol ); } @@ -76,23 +78,19 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar const auto [pressure, temperature, composition] = getInputData( data ); real64 molarDensity = 0.0; - real64 dMolarDensity_dp = 0.0; - real64 dMolarDensity_dt = 0.0; - array1d< real64 > dMolarDensity_dz( numComps ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); computeMolarDensity( pressure, temperature, - composition, + composition.toSliceConst(), molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; internal::testNumericalDerivative( - pressure, dp, dMolarDensity_dp, + pressure, dp, molarDensityDerivs[Deriv::dP], [this, & t=temperature, & zmf=composition]( real64 const p ) -> real64 { return computeMolarDensity( p, t, zmf ); } ); @@ -100,7 +98,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; internal::testNumericalDerivative( - temperature, dT, dMolarDensity_dt, + temperature, dT, molarDensityDerivs[Deriv::dT], [this, & p=pressure, & zmf=composition]( real64 const t ) -> real64 { return computeMolarDensity( p, t, zmf ); } ); @@ -110,7 +108,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar for( integer ic = 0; ic < numComps; ++ic ) { internal::testNumericalDerivative( - 0.0, dz, dMolarDensity_dz[ic], + 0.0, dz, molarDensityDerivs[Deriv::dC + ic], [this, & p=pressure, & t=temperature, zmf=composition, ic]( real64 const z ) -> real64 { zmf[ic] += z; real64 const density = computeMolarDensity( p, t, zmf ); @@ -139,23 +137,19 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar const auto [pressure, temperature, composition] = getInputData( data ); real64 massDensity = 0.0; - real64 dMassDensity_dp = 0.0; - real64 dMassDensity_dt = 0.0; - array1d< real64 > dMassDensity_dz( numComps ); + array1d< real64 > massDensityDerivs( numDof ); computeMassDensity( pressure, temperature, composition, massDensity, - dMassDensity_dp, - dMassDensity_dt, - dMassDensity_dz ); + massDensityDerivs ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; internal::testNumericalDerivative( - pressure, dp, dMassDensity_dp, + pressure, dp, massDensityDerivs[Deriv::dP], [this, & t=temperature, & zmf=composition]( real64 const p ) -> real64 { return computeMassDensity( p, t, zmf ); } ); @@ -163,7 +157,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; internal::testNumericalDerivative( - temperature, dT, dMassDensity_dt, + temperature, dT, massDensityDerivs[Deriv::dT], [this, & p=pressure, & zmf=composition]( real64 const t ) -> real64 { return computeMassDensity( p, t, zmf ); } ); @@ -173,11 +167,12 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar for( integer ic = 0; ic < numComps; ++ic ) { internal::testNumericalDerivative( - 0.0, dz, dMassDensity_dz[ic], + 0.0, dz, massDensityDerivs[Deriv::dC + ic], [this, & p=pressure, & t=temperature, & zmf=composition, ic]( real64 const z ) -> real64 { + real64 const z0 = zmf[ic]; zmf[ic] += z; real64 const density = computeMassDensity( p, t, zmf ); - zmf[ic] -= z; + zmf[ic] = z0; return density; } ); } @@ -195,64 +190,26 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar } real64 computeMolarDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition ) const + arraySlice1d< real64 const > const & composition ) const { - auto const componentProperties = this->m_fluid->createKernelWrapper(); - auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - auto const volumeShift = componentProperties.m_componentVolumeShift; - - real64 compressibilityFactor = 0.0; real64 molarDensity = 0.0; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); - real64 aMixtureCoefficient = 0.0; - real64 bMixtureCoefficient = 0.0; - - CubicEOSPhaseModel< EOS_TYPE >:: - computeMixtureCoefficients( numComps, - pressure, - temperature, - composition, - componentProperties, - aPureCoefficient, - bPureCoefficient, - aMixtureCoefficient, - bMixtureCoefficient ); - - CubicEOSPhaseModel< EOS_TYPE >:: - computeCompressibilityFactor( numComps, - composition, - binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, - aMixtureCoefficient, - bMixtureCoefficient, - compressibilityFactor ); - - CompositionalProperties::computeMolarDensity( numComps, - pressure, - temperature, - composition, - volumeShift, - compressibilityFactor, - molarDensity ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); + computeMolarDensity( pressure, temperature, composition, molarDensity, molarDensityDerivs.toSlice() ); return molarDensity; } void computeMolarDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition, + arraySlice1d< real64 const > const & composition, real64 & molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const dMolarDensity_dz ) const + arraySlice1d< real64 > const molarDensityDerivs ) const { auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; auto const volumeShift = componentProperties.m_componentVolumeShift; real64 compressibilityFactor = 0.0; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); real64 aMixtureCoefficient = 0.0; real64 bMixtureCoefficient = 0.0; @@ -262,17 +219,13 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar temperature, composition, componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient ); - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( numComps, @@ -280,54 +233,33 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar temperature, composition, componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( numComps, composition, binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor ); - real64 dCompressibilityFactor_dp = 0.0; - real64 dCompressibilityFactor_dt = 0.0; - array1d< real64 > dCompressibilityFactor_dz( numComps ); + stackArray1d< real64, numDof > compressibilityFactorDerivs( numDof ); CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( numComps, aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz ); - - CompositionalProperties:: - computeMolarDensity( numComps, - pressure, - temperature, - composition, - volumeShift, - compressibilityFactor, - molarDensity ); + aMixtureCoefficientDerivs.toSliceConst(), + bMixtureCoefficientDerivs.toSliceConst(), + compressibilityFactorDerivs.toSlice() ); CompositionalProperties:: computeMolarDensity( numComps, @@ -336,66 +268,44 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar composition, volumeShift, compressibilityFactor, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz, + compressibilityFactorDerivs.toSliceConst(), molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs ); } real64 computeMassDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition ) const + arraySlice1d< real64 const > const & composition ) const { - auto const componentProperties = this->m_fluid->createKernelWrapper(); - auto const molecularWeight = componentProperties.m_componentMolarWeight; - - real64 const molarDensity = computeMolarDensity( pressure, temperature, composition ); real64 massDensity = 0.0; - CompositionalProperties:: - computeMassDensity( numComps, - composition, - molecularWeight, - molarDensity, - massDensity ); + stackArray1d< real64, numDof > massDensityDerivs( numDof ); + computeMassDensity( pressure, temperature, composition, massDensity, massDensityDerivs.toSlice() ); return massDensity; } void computeMassDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition, + arraySlice1d< real64 const > const & composition, real64 & massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const dMassDensity_dz ) const + arraySlice1d< real64 > const massDensityDerivs ) const { auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const molecularWeight = componentProperties.m_componentMolarWeight; - massDensity = computeMassDensity( pressure, temperature, composition ); - real64 molarDensity = 0.0; - real64 dMolarDensity_dp = 0.0; - real64 dMolarDensity_dt = 0.0; - array1d< real64 > dMolarDensity_dz( numComps ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); + computeMolarDensity( pressure, temperature, composition, molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs.toSlice() ); CompositionalProperties:: computeMassDensity( numComps, + composition, molecularWeight, molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz, + molarDensityDerivs.toSliceConst(), massDensity, - dMassDensity_dp, - dMassDensity_dt, - dMassDensity_dz ); + massDensityDerivs ); } protected: @@ -430,72 +340,72 @@ template<> std::vector< CompositionalPropertiesTestData< 4 > > generateTestData< PengRobinsonEOS, 4 >() { return { - { 1.000000e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733061e+03, 1.271768e+02, 4.747588e+05 }, - { 1.000000e+05, 2.771500e+02, { 0.000652, 0.128231, 0.128281, 0.742836 }, 1.119134e+04, 4.630013e+01, 5.181608e+05 }, - { 1.000000e+05, 2.771500e+02, { 0.855328, 0.000205, 0.000000, 0.144467 }, 4.348717e+01, 2.658628e+01, 1.156162e+03 }, - { 1.000000e+05, 2.886500e+02, { 0.000507, 0.112984, 0.113029, 0.773480 }, 1.214893e+04, 4.293636e+01, 5.216311e+05 }, - { 1.000000e+05, 2.886500e+02, { 0.777870, 0.000520, 0.000000, 0.221610 }, 4.177763e+01, 2.584219e+01, 1.079625e+03 }, - { 1.000000e+05, 2.886500e+02, { 0.985235, 0.000000, 0.000000, 0.014765 }, 4.169466e+01, 2.786538e+01, 1.161838e+03 }, - { 1.000000e+05, 2.981500e+02, { 0.653033, 0.000901, 0.000000, 0.346066 }, 4.049414e+01, 2.463074e+01, 9.974005e+02 }, - { 1.000000e+05, 2.981500e+02, { 0.000506, 0.143046, 0.143326, 0.713122 }, 1.013248e+04, 4.959370e+01, 5.025071e+05 }, - { 1.000000e+05, 2.981500e+02, { 0.582848, 0.000748, 0.000000, 0.416404 }, 4.053125e+01, 2.391430e+01, 9.692764e+02 }, - { 1.000000e+05, 2.981500e+02, { 0.972848, 0.000000, 0.000000, 0.027152 }, 4.036515e+01, 2.774153e+01, 1.119791e+03 }, - { 1.000000e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045691 }, 3.754190e+03, 1.232183e+02, 4.625850e+05 }, - { 1.000000e+05, 3.331500e+02, { 0.210877, 0.008984, 0.000001, 0.780137 }, 3.640845e+01, 2.098792e+01, 7.641376e+02 }, - { 1.000000e+05, 3.331500e+02, { 0.818043, 0.000000, 0.000000, 0.181957 }, 3.614852e+01, 2.619379e+01, 9.468669e+02 }, - { 1.000000e+05, 3.721500e+02, { 0.000000, 0.104818, 0.104822, 0.790360 }, 3.312721e+01, 4.112577e+01, 1.362382e+03 }, - { 1.000000e+05, 3.721500e+02, { 0.000117, 0.356347, 0.549688, 0.093848 }, 3.581375e+03, 1.206090e+02, 4.319462e+05 }, - { 1.013250e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733064e+03, 1.271768e+02, 4.747592e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.000516, 0.112950, 0.112994, 0.773540 }, 1.215157e+04, 4.292888e+01, 5.216533e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.780815, 0.000514, 0.000000, 0.218672 }, 4.233123e+01, 2.587101e+01, 1.095152e+03 }, - { 1.013250e+05, 2.886500e+02, { 0.000599, 0.132633, 0.132752, 0.734016 }, 1.081051e+04, 4.727865e+01, 5.111063e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.743752, 0.000426, 0.000000, 0.255823 }, 4.234963e+01, 2.549200e+01, 1.079576e+03 }, - { 1.013250e+05, 2.981500e+02, { 0.000448, 0.114592, 0.114680, 0.770280 }, 1.192251e+04, 4.329570e+01, 5.161936e+05 }, - { 1.013250e+05, 2.981500e+02, { 0.657746, 0.000890, 0.000000, 0.341364 }, 4.103031e+01, 2.467683e+01, 1.012498e+03 }, - { 1.013250e+05, 2.981500e+02, { 0.000516, 0.142463, 0.142736, 0.714285 }, 1.016359e+04, 4.946432e+01, 5.027349e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045690 }, 3.754193e+03, 1.232184e+02, 4.625856e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593026e+04, 1.801500e+01, 8.274336e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593025e+04, 1.801500e+01, 8.274336e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.820407, 0.000000, 0.000000, 0.179593 }, 3.662747e+01, 2.621743e+01, 9.602781e+02 }, - { 1.013250e+05, 3.721500e+02, { 0.080408, 0.000000, 0.000000, 0.919592 }, 3.299996e+01, 1.881892e+01, 6.210236e+02 }, - { 5.000000e+06, 2.771500e+02, { 0.000000, 0.495216, 0.495235, 0.009549 }, 3.742134e+03, 1.272026e+02, 4.760091e+05 }, - { 5.000000e+06, 2.771500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.772799e+04, 1.801500e+01, 8.598197e+05 }, - { 5.000000e+06, 2.771500e+02, { 0.029212, 0.107914, 0.107918, 0.754956 }, 1.264269e+04, 4.210047e+01, 5.322630e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.000000, 0.493093, 0.493111, 0.013796 }, 3.739164e+03, 1.267344e+02, 4.738808e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.739475e+04, 1.801500e+01, 8.538165e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.999549, 0.000000, 0.000000, 0.000451 }, 2.122222e+03, 2.800849e+01, 5.944023e+04 }, - { 5.000000e+06, 2.981500e+02, { 0.000000, 0.490855, 0.490873, 0.018272 }, 3.739300e+03, 1.262410e+02, 4.720529e+05 }, - { 5.000000e+06, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.710908e+04, 1.801500e+01, 8.486701e+05 }, - { 5.000000e+06, 2.981500e+02, { 0.030096, 0.107834, 0.107839, 0.754231 }, 1.241638e+04, 4.209177e+01, 5.226274e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.031858, 0.107709, 0.107720, 0.752713 }, 1.198645e+04, 4.208259e+01, 5.044209e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.964491, 0.000264, 0.000000, 0.035245 }, 1.824920e+03, 2.768343e+01, 5.052004e+04 }, - { 5.000000e+06, 3.331500e+02, { 0.035989, 0.120533, 0.120574, 0.722904 }, 1.106526e+04, 4.495504e+01, 4.974394e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.961874, 0.000247, 0.000000, 0.037879 }, 1.826197e+03, 2.765560e+01, 5.050457e+04 }, - { 5.000000e+06, 3.721500e+02, { 0.037408, 0.121753, 0.121923, 0.718916 }, 1.046451e+04, 4.525417e+01, 4.735627e+05 }, - { 5.000000e+06, 3.721500e+02, { 0.889694, 0.001014, 0.000003, 0.109288 }, 1.643713e+03, 2.700817e+01, 4.439368e+04 }, - { 1.000000e+07, 2.771500e+02, { 0.000004, 0.000000, 0.000000, 0.999996 }, 4.775121e+04, 1.801504e+01, 8.602398e+05 }, - { 1.000000e+07, 2.771500e+02, { 0.999835, 0.000000, 0.000000, 0.000165 }, 4.468580e+03, 2.801135e+01, 1.251710e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.000000, 0.493260, 0.493279, 0.013460 }, 3.748279e+03, 1.267714e+02, 4.751745e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.742059e+04, 1.801500e+01, 8.542819e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.055934, 0.104932, 0.104936, 0.734198 }, 1.273695e+04, 4.171005e+01, 5.312588e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.000000, 0.491084, 0.491102, 0.017814 }, 3.748930e+03, 1.262914e+02, 4.734578e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.713720e+04, 1.801500e+01, 8.491766e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.056951, 0.104818, 0.104822, 0.733409 }, 1.263544e+04, 4.169517e+01, 5.268366e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.065451, 0.116299, 0.116311, 0.701940 }, 1.172878e+04, 4.431245e+01, 5.197309e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.991760, 0.000074, 0.000000, 0.008166 }, 4.103168e+03, 2.793775e+01, 1.146333e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.000000, 0.478424, 0.478442, 0.043135 }, 3.777896e+03, 1.235001e+02, 4.665706e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.600669e+04, 1.801500e+01, 8.288105e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.996818, 0.000000, 0.000000, 0.003182 }, 3.589847e+03, 2.798118e+01, 1.004482e+05 }, - { 1.000000e+07, 3.721500e+02, { 0.000000, 0.453197, 0.453215, 0.093588 }, 3.878777e+03, 1.179381e+02, 4.574555e+05 }, - { 1.000000e+08, 2.771500e+02, { 0.000000, 0.496608, 0.496627, 0.006766 }, 3.834889e+03, 1.275094e+02, 4.889844e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.310108e+04, 4.269497e+01, 5.593502e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.000031, 0.000000, 0.000000, 0.999969 }, 4.783830e+04, 1.801531e+01, 8.618217e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.999447, 0.000000, 0.000000, 0.000553 }, 2.330195e+04, 2.800748e+01, 6.526287e+05 }, - { 1.000000e+08, 2.981500e+02, { 0.000000, 0.493623, 0.493642, 0.012735 }, 3.840586e+03, 1.268513e+02, 4.871835e+05 }, - { 1.000000e+08, 3.331500e+02, { 0.010000, 0.000000, 0.000000, 0.990000 }, 4.638822e+04, 1.811498e+01, 8.403216e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.247160e+04, 4.269497e+01, 5.324747e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.000671, 0.000000, 0.000000, 0.999329 }, 4.538427e+04, 1.802171e+01, 8.179019e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.991955, 0.000000, 0.000000, 0.008045 }, 1.979639e+04, 2.793257e+01, 5.529641e+05 } + { 1.000000e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733061e+03, 1.271768e+02, 4.747588e+02 }, + { 1.000000e+05, 2.771500e+02, { 0.000652, 0.128231, 0.128281, 0.742836 }, 1.119134e+04, 4.630013e+01, 5.181608e+02 }, + { 1.000000e+05, 2.771500e+02, { 0.855328, 0.000205, 0.000000, 0.144467 }, 4.348717e+01, 2.658628e+01, 1.156162e+00 }, + { 1.000000e+05, 2.886500e+02, { 0.000507, 0.112984, 0.113029, 0.773480 }, 1.214893e+04, 4.293636e+01, 5.216311e+02 }, + { 1.000000e+05, 2.886500e+02, { 0.777870, 0.000520, 0.000000, 0.221610 }, 4.177763e+01, 2.584219e+01, 1.079625e+00 }, + { 1.000000e+05, 2.886500e+02, { 0.985235, 0.000000, 0.000000, 0.014765 }, 4.169466e+01, 2.786538e+01, 1.161838e+00 }, + { 1.000000e+05, 2.981500e+02, { 0.653033, 0.000901, 0.000000, 0.346066 }, 4.049414e+01, 2.463074e+01, 9.974005e-01 }, + { 1.000000e+05, 2.981500e+02, { 0.000506, 0.143046, 0.143326, 0.713122 }, 1.013248e+04, 4.959370e+01, 5.025071e+02 }, + { 1.000000e+05, 2.981500e+02, { 0.582848, 0.000748, 0.000000, 0.416404 }, 4.053125e+01, 2.391430e+01, 9.692764e-01 }, + { 1.000000e+05, 2.981500e+02, { 0.972848, 0.000000, 0.000000, 0.027152 }, 4.036515e+01, 2.774153e+01, 1.119791e+00 }, + { 1.000000e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045691 }, 3.754190e+03, 1.232183e+02, 4.625850e+02 }, + { 1.000000e+05, 3.331500e+02, { 0.210877, 0.008984, 0.000001, 0.780137 }, 3.640845e+01, 2.098792e+01, 7.641376e-01 }, + { 1.000000e+05, 3.331500e+02, { 0.818043, 0.000000, 0.000000, 0.181957 }, 3.614852e+01, 2.619379e+01, 9.468669e-01 }, + { 1.000000e+05, 3.721500e+02, { 0.000000, 0.104818, 0.104822, 0.790360 }, 3.312721e+01, 4.112577e+01, 1.362382e+00 }, + { 1.000000e+05, 3.721500e+02, { 0.000117, 0.356347, 0.549688, 0.093848 }, 3.581375e+03, 1.206090e+02, 4.319462e+02 }, + { 1.013250e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733064e+03, 1.271768e+02, 4.747592e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.000516, 0.112950, 0.112994, 0.773540 }, 1.215157e+04, 4.292888e+01, 5.216533e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.780815, 0.000514, 0.000000, 0.218672 }, 4.233123e+01, 2.587101e+01, 1.095152e+00 }, + { 1.013250e+05, 2.886500e+02, { 0.000599, 0.132633, 0.132752, 0.734016 }, 1.081051e+04, 4.727865e+01, 5.111063e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.743752, 0.000426, 0.000000, 0.255823 }, 4.234963e+01, 2.549200e+01, 1.079576e+00 }, + { 1.013250e+05, 2.981500e+02, { 0.000448, 0.114592, 0.114680, 0.770280 }, 1.192251e+04, 4.329570e+01, 5.161936e+02 }, + { 1.013250e+05, 2.981500e+02, { 0.657746, 0.000890, 0.000000, 0.341364 }, 4.103031e+01, 2.467683e+01, 1.012498e+00 }, + { 1.013250e+05, 2.981500e+02, { 0.000516, 0.142463, 0.142736, 0.714285 }, 1.016359e+04, 4.946432e+01, 5.027349e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045690 }, 3.754193e+03, 1.232184e+02, 4.625856e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593026e+04, 1.801500e+01, 8.274336e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593025e+04, 1.801500e+01, 8.274336e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.820407, 0.000000, 0.000000, 0.179593 }, 3.662747e+01, 2.621743e+01, 9.602781e-01 }, + { 1.013250e+05, 3.721500e+02, { 0.080408, 0.000000, 0.000000, 0.919592 }, 3.299996e+01, 1.881892e+01, 6.210236e-01 }, + { 5.000000e+06, 2.771500e+02, { 0.000000, 0.495216, 0.495235, 0.009549 }, 3.742134e+03, 1.272026e+02, 4.760091e+02 }, + { 5.000000e+06, 2.771500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.772799e+04, 1.801500e+01, 8.598197e+02 }, + { 5.000000e+06, 2.771500e+02, { 0.029212, 0.107914, 0.107918, 0.754956 }, 1.264269e+04, 4.210047e+01, 5.322630e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.000000, 0.493093, 0.493111, 0.013796 }, 3.739164e+03, 1.267344e+02, 4.738808e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.739475e+04, 1.801500e+01, 8.538165e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.999549, 0.000000, 0.000000, 0.000451 }, 2.122222e+03, 2.800849e+01, 5.944023e+01 }, + { 5.000000e+06, 2.981500e+02, { 0.000000, 0.490855, 0.490873, 0.018272 }, 3.739300e+03, 1.262410e+02, 4.720529e+02 }, + { 5.000000e+06, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.710908e+04, 1.801500e+01, 8.486701e+02 }, + { 5.000000e+06, 2.981500e+02, { 0.030096, 0.107834, 0.107839, 0.754231 }, 1.241638e+04, 4.209177e+01, 5.226274e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.031858, 0.107709, 0.107720, 0.752713 }, 1.198645e+04, 4.208259e+01, 5.044209e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.964491, 0.000264, 0.000000, 0.035245 }, 1.824920e+03, 2.768343e+01, 5.052004e+01 }, + { 5.000000e+06, 3.331500e+02, { 0.035989, 0.120533, 0.120574, 0.722904 }, 1.106526e+04, 4.495504e+01, 4.974394e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.961874, 0.000247, 0.000000, 0.037879 }, 1.826197e+03, 2.765560e+01, 5.050457e+01 }, + { 5.000000e+06, 3.721500e+02, { 0.037408, 0.121753, 0.121923, 0.718916 }, 1.046451e+04, 4.525417e+01, 4.735627e+02 }, + { 5.000000e+06, 3.721500e+02, { 0.889694, 0.001014, 0.000003, 0.109288 }, 1.643713e+03, 2.700817e+01, 4.439368e+01 }, + { 1.000000e+07, 2.771500e+02, { 0.000004, 0.000000, 0.000000, 0.999996 }, 4.775121e+04, 1.801504e+01, 8.602398e+02 }, + { 1.000000e+07, 2.771500e+02, { 0.999835, 0.000000, 0.000000, 0.000165 }, 4.468580e+03, 2.801135e+01, 1.251710e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.000000, 0.493260, 0.493279, 0.013460 }, 3.748279e+03, 1.267714e+02, 4.751745e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.742059e+04, 1.801500e+01, 8.542819e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.055934, 0.104932, 0.104936, 0.734198 }, 1.273695e+04, 4.171005e+01, 5.312588e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.000000, 0.491084, 0.491102, 0.017814 }, 3.748930e+03, 1.262914e+02, 4.734578e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.713720e+04, 1.801500e+01, 8.491766e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.056951, 0.104818, 0.104822, 0.733409 }, 1.263544e+04, 4.169517e+01, 5.268366e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.065451, 0.116299, 0.116311, 0.701940 }, 1.172878e+04, 4.431245e+01, 5.197309e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.991760, 0.000074, 0.000000, 0.008166 }, 4.103168e+03, 2.793775e+01, 1.146333e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.000000, 0.478424, 0.478442, 0.043135 }, 3.777896e+03, 1.235001e+02, 4.665706e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.600669e+04, 1.801500e+01, 8.288105e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.996818, 0.000000, 0.000000, 0.003182 }, 3.589847e+03, 2.798118e+01, 1.004482e+02 }, + { 1.000000e+07, 3.721500e+02, { 0.000000, 0.453197, 0.453215, 0.093588 }, 3.878777e+03, 1.179381e+02, 4.574555e+02 }, + { 1.000000e+08, 2.771500e+02, { 0.000000, 0.496608, 0.496627, 0.006766 }, 3.834889e+03, 1.275094e+02, 4.889844e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.310108e+04, 4.269497e+01, 5.593502e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.000031, 0.000000, 0.000000, 0.999969 }, 4.783830e+04, 1.801531e+01, 8.618217e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.999447, 0.000000, 0.000000, 0.000553 }, 2.330195e+04, 2.800748e+01, 6.526287e+02 }, + { 1.000000e+08, 2.981500e+02, { 0.000000, 0.493623, 0.493642, 0.012735 }, 3.840586e+03, 1.268513e+02, 4.871835e+02 }, + { 1.000000e+08, 3.331500e+02, { 0.010000, 0.000000, 0.000000, 0.990000 }, 4.638822e+04, 1.811498e+01, 8.403216e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.247160e+04, 4.269497e+01, 5.324747e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.000671, 0.000000, 0.000000, 0.999329 }, 4.538427e+04, 1.802171e+01, 8.179019e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.991955, 0.000000, 0.000000, 0.008045 }, 1.979639e+04, 2.793257e+01, 5.529641e+02 } }; } diff --git a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp index e453e225787..82309e58aec 100644 --- a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp +++ b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp @@ -53,9 +53,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -72,9 +72,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -91,9 +91,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -110,9 +110,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -149,9 +149,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -174,9 +174,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -199,9 +199,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -240,9 +240,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -265,9 +265,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -290,15 +290,14 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); checkRelativeError( logFugacityCoefficients[2], expectedLogFugacityCoefficients[2], relTol ); checkRelativeError( logFugacityCoefficients[3], expectedLogFugacityCoefficients[3], relTol ); - } // ----------------------------------------------------------------- @@ -352,6 +351,8 @@ class DerivativeTestFixture : public ::testing::TestWithParam< TestData< NC > > { public: static constexpr integer numComps = NC; + static constexpr integer numDof = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; using ParamType = std::tuple< real64 const, real64 const, Feed< NC > const >; public: DerivativeTestFixture(); @@ -384,23 +385,21 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > { public: using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; public: void testNumericalDerivatives( ParamType const & testData ) const { auto componentProperties = this->m_fluid->createKernelWrapper(); - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); - array1d< real64 > composition; + stackArray1d< real64, numComps > composition; real64 const pressure = std::get< 0 >( testData ); real64 const temperature = std::get< 1 >( testData ); TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); @@ -410,10 +409,10 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > real64 b = 0.0; CubicEOSPhaseModel< EOS >::computeMixtureCoefficients( numComps, - p, t, zmf, + p, t, zmf.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), a, b ); return {a, b}; @@ -427,29 +426,25 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; geos::testing::internal::testNumericalDerivative( - pressure, dp, daMixtureCoefficient_dp, + pressure, dp, aMixtureCoefficientDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCoefficients( p, temperature, composition ).first; } ); geos::testing::internal::testNumericalDerivative( - pressure, dp, dbMixtureCoefficient_dp, + pressure, dp, bMixtureCoefficientDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCoefficients( p, temperature, composition ).second; } ); @@ -457,12 +452,12 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; geos::testing::internal::testNumericalDerivative( - temperature, dT, daMixtureCoefficient_dt, + temperature, dT, aMixtureCoefficientDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCoefficients( pressure, t, composition ).first; } ); geos::testing::internal::testNumericalDerivative( - temperature, dT, dbMixtureCoefficient_dt, + temperature, dT, bMixtureCoefficientDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCoefficients( pressure, t, composition ).second; } ); @@ -478,12 +473,12 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > return coefficients; }; geos::testing::internal::testNumericalDerivative( - 0.0, dz, daMixtureCoefficient_dz[ic], + 0.0, dz, aMixtureCoefficientDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { return computeComponentCoefficients( z ).first; } ); geos::testing::internal::testNumericalDerivative( - 0.0, dz, dbMixtureCoefficient_dz[ic], + 0.0, dz, bMixtureCoefficientDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { return computeComponentCoefficients( z ).second; } ); @@ -543,6 +538,8 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, { public: using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; public: void testNumericalDerivatives( ParamType const & testData ) const @@ -550,22 +547,16 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); real64 aMixtureCoefficient = 0.0; real64 bMixtureCoefficient = 0.0; - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); - - real64 dCompressibilityFactor_dp = 0.0; - real64 dCompressibilityFactor_dt = 0.0; - array1d< real64 > dCompressibilityFactor_dz( numComps ); - - array1d< real64 > composition; + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); + + stackArray1d< real64, numDof > compressibilityFactorDerivs( numDof ); + + stackArray1d< real64, numComps > composition; real64 const pressure = std::get< 0 >( testData ); real64 const temperature = std::get< 1 >( testData ); TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); @@ -574,18 +565,18 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, real64 z = 0.0; CubicEOSPhaseModel< EOS >::computeMixtureCoefficients( numComps, - p, t, zmf, + p, t, zmf.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient ); CubicEOSPhaseModel< EOS >::computeCompressibilityFactor( numComps, - zmf, + zmf.toSliceConst(), binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, z ); @@ -600,38 +591,28 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); CubicEOSPhaseModel< EOS >::computeCompressibilityFactor( numComps, aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz ); + aMixtureCoefficientDerivs.toSliceConst(), + bMixtureCoefficientDerivs.toSliceConst(), + compressibilityFactorDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; geos::testing::internal::testNumericalDerivative( - pressure, dp, dCompressibilityFactor_dp, + pressure, dp, compressibilityFactorDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCompressibilityFactor( p, temperature, composition ); } ); @@ -639,7 +620,7 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; geos::testing::internal::testNumericalDerivative( - temperature, dT, dCompressibilityFactor_dt, + temperature, dT, compressibilityFactorDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCompressibilityFactor( pressure, t, composition ); } ); @@ -649,7 +630,7 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, for( integer ic = 0; ic < numComps; ++ic ) { geos::testing::internal::testNumericalDerivative( - 0.0, dz, dCompressibilityFactor_dz[ic], + 0.0, dz, compressibilityFactorDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { composition[ic] += z; real64 const compressibility = computeCompressibilityFactor( pressure, temperature, composition ); @@ -705,3 +686,140 @@ INSTANTIATE_TEST_SUITE_P( CompressibilityDerivativeSRK4TestFixture, ::testing::ValuesIn( generateTestData< 4 >()) ); + +template< typename EOS, int NC > +class FugacityDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > +{ +public: + using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; + using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; +public: + void testNumericalDerivatives( ParamType const & testData ) const + { + auto const componentProperties = this->m_fluid->createKernelWrapper(); + + stackArray1d< real64, numComps > logFugacityCoefficients( numComps ); + stackArray2d< real64, numComps *numDof > logFugacityCoefficientDerivs( numComps, numDof ); + + stackArray1d< real64, numComps > composition; + real64 const pressure = std::get< 0 >( testData ); + real64 const temperature = std::get< 1 >( testData ); + TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); + + auto const calculateLogFugacityCoefficients = [&]( integer const ic, real64 const p, real64 const t, auto const & zmf ) -> real64 { + stackArray1d< real64, numComps > displacedLogFugacityCoefficients( numComps ); + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + displacedLogFugacityCoefficients.toSlice() ); + return displacedLogFugacityCoefficients[ic]; + }; + + // Calculate values + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + logFugacityCoefficients.toSlice() ); + + // Calculate derivatives + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + logFugacityCoefficients.toSliceConst(), + logFugacityCoefficientDerivs.toSlice() ); + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + for( integer ic = 0; ic < numComps; ++ic ) + { + geos::testing::internal::testNumericalDerivative( + pressure, dp, logFugacityCoefficientDerivs( ic, Deriv::dP ), + [&]( real64 const p ) -> real64 { + return calculateLogFugacityCoefficients( ic, p, temperature, composition ); + } ); + } + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + for( integer ic = 0; ic < numComps; ++ic ) + { + geos::testing::internal::testNumericalDerivative( + temperature, dT, logFugacityCoefficientDerivs( ic, Deriv::dT ), + [&]( real64 const t ) -> real64 { + return calculateLogFugacityCoefficients( ic, pressure, t, composition ); + } ); + } + + // -- Composition derivatives + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < numComps; ++ic ) + { + for( integer jc = 0; jc < numComps; ++jc ) + { + geos::testing::internal::testNumericalDerivative( + 0.0, dz, logFugacityCoefficientDerivs( ic, Deriv::dC + jc ), + [&]( real64 const z ) -> real64 { + composition[jc] += z; + real64 const logFugacityCoefficient = calculateLogFugacityCoefficients( ic, pressure, temperature, composition ); + composition[jc] -= z; + return logFugacityCoefficient; + }, 1.0e-6 ); + } + } + } +}; + +using FugacityDerivativePR2TestFixture = FugacityDerivativeTestFixture< PengRobinsonEOS, 2 >; +using FugacityDerivativePR4TestFixture = FugacityDerivativeTestFixture< PengRobinsonEOS, 4 >; +using FugacityDerivativeSRK2TestFixture = FugacityDerivativeTestFixture< SoaveRedlichKwongEOS, 2 >; +using FugacityDerivativeSRK4TestFixture = FugacityDerivativeTestFixture< SoaveRedlichKwongEOS, 4 >; + +TEST_P( FugacityDerivativePR2TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativePR4TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativeSRK2TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativeSRK4TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} + +// 2-component fluid test +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativePR2TestFixture, + ::testing::ValuesIn( generateTestData< 2 >()) + ); +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativeSRK2TestFixture, + ::testing::ValuesIn( generateTestData< 2 >()) + ); + +// 4-component fluid test +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativePR4TestFixture, + ::testing::ValuesIn( generateTestData< 4 >()) + ); +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativeSRK4TestFixture, + ::testing::ValuesIn( generateTestData< 4 >()) + ); diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index de5548fd714..5e044d04ea2 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -56,13 +56,13 @@ class WilsonKValueInitializationTestFixture : integer const compIndex = std::get< 2 >( GetParam() ); real64 const expectedKValue = std::get< 3 >( GetParam() ); - array1d< real64 > kValues( numComps ); + stackArray1d< real64, NC > kValues( numComps ); KValueInitialization::computeWilsonGasLiquidKvalue( numComps, pressure, temperature, createKernelWrapper(), - kValues ); + kValues.toSlice() ); ASSERT_EQ( kValues.size(), NC ); checkRelativeError( expectedKValue, kValues[compIndex], relTol ); @@ -83,7 +83,6 @@ class WilsonKValueInitializationTestFixture : discarded, criticalPressure, criticalTemperature, - discarded, acentricFactor, discarded, discarded2d ); diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp new file mode 100644 index 00000000000..e90725c0274 --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -0,0 +1,282 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +template< int NC > +using ViscosityData = std::tuple< + integer const, // Mixing type + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const // expected viscosity + >; + +template< int NC > +struct FluidData {}; + +template<> +struct FluidData< 9 > +{ + static std::unique_ptr< TestFluid< 9 > > createFluid() + { + auto fluid = TestFluid< 9 >::create( {Fluid::H2O, Fluid::CO2, Fluid::N2, Fluid::C5, Fluid::C2, Fluid::C3, Fluid::C4, Fluid::C5, Fluid::C10} ); + const std::array< real64 const, 36 > bics = { + 0.01, 0, 0.003732, 0, 0.01, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.01, 0, 0.028, 0.01, 0.01, 0, 0, 0.01, 0, 0.04532, 0.01, 0.01, 0, 0, 0 + }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< int NC > +class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< ViscosityData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + LohrenzBrayClarkViscosityTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + m_parameters = LohrenzBrayClarkViscosity::createParameters( nullptr ); + auto * parameters = const_cast< LohrenzBrayClarkViscosity::Parameters * >(m_parameters->get< LohrenzBrayClarkViscosity::Parameters >()); + parameters->m_componentCriticalVolume.resize( NC ); + TestFluid< 9 >::populateArray( parameters->m_componentCriticalVolume, this->m_fluid->criticalVolume ); + m_density = std::make_unique< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > >( "PhaseDensity", componentProperties, 0, *m_parameters ); + m_viscosity = std::make_unique< LohrenzBrayClarkViscosity >( "PhaseViscosity", componentProperties, 0, *m_parameters ); + } + + ~LohrenzBrayClarkViscosityTestFixture() = default; + + void testViscosity( ViscosityData< NC > const & data ) + { + auto const mixing_type = static_cast< LohrenzBrayClarkViscosityUpdate::MixingType >(std::get< 0 >( data )); + real64 const pressure = std::get< 1 >( data ); + real64 const temperature = std::get< 2 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 3 >( data )); + real64 const expectedViscosity = std::get< 4 >( data ); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + viscosityKernelWrapper.setMixingType( mixing_type ); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + tempDerivs.toSlice(), + massDensity, + tempDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + tempDerivs.toSliceConst(), + viscosity, + tempDerivs.toSlice(), + false ); + + checkRelativeError( viscosity, expectedViscosity, relTol, absTol ); + } + + void testViscosityDerivatives( ViscosityData< NC > const & data ) + { + auto const mixing_type = static_cast< LohrenzBrayClarkViscosityUpdate::MixingType >(std::get< 0 >( data )); + real64 const pressure = std::get< 1 >( data ); + real64 const temperature = std::get< 2 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 3 >( data )); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + viscosityKernelWrapper.setMixingType( mixing_type ); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > molarDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > massDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > viscosityDerivs( numDofs ); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + molarDensityDerivs.toSlice(), + massDensity, + massDensityDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + massDensityDerivs.toSliceConst(), + viscosity, + viscosityDerivs.toSlice(), + false ); + + auto calculateViscosity = [&]( real64 const p, real64 const t, auto const & zmf ) -> real64 { + real64 densityMolar = 0.0; + real64 densityMass = 0.0; + real64 phaseViscosity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + densityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + densityMolar, tempDerivs.toSlice(), densityMass, tempDerivs.toSlice(), false ); + viscosityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + densityMass, tempDerivs.toSliceConst(), phaseViscosity, tempDerivs.toSlice(), false ); + return phaseViscosity; + }; + + // Viscosity values are very small so we will inflate the values to avoid false positives due + // to the absolute value check + real64 constexpr scale = 1.0e6; + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + internal::testNumericalDerivative( + pressure, dp, scale*viscosityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return scale*calculateViscosity( p, temperature, phaseComposition ); + } ); + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + internal::testNumericalDerivative( + temperature, dT, scale*viscosityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return scale*calculateViscosity( pressure, t, phaseComposition ); + } ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < 1; ++ic ) + { + internal::testNumericalDerivative( + 0.0, dz, scale*viscosityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return scale*calculateViscosity( pressure, temperature, zmf ); + } ); + } + } + +protected: + std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > > m_density{}; + std::unique_ptr< LohrenzBrayClarkViscosity > m_viscosity{}; + std::unique_ptr< ModelParameters > m_parameters{}; +}; + +using LohrenzBrayClarkViscosity9 = LohrenzBrayClarkViscosityTestFixture< 9 >; + +TEST_P( LohrenzBrayClarkViscosity9, testViscosity ) +{ + testViscosity( GetParam() ); +} + +TEST_P( LohrenzBrayClarkViscosity9, testViscosityDerivatives ) +{ + testViscosityDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data generated by PVTPackage +//------------------------------------------------------------------------------- +INSTANTIATE_TEST_SUITE_P( + LohrenzBrayClarkViscosity, + LohrenzBrayClarkViscosity9, + ::testing::ValuesIn( { + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.041140e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.001152e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.064158e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.761220e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.659626e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.844604e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.062011e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.021978e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.085108e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.681288e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.230528e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.959149e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.033595e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.923634e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.133312e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.681118e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.229779e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.959939e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.123583e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.083595e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.146601e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.451048e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.440889e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.459387e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.170310e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.130277e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.193407e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.720985e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.675909e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.748771e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.078437e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.067441e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.088409e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.763030e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.717896e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.790912e-04 } + } ) + ); + +} // testing + +} // geos diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index bfc074c578d..6dfc1929eb1 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -17,6 +17,7 @@ #include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" #include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" using namespace geos::constitutive::compositional; @@ -64,6 +65,8 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash static constexpr real64 relTol = 1.0e-5; static constexpr real64 absTol = 1.0e-7; static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: NegativeTwoPhaseFlashTestFixture() : m_fluid( FluidData< NC >::createFluid() ) @@ -77,30 +80,33 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash real64 const pressure = std::get< 0 >( data ); real64 const temperature = std::get< 1 >( data ); - array1d< real64 > composition; + stackArray1d< real64, numComps > composition; TestFluid< NC >::createArray( composition, std::get< 2 >( data )); bool const expectedStatus = std::get< 3 >( data ); real64 const expectedVapourFraction = std::get< 4 >( data ); - stackArray1d< real64, NC > expectedLiquidComposition; + stackArray1d< real64, numComps > expectedLiquidComposition; TestFluid< NC >::createArray( expectedLiquidComposition, std::get< 5 >( data )); - stackArray1d< real64, NC > expectedVapourComposition; + stackArray1d< real64, numComps > expectedVapourComposition; TestFluid< NC >::createArray( expectedVapourComposition, std::get< 6 >( data )); real64 vapourFraction = -1.0; - array1d< real64 > liquidComposition( numComps ); - array1d< real64 > vapourComposition( numComps ); + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, + kValues.toSlice(), vapourFraction, - liquidComposition, - vapourComposition ); + liquidComposition.toSlice(), + vapourComposition.toSlice() ); // Check the flash success result ASSERT_EQ( expectedStatus, status ); @@ -132,6 +138,126 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash } } + void testFlashDerivatives( FlashData< NC > const & data ) + { + // Number of output values from each flash calculation + constexpr integer numValues = 1 + 2*numComps; + + auto componentProperties = this->m_fluid->createKernelWrapper(); + + bool const expectedStatus = std::get< 3 >( data ); + if( !expectedStatus ) return; + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< NC >::createArray( composition, std::get< 2 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + stackArray1d< real64, numDofs > vapourFractionDerivs( numDofs ); + stackArray2d< real64, numComps * numDofs > liquidCompositionDerivs( numComps, numDofs ); + stackArray2d< real64, numComps * numDofs > vapourCompositionDerivs( numComps, numDofs ); + stackArray1d< real64, numValues > derivatives( numValues ); + + // Combine values and derivatives into a single output + auto const concatDerivatives = []( integer const kc, auto & derivs, auto const & v, auto const & xmf, auto const & ymf ){ + derivs[0] = v[kc]; + for( integer ic = 0; ic < numComps; ++ic ) + { + derivs[1+ic] = xmf( ic, kc ); + derivs[1+ic+numComps] = ymf( ic, kc ); + } + }; + std::cout << std::scientific << std::setprecision( 8 ); + + auto const evaluateFlash = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ){ + stackArray1d< real64, numComps > displacedLiquidComposition( numComps ); + stackArray1d< real64, numComps > displacedVapourComposition( numComps ); + kValues.zero(); + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + kValues.toSlice(), + values[0], + displacedLiquidComposition.toSlice(), + displacedVapourComposition.toSlice() ); + for( integer ic = 0; ic < numComps; ++ic ) + { + values[1+ic] = displacedLiquidComposition[ic]; + values[1+ic+numComps] = displacedVapourComposition[ic]; + } + }; + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + vapourFraction, + liquidComposition.toSliceConst(), + vapourComposition.toSliceConst(), + vapourFractionDerivs.toSlice(), + liquidCompositionDerivs.toSlice(), + vapourCompositionDerivs.toSlice() ); + + // Test against numerically calculated values + // --- Pressure derivatives --- + concatDerivatives( Deriv::dP, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dp = 1.0e-4 * pressure; + geos::testing::internal::testNumericalDerivative< numValues >( + pressure, dp, derivatives, + [&]( real64 const p, auto & values ) { + evaluateFlash( p, temperature, composition, values ); + } ); + + // --- Temperature derivatives --- + concatDerivatives( Deriv::dT, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dT = 1.0e-6 * temperature; + geos::testing::internal::testNumericalDerivative< numValues >( + temperature, dT, derivatives, + [&]( real64 const t, auto & values ) { + evaluateFlash( pressure, t, composition, values ); + } ); + + // --- Composition derivatives --- + real64 constexpr dz = 1.0e-7; + for( integer jc = 0; jc < numComps; ++jc ) + { + if( composition[jc] < 1.0e-6 ) continue; + integer const kc = Deriv::dC + jc; + concatDerivatives( kc, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + geos::testing::internal::testNumericalDerivative< numValues >( + 0.0, dz, derivatives, + [&]( real64 const z, auto & values ) { + real64 const originalFraction = composition[jc]; + composition[jc] += z; + evaluateFlash( pressure, temperature, composition, values ); + composition[jc] = originalFraction; + }, relTol, absTol ); + } + } + protected: std::unique_ptr< TestFluid< NC > > m_fluid{}; }; @@ -161,6 +287,26 @@ TEST_P( NegativeTwoPhaseFlash4CompSRK, testNegativeFlash ) testFlash( GetParam() ); } +TEST_P( NegativeTwoPhaseFlash2CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash2CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash4CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash4CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + //------------------------------------------------------------------------------- // Data generated by PVTPackage //------------------------------------------------------------------------------- @@ -210,10 +356,10 @@ INSTANTIATE_TEST_SUITE_P( FlashData< 2 >( 1.013250e+05, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.44681454, { 0.90248098, 0.09751902 }, { 0.00170237, 0.99829763 } ), FlashData< 2 >( 1.013250e+05, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00275426, { 0.90248098, 0.09751902 }, { 0.00170237, 0.99829763 } ), FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.10000000, 0.90000000 }, true, 0.00000000, { 0.10000000, 0.90000000 }, { 0.10000000, 0.90000000 } ), - FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, false, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49950202, 0.50049798 } ), + FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49950202, 0.50049798 } ), FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.75000000, 0.25000000 }, true, 0.00000000, { 0.75000000, 0.25000000 }, { 0.74999999, 0.25000001 } ), - FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, false, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49979984, 0.50020016 } ), + FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49979984, 0.50020016 } ), FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 1.000000e+08, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 1.000000e+05, 1.931500e+02, { 0.10000000, 0.90000000 }, true, 1.00000000, { 0.10000000, 0.90000000 }, { 0.10000000, 0.90000000 } ), @@ -316,13 +462,13 @@ INSTANTIATE_TEST_SUITE_P( { 0.59975210, 0.00000000, 0.00078842, 0.39945949 } ), FlashData< 4 >( 1.000000e+07, 4.731500e+02, { 0.01000000, 0.00000000, 0.00000000, 0.99000000 }, true, 0.01121076, { 0.00102378, 0.00000000, 0.00000000, 0.99897622 }, { 0.80170284, 0.00000000, 0.00000000, 0.19829716 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, false, 0.00000000, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, true, 0.00000000, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, { 0.72438623, 0.02564505, 0.01665696, 0.23331176 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, false, 0.00000000, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, true, 0.00000000, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, { 0.73612750, 0.02738195, 0.01777184, 0.21871871 } ), FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.00000000, 0.10481800, 0.10482200, 0.79036000 }, true, 0.72801768, { 0.00000000, 0.38538472, 0.38540005, 0.22921523 }, { 0.00000000, 0.00000023, 0.00000000, 0.99999977 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, false, 0.00000000, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, true, 0.00000000, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, { 0.74504275, 0.00000000, 0.01613702, 0.23882023 } ) ) ); diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp new file mode 100644 index 00000000000..9e214b56e5b --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -0,0 +1,540 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +static constexpr integer numComps = 9; + +using FlashData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< numComps > const, // total composition + int, // expected flash status (success (1)/failure (0)) + real64 const, // expected vapour fraction + Feed< 2 > const, // expected liquid composition (2 selected components) + Feed< 2 > const // expected vapour composition (2 selected components) + >; + +template< typename EOS_TYPE > +class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< FlashData > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numDofs = numComps + 2; + // Selected components for test + static constexpr int comp0 = 0; + static constexpr int comp1 = numComps-1; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + NegativeTwoPhaseFlashTest9CompFixture() + : m_fluid( createFluid() ) + {} + + ~NegativeTwoPhaseFlashTest9CompFixture() = default; + + void testFlash( FlashData const & data ) + { + auto componentProperties = this->m_fluid->createKernelWrapper(); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + bool const expectedStatus = std::get< 3 >( data ); + real64 const expectedVapourFraction = std::get< 4 >( data ); + + stackArray1d< real64, numComps > expectedLiquidComposition; + stackArray1d< real64, numComps > expectedVapourComposition; + TestFluid< numComps >::createArray( expectedLiquidComposition, std::get< 5 >( data )); + TestFluid< numComps >::createArray( expectedVapourComposition, std::get< 6 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + // Check the flash success result + ASSERT_EQ( expectedStatus, status ); + + if( !expectedStatus ) + { + return; + } + + // Check the vaopur fraction + checkRelativeError( expectedVapourFraction, vapourFraction, relTol, absTol ); + + // Check liquid composition + if( expectedVapourFraction < 1.0 - absTol ) + { + checkRelativeError( expectedLiquidComposition[0], liquidComposition[comp0], relTol, absTol ); + checkRelativeError( expectedLiquidComposition[1], liquidComposition[comp1], relTol, absTol ); + } + + // Check vapour composition + if( absTol < expectedVapourFraction ) + { + checkRelativeError( expectedVapourComposition[0], vapourComposition[comp0], relTol, absTol ); + checkRelativeError( expectedVapourComposition[1], vapourComposition[comp1], relTol, absTol ); + } + } + + void testFlashDerivatives( FlashData const & data ) + { + // Number of output values from each flash calculation + constexpr integer numValues = 1 + 2*numComps; + + auto componentProperties = this->m_fluid->createKernelWrapper(); + + bool const expectedStatus = std::get< 3 >( data ); + if( !expectedStatus ) return; + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + stackArray1d< real64, numDofs > vapourFractionDerivs( numDofs ); + stackArray2d< real64, numComps * numDofs > liquidCompositionDerivs( numComps, numDofs ); + stackArray2d< real64, numComps * numDofs > vapourCompositionDerivs( numComps, numDofs ); + stackArray1d< real64, numValues > derivatives( numValues ); + + // Combine values and derivatives into a single output + auto const concatDerivatives = []( integer const kc, auto & derivs, auto const & v, auto const & xmf, auto const & ymf ){ + derivs[0] = v[kc]; + for( integer ic = 0; ic < numComps; ++ic ) + { + derivs[1+ic] = xmf( ic, kc ); + derivs[1+ic+numComps] = ymf( ic, kc ); + } + }; + + auto const evaluateFlash = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ){ + stackArray1d< real64, numComps > displacedLiquidComposition( numComps ); + stackArray1d< real64, numComps > displacedVapourComposition( numComps ); + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + kValues.toSlice(), + values[0], + displacedLiquidComposition.toSlice(), + displacedVapourComposition.toSlice() ); + for( integer ic = 0; ic < numComps; ++ic ) + { + values[1+ic] = displacedLiquidComposition[ic]; + values[1+ic+numComps] = displacedVapourComposition[ic]; + } + }; + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + vapourFraction, + liquidComposition.toSliceConst(), + vapourComposition.toSliceConst(), + vapourFractionDerivs.toSlice(), + liquidCompositionDerivs.toSlice(), + vapourCompositionDerivs.toSlice() ); + + // Test against numerically calculated values + // --- Pressure derivatives --- + concatDerivatives( Deriv::dP, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dp = 1.0e-4 * pressure; + geos::testing::internal::testNumericalDerivative< numValues >( + pressure, dp, derivatives, + [&]( real64 const p, auto & values ) { + evaluateFlash( p, temperature, composition, values ); + } ); + + // --- Temperature derivatives --- + concatDerivatives( Deriv::dT, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dT = 1.0e-6 * temperature; + geos::testing::internal::testNumericalDerivative< numValues >( + temperature, dT, derivatives, + [&]( real64 const t, auto & values ) { + evaluateFlash( pressure, t, composition, values ); + } ); + + // --- Composition derivatives --- + real64 constexpr dz = 1.0e-7; + for( integer jc = 0; jc < numComps; ++jc ) + { + if( composition[jc] < 1.0e-6 ) continue; + integer const kc = Deriv::dC + jc; + concatDerivatives( kc, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + geos::testing::internal::testNumericalDerivative< numValues >( + 0.0, dz, derivatives, + [&]( real64 const z, auto & values ) { + real64 const originalFraction = composition[jc]; + composition[jc] += z; + evaluateFlash( pressure, temperature, composition, values ); + composition[jc] = originalFraction; + }, 10*relTol, 10*absTol ); + } + } + +protected: + std::unique_ptr< TestFluid< numComps > > m_fluid{}; +private: + static std::unique_ptr< TestFluid< numComps > > createFluid(); +}; + +template< typename EOS_TYPE > +std::unique_ptr< TestFluid< numComps > > NegativeTwoPhaseFlashTest9CompFixture< EOS_TYPE >::createFluid() +{ + std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {0, 0, 0, 0, 0, 0, 0, 0, 0} ); + // Manually populate + TestFluid< numComps >::populateArray( fluid->criticalPressure, Feed< 9 >{73.8659e5, 33.9439e5, 46.0421e5, 48.8387e5, 42.4552e5, 37.47e5, 33.5892e5, 30.1037e5, 20.549e5} ); + TestFluid< numComps >::populateArray( fluid->criticalTemperature, Feed< 9 >{304.7, 126.2, 190.6, 305.43, 369.8, 419.5, 465.9, 507.5, 678.8} ); + TestFluid< numComps >::populateArray( fluid->criticalVolume, Feed< 9 >{9.3999e-05, 9.0001e-05, 9.7999e-05, 1.4800e-04, 2.0000e-04, 2.5800e-04, 3.1000e-04, 3.5100e-04, 6.8243e-04} ); + TestFluid< numComps >::populateArray( fluid->acentricFactor, Feed< 9 >{0.225, 0.04, 0.013, 0.0986, 0.1524, 0.1956, 0.2413, 0.299, 0.5618} ); + TestFluid< numComps >::populateArray( fluid->molecularWeight, Feed< 9 >{44.01e-3, 28.01e-3, 16.04e-3, 30.07e-3, 44.1e-3, 58.12e-3, 72.15e-3, 84e-3, 173e-3} ); + TestFluid< numComps >::populateArray( fluid->volumeShift, Feed< 9 >{ -0.04958, -0.136012, -0.1486264, -0.10863408, -0.08349872, -0.06331568, -0.04196464, -0.0150072, 0.0000 } ); + fluid->setBinaryCoefficients( Feed< 36 >{ + 1.0000e-02, + 0.0000e+00, 3.7320e-03, + 0.0000e+00, 1.0000e-02, 0.0000e+00, + 0.0000e+00, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 2.8000e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 4.5320e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, 0.0000e+00 + } ); + return fluid; +} + +using NegativeTwoPhaseFlash9CompPR = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; +using NegativeTwoPhaseFlash9CompSRK = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; + +TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlash ) +{ + testFlash( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlash ) +{ + testFlash( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + NegativeTwoPhaseFlash, + NegativeTwoPhaseFlash9CompPR, + ::testing::Values( + FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798353, {0.000363, 0.839010}, {0.011181, 0.000020} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998685, {0.000228, 0.938644}, {0.007035, 0.000022} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798070, {0.000368, 0.837836}, {0.011184, 0.000020} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998684, {0.000231, 0.937856}, {0.007035, 0.000022} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.700780, {0.003486, 0.565464}, {0.011355, 0.000003} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997643, {0.002159, 0.531971}, {0.007037, 0.000002} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.349114, {0.010010, 0.259905}, {0.007116, 0.000090} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.991703, {0.009755, 0.140969}, {0.007003, 0.000087} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.176058, {0.009422, 0.205086}, {0.007026, 0.001256} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.009422, 0.205089}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001168, {0.000348, 0.839991}, {0.013059, 0.000053} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805671, {0.000295, 0.870461}, {0.011100, 0.000055} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998750, {0.000187, 0.957531}, {0.007035, 0.000059} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001057, {0.000350, 0.839898}, {0.012947, 0.000052} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805431, {0.000299, 0.869390}, {0.011102, 0.000054} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998749, {0.000189, 0.956982}, {0.007035, 0.000058} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.719045, {0.002880, 0.602213}, {0.011391, 0.000007} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998097, {0.001770, 0.656139}, {0.007036, 0.000007} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.391974, {0.009806, 0.278198}, {0.007750, 0.000123} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.994318, {0.008887, 0.201207}, {0.007015, 0.000113} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.231493, {0.009474, 0.219807}, {0.007427, 0.001195} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999406, {0.009004, 0.228228}, {0.007025, 0.001121} ), + FlashData( 5.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002535, {0.000327, 0.841142}, {0.014448, 0.000119} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.811028, {0.000249, 0.894832}, {0.011039, 0.000125} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998841, {0.000158, 0.968326}, {0.007034, 0.000134} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002401, {0.000329, 0.841029}, {0.014353, 0.000118} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810823, {0.000253, 0.893869}, {0.011041, 0.000124} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998839, {0.000161, 0.967914}, {0.007034, 0.000132} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.733594, {0.002451, 0.635078}, {0.011378, 0.000016} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998313, {0.001505, 0.734457}, {0.007035, 0.000017} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.426139, {0.009539, 0.294719}, {0.008274, 0.000169} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.995698, {0.008127, 0.256601}, {0.007021, 0.000153} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.275063, {0.009454, 0.232929}, {0.007803, 0.001242} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999403, {0.008577, 0.252667}, {0.007025, 0.001106} ), + FlashData( 5.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009514, {0.000227, 0.847062}, {0.014475, 0.000776} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820830, {0.000171, 0.940506}, {0.010927, 0.000840} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999605, {0.000110, 0.982954}, {0.007029, 0.000869} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009213, {0.000231, 0.846804}, {0.014528, 0.000766} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820694, {0.000173, 0.939845}, {0.010929, 0.000829} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999594, {0.000111, 0.982731}, {0.007029, 0.000858} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.763803, {0.001692, 0.716010}, {0.011260, 0.000105} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998655, {0.001048, 0.848573}, {0.007034, 0.000115} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.500392, {0.008630, 0.338259}, {0.009369, 0.000406} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997667, {0.006476, 0.384497}, {0.007027, 0.000360} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.367748, {0.009160, 0.266615}, {0.008725, 0.001720} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031155, {0.000097, 0.865831}, {0.008647, 0.004929} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829852, {0.000120, 0.968392}, {0.010821, 0.005338} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.030488, {0.000099, 0.865241}, {0.008755, 0.004866} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829724, {0.000121, 0.968002}, {0.010822, 0.005269} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.787992, {0.001191, 0.795638}, {0.011101, 0.000658} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999382, {0.000748, 0.906103}, {0.007030, 0.000696} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.567463, {0.007479, 0.389712}, {0.010159, 0.001120} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999429, {0.005131, 0.493383}, {0.007027, 0.000975} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.449715, {0.008545, 0.304966}, {0.009556, 0.003072} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.053370, {0.000054, 0.885524}, {0.005836, 0.013991} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.839835, {0.000099, 0.977972}, {0.010698, 0.014959} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.052543, {0.000056, 0.884773}, {0.005903, 0.013808} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.839621, {0.000100, 0.977689}, {0.010700, 0.014767} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.799362, {0.000988, 0.836026}, {0.011011, 0.001828} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.602229, {0.006805, 0.422215}, {0.010450, 0.002084} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.492074, {0.008098, 0.328602}, {0.009931, 0.004663} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.078426, {0.000034, 0.907428}, {0.004230, 0.035040} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.860286, {0.000083, 0.983960}, {0.010448, 0.036880} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.077531, {0.000035, 0.906620}, {0.004269, 0.034580} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.859825, {0.000084, 0.983745}, {0.010454, 0.036407} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.808966, {0.000846, 0.866838}, {0.010926, 0.004456} ), + FlashData( 1.000000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.630979, {0.006236, 0.452193}, {0.010617, 0.003695} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.527277, {0.007678, 0.350047}, {0.010185, 0.007065} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.013250e+05, 5.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.013401, {0.000295, 0.847670}, {0.005333, 0.201455} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.783614, {0.004654, 0.554668}, {0.010200, 0.062757} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.717160, {0.006496, 0.400841}, {0.009988, 0.077843} ), + FlashData( 1.013250e+05, 5.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.166124, {0.000103, 0.906268}, {0.001666, 0.501402} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.947056, {0.004797, 0.541766}, {0.009235, 0.148372} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ) + ) + ); + +INSTANTIATE_TEST_SUITE_P( + NegativeTwoPhaseFlash, + NegativeTwoPhaseFlash9CompSRK, + ::testing::Values( + FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000197, {0.000361, 0.839175}, {0.010852, 0.000016} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798097, {0.000372, 0.837963}, {0.011183, 0.000016} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998678, {0.000233, 0.937435}, {0.007035, 0.000017} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000102, {0.000362, 0.839096}, {0.010741, 0.000015} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.797815, {0.000377, 0.836797}, {0.011185, 0.000015} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998677, {0.000236, 0.936631}, {0.007035, 0.000017} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.701296, {0.003551, 0.566442}, {0.011321, 0.000002} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997601, {0.002208, 0.522879}, {0.007038, 0.000002} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.355337, {0.010126, 0.262428}, {0.006957, 0.000064} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.990607, {0.010007, 0.127315}, {0.006998, 0.000061} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.189968, {0.009500, 0.208646}, {0.006869, 0.001001} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998881, {0.009683, 0.203759}, {0.007023, 0.001029} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001347, {0.000346, 0.840142}, {0.012715, 0.000042} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805502, {0.000302, 0.869750}, {0.011100, 0.000044} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998737, {0.000191, 0.957109}, {0.007035, 0.000047} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001238, {0.000348, 0.840050}, {0.012604, 0.000042} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805263, {0.000306, 0.868685}, {0.011102, 0.000043} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998736, {0.000193, 0.956554}, {0.007035, 0.000047} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.719517, {0.002933, 0.603231}, {0.011365, 0.000006} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998081, {0.001810, 0.651470}, {0.007036, 0.000006} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.396003, {0.009922, 0.280076}, {0.007594, 0.000088} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.993728, {0.009141, 0.187545}, {0.007013, 0.000080} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.240606, {0.009550, 0.222512}, {0.007264, 0.000938} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998414, {0.009259, 0.224729}, {0.007022, 0.000901} ), + FlashData( 5.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002711, {0.000326, 0.841291}, {0.014087, 0.000098} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810920, {0.000255, 0.894421}, {0.011039, 0.000103} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998816, {0.000162, 0.968232}, {0.007034, 0.000110} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002578, {0.000328, 0.841178}, {0.013993, 0.000096} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810716, {0.000258, 0.893460}, {0.011041, 0.000101} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998814, {0.000164, 0.967820}, {0.007034, 0.000108} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.734036, {0.002496, 0.636140}, {0.011357, 0.000013} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998304, {0.001539, 0.732405}, {0.007035, 0.000014} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.428647, {0.009656, 0.296047}, {0.008126, 0.000123} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.995306, {0.008367, 0.244161}, {0.007020, 0.000110} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.280995, {0.009532, 0.234947}, {0.007638, 0.000967} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998466, {0.008825, 0.247830}, {0.007023, 0.000877} ), + FlashData( 5.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009799, {0.000227, 0.847306}, {0.014141, 0.000671} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820760, {0.000174, 0.940659}, {0.010927, 0.000727} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999486, {0.000112, 0.983094}, {0.007030, 0.000751} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009494, {0.000230, 0.847045}, {0.014191, 0.000663} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820626, {0.000176, 0.940001}, {0.010929, 0.000717} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999476, {0.000113, 0.982873}, {0.007030, 0.000741} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.764168, {0.001724, 0.717170}, {0.011245, 0.000089} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998636, {0.001071, 0.849075}, {0.007034, 0.000098} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.500247, {0.008751, 0.338258}, {0.009248, 0.000309} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997385, {0.006666, 0.376212}, {0.007027, 0.000273} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.368341, {0.009249, 0.267083}, {0.008574, 0.001342} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999515, {0.007646, 0.315975}, {0.007026, 0.001103} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031804, {0.000097, 0.866423}, {0.008470, 0.004481} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829483, {0.000122, 0.968691}, {0.010825, 0.004849} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031134, {0.000099, 0.865829}, {0.008574, 0.004423} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829361, {0.000124, 0.968304}, {0.010826, 0.004786} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.788230, {0.001216, 0.796793}, {0.011091, 0.000588} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999299, {0.000766, 0.906819}, {0.007030, 0.000621} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.565606, {0.007602, 0.388344}, {0.010074, 0.000894} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999017, {0.005276, 0.488289}, {0.007028, 0.000777} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.446859, {0.008647, 0.303916}, {0.009437, 0.002442} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.054177, {0.000055, 0.886321}, {0.005743, 0.013044} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.838983, {0.000101, 0.978218}, {0.010708, 0.013933} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.053352, {0.000056, 0.885570}, {0.005808, 0.012873} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.838780, {0.000102, 0.977938}, {0.010710, 0.013754} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.799463, {0.001011, 0.837056}, {0.011004, 0.001676} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.599654, {0.006926, 0.420077}, {0.010385, 0.001707} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.487747, {0.008205, 0.326722}, {0.009835, 0.003763} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.079189, {0.000034, 0.908297}, {0.004184, 0.033343} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.858658, {0.000085, 0.984127}, {0.010467, 0.035057} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.078302, {0.000035, 0.907492}, {0.004221, 0.032904} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.858220, {0.000086, 0.983915}, {0.010473, 0.034607} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.808878, {0.000868, 0.867643}, {0.010922, 0.004171} ), + FlashData( 1.000000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.627809, {0.006355, 0.449384}, {0.010568, 0.003096} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.521757, {0.007786, 0.347485}, {0.010113, 0.005784} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.013083, {0.000299, 0.847460}, {0.005181, 0.201586} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.771605, {0.004757, 0.549320}, {0.010256, 0.056684} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.692342, {0.006548, 0.399534}, {0.010089, 0.066846} ), + FlashData( 1.000000e+06, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.168528, {0.000106, 0.906625}, {0.001631, 0.505413} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.914262, {0.004869, 0.538035}, {0.009387, 0.134611} ), + FlashData( 1.500000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.986509, {0.007097, 0.343039}, {0.009026, 0.166823} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ) + ) + ); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 5be399e8449..3958a2313c8 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -644,9 +644,8 @@ void Group::postRestartInitializationRecursive() void Group::enableLogLevelInput() { - string const logLevelString = "logLevel"; - - registerWrapper( logLevelString, &m_logLevel ). + // TODO : Improve the Log Level description to clearly assign a usecase per log level (incoming PR). + registerWrapper( viewKeyStruct::logLevelString(), &m_logLevel ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Log level" ); diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 6192f3cddab..84ad45f1fbe 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -1414,6 +1414,15 @@ class Group */ void setInputFlags( InputFlags flags ) { m_input_flags = flags; } + /** + * @brief Structure to hold scoped key names + */ + struct viewKeyStruct + { + /// @return String for the logLevel wrapper + static constexpr char const * logLevelString() { return "logLevel"; } + }; + ///@} /** diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index 404225490af..b3193af0ee5 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -893,6 +893,15 @@ class Wrapper final : public WrapperBase return *this; } + /** + * @copydoc WrapperBase::appendDescription(string const &) + */ + Wrapper< T > & appendDescription( string const & description ) + { + WrapperBase::appendDescription( description ); + return *this; + } + /** * @copydoc WrapperBase::setRegisteringObjects(string const &) */ diff --git a/src/coreComponents/dataRepository/WrapperBase.hpp b/src/coreComponents/dataRepository/WrapperBase.hpp index 542863e03b9..d44e24c2e6b 100644 --- a/src/coreComponents/dataRepository/WrapperBase.hpp +++ b/src/coreComponents/dataRepository/WrapperBase.hpp @@ -508,6 +508,17 @@ class WrapperBase return *this; } + /** + * @brief Add up more text to the existing description string of the wrapper. + * @param description the description to add to the end of the previous one. + * @return a pointer to this wrapper + */ + WrapperBase & appendDescription( string const & description ) + { + m_description += description; + return *this; + } + /** * @brief Get the description string of the wrapper. * @return this wrapper's description string diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index 14386e0b842..f56fdc507c8 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -7,7 +7,7 @@ set( dataRepository_tests set( dependencyList ${parallelDeps} gtest dataRepository ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h index 5f61325f69c..fe66dcfc2ce 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h @@ -162,6 +162,19 @@ void GEOS_dgetrs( char const * TRANS, int const * LDB, int * INFO ); +#define GEOS_dgels FORTRAN_MANGLE( dgels ) +void GEOS_dgels( char const * TRANS, + int const * M, + int const * N, + int const * NRHS, + double * A, + int const * LDA, + double * B, + int const * LDB, + double * WORK, + int const * LWORK, + int * INFO ); + } #endif diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index 31fb564cf89..d05bbf8aef2 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -349,6 +349,36 @@ void matrixInverse( arraySlice2d< real64 const, USD > const & A, matrixInverse( A, Ainv, detA ); } +template< int USD > +void matrixLeastSquaresSolutionSolve( arraySlice2d< real64, USD > const & A, + arraySlice1d< real64 > const & B, + arraySlice1d< real64 > const & X ) +{ + GEOS_ASSERT_MSG( A.size( 1 ) == X.size() && A.size( 0 ) == B.size(), + "Matrix, unknown vector and rhs vector not compatible" ); + + GEOS_ASSERT_MSG( X.size() <= B.size(), + "Matrix, unknown vector and rhs vector not compatible" ); + + int const M = LvArray::integerConversion< int >( A.size( 0 ) ); + int const N = LvArray::integerConversion< int >( A.size( 1 ) ); + int const NRHS = 1; + + int const LWORK = N + N; + array1d< double > WORK( LWORK ); + + int INFO = 0; + + GEOS_dgels( "N", &M, &N, &NRHS, A.dataIfContiguous(), &M, B.dataIfContiguous(), &M, WORK.data(), &LWORK, &INFO ); + + for( int i = 0; i < N; ++i ) + { + X[i] = B[i]; + } + + GEOS_ERROR_IF( INFO != 0, "The algorithm computing matrix linear system failed to converge." ); +} + } // namespace detail real64 BlasLapackLA::determinant( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A ) @@ -911,6 +941,37 @@ void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 const > const & A, solveLinearSystem( AT.toSliceConst(), rhs, solution ); } +void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A, + arraySlice1d< real64 const > const & B, + arraySlice1d< real64 > const & X ) +{ + array2d< real64, MatrixLayout::COL_MAJOR_PERM > AT( A.size( 0 ), A.size( 1 ) ); + + // convert A to a row major format + for( int i = 0; i < A.size( 0 ); ++i ) + { + for( int j = 0; j < A.size( 1 ); ++j ) + { + AT( i, j ) = A( i, j ); + } + } + + matrixLeastSquaresSolutionSolve( AT.toSliceConst(), B, X ); +} + +void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, MatrixLayout::COL_MAJOR > const & A, + arraySlice1d< real64 const > const & B, + arraySlice1d< real64 > const & X ) +{ + // make a copy of A, since dgels modifies the components in A + array2d< real64, MatrixLayout::COL_MAJOR_PERM > ACOPY( A.size( 0 ), A.size( 1 ) ); + BlasLapackLA::matrixCopy( A, ACOPY ); + + // make a copy of B, since dgels modifies the components in B + array1d< real64 > BCOPY( B.size() ); + BlasLapackLA::vectorCopy( B, BCOPY ); + detail::matrixLeastSquaresSolutionSolve( ACOPY.toSlice(), BCOPY.toSlice(), X ); +} } // end geosx namespace diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index dbf7eec9f6e..adc72007e49 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -596,6 +596,23 @@ struct BlasLapackLA static void matrixEigenvalues( MatColMajor< real64 const > const & A, Vec< std::complex< real64 > > const & lambda ); + /** + * @brief Computes the least squares solution of B - AX + * + * @param [in] A GEOSX array2d. + * @param [in] B GEOSX array1d. + * @param [out] X GEOSX array1d. + */ + static void matrixLeastSquaresSolutionSolve( MatRowMajor< real64 const > const & A, + Vec< real64 const > const & B, + Vec< real64 > const & X ); + + /** + * @copydoc matrixLeastSquaresSolutionSolve + */ + static void matrixLeastSquaresSolutionSolve( MatColMajor< real64 const > const & A, + Vec< real64 const > const & B, + Vec< real64 > const & X ); }; } diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp index 8198473c2fc..d819072172a 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp @@ -1139,6 +1139,47 @@ void matrix_svd_test() } } +template< typename LAI > +void matrix_linear_system_least_square_solve_test() +{ + INDEX_TYPE M = 3; + INDEX_TYPE N = 2; + + array2d< real64 > A( M, N ); + array1d< real64 > B( M ); + array1d< real64 > X( N ); + + array1d< real64 > vecResult( N ); + + // Assign component values to A + A( 0, 0 ) = 0.0; + A( 0, 1 ) = 1.0; + A( 1, 0 ) = 1.0; + A( 1, 1 ) = 1.0; + A( 2, 0 ) = 2.0; + A( 2, 1 ) = 1.0; + + // Assign component values to B + B( 0 ) = 6.0; + B( 1 ) = 0.0; + B( 2 ) = 0.0; + + // Compute X + LAI::matrixLeastSquaresSolutionSolve( A, B, X ); + + // Assign component values to the reference solution + vecResult( 0 ) = -3.0; + vecResult( 1 ) = 5.0; + + // Check + for( INDEX_TYPE i = 0; i < N; ++i ) + { + EXPECT_NEAR( vecResult( i ), + X( i ), + machinePrecision ); + } +} + TEST( Array1D, vectorNorm1 ) { vector_norm1_test< BlasLapackLA >(); @@ -1264,6 +1305,12 @@ TEST( DenseLAInterface, matrixSVD ) matrix_svd_test< BlasLapackLA >(); } +TEST( Array2D, matrixLinearSystemSolve ) +{ + matrix_linear_system_least_square_solve_test< BlasLapackLA >(); +} + + int main( int argc, char * * argv ) { ::testing::InitGoogleTest( &argc, argv ); diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 99aa5b3cfbb..89b1d8f5c22 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -44,12 +44,6 @@ class EventBase : public ExecutableGroup /// Destructor virtual ~EventBase() override; - /** - * @brief Catalog name interface. - * @return This type's catalog name. - **/ - static string catalogName() { return "EventBase"; } - /** * @brief If the event forecast is equal to 1, then signal the targets to prepare for execution * during the next cycle. diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 3ebb6c2af44..33f02a151c5 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -53,14 +53,14 @@ EventManager::EventManager( string const & name, setDescription( "Start simulation time for the global event loop." ); registerWrapper( viewKeyStruct::maxTimeString(), &m_maxTime ). - setApplyDefaultValue( std::numeric_limits< real64 >::max()). + setApplyDefaultValue( std::numeric_limits< real64 >::max() ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Maximum simulation time for the global event loop." ); + setDescription( "Maximum simulation time for the global event loop. Disabled by default." ); registerWrapper( viewKeyStruct::maxCycleString(), &m_maxCycle ). - setApplyDefaultValue( std::numeric_limits< integer >::max()). + setApplyDefaultValue( std::numeric_limits< integer >::max() ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Maximum simulation cycle for the global event loop." ); + setDescription( "Maximum simulation cycle for the global event loop. Disabled by default." ); registerWrapper( viewKeyStruct::timeString(), &m_time ). setRestartFlags( RestartFlags::WRITE_AND_READ ). @@ -226,24 +226,43 @@ bool EventManager::run( DomainPartition & domain ) void EventManager::outputTime() const { + const bool isTimeLimited = m_maxTime < std::numeric_limits< real64 >::max(); + const bool isCycleLimited = m_maxCycle < std::numeric_limits< integer >::max(); + units::TimeFormatInfo const timeInfo = units::TimeFormatInfo::fromSeconds( m_time ); + units::TimeFormatInfo const maxTimeInfo = units::TimeFormatInfo::fromSeconds( m_maxTime ); + + const auto timeCompletionUnfoldedString = [&]() -> std::string { + return GEOS_FMT( " out of {} ({:.0f}% completed)", + maxTimeInfo.toUnfoldedString(), + 100.0 * (m_time - m_minTime) / ( m_maxTime - m_minTime ) ); + }; + const auto timeCompletionSecondsString = [&]() -> std::string { + return GEOS_FMT( " / {}", maxTimeInfo.toSecondsString() ); + }; + const auto cycleCompletionString = [&]() -> std::string { + return GEOS_FMT( " out of {} ({:.0f}% completed)", + m_maxCycle, ( 100.0 * m_cycle ) / m_maxCycle ); + }; + // The formating here is a work in progress. - GEOS_LOG_RANK_0( GEOS_FMT( "\n" - "------------------- TIMESTEP START -------------------\n" - " - Time: {}\n" - " - Delta Time: {}\n" - " - Cycle: {}\n" - "------------------------------------------------------\n\n", - units::TimeFormatInfo::fromSeconds( m_time ), - units::TimeFormatInfo::fromSeconds( m_dt ), - m_cycle )); + GEOS_LOG_RANK_0( "\n------------------------- TIMESTEP START -------------------------" ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Time: {}{}", + timeInfo.toUnfoldedString(), + isTimeLimited ? timeCompletionUnfoldedString() : "" ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " ({}{})", + timeInfo.toSecondsString(), + isTimeLimited ? timeCompletionSecondsString() : "" ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Delta Time: {}", units::TimeFormatInfo::fromSeconds( m_dt ) ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Cycle: {}{}", + m_cycle, + isCycleLimited ? cycleCompletionString() : "" ) ); + GEOS_LOG_RANK_0( "--------------------------------------------------------------------\n" ); // We are keeping the old outputs to keep compatibility with current log reading scripts. if( m_timeOutputFormat==TimeOutputFormat::full ) { - units::TimeFormatInfo info = units::TimeFormatInfo::fromSeconds( m_time ); - GEOS_LOG_RANK_0( GEOS_FMT( "Time: {} years, {} days, {} hrs, {} min, {} s, dt: {} s, Cycle: {}\n", - info.m_years, info.m_days, info.m_hours, info.m_minutes, info.m_seconds, m_dt, m_cycle ) ); + timeInfo.m_years, timeInfo.m_days, timeInfo.m_hours, timeInfo.m_minutes, timeInfo.m_seconds, m_dt, m_cycle ) ); } else if( m_timeOutputFormat==TimeOutputFormat::years ) { diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index 94293fa2896..cfe210da0ad 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -39,12 +39,6 @@ class TaskBase : public ExecutableGroup Group * const parent ); virtual ~TaskBase( ) override; - /** - * @brief Catalog name interface - * @return This type's catalog name - */ - static string catalogName() { return "TaskBase"; } - /// The catalog interface type for TaskBase using CatalogInterface = dataRepository::CatalogInterface< TaskBase, string const &, Group * const >; /** diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index 10ad2e8ec1a..ae31a4157fc 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -10,6 +10,7 @@ set( fieldSpecification_headers TractionBoundaryCondition.hpp AquiferBoundaryCondition.hpp PerfectlyMatchedLayer.hpp + SourceFluxStatistics.hpp ) # @@ -24,6 +25,7 @@ set( fieldSpecification_sources TractionBoundaryCondition.cpp AquiferBoundaryCondition.cpp PerfectlyMatchedLayer.cpp + SourceFluxStatistics.cpp ) set( dependencyList ${parallelDeps} functions linearAlgebra ) diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp index acc3cc39981..53007480a30 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp @@ -18,6 +18,7 @@ */ #include "SourceFluxBoundaryCondition.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" namespace geos { @@ -29,6 +30,18 @@ SourceFluxBoundaryCondition::SourceFluxBoundaryCondition( string const & name, G getWrapper< string >( FieldSpecificationBase::viewKeyStruct::fieldNameString() ). setInputFlag( InputFlags::FALSE ); setFieldName( catalogName() ); + + getWrapper< string >( FieldSpecificationBase::viewKeyStruct::functionNameString() ). + setDescription( GEOS_FMT( "Name of a function that specifies the variation of the production rate variations of this {}." + "Multiplied by {}. If no function is provided, a constant value of 1 is used." + "The producted fluid rate unit is in kg by default, or in mole if the flow solver has a {} of 0.", + catalogName(), + FieldSpecificationBase::viewKeyStruct::scaleString(), + CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ) ); + + getWrapper< real64 >( FieldSpecificationBase::viewKeyStruct::scaleString() ). + setDescription( GEOS_FMT( "Multiplier of the {0} value. If no {0} is provided, this value is used directly.", + FieldSpecificationBase::viewKeyStruct::functionNameString() ) ); } REGISTER_CATALOG_ENTRY( FieldSpecificationBase, SourceFluxBoundaryCondition, string const &, Group * const ) diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp new file mode 100644 index 00000000000..273f2945a24 --- /dev/null +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp @@ -0,0 +1,362 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SourceFluxStatistics.cpp + */ + +#include "SourceFluxStatistics.hpp" + +#include "SourceFluxBoundaryCondition.hpp" +#include "FieldSpecificationManager.hpp" +#include "LvArray/src/tensorOps.hpp" + +namespace geos +{ +using namespace dataRepository; + +SourceFluxStatsAggregator::SourceFluxStatsAggregator( const string & name, + Group * const parent ): + Base( name, parent ) +{ + getWrapper< integer >( Group::viewKeyStruct::logLevelString() ). + appendDescription( GEOS_FMT( "\n- Log Level 1 outputs the sum of all {0}(s) produced rate & mass,\n" + "- Log Level 2 details values for each {0},\n" + "- Log Level 3 details values for each region.", + SourceFluxBoundaryCondition::catalogName() ) ); + + registerWrapper( viewKeyStruct::fluxNamesString().data(), &m_fluxNames ). + setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setDefaultValue( "*" ). + setDescription( GEOS_FMT( "Name(s) array of the {0}(s) for which we want the statistics. " + "Use \"*\" to target all {0}.", + SourceFluxBoundaryCondition::catalogName() ) ); +} + +void SourceFluxStatsAggregator::postProcessInput() +{ + Base::postProcessInput(); + + FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); + if( m_fluxNames.size() == 1 && m_fluxNames[0] == "*" ) + { + m_fluxNames.clear(); + fsManager.forSubGroups< SourceFluxBoundaryCondition >( [&]( SourceFluxBoundaryCondition & sourceFlux ) + { + m_fluxNames.emplace_back( string( sourceFlux.getName() ) ); + } ); + GEOS_WARNING_IF( m_fluxNames.empty(), + GEOS_FMT( "{}: No {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fsManager.getDataContext() ) ); + } + else + { + for( string const & fluxName : m_fluxNames ) + { + GEOS_ERROR_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), + GEOS_FMT( "{}: No {} named {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fluxName, fsManager.getDataContext() ) ); + } + } +} + +Wrapper< SourceFluxStatsAggregator::WrappedStats > & +SourceFluxStatsAggregator::registerWrappedStats( Group & group, + string_view fluxName, + string_view elementSetName ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + Wrapper< WrappedStats > & statsWrapper = group.registerWrapper< WrappedStats >( wrapperName ); + statsWrapper.setRestartFlags( RestartFlags::NO_WRITE ); + statsWrapper.reference().setTarget( getName(), fluxName ); + + writeStatsToCSV( elementSetName, statsWrapper.reference(), true ); + + return statsWrapper; +} +void SourceFluxStatsAggregator::registerDataOnMesh( Group & meshBodies ) +{ + if( m_solver == nullptr ) + { + return; + } + + m_solver->forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + registerWrappedStats( mesh, viewKeyStruct::fluxSetWrapperString(), viewKeyStruct::allRegionWrapperString() ); + + for( string const & fluxName : m_fluxNames ) + { + registerWrappedStats( mesh, fluxName, viewKeyStruct::allRegionWrapperString() ); + + mesh.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + Wrapper< WrappedStats > & regionStatsWrapper = + registerWrappedStats( region, fluxName, region.getName() ); + region.excludeWrappersFromPacking( { regionStatsWrapper.getName() } ); + + region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion ) + { + Wrapper< WrappedStats > & subRegionStatsWrapper = + registerWrappedStats( subRegion, fluxName, subRegion.getName() ); + subRegion.excludeWrappersFromPacking( { subRegionStatsWrapper.getName() } ); + } ); + } ); + } + } ); +} + +void SourceFluxStatsAggregator::writeStatsToLog( integer minLogLevel, + string_view elementSetName, + WrappedStats const & wrappedStats ) +{ + if( getLogLevel() >= minLogLevel && logger::internal::rank == 0 ) + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Producing on {} elements", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_elementCount ) ); + + // we want to format differently if we have got multiple phases or not + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); + if( wrappedStats.stats().m_producedMass.size() == 1 ) + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Produced mass = {} {}", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_producedMass[0], massUnit ) ); + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Production rate = {} {}/s", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_productionRate[0], massUnit ) ); + } + else + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Produced mass = {} {}", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_producedMass, massUnit ) ); + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Production rate = {} {}/s", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_productionRate, massUnit ) ); + } + } +} + +void SourceFluxStatsAggregator::writeStatsToCSV( string_view elementSetName, WrappedStats const & stats, + bool writeHeader ) +{ + if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) + { + string const fileName = GEOS_FMT( "{}/{}_{}_{}.csv", + m_outputDir, + stats.getAggregatorName(), stats.getFluxName(), elementSetName ); + std::ofstream outputFile( fileName, + writeHeader ? std::ios_base::out : std::ios_base::app ); + if( writeHeader ) + { + outputFile << GEOS_FMT( "Time [s],Element Count,Producted Mass [{0}],Production Rate [{0}/s]", + units::getSymbol( m_solver->getMassUnit() ) ) << std::endl; + } + else + { + outputFile << GEOS_FMT( "{},{},{},{}", + stats.getStatsPeriodStart(), stats.stats().m_elementCount, + stats.stats().m_producedMass, stats.stats().m_productionRate ) << std::endl; + } + outputFile.close(); + } +} + +bool SourceFluxStatsAggregator::execute( real64 const GEOS_UNUSED_PARAM( time_n ), + real64 const GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & domain ) +{ + forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, WrappedStats & meshLevelStats ) + { + meshLevelStats.stats() = StatData(); + + forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, WrappedStats & fluxStats ) + { + fluxStats.stats() = StatData(); + + forAllRegionStatsWrappers( meshLevel, fluxStats.getFluxName(), + [&] ( ElementRegionBase & region, WrappedStats & regionStats ) + { + regionStats.stats() = StatData(); + + forAllSubRegionStatsWrappers( region, regionStats.getFluxName(), + [&] ( ElementSubRegionBase &, WrappedStats & subRegionStats ) + { + subRegionStats.finalizePeriod(); + regionStats.stats().combine( subRegionStats.stats() ); + } ); + + fluxStats.stats().combine( regionStats.stats() ); + writeStatsToLog( 3, region.getName(), regionStats ); + writeStatsToCSV( region.getName(), regionStats, false ); + } ); + + meshLevelStats.stats().combine( fluxStats.stats() ); + writeStatsToLog( 2, viewKeyStruct::allRegionWrapperString(), fluxStats ); + writeStatsToCSV( viewKeyStruct::allRegionWrapperString(), fluxStats, false ); + } ); + + writeStatsToLog( 1, viewKeyStruct::allRegionWrapperString(), meshLevelStats ); + writeStatsToCSV( viewKeyStruct::allRegionWrapperString(), meshLevelStats, false ); + } ); + + return false; +} + + + +void SourceFluxStatsAggregator::StatData::allocate( integer phaseCount ) +{ + if( m_producedMass.size() != phaseCount ) + { + m_producedMass.resize( phaseCount ); + m_productionRate.resize( phaseCount ); + } +} +void SourceFluxStatsAggregator::StatData::reset() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_producedMass[ip] = 0.0; + m_productionRate[ip] = 0.0; + } + m_elementCount = 0; +} +void SourceFluxStatsAggregator::StatData::combine( StatData const & other ) +{ + allocate( other.getPhaseCount() ); + + for( int ip = 0; ip < other.getPhaseCount(); ++ip ) + { + m_producedMass[ip] += other.m_producedMass[ip]; + m_productionRate[ip] += other.m_productionRate[ip]; + } + m_elementCount += other.m_elementCount; +} +void SourceFluxStatsAggregator::StatData::mpiReduce() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_producedMass[ip] = MpiWrapper::sum( m_producedMass[ip] ); + m_productionRate[ip] = MpiWrapper::sum( m_productionRate[ip] ); + } + m_elementCount = MpiWrapper::sum( m_elementCount ); +} + +void SourceFluxStatsAggregator::WrappedStats::setTarget( string_view aggregatorName, + string_view fluxName ) +{ + m_aggregatorName = aggregatorName; + m_fluxName = fluxName; +} +void SourceFluxStatsAggregator::WrappedStats::gatherTimeStepStats( real64 const currentTime, real64 const dt, + arrayView1d< real64 const > const & producedMass, + integer const elementCount ) +{ + m_periodStats.allocate( producedMass.size() ); + + if( !m_periodStats.m_isGathering ) + { + // if beginning a new period, we must initialize constant values over the period + m_periodStats.m_periodStart = currentTime; + m_periodStats.m_elementCount = elementCount; + m_periodStats.m_isGathering = true; + } + else + { + GEOS_WARNING_IF( currentTime< m_periodStats.m_timeStepStart, GEOS_FMT( "{}: Time seems to have rollback, stats will be wrong.", m_aggregatorName ) ); + if( currentTime > m_periodStats.m_timeStepStart ) + { + // if beginning a new timestep, we must accumulate the stats from previous timesteps (mass & dt) before collecting the new ones + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + m_periodStats.m_periodPendingMass[ip] += m_periodStats.m_timeStepMass[ip]; + } + m_periodStats.m_periodPendingDeltaTime += m_periodStats.m_timeStepDeltaTime; + } + } + // current timestep stats to take into account (overriding if not begining a new timestep) + m_periodStats.m_timeStepStart = currentTime; + m_periodStats.m_timeStepDeltaTime = dt; + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + m_periodStats.m_timeStepMass = producedMass; + } +} +void SourceFluxStatsAggregator::WrappedStats::finalizePeriod() +{ + // init phase data memory allocation if needed + m_stats.allocate( m_periodStats.getPhaseCount() ); + + // produce the period stats of this rank + m_stats.m_elementCount = m_periodStats.m_elementCount; + m_statsPeriodStart = m_periodStats.m_periodStart; + m_statsPeriodDT = m_periodStats.m_timeStepDeltaTime + m_periodStats.m_periodPendingDeltaTime; + + real64 const timeDivisor = m_statsPeriodDT > 0.0 ? 1.0 / m_statsPeriodDT : 0.0; + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + real64 periodMass = m_periodStats.m_timeStepMass[ip] + m_periodStats.m_periodPendingMass[ip]; + m_stats.m_producedMass[ip] = periodMass; + m_stats.m_productionRate[ip] = periodMass * timeDivisor; + } + + // combine period results from all MPI ranks + m_stats.mpiReduce(); + + // start a new timestep + m_periodStats.reset(); +} +void SourceFluxStatsAggregator::WrappedStats::PeriodStats::allocate( integer phaseCount ) +{ + if( m_timeStepMass.size() != phaseCount ) + { + m_timeStepMass.resize( phaseCount ); + m_periodPendingMass.resize( phaseCount ); + } +} +void SourceFluxStatsAggregator::WrappedStats::PeriodStats::reset() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_timeStepMass[ip] = 0.0; + m_periodPendingMass[ip] = 0.0; + } + m_periodPendingDeltaTime = 0.0; + m_elementCount = 0; + m_timeStepStart = 0.0; + m_timeStepDeltaTime = 0.0; + m_isGathering = false; +} + + +REGISTER_CATALOG_ENTRY( TaskBase, + SourceFluxStatsAggregator, + string const &, + dataRepository::Group * const ) + +} /* namespace geos */ diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp new file mode 100644 index 00000000000..e4110c92d36 --- /dev/null +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp @@ -0,0 +1,420 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SourceFluxStatistics.hpp + */ + +#ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ +#define SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ + +#include "physicsSolvers/FieldStatisticsBase.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" +#include "mesh/DomainPartition.hpp" + + +namespace geos +{ + +/** + * @class SourceFluxStatsAggregator + * + * Task class allowing for the computation of aggregate statistics of SourceFluxBoundaryCondition + */ +class SourceFluxStatsAggregator final : public FieldStatisticsBase< FlowSolverBase > +{ +public: + + /** + * @brief Aggregated flux statistics data. + */ + struct StatData + { + /// Amount of fluid produced by the flux(es). Negative if injecting. One value for each fluid phase. + /// In kg by default, or in mol if useMass = 0 on the solver. + array1d< real64 > m_producedMass; + /// Flux(es) production rate. Negative if injecting. One value for each fluid phase. + /// In kg/s by default, or in mol/s if useMass = 0 on the solver. + array1d< real64 > m_productionRate; + /// Number of elements in which we are producing / injecting + integer m_elementCount = 0; + + /** + * @brief resize the phase data arrays if needed + * @param phaseCount the count of phases + */ + void allocate( integer phaseCount ); + /** + * @brief reset the stats to 0.0 + */ + void reset(); + /** + * @return the phase count for phasic stats + */ + integer getPhaseCount() const + { return m_producedMass.size(); } + /** + * @brief Aggregate the statistics of the instance with those of another one. + * @param other the other stats structure. + */ + void combine( StatData const & other ); + /** + * @brief Aggregate the statistics of the instance with those from all instances from other MPI ranks. + * Must be called only once per timestep. + */ + void mpiReduce(); + }; + /** + * @brief Class that aggregate statistics of a flux over multiple time-steps for a given + * SourceFluxStatsAggregator and a for a given mesh part (i.e. a subregion, a region...). + */ + class WrappedStats + { +public: + /** + * @brief Set the subjects targeted by the stats. + * @param aggregatorName the name of the targeted SourceFluxStatsAggregator + * @param fluxName the name of the targeted SourceFluxBoundaryCondition + */ + void setTarget( string_view aggregatorName, string_view fluxName ); + + /** + * @brief Set the current time step stats. Accumulate the statistics only if the time is strictly + * after the previous time + dt (override the statistics if the current timestep is cut). + * @param currentTime time of the timestep start since simulation starting + * @param dt time delta of the current timestep + * @param producedMass Amount of produced fluid (see StatData::m_producedMass). + * @param elementCount number of cell elements concerned by this instance + */ + void gatherTimeStepStats( real64 currentTime, real64 dt, + arrayView1d< real64 const > const & producedMass, + integer elementCount ); + + /** + * @brief Finalize the period statistics of each timestep gathering and render data over all mpi ranks. + * The result can be read by the data() assessor. + * @note This method must be synchronously called by all MPI ranks. + */ + void finalizePeriod(); + + /** + * @return the reference to the wrapped stats data collected over the last period (one timestep or more), computed by finalizePeriod() + */ + StatData & stats() + { return m_stats; } + + /** + * @return the reference to the wrapped stats data collected over the last period (one timestep or more), computed by finalizePeriod() + */ + StatData const & stats() const + { return m_stats; } + + /** + * @return the start time of the wrapped stats period (in s) + */ + real64 getStatsPeriodStart() const + { return m_statsPeriodStart; } + + /** + * @return the duration of the wrapped stats period (in s) + */ + real64 getStatsPeriodDuration() const + { return m_statsPeriodDT; } + + /** + * @return the name of the SourceFluxStatsAggregator that want to collect data on this instance. + */ + string_view getAggregatorName() const + { return m_aggregatorName; } + + /** + * @return the name of the SourceFluxBoundaryCondition from which we are collecting data on this instance. + */ + string_view getFluxName() const + { return m_fluxName; } +private: + /// stats data collected over the last period (one timestep or more), computed by finalizePeriod() + StatData m_stats; + /// the start time of the wrapped stats period (in s) + real64 m_statsPeriodStart; + /// the duration of the wrapped stats period (in s) + real64 m_statsPeriodDT; + + /** + * @brief This struct is used to accumulate statistics along one or more timesteps. + */ + struct PeriodStats + { + /// Fluid production during current time-step. Same unit as StatData::productedMass. + array1d< real64 > m_timeStepMass; + /// Fluid production during all previous time-step of the current period. Same unit as StatData::productedMass. + array1d< real64 > m_periodPendingMass; + /// time of when the timestep starts (since the simulation start). + real64 m_timeStepStart = 0.0; + /// time that the current timestep is simulating. + real64 m_timeStepDeltaTime = 0.0; + /// start time of the current period. + real64 m_periodStart = 0.0; + /// delta time from all previous time-step of the current period. + real64 m_periodPendingDeltaTime = 0.0; + /// number of cell elements targeted by this instance + integer m_elementCount = 0; + /// Did the period statistics gathering started ? + bool m_isGathering = false; + + /** + * @brief resize the phase data arrays if needed + * @param phaseCount the count of phases + */ + void allocate( integer phaseCount ); + /** + * @brief reset the stats to 0.0 + */ + void reset(); + /** + * @return the phase count for phasic stats + */ + integer getPhaseCount() const + { return m_timeStepMass.size(); } + } m_periodStats; + + /// Name of the SourceFluxStatsAggregator that want to collect data on this instance. + string m_aggregatorName; + /// Name of the SourceFluxBoundaryCondition from which we are collecting data on this instance. + string m_fluxName; + }; + + + /** + * @brief Constructor for the statistics class + * @param[in] name the name of the task coming from the xml + * @param[in] parent the parent group of the task + */ + SourceFluxStatsAggregator( const string & name, + Group * const parent ); + + /** + * @return The catalog name + */ + static string catalogName() { return "SourceFluxStatistics"; } + + /** + * @copydoc ExecutableGroup::execute() + */ + virtual bool execute( real64 const time_n, + real64 const dt, + integer const cycleNumber, + integer const eventCounter, + real64 const eventProgress, + DomainPartition & domain ) override; + + /** + * @brief Apply a functor to WrappedStats that combines all stats for each target solver + * discretization mesh levels. + * @param domain the domain for which we want the statistics + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the MeshLevel + * reference and the reference to the WrappedStats that combines all stats for the instance. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forMeshLevelStatsWrapper( DomainPartition & domain, LAMBDA && lambda ); + /** + * @brief Apply a functor to each WrappedStats that combines the stats over all region for a flux. + * @param meshLevel the mesh level for which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the MeshLevel + * reference and the reference to one of the flux WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllFluxStatsWrappers( MeshLevel & meshLevel, LAMBDA && lambda ); + /** + * @brief Apply a functor to all simulated region WrappedStats (of the given MeshLevel) that target a + * given flux. + * @param meshLevel the mesh level we want to loop over all its regions. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * ElementRegionBase reference and the reference of its WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllRegionStatsWrappers( MeshLevel & meshLevel, string_view fluxName, LAMBDA && lambda ); + /** + * @brief Apply a functor to all subregion WrappedStats (of the given region) that target a given flux. + * @param region the region from which we want to execute the lambda for each of its sub-region. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * ElementSubRegionBase reference and the reference of its WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllSubRegionStatsWrappers( ElementRegionBase & region, string_view fluxName, LAMBDA && lambda ); + + /** + * @brief Apply a functor to all WrappedStats of the given group that target a given flux (and + * potentially multiple SourceFluxStatsAggregator). + * The functor takes in parameter the reference to the currently processed WrappedStats. + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + * @tparam LAMBDA the type of lambda function to call in the function + * @param container the container from which we want the statistics. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * reference to the currently processed WrappedStats. + */ + template< typename LAMBDA > + static void forAllFluxStatWrappers( Group & container, string_view fluxName, LAMBDA && lambda ); + + /** + * @return a string used to name the wrapper that is added to each region that is simulated by the solver. + * The string is unique within the region for the SourceFluxBoundaryCondition and the SourceFluxStatsAggregator. + * @param fluxName The name of the flux. For the mesh-level global stats, fluxSetWrapperString() can be used. + */ + inline string getStatWrapperName( string_view fluxName ) const; + + + /** + * @brief View keys + */ + struct viewKeyStruct + { + /// @return The key for setName + constexpr inline static string_view fluxNamesString() { return "fluxNames"; } + /// @return The key for statistics wrapper name that targets all region + constexpr inline static string_view allRegionWrapperString() { return "all_regions"; } + /// @return The key for statistics wrapper name that targets all fluxes of the set + constexpr inline static string_view fluxSetWrapperString() { return "flux_set"; } + }; + + +private: + using Base = FieldStatisticsBase< FlowSolverBase >; + + /// the names of the SourceFlux(s) for which we want the statistics + string_array m_fluxNames; + + /** + * @copydoc Group::registerDataOnMesh(Group &) + */ + void registerDataOnMesh( Group & meshBodies ) override; + + /** + * @copydoc Group::postProcessInput() + */ + void postProcessInput() override; + + dataRepository::Wrapper< WrappedStats > & registerWrappedStats( Group & group, + string_view fluxName, + string_view elementSetName ); + + /** + * @brief If requested, output in the log and CSV the given statistics. + * @param minLogLevel the min log level to output any line. + * @param elementSetName the region / sub-subregion name concerned by the statistics. + * @param stats the statistics that must be output in the log. + */ + void writeStatsToLog( integer minLogLevel, string_view elementSetName, WrappedStats const & stats ); + /** + * @brief If CSV is enabled, create or append a new CSV file. + * @param elementSetName the region / sub-subregion name concerned by the statistics. + * @param stats the statistics that must be output in the log. + * @param writeHeader If true, create the CSV with the header. If false, append it with the statistics. + */ + void writeStatsToCSV( string_view elementSetName, WrappedStats const & stats, bool writeHeader ); + +}; + + +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllFluxStatWrappers( Group & container, + string_view fluxName, + LAMBDA && lambda ) +{ + container.forWrappers< WrappedStats >( [&]( dataRepository::Wrapper< WrappedStats > & statsWrapper ) + { + if( statsWrapper.referenceAsView().getFluxName() == fluxName ) + { + lambda( statsWrapper.reference() ); + } + } ); +} + +template< typename LAMBDA > +void SourceFluxStatsAggregator::forMeshLevelStatsWrapper( DomainPartition & domain, + LAMBDA && lambda ) +{ + m_solver->forDiscretizationOnMeshTargets( domain.getMeshBodies(), + [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & ) + { + string const wrapperName = getStatWrapperName( viewKeyStruct::fluxSetWrapperString() ); + WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( meshLevel, stats ); + } ); +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllFluxStatsWrappers( MeshLevel & meshLevel, + LAMBDA && lambda ) +{ + for( string const & fluxName : m_fluxNames ) + { + string const wrapperName = getStatWrapperName( fluxName ); + WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( meshLevel, stats ); + } +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllRegionStatsWrappers( MeshLevel & meshLevel, + string_view fluxName, + LAMBDA && lambda ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + meshLevel.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + WrappedStats & stats = region.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( region, stats ); + } ); +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllSubRegionStatsWrappers( ElementRegionBase & region, + string_view fluxName, + LAMBDA && lambda ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion ) + { + WrappedStats & stats = subRegion.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( subRegion, stats ); + } ); +} + +inline string SourceFluxStatsAggregator::getStatWrapperName( string_view fluxName ) const +{ return GEOS_FMT( "{}_region_stats_for_{}", fluxName, getName() ); } + + +} /* namespace geos */ + +#endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ */ diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index c479846cc79..93b1a3d0b5e 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -6,6 +6,9 @@ set( fileIO_headers Outputs/OutputUtilities.hpp Outputs/PythonOutput.hpp Outputs/RestartOutput.hpp + Table/TableLayout.hpp + Table/TableFormatter.hpp + Table/TableData.hpp Outputs/TimeHistoryOutput.hpp timeHistory/HDFFile.hpp timeHistory/HistoryCollectionBase.hpp @@ -22,6 +25,9 @@ set( fileIO_sources Outputs/OutputUtilities.cpp Outputs/PythonOutput.cpp Outputs/RestartOutput.cpp + Table/TableLayout.cpp + Table/TableFormatter.cpp + Table/TableData.cpp Outputs/TimeHistoryOutput.cpp timeHistory/HDFFile.cpp timeHistory/HistoryCollectionBase.cpp @@ -75,7 +81,7 @@ if( ENABLE_VTK ) list( APPEND dependencyList VTK::IOLegacy VTK::IOXML ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() @@ -88,4 +94,9 @@ blt_add_library( NAME fileIO target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +if( GEOS_ENABLE_TESTS ) + add_subdirectory( Table/unitTests ) +endif() + + diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index 4d41cd8b820..f6348e77df0 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -39,12 +39,6 @@ class OutputBase : public ExecutableGroup /// Destructor virtual ~OutputBase() override; - /** - * @brief Catalog name interface. - * @return This type's catalog name. - **/ - static string catalogName() { return "OutputBase"; } - /** * @brief Setter for the output directory * @param outputDir The output directory diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index b9b6256bc1a..550ed9dc950 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -60,6 +60,11 @@ VTKOutput::VTKOutput( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Should the vtk files contain the ghost cells or not." ); + registerWrapper( viewKeysStruct::writeFaceElementsAs3D, &m_writeFaceElementsAs3D ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Should the face elements be written as 3d volumes or not." ); + registerWrapper( viewKeysStruct::onlyPlotSpecifiedFieldNames, &m_onlyPlotSpecifiedFieldNames ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -116,6 +121,9 @@ void VTKOutput::postProcessInput() "{} `{}`: found {} fields to plot in `{}`, in addition to all fields with `plotLevel` smaller or equal to {}.", catalogName(), getDataContext(), std::to_string( m_fieldNames.size() ), fieldNamesString, m_plotLevel ) ); + + GEOS_ERROR_IF( m_writeFaceElementsAs3D, GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", + catalogName(), getDataContext() ) ); } @@ -140,6 +148,7 @@ bool VTKOutput::execute( real64 const time_n, GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: writing {} at time {} s (cycle number {})", getName(), m_fieldNames, time_n + dt, cycleNumber )); m_writer.setWriteGhostCells( m_writeGhostCells ); + m_writer.setWriteFaceElementsAs3D ( m_writeFaceElementsAs3D ); m_writer.setOutputMode( m_writeBinaryData ); m_writer.setOutputRegionType( m_outputRegionType ); m_writer.setPlotLevel( m_plotLevel ); diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index c87b92a0513..36b75bb9d6f 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -89,6 +89,7 @@ class VTKOutput : public OutputBase static constexpr auto plotFileRoot = "plotFileRoot"; static constexpr auto writeFEMFaces = "writeFEMFaces"; static constexpr auto writeGhostCells = "writeGhostCells"; + static constexpr auto writeFaceElementsAs3D = "writeFaceElementsAs3D"; static constexpr auto plotLevel = "plotLevel"; static constexpr auto binaryString = "format"; static constexpr auto outputRegionTypeString = "outputRegionType"; @@ -115,6 +116,9 @@ class VTKOutput : public OutputBase /// Should the vtk files contain the ghost cells or not. integer m_writeGhostCells; + /// Should the face elements be written as 3d volumes or not. + integer m_writeFaceElementsAs3D; + /// flag to decide whether we only plot the specified field names integer m_onlyPlotSpecifiedFieldNames; diff --git a/src/coreComponents/fileIO/Table/TableData.cpp b/src/coreComponents/fileIO/Table/TableData.cpp new file mode 100644 index 00000000000..2dbf7dfbe18 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableData.cpp @@ -0,0 +1,91 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.cpp + */ + +#include "TableData.hpp" + +namespace geos +{ + +void TableData::addRow( std::vector< string > const & row ) +{ + if( m_rows.size() != 0 && row.size() != m_rows[m_rows.size() - 1].size() ) + { + string msg = "Remarks : some cells may be missing"; + if( std::find( m_errorsMsg.begin(), m_errorsMsg.end(), msg ) == m_errorsMsg.end()) + { + m_errorsMsg.push_back( msg ); + } + } + m_rows.push_back( row ); +} + +void TableData::clear() +{ + m_rows.clear(); + m_errorsMsg.clear(); +} + +std::vector< std::vector< string > > const & TableData::getTableDataRows() const +{ + return m_rows; +} + +std::vector< string > const & TableData::getErrorMsgs() const +{ + return m_errorsMsg; +} + +TableData2D::Conversion1D TableData2D::buildTableData( string_view targetUnit, + string_view rowFmt, + string_view columnFmt ) const +{ + TableData2D::Conversion1D tableData1D; + std::vector< size_t > rowsLength; + + tableData1D.headerNames.push_back( string( targetUnit ) ); + + for( auto const & columnValue : m_columnValues ) + { + tableData1D.headerNames.push_back( GEOS_FMT( columnFmt, columnValue ) ); + } + + // insert row value and row cell values + for( auto const & [rowValue, rowMap] : m_data ) + { + std::vector< string > currentRowValues; + currentRowValues.reserve( rowMap.size() ); + currentRowValues.push_back( GEOS_FMT( rowFmt, rowValue ) ); + + std::set< real64 >::const_iterator columnIt = m_columnValues.begin(); + for( auto const & [columnValue, cellValue] : rowMap ) + { + // if a column value(s) is/are missing, insert empty entry(ies) + while( columnValue > *( columnIt++ ) && columnIt != m_columnValues.end() ) + { + currentRowValues.push_back( "" ); + } + currentRowValues.push_back( GEOS_FMT( "{}", cellValue ) ); + } + + tableData1D.tableData.addRow( std::move( currentRowValues ) ); + rowsLength.push_back( currentRowValues.size() ); + } + + return tableData1D; +} +} diff --git a/src/coreComponents/fileIO/Table/TableData.hpp b/src/coreComponents/fileIO/Table/TableData.hpp new file mode 100644 index 00000000000..a3cf6a16d5c --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableData.hpp @@ -0,0 +1,146 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.hpp + */ + +#ifndef GEOS_COMMON_TableData_HPP +#define GEOS_COMMON_TableData_HPP + +#include "common/DataTypes.hpp" +#include "common/Format.hpp" + +namespace geos +{ + +/** + * @brief Class for managing table data + */ +class TableData +{ +public: + /** + * @brief Add a row to the table. + * The values passed to addRow (can be any type). + * @param args Cell values to be added to the row. + */ + template< typename ... Args > + void addRow( Args const & ... args ); + + /** + * @brief Add a row to the table + * @param row A vector of string representing a row + */ + void addRow( std::vector< string > const & row ); + + /** + * @brief Reset data in the table + */ + void clear(); + + /** + * @return The rows of the table + */ + std::vector< std::vector< string > > const & getTableDataRows() const; + + /** + * @brief Get all error messages + * @return The vector of error messages + */ + std::vector< string > const & getErrorMsgs() const; + +private: + + /// vector containing all rows with cell values + std::vector< std::vector< string > > m_rows; + + /// store error if there are any inconsistencies related to the table + std::vector< string > m_errorsMsg; + +}; + +/** + * @brief Class for managing 2D table m_data + */ +class TableData2D +{ +public: + + /// Type real64 for a row + using RowType = real64; + /// Type real64 for a column + using ColumnType = real64; + + /// Struct containing conversion informations + struct Conversion1D + { + /// Vector containing all columns names + std::vector< string > headerNames; + /// TableData to be built + TableData tableData; + }; + + /** + * @brief Add a cell to the table. If necessary, create automatically the containing column & row. + * @tparam T The value passed to addCell (can be any type). + * @param value Cell value to be added. + * @param rowValue The value of the row containing the cell. + * @param columnValue The value of the column containing the cell. + */ + template< typename T > + void addCell( RowType rowValue, ColumnType columnValue, T const & value ); + + /** + * @return Convert and return a struct containing a 1D Table, the column names list from a TableData2D and any errors related to the table + * @param dataDescription The table dataDescription shown at the top left side + * @param rowFmt The y axis units of the table. + * @param columnFmt The x axis units of the table. + * @note The rows and columns FMT can be customized. The bracket "{}" will be replaced by the axis value. + * By default it displays the axis value. + * I.E to display a customized axis to show the pressures in y axis, a rowFmt value can be : "pressure [K] = {}" + */ + Conversion1D buildTableData( string_view dataDescription, string_view rowFmt = "{}", string_view columnFmt = "{}" ) const; + +private: + /// @brief all cell values by their [ row ][ column ] + std::map< RowType, std::map< ColumnType, string > > m_data; + + /// @brief Store all column values when adding cell + std::set< real64 > m_columnValues; +}; + +template< typename ... Args > +void TableData::addRow( Args const &... args ) +{ + std::vector< string > m_cellsValue; + ( [&] { + static_assert( has_formatter_v< decltype(args) >, "Argument passed in addRow cannot be converted to string" ); + string const cellValue = GEOS_FMT( "{}", args ); + m_cellsValue.push_back( cellValue ); + } (), ...); + + addRow( m_cellsValue ); +} + +template< typename T > +void TableData2D::addCell( real64 const rowValue, real64 const columnValue, T const & value ) +{ + static_assert( has_formatter_v< decltype(value) >, "Argument passed in addCell cannot be converted to string" ); + m_columnValues.insert( columnValue ); + m_data[rowValue][columnValue] = GEOS_FMT( "{}", value ); +} + +} +#endif diff --git a/src/coreComponents/fileIO/Table/TableFormatter.cpp b/src/coreComponents/fileIO/Table/TableFormatter.cpp new file mode 100644 index 00000000000..d49204653d8 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableFormatter.cpp @@ -0,0 +1,401 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableFormatter.cpp + */ + +#include +#include "codingUtilities/StringUtilities.hpp" +#include "TableFormatter.hpp" +namespace geos +{ + +TableFormatter::TableFormatter( TableLayout const & tableLayout ): + m_tableLayout( tableLayout ) +{} + +/////////////////////////////////////////////////////////////////////// +////// CSV Formatter implementation +/////////////////////////////////////////////////////////////////////// + +TableCSVFormatter::TableCSVFormatter( TableLayout const & tableLayout ): + TableFormatter( tableLayout ) +{ + m_tableLayout = tableLayout; +} + +string TableCSVFormatter::headerToString() const +{ + std::stringstream oss; + static constexpr string_view separator = ","; + + for( std::size_t idxColumn = 0; idxColumn < m_tableLayout.getColumns().size(); ++idxColumn ) + { + oss << m_tableLayout.getColumns()[idxColumn].m_parameter.columnName; + if( idxColumn < m_tableLayout.getColumns().size() - 1 ) + { + oss << separator; + } + } + oss << "\n"; + return oss.str(); +} + +string TableCSVFormatter::dataToString( TableData const & tableData ) const +{ + std::vector< std::vector< string > > const rowsValues = tableData.getTableDataRows(); + std::ostringstream oss; + + for( const auto & row : rowsValues ) + { + oss << stringutilities::join( row.cbegin(), row.cend(), "," ) << "\n"; + } + + return oss.str(); +} + +string TableCSVFormatter::toString( TableData const & tableData ) const +{ + return headerToString() + dataToString( tableData ); +} + +/////////////////////////////////////////////////////////////////////// +////// Log Formatter implementation +/////////////////////////////////////////////////////////////////////// + +/** + * @brief Build cell given an alignment, a value and spaces + * @param alignment The aligment of cell value + * @param value The cell value + * @param spaces The number of spaces in the cell + * @return A formated cell + */ +string buildCell( TableLayout::Alignment const alignment, string_view value, integer const spaces ) +{ + switch( alignment ) + { + case TableLayout::right: return GEOS_FMT( "{:>{}}", value, spaces ); + case TableLayout::left: return GEOS_FMT( "{:<{}}", value, spaces ); + case TableLayout::center: return GEOS_FMT( "{:^{}}", value, spaces ); + default: return GEOS_FMT( "{:>{}}", value, spaces ); + } +} + +/** + * @brief Detect columns who are not displayed from TableLayout and therefore modify columns / tableDataRows vectors + * @param columns Vector built in TableLayout containing all columns with their parameters + * @param tableDataRows Vector built in TableData containing all rows values + */ +void formatColumnsFromLayout( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & tableDataRows ) +{ + integer idxColumn = 0; + for( auto & column : columns ) + { + if( !column.m_parameter.enabled ) + { + columns.erase( columns.begin() + idxColumn ); + for( auto & row : tableDataRows ) + { + row.erase( row.begin() + idxColumn ); + } + } + ++idxColumn; + } +} + +TableTextFormatter::TableTextFormatter( TableLayout const & tableLayout ): + TableFormatter( tableLayout ) +{} + +void TableTextFormatter::fillTableColumnsFromRows( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & rows ) const +{ + for( size_t idxRow = 0; idxRow < rows.size(); idxRow++ ) + { + if( rows[idxRow].size() < columns.size() ) + { + rows[idxRow].resize( columns.size(), " " ); + } + + for( size_t idxColumn = 0; idxColumn < columns.size(); idxColumn++ ) + { + if( m_tableLayout.getColumns()[idxColumn].m_parameter.enabled ) + { + columns[idxColumn].m_columnValues.push_back( rows[idxRow][idxColumn] ); + } + } + } +} + +string TableTextFormatter::layoutToString() const +{ + std::ostringstream tableOutput; + string sectionSeparatingLine; + std::vector< TableLayout::Column > columns = m_tableLayout.getColumns(); + + outputLayout( tableOutput, columns, {}, sectionSeparatingLine ); + return tableOutput.str(); +} + +string TableTextFormatter::toString( TableData const & tableData ) const +{ + std::ostringstream tableOutput; + string sectionSeparatingLine; + std::vector< TableLayout::Column > columns = m_tableLayout.getColumns(); + std::vector< std::vector< string > > tableDataRows = tableData.getTableDataRows(); + std::vector< string > const & msgTableError = tableData.getErrorMsgs(); + integer const nbValuesRows = tableDataRows.size(); + + formatColumnsFromLayout( columns, tableDataRows ); + fillTableColumnsFromRows( columns, tableDataRows ); + + outputLayout( tableOutput, columns, msgTableError, sectionSeparatingLine ); + outputSectionRows( columns, sectionSeparatingLine, tableOutput, nbValuesRows, TableLayout::Section::values ); + tableOutput << '\n'; + + return tableOutput.str(); +} + +void TableTextFormatter::outputLayout( std::ostringstream & tableOutput, + std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError, + string & sectionSeparatingLine ) const +{ + string topSeparator; + size_t nbHeaderRows = 0; + std::vector< std::vector< string > > splitHeaders; + string const tableTitle = string( m_tableLayout.getTitle()); + + splitAndSetColumnNames( columns, nbHeaderRows, splitHeaders ); + findAndSetMaxStringSize( columns ); + + computeTableWidth( columns, msgTableError ); + buildTableSeparators( columns, topSeparator, sectionSeparatingLine ); + + tableOutput << '\n'; + outputTopRows( tableOutput, {tableTitle}, topSeparator, TableLayout::Alignment::center ); + outputTopRows( tableOutput, msgTableError, topSeparator, TableLayout::Alignment::left ); + tableOutput << GEOS_FMT( "{}\n", sectionSeparatingLine ); + + outputSectionRows( columns, sectionSeparatingLine, tableOutput, nbHeaderRows, TableLayout::Section::header ); +} + +void TableTextFormatter::splitAndSetColumnNames( std::vector< TableLayout::Column > & columns, + size_t & nbHeaderRows, + std::vector< std::vector< string > > & splitHeaders ) const +{ + + splitHeaders.reserve( columns.size() ); + for( auto const & column : columns ) + { + std::vector< string > splitHeaderParts; + std::istringstream ss( column.m_parameter.columnName ); + string subColumnNames; + + while( getline( ss, subColumnNames, '\n' )) + { + splitHeaderParts.push_back( subColumnNames ); + } + + splitHeaders.push_back( std::move( splitHeaderParts ) ); + } + + nbHeaderRows = std::max_element( splitHeaders.begin(), splitHeaders.end(), + []( auto const & v1, auto const & v2 ) { return v1.size() < v2.size(); } )->size(); + + for( auto & headerParts : splitHeaders ) + { + if( headerParts.size() < nbHeaderRows ) + { + headerParts.resize( nbHeaderRows, " " ); + } + columns[&headerParts - &splitHeaders[0]].m_parameter.splitColumnNameLines = headerParts; + } + +} + +void TableTextFormatter::findAndSetMaxStringSize( std::vector< TableLayout::Column > & columns ) const +{ + for( auto & column : columns ) + { + auto const maxStringSizeHeader = *std::max_element( column.m_parameter.splitColumnNameLines.begin(), + column.m_parameter.splitColumnNameLines.end(), + []( const auto & a, const auto & b ) {return a.size() < b.size();} ); + column.m_maxStringSize = maxStringSizeHeader; + + for( auto const & cell : column.m_columnValues ) + { + if( column.m_maxStringSize.length() < cell.length()) + { + column.m_maxStringSize = cell; + } + } + } +} + +void TableTextFormatter::increaseColumnsSize( std::vector< TableLayout::Column > & columns, + integer const extraCharacters ) const +{ + integer const extraCharactersPerColumn = std::ceil( extraCharacters / columns.size() ); + for( std::size_t idxColumn = 0; idxColumn < columns.size(); ++idxColumn ) + { + integer newMaxStringSize = extraCharactersPerColumn + columns[idxColumn].m_maxStringSize.size(); + if( idxColumn == columns.size() - 1 ) + { + newMaxStringSize += m_tableLayout.getColumnMargin(); + } + + columns[idxColumn].m_maxStringSize = GEOS_FMT( "{:>{}}", + columns[idxColumn].m_maxStringSize, + newMaxStringSize ); + } +} + +void computeTableErrorLength( std::vector< string > const & msgTableError, string::size_type & msgTableErrorLength ) +{ + if( !msgTableError.empty() ) + { + auto maxStringSize = *(std::max_element( msgTableError.begin(), msgTableError.end(), + []( const auto & a, const auto & b ) { + return a.size() < b.size(); + } )); + + msgTableErrorLength += maxStringSize.size() + 1; // max string size + line return at the end + } +} + +void computeTableSectionLength( std::vector< TableLayout::Column > & columns, string::size_type & sectionlineLength ) +{ + sectionlineLength += std::accumulate( columns.begin(), columns.end(), 0, + []( auto sum, const auto & column ) + { return sum + column.m_maxStringSize.length();} ); +} + +void TableTextFormatter::computeTableWidth( std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError ) const +{ + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + string const tableTitle = string( m_tableLayout.getTitle() ); + + string::size_type sectionLengthWithSpacing = ( ( columns.size() - 1 ) * columnMargin ) + (borderMargin * 2); + string::size_type sectionlineLength = sectionLengthWithSpacing; + string::size_type maxTopLineLength = tableTitle.length(); + string::size_type msgTableErrorLength = borderMargin; + + computeTableErrorLength( msgTableError, msgTableErrorLength ); + computeTableSectionLength( columns, sectionlineLength ); + + maxTopLineLength = std::max( maxTopLineLength, msgTableErrorLength ); + if( sectionlineLength < maxTopLineLength ) + { + integer const extraCharacters = maxTopLineLength - sectionlineLength; + increaseColumnsSize( columns, extraCharacters ); + } +} + + +void TableTextFormatter::buildTableSeparators( std::vector< TableLayout::Column > const & columns, + string & topSeparator, + string & sectionSeparatingLine ) const +{ + { // section separator line + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + + std::vector< string > maxStringPerColumn; + for( auto const & column : columns ) + { + maxStringPerColumn.push_back( string( column.m_maxStringSize.length(), m_horizontalLine ) ); + } + + string const patternBetweenColumns = GEOS_FMT( "{:-^{}}", m_horizontalLine, columnMargin ); + + std::string const leftBorder = GEOS_FMT( "{}{:-<{}}", m_horizontalLine, "", borderMargin ); + std::string const rightBorder = GEOS_FMT( "{}{:-<{}}", m_horizontalLine, "", borderMargin ); + std::string const columnJoin = stringutilities::join( maxStringPerColumn, patternBetweenColumns ); + + std::ostringstream oss; + oss << leftBorder << columnJoin << rightBorder; + sectionSeparatingLine = oss.str(); + } + + { // top line separator + // -2 because we can have '+' to the extremity of top separator + integer const topSeparatorLength = sectionSeparatingLine.size() - 2; + topSeparator = GEOS_FMT( "{}{:-<{}}{}", m_horizontalLine, "", topSeparatorLength, m_horizontalLine ); + } +} + +void TableTextFormatter::outputTopRows( std::ostringstream & tableOutput, + std::vector< string > const & msg, + string_view topSeparator, + TableLayout::Alignment alignment ) const +{ + if( msg.size() != 0 && msg[0] != "" ) + { + tableOutput << GEOS_FMT( "{}\n", topSeparator ); + for( std::string const & str : msg ) + { + tableOutput << m_verticalLine << string( m_tableLayout.getBorderMargin(), ' ' ); + tableOutput << buildCell( alignment, str, (topSeparator.length() - 6)); + tableOutput << string( m_tableLayout.getBorderMargin(), ' ' ) << "|\n"; + } + } +} + +void TableTextFormatter::outputSectionRows( std::vector< TableLayout::Column > const & columns, + string_view sectionSeparatingLine, + std::ostringstream & tableOutput, + integer const nbRows, + TableLayout::Section const section ) const +{ + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + + for( integer idxRow = 0; idxRow< nbRows; ++idxRow ) + { + // Append the left border + tableOutput << GEOS_FMT( "{:<{}}", m_verticalLine, 1 + borderMargin ); + for( std::size_t idxColumn = 0; idxColumn < columns.size(); ++idxColumn ) + { + TableLayout::Column const currentColumn = columns[idxColumn]; + auto const & columnContent = section == TableLayout::Section::header ? + columns[idxColumn].m_parameter.splitColumnNameLines : + columns[idxColumn].m_columnValues; + string cell = columnContent[idxRow]; + integer const cellSize = currentColumn.m_maxStringSize.length(); + + tableOutput << buildCell( currentColumn.m_parameter.alignment, cell, cellSize ); + + // Add space between column + if( idxColumn < columns.size() - 1 ) + { + tableOutput << GEOS_FMT( "{:^{}}", m_verticalLine, columnMargin ); + } + + } + + // Append right border with line return + tableOutput << GEOS_FMT( "{:>{}}\n", m_verticalLine, borderMargin + 1 ); + } + + if( nbRows != 0 ) + { + tableOutput << GEOS_FMT( "{}\n", sectionSeparatingLine ); + } +} +} diff --git a/src/coreComponents/fileIO/Table/TableFormatter.hpp b/src/coreComponents/fileIO/Table/TableFormatter.hpp new file mode 100644 index 00000000000..1e18452b562 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableFormatter.hpp @@ -0,0 +1,221 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableFormatter.hpp + */ + +#ifndef GEOS_COMMON_TABLEFORMATTER_HPP +#define GEOS_COMMON_TABLEFORMATTER_HPP + +#include "TableData.hpp" +#include "TableLayout.hpp" + +namespace geos +{ + +/** + * @brief abstract class for formatting table data + */ +class TableFormatter +{ + +protected: + + /// Layout for a table + TableLayout m_tableLayout; + + /** + * @brief Construct a new Table Formatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the Table Formatter object + */ + virtual ~TableFormatter() = default; +}; + +/** + * @brief class for CSV formatting + */ +class TableCSVFormatter : public TableFormatter +{ +public: + + /** + * @brief Construct a new Table Formatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableCSVFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the TableCSVFormatter object + */ + virtual ~TableCSVFormatter() = default; + + /** + * @return The string with all column names. + */ + string headerToString() const; + + /** + * @brief Convert the table data to a CSV string. + * @param tableData The 1D table data. + * @return The CSV string representation of the table data. + */ + string dataToString( TableData const & tableData ) const; + + /** + * @brief Convert the TableData to a table string. + * @param tableData The TableData to convert. + * @return The table string representation of the TableData. + */ + string toString( TableData const & tableData ) const; + +}; + +/** + * @brief class for log formatting + */ +class TableTextFormatter : public TableFormatter +{ + +public: + + /** + * @brief Construct a new TableFormatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableTextFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the Table Text Formatter object + */ + virtual ~TableTextFormatter() = default; + + /** + * @return A TableLayout converted into a formatted representation. + */ + string layoutToString() const; + + /** + * @brief Convert the TableData to a table string. + * @param tableData The TableData to convert. + * @return The table string representation of the TableData. + */ + string toString( TableData const & tableData ) const; + +private: + + /// symbol for separator construction + static constexpr char m_verticalLine = '|'; + /// for the extremity of a row + static constexpr char m_horizontalLine = '-'; + + /**F + * @brief Fill the vector (m_column) in tableData with values from rows stored in tableData. + * @param columns Vector of columns to be filled. + * @param tableData Vector containing all rows filled with values + */ + void fillTableColumnsFromRows( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & tableData ) const; + + /** + * @brief Converts a TableLayout into a formatted representation. + * @param tableOutput The output stream + * @param columns The vector containing all table columns + * @param msgTableError A vector containg all error related to the table + * @param sectionSeparatingLine An empty string for building the section separator + */ + void outputLayout( std::ostringstream & tableOutput, + std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError, + string & sectionSeparatingLine ) const; + + /** + * @brief Split all header names by detecting the newline \\n character. and + * set the same vector size for each split header and merge it into columns + * @param columns The vector containg all columns + * @param largestHeaderVectorSize The largest split header vector size + * @param splitHeaders A empty vector who will contain all split header names + */ + void splitAndSetColumnNames( std::vector< TableLayout::Column > & columns, + size_t & largestHeaderVectorSize, + std::vector< std::vector< string > > & splitHeaders ) const; + + /** + * @brief For each column find and set the column's longest string + * @param columns The vector containg all columns + */ + void findAndSetMaxStringSize( std::vector< TableLayout::Column > & columns ) const; + + /** + * @brief recalculate the largest string size for each columns + * @param columns Vector containing all table columns + * @param extraCharacters Extra characters to be added to \p m_maxStringSize of each columns + */ + void increaseColumnsSize( std::vector< TableLayout::Column > & columns, + integer const extraCharacters ) const; + + /** + * @brief Compute the max table line length, taking into account the length of : title, error, columns header and content + * Increase the size of the columns if necessary + * @param columns Vector of column containing containing the largest string for each column + * @param msgTableError Vector containing all error messages + */ + void computeTableWidth( std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError ) const; + + /** + * @brief Build all separators needed from content length contained in the columns vector + * @param columns Vector containing all table columns + * @param topSeparator Top separator to be built + * @param sectionSeparatingLine Line section separator to be built + */ + void buildTableSeparators( std::vector< TableLayout::Column > const & columns, + string & topSeparator, + string & sectionSeparatingLine ) const; + + /** + * @brief Add a row on top of the table + * @param tableOutput The output stream + * @param msg Vector of string(s) to display + * @param topSeparator The top table separator + * @param alignment The aligment for a row + */ + void outputTopRows( std::ostringstream & tableOutput, + std::vector< string > const & msg, + string_view topSeparator, + TableLayout::Alignment alignment ) const; + + /** + * @brief Output a section by specifying it's type ( header or section ) + * @param columns Vector containing all table columns + * @param sectionSeparatingLine Line separator between sections + * @param rows A section row + * @param nbRows Indicates the number of lines in a section + * @param section The section to be built + * @note Add the ending line if there are one or more rows + */ + void outputSectionRows( std::vector< TableLayout::Column > const & columns, + string_view sectionSeparatingLine, + std::ostringstream & rows, + integer const nbRows, + TableLayout::Section const section ) const; +}; +} + +#endif diff --git a/src/coreComponents/fileIO/Table/TableLayout.cpp b/src/coreComponents/fileIO/Table/TableLayout.cpp new file mode 100644 index 00000000000..726a92eab36 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableLayout.cpp @@ -0,0 +1,78 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.hpp + */ + +#include "TableLayout.hpp" + +namespace geos +{ + +TableLayout::TableLayout( std::vector< string > const & columnNames, string const & title ): + m_tableTitle( title ) +{ + setMargin( MarginValue::medium ); + m_columns.reserve( columnNames.size() ); + for( auto const & name : columnNames ) + { + m_columns.push_back( {TableLayout::ColumnParam{{name}, Alignment::right, true}, {}, ""} ); + } +} + +TableLayout::TableLayout( std::vector< ColumnParam > const & columnParameters, string const & title ): + m_tableTitle( title ) +{ + setMargin( MarginValue::medium ); + m_columns.reserve( columnParameters.size() ); + for( auto const & param : columnParameters ) + { + m_columns.push_back( { param, {}, ""} ); + } +} + +void TableLayout::setMargin( MarginValue marginValue ) +{ + m_borderMargin = marginValue; + m_columnMargin = integer( marginValue ) * 2 + 1; +} + +std::vector< TableLayout::Column > const & TableLayout::getColumns() const +{ + return m_columns; +} + +string_view TableLayout::getTitle() const +{ + return m_tableTitle; +} + + +integer const & TableLayout::getBorderMargin() const +{ + return m_borderMargin; +} + +integer const & TableLayout::getColumnMargin() const +{ + return m_columnMargin; +} + +integer const & TableLayout::getMarginTitle() const +{ + return m_titleMargin; +} + +} diff --git a/src/coreComponents/fileIO/Table/TableLayout.hpp b/src/coreComponents/fileIO/Table/TableLayout.hpp new file mode 100644 index 00000000000..f19759ae453 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableLayout.hpp @@ -0,0 +1,156 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableLayout.hpp + */ + +#ifndef GEOS_COMMON_TABLELAYOUT_HPP +#define GEOS_COMMON_TABLELAYOUT_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +/** + * @brief Class for setup the table layout + */ +class TableLayout +{ + +public: + + /// Type of aligment for a column + enum Alignment { right, left, center }; + + /// Space to apply between all data and border + enum MarginValue : integer + { + tiny = 0, + small = 1, + medium = 2, + large = 3 + }; + + /** + * @brief Enumeration for table sections. + */ + enum Section { header, values }; + + /** + * @brief Structure to set up each colum parameters. + */ + struct ColumnParam + { + /// Name for a column + string columnName; + /// Alignment for a column. By default aligned to the right side + Alignment alignment = Alignment::right; + /// A boolean to display a colummn + bool enabled = true; + /// Vector containing substring column name delimited by "\n" + std::vector< string > splitColumnNameLines; + + /** + * @brief Construct a ColumnParam object with the specified name and alignment. + * @param name The name of the column + * @param align The alignment of the column + */ + ColumnParam( std::string const & name, Alignment align ) + : columnName( name ), alignment( align ) + {} + + /** + * @brief Construct a ColumnParam object with the specified name, alignment, and display flag. + * @param name The name of the column + * @param align The alignment of the column + * @param display Flag indicating whether the column is enabled + */ + ColumnParam( std::string const & name, Alignment align, bool display ) + : columnName( name ), alignment( align ), enabled( display ) + {} + }; + + /** + * @brief Struct for a column. + */ + struct Column + { + /// Structure who contains parameters for a column + ColumnParam m_parameter; + /// A vector containing all column values + std::vector< string > m_columnValues; + /// The largest string in the column + string m_maxStringSize; + }; + + /** + * @brief Construct a new Table object, all values in the table are centered by default + * @param columnNames The names of the columns + * @param title The table name + */ + TableLayout( std::vector< string > const & columnNames, string const & title = "" ); + + /** + * @brief Construct a new Table object by specifying value alignment and optionally their displays based to log levels + * level + * @param columnParameters List of structures to set up each colum parameters. + * @param title The table name + */ + TableLayout( std::vector< ColumnParam > const & columnParameters, string const & title = "" ); + + /** + * @return The columns vector + */ + std::vector< Column > const & getColumns() const; + + /** + * @return The table name + */ + string_view getTitle() const; + + /** + * @return The border margin, number of spaces at both left and right table sides + */ + integer const & getBorderMargin() const; + + /** + * @return The column margin, numbers of spaces separating both left and right side from each column content + */ + integer const & getColumnMargin() const; + + /** + * @return The margin title + */ + integer const & getMarginTitle() const; + + /** + * @brief Set the minimal margin width between cell content and borders. + * @param marginValue The margin value + */ + void setMargin( MarginValue marginValue ); + +private: + + std::vector< Column > m_columns; + string m_tableTitle; + integer m_borderMargin; + integer m_columnMargin; + integer m_titleMargin = 2; + +}; +} + +#endif diff --git a/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt b/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt new file mode 100644 index 00000000000..4db71486656 --- /dev/null +++ b/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt @@ -0,0 +1,18 @@ +# Specify list of tests +set( gtest_geosx_tests + testTable.cpp ) + +set( dependencyList gtest fileIO ${parallelDeps} ) + +# Add gtest C++ based tests +foreach(test ${gtest_geosx_tests}) + get_filename_component( test_name ${test} NAME_WE ) + blt_add_executable( NAME ${test_name} + SOURCES ${test} + OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} + DEPENDS_ON ${dependencyList} ) + + geos_add_test( NAME ${test_name} + COMMAND ${test_name} ) + +endforeach() diff --git a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp new file mode 100644 index 00000000000..98dabc25d84 --- /dev/null +++ b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp @@ -0,0 +1,334 @@ + +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "fileIO/Table/TableData.hpp" +#include "fileIO/Table/TableFormatter.hpp" +#include "fileIO/Table/TableLayout.hpp" +#include "dataRepository/Group.hpp" +// TPL includes +#include +#include + +using namespace geos; + +TEST( testTable, tableEmptyRow ) +{ + //table with empty row + TableLayout const tableLayout( {"Well\nelement no.\nPV weighted\nbar", + "CordX", + "CoordZ", + "Prev\nelement", + "Next\nelement"}, + "InternalWellGenerator well_injector1" + ); + + TableData tableData; + tableData.addRow( "value1", "[30.21543]", "3.0", 54, 0 ); + tableData.addRow( "", "", "", "", "" ); + tableData.addRow( "Duis fringilla, ligula sed porta fringilla, ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante", "[30.21543]", "30.45465142", + 787442, 10 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( + tableData ), + "\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| Well | CordX | CoordZ | Prev | Next |\n" + "| element no. | | | element | element |\n" + "| PV weighted | | | | |\n" + "| bar | | | | |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| value1 | [30.21543] | 3.0 | 54 | 0 |\n" + "| | | | | |\n" + "| Duis fringilla, ligula sed porta fringilla, ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante | [30.21543] | 30.45465142 | 787442 | 10 |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableClassic ) +{ + TableLayout const tableLayout( {"Duis fringilla, ligula sed porta fringilla,\nligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante", + "CordX", + "CoordZ", + "Prev\nelement", + "Next\nelement"}, "InternalWellGenerator well_injector1" ); + + TableData tableData; + tableData.addRow( "value1", "[30.21543]", "3.0", 54, 0 ); + tableData.addRow( "", "", "", "", "" ); + tableData.addRow( "value23", "[30.21543]", "30.45465142", 787442, 10 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| Duis fringilla, ligula sed porta fringilla, | CordX | CoordZ | Prev | Next |\n" + "| ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante | | | element | element |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| value1 | [30.21543] | 3.0 | 54 | 0 |\n" + "| | | | | |\n" + "| value23 | [30.21543] | 30.45465142 | 787442 | 10 |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableColumnParamClassic ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::right} + }, "InternalWellGenerator well_injector1" ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ | Prev | Next |\n" + "| | | | | element | element |\n" + "-------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 | 2 | 1 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 | 10 | 3 |\n" + "-------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableHiddenColumn ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::left, false}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::center, false}, + }, "Cras egestas ipsum a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis" ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n----------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas ipsum a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis |\n" + "----------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ |\n" + "----------------------------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 |\n" + "----------------------------------------------------------------------------------------------------------------\n\n" ); +} + +TEST( testTable, tableUniqueColumn ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + }, "Cras egestas ipsu a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis" ); + + TableData tableData; + tableData.addRow( "value1" ); + tableData.addRow( "val1" ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n---------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas ipsu a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis |\n" + "---------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas |\n" + "---------------------------------------------------------------------------------------------------------------\n" + "| value1 |\n" + "| val1 |\n" + "---------------------------------------------------------------------------------------------------------------\n\n" ); +} + +TEST( testTable, tableEmptyTitle ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::center}, + } + ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ | Prev | Next |\n" + "| | | | | element | element |\n" + "-------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 | 2 | 1 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 | 10 | 3 |\n" + "-------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, table2DTable ) +{ + //collect + TableData2D tableData; + + for( real64 p = 10000; p<20000; p+=5000 ) + { + for( real64 t = 400; t>=270; t+=-50.0 ) + { + real64 value = t/p; + tableData.addCell( t, p, value ); + } + } + + //convert + string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); + string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); + TableData2D::Conversion1D tableconverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); + + //format + TableLayout const tableLayout( tableconverted.headerNames ); + + //log + TableTextFormatter const tableLog( tableLayout ); + EXPECT_EQ( tableLog.toString( tableconverted.tableData ), + "\n---------------------------------------------------------------------\n" + "| Viscosity kg*s | Pression = 10000 | Pression = 15000 |\n" + "---------------------------------------------------------------------\n" + "| Temperature = 300 | 0.03 | 0.02 |\n" + "| Temperature = 350 | 0.035 | 0.023333333333333334 |\n" + "| Temperature = 400 | 0.04 | 0.02666666666666667 |\n" + "---------------------------------------------------------------------\n\n" + ); +} + + +TEST( testTable, table2DColumnMismatch ) +{ + //test 2D table column mismatch + { + // collect + TableData2D tableData; + + tableData.addCell( 300, 10000, 0.03 ); + tableData.addCell( 300, 15000, 0.02 ); + tableData.addCell( 350, 10000, 0.035 ); + tableData.addCell( 350, 10000, 0.035 ); + tableData.addCell( 400, 10000, 0.04 ); + tableData.addCell( 400, 15000, 0.02666666666666667 ); + + //convert + string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); + string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); + TableData2D::Conversion1D tableConverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); + + //format + TableLayout const tableLayout( tableConverted.headerNames ); + + //log + TableTextFormatter const tableLog( tableLayout ); + EXPECT_EQ( tableLog.toString( tableConverted.tableData ), + "\n--------------------------------------------------------------------\n" + "| Remarks : some cells may be missing |\n" + "--------------------------------------------------------------------\n" + "| Viscosity kg*s | Pression = 10000 | Pression = 15000 |\n" + "--------------------------------------------------------------------\n" + "| Temperature = 300 | 0.03 | 0.02 |\n" + "| Temperature = 350 | 0.035 | |\n" + "| Temperature = 400 | 0.04 | 0.02666666666666667 |\n" + "--------------------------------------------------------------------\n\n" + ); + } +} + +TEST( testTable, layoutTable ) +{ + string filename = "fluid1_phaseModel1_PhillipsBrineDensity_table"; + //2. format + string log = GEOS_FMT( "The {} PVT table exceeding 500 rows.\nTo visualize the tables, go to the generated csv \n", filename ); + TableLayout const tableLayoutInfos( {TableLayout::ColumnParam{{log}, TableLayout::Alignment::left}}, filename ); + + //3. log + TableTextFormatter const tableLog( tableLayoutInfos ); + EXPECT_EQ( tableLog.layoutToString(), + "\n-------------------------------------------------------------------------------------\n" + "| fluid1_phaseModel1_PhillipsBrineDensity_table |\n" + "-------------------------------------------------------------------------------------\n" + "| The fluid1_phaseModel1_PhillipsBrineDensity_table PVT table exceeding 500 rows. |\n" + "| To visualize the tables, go to the generated csv |\n" + "-------------------------------------------------------------------------------------\n" + ); +} + +TEST( testTable, tableSetMargin ) +{ + //////////// + //////// If setMargin used elsewhere make it public and remove comments for this test + //////////// + //test with tiny margin + // { + // TableLayout tableLayout( { + // TableLayout::ColumnParam{{"Colonne 1"}, TableLayout::Alignment::center}, + // TableLayout::ColumnParam{{"Colonne 2"}, TableLayout::Alignment::center}, + // TableLayout::ColumnParam{{"Colonne 3"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Colonne 4"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::right}, + // }, "InternalWellGenerator well_injector1" ); + + // //tableLayout.setMargin( TableLayout::MarginValue::tiny ); + + // TableData tableData; + // tableData.addRow( "value 1", "long value 1", "3.0034", 3.0129877, "" , 1 ); + // tableData.addRow( "value 1", "long value 2", "100.45", 4.0129877, 1 , 2 ); + + // TableTextFormatter const tableText( tableLayout ); + // EXPECT_EQ( tableText.toString( tableData ), +// "\n------------------------------------------------------------\n" +// "| InternalWellGenerator well_injector1 |\n" +// "------------------------------------------------------------\n" +// "|Colonne 1| Colonne 2 |Colonne 3|Colonne 4| Prev| Next|\n" +// "| | | | |element|element|\n" +// "------------------------------------------------------------\n" +// "| value 1 |long value 1| 3.0034|3.0129877| | 1|\n" +// "| value 1 |long value 2| 100.45|4.0129877| 1| 2|\n" +// "------------------------------------------------------------\n\n" +// ); +// } +} + +int main( int argc, char * * argv ) +{ + testing::InitGoogleTest( &argc, argv ); + return RUN_ALL_TESTS(); +} diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 7428485e820..0ab56717545 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -54,7 +54,8 @@ VTKPolyDataWriterInterface::VTKPolyDataWriterInterface( string name ): m_requireFieldRegistrationCheck( true ), m_previousCycle( -1 ), m_outputMode( VTKOutputMode::BINARY ), - m_outputRegionType( VTKRegionTypes::ALL ) + m_outputRegionType( VTKRegionTypes::ALL ), + m_writeFaceElementsAs3D( false ) {} static int @@ -337,15 +338,20 @@ getWell( WellElementSubRegion const & subRegion, * @brief Gets the cell connectivities and the vertices coordinates as VTK objects for a specific FaceElementSubRegion. * @param[in] subRegion the FaceElementSubRegion to be output * @param[in] nodeManager the NodeManager associated with the DomainPartition being written. + * @param[in] faceManager the faceManager associated with the DomainPartition being written. * @return a pair containing a VTKPoints (with the information on the vertices and their coordinates) * and a VTKCellArray (with the cell connectivities). */ static ElementData getSurface( FaceElementSubRegion const & subRegion, - NodeManager const & nodeManager ) + NodeManager const & nodeManager, + FaceManager const & faceManager, + bool const writeFaceElementsAs3D ) { // Get unique node set composing the surface + auto & elemToFaces = subRegion.faceList(); auto & elemToNodes = subRegion.nodeList(); + auto & faceToNodes = faceManager.nodeList(); auto cellArray = vtkSmartPointer< vtkCellArray >::New(); cellArray->SetNumberOfCells( subRegion.size() ); @@ -361,14 +367,15 @@ getSurface( FaceElementSubRegion const & subRegion, for( localIndex ei = 0; ei < subRegion.size(); ei++ ) { - auto const & nodes = elemToNodes[ei]; + // we use the nodes of face 0 + auto const & nodes = !writeFaceElementsAs3D ? faceToNodes[elemToFaces( ei, 0 )] : elemToNodes[ei]; auto const numNodes = nodes.size(); ElementType const elementType = subRegion.getElementType( ei ); std::vector< int > vtkOrdering; - if( elementType == ElementType::Polygon ) + if( elementType == ElementType::Polygon || writeFaceElementsAs3D ) { - vtkOrdering.resize( nodes.size() ); + vtkOrdering.resize( numNodes ); std::iota( vtkOrdering.begin(), vtkOrdering.end(), 0 ); } else @@ -377,11 +384,16 @@ getSurface( FaceElementSubRegion const & subRegion, } connectivity.clear(); - for( int const & ordering: vtkOrdering ) + for( int const & ordering : vtkOrdering ) { auto const & VTKIndexPos = geosx2VTKIndexing.find( nodes[ordering] ); if( VTKIndexPos == geosx2VTKIndexing.end() ) { + /// If the node is not found in the geosx2VTKIndexing map: + /// 1. we assign the current value of nodeIndexInVTK to this node in the map (geosx2VTKIndexing[nodes[ordering]] = + /// nodeIndexInVTK++). + /// 2. we increment nodeIndexInVTK to ensure the next new node gets a unique index. + /// 3. we add this new VTK node index to the connectivity vector (connectivity.push_back). connectivity.push_back( geosx2VTKIndexing[nodes[ordering]] = nodeIndexInVTK++ ); } else @@ -1095,6 +1107,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, + FaceManager const & faceManager, string const & path ) const { elemManager.forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion const & region ) @@ -1112,7 +1125,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, case SurfaceElementRegion::SurfaceSubRegionType::faceElement: { auto const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - return getSurface( subRegion, nodeManager ); + return getSurface( subRegion, nodeManager, faceManager, m_writeFaceElementsAs3D ); } default: { @@ -1314,6 +1327,7 @@ void VTKPolyDataWriterInterface::write( real64 const time, ElementRegionManager const & elemManager = meshLevel.getElemManager(); ParticleManager const & particleManager = meshLevel.getParticleManager(); NodeManager const & nodeManager = meshLevel.getNodeManager(); + FaceManager const & faceManager = meshLevel.getFaceManager(); EmbeddedSurfaceNodeManager const & embSurfNodeManager = meshLevel.getEmbSurfNodeManager(); string const & meshBodyName = meshBody.getName(); @@ -1339,7 +1353,7 @@ void VTKPolyDataWriterInterface::write( real64 const time, } if( m_outputRegionType == VTKRegionTypes::SURFACE || m_outputRegionType == VTKRegionTypes::ALL ) { - writeSurfaceElementRegions( time, elemManager, nodeManager, embSurfNodeManager, meshDir ); + writeSurfaceElementRegions( time, elemManager, nodeManager, embSurfNodeManager, faceManager, meshDir ); } if( m_outputRegionType == VTKRegionTypes::PARTICLE || m_outputRegionType == VTKRegionTypes::ALL ) { diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 1baa383407c..a70107b2699 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -36,6 +36,7 @@ class EmbeddedSurfaceNodeManager; class ElementRegionManager; class NodeManager; class ParticleManager; +class FaceManager; namespace vtk { @@ -89,6 +90,15 @@ class VTKPolyDataWriterInterface m_writeGhostCells = writeGhostCells; } + /** + * @brief Defines whether in the vtk output facelements should be 2D or 3D + * @param writeFaceElementsAs3D The boolean flag. + */ + void setWriteFaceElementsAs3D( bool writeFaceElementsAs3D ) + { + m_writeFaceElementsAs3D = writeFaceElementsAs3D; + } + /** * @brief Sets the plot level * @details All fields have an associated plot level. If it is <= to \p plotLevel, @@ -244,16 +254,17 @@ class VTKPolyDataWriterInterface * @brief Writes the files containing the faces elements * @details There will be one file written per FaceElementRegion and per rank * @param[in] time the time-step - * @param[in] cycle the current cycle number * @param[in] elemManager the ElementRegionManager containing the FaceElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output - * @param[in] meshLevelName the name of the MeshLevel containing the nodes and elements to be output - * @param[in] meshBodyName the name of the MeshBody containing the nodes and elements to be output + * @param[in] embSurfNodeManager the embedded surface node Manager. + * @param[in] faceManager the faceManager. + * @param[in] path the path to the output file. */ void writeSurfaceElementRegions( real64 time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, + FaceManager const & faceManager, string const & path ) const; /** @@ -337,6 +348,9 @@ class VTKPolyDataWriterInterface /// Region output type, could be CELL, WELL, SURFACE, or ALL VTKRegionTypes m_outputRegionType; + + /// Defines whether to plot a faceElement as a 3D volumetric element or not. + bool m_writeFaceElementsAs3D; }; } // namespace vtk diff --git a/src/coreComponents/finiteElement/unitTests/CMakeLists.txt b/src/coreComponents/finiteElement/unitTests/CMakeLists.txt index a8f044271be..0360038c17f 100644 --- a/src/coreComponents/finiteElement/unitTests/CMakeLists.txt +++ b/src/coreComponents/finiteElement/unitTests/CMakeLists.txt @@ -12,7 +12,7 @@ set(testSources set( dependencyList gtest finiteElement ${parallelDeps} ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp index 0de8fcf2a6f..df572350aba 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp @@ -219,9 +219,8 @@ CellElementStencilTPFAWrapper:: real64 (& weight)[1][2], real64 (& dWeight_dVar )[1][2] ) const { - GEOS_UNUSED_VAR( dCoeff_dVar ); - real64 halfWeight[2]; + real64 dHalfWeight_dVar[2]; // real64 const tolerance = 1e-30 * lengthTolerance; // TODO: choice of constant based on physics? @@ -232,6 +231,7 @@ CellElementStencilTPFAWrapper:: localIndex const ei = m_elementIndices[iconn][i]; halfWeight[i] = m_weights[iconn][i]; + dHalfWeight_dVar[i] = m_weights[iconn][i]; // Proper computation real64 faceNormal[3]; @@ -242,8 +242,11 @@ CellElementStencilTPFAWrapper:: } real64 faceConormal[3]; + real64 dFaceConormal_dVar[3]; LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er][esr][ei][0], faceNormal ); + LvArray::tensorOps::hadamardProduct< 3 >( dFaceConormal_dVar, dCoeff_dVar[er][esr][ei][0], faceNormal ); halfWeight[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], faceConormal ); + dHalfWeight_dVar[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], dFaceConormal_dVar ); // correct negative weight issue arising from non-K-orthogonal grids if( halfWeight[i] < 0.0 ) @@ -251,8 +254,13 @@ CellElementStencilTPFAWrapper:: LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er][esr][ei][0], m_cellToFaceVec[iconn][i] ); + LvArray::tensorOps::hadamardProduct< 3 >( dFaceConormal_dVar, + dCoeff_dVar[er][esr][ei][0], + m_cellToFaceVec[iconn][i] ); halfWeight[i] = m_weights[iconn][i]; + dHalfWeight_dVar[i] = m_weights[iconn][i]; halfWeight[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], faceConormal ); + dHalfWeight_dVar[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], dFaceConormal_dVar ); } } @@ -263,16 +271,25 @@ CellElementStencilTPFAWrapper:: real64 const harmonicWeight = sum > 0 ? product / sum : 0.0; real64 const arithmeticWeight = sum / 2; + real64 dHarmonicWeight_dVar[2]; + real64 dArithmeticWeight_dVar[2]; + + dHarmonicWeight_dVar[0] = sum > 0 ? (dHalfWeight_dVar[0]*sum*halfWeight[1] - dHalfWeight_dVar[0]*halfWeight[0]*halfWeight[1]) / ( sum*sum ) : 0.0; + dHarmonicWeight_dVar[1] = sum > 0 ? (dHalfWeight_dVar[1]*sum*halfWeight[0] - dHalfWeight_dVar[1]*halfWeight[1]*halfWeight[0]) / ( sum*sum ) : 0.0; + + dArithmeticWeight_dVar[0] = dHalfWeight_dVar[0] / 2; + dArithmeticWeight_dVar[1] = dHalfWeight_dVar[1] / 2; + real64 const meanPermCoeff = 1.0; //TODO make it a member if it is really necessary real64 const value = meanPermCoeff * harmonicWeight + (1 - meanPermCoeff) * arithmeticWeight; for( localIndex ke = 0; ke < 2; ++ke ) { weight[0][ke] = m_transMultiplier[iconn] * value * (ke == 0 ? 1 : -1); - } - dWeight_dVar[0][0] = 0.0; - dWeight_dVar[0][1] = 0.0; + real64 const dValue_dVar = meanPermCoeff * dHarmonicWeight_dVar[ke] + (1 - meanPermCoeff) * dArithmeticWeight_dVar[ke]; + dWeight_dVar[0][ke] = m_transMultiplier[iconn] * dValue_dVar; + } } GEOS_HOST_DEVICE diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index 0f509669063..3830cf52cc1 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -132,11 +132,9 @@ class FluxApproximationBase : public dataRepository::Group * @brief Add a new fracture stencil. * @param[in,out] mesh the mesh on which to add the fracture stencil * @param[in] faceElementRegionName the face element region name - * @param[in] initFields if true initialize physical fields, like pressure */ virtual void addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const = 0; + string const & faceElementRegionName ) const = 0; /** * @brief Add a new embedded fracture stencil. diff --git a/src/coreComponents/finiteVolume/StencilBase.hpp b/src/coreComponents/finiteVolume/StencilBase.hpp index 7113f1d148e..d469f384961 100644 --- a/src/coreComponents/finiteVolume/StencilBase.hpp +++ b/src/coreComponents/finiteVolume/StencilBase.hpp @@ -13,7 +13,7 @@ */ /** - * @file CellElementStencilTPFA.hpp + * @file StencilBase.hpp */ #ifndef GEOS_FINITEVOLUME_STENCILBASE_HPP_ diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp index 62f07d7dc51..714ac59115d 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp @@ -24,25 +24,6 @@ namespace geos { -/// @cond DO_NOT_DOCUMENT -// TODO remove! This option allows for the creation of new mass inside a newly -// created FaceElement. The new mass will be equal to: -// creationMass = defaultDensity * defaultAperture * faceArea. -// If 0, then the beginning of step density is artificially set to zero...which -// may cause some newton convergence problems. -#define ALLOW_CREATION_MASS 1 - - -// TODO remove! This option sets the pressure in a newly created FaceElement to -// be the lowest value of all attached non-new FaceElements. -#define SET_CREATION_PRESSURE 1 - -// TODO remove! This option sets the nodal displacements attached a newly -// created FaceElement to some scalar fraction of the aperture of the -// lowest attached non-new FaceElements. -#define SET_CREATION_DISPLACEMENT 0 -/// @endcond - /** * @brief Describes properties of SurfaceElementStencil. * diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index 8e96749683a..d4d2ce4c3cf 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -282,11 +282,6 @@ void TwoPointFluxApproximation::addFractureFractureConnectionsDFM( MeshLevel & m hydraulicAperture, fractureRegionIndex, elemGhostRank, -#if SET_CREATION_DISPLACEMENT==1 - faceToNodesMap, - totalDisplacement, - aperture, -#endif &fractureStencil] ( localIndex const k ) { @@ -365,237 +360,6 @@ void TwoPointFluxApproximation::addFractureFractureConnectionsDFM( MeshLevel & m } ); } -void TwoPointFluxApproximation::initNewFractureFieldsDFM( MeshLevel & mesh, - string const & faceElementRegionName ) const -{ - // TODO Note that all of this initialization should be performed elsewhere. - // This is just here because it was convenient, but it is not appropriate - // to have physics based initialization in the flux approximator. - -#if !defined(SET_CREATION_DISPLACEMENT) - static_assert( true, "must have SET_CREATION_DISPLACEMENT defined" ); -#endif - -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - -#if !defined(SET_CREATION_PRESSURE) - static_assert( true, "must have SET_CREATION_PRESSURE defined" ); -#endif - - ElementRegionManager & elemManager = mesh.getElemManager(); - ElementRegionManager::ElementViewAccessor< arrayView1d< integer const > > const elemGhostRank = - elemManager.constructArrayViewAccessor< integer, 1 >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); - - SurfaceElementRegion & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( faceElementRegionName ); - localIndex const fractureRegionIndex = fractureRegion.getIndexInParent(); - FaceElementSubRegion & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = fractureSubRegion.m_2dFaceTo2dElems.toViewConst(); -#if SET_CREATION_DISPLACEMENT==1 - NodeManager & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); - ArrayOfArraysView< localIndex const > const & faceToNodesMap = faceManager.nodeList(); - FaceElementSubRegion::FaceMapType const & faceMap = fractureSubRegion.faceList(); - array2dLayoutIncrDisplacementConst const incrementalDisplacement = - nodeManager.getField< fields::solidMechanics::incrementalDisplacement >(); - array2dLayoutTotalDisplacementConst const totalDisplacement = - nodeManager.getField< fields::solidMechanics::totalDisplacement >(); - arrayView1d< real64 > const aperture = fractureSubRegion.getReference< array1d< real64 > >( "elementAperture" ); -#endif - -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT - arrayView1d< real64 > const apertureF = fractureSubRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); -#endif - -#if ALLOW_CREATION_MASS==0 - arrayView1d< real64 > const dens = fractureSubRegion.getReference< array1d< real64 > >( "density_n" ); -#endif - -#if SET_CREATION_PRESSURE==1 - arrayView1d< real64 > const fluidPressure_n = fractureSubRegion.getField< fields::flow::pressure_n >(); - arrayView1d< real64 > const fluidPressure = fractureSubRegion.getField< fields::flow::pressure >(); - // Set the new face elements to some unphysical numbers to make sure they get set by the following routines. - SortedArrayView< localIndex const > const newFaceElements = fractureSubRegion.m_newFaceElements.toViewConst(); - - forAll< serialPolicy >( fractureSubRegion.m_newFaceElements.size(), [=]( localIndex const k ) - { - localIndex const kfe = newFaceElements[k]; - fluidPressure[kfe] = 1.0e99; -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT - apertureF[kfe] = aperture[kfe]; -#endif -#if SET_CREATION_DISPLACEMENT==1 - aperture[kfe] = 1.0e99; -#endif - } ); - -#endif // SET_CREATION_PRESSURE - - SortedArray< localIndex > allNewElems; - allNewElems.insert( fractureSubRegion.m_newFaceElements.begin(), - fractureSubRegion.m_newFaceElements.end() ); - SortedArrayView< localIndex const > const recalculateFractureConnectorEdges = fractureSubRegion.m_recalculateConnectionsFor2dFaces.toViewConst(); - - // add new connectors/connections between face elements to the fracture stencil - forAll< serialPolicy >( recalculateFractureConnectorEdges.size(), - [ &allNewElems, - recalculateFractureConnectorEdges, - fractureConnectorsToFaceElements, - fractureRegionIndex, - elemGhostRank, - fluidPressure, - fluidPressure_n, -#if SET_CREATION_DISPLACEMENT==1 - faceToNodesMap, - totalDisplacement, - aperture, -#endif - &fractureSubRegion - ] - ( localIndex const k ) - { - localIndex const fci = recalculateFractureConnectorEdges[k]; - localIndex const numElems = fractureConnectorsToFaceElements.sizeOfArray( fci ); -#if SET_CREATION_PRESSURE==1 - real64 initialPressure = 1.0e99; -#endif -#if SET_CREATION_DISPLACEMENT==1 - real64 initialAperture = 1.0e99; -#endif - SortedArray< localIndex > newElems; - bool containsLocalElement = false; - - // loop over all face elements attached to the connector and add them to the stencil - for( localIndex kfe=0; kfe( totalDisplacement[node0] ) ) > 1.0e-99 && - LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) - { - zeroDisp = false; - } - } - if( zeroDisp ) - { - aperture[newElemIndex] = 0; - } -#endif - } - } ); - - SortedArray< localIndex > touchedNodes; - forAll< serialPolicy >( allNewElems.size(), - [ &allNewElems - , fluidPressure - , fluidPressure_n -#if SET_CREATION_DISPLACEMENT==1 - , aperture - , faceMap - , faceNormal - , faceToNodesMap - , &touchedNodes - , incrementalDisplacement - , totalDisplacement - , this -#endif - ]( localIndex const k ) - { - localIndex const newElemIndex = allNewElems[k]; - // if the value of pressure was not set, then set it to zero and punt. - if( fluidPressure[newElemIndex] > 1.0e98 ) - { - fluidPressure[newElemIndex] = 0.0; - } - fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; -#if ALLOW_CREATION_MASS==0 - // set the initial density of the face element to 0 to enforce mass conservation ( i.e. no creation of mass) - dens[newElemIndex] = 0.0; -#endif -#if SET_CREATION_DISPLACEMENT==1 - // If the aperture has been set, then we can set the estimate of displacements. - if( aperture[newElemIndex] < 1e98 ) - { - localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); - localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); - - real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); - LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); - localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); - for( localIndex a=0; a( incrementalDisplacement[node0], newDisp ); - LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); - LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); - LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); - } - } - } - if( this->getLogLevel() > 1 ) - { - printf( "New elem index, init aper, init press = %4ld, %4.2e, %4.2e \n", - newElemIndex, - aperture[newElemIndex], - fluidPressure[newElemIndex] ); - } -#endif - } ); -} - void TwoPointFluxApproximation::cleanMatrixMatrixConnectionsDFM( MeshLevel & mesh, string const & faceElementRegionName ) const { @@ -761,17 +525,11 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsDFM( MeshLevel & mes } void TwoPointFluxApproximation::addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const + string const & faceElementRegionName ) const { this->addFractureFractureConnectionsDFM( mesh, faceElementRegionName ); this->cleanMatrixMatrixConnectionsDFM( mesh, faceElementRegionName ); this->addFractureMatrixConnectionsDFM( mesh, faceElementRegionName ); - - if( initFields ) - { - this->initNewFractureFieldsDFM( mesh, faceElementRegionName ); - } } void TwoPointFluxApproximation::addFractureMatrixConnectionsEDFM( MeshLevel & mesh, diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp index 8820dd4a388..1cbd8453763 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp @@ -73,8 +73,7 @@ class TwoPointFluxApproximation : public FluxApproximationBase virtual void registerFractureStencil( Group & stencilGroup ) const override; virtual void addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const override; + string const & faceElementRegionName ) const override; virtual void registerBoundaryStencil( Group & stencilGroup, string const & setName ) const override; diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 5c2fb4b6eb1..da135084f3e 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -60,12 +60,6 @@ class FunctionBase : public dataRepository::Group */ virtual ~FunctionBase() override = default; - /** - * @brief Static Factory Catalog Functions - * @return the catalog name - */ - static string catalogName() { return "FunctionBase"; } - /** * @brief Function initialization */ diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 0a8751c28ab..3fa60e36e92 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -177,7 +177,10 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; GEOS_THROW_IF( coord > upperBound || coord < lowerBound, GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", - getDataContext(), units::formatValue( coord, getDimUnit( dim ) ), lowerBound, upperBound ), + getDataContext(), + units::formatValue( coord, getDimUnit( dim ) ), + units::formatValue( lowerBound, getDimUnit( dim ) ), + units::formatValue( upperBound, getDimUnit( dim ) ) ), SimulationError ); } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index 6063db453c3..886d0a8b009 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -203,6 +203,7 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 16 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, toUnderlying( AMGCoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( solver.ptr, 2 ) ); @@ -225,11 +226,12 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGCreate( &solver.ptr ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( solver.ptr, 1 ) ); - // TODO: keep or not 1 aggressive level? - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 1 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 1 ) ); // TODO: keep or not 1 aggressive level? + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 16 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( solver.ptr, 2 ) ); // pressure and temperature (CPTR) #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, toUnderlying( AMGCoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( solver.ptr, 2 ) ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index a6ed6bbd705..ca99a2e832f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -182,6 +182,7 @@ void createAMG( LinearSolverParameters const & params, GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumPaths( precond.ptr, params.amg.aggressiveNumPaths ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( precond.ptr, params.amg.aggressiveNumLevels ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggInterpType( precond.ptr, aggInterpType ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( precond.ptr, params.amg.aggressiveInterpMaxNonZeros ) ); } // Set coarsest level solver diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index 4c0f16f5766..241593eed7f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -70,8 +70,7 @@ class CompositionalMultiphaseFVM : public MGRStrategyBase< 2 > m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; + m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::injection; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index 091e55857b1..7c2f53c845a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -79,8 +79,7 @@ class CompositionalMultiphaseHybridFVM : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; + m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::jacobi; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index 2c994aef5e3..55b8cfef2a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -91,8 +91,7 @@ class CompositionalMultiphaseReservoirFVM : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index 929c02d598c..37ea6379208 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -99,8 +99,7 @@ class CompositionalMultiphaseReservoirHybridFVM : public MGRStrategyBase< 4 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index c8a9c878213..22cda3aa388 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -87,8 +87,7 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 22b3843b4d6..46397b4519f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -107,8 +107,7 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::none; // Level 3 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; //default, i.e. Jacobi - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[3] = MGRFRelaxationType::none; m_levelInterpType[3] = MGRInterpolationType::injection; m_levelRestrictType[3] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[3] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp index 38792f6baff..03eec16db7e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp @@ -65,8 +65,7 @@ class ReactiveCompositionalMultiphaseOBL : public MGRStrategyBase< 1 > setupLabels(); - m_levelFRelaxType[0] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[0] = 1; + m_levelFRelaxType[0] = MGRFRelaxationType::none; m_levelInterpType[0] = MGRInterpolationType::injection; m_levelRestrictType[0] = MGRRestrictionType::injection; m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::cprLikeBlockDiag; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index 0dfb0b0ec88..65341d2ba90 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -38,15 +38,15 @@ namespace mgr * dofLabel: 0 = displacement, x-component * dofLabel: 1 = displacement, y-component * dofLabel: 2 = displacement, z-component - * dofLabel: 3 = pressure (cell elem + fracture elems) - * dofLabel: 4 = face-centered lagrange multiplier (tn) - * dofLabel: 5 = face-centered lagrange multiplier (tt1) - * dofLabel: 6 = face-centered lagrange multiplier (tt2) + * dofLabel: 3 = face-centered lagrange multiplier (tn) + * dofLabel: 4 = face-centered lagrange multiplier (tt1) + * dofLabel: 5 = face-centered lagrange multiplier (tt2) + * dofLabel: 6 = pressure (cell elem + fracture elems) * * Ingredients: - * 1. Level 1: F-points displacement (4,5,6), C-points pressure (0,1,2,3) - * 2. Level 2: F-points displacement (0,1,2), C-points pressure (3) + * 1. Level 1: F-points displacement (3,4,5), C-points pressure (0,1,2,6) + * 2. Level 2: F-points displacement (0,1,2), C-points pressure (6) * 2. F-points smoother: BoomerAMG, single V-cycle * 3. C-points coarse-grid/Schur complement solver: BoomerAMG * 4. Global smoother: none @@ -66,9 +66,9 @@ class SinglePhasePoromechanicsConformingFractures : public MGRStrategyBase< 2 > m_labels[0].push_back( 0 ); m_labels[0].push_back( 1 ); m_labels[0].push_back( 2 ); - m_labels[0].push_back( 3 ); + m_labels[0].push_back( 6 ); // we keep p - m_labels[1].push_back( 3 ); + m_labels[1].push_back( 6 ); setupLabels(); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp index 0cea36ca96e..5870bb0cc37 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp @@ -70,13 +70,12 @@ class ThermalCompositionalMultiphaseFVM : public MGRStrategyBase< 2 > m_levelFRelaxIters[0] = 1; m_levelInterpType[0] = MGRInterpolationType::jacobi; // Diagonal scaling (Jacobi) m_levelRestrictType[0] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; // Standard Galerkin + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::blockGaussSeidel; m_levelGlobalSmootherIters[0] = 1; - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; - m_levelInterpType[1] = MGRInterpolationType::injection; // Injection + m_levelFRelaxType[1] = MGRFRelaxationType::none; + m_levelInterpType[1] = MGRInterpolationType::injection; m_levelRestrictType[1] = MGRRestrictionType::injection; m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::cprLikeBlockDiag; // Non-Galerkin Quasi-IMPES CPR m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::ilu0; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 68ea0e4cf10..bf12729ff28 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -90,8 +90,7 @@ class ThermalMultiphasePoromechanics : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::injection; m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::cprLikeBlockDiag; diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index da8d734d661..63d8dbe2f8d 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -50,6 +50,7 @@ LinearSolverParameters params_GMRES() LinearSolverParameters parameters; parameters.krylov.relTolerance = 1e-8; parameters.krylov.maxIterations = 500; + parameters.krylov.maxRestart = 100; parameters.solverType = geos::LinearSolverParameters::SolverType::gmres; return parameters; } diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 881fcc9984c..bdcf1de4eb2 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -116,7 +116,11 @@ struct LinearSolverParameters { real64 relTolerance = 1e-6; ///< Relative convergence tolerance for iterative solvers integer maxIterations = 200; ///< Max iterations before declaring convergence failure - integer maxRestart = 200; ///< Max number of vectors in Krylov basis before restarting +#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + integer maxRestart = 50; ///< Max number of vectors in Krylov basis before restarting (GPUs) +#else + integer maxRestart = 200; ///< Max number of vectors in Krylov basis before restarting (CPUs) +#endif integer useAdaptiveTol = false; ///< Use Eisenstat-Walker adaptive tolerance real64 weakestTol = 1e-3; ///< Weakest allowed tolerance when using adaptive method } @@ -227,12 +231,12 @@ struct LinearSolverParameters rigidBodyModes ///< Rigid body modes }; -#if defined(GEOSX_USE_HYPRE_CUDA) || defined(GEOSX_USE_HYPRE_HIP) - CoarseningType coarseningType = CoarseningType::PMIS; ///< Coarsening algorithm - SmootherType smootherType = SmootherType::l1jacobi; ///< Smoother type +#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + CoarseningType coarseningType = CoarseningType::PMIS; ///< Coarsening algorithm (GPUs) + SmootherType smootherType = SmootherType::l1jacobi; ///< Smoother type (GPUs) #else - CoarseningType coarseningType = CoarseningType::HMIS; ///< Coarsening algorithm - SmootherType smootherType = SmootherType::l1sgs; ///< Smoother type + CoarseningType coarseningType = CoarseningType::HMIS; ///< Coarsening algorithm (CPUs) + SmootherType smootherType = SmootherType::l1sgs; ///< Smoother type (CPUs) #endif integer maxLevels = 20; ///< Maximum number of coarsening levels @@ -246,6 +250,7 @@ struct LinearSolverParameters integer aggressiveNumPaths = 1; ///< Number of paths agg. coarsening. integer aggressiveNumLevels = 0; ///< Number of levels for aggressive coarsening. AggInterpType aggressiveInterpType = AggInterpType::multipass; ///< Interp. type for agg. coarsening. + integer aggressiveInterpMaxNonZeros = 16; ///< Aggressive Interpolation - Max. nonzeros/row. PreOrPost preOrPostSmoothing = PreOrPost::both; ///< Pre and/or post smoothing real64 threshold = 0.0; ///< Threshold for "strong connections" (for classical ///< and smoothed-aggregation AMG) diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 3e677e9c4c8..0d86412e41f 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -79,7 +79,7 @@ ProblemManager::ProblemManager( conduit::Node & root ): registerGroup< MeshManager >( groupKeys.meshManager ); registerGroup< OutputManager >( groupKeys.outputManager ); m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); - registerGroup< TasksManager >( groupKeys.tasksManager ); + m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); // Command line entries @@ -683,13 +683,21 @@ void ProblemManager::generateMesh() FaceManager & faceManager = meshLevel.getFaceManager(); EdgeManager & edgeManager = meshLevel.getEdgeManager(); NodeManager const & nodeManager = meshLevel.getNodeManager(); + ElementRegionManager & elementManager = meshLevel.getElemManager(); - // The computation of geometric quantities is now possible for `FaceElementSubRegion`, - // because the ghosting ensures that the neighbor cells of the fracture elements are available. - // These neighbor cells are providing the node information to the fracture elements. - meshLevel.getElemManager().forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { + /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, + // because the ghosting ensures that the neighbor cells of the fracture elements are available. + // These neighbor cells are providing the node information to the fracture elements. subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + + // 2. Reorder the face map based on global numbering of neighboring cells + subRegion.flipFaceMap( faceManager, elementManager ); + + // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the + // direction of the fracture. + subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); } ); faceManager.setIsExternal(); diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index aaeb01951da..00a453c34ea 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MAININTERFACE_PROBLEMMANAGER_HPP_ #define GEOS_MAININTERFACE_PROBLEMMANAGER_HPP_ -#include "events/EventManager.hpp" +#include "dataRepository/Group.hpp" namespace geos { @@ -34,6 +34,8 @@ namespace constitutive { class ConstitutiveManager; } +class EventManager; +class TasksManager; class FunctionManager; class FieldSpecificationManager; struct CommandLineOptions; @@ -308,14 +310,20 @@ class ProblemManager : public dataRepository::Group return *m_fieldSpecificationManager; } - /** - * @brief Returns the const EventManager. - * @return The const EventManager. + * @brief Returns the EventManager. + * @return The EventManager. */ EventManager & getEventManager() {return *m_eventManager;} + /** + * @brief Returns the TasksManager. + * @return The TasksManager. + */ + TasksManager & getTasksManager() + {return *m_tasksManager;} + protected: /** * @brief Post process the command line input @@ -367,6 +375,9 @@ class ProblemManager : public dataRepository::Group /// The EventManager EventManager * m_eventManager; + /// The TasksManager + TasksManager * m_tasksManager; + /// The FunctionManager FunctionManager * m_functionManager; diff --git a/src/coreComponents/mesh/ElementRegionBase.hpp b/src/coreComponents/mesh/ElementRegionBase.hpp index 049173a74e6..15a46e407b9 100644 --- a/src/coreComponents/mesh/ElementRegionBase.hpp +++ b/src/coreComponents/mesh/ElementRegionBase.hpp @@ -214,6 +214,20 @@ class ElementRegionBase : public ObjectManagerBase template< typename CONSTITUTIVE_TYPE > string_array getConstitutiveNames() const; + /** + * @return the parent region of the given sub-region. + * @param subRegion the sub-region that we want the parent. + */ + static ElementRegionBase & getParentRegion( ElementSubRegionBase & subRegion ) + { return dynamicCast< ElementRegionBase & >( subRegion.getParent().getParent() ); } + + /** + * @return the parent region of the given sub-region. + * @param subRegion the sub-region that we want the parent. + */ + static ElementRegionBase const & getParentRegion( ElementSubRegionBase const & subRegion ) + { return dynamicCast< ElementRegionBase const & >( subRegion.getParent().getParent() ); } + ///@} diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index 6dd53dec055..d7101bfa3b8 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -40,24 +40,12 @@ void surfaceWithGhostNodes::insert( globalIndex const & edgeIndex ) EmbeddedSurfaceSubRegion::EmbeddedSurfaceSubRegion( string const & name, dataRepository::Group * const parent ): SurfaceElementSubRegion( name, parent ), - m_normalVector(), - m_tangentVector1(), - m_tangentVector2(), m_numOfJumpEnrichments( 3 ), m_connectivityIndex(), m_parentPlaneName() { m_elementType = ElementType::Polygon; - registerWrapper( viewKeyStruct::normalVectorString(), &m_normalVector ). - setDescription( "Unit normal vector to the embedded surface." ); - - registerWrapper( viewKeyStruct::t1VectorString(), &m_tangentVector1 ). - setDescription( "Unit vector in the first tangent direction to the embedded surface." ); - - registerWrapper( viewKeyStruct::t2VectorString(), &m_tangentVector2 ). - setDescription( "Unit vector in the second tangent direction to the embedded surface." ); - registerWrapper( viewKeyStruct::elementCenterString(), &m_elementCenter ). setDescription( "The center of each EmbeddedSurface element." ); diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index 95d5c649d4e..a0bf416d2a1 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -178,15 +178,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ struct viewKeyStruct : SurfaceElementSubRegion::viewKeyStruct { - /// @return Embedded surface element normal vector string - static constexpr char const * normalVectorString() { return "normalVector"; } - - /// @return Tangent vector 1 string - static constexpr char const * t1VectorString() { return "tangentVector1"; } - - /// @return Tangent vector 2 string - static constexpr char const * t2VectorString() { return "tangentVector2"; } - /// @return Connectivity index string static constexpr char const * connectivityIndexString() { return "connectivityIndex"; } @@ -216,19 +207,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ localIndex const & numOfJumpEnrichments() const {return m_numOfJumpEnrichments;} - /** - * @brief Get normal vectors. - * @return an array of normal vectors. - */ - arrayView2d< real64 const > getNormalVector() const { return m_normalVector; } - - /** - * @brief Get normal vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the normal vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getNormalVector( localIndex k ) const { return m_normalVector[k]; } - /** * @brief Get the name of the bounding plate that was used to generate fracture element k. * @param k the index of the embedded surface element @@ -236,32 +214,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ string const & getFractureName( localIndex k ) const { return m_parentPlaneName[k]; } - /** - * @brief Get an array of the first tangent vector of the embedded surface elements. - * @return an array of the first tangent vector of the embedded surface elements - */ - arrayView2d< real64 const > getTangentVector1() const { return m_tangentVector1; } - - /** - * @brief Get the first tangent vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the first tangent vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getTangentVector1( localIndex k ) const { return m_tangentVector1[k]; } - - /** - * @brief Get an array of the second tangent vector of the embedded surface elements. - * @return an array of the second tangent vector of the embedded surface elements - */ - arrayView2d< real64 const > getTangentVector2() const { return m_tangentVector2.toViewConst(); } - - /** - * @brief Get the second tangent vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the second tangent vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getTangentVector2( localIndex k ) const { return m_tangentVector2[k];} - /** * @brief Get the connectivity index of the embedded surface element. * @return the connectivity index @@ -294,15 +246,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion localIndex packUpDownMapsImpl( buffer_unit_type * & buffer, arrayView1d< localIndex const > const & packList ) const; - /// normal vector to the embedded surface element - array2d< real64 > m_normalVector; - - // tangential direction 1 - array2d< real64 > m_tangentVector1; - - // tangential direction 2 - array2d< real64 > m_tangentVector2; - /// The number of jump enrichments localIndex m_numOfJumpEnrichments; diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 4c9b6cd7157..bcef879113d 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -1048,4 +1048,104 @@ std::set< std::set< globalIndex > > FaceElementSubRegion::getCollocatedNodes() c return result; } +void FaceElementSubRegion::flipFaceMap( FaceManager & faceManager, + ElementRegionManager const & elemManager ) +{ + ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); + arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); + arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > const cellElemGlobalIndex = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( ObjectManagerBase::viewKeyStruct::localToGlobalMapString() ); + + forAll< parallelHostPolicy >( this->size(), [=]( localIndex const kfe ) + { + if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + { + return; + } + + localIndex & f0 = elems2dToFaces[kfe][0]; + localIndex & f1 = elems2dToFaces[kfe][1]; + + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; + + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; + + globalIndex const globalIndexElem0 = cellElemGlobalIndex[er0][esr0][ek0]; + globalIndex const globalIndexElem1 = cellElemGlobalIndex[er1][esr1][ek1]; + + if( globalIndexElem0 > globalIndexElem1 ) + { + std::swap( f0, f1 ); + } + } ); + +} + +void FaceElementSubRegion::fixNeighboringFacesNormals( FaceManager & faceManager, + ElementRegionManager const & elemManager ) +{ + ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); + arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); + arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); + + arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + FaceManager::NodeMapType & faceToNodes = faceManager.nodeList(); + + auto elemCenter = elemManager.constructArrayViewAccessor< real64, 2 >( CellElementSubRegion::viewKeyStruct::elementCenterString() ); + + // We need to modify the normals and the nodes ordering to be consistent. + arrayView2d< real64 > const faceNormal = faceManager.faceNormal(); + forAll< parallelHostPolicy >( this->size(), [=, &faceToNodes]( localIndex const kfe ) + { + if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + { + return; + } + + localIndex const f0 = elems2dToFaces[kfe][0]; + localIndex const f1 = elems2dToFaces[kfe][1]; + + /// Note: I am assuming that the 0 element is the elementSubregion one for faces + /// touching both a 3D and a 2D cell. + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; + + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; + + real64 f0e0vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f0] ); + real64 f1e1vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f1] ); + + LvArray::tensorOps::subtract< 3 >( f0e0vector, elemCenter[er0][esr0][ek0] ); + LvArray::tensorOps::subtract< 3 >( f1e1vector, elemCenter[er1][esr1][ek1] ); + + // If the vector connecting the face center and the elem center is in the same + // direction as the unit normal, we flip the normal coz it should be pointing outward + // (i.e., towards the fracture element). + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f0], f0e0vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf0 of face {}", kfe, f0 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f0], -1.0 ); + std::reverse( faceToNodes[f0].begin(), faceToNodes[f0].end() ); + } + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f1], f1e1vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf1 of face {}", kfe, f1 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f1], -1.0 ); + std::reverse( faceToNodes[f1].begin(), faceToNodes[f1].end() ); + } + } ); + +} + } /* namespace geos */ diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 262f0aeeba5..4823f96ce8b 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -133,6 +133,30 @@ class FaceElementSubRegion : public SurfaceElementSubRegion void inheritGhostRankFromParentFace( FaceManager const & faceManager, std::set< localIndex > const & indices ); + /** + * @brief Function to flip the face normals of faces adjacent to the faceElements if they are not pointing in the direction of the + * fracture. + * @param faceManager The face manager group + * @param elemManager The element region manager + * @details We want to flip the normals of the faces neighboring the fracture element. To do so, we check + * if the vector connecting the face center and the element center of the neighboring 3d cell is in the same + * direction as the unit normal of the face. If they are not, we flip the normal because it should be pointing outward + * (i.e., towards the fracture element). + */ + void fixNeighboringFacesNormals( FaceManager & faceManager, + ElementRegionManager const & elemManager ); + + /** + * @brief Function to flip the face map based on the gloal index of the nighboring elements + * @param faceManager The face manager group + * @param elemManager The element region manager + * @details In order to keep a consistent normal between multi processors ranks, we force the faces to be ordered + * based on the global numbering of the 3d elements attached to each face. The first face is always the one + * attached to the 3d cell with the smallest globalIndex. + */ + void flipFaceMap( FaceManager & faceManager, + ElementRegionManager const & elemManager ); + /** * @brief Struct containing the keys to all face element views. * @struct viewKeyStruct diff --git a/src/coreComponents/mesh/MeshFields.hpp b/src/coreComponents/mesh/MeshFields.hpp index 1b4cca146b3..f6b46623836 100644 --- a/src/coreComponents/mesh/MeshFields.hpp +++ b/src/coreComponents/mesh/MeshFields.hpp @@ -114,6 +114,14 @@ DECLARE_FIELD( elementAperture, WRITE_AND_READ, "Element aperture." ); +DECLARE_FIELD( elementArea, + "elementArea", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Element area." ); + DECLARE_FIELD( parentIndex, "parentIndex", array1d< localIndex >, @@ -146,6 +154,30 @@ DECLARE_FIELD( ruptureTime, WRITE_AND_READ, "Time that the object was ruptured/split." ); +DECLARE_FIELD( normalVector, + "normalVector", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit normal vector to the surface." ); + +DECLARE_FIELD( tangentVector1, + "tangentVector1", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit vector in the first tangent direction to the surface." ); + +DECLARE_FIELD( tangentVector2, + "tangentVector2", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit vector in the second tangent direction to the surface." ); + } // namespace fields } // namespace geos diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 021e914310e..8d5b0b167e3 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -76,7 +76,7 @@ void SurfaceElementRegion::initializePreSubGroups() { this->forElementSubRegions< SurfaceElementSubRegion >( [&] ( SurfaceElementSubRegion & subRegion ) { - subRegion.getWrapper< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::elementApertureString() ). + subRegion.getWrapper< array1d< real64 > >( fields::elementAperture::key() ). setApplyDefaultValue( m_defaultAperture ); } ); } @@ -170,9 +170,9 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, for( localIndex ke = 0; ke < 2; ++ke ) { - localIndex const & er = faceToElementRegion[faceIndices[ke]][ke]; - localIndex const & esr = faceToElementSubRegion[faceIndices[ke]][ke]; - localIndex const & ei = faceToElementIndex[faceIndices[ke]][ke]; + localIndex const er = faceToElementRegion[faceIndices[ke]][ke]; + localIndex const esr = faceToElementSubRegion[faceIndices[ke]][ke]; + localIndex const ei = faceToElementIndex[faceIndices[ke]][ke]; if( er != -1 && esr != -1 && ei != -1 ) { diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 8261deb0bae..23c7e59eee6 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -20,6 +20,7 @@ #include "SurfaceElementSubRegion.hpp" #include "ElementRegionManager.hpp" +#include "MeshFields.hpp" namespace geos { @@ -34,7 +35,10 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, m_toNodesRelation(), m_toEdgesRelation(), m_elementAperture(), - m_elementArea() + m_elementArea(), + m_normalVector(), + m_tangentVector1(), + m_tangentVector2() { registerWrapper( viewKeyStruct::nodeListString(), &m_toNodesRelation ). setDescription( "Map to the nodes attached to each SurfaceElement." ); @@ -54,21 +58,24 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, setPlotLevel( PlotLevel::NOPLOT ). setDescription( "A map of face element local indices to the cell local indices" ); - registerWrapper( viewKeyStruct::elementApertureString(), &m_elementAperture ). - setApplyDefaultValue( 1.0e-5 ). - setPlotLevel( dataRepository::PlotLevel::LEVEL_0 ). - setDescription( "The aperture of each SurfaceElement." ); - - registerWrapper( viewKeyStruct::elementAreaString(), &m_elementArea ). - setApplyDefaultValue( -1.0 ). - setPlotLevel( dataRepository::PlotLevel::LEVEL_2 ). - setDescription( "The area of each SurfaceElement." ); - registerWrapper< real64_array >( viewKeyStruct::creationMassString() ). setApplyDefaultValue( 0.0 ). setPlotLevel( dataRepository::PlotLevel::LEVEL_1 ). setDescription( "The amount of remaining mass that was introduced when the SurfaceElement was created." ); + registerField( fields::elementAperture{}, &m_elementAperture ); + + registerField( fields::elementArea{}, &m_elementArea ); + + registerField( fields::normalVector{}, &m_normalVector ). + reference().resizeDimension< 1 >( 3 ); + + registerField( fields::tangentVector1{}, &m_tangentVector1 ). + reference().resizeDimension< 1 >( 3 ); + + registerField( fields::tangentVector2{}, &m_tangentVector2 ). + reference().resizeDimension< 1 >( 3 ); + excludeWrappersFromPacking( { viewKeyStruct::nodeListString(), viewKeyStruct::edgeListString(), viewKeyStruct::surfaceElementsToCellRegionsString(), diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index df5f199524e..1462a12aa83 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -32,7 +32,7 @@ namespace geos * @class SurfaceElementSubRegion * * The SurfaceElementSubRegion class contains the functionality to support the concept of a - * surface element that can be either and embedded surface element or a face element. + * surface element that can be either and surface element or a face element. */ class SurfaceElementSubRegion : public ElementSubRegionBase { @@ -201,10 +201,68 @@ class SurfaceElementSubRegion : public ElementSubRegionBase */ arrayView1d< real64 const > getElementArea() const { return m_elementArea; } + /** + * @brief Const accessor to the normal vectors. + * @return a const view to the array of normal vectors. + */ + arrayView2d< real64 const > getNormalVector() const { return m_normalVector; } + + /** + * @brief Non const accessor to the normal vectors. + * @return a non const view to the array of normal vectors. + */ + arrayView2d< real64 > getNormalVector() { return m_normalVector; } + + /** + * @brief Get normal vector of a specific surface element. + * @param k index of the surface element + * @return the normal vector of a specific surface element + */ + arraySlice1d< real64 const > getNormalVector( localIndex k ) const { return m_normalVector[k]; } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return an array of the first tangent vector of the surface elements + */ + arrayView2d< real64 const > getTangentVector1() const { return m_tangentVector1; } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return a non const view to the array of the first tangent vector of the surface elements + */ + arrayView2d< real64 > getTangentVector1() { return m_tangentVector1; } + + /** + * @brief Get the first tangent vector of a specific surface element. + * @param k index of the surface element + * @return the first tangent vector of a specific surface element + */ + arraySlice1d< real64 const > getTangentVector1( localIndex const k ) const { return m_tangentVector1[k]; } + + /** + * @brief Get an array of the second tangent vector of the surface elements. + * @return aconst view to the array of the second tangent vector of the surface elements + */ + arrayView2d< real64 const > getTangentVector2() const { return m_tangentVector2.toViewConst(); } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return a non const view to the array of the second tangent vector of the surface elements + */ + arrayView2d< real64 > getTangentVector2() { return m_tangentVector2; } + + /** + * @brief Get the second tangent vector of a specific surface element. + * @param k index of the surface element + * @return the second tangent vector of a specific surface element + */ + arraySlice1d< real64 const > getTangentVector2( localIndex const k ) const { return m_tangentVector2[k];} + + ///@} /** - * @brief Struct containing the keys to all embedded surface element views. + * @brief Struct containing the keys to all surface element views. * @struct viewKeyStruct */ struct viewKeyStruct : ElementSubRegionBase::viewKeyStruct @@ -218,17 +276,10 @@ class SurfaceElementSubRegion : public ElementSubRegionBase /// @return Face element to cell indices map string. static constexpr char const * surfaceElementsToCellIndexString() { return "fractureElementsToCellIndices"; } - - /// @return Embedded surface element aperture string - static constexpr char const * elementApertureString() { return "elementAperture"; } - - /// @return Embedded surface element surface are string - static constexpr char const * elementAreaString() { return "elementArea"; } - /// @return Mass creation string. constexpr static char const * creationMassString() { return "creationMass"; } - /// @return embedded surface element to parent plane string. + /// @return surface element to parent plane string. constexpr static char const * surfaceElementToParentPlaneString() { return "surfaceElementToParentPlane"; } }; @@ -252,6 +303,15 @@ class SurfaceElementSubRegion : public ElementSubRegionBase /// Member level field for the element center array1d< real64 > m_elementArea; + /// Normal vector to the surface element + array2d< real64 > m_normalVector; + + /// Unit vector indicating the first tangential direction + array2d< real64 > m_tangentVector1; + + /// Unit vector indicating the second tangential direction + array2d< real64 > m_tangentVector2; + }; } /* namespace geos */ diff --git a/src/coreComponents/mesh/docs/Mesh.rst b/src/coreComponents/mesh/docs/Mesh.rst index d4231f7ac20..c87441015b4 100644 --- a/src/coreComponents/mesh/docs/Mesh.rst +++ b/src/coreComponents/mesh/docs/Mesh.rst @@ -121,15 +121,18 @@ with the following code. nx="{5, 5}" ny="{5, 5}" nz="{3, 3, 3, 3}" - cellBlockNames="{b00,b01,b02,b03,b04,b05,b06,b07,b08,b09,b10,b11,b12,b13,b14,b15}"/> + cellBlockNames="{cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3}"/> @@ -139,6 +142,7 @@ Thus, the generated mesh will be : :align: center :width: 500 +Note that ``CellBlocks`` are ordered following the natural IJK logic, with indices increasing first in I (x-direction), then in J (y-direction) and last in K (z-direction). .. _ExternalMeshUsage: diff --git a/src/coreComponents/mesh/docs/staircase.svg b/src/coreComponents/mesh/docs/staircase.svg index bda6f11f955..4a5dffd595d 100644 --- a/src/coreComponents/mesh/docs/staircase.svg +++ b/src/coreComponents/mesh/docs/staircase.svg @@ -2,24 +2,24 @@ + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:object-paths="true" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> @@ -55,7 +58,7 @@ image/svg+xml - + @@ -1611,263 +1614,280 @@ transform="translate(433.05483,92.624135)"> b00 + sodipodi:role="line">cb_0-0-0 b01 + sodipodi:role="line">cb_0-0-1 b02 - b07 + sodipodi:role="line">cb_0-0-2 b03 - cb_0-0-3 + b08 - cb_1-0-0 + b09 - cb_1-0-1 + b10 - cb_1-0-2 + b11 + sodipodi:role="line" + id="tspan1275-0" + x="-237.57898" + y="16.654467" + style="stroke-width:0.264583">cb_1-0-3 b03 + sodipodi:role="line">cb_0-0-3 b08 - cb_1-0-0 + b09 - cb_1-0-1 + b10 - cb_1-0-2 + b11 + inkscape:export-ydpi="96" + transform="skewY(-40)">cb_1-0-3 + cb_1-1-0 + cb_1-1-1 + cb_1-1-2 + cb_1-1-3 b11 + style="stroke-width:0.264583">cb_1-0-3 b12 + style="stroke-width:0.264583" + y="-66.60495" + x="-256.42575" + id="tspan1311-8" + sodipodi:role="line">cb_0-1-3 b13 + id="tspan1331-0" + x="-165.55382" + y="-66.60495" + style="stroke-width:0.264583">cb_1-1-3 b14 - b15 - b15 + id="tspan1" + style="stroke-width:0.264583" /> diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 23845ab3b8f..71410f24651 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -585,54 +585,54 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa // Find elemCenters for even uniform element sizes array1d< array1d< real64 > > elemCenterCoords( 3 ); - for( int i = 0; i < 3; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { - m_numElemsTotal[i] = 0; - for( int block = 0; block < m_nElems[i].size(); ++block ) + m_numElemsTotal[dim] = 0; + for( int block = 0; block < m_nElems[dim].size(); ++block ) { - m_numElemsTotal[i] += m_nElems[i][block]; + m_numElemsTotal[dim] += m_nElems[dim][block]; } array1d< int > const & parts = partition.getPartitions(); - GEOS_ERROR_IF( parts[i] > m_numElemsTotal[i], "Number of partitions in a direction should not exceed the number of elements in that direction" ); + GEOS_ERROR_IF( parts[dim] > m_numElemsTotal[dim], "Number of partitions in a direction should not exceed the number of elements in that direction" ); - elemCenterCoords[i].resize( m_numElemsTotal[i] ); - array1d< real64 > elemCenterCoordsLocal( m_numElemsTotal[i] ); - for( int k = 0; k < m_numElemsTotal[i]; ++k ) + elemCenterCoords[dim].resize( m_numElemsTotal[dim] ); + array1d< real64 > elemCenterCoordsLocal( m_numElemsTotal[dim] ); + for( integer k = 0; k < m_numElemsTotal[dim]; ++k ) { - elemCenterCoordsLocal[k] = m_min[i] + ( m_max[i] - m_min[i] ) * ( k + 0.5 ) / m_numElemsTotal[i]; + elemCenterCoordsLocal[k] = m_min[dim] + ( m_max[dim] - m_min[dim] ) * ( k + 0.5 ) / m_numElemsTotal[dim]; } MpiWrapper::allReduce( elemCenterCoordsLocal.data(), - elemCenterCoords[i].data(), - m_numElemsTotal[i], + elemCenterCoords[dim].data(), + m_numElemsTotal[dim], MPI_MAX, MPI_COMM_GEOSX ); } // Find starting/ending index // Get the first and last indices in this partition each direction - int firstElemIndexInPartition[3] = { -1, -1, -1 }; - int lastElemIndexInPartition[3] = { -2, -2, -2 }; + integer firstElemIndexInPartition[3] = { -1, -1, -1 }; + integer lastElemIndexInPartition[3] = { -2, -2, -2 }; - for( int i = 0; i < 3; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { // firstElemIndexInPartition[i] = -1; // lastElemIndexInPartition[i] = -2; - for( int k = 0; k < m_numElemsTotal[i]; ++k ) + for( int k = 0; k < m_numElemsTotal[dim]; ++k ) { - if( partition.isCoordInPartition( elemCenterCoords[i][k], i ) ) + if( partition.isCoordInPartition( elemCenterCoords[dim][k], dim ) ) { - firstElemIndexInPartition[i] = k; + firstElemIndexInPartition[dim] = k; break; } } - if( firstElemIndexInPartition[i] > -1 ) + if( firstElemIndexInPartition[dim] > -1 ) { - for( int k = firstElemIndexInPartition[i]; k < m_numElemsTotal[i]; ++k ) + for( int k = firstElemIndexInPartition[dim]; k < m_numElemsTotal[dim]; ++k ) { - if( partition.isCoordInPartition( elemCenterCoords[i][k], i ) ) + if( partition.isCoordInPartition( elemCenterCoords[dim][k], dim ) ) { - lastElemIndexInPartition[i] = k; + lastElemIndexInPartition[dim] = k; } } } @@ -647,28 +647,28 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa array1d< integer > firstElemIndexForBlockInPartition[3]; array1d< integer > lastElemIndexForBlockInPartition[3]; - for( int dir = 0; dir < 3; ++dir ) + for( int dim = 0; dim < 3; ++dim ) { - firstElemIndexForBlockInPartition[dir] = m_firstElemIndexForBlock[dir]; - lastElemIndexForBlockInPartition[dir] = m_lastElemIndexForBlock[dir]; + firstElemIndexForBlockInPartition[dim] = m_firstElemIndexForBlock[dim]; + lastElemIndexForBlockInPartition[dim] = m_lastElemIndexForBlock[dim]; - for( int block = 0; block < m_nElems[dir].size(); ++block ) + for( integer block = 0; block < m_nElems[dim].size(); ++block ) { - if( firstElemIndexForBlockInPartition[dir][block] > lastElemIndexInPartition[dir] || - lastElemIndexForBlockInPartition[dir][block] < firstElemIndexInPartition[dir] ) + if( firstElemIndexForBlockInPartition[dim][block] > lastElemIndexInPartition[dim] || + lastElemIndexForBlockInPartition[dim][block] < firstElemIndexInPartition[dim] ) { - firstElemIndexForBlockInPartition[dir][block] = -1; - lastElemIndexForBlockInPartition[dir][block] = -2; + firstElemIndexForBlockInPartition[dim][block] = -1; + lastElemIndexForBlockInPartition[dim][block] = -2; } else { - if( firstElemIndexForBlockInPartition[dir][block] < firstElemIndexInPartition[dir] ) + if( firstElemIndexForBlockInPartition[dim][block] < firstElemIndexInPartition[dim] ) { - firstElemIndexForBlockInPartition[dir][block] = firstElemIndexInPartition[dir]; + firstElemIndexForBlockInPartition[dim][block] = firstElemIndexInPartition[dim]; } - if( lastElemIndexForBlockInPartition[dir][block] > lastElemIndexInPartition[dir] ) + if( lastElemIndexForBlockInPartition[dim][block] > lastElemIndexInPartition[dim] ) { - lastElemIndexForBlockInPartition[dir][block] = lastElemIndexInPartition[dir]; + lastElemIndexForBlockInPartition[dim][block] = lastElemIndexInPartition[dim]; } } } @@ -676,11 +676,11 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa // TODO This needs to be rewritten for dimensions lower than 3. localIndex regionOffset = 0; - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset ) { numElemsInRegions[ m_regionNames[ regionOffset ] ] = 0; elemTypeInRegions[ m_regionNames[ regionOffset ] ] = ElementType::Quadrilateral; @@ -691,13 +691,13 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa regionOffset = 0; { localIndex iR = 0; - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset, ++iR ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset, ++iR ) { - int numElemsInRegion = 1; + integer numElemsInRegion = 1; numElemsInRegion *= lastElemIndexForBlockInPartition[0][iblock] - firstElemIndexForBlockInPartition[0][iblock] + 1; if( m_dim > 1 ) @@ -719,10 +719,9 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa localIndex numNodes = 1; integer numNodesInDir[3] = { 1, 1, 1 }; - - for( int i = 0; i < m_dim; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { - numNodesInDir[i] = lastElemIndexInPartition[i] - firstElemIndexInPartition[i] + 2; + numNodesInDir[dim] = lastElemIndexInPartition[dim] - firstElemIndexInPartition[dim] + 2; } reduceNumNodesForPeriodicBoundary( partition, numNodesInDir ); numNodes = numNodesInDir[0] * numNodesInDir[1] * numNodesInDir[2]; @@ -735,17 +734,17 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa { localIndex localNodeIndex = 0; - for( int i = 0; i < numNodesInDir[0]; ++i ) + for( integer k = 0; k < numNodesInDir[2]; ++k ) { - for( int j = 0; j < numNodesInDir[1]; ++j ) + for( integer j = 0; j < numNodesInDir[1]; ++j ) { - for( int k = 0; k < numNodesInDir[2]; ++k ) + for( integer i = 0; i < numNodesInDir[0]; ++i ) { - int globalIJK[3] = { i, j, k }; + integer globalIJK[3] = { i, j, k }; - for( int a = 0; a < m_dim; ++a ) + for( int dim = 0; dim < m_dim; ++dim ) { - globalIJK[a] += firstElemIndexInPartition[a]; + globalIJK[dim] += firstElemIndexInPartition[dim]; } getNodePosition( globalIJK, m_trianglePattern, X[localNodeIndex] ); @@ -824,11 +823,11 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa numNodes = numNodesInDir[0] * numNodesInDir[1] * numNodesInDir[2]; } - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset, ++iR ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset, ++iR ) { ElementType const elementType = EnumStrings< ElementType >::fromString( m_elementType[iR] ); @@ -839,25 +838,25 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa arrayView2d< localIndex, cells::NODE_MAP_USD > elemsToNodes = cellBlock.getElemToNode(); arrayView1d< globalIndex > const & elemLocalToGlobal = cellBlock.localToGlobalMap(); - int numElemsInDirForBlock[3] = + integer numElemsInDirForBlock[3] = { lastElemIndexForBlockInPartition[0][iblock] - firstElemIndexForBlockInPartition[0][iblock] + 1, lastElemIndexForBlockInPartition[1][jblock] - firstElemIndexForBlockInPartition[1][jblock] + 1, lastElemIndexForBlockInPartition[2][kblock] - firstElemIndexForBlockInPartition[2][kblock] + 1 }; - for( int i = 0; i < numElemsInDirForBlock[0]; ++i ) + for( integer k = 0; k < numElemsInDirForBlock[2]; ++k ) { - for( int j = 0; j < numElemsInDirForBlock[1]; ++j ) + for( integer j = 0; j < numElemsInDirForBlock[1]; ++j ) { - for( int k = 0; k < numElemsInDirForBlock[2]; ++k ) + for( integer i = 0; i < numElemsInDirForBlock[0]; ++i ) { - int globalIJK[3] = + integer globalIJK[3] = { i + firstElemIndexForBlockInPartition[0][iblock], j + firstElemIndexForBlockInPartition[1][jblock], k + firstElemIndexForBlockInPartition[2][kblock] }; - const localIndex firstNodeIndex = numNodesInDir[1] * numNodesInDir[2] * ( globalIJK[0] - firstElemIndexInPartition[0] ) - + numNodesInDir[2] * ( globalIJK[1] - firstElemIndexInPartition[1] ) - + ( globalIJK[2] - firstElemIndexInPartition[2] ); + localIndex const firstNodeIndex = ( globalIJK[0] - firstElemIndexInPartition[0] ) + + numNodesInDir[0] * ( globalIJK[1] - firstElemIndexInPartition[1] ) + + numNodesInDir[0] * numNodesInDir[1] * ( globalIJK[2] - firstElemIndexInPartition[2] ); localIndex nodeOfBox[8]; if( elementType == ElementType::Quadrilateral || elementType == ElementType::Triangle ) @@ -869,15 +868,17 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa } else { + localIndex const stride[3] = { 1, numNodesInDir[0], numNodesInDir[0] * numNodesInDir[1] }; + nodeOfBox[0] = firstNodeIndex; - nodeOfBox[1] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex; - nodeOfBox[2] = numNodesInDir[1] * numNodesInDir[2] + numNodesInDir[2] + firstNodeIndex; - nodeOfBox[3] = numNodesInDir[2] + firstNodeIndex; + nodeOfBox[1] = nodeOfBox[0] + stride[0]; + nodeOfBox[2] = nodeOfBox[1] + stride[1]; + nodeOfBox[3] = nodeOfBox[0] + stride[1]; - nodeOfBox[4] = firstNodeIndex + 1; - nodeOfBox[5] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex + 1; - nodeOfBox[6] = numNodesInDir[1] * numNodesInDir[2] + numNodesInDir[2] + firstNodeIndex + 1; - nodeOfBox[7] = numNodesInDir[2] + firstNodeIndex + 1; + nodeOfBox[4] = nodeOfBox[0] + stride[2]; + nodeOfBox[5] = nodeOfBox[1] + stride[2]; + nodeOfBox[6] = nodeOfBox[2] + stride[2]; + nodeOfBox[7] = nodeOfBox[3] + stride[2]; // 7___________________ 6 // / /| @@ -977,6 +978,8 @@ InternalMeshGenerator:: int const (&firstElemIndexInPartition)[3], localIndex (& nodeOfBox)[8] ) { + GEOS_ERROR_IF( component != 1, "Connectivity for periodic boundary implemented for the 1-component only" ); + // Condition is: // 1) element is last index in component direction // 2) first local element in component partition is zero @@ -986,14 +989,14 @@ InternalMeshGenerator:: // Last set of nodes int modGlobalIJK[3] = { globalIJK[0], globalIJK[1], globalIJK[2] }; modGlobalIJK[component] = 0; - const localIndex firstNodeIndex = numNodesInDir[1] * numNodesInDir[2] * ( modGlobalIJK[0] - firstElemIndexInPartition[0] ) - + numNodesInDir[2] * ( modGlobalIJK[1] - 0 ) - + ( modGlobalIJK[2] - firstElemIndexInPartition[2] ); + localIndex const firstNodeIndex = ( modGlobalIJK[0] - firstElemIndexInPartition[0] ) + + numNodesInDir[0] * ( modGlobalIJK[1] - firstElemIndexInPartition[1] ) + + numNodesInDir[0] * numNodesInDir[1] * ( modGlobalIJK[2] - firstElemIndexInPartition[2] ); nodeOfBox[3] = firstNodeIndex; - nodeOfBox[2] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex; - nodeOfBox[7] = firstNodeIndex + 1; - nodeOfBox[6] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex + 1; + nodeOfBox[2] = nodeOfBox[3] + 1; + nodeOfBox[7] = nodeOfBox[3] + numNodesInDir[0] * numNodesInDir[1]; + nodeOfBox[6] = nodeOfBox[7] + 1; } } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 9b95d975df9..bcb16630c92 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -271,7 +271,7 @@ class InternalMeshGenerator : public MeshGeneratorBase */ inline globalIndex nodeGlobalIndex( int const index[3] ) { - return index[0]*(m_numElemsTotal[1]+1)*(m_numElemsTotal[2]+1) + index[1]*(m_numElemsTotal[2]+1) + index[2]; + return index[0] + index[1]*(m_numElemsTotal[0]+1) + index[2]*(m_numElemsTotal[0]+1)*(m_numElemsTotal[1]+1); } /** @@ -280,7 +280,7 @@ class InternalMeshGenerator : public MeshGeneratorBase */ inline globalIndex elemGlobalIndex( int const index[3] ) { - return index[0]*m_numElemsTotal[1]*m_numElemsTotal[2] + index[1]*m_numElemsTotal[2] + index[2]; + return index[0] + index[1]*m_numElemsTotal[0] + index[2]*m_numElemsTotal[0]*m_numElemsTotal[1]; } /** diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index 016e00e1389..48b97d15280 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -53,12 +53,6 @@ class MeshGeneratorBase : public dataRepository::Group explicit MeshGeneratorBase( string const & name, Group * const parent ); - /** - * @brief Return the name of the MeshGenerator in object catalog. - * @return string that contains the catalog name of the MeshGenerator - */ - static string catalogName() { return "MeshGeneratorBase"; } - /// This function is used to expand any catalogs in the data structure virtual void expandObjectCatalogs() override; diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index 832b350792f..9b7cddf3c0c 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -447,12 +447,17 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe ng2l[globalPtIds->GetValue( i )] = i; } - // Let's build the elem2d to elem3d mapping. We need to find the 3d elements! + // Let's build the elem2d to elem3d mapping. + // We need to find the 3d elements (and only the 3d elements, so we can safely ignore the others). // First we compute the mapping from all the boundary nodes to the 3d elements that rely on those nodes. std::map< vtkIdType, std::vector< vtkIdType > > nodesToCellsFull; for( vtkIdType i = 0; i < boundary->GetNumberOfCells(); ++i ) { vtkIdType const cellId = boundaryCells->GetValue( i ); + if( mesh->GetCell( cellId )->GetCellDimension() != 3 ) + { + continue; + } vtkIdList * pointIds = boundary->GetCell( i )->GetPointIds(); for( int j = 0; j < pointIds->GetNumberOfIds(); ++j ) { diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 554f4530bf7..dee088ac575 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -17,7 +17,10 @@ #include "mesh/Perforation.hpp" #include "mesh/generators/LineBlockABC.hpp" #include "LvArray/src/genericTensorOps.hpp" - +#include "fileIO/Table/TableLayout.hpp" +#include "fileIO/Table/TableData.hpp" +#include "fileIO/Table/TableFormatter.hpp" +#include "common/Format.hpp" namespace geos { using namespace dataRepository; @@ -141,9 +144,10 @@ void WellGeneratorBase::generateWellGeometry( ) // make sure that the perforation locations are valid checkPerforationLocationsValidity(); - if( getLogLevel() >= 1 ) + if( getLogLevel() >= 1 && MpiWrapper::commRank() == 0 ) { - debugWellGeometry(); + logInternalWell(); + logPerforationTable(); } } @@ -521,62 +525,58 @@ void WellGeneratorBase::mergePerforations( array1d< array1d< localIndex > > cons } } -void WellGeneratorBase::debugWellGeometry() const +void WellGeneratorBase::logInternalWell() const { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) != 0 ) - { - return; - } - - std::cout << std::endl; - std::cout << "++++++++++++++++++++++++++" << std::endl; - std::cout << "WellGeneratorBase = " << getName() << std::endl; - std::cout << "MPI rank = " << MpiWrapper::commRank( MPI_COMM_GEOSX ) << std::endl << std::endl; - std::cout << "Number of well elements = " << m_numElems << std::endl; - + TableData tableWellData; for( globalIndex iwelem = 0; iwelem < m_numElems; ++iwelem ) { - std::cout << "Well element #" << iwelem << std::endl; - std::cout << "Coordinates of the element center: " << m_elemCenterCoords[iwelem] << std::endl; - if( m_nextElemId[iwelem] < 0 ) - { - std::cout << "No next well element" << std::endl; - } - else - { - std::cout << "Next well element # = " << m_nextElemId[iwelem] << std::endl; - } - if( m_prevElemId[iwelem][0] < 0 ) - { - std::cout << "No previous well element" << std::endl; - } - else + std::optional< globalIndex > nextElement; + std::optional< globalIndex > prevElement; + + if( m_nextElemId[iwelem] >= 0 ) { - std::cout << "Previous well element #" << m_prevElemId[iwelem][0] << std::endl; + nextElement = m_nextElemId[iwelem]; } - for( globalIndex inode = 0; inode < m_numNodesPerElem; ++inode ) + + if( m_prevElemId[iwelem][0] >= 0 ) { - if( inode == 0 ) - { - std::cout << "First well node: #" << m_elemToNodesMap[iwelem][inode] << std::endl; - } - else - { - std::cout << "Second well node: #" << m_elemToNodesMap[iwelem][inode] << std::endl; - } + prevElement = m_prevElemId[iwelem][0]; } + + tableWellData.addRow( iwelem, + m_elemCenterCoords[iwelem][0], + m_elemCenterCoords[iwelem][1], + m_elemCenterCoords[iwelem][2], + prevElement, + nextElement ); } - std::cout << std::endl << "Number of perforations = " << m_numPerforations << std::endl; + string const wellTitle = GEOS_FMT( "Well '{}' Element Table", getName() ); + TableLayout const tableWellLayout = TableLayout( { + TableLayout::ColumnParam{"Element no.", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordX", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordY", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordZ", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"Prev\nElement", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"Next\nElement", TableLayout::Alignment::right}, + }, wellTitle ); + + TableTextFormatter const tableFormatter( tableWellLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableWellData )); +} +void WellGeneratorBase::logPerforationTable() const +{ + TableData tablePerfoData; for( globalIndex iperf = 0; iperf < m_numPerforations; ++iperf ) { - std::cout << "Perforation #" << iperf << std::endl; - std::cout << "Coordinates of the perforation: " << m_perfCoords[iperf] << std::endl; - std::cout << "Is connected to well element #" << m_perfElemId[iperf] << std::endl; + tablePerfoData.addRow( iperf, m_perfCoords[iperf], m_perfElemId[iperf] ); } - std::cout << std::endl; + TableLayout const tableLayoutPerfo ( {"Perforation no.", "Coordinates", "connected to"}, + GEOS_FMT( "Well '{}' Perforation Table", getName() ) ); + TableTextFormatter const tablePerfoLog( tableLayoutPerfo ); + GEOS_LOG_RANK_0( tablePerfoLog.toString( tablePerfoData )); } } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index a4c6cb5f577..1f82fc688cb 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -46,12 +46,6 @@ class WellGeneratorBase : public WellGeneratorABC WellGeneratorBase( const string & name, Group * const parent ); - /** - * @brief Get the catalog name. - * @return the name of this type in the catalog - */ - static string catalogName() { return "WellGeneratorBase"; } - /// This function is used to expand any catalogs in the data structure virtual void expandObjectCatalogs() override; @@ -301,7 +295,8 @@ class WellGeneratorBase : public WellGeneratorABC ///@} /// @cond DO_NOT_DOCUMENT - void debugWellGeometry() const; + void logInternalWell() const; + void logPerforationTable() const; /// @endcond /// Global number of perforations diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index 143e55eb18c..7c904234f07 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -59,7 +59,7 @@ class CommID CommID & operator=( CommID && ) = delete; /// user defined conversion operator to int - constexpr operator int() + constexpr operator int() const { return m_id; } private: diff --git a/src/coreComponents/mesh/unitTests/CMakeLists.txt b/src/coreComponents/mesh/unitTests/CMakeLists.txt index c017bec6962..862bbca219e 100644 --- a/src/coreComponents/mesh/unitTests/CMakeLists.txt +++ b/src/coreComponents/mesh/unitTests/CMakeLists.txt @@ -4,7 +4,7 @@ set( mesh_tests testComputationalGeometry.cpp testGeometricObjects.cpp ) -set( dependencyList gtest mesh ${parallelDeps} ) +set( dependencyList blas lapack gtest mesh ${parallelDeps} ) # Add gtest C++ based tests foreach(test ${mesh_tests}) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index c7d26a6bfd3..499615347e7 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -50,6 +50,7 @@ set( physicsSolvers_headers fluidFlow/SinglePhaseProppantBaseKernels.hpp fluidFlow/SinglePhaseProppantFluxKernels.hpp fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp + fluidFlow/StabilizedSinglePhaseFVMKernels.hpp fluidFlow/StencilAccessors.hpp fluidFlow/ThermalSinglePhaseBaseKernels.hpp fluidFlow/ThermalSinglePhaseFVMKernels.hpp @@ -63,6 +64,9 @@ set( physicsSolvers_headers fluidFlow/wells/WellControls.hpp fluidFlow/wells/WellSolverBase.hpp fluidFlow/wells/WellSolverBaseFields.hpp + inducedSeismicity/inducedSeismicityFields.hpp + inducedSeismicity/SeismicityRate.hpp + inducedSeismicity/SeismicityRateKernels.hpp multiphysics/CompositionalMultiphaseReservoirAndWells.hpp multiphysics/CoupledReservoirAndWellsBase.hpp multiphysics/CoupledSolver.hpp @@ -128,24 +132,33 @@ set( physicsSolvers_headers surfaceGeneration/SurfaceGeneratorFields.hpp surfaceGeneration/kernels/surfaceGenerationKernels.hpp surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp - wavePropagation/WaveSolverBase.hpp - wavePropagation/WaveSolverUtils.hpp - wavePropagation/AcousticFields.hpp - wavePropagation/AcousticWaveEquationSEM.hpp - wavePropagation/AcousticWaveEquationSEMKernel.hpp - wavePropagation/ElasticFields.hpp - wavePropagation/ElasticWaveEquationSEM.hpp - wavePropagation/ElasticWaveEquationSEMKernel.hpp - wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp - wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp - wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/AcousticVTIFields.hpp - wavePropagation/AcousticVTIWaveEquationSEM.hpp - wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp - wavePropagation/AcoustoElasticFields.hpp - wavePropagation/AcousticElasticWaveEquationSEM.hpp - wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp ) + wavePropagation/shared/WaveSolverBase.hpp + wavePropagation/shared/WaveSolverUtils.hpp + wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp ) # Specify solver sources set( physicsSolvers_sources @@ -179,6 +192,7 @@ set( physicsSolvers_sources fluidFlow/wells/SinglePhaseWellKernels.cpp fluidFlow/wells/WellControls.cpp fluidFlow/wells/WellSolverBase.cpp + inducedSeismicity/SeismicityRate.cpp multiphysics/CompositionalMultiphaseReservoirAndWells.cpp multiphysics/CoupledReservoirAndWellsBase.cpp multiphysics/FlowProppantTransportSolver.cpp @@ -202,13 +216,13 @@ set( physicsSolvers_sources surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp surfaceGeneration/ParallelTopologyChange.cpp surfaceGeneration/SurfaceGenerator.cpp - wavePropagation/WaveSolverBase.cpp - wavePropagation/AcousticWaveEquationSEM.cpp - wavePropagation/ElasticWaveEquationSEM.cpp - wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp - wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp - wavePropagation/AcousticVTIWaveEquationSEM.cpp - wavePropagation/AcousticElasticWaveEquationSEM.cpp ) + wavePropagation/shared/WaveSolverBase.cpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp ) include( solidMechanics/kernels/SolidMechanicsKernels.cmake) include( multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 6fa15ae76e4..d9767a84bea 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -17,6 +17,7 @@ */ #include "LinearSolverParameters.hpp" +#include "fileIO/Table/TableFormatter.hpp" namespace geos { @@ -257,6 +258,79 @@ void LinearSolverParametersInput::postProcessInput() ": Invalid value." ); // TODO input validation for other AMG parameters ? + + if( getLogLevel() > 0 ) + print(); +} + +void LinearSolverParametersInput::print() +{ + TableData tableData; + tableData.addRow( "Log level", getLogLevel()); + tableData.addRow( "Linear solver type", m_parameters.solverType ); + tableData.addRow( "Preconditioner type", m_parameters.preconditionerType ); + tableData.addRow( "Stop if error", m_parameters.stopIfError ); + if( m_parameters.solverType == LinearSolverParameters::SolverType::direct ) + { + tableData.addRow( "Check residual", m_parameters.direct.checkResidual ); + tableData.addRow( "Scale rows and columns", m_parameters.direct.equilibrate ); + tableData.addRow( "Columns permutation", m_parameters.direct.colPerm ); + tableData.addRow( "Rows permutation", m_parameters.direct.rowPerm ); + tableData.addRow( "Replace tiny pivots", m_parameters.direct.replaceTinyPivot ); + tableData.addRow( "Perform iterative refinement", m_parameters.direct.iterativeRefine ); + tableData.addRow( "Use parallel solver", m_parameters.direct.parallel ); + } + else + { + tableData.addRow( "Maximum iterations", m_parameters.krylov.maxIterations ); + if( m_parameters.solverType == LinearSolverParameters::SolverType::gmres || + m_parameters.solverType == LinearSolverParameters::SolverType::fgmres ) + { + tableData.addRow( "Maximum iterations before restart", m_parameters.krylov.maxRestart ); + } + tableData.addRow( "Use adaptive tolerance", m_parameters.krylov.useAdaptiveTol ); + if( m_parameters.krylov.useAdaptiveTol ) + { + tableData.addRow( "Weakest-allowed tolerance", m_parameters.krylov.weakestTol ); + } + else + { + tableData.addRow( "Relative convergence tolerance", m_parameters.krylov.relTolerance ); + } + } + if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::amg ) + { + tableData.addRow( "AMG", "" ); + tableData.addRow( " Smoother sweeps", m_parameters.amg.numSweeps ); + tableData.addRow( " Smoother type", m_parameters.amg.smootherType ); + tableData.addRow( " Relaxation factor for the smoother", m_parameters.amg.relaxWeight ); + tableData.addRow( " Coarsest level solver/smoother type", m_parameters.amg.coarseType ); + tableData.addRow( " Coarsening algorithm", m_parameters.amg.coarseningType ); + tableData.addRow( " Interpolation algorithm", m_parameters.amg.interpolationType ); + tableData.addRow( " Interpolation maximum number of nonzeros per row", m_parameters.amg.interpolationMaxNonZeros ); + tableData.addRow( " Number of functions", m_parameters.amg.numFunctions ); + tableData.addRow( " Number of paths for aggressive coarsening", m_parameters.amg.aggressiveNumPaths ); + tableData.addRow( " Number of levels for aggressive coarsening", m_parameters.amg.aggressiveNumLevels ); + tableData.addRow( " Aggressive interpolation algorithm", m_parameters.amg.aggressiveInterpType ); + tableData.addRow( " Strength-of-connection threshold", m_parameters.amg.threshold ); + tableData.addRow( " Apply separate component filter for multi-variable problems", m_parameters.amg.separateComponents ); + tableData.addRow( " Near null space approximation", m_parameters.amg.nullSpaceType ); + } + else if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::iluk || + m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::ilut ) + { + tableData.addRow( "ILU(K) fill factor", m_parameters.ifact.fill ); + if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::ilut ) + { + tableData.addRow( "ILU(T) threshold factor", m_parameters.ifact.threshold ); + } + } + TableLayout const tableLayout = TableLayout( { + TableLayout::ColumnParam{"Parameter", TableLayout::Alignment::left}, + TableLayout::ColumnParam{"Value", TableLayout::Alignment::left}, + }, GEOS_FMT( "{}: linear solver", getParent().getName() ) ); + TableTextFormatter const tableFormatter( tableLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableData )); } REGISTER_CATALOG_ENTRY( Group, LinearSolverParametersInput, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index ced2aa2b62a..462203c9b98 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -59,6 +59,8 @@ class LinearSolverParametersInput : public dataRepository::Group /// Postprocessing of input virtual void postProcessInput() override; + void print(); + LinearSolverParameters const & get() const { return m_parameters; } diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 05946aa15b8..dc4b4620067 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -14,6 +14,7 @@ #include "NonlinearSolverParameters.hpp" #include "common/Logger.hpp" +#include "fileIO/Table/TableFormatter.hpp" namespace geos { @@ -60,6 +61,11 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Iteration when line search starts." ); + registerWrapper( viewKeysStruct::lineSearchResidualFactorString(), &m_lineSearchResidualFactor ). + setApplyDefaultValue( 1.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Factor to determine residual increase (recommended values: 1.1 (conservative), 2.0 (relaxed), 10.0 (aggressive))." ); + registerWrapper( viewKeysStruct::normTypeString(), &m_normType ). setInputFlag( InputFlags::FALSE ). setApplyDefaultValue( solverBaseKernels::NormType::Linf ). @@ -142,6 +148,11 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Max number of times that the configuration can be changed" ); + registerWrapper( viewKeysStruct::configurationToleranceString(), &m_configurationTolerance ). + setApplyDefaultValue( 0.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Configuration tolerance" ); + /// GEOS mainly uses FIM coupling so let's define FIM as the default. registerWrapper( viewKeysStruct::couplingTypeString(), &m_couplingType ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). @@ -160,7 +171,7 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, setApplyDefaultValue( 0 ). setDescription( "Flag to decide whether to iterate between sequentially coupled solvers or not." ); - this->registerWrapper( viewKeysStruct::nonlinearAccelerationTypeString(), &m_nonlinearAccelerationType ). + registerWrapper( viewKeysStruct::nonlinearAccelerationTypeString(), &m_nonlinearAccelerationType ). setApplyDefaultValue( NonlinearAccelerationType::None ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). setDescription( "Nonlinear acceleration type for sequential solver." ); @@ -173,41 +184,57 @@ void NonlinearSolverParameters::postProcessInput() getWrapperDataContext( viewKeysStruct::timeStepIncreaseIterLimString() ) << ": should be smaller than " << viewKeysStruct::timeStepDecreaseIterLimString() ); + GEOS_ERROR_IF_LE_MSG( m_lineSearchResidualFactor, 0.0, + getWrapperDataContext( viewKeysStruct::lineSearchResidualFactorString() ) << ": should be positive" ); + if( getLogLevel() > 0 ) { - GEOS_LOG_RANK_0( "Nonlinear solver parameters:" ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search action = {}", EnumStrings< LineSearchAction >::toString( m_lineSearchAction ) ) ); - if( m_lineSearchAction != LineSearchAction::None ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " Line search interpolation type = {}", EnumStrings< LineSearchInterpolationType >::toString( m_lineSearchInterpType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search maximum number of cuts = {}", m_lineSearchMaxCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search cut factor = {}", m_lineSearchCutFactor ) ); - } - GEOS_LOG_RANK_0( GEOS_FMT( " Norm type (flow solver) = {}", EnumStrings< solverBaseKernels::NormType >::toString( m_normType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum residual normalizer = {}", m_minNormalizer ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Convergence tolerance = {}", m_newtonTol ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum iterations = {}", m_maxIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum iterations = {}", m_minIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum allowed residual norm = {}", m_maxAllowedResidualNorm ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Allow non-converged = {}", m_allowNonConverged ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease iterations limit = {}", m_timeStepDecreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase iterations limit = {}", m_timeStepIncreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step cut factor = {}", m_timeStepCutFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum time step cuts = {}", m_maxTimeStepCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum sub time steps = {}", m_maxSubSteps ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum number of configuration attempts = {}", m_maxNumConfigurationAttempts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Coupling type = {}", EnumStrings< CouplingType >::toString( m_couplingType ) ) ); - if( m_couplingType == CouplingType::Sequential ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " Sequential convergence criterion = {}", EnumStrings< SequentialConvergenceCriterion >::toString( m_sequentialConvergenceCriterion ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Subcycling = {}", m_subcyclingOption ) ); - } + print(); } } - +void NonlinearSolverParameters::print() const +{ + TableData tableData; + tableData.addRow( "Log level", getLogLevel()); + tableData.addRow( "Line search", "" ); + tableData.addRow( " Action", m_lineSearchAction ); + if( m_lineSearchAction != LineSearchAction::None ) + { + tableData.addRow( " Interpolation type", m_lineSearchInterpType ); + tableData.addRow( " Maximum number of cuts", m_lineSearchMaxCuts ); + tableData.addRow( " Cut factor", m_lineSearchCutFactor ); + tableData.addRow( " Starting iteration", m_lineSearchStartingIteration ); + tableData.addRow( " Residual increase factor", m_lineSearchResidualFactor ); + } + tableData.addRow( "Norm type (flow solver)", m_normType ); + tableData.addRow( "Minimum residual normalizer", m_minNormalizer ); + tableData.addRow( "Convergence tolerance", m_newtonTol ); + tableData.addRow( "Maximum iterations", m_maxIterNewton ); + tableData.addRow( "Minimum iterations", m_minIterNewton ); + tableData.addRow( "Maximum allowed residual norm", m_maxAllowedResidualNorm ); + tableData.addRow( "Allow non-converged", m_allowNonConverged ); + tableData.addRow( "Time step decrease iterations limit", m_timeStepDecreaseIterLimit ); + tableData.addRow( "Time step increase iterations limit", m_timeStepIncreaseIterLimit ); + tableData.addRow( "Time step decrease factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time step increase factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time step cut factor", m_timeStepCutFactor ); + tableData.addRow( "Maximum time step cuts", m_maxTimeStepCuts ); + tableData.addRow( "Maximum sub time steps", m_maxSubSteps ); + tableData.addRow( "Maximum number of configuration attempts", m_maxNumConfigurationAttempts ); + tableData.addRow( "Coupling type", m_couplingType ); + if( m_couplingType == CouplingType::Sequential ) + { + tableData.addRow( "Sequential convergence criterion", m_sequentialConvergenceCriterion ); + tableData.addRow( "Subcycling", m_subcyclingOption ); + } + TableLayout const tableLayout = TableLayout( { + TableLayout::ColumnParam{"Parameter", TableLayout::Alignment::left}, + TableLayout::ColumnParam{"Value", TableLayout::Alignment::left}, + }, GEOS_FMT( "{}: nonlinear solver", getParent().getName() ) ); + TableTextFormatter const tableFormatter( tableLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableData )); +} REGISTER_CATALOG_ENTRY( Group, NonlinearSolverParameters, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 9f9f93da0fc..40dcb370c09 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -64,6 +64,7 @@ class NonlinearSolverParameters : public dataRepository::Group m_lineSearchMaxCuts = params.m_lineSearchMaxCuts; m_lineSearchCutFactor = params.m_lineSearchCutFactor; m_lineSearchStartingIteration = params.m_lineSearchStartingIteration; + m_lineSearchResidualFactor = params.m_lineSearchResidualFactor; m_newtonTol = params.m_newtonTol; m_maxIterNewton = params.m_maxIterNewton; @@ -81,6 +82,9 @@ class NonlinearSolverParameters : public dataRepository::Group m_maxTimeStepCuts = params.m_maxTimeStepCuts; m_timeStepCutFactor = params.m_timeStepCutFactor; m_maxNumConfigurationAttempts = params.m_maxNumConfigurationAttempts; + m_configurationTolerance = params.m_configurationTolerance; + + setLogLevel( params.getLogLevel()); return *this; } @@ -96,6 +100,8 @@ class NonlinearSolverParameters : public dataRepository::Group virtual void postProcessInput() override; + void print() const; + struct viewKeysStruct { static constexpr char const * lineSearchActionString() { return "lineSearchAction"; } @@ -103,6 +109,7 @@ class NonlinearSolverParameters : public dataRepository::Group static constexpr char const * lineSearchCutFactorString() { return "lineSearchCutFactor"; } static constexpr char const * lineSearchInterpolationTypeString() { return "lineSearchInterpolationType"; } static constexpr char const * lineSearchStartingIterationString() { return "lineSearchStartingIteration"; } + static constexpr char const * lineSearchResidualFactorString() { return "lineSearchResidualFactor"; } static constexpr char const * normTypeString() { return "normType"; } static constexpr char const * minNormalizerString() { return "minNormalizer"; } @@ -120,12 +127,11 @@ class NonlinearSolverParameters : public dataRepository::Group static constexpr char const * maxSubStepsString() { return "maxSubSteps"; } static constexpr char const * maxTimeStepCutsString() { return "maxTimeStepCuts"; } - static constexpr char const * minNumNewtonIterationsString() { return "minNumberOfNewtonIterations"; } static constexpr char const * timeStepCutFactorString() { return "timeStepCutFactor"; } static constexpr char const * maxAllowedResidualNormString() { return "maxAllowedResidualNorm"; } - static constexpr char const * numConfigurationAttemptsString() { return "numConfigurationAttempts"; } static constexpr char const * maxNumConfigurationAttemptsString() { return "maxNumConfigurationAttempts"; } + static constexpr char const * configurationToleranceString() { return "configurationTolerance"; } static constexpr char const * couplingTypeString() { return "couplingType"; } static constexpr char const * sequentialConvergenceCriterionString() { return "sequentialConvergenceCriterion"; } @@ -261,6 +267,9 @@ class NonlinearSolverParameters : public dataRepository::Group /// Iteration when line search starts integer m_lineSearchStartingIteration; + /// Factor to determine residual increase + real64 m_lineSearchResidualFactor; + /// Norm used to check the nonlinear loop convergence solverBaseKernels::NormType m_normType; @@ -312,6 +321,9 @@ class NonlinearSolverParameters : public dataRepository::Group /// Max number of times that the configuration can be changed integer m_maxNumConfigurationAttempts; + /// Configuration tolerance + double m_configurationTolerance; + /// Type of coupling CouplingType m_couplingType; diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 26738950857..bc1034d523f 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -16,7 +16,6 @@ #include "PhysicsSolverManager.hpp" #include "common/TimingMacros.hpp" -#include "linearAlgebra/utilities/LinearSolverParameters.hpp" #include "linearAlgebra/solvers/KrylovSolver.hpp" #include "mesh/DomainPartition.hpp" #include "math/interpolation/Interpolation.hpp" @@ -272,11 +271,17 @@ bool SolverBase::execute( real64 const time_n, { // better to do two equal steps than one big and one small (even potentially tiny) if( nextDt * 2 > dtRemaining ) + { nextDt = dtRemaining / 2; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: shortening time step to {} to cover remaining time {} in two steps", getName(), nextDt, dtRemaining )); + } } else { nextDt = dtRemaining; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: shortening time step to {} to match remaining time", getName(), nextDt )); } } @@ -299,33 +304,45 @@ real64 SolverBase::setNextDt( real64 const & currentDt, DomainPartition & domain ) { real64 const nextDtNewton = setNextDtBasedOnNewtonIter( currentDt ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on Newton iterations = {}", getName(), nextDtNewton )); real64 const nextDtStateChange = setNextDtBasedOnStateChange( currentDt, domain ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on state change = {}", getName(), nextDtStateChange )); if( nextDtNewton < nextDtStateChange ) // time step size decided based on convergence { - integer const iterDecreaseLimit = m_nonlinearSolverParameters.timeStepDecreaseIterLimit(); - integer const iterIncreaseLimit = m_nonlinearSolverParameters.timeStepIncreaseIterLimit(); if( nextDtNewton > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: solver converged in less than {} iterations, time-step required will be increased.", - getName(), iterIncreaseLimit ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on number of iterations.", + getName() ) ); } else if( nextDtNewton < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: solver converged in more than {} iterations, time-step required will be decreased.", - getName(), iterDecreaseLimit ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on number of iterations.", + getName() ) ); + } + else + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on number of iterations.", + getName() ) ); } } else // time step size decided based on state change { if( nextDtStateChange > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Time-step required will be increased based on state change.", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on state change.", getName())); } else if( nextDtStateChange < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Time-step required will be decreased based on state change.", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on state change.", + getName())); + } + else + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on state change.", getName())); } } @@ -351,15 +368,21 @@ real64 SolverBase::setNextDtBasedOnNewtonIter( real64 const & currentDt ) { // Easy convergence, let's increase the time-step. nextDt = currentDt * m_nonlinearSolverParameters.timeStepIncreaseFactor(); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is less than {}, next time step = {} (increase)", getName(), newtonIter, iterIncreaseLimit, nextDt )); } else if( newtonIter > iterDecreaseLimit ) { // Tough convergence let us make the time-step smaller! nextDt = currentDt * m_nonlinearSolverParameters.timeStepDecreaseFactor(); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is more than {}, next time step = {} (decrease)", getName(), newtonIter, iterDecreaseLimit, nextDt )); } else { nextDt = currentDt; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is between {} and {}, next time step = {} (no change)", getName(), newtonIter, iterIncreaseLimit, iterDecreaseLimit, nextDt )); } return nextDt; } @@ -833,6 +856,11 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, { Timer timer( m_timers["assemble"] ); + // We sync the nonlinear convergence history. The coupled solver parameters are the one being + // used. We want to propagate the info to subsolvers. It can be important for solvers that + // have special treatment for specific iterations. + synchronizeNonlinearSolverParameters(); + // zero out matrix/rhs before assembly m_localMatrix.zero(); m_rhs.zero(); @@ -897,7 +925,8 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // do line search in case residual has increased if( m_nonlinearSolverParameters.m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None - && residualNorm > lastResidual && newtonIter >= m_nonlinearSolverParameters.m_lineSearchStartingIteration ) + && residualNorm > lastResidual * m_nonlinearSolverParameters.m_lineSearchResidualFactor + && newtonIter >= m_nonlinearSolverParameters.m_lineSearchStartingIteration ) { bool lineSearchSuccess = false; if( m_nonlinearSolverParameters.m_lineSearchInterpType == NonlinearSolverParameters::LineSearchInterpolationType::Linear ) @@ -1121,7 +1150,7 @@ void debugOutputLAObject( T const & obj, if( toFile ) { string const filename = GEOS_FMT( "{}_{:06}_{:02}.mtx", filePrefix.c_str(), cycleNumber, nonlinearIteration ); - obj.write( filename, LAIOutputFormat::MATRIX_MARKET ); + obj.write( filename, LAIOutputFormat::NATIVE_ASCII ); GEOS_LOG_RANK_0( screenName << " written to " << filename ); } } diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index af7ff222f37..7c47c07639d 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -21,13 +21,11 @@ #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "linearAlgebra/utilities/LinearSolverResult.hpp" #include "linearAlgebra/DofManager.hpp" -#include "mesh/DomainPartition.hpp" #include "mesh/MeshBody.hpp" #include "physicsSolvers/NonlinearSolverParameters.hpp" #include "physicsSolvers/LinearSolverParameters.hpp" #include "physicsSolvers/SolverStatistics.hpp" - #include namespace geos @@ -51,8 +49,6 @@ class SolverBase : public ExecutableGroup SolverBase & operator=( SolverBase const & ) = delete; SolverBase & operator=( SolverBase && ) = delete; - static string catalogName() { return "SolverBase"; } - /** * @return Get the final class Catalog name */ @@ -667,6 +663,10 @@ class SolverBase : public ExecutableGroup return m_nonlinearSolverParameters; } + virtual void + synchronizeNonlinearSolverParameters() + { /* empty here, overriden in CoupledSolver */ } + /** * @brief Get position of a given region within solver's target region list * @param regionName the region name to find @@ -734,6 +734,7 @@ class SolverBase : public ExecutableGroup virtual bool registerCallback( void * func, const std::type_info & funcType ) final override; SolverStatistics & getSolverStatistics() { return m_solverStatistics; } + SolverStatistics const & getSolverStatistics() const { return m_solverStatistics; } /** * @brief Return PySolver type. diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index 7ec3b7cc532..964cbc078ca 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -79,6 +79,54 @@ class SolverStatistics : public dataRepository::Group */ void outputStatistics() const; + /** + * @return Number of time steps + */ + integer getNumTimeSteps() const + { return m_numTimeSteps; } + + /** + * @return Number of time step cuts + */ + integer getNumTimeStepCuts() const + { return m_numTimeStepCuts; } + + /** + * @return Cumulative number of successful outer loop iterations + */ + integer getNumSuccessfulOuterLoopIterations() const + { return m_numSuccessfulOuterLoopIterations; } + + /** + * @return Cumulative number of successful nonlinear iterations + */ + integer getNumSuccessfulNonlinearIterations() const + { return m_numSuccessfulNonlinearIterations; } + + /** + * @return Cumulative number of successful linear iterations + */ + integer getNumSuccessfulLinearIterations() const + { return m_numSuccessfulLinearIterations; } + + /** + * @return Cumulative number of discarded outer loop iterations + */ + integer getNumDiscardedOuterLoopIterations() const + { return m_numDiscardedOuterLoopIterations; } + + /** + * @return Cumulative number of discarded nonlinear iterations + */ + integer getNumDiscardedNonlinearIterations() const + { return m_numDiscardedNonlinearIterations; } + + /** + * @return Cumulative number of discarded linear iterations + */ + integer getNumDiscardedLinearIterations() const + { return m_numDiscardedLinearIterations; } + private: /** diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 214ca10513c..32cbfe32d1d 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -55,7 +55,15 @@ DECLARE_FIELD( dispJump, 0, LEVEL_0, WRITE_AND_READ, - "Displacement jump vector" ); + "Displacement jump vector in the local reference system" ); + +DECLARE_FIELD( slip, + "slip", + array1d< real64 >, + 0, + LEVEL_0, + NO_WRITE, + "Slip." ); DECLARE_FIELD( deltaDispJump, "deltaDisplacementJump", @@ -78,8 +86,8 @@ DECLARE_FIELD( traction, array2d< real64 >, 0, LEVEL_0, - NO_WRITE, - "Fracture traction vector" ); + WRITE_AND_READ, + "Fracture traction vector in the local reference system." ); DECLARE_FIELD( deltaTraction, "deltaTraction", @@ -89,7 +97,6 @@ DECLARE_FIELD( deltaTraction, NO_WRITE, "An array that holds the traction increments on the fracture." ); - DECLARE_FIELD( dTraction_dJump, "dTraction_dJump", array3d< real64 >, diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index b9f0e1d8645..da4433b0989 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -94,6 +94,8 @@ void ContactSolverBase::registerDataOnMesh( dataRepository::Group & meshBodies ) subRegion.registerField< fields::contact::fractureState >( getName() ); subRegion.registerField< fields::contact::oldFractureState >( getName() ); + + subRegion.registerField< fields::contact::slip >( getName() ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index a1c2b6c5b08..9bb7a3702dd 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -305,7 +305,8 @@ struct StateUpdateKernel arrayView2d< real64 const > const & jump, arrayView2d< real64 > const & fractureTraction, arrayView3d< real64 > const & dFractureTraction_dJump, - arrayView1d< integer const > const & fractureState ) + arrayView1d< integer const > const & fractureState, + arrayView1d< real64 > const & slip ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { @@ -313,6 +314,9 @@ struct StateUpdateKernel fractureState[k], fractureTraction[k], dFractureTraction_dJump[k] ); + + slip[ k ] = LvArray::math::sqrt( LvArray::math::square( jump( k, 1 ) ) + + LvArray::math::square( jump( k, 2 ) ) ); } ); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 0a082067cfa..563a07119ed 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -537,83 +537,90 @@ real64 SolidMechanicsEmbeddedFractures::calculateResidualNorm( real64 const & ti if( !m_useStaticCondensation ) { + real64 const fractureResidualNorm = calculateFractureResidualNorm( domain, dofManager, localRhs ); - string const jumpDofKey = dofManager.getKey( contact::dispJump::key() ); + return sqrt( solidResidualNorm * solidResidualNorm + fractureResidualNorm * fractureResidualNorm ); + } + else + { + return solidResidualNorm; + } +} - globalIndex const rankOffset = dofManager.rankOffset(); +real64 SolidMechanicsEmbeddedFractures::calculateFractureResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) const +{ + string const jumpDofKey = dofManager.getKey( contact::dispJump::key() ); + + globalIndex const rankOffset = dofManager.rankOffset(); - RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum( 0.0 ); - // globalResidualNorm[0]: the sum of all the local sum(rhs^2). - // globalResidualNorm[1]: max of max force of each rank. Basically max force globally - real64 globalResidualNorm[2] = {0, 0}; + // globalResidualNorm[0]: the sum of all the local sum(rhs^2). + // globalResidualNorm[1]: max of max force of each rank. Basically max force globally + real64 globalResidualNorm[2] = {0.0, 0.0}; - // Fracture residual - forFractureRegionOnMeshTargets( domain.getMeshBodies(), [&] ( SurfaceElementRegion const & fractureRegion ) + // Fracture residual + forFractureRegionOnMeshTargets( domain.getMeshBodies(), [&] ( SurfaceElementRegion const & fractureRegion ) + { + fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion const & subRegion ) { - fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion const & subRegion ) - { - arrayView1d< globalIndex const > const & - dofNumber = subRegion.getReference< array1d< globalIndex > >( jumpDofKey ); - arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< globalIndex const > const & + dofNumber = subRegion.getReference< array1d< globalIndex > >( jumpDofKey ); + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); - forAll< parallelDevicePolicy<> >( subRegion.size(), - [localRhs, localSum, dofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [localRhs, localSum, dofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const k ) + { + if( ghostRank[k] < 0 ) { - if( ghostRank[k] < 0 ) + localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); + for( int i = 0; i < 3; ++i ) { - localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); - for( localIndex i = 0; i < 3; ++i ) - { - localSum += localRhs[localRow + i] * localRhs[localRow + i]; - } + localSum += localRhs[localRow + i] * localRhs[localRow + i]; } - } ); - + } } ); - real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; + } ); + real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); - array1d< real64 > globalValues( numRanks * 2 ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); + array1d< real64 > globalValues( numRanks * 2 ); - // Everything is done on rank 0 - MpiWrapper::gather( localResidualNorm, - 2, - globalValues.data(), - 2, - 0, - MPI_COMM_GEOSX ); + // Everything is done on rank 0 + MpiWrapper::gather( localResidualNorm, + 2, + globalValues.data(), + 2, + 0, + MPI_COMM_GEOSX ); - if( rank==0 ) + if( rank==0 ) + { + for( int r=0; r= 1 && logger::internal::rank==0 ) - { - std::cout << GEOS_FMT( " ( RFracture ) = ( {:4.2e} )", fractureResidualNorm ); - } + real64 const fractureResidualNorm = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first + // time-step when maxForce = 0; - return sqrt( solidResidualNorm * solidResidualNorm + fractureResidualNorm * fractureResidualNorm ); - } - else + if( getLogLevel() >= 1 && logger::internal::rank==0 ) { - return solidResidualNorm; + std::cout << GEOS_FMT( " ( RFracture ) = ( {:4.2e} )", fractureResidualNorm ); } + + return fractureResidualNorm; } void SolidMechanicsEmbeddedFractures::applySystemSolution( DofManager const & dofManager, @@ -723,6 +730,8 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) arrayView1d< integer const > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); + constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) { using ContactType = TYPEOFREF( castedContact ); @@ -735,7 +744,8 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) jump, fractureTraction, dFractureTraction_dJump, - fractureState ); + fractureState, + slip ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 3069cfd28e6..0422634b20d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -77,6 +77,10 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase DofManager const & dofManager, arrayView1d< real64 const > const & localRhs ) override; + real64 calculateFractureResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) const; + virtual void applySystemSolution( DofManager const & dofManager, arrayView1d< real64 const > const & localSolution, @@ -106,9 +110,15 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase real64 const dt, DomainPartition & domain ); - virtual bool updateConfiguration( DomainPartition & domain ) override final; + bool useStaticCondensation() const { return m_useStaticCondensation; } + + struct viewKeyStruct : ContactSolverBase::viewKeyStruct + { + constexpr static char const * useStaticCondensationString() { return "useStaticCondensation"; } + }; + protected: virtual void initializePostInitialConditionsPreSubGroups() override final; @@ -124,10 +134,6 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase /// decide whether to use static condensation or not integer m_useStaticCondensation; - struct viewKeyStruct : ContactSolverBase::viewKeyStruct - { - constexpr static char const * useStaticCondensationString() { return "useStaticCondensation"; } - }; }; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 2f690495827..ef3b942a431 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -64,6 +64,11 @@ SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & nam setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the stabilization to use in the lagrangian contact solver" ); + registerWrapper( viewKeyStruct::stabilizationScalingCoefficientString(), &m_stabilitzationScalingCoefficient ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 1.0 ). + setDescription( "It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix." ); + LinearSolverParameters & linSolParams = m_linearSolverParameters.get(); linSolParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; linSolParams.mgr.separateComponents = true; @@ -147,18 +152,18 @@ void SolidMechanicsLagrangeContact::initializePreSubGroups() fluxApprox.addFieldName( contact::traction::key() ); fluxApprox.setCoeffName( "penaltyStiffness" ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, - MeshLevel &, + MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - array1d< string > & stencilTargetRegions = fluxApprox.targetRegions( meshBodyName ); - std::set< string > stencilTargetRegionsSet( stencilTargetRegions.begin(), stencilTargetRegions.end() ); - stencilTargetRegionsSet.insert( regionNames.begin(), regionNames.end() ); - stencilTargetRegions.clear(); - for( auto const & targetRegion: stencilTargetRegionsSet ) + mesh.getElemManager().forElementRegions< SurfaceElementRegion >( regionNames, + [&]( localIndex const, + SurfaceElementRegion const & region ) { - stencilTargetRegions.emplace_back( targetRegion ); - } + array1d< string > & stencilTargetRegions = fluxApprox.targetRegions( meshBodyName ); + stencilTargetRegions.emplace_back( region.getName() ); + } ); } ); } @@ -452,9 +457,12 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); - arrayView2d< real64 > const & dispJump = subRegion.getField< contact::dispJump >(); arrayView1d< real64 const > const & area = subRegion.getElementArea().toViewConst(); + arrayView2d< real64 > const & dispJump = subRegion.getField< contact::dispJump >(); + arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); + arrayView1d< real64 > const & aperture = subRegion.getField< fields::elementAperture >(); + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { if( elemsToFaces.sizeOfArray( kfe ) != 2 ) @@ -483,6 +491,10 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition real64 dispJumpTemp[ 3 ]; LvArray::tensorOps::Ri_eq_AjiBj< 3, 3 >( dispJumpTemp, rotationMatrix[ kfe ], globalJumpTemp ); LvArray::tensorOps::copy< 3 >( dispJump[ kfe ], dispJumpTemp ); + + slip[ kfe ] = LvArray::math::sqrt( LvArray::math::square( dispJump( kfe, 1 ) ) + + LvArray::math::square( dispJump( kfe, 2 ) ) ); + aperture[ kfe ] = dispJump[ kfe ][ 0 ]; } ); } } ); @@ -518,15 +530,16 @@ void SolidMechanicsLagrangeContact::setupDofs( DomainPartition const & domain, 3, meshTargets ); - dofManager.addCoupling( contact::traction::key(), - contact::traction::key(), - DofManager::Connector::Face, - meshTargets ); - dofManager.addCoupling( solidMechanics::totalDisplacement::key(), contact::traction::key(), DofManager::Connector::Elem, meshTargets ); + + NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); + FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( m_stabilizationName ); + + dofManager.addCoupling( contact::traction::key(), stabilizationMethod ); } void SolidMechanicsLagrangeContact::assembleSystem( real64 const time, @@ -672,117 +685,105 @@ real64 SolidMechanicsLagrangeContact::calculateResidualNorm( real64 const & time real64 const solidResidual = SolidMechanicsLagrangianFEM::calculateResidualNorm( time, dt, domain, dofManager, localRhs ); - real64 momentumR2 = 0.0; - real64 contactR2 = 0.0; + real64 const contactResidual = calculateContactResidualNorm( domain, dofManager, localRhs ); + + return sqrt( solidResidual * solidResidual + contactResidual * contactResidual ); +} + +real64 SolidMechanicsLagrangeContact::calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) +{ + string const & dofKey = dofManager.getKey( contact::traction::key() ); + globalIndex const rankOffset = dofManager.rankOffset(); + + real64 stickResidual = 0.0; + real64 slipResidual = 0.0; + real64 slipNormalizer = 0.0; + real64 openResidual = 0.0; + real64 openNormalizer = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - arrayView1d< globalIndex const > const & dispDofNumber = - nodeManager.getReference< array1d< globalIndex > >( dofManager.getKey( solidMechanics::totalDisplacement::key() ) ); - - string const & dofKey = dofManager.getKey( contact::traction::key() ); - globalIndex const rankOffset = dofManager.rankOffset(); - - arrayView1d< integer const > const & elemGhostRank = nodeManager.ghostRank(); - - RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum0( 0.0 ); - forAll< parallelDevicePolicy<> >( nodeManager.size(), - [localRhs, localSum0, dispDofNumber, rankOffset, elemGhostRank] GEOS_HOST_DEVICE ( localIndex const k ) - { - if( elemGhostRank[k] < 0 ) - { - localIndex const localRow = LvArray::integerConversion< localIndex >( dispDofNumber[k] - rankOffset ); - for( localIndex dim = 0; dim < 3; ++dim ) - { - localSum0 += localRhs[localRow + dim] * localRhs[localRow + dim]; - } - } - } ); - momentumR2 += localSum0.get(); - mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, FaceElementSubRegion const & subRegion ) { arrayView1d< globalIndex const > const & dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< integer const > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 const > const & area = subRegion.getElementArea(); - RAJA::ReduceSum< parallelHostReduce, real64 > localSum( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > stickSum( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > slipSum( 0.0 ); + RAJA::ReduceMax< parallelHostReduce, real64 > slipMax( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > openSum( 0.0 ); + RAJA::ReduceMax< parallelHostReduce, real64 > openMax( 0.0 ); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const k ) { if( ghostRank[k] < 0 ) { localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); - for( localIndex dim = 0; dim < 3; ++dim ) + switch( fractureState[k] ) { - localSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + case contact::FractureState::Stick: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + real64 const norm = localRhs[localRow + dim] / area[k]; + stickSum += norm * norm; + } + break; + } + case contact::FractureState::Slip: + case contact::FractureState::NewSlip: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + slipSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + slipMax.max( LvArray::math::abs( localRhs[localRow + dim] ) ); + } + break; + } + case contact::FractureState::Open: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + openSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + openMax.max( LvArray::math::abs( localRhs[localRow + dim] ) ); + } + break; + } } } } ); - contactR2 += localSum.get(); + + stickResidual += stickSum.get(); + slipResidual += slipSum.get(); + slipNormalizer = LvArray::math::max( slipNormalizer, slipMax.get()); + openResidual += openSum.get(); + openNormalizer = LvArray::math::max( openNormalizer, openMax.get()); } ); } ); - real64 localR2[2] = { momentumR2, contactR2 }; - real64 globalResidualNorm[3]{}; - - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); - array1d< real64 > globalR2( 2 * size ); - globalR2.zero(); - - // Everything is done on rank 0 - MpiWrapper::gather( localR2, - 2, - globalR2.data(), - 2, - 0, - MPI_COMM_GEOSX ); - - if( rank==0 ) - { - globalResidualNorm[0] = 0.0; - globalResidualNorm[1] = 0.0; - for( int r=0; r= 1 && logger::internal::rank == 0 ) + slipResidual = MpiWrapper::sum( slipResidual ); + slipNormalizer = MpiWrapper::max( slipNormalizer ); + slipResidual = sqrt( slipResidual ) / ( slipNormalizer + 1.0 ); + + openResidual = MpiWrapper::sum( openResidual ); + openNormalizer = MpiWrapper::max( openNormalizer ); + openResidual = sqrt( openResidual ) / ( openNormalizer + 1.0 ); + + if( getLogLevel() >= 1 && logger::internal::rank==0 ) { - std::cout<< GEOS_FMT( - " ( Rdisplacement, Rtraction, Rtotal ) = ( {:15.6e}, {:15.6e}, {:15.6e} )", - globalResidualNorm[0], - globalResidualNorm[1], - globalResidualNorm[2] ); + std::cout << GEOS_FMT( " ( Rstick Rslip Ropen ) = ( {:15.6e} {:15.6e} {:15.6e} )", stickResidual, slipResidual, openResidual ); } - return sqrt( globalResidualNorm[2]*globalResidualNorm[2] + solidResidual*solidResidual ); + + return sqrt( stickResidual * stickResidual + slipResidual * slipResidual + openResidual * openResidual ); } void SolidMechanicsLagrangeContact::createPreconditioner( DomainPartition const & domain ) @@ -864,18 +865,20 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d arrayView1d< string const > const & regionNames ) { FaceManager const & faceManager = mesh.getFaceManager(); - ElementRegionManager & elemManager = mesh.getElemManager(); - arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, - [&]( localIndex const, - FaceElementSubRegion & subRegion ) + mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, + [&]( localIndex const, + FaceElementSubRegion & subRegion ) { ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); + arrayView2d< real64 > const unitNormal = subRegion.getNormalVector(); + arrayView2d< real64 > const unitTangent1 = subRegion.getTangentVector1(); + arrayView2d< real64 > const unitTangent2 = subRegion.getTangentVector2(); forAll< parallelHostPolicy >( subRegion.size(), [=]( localIndex const kfe ) { @@ -884,14 +887,27 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d return; } + localIndex const f0 = elemsToFaces[kfe][0]; + localIndex const f1 = elemsToFaces[kfe][1]; + stackArray1d< real64, 3 > Nbar( 3 ); - localIndex const & f0 = elemsToFaces[kfe][0], f1 = elemsToFaces[kfe][1]; Nbar[ 0 ] = faceNormal[f0][0] - faceNormal[f1][0]; Nbar[ 1 ] = faceNormal[f0][1] - faceNormal[f1][1]; Nbar[ 2 ] = faceNormal[f0][2] - faceNormal[f1][2]; LvArray::tensorOps::normalize< 3 >( Nbar ); computationalGeometry::RotationMatrix_3D( Nbar.toSliceConst(), rotationMatrix[kfe] ); + real64 const columnVector1[3] = { rotationMatrix[kfe][ 0 ][ 1 ], + rotationMatrix[kfe][ 1 ][ 1 ], + rotationMatrix[kfe][ 2 ][ 1 ] }; + + real64 const columnVector2[3] = { rotationMatrix[kfe][ 0 ][ 2 ], + rotationMatrix[kfe][ 1 ][ 2 ], + rotationMatrix[kfe][ 2 ][ 2 ] }; + + LvArray::tensorOps::copy< 3 >( unitNormal[kfe], Nbar ); + LvArray::tensorOps::copy< 3 >( unitTangent1[kfe], columnVector1 ); + LvArray::tensorOps::copy< 3 >( unitTangent2[kfe], columnVector2 ); } ); } ); } ); @@ -1184,11 +1200,11 @@ void SolidMechanicsLagrangeContact:: { if( i == 0 ) { - elemRHS[i] = +Ja * dispJump[kfe][i]; + elemRHS[i] = Ja * dispJump[kfe][i]; } else { - elemRHS[i] = +Ja * ( dispJump[kfe][i] - previousDispJump[kfe][i] ); + elemRHS[i] = Ja * ( dispJump[kfe][i] - previousDispJump[kfe][i] ); } } @@ -1216,7 +1232,7 @@ void SolidMechanicsLagrangeContact:: case contact::FractureState::Slip: case contact::FractureState::NewSlip: { - elemRHS[0] = +Ja * dispJump[kfe][0]; + elemRHS[0] = Ja * dispJump[kfe][0]; for( localIndex kf = 0; kf < 2; ++kf ) { @@ -1247,7 +1263,10 @@ void SolidMechanicsLagrangeContact:: { for( localIndex i = 1; i < 3; ++i ) { - elemRHS[i] = +Ja * ( traction[kfe][i] - limitTau * sliding[ i-1 ] / slidingNorm ); + elemRHS[i] = Ja * ( traction[kfe][i] - limitTau * sliding[ i-1 ] / slidingNorm ); + + dRdT( i, 0 ) = Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; + dRdT( i, i ) = Ja; } // A symmetric 2x2 matrix. @@ -1275,11 +1294,6 @@ void SolidMechanicsLagrangeContact:: } } } - for( localIndex i = 1; i < 3; ++i ) - { - dRdT( i, 0 ) = Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; - dRdT( i, i ) = Ja; - } } else { @@ -1289,21 +1303,18 @@ void SolidMechanicsLagrangeContact:: { for( localIndex i = 1; i < 3; ++i ) { - elemRHS[i] = +Ja * ( traction[kfe][i] - limitTau * vaux[ i-1 ] / vauxNorm ); - } - for( localIndex i = 1; i < 3; ++i ) - { + elemRHS[i] = Ja * traction[kfe][i] * ( 1.0 - limitTau / vauxNorm ); + + dRdT( i, 0 ) = Ja * traction[kfe][i] * dLimitTau_dNormalTraction / vauxNorm; dRdT( i, i ) = Ja; } } else { - for( localIndex i = 1; i < 3; ++i ) + for( int i = 1; i < 3; ++i ) { elemRHS[i] = 0.0; - } - for( localIndex i = 1; i < 3; ++i ) - { + dRdT( i, i ) = Ja; } } @@ -1312,13 +1323,10 @@ void SolidMechanicsLagrangeContact:: } case contact::FractureState::Open: { - for( localIndex i = 0; i < 3; ++i ) + for( int i = 0; i < 3; ++i ) { - elemRHS[i] = +Ja * traction[kfe][i]; - } + elemRHS[i] = Ja * traction[kfe][i]; - for( localIndex i = 0; i < 3; ++i ) - { dRdT( i, i ) = Ja; } break; @@ -1327,13 +1335,13 @@ void SolidMechanicsLagrangeContact:: localIndex const localRow = LvArray::integerConversion< localIndex >( elemDOF[0] - rankOffset ); - for( localIndex idof = 0; idof < 3; ++idof ) { localRhs[localRow + idof] += elemRHS[idof]; if( fractureState[kfe] != contact::FractureState::Open ) { + localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localRow + idof, nodeDOF, dRdU[idof].dataIfContiguous(), @@ -1559,7 +1567,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes // Combine E and nu to obtain a stiffness approximation (like it was an hexahedron) for( localIndex j = 0; j < 3; ++j ) { - stiffDiagApprox[ kf ][ i ][ j ] = E / ( ( 1.0 + nu )*( 1.0 - 2.0*nu ) ) * 2.0 / 9.0 * ( 2.0 - 3.0 * nu ) * volume / ( boxSize[j]*boxSize[j] ); + stiffDiagApprox[ kf ][ i ][ j ] = m_stabilitzationScalingCoefficient * E / ( ( 1.0 + nu )*( 1.0 - 2.0*nu ) ) * 2.0 / 9.0 * ( 2.0 - 3.0 * nu ) * volume / ( boxSize[j]*boxSize[j] ); } } } @@ -1809,7 +1817,6 @@ void SolidMechanicsLagrangeContact::applySystemSolution( DofManager const & dofM void SolidMechanicsLagrangeContact::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; - computeFaceDisplacementJump( domain ); } @@ -1850,7 +1857,8 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai using namespace fields::contact; - int hasConfigurationConverged = true; + real64 changedArea = 0; + real64 totalArea = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -1868,13 +1876,15 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai arrayView2d< real64 const > const & traction = subRegion.getField< contact::traction >(); arrayView2d< real64 const > const & dispJump = subRegion.getField< contact::dispJump >(); arrayView1d< integer > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 const > const & faceArea = subRegion.getElementArea().toViewConst(); arrayView1d< real64 const > const & normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); arrayView1d< real64 const > const & normalDisplacementTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); - RAJA::ReduceMin< parallelHostReduce, integer > checkActiveSetSub( 1 ); + RAJA::ReduceSum< parallelHostReduce, real64 > changed( 0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > total( 0 ); constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) { @@ -1934,26 +1944,28 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai fractureState[kfe] = contact::FractureState::Stick; } } - checkActiveSetSub.min( compareFractureStates( originalFractureState, fractureState[kfe] ) ); + + changed += faceArea[kfe] * !compareFractureStates( originalFractureState, fractureState[kfe] ); + total += faceArea[kfe]; } } ); } ); - hasConfigurationConverged &= checkActiveSetSub.get(); + changedArea += changed.get(); + totalArea += total.get(); } ); } ); + // Need to synchronize the fracture state due to the use will be made of in AssemblyStabilization synchronizeFractureState( domain ); - // Compute if globally the fracture state has changed - int hasConfigurationConvergedGlobally; - MpiWrapper::allReduce( &hasConfigurationConverged, - &hasConfigurationConvergedGlobally, - 1, - MPI_LAND, - MPI_COMM_GEOSX ); + // Compute global area of changed elements + changedArea = MpiWrapper::sum( changedArea ); + // and total area of fracture elements + totalArea = MpiWrapper::sum( totalArea ); - return hasConfigurationConvergedGlobally; + // Assume converged if changed area is below certain fraction of total area + return changedArea <= m_nonlinearSolverParameters.m_configurationTolerance * totalArea; } bool SolidMechanicsLagrangeContact::isFractureAllInStickCondition( DomainPartition const & domain ) const diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 8b665165759..bdb00997153 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -25,7 +25,7 @@ namespace geos { -class SolidMechanicsLagrangianFEM; +class NumericalMethodsManager; class SolidMechanicsLagrangeContact : public ContactSolverBase { @@ -154,12 +154,18 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase string getStabilizationName() const { return m_stabilizationName; } +protected: + + real64 calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ); + private: string m_stabilizationName; real64 const m_slidingCheckTolerance = 0.05; - real64 m_initialResidual[3] = {0.0, 0.0, 0.0}; + real64 m_stabilitzationScalingCoefficient = 1.0; void createPreconditioner( DomainPartition const & domain ); @@ -172,10 +178,14 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase constexpr static char const * rotationMatrixString() { return "rotationMatrix"; } constexpr static char const * normalDisplacementToleranceString() { return "normalDisplacementTolerance"; } + constexpr static char const * normalTractionToleranceString() { return "normalTractionTolerance"; } + constexpr static char const * slidingToleranceString() { return "slidingTolerance"; } constexpr static char const * transMultiplierString() { return "penaltyStiffnessTransMultiplier"; } + + constexpr static char const * stabilizationScalingCoefficientString() { return "stabilizationScalingCoefficient"; } }; }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 7f914e12b22..8b67ebe2b18 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -18,8 +18,6 @@ #include "CompositionalMultiphaseBase.hpp" -#include "common/DataTypes.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" #include "constitutive/capillaryPressure/CapillaryPressureFields.hpp" #include "constitutive/capillaryPressure/capillaryPressureSelector.hpp" @@ -32,13 +30,12 @@ #include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" #include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" #include "constitutive/relativePermeability/RelativePermeabilitySelector.hpp" -#include "constitutive/solid/SolidBase.hpp" #include "constitutive/solid/SolidInternalEnergy.hpp" #include "constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" @@ -66,7 +63,6 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, m_hasCapPressure( 0 ), m_hasDiffusion( 0 ), m_hasDispersion( 0 ), - m_keepFlowVariablesConstantDuringInitStep( 0 ), m_minScalingFactor( 0.01 ), m_allowCompDensChopping( 1 ), m_useTotalMassEquation( 1 ), @@ -78,10 +74,13 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Temperature" ); //END_SPHINX_INCLUDE_00 + + // TODO: add more description on how useMass can alter the simulation (convergence issues?). How does it interact with wells useMass? this->registerWrapper( viewKeyStruct::useMassFlagString(), &m_useMass ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Use mass formulation instead of molar" ); + setDescription( GEOS_FMT( "Use mass formulation instead of molar. Warning : Affects {} rates units.", + SourceFluxBoundaryCondition::catalogName() ) ); this->registerWrapper( viewKeyStruct::solutionChangeScalingFactorString(), &m_solutionChangeScalingFactor ). setSizedFromParent( 0 ). @@ -103,6 +102,11 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0.2 ). setDescription( "Target (absolute) change in phase volume fraction in a time step" ); + this->registerWrapper( viewKeyStruct::targetRelativeCompDensChangeString(), &m_targetRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Target (relative) change in component density in a time step" ); this->registerWrapper( viewKeyStruct::maxCompFracChangeString(), &m_maxCompFracChange ). setSizedFromParent( 0 ). @@ -119,6 +123,11 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0.5 ). setDescription( "Maximum (relative) change in temperature in a Newton iteration" ); + this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Maximum (relative) change in a component density in a Newton iteration" ); this->registerWrapper( viewKeyStruct::allowLocalCompDensChoppingString(), &m_allowCompDensChopping ). setSizedFromParent( 0 ). @@ -155,6 +164,12 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 1.0 ). setDescription( "Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check" ); + + this->registerWrapper( viewKeyStruct::minScalingFactorString(), &m_minScalingFactor ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.01 ). + setDescription( "Minimum value for solution scaling factor" ); } void CompositionalMultiphaseBase::postProcessInput() @@ -173,15 +188,21 @@ void CompositionalMultiphaseBase::postProcessInput() GEOS_ERROR_IF_LE_MSG( m_maxRelativeTempChange, 0.0, getWrapperDataContext( viewKeyStruct::maxRelativeTempChangeString() ) << ": The maximum relative change in temperature in a Newton iteration must be larger than 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_maxRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::maxRelativeCompDensChangeString() ) << + ": The maximum relative change in component density in a Newton iteration must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetRelativePresChange, 0.0, getWrapperDataContext( viewKeyStruct::targetRelativePresChangeString() ) << ": The target relative change in pressure in a time step must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetRelativeTempChange, 0.0, getWrapperDataContext( viewKeyStruct::targetRelativeTempChangeString() ) << - ": The target relative change in temperature in a time step must be larger than to 0.0" ); + ": The target relative change in temperature in a time step must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetPhaseVolFracChange, 0.0, getWrapperDataContext( viewKeyStruct::targetPhaseVolFracChangeString() ) << - ": The target change in phase volume fraction in a time step must be larger than to 0.0" ); + ": The target change in phase volume fraction in a time step must be larger than 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_targetRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::targetPhaseVolFracChangeString() ) << + ": The target change in component density in a time step must be larger than 0.0" ); GEOS_ERROR_IF_LT_MSG( m_solutionChangeScalingFactor, 0.0, getWrapperDataContext( viewKeyStruct::solutionChangeScalingFactorString() ) << @@ -189,6 +210,12 @@ void CompositionalMultiphaseBase::postProcessInput() GEOS_ERROR_IF_GT_MSG( m_solutionChangeScalingFactor, 1.0, getWrapperDataContext( viewKeyStruct::solutionChangeScalingFactorString() ) << ": The solution change scaling factor must be smaller or equal to 1.0" ); + GEOS_ERROR_IF_LE_MSG( m_minScalingFactor, 0.0, + getWrapperDataContext( viewKeyStruct::minScalingFactorString() ) << + ": The minumum scaling factor must be larger than 0.0" ); + GEOS_ERROR_IF_GT_MSG( m_minScalingFactor, 1.0, + getWrapperDataContext( viewKeyStruct::minScalingFactorString() ) << + ": The minumum scaling factor must be smaller or equal to 1.0" ); if( m_isThermal && m_useSimpleAccumulation == 1 ) // useSimpleAccumulation is not yet compatible with thermal { @@ -363,10 +390,17 @@ void CompositionalMultiphaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< dPhaseMobility >( getName() ). reference().resizeDimension< 1, 2 >( m_numPhases, m_numComponents + 2 ); // dP, dT, dC + // needed for time step selector subRegion.registerField< phaseVolumeFraction_n >( getName() ). reference().resizeDimension< 1 >( m_numPhases ); - subRegion.registerField< phaseMobility_n >( getName() ). - reference().resizeDimension< 1 >( m_numPhases ); + + subRegion.registerField< compAmount >( getName() ). + setDimLabels( 1, fluid.componentNames() ). + reference().resizeDimension< 1 >( m_numComponents ); + subRegion.registerField< compAmount_n >( getName() ). + setDimLabels( 1, fluid.componentNames() ). + reference().resizeDimension< 1 >( m_numComponents ); + } ); FaceManager & faceManager = mesh.getFaceManager(); @@ -701,6 +735,57 @@ void CompositionalMultiphaseBase::updateCapPressureModel( ObjectManagerBase & da } } +void CompositionalMultiphaseBase::updateCompAmount( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); + arrayView2d< real64, compflow::USD_COMP > const compAmount = subRegion.getField< fields::flow::compAmount >(); + + integer const numComp = m_numComponents; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + for( integer ic = 0; ic < numComp; ++ic ) + { + compAmount[ei][ic] = porosity[ei][0] * volume[ei] * compDens[ei][ic]; + } + } ); +} + +void CompositionalMultiphaseBase::updateEnergy( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); + arrayView2d< real64 const > rockInternalEnergy = porousMaterial.getInternalEnergy(); + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = subRegion.getField< fields::flow::phaseVolumeFraction >(); + string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); + MultiFluidBase & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + arrayView3d< real64 const, multifluid::USD_PHASE > const phaseDens = fluid.phaseDensity(); + arrayView3d< real64 const, multifluid::USD_PHASE > const phaseInternalEnergy = fluid.phaseInternalEnergy(); + + arrayView1d< real64 > const energy = subRegion.getField< fields::flow::energy >(); + + integer const numPhases = m_numPhases; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + energy[ei] = volume[ei] * (1.0 - porosity[ei][0]) * rockInternalEnergy[ei][0]; + for( integer ip = 0; ip < numPhases; ++ip ) + { + energy[ei] += volume[ei] * porosity[ei][0] * phaseVolFrac[ei][ip] * phaseDens[ei][0][ip] * phaseInternalEnergy[ei][0][ip]; + } + } ); +} + void CompositionalMultiphaseBase::updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const { arrayView1d< real64 const > const temp = dataGroup.getField< fields::flow::temperature >(); @@ -719,12 +804,13 @@ void CompositionalMultiphaseBase::updateSolidInternalEnergyModel( ObjectManagerB temp ); } -real64 CompositionalMultiphaseBase::updateFluidState( ObjectManagerBase & subRegion ) const +real64 CompositionalMultiphaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const { GEOS_MARK_FUNCTION; updateGlobalComponentFraction( subRegion ); updateFluidModel( subRegion ); + updateCompAmount( subRegion ); real64 const maxDeltaPhaseVolFrac = updatePhaseVolumeFraction( subRegion ); updateRelPermModel( subRegion ); updatePhaseMobility( subRegion ); @@ -772,7 +858,6 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, compDens[ei][ic] = totalDens[ei][0] * compFrac[ei][ic]; } } ); - } ); // with initial component densities defined - check if they need to be corrected to avoid zero diags etc @@ -800,6 +885,7 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, porousSolid.scaleReferencePorosity( netToGross ); saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes updatePorosityAndPermeability( subRegion ); + updateCompAmount( subRegion ); updatePhaseVolumeFraction( subRegion ); // Now, we initialize and update each constitutive model one by one @@ -887,6 +973,8 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, SolidInternalEnergy const & solidInternalEnergyMaterial = getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); solidInternalEnergyMaterial.saveConvergedState(); + + updateEnergy( subRegion ); } // Step 4.7: if the diffusion and/or dispersion is/are supported, initialize the two models @@ -948,7 +1036,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium() getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" - "This is incompatible with the " << EquilibriumInitialCondition::catalogName() << " " << bc.getDataContext() << + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << "used in this simulation. To proceed, you can either: \n" << " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << " - Remove the hydrostatic equilibrium initial condition from the XML file", @@ -1255,19 +1343,13 @@ CompositionalMultiphaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM updateSolidInternalEnergyModel( subRegion ); } - // after the update, save the new saturation and phase mobilities + // after the update, save the new saturation arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = subRegion.template getField< fields::flow::phaseVolumeFraction >(); arrayView2d< real64, compflow::USD_PHASE > const phaseVolFrac_n = subRegion.template getField< fields::flow::phaseVolumeFraction_n >(); phaseVolFrac_n.setValues< parallelDevicePolicy<> >( phaseVolFrac ); - arrayView2d< real64 const, compflow::USD_PHASE > const phaseMob = - subRegion.template getField< fields::flow::phaseMobility >(); - arrayView2d< real64, compflow::USD_PHASE > const phaseMob_n = - subRegion.template getField< fields::flow::phaseMobility_n >(); - phaseMob_n.setValues< parallelDevicePolicy<> >( phaseMob ); - } ); } ); } @@ -1286,11 +1368,22 @@ void CompositionalMultiphaseBase::assembleSystem( real64 const GEOS_UNUSED_PARAM localMatrix, localRhs ); - assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_isJumpStabilized ) + { + assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } void CompositionalMultiphaseBase::assembleAccumulationAndVolumeBalanceTerms( DomainPartition & domain, @@ -1450,8 +1543,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } if( targetSet.size() == 0 ) @@ -1480,6 +1573,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -1513,7 +1608,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, useTotalMassEquation, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1522,27 +1618,34 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, return; } + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! + massProd += rhsValue; if( useTotalMassEquation > 0 ) { // for all "fluid components", we add the value to the total mass balance equation globalIndex const totalMassBalanceRow = dofNumber[ei] - rankOffset; - localRhs[totalMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor - // here + localRhs[totalMassBalanceRow] += rhsValue; if( fluidComponentId < numFluidComponents - 1 ) { globalIndex const compMassBalanceRow = totalMassBalanceRow + fluidComponentId + 1; // component mass bal equations are shifted - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor here + localRhs[compMassBalanceRow] += rhsValue; } } else { globalIndex const compMassBalanceRow = dofNumber[ei] - rankOffset + fluidComponentId; - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor here + localRhs[compMassBalanceRow] += rhsValue; } } ); + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ m_numComponents }; + massProdArr[fluidComponentId] = massProd.get(); + wrapper.gatherTimeStepStats( time, dt, massProdArr.toViewConst(), targetSet.size() ); + } ); } ); } ); } @@ -1980,6 +2083,7 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & { if( m_targetRelativePresChange >= 1.0 && m_targetPhaseVolFracChange >= 1.0 && + m_targetRelativeCompDensChange >= 1.0 && ( !m_isThermal || m_targetRelativeTempChange >= 1.0 ) ) { return LvArray::NumericLimits< real64 >::max; @@ -1988,8 +2092,10 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & real64 maxRelativePresChange = 0.0; real64 maxRelativeTempChange = 0.0; real64 maxAbsolutePhaseVolFracChange = 0.0; + real64 maxRelativeCompDensChange = 0.0; - real64 const numPhase = m_numPhases; + integer const numPhase = m_numPhases; + integer const numComp = m_numComponents; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, @@ -2009,28 +2115,38 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & subRegion.getField< fields::flow::phaseVolumeFraction >(); arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac_n = subRegion.getField< fields::flow::phaseVolumeFraction_n >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + arrayView2d< real64, compflow::USD_COMP > const compDens_n = + subRegion.getField< fields::flow::globalCompDensity_n >(); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPresChange( 0.0 ); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTempChange( 0.0 ); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPhaseVolFracChange( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxCompDensChange( 0.0 ); forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) { if( ghostRank[ei] < 0 ) { - // switch from relative to absolute when pressure less than 1 + // switch from relative to absolute when values less than 1 subRegionMaxPresChange.max( LvArray::math::abs( pres[ei] - pres_n[ei] ) / LvArray::math::max( LvArray::math::abs( pres_n[ei] ), 1.0 ) ); subRegionMaxTempChange.max( LvArray::math::abs( temp[ei] - temp_n[ei] ) / LvArray::math::max( LvArray::math::abs( temp_n[ei] ), 1.0 ) ); for( integer ip = 0; ip < numPhase; ++ip ) { subRegionMaxPhaseVolFracChange.max( LvArray::math::abs( phaseVolFrac[ei][ip] - phaseVolFrac_n[ei][ip] ) ); } + for( integer ic = 0; ic < numComp; ++ic ) + { + subRegionMaxCompDensChange.max( LvArray::math::abs( compDens[ei][ic] - compDens_n[ei][ic] ) / LvArray::math::max( LvArray::math::abs( compDens_n[ei][ic] ), 1.0 ) ); + } } } ); maxRelativePresChange = LvArray::math::max( maxRelativePresChange, subRegionMaxPresChange.get() ); maxRelativeTempChange = LvArray::math::max( maxRelativeTempChange, subRegionMaxTempChange.get() ); maxAbsolutePhaseVolFracChange = LvArray::math::max( maxAbsolutePhaseVolFracChange, subRegionMaxPhaseVolFracChange.get() ); + maxRelativeCompDensChange = LvArray::math::max( maxRelativeCompDensChange, subRegionMaxCompDensChange.get() ); } ); } ); @@ -2038,15 +2154,22 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & maxRelativePresChange = MpiWrapper::max( maxRelativePresChange ); maxAbsolutePhaseVolFracChange = MpiWrapper::max( maxAbsolutePhaseVolFracChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max relative pressure change during time step: {} %", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative pressure change during time step = {} %", getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativePresChange, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max absolute phase volume fraction change during time step: {}", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max absolute phase volume fraction change during time step = {}", getName(), GEOS_FMT( "{:.{}f}", maxAbsolutePhaseVolFracChange, 3 ) ) ); + if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) + { + maxRelativeCompDensChange = MpiWrapper::max( maxRelativeCompDensChange ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative component density change during time step = {} %", + getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeCompDensChange, 3 ) ) ); + } + if( m_isThermal ) { maxRelativeTempChange = MpiWrapper::max( maxRelativeTempChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max relative temperature change during time step: {} %", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative temperature change during time step = {} %", getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeTempChange, 3 ) ) ); } @@ -2054,14 +2177,30 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & real64 const nextDtPressure = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativePresChange / std::max( eps, maxRelativePresChange + m_solutionChangeScalingFactor * m_targetRelativePresChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on pressure change = {}", getName(), nextDtPressure )); real64 const nextDtPhaseVolFrac = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetPhaseVolFracChange / std::max( eps, maxAbsolutePhaseVolFracChange + m_solutionChangeScalingFactor * m_targetPhaseVolFracChange ); - real64 const nextDtTemperature = m_isThermal - ? currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeTempChange - / std::max( eps, maxRelativeTempChange + m_solutionChangeScalingFactor * m_targetRelativeTempChange ) - : LvArray::NumericLimits< real64 >::max; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on phase volume fraction change = {}", getName(), nextDtPhaseVolFrac )); + real64 nextDtCompDens = LvArray::NumericLimits< real64 >::max; + if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) + { + nextDtCompDens = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeCompDensChange + / std::max( eps, maxRelativeCompDensChange + m_solutionChangeScalingFactor * m_targetRelativeCompDensChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on component density change = {}", getName(), nextDtCompDens )); + } + real64 nextDtTemperature = LvArray::NumericLimits< real64 >::max; + if( m_isThermal ) + { + nextDtTemperature = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeTempChange + / std::max( eps, maxRelativeTempChange + m_solutionChangeScalingFactor * m_targetRelativeTempChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on temperature change = {}", getName(), nextDtPhaseVolFrac )); + } - return std::min( std::min( nextDtPressure, nextDtPhaseVolFrac ), nextDtTemperature ); + return std::min( std::min( nextDtPressure, std::min( nextDtPhaseVolFrac, nextDtCompDens ) ), nextDtTemperature ); } real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & currentDt, geos::DomainPartition & domain ) @@ -2071,8 +2210,8 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & cu computeCFLNumbers( domain, currentDt, maxPhaseCFL, maxCompCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, getName() << ": Max phase CFL number: " << maxPhaseCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, getName() << ": Max component CFL number: " << maxCompCFL ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max phase CFL number = {}", getName(), maxPhaseCFL ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max component CFL number = {} ", getName(), maxCompCFL ) ); return std::min( m_targetFlowCFL*currentDt/maxCompCFL, m_targetFlowCFL*currentDt/maxPhaseCFL ); @@ -2385,6 +2524,13 @@ void CompositionalMultiphaseBase::saveConvergedState( ElementSubRegionBase & sub arrayView2d< real64, compflow::USD_COMP > const & compDens_n = subRegion.template getField< fields::flow::globalCompDensity_n >(); compDens_n.setValues< parallelDevicePolicy<> >( compDens ); + + arrayView2d< real64 const, compflow::USD_COMP > const & compAmount = + subRegion.template getField< fields::flow::compAmount >(); + arrayView2d< real64, compflow::USD_COMP > const & compAmount_n = + subRegion.template getField< fields::flow::compAmount_n >(); + compAmount_n.setValues< parallelDevicePolicy<> >( compAmount ); + if( m_isFixedStressPoromechanicsUpdate ) { arrayView2d< real64, compflow::USD_COMP > const & compDens_k = @@ -2442,6 +2588,9 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; + if( m_keepFlowVariablesConstantDuringInitStep ) + return; + real64 maxDeltaPhaseVolFrac = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, @@ -2460,6 +2609,7 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 5e5803d3a04..cd4809d2cee 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -19,12 +19,8 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_ -#include "common/DataLayouts.hpp" -#include "constitutive/fluid/multifluid/Layouts.hpp" -#include "constitutive/relativePermeability/layouts.hpp" -#include "constitutive/capillaryPressure/layouts.hpp" -#include "fieldSpecification/FieldSpecificationManager.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" namespace geos { @@ -137,6 +133,18 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ void updateCapPressureModel( ObjectManagerBase & dataGroup ) const; + /** + * @brief Update components mass/moles + * @param subRegion the subregion storing the required fields + */ + void updateCompAmount( ElementSubRegionBase & subRegion ) const; + + /** + * @brief Update energy + * @param subRegion the subregion storing the required fields + */ + void updateEnergy( ElementSubRegionBase & subRegion ) const; + /** * @brief Update all relevant solid internal energy models using current values of temperature * @param dataGroup the group storing the required fields @@ -149,7 +157,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ virtual void updatePhaseMobility( ObjectManagerBase & dataGroup ) const = 0; - real64 updateFluidState( ObjectManagerBase & dataGroup ) const; + real64 updateFluidState( ElementSubRegionBase & subRegion ) const; virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const override final; @@ -175,6 +183,12 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ string referenceFluidModelName() const { return m_referenceFluidModelName; } + /** + * @return The unit in which we evaluate the amount of fluid per element (Mass or Mole, depending on useMass). + */ + virtual units::Unit getMassUnit() const override + { return m_useMass ? units::Unit::Mass : units::Unit::Mole; } + /** * @brief assembles the accumulation and volume balance terms for all cells * @param time_n previous time value @@ -227,11 +241,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase // inputs - static constexpr char const * inputTemperatureString() { return "temperature"; } static constexpr char const * useMassFlagString() { return "useMass"; } static constexpr char const * relPermNamesString() { return "relPermNames"; } static constexpr char const * capPressureNamesString() { return "capPressureNames"; } - static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } static constexpr char const * diffusionNamesString() { return "diffusionNames"; } static constexpr char const * dispersionNamesString() { return "dispersionNames"; } @@ -242,6 +254,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * targetRelativePresChangeString() { return "targetRelativePressureChangeInTimeStep"; } static constexpr char const * targetRelativeTempChangeString() { return "targetRelativeTemperatureChangeInTimeStep"; } static constexpr char const * targetPhaseVolFracChangeString() { return "targetPhaseVolFractionChangeInTimeStep"; } + static constexpr char const * targetRelativeCompDensChangeString() { return "targetRelativeCompDensChangeInTimeStep"; } static constexpr char const * targetFlowCFLString() { return "targetFlowCFL"; } @@ -250,11 +263,13 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * maxCompFracChangeString() { return "maxCompFractionChange"; } static constexpr char const * maxRelativePresChangeString() { return "maxRelativePressureChange"; } static constexpr char const * maxRelativeTempChangeString() { return "maxRelativeTemperatureChange"; } + static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; } static constexpr char const * allowLocalCompDensChoppingString() { return "allowLocalCompDensityChopping"; } static constexpr char const * useTotalMassEquationString() { return "useTotalMassEquation"; } static constexpr char const * useSimpleAccumulationString() { return "useSimpleAccumulation"; } static constexpr char const * minCompDensString() { return "minCompDens"; } static constexpr char const * maxSequentialCompDensChangeString() { return "maxSequentialCompDensChange"; } + static constexpr char const * minScalingFactorString() { return "minScalingFactor"; } }; @@ -321,14 +336,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) const = 0; - /** - * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) - * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step - * @detail This function is meant to be called by a specific task before/after the initialization step - */ - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } - /** * @brief Function to fix the initial state during the initialization step in coupled problems * @param[in] time current time @@ -423,9 +430,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// the number of fluid components integer m_numComponents; - /// the input temperature - real64 m_inputTemperature; - /// flag indicating whether mass or molar formulation should be used integer m_useMass; @@ -438,9 +442,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// flag to determine whether or not to apply dispersion integer m_hasDispersion; - /// flag to freeze the initial state during initialization in coupled problems - integer m_keepFlowVariablesConstantDuringInitStep; - /// maximum (absolute) change in a component fraction in a Newton iteration real64 m_maxCompFracChange; @@ -450,6 +451,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// maximum (relative) change in temperature in a Newton iteration real64 m_maxRelativeTempChange; + /// maximum (relative) change in component density in a Newton iteration + real64 m_maxRelativeCompDensChange; + /// damping factor for solution change targets real64 m_solutionChangeScalingFactor; @@ -462,6 +466,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// target (absolute) change in phase volume fraction in a time step real64 m_targetPhaseVolFracChange; + /// target (relative) change in component density in a time step + real64 m_targetRelativeCompDensChange; + /// minimum value of the scaling factor obtained by enforcing maxCompFracChange real64 m_minScalingFactor; @@ -524,8 +531,8 @@ void CompositionalMultiphaseBase::applyFieldValue( real64 const & time_n, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); GEOS_LOG_RANK_0( GEOS_FMT( logMessage, - getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), fs.getScale(), numTargetElems ) ); + getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), fs.getScale(), numTargetElems ) ); } // Specify the bc value of the field diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp index 847126b111b..2c687f7dfb8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp @@ -119,6 +119,7 @@ DECLARE_FIELD( dPhaseMobility, NO_WRITE, "Derivative of phase volume fraction with respect to pressure, temperature, global component density" ); +// this is needed for time step selector DECLARE_FIELD( phaseVolumeFraction_n, "phaseVolumeFraction_n", array2dLayoutPhase, @@ -127,14 +128,6 @@ DECLARE_FIELD( phaseVolumeFraction_n, WRITE_AND_READ, "Phase volume fraction at the previous converged time step" ); -DECLARE_FIELD( phaseMobility_n, - "phaseMobility_n", - array2dLayoutPhase, - 0, - NOPLOT, - WRITE_AND_READ, - "Phase mobility at the previous converged time step" ); - DECLARE_FIELD( phaseOutflux, "phaseOutflux", array2dLayoutPhase, @@ -175,6 +168,22 @@ DECLARE_FIELD( globalCompDensityScalingFactor, NO_WRITE, "Scaling factors for global component densities" ); +DECLARE_FIELD( compAmount, + "compAmount", + array2dLayoutComp, + 0, + LEVEL_0, + WRITE_AND_READ, + "Component amount" ); + +DECLARE_FIELD( compAmount_n, + "compAmount_n", + array2dLayoutComp, + 0, + LEVEL_0, + WRITE_AND_READ, + "Component amount at the previous converged time step" ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index a1da4a86c46..0cc1c160dfc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -18,9 +18,7 @@ #include "CompositionalMultiphaseFVM.hpp" -#include "common/DataTypes.hpp" #include "common/MpiWrapper.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" @@ -489,6 +487,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d m_maxAbsolutePresChange, m_maxRelativeTempChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, @@ -499,6 +498,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, @@ -525,26 +525,26 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d minCompDensScalingFactor = MpiWrapper::min( minCompDensScalingFactor ); string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change: {} Pa (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change: {} {} (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change = {} {} (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); if( m_isThermal ) { maxDeltaTemp = MpiWrapper::max( maxDeltaTemp ); minTempScalingFactor = MpiWrapper::min( minTempScalingFactor ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change: {} K (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change = {} K (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); } if( m_scalingType == ScalingType::Local ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min pressure scaling factor: {}", getName(), minPresScalingFactor ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min component density scaling factor: {}", getName(), minCompDensScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min pressure scaling factor = {}", getName(), minPresScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min component density scaling factor = {}", getName(), minCompDensScalingFactor ) ); if( m_isThermal ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min temperature scaling factor: {}", getName(), minTempScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min temperature scaling factor = {}", getName(), minTempScalingFactor ) ); } } @@ -1056,8 +1056,8 @@ void CompositionalMultiphaseFVM::applyAquiferBC( real64 const time, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - getName(), time+dt, AquiferBoundaryCondition::catalogName(), - bc.getName(), setName, faceManager.getName(), bc.getScale(), numTargetFaces ) ); + getName(), time+dt, bc.getCatalogName(), bc.getName(), + setName, faceManager.getName(), bc.getScale(), numTargetFaces ) ); } if( stencil.size() == 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 431a7320860..f7db21f60d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -18,7 +18,6 @@ #include "CompositionalMultiphaseHybridFVM.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" @@ -31,7 +30,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" /** * @namespace the geosx namespace that encapsulates the majority of the code @@ -424,7 +423,8 @@ void CompositionalMultiphaseHybridFVM::assembleStabilizedFluxTerms( real64 const arrayView1d< real64 > const & localRhs ) const { // stab not implemented - assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available for this flow solver" ); } real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartition & domain, @@ -450,6 +450,7 @@ real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartiti createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 12e85758df4..428fc115a06 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -20,7 +20,6 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEHYBRIDFVM_HPP_ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 137a760069d..ab5932ce13a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -115,8 +115,7 @@ void CompositionalMultiphaseStatistics::registerDataOnMesh( Group & meshBodies ) if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) { std::ofstream outputFile( m_outputDir + "/" + regionNames[i] + ".csv" ); - integer const useMass = m_solver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); - string const massUnit = useMass ? "kg" : "mol"; + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); outputFile << "Time [s],Min pressure [Pa],Average pressure [Pa],Max pressure [Pa],Min delta pressure [Pa],Max delta pressure [Pa]," << "Min temperature [Pa],Average temperature [Pa],Max temperature [Pa],Total dynamic pore volume [rm^3]"; @@ -305,7 +304,7 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti subRegionImmobilePhaseMass.toView(), subRegionComponentMass.toView() ); - ElementRegionBase & region = elemManager.getRegion( subRegion.getParent().getParent().getName() ); + ElementRegionBase & region = elemManager.getRegion( ElementRegionBase::getParentRegion( subRegion ).getName() ); RegionStatistics & regionStatistics = region.getReference< RegionStatistics >( viewKeyStruct::regionStatisticsString() ); regionStatistics.averagePressure += subRegionAvgPresNumerator; @@ -405,8 +404,7 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti mobilePhaseMass[ip] = regionStatistics.phaseMass[ip] - regionStatistics.immobilePhaseMass[ip]; } - integer const useMass = m_solver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); - string const massUnit = useMass ? "kg" : "mol"; + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Pressure (min, average, max): {}, {}, {} Pa", getName(), regionNames[i], time, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index cd8ed422404..756a5d5da06 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -32,7 +32,6 @@ #include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp" -#include "physicsSolvers/NonlinearSolverParameters.hpp" namespace geos { @@ -90,7 +89,9 @@ FlowSolverBase::FlowSolverBase( string const & name, SolverBase( name, parent ), m_numDofPerCell( 0 ), m_isThermal( 0 ), - m_isFixedStressPoromechanicsUpdate( false ) + m_keepFlowVariablesConstantDuringInitStep( 0 ), + m_isFixedStressPoromechanicsUpdate( false ), + m_isJumpStabilized( false ) { this->registerWrapper( viewKeyStruct::isThermalString(), &m_isThermal ). setApplyDefaultValue( 0 ). @@ -161,6 +162,11 @@ void FlowSolverBase::registerDataOnMesh( Group & meshBodies ) { subRegion.registerField< fields::flow::temperature_k >( getName() ); // needed for the fixed-stress porosity update } + if( m_isThermal ) + { + subRegion.registerField< fields::flow::energy >( getName() ); + subRegion.registerField< fields::flow::energy_n >( getName() ); + } } ); elemManager.forElementSubRegionsComplete< SurfaceElementSubRegion >( [&]( localIndex const, @@ -219,6 +225,13 @@ void FlowSolverBase::saveConvergedState( ElementSubRegionBase & subRegion ) cons arrayView1d< real64 > const temp_n = subRegion.template getField< fields::flow::temperature_n >(); temp_n.setValues< parallelDevicePolicy<> >( temp ); + if( m_isThermal ) + { + arrayView1d< real64 const > const energy = subRegion.template getField< fields::flow::energy >(); + arrayView1d< real64 > const energy_n = subRegion.template getField< fields::flow::energy_n >(); + energy_n.setValues< parallelDevicePolicy<> >( energy ); + } + if( m_isFixedStressPoromechanicsUpdate ) { arrayView1d< real64 > const pres_k = subRegion.template getField< fields::flow::pressure_k >(); @@ -278,6 +291,11 @@ void FlowSolverBase::enableFixedStressPoromechanicsUpdate() m_isFixedStressPoromechanicsUpdate = true; } +void FlowSolverBase::enableJumpStabilization() +{ + m_isJumpStabilized = true; +} + void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { SolverBase::setConstitutiveNamesCallSuper( subRegion ); @@ -719,7 +737,7 @@ void FlowSolverBase::saveAquiferConvergedState( real64 const & time, if( bc.getLogLevel() >= 1 ) { GEOS_LOG_RANK_0( GEOS_FMT( "{} {}: at time {} s, the boundary condition produces a volume of {} m3.", - AquiferBoundaryCondition::catalogName(), bc.getName(), + bc.getCatalogName(), bc.getName(), time + dt, dt * globalSumFluxes[aquiferIndex] ) ); } bc.saveConvergedState( dt * globalSumFluxes[aquiferIndex] ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 5aa98bf3772..a7d0f163085 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -20,6 +20,7 @@ #define GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_ #include "physicsSolvers/SolverBase.hpp" +#include "common/Units.hpp" namespace geos { @@ -70,7 +71,9 @@ class FlowSolverBase : public SolverBase static constexpr char const * solidNamesString() { return "solidNames"; } static constexpr char const * permeabilityNamesString() { return "permeabilityNames"; } static constexpr char const * isThermalString() { return "isThermal"; } + static constexpr char const * inputTemperatureString() { return "temperature"; } static constexpr char const * solidInternalEnergyNamesString() { return "solidInternalEnergyNames"; } + static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } static constexpr char const * allowNegativePressureString() { return "allowNegativePressure"; } static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; } static constexpr char const * maxSequentialPresChangeString() { return "maxSequentialPressureChange"; } @@ -93,6 +96,8 @@ class FlowSolverBase : public SolverBase void enableFixedStressPoromechanicsUpdate(); + void enableJumpStabilization(); + void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const; virtual void updatePorosityAndPermeability( SurfaceElementSubRegion & subRegion ) const; @@ -131,11 +136,25 @@ class FlowSolverBase : public SolverBase integer & isThermal() { return m_isThermal; } + /** + * @return The unit in which we evaluate the amount of fluid per element (Mass or Mole). + */ + virtual units::Unit getMassUnit() const + { return units::Unit::Mass; } + /** * @brief Function to activate the flag allowing negative pressure */ void allowNegativePressure() { m_allowNegativePressure = 1; } + /** + * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) + * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step + * @detail This function is meant to be called by a specific task before/after the initialization step + */ + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } + virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override; protected: @@ -180,9 +199,18 @@ class FlowSolverBase : public SolverBase /// flag to determine whether or not this is a thermal simulation integer m_isThermal; + /// the input temperature + real64 m_inputTemperature; + + /// flag to freeze the initial state during initialization in coupled problems + integer m_keepFlowVariablesConstantDuringInitStep; + /// enable the fixed stress poromechanics update of porosity bool m_isFixedStressPoromechanicsUpdate; + /// enable pressure jump stabilzation for fixed-stress poromechanics + bool m_isJumpStabilized; + /// flag if negative pressure is allowed integer m_allowNegativePressure; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 0b17130255f..53f7ea8704f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -88,21 +88,21 @@ DECLARE_FIELD( facePressure_n, NO_WRITE, "Face pressure at the previous converged time step" ); -DECLARE_FIELD( temperature, - "temperature", - array1d< real64 >, +DECLARE_FIELD( pressureGradient, + "pressureGradient", + array2d< real64 >, 0, LEVEL_0, WRITE_AND_READ, - "Temperature" ); + "Pressure gradient" ); -DECLARE_FIELD( faceTemperature, - "faceTemperature", +DECLARE_FIELD( temperature, + "temperature", array1d< real64 >, 0, LEVEL_0, WRITE_AND_READ, - "Face temperature" ); + "Temperature" ); DECLARE_FIELD( temperature_n, "temperature_n", @@ -116,7 +116,7 @@ DECLARE_FIELD( temperature_k, "temperature_k", array1d< real64 >, 0, - LEVEL_0, + NOPLOT, NO_WRITE, "Temperature at the previous sequential iteration" ); @@ -128,6 +128,14 @@ DECLARE_FIELD( initialTemperature, WRITE_AND_READ, "Initial temperature" ); +DECLARE_FIELD( faceTemperature, + "faceTemperature", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Face temperature" ); + DECLARE_FIELD( netToGross, "netToGross", array1d< real64 >, @@ -240,6 +248,38 @@ DECLARE_FIELD( temperatureScalingFactor, NO_WRITE, "Scaling factors for temperature" ); +DECLARE_FIELD( mass, + "mass", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Mass" ); + +DECLARE_FIELD( mass_n, + "mass_n", + array1d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Mass at the previous converged time step" ); + +DECLARE_FIELD( energy, + "energy", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Energy" ); + +DECLARE_FIELD( energy_n, + "energy_n", + array1d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Energy at the previous converged time step" ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index c5863e9bcad..0a4e71a1bfc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -587,21 +587,17 @@ class ElementBasedAssemblyKernel m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), m_elemGhostRank( subRegion.ghostRank() ), m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), m_porosity( solid.getPorosity() ), m_dPoro_dPres( solid.getDporosity_dPressure() ), m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), - m_phaseVolFrac_n( subRegion.getField< fields::flow::phaseVolumeFraction_n >() ), m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), - m_phaseDens_n( fluid.phaseDensity_n() ), m_phaseDens( fluid.phaseDensity() ), m_dPhaseDens( fluid.dPhaseDensity() ), - m_phaseCompFrac_n( fluid.phaseCompFraction_n() ), m_phaseCompFrac( fluid.phaseCompFraction() ), m_dPhaseCompFrac( fluid.dPhaseCompFraction() ), m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), - m_compDens_n( subRegion.getField< fields::flow::globalCompDensity_n >() ), + m_compAmount_n( subRegion.getField< fields::flow::compAmount_n >() ), m_localMatrix( localMatrix ), m_localRhs( localRhs ), m_kernelFlags( kernelFlags ) @@ -620,9 +616,6 @@ class ElementBasedAssemblyKernel /// Pore volume at time n+1 real64 poreVolume = 0.0; - /// Pore volume at the previous converged time step - real64 poreVolume_n = 0.0; - /// Derivative of pore volume with respect to pressure real64 dPoreVolume_dPres = 0.0; @@ -663,7 +656,6 @@ class ElementBasedAssemblyKernel { // initialize the pore volume stack.poreVolume = m_volume[ei] * m_porosity[ei][0]; - stack.poreVolume_n = m_volume[ei] * m_porosity_n[ei][0]; stack.dPoreVolume_dPres = m_volume[ei] * m_dPoro_dPres[ei][0]; // set row index and degrees of freedom indices for this element @@ -694,7 +686,7 @@ class ElementBasedAssemblyKernel for( integer ic = 0; ic < numComp; ++ic ) { real64 const compAmount = stack.poreVolume * m_compDens[ei][ic]; - real64 const compAmount_n = stack.poreVolume_n * m_compDens_n[ei][ic]; + real64 const compAmount_n = m_compAmount_n[ei][ic]; stack.localResidual[ic] += compAmount - compAmount_n; @@ -714,15 +706,12 @@ class ElementBasedAssemblyKernel // construct the slices for variables accessed multiple times arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac_n = m_phaseVolFrac_n[ei]; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens_n = m_phaseDens_n[ei][0]; arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac_n = m_phaseCompFrac_n[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; @@ -730,11 +719,16 @@ class ElementBasedAssemblyKernel real64 dPhaseAmount_dC[numComp]{}; real64 dPhaseCompFrac_dC[numComp]{}; + // start with old time step values + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localResidual[ic] = -m_compAmount_n[ei][ic]; + } + // sum contributions to component accumulation from each phase for( integer ip = 0; ip < m_numPhases; ++ip ) { real64 const phaseAmount = stack.poreVolume * phaseVolFrac[ip] * phaseDens[ip]; - real64 const phaseAmount_n = stack.poreVolume_n * phaseVolFrac_n[ip] * phaseDens_n[ip]; real64 const dPhaseAmount_dP = stack.dPoreVolume_dPres * phaseVolFrac[ip] * phaseDens[ip] + stack.poreVolume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] @@ -754,12 +748,11 @@ class ElementBasedAssemblyKernel for( integer ic = 0; ic < numComp; ++ic ) { real64 const phaseCompAmount = phaseAmount * phaseCompFrac[ip][ic]; - real64 const phaseCompAmount_n = phaseAmount_n * phaseCompFrac_n[ip][ic]; real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dP]; - stack.localResidual[ic] += phaseCompAmount - phaseCompAmount_n; + stack.localResidual[ic] += phaseCompAmount; stack.localJacobian[ic][0] += dPhaseCompAmount_dP; // jc - index of component w.r.t. whose compositional var the derivative is being taken @@ -778,7 +771,7 @@ class ElementBasedAssemblyKernel // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives // possible use: assemble the derivatives wrt temperature, and the accumulation term of the energy equation for this phase - phaseAmountKernelOp( ip, phaseAmount, phaseAmount_n, dPhaseAmount_dP, dPhaseAmount_dC ); + phaseAmountKernelOp( ip, phaseAmount, dPhaseAmount_dP, dPhaseAmount_dC ); } } @@ -911,7 +904,6 @@ class ElementBasedAssemblyKernel arrayView1d< real64 const > const m_volume; /// Views on the porosity - arrayView2d< real64 const > const m_porosity_n; arrayView2d< real64 const > const m_porosity; arrayView2d< real64 const > const m_dPoro_dPres; @@ -919,23 +911,22 @@ class ElementBasedAssemblyKernel arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dCompFrac_dCompDens; /// Views on the phase volume fractions - arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac; arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; /// Views on the phase densities - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens_n; arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens; arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dPhaseDens; /// Views on the phase component fraction - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const m_phaseCompFrac_n; arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const m_phaseCompFrac; arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; - // Views on component densities + // View on component densities arrayView2d< real64 const, compflow::USD_COMP > m_compDens; - arrayView2d< real64 const, compflow::USD_COMP > m_compDens_n; + + // View on component amount (mass/moles) from previous time step + arrayView2d< real64 const, compflow::USD_COMP > m_compAmount_n; /// View on the local CRS matrix CRSMatrixView< real64, globalIndex const > const m_localMatrix; @@ -1165,7 +1156,9 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe /** * @brief Create a new kernel instance * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -1179,6 +1172,7 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe ScalingForSystemSolutionKernel( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -1199,7 +1193,8 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe compDensScalingFactor ), m_maxRelativePresChange( maxRelativePresChange ), m_maxAbsolutePresChange( maxAbsolutePresChange ), - m_maxCompFracChange( maxCompFracChange ) + m_maxCompFracChange( maxCompFracChange ), + m_maxRelativeCompDensChange( maxRelativeCompDensChange ) {} /** @@ -1388,14 +1383,13 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe stack.localMaxDeltaCompDens = absCompDensChange; } - real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; - // This actually checks the change in component fraction, using a lagged total density // Indeed we can rewrite the following check as: // | prevCompDens / prevTotalDens - newCompDens / prevTotalDens | > maxCompFracChange // Note that the total density in the second term is lagged (i.e, we use prevTotalDens) // because I found it more robust than using directly newTotalDens (which can vary also // wildly when the compDens change is large) + real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; if( absCompDensChange > maxAbsCompDensChange && absCompDensChange > eps ) { real64 const compScalingFactor = maxAbsCompDensChange / absCompDensChange; @@ -1409,6 +1403,22 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe stack.localMinCompDensScalingFactor = compScalingFactor; } } + + // switch from relative to absolute when value is < 1.0 + real64 const maxRelCompDensChange = m_maxRelativeCompDensChange * LvArray::math::max( m_compDens[ei][ic], 1.0 ); + if( absCompDensChange > maxRelCompDensChange && absCompDensChange > eps ) + { + real64 const compScalingFactor = maxRelCompDensChange / absCompDensChange; + m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); + if( stack.localMinVal > compScalingFactor ) + { + stack.localMinVal = compScalingFactor; + } + if( stack.localMinCompDensScalingFactor > compScalingFactor ) + { + stack.localMinCompDensScalingFactor = compScalingFactor; + } + } } // compute the scaling factor for other vars, such as temperature @@ -1421,6 +1431,7 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe real64 const m_maxRelativePresChange; real64 const m_maxAbsolutePresChange; real64 const m_maxCompFracChange; + real64 const m_maxRelativeCompDensChange; }; @@ -1435,7 +1446,9 @@ class ScalingForSystemSolutionKernelFactory * @brief Create and launch the kernel computing the scaling factor * @tparam POLICY the kernel policy * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -1448,6 +1461,7 @@ class ScalingForSystemSolutionKernelFactory createAndLaunch( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -1462,7 +1476,7 @@ class ScalingForSystemSolutionKernelFactory subRegion.getField< fields::flow::pressureScalingFactor >(); arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, rankOffset, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 2eb5c29eac4..a08168784b6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -23,6 +23,7 @@ #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" @@ -842,8 +843,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } if( targetSet.size() == 0 ) @@ -861,6 +862,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -890,7 +893,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, fluidComponentId, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -901,7 +905,18 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, // for all "fluid components", we add the value to the component mass balance equation globalIndex const compMassBalanceRow = dofNumber[ei] - rankOffset + fluidComponentId; - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; + localRhs[compMassBalanceRow] += rhsValue; + massProd += rhsValue; + } ); + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ m_numComponents }; + massProdArr[fluidComponentId] = massProd.get(); + wrapper.gatherTimeStepStats( time, dt, massProdArr.toViewConst(), targetSet.size() ); } ); } ); } ); @@ -1081,8 +1096,8 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( targetSet, @@ -1121,8 +1136,8 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( targetSet, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 1b344dc0130..2c32fc10229 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -31,6 +31,7 @@ #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "functions/TableFunction.hpp" #include "mainInterface/ProblemManager.hpp" @@ -51,13 +52,19 @@ using namespace singlePhaseBaseKernels; SinglePhaseBase::SinglePhaseBase( const string & name, Group * const parent ): - FlowSolverBase( name, parent ), - m_keepFlowVariablesConstantDuringInitStep( 0 ) + FlowSolverBase( name, parent ) { this->registerWrapper( viewKeyStruct::inputTemperatureString(), &m_inputTemperature ). setApplyDefaultValue( 0.0 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Temperature" ); + + this->getWrapper< integer >( string( viewKeyStruct::isThermalString() ) ). + appendDescription( GEOS_FMT( "\nSourceFluxes application if {} is enabled :\n" + "- negative value (injection): the mass balance equation is modified to considered the additional source term,\n" + "- positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term.\n" + "For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced.", + viewKeyStruct::isThermalString() ) ); } @@ -85,11 +92,13 @@ void SinglePhaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< mobility >( getName() ); subRegion.registerField< dMobility_dPressure >( getName() ); + subRegion.registerField< fields::flow::mass >( getName() ); + subRegion.registerField< fields::flow::mass_n >( getName() ); + if( m_isThermal ) { subRegion.registerField< dMobility_dTemperature >( getName() ); } - } ); FaceManager & faceManager = mesh.getFaceManager(); @@ -167,7 +176,7 @@ void SinglePhaseBase::validateConstitutiveModels( DomainPartition & domain ) con constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { - string const fluidModelName = castedFluid.catalogName(); + string const fluidModelName = castedFluid.getCatalogName(); GEOS_THROW_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", getDataContext(), fluid.getDataContext() ), @@ -244,6 +253,60 @@ void SinglePhaseBase::updateFluidModel( ObjectManagerBase & dataGroup ) const } ); } +void SinglePhaseBase::updateMass( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + arrayView1d< real64 > const mass = subRegion.getField< fields::flow::mass >(); + arrayView1d< real64 > const mass_n = subRegion.getField< fields::flow::mass_n >(); + + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + arrayView2d< real64 const > const porosity_n = porousSolid.getPorosity_n(); + + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView1d< real64 > const deltaVolume = subRegion.getField< fields::flow::deltaVolume >(); + + SingleFluidBase & fluid = + getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ) ); + arrayView2d< real64 const > const density = fluid.density(); + arrayView2d< real64 const > const density_n = fluid.density_n(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + mass[ei] = porosity[ei][0] * ( volume[ei] + deltaVolume[ei] ) * density[ei][0]; + if( isZero( mass_n[ei] ) ) // this is a hack for hydrofrac cases + mass_n[ei] = porosity_n[ei][0] * volume[ei] * density_n[ei][0]; // initialize newly created element mass + } ); +} + +void SinglePhaseBase::updateEnergy( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + arrayView1d< real64 > const energy = subRegion.getField< fields::flow::energy >(); + + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + arrayView2d< real64 const > const rockInternalEnergy = porousSolid.getInternalEnergy(); + + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView1d< real64 > const deltaVolume = subRegion.getField< fields::flow::deltaVolume >(); + + SingleFluidBase & fluid = + getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ) ); + arrayView2d< real64 const > const density = fluid.density(); + arrayView2d< real64 const > const fluidInternalEnergy = fluid.internalEnergy(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + energy[ei] = ( volume[ei] + deltaVolume[ei] ) * + ( porosity[ei][0] * density[ei][0] * fluidInternalEnergy[ei][0] + ( 1.0 - porosity[ei][0] ) * rockInternalEnergy[ei][0] ); + } ); +} + void SinglePhaseBase::updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const { arrayView1d< real64 const > const temp = dataGroup.getField< fields::flow::temperature >(); @@ -271,10 +334,12 @@ void SinglePhaseBase::updateThermalConductivity( ElementSubRegionBase & subRegio conductivityMaterial.update( porosity ); } -void SinglePhaseBase::updateFluidState( ObjectManagerBase & subRegion ) const +real64 SinglePhaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const { updateFluidModel( subRegion ); + updateMass( subRegion ); updateMobility( subRegion ); + return 0.0; } void SinglePhaseBase::updateMobility( ObjectManagerBase & dataGroup ) const @@ -388,7 +453,6 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() SolidInternalEnergy const & solidInternalEnergyMaterial = getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); solidInternalEnergyMaterial.saveConvergedState(); - } } ); @@ -409,16 +473,21 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() } ); } ); - // Save initial pressure field mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { + // Save initial pressure field arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); arrayView1d< real64 > const initPres = subRegion.getField< fields::flow::initialPressure >(); arrayView1d< real64 const > const & temp = subRegion.template getField< fields::flow::temperature >(); arrayView1d< real64 > const initTemp = subRegion.template getField< fields::flow::initialTemperature >(); initPres.setValues< parallelDevicePolicy<> >( pres ); initTemp.setValues< parallelDevicePolicy<> >( temp ); + + // finally update mass and energy + updateMass( subRegion ); + if( m_isThermal ) + updateEnergy( subRegion ); } ); } ); @@ -450,7 +519,7 @@ void SinglePhaseBase::computeHydrostaticEquilibrium() getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" - "This is incompatible with the " << EquilibriumInitialCondition::catalogName() << " " << bc.getDataContext() << + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << "used in this simulation. To proceed, you can either: \n" << " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << " - Remove the hydrostatic equilibrium initial condition from the XML file", @@ -628,6 +697,7 @@ void SinglePhaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_ { updateSolidInternalEnergyModel( subRegion ); updateThermalConductivity( subRegion ); + updateEnergy( subRegion ); } } ); @@ -760,11 +830,22 @@ void SinglePhaseBase::assembleSystem( real64 const GEOS_UNUSED_PARAM( time_n ), localMatrix, localRhs ); - assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_isJumpStabilized ) + { + assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } void SinglePhaseBase::assembleAccumulationTerms( DomainPartition & domain, @@ -816,20 +897,12 @@ void SinglePhaseBase::applyBoundaryConditions( real64 time_n, namespace { -char const bcLogMessage[] = - "SinglePhaseBase {}: at time {}s, " - "the <{}> boundary condition '{}' is applied to the element set '{}' in subRegion '{}'. " - "\nThe scale of this boundary condition is {} and multiplies the value of the provided function (if any). " - "\nThe total number of target elements (including ghost elements) is {}. " - "\nNote that if this number is equal to zero for all subRegions, the boundary condition will not be applied on this element set."; - void applyAndSpecifyFieldValue( real64 const & time_n, real64 const & dt, MeshLevel & mesh, globalIndex const rankOffset, string const dofKey, - bool const isFirstNonlinearIteration, - string const solverName, + bool const, integer const idof, string const fieldKey, string const boundaryFieldKey, @@ -842,19 +915,11 @@ void applyAndSpecifyFieldValue( real64 const & time_n, mesh, fieldKey, [&]( FieldSpecificationBase const & fs, - string const & setName, + string const &, SortedArrayView< localIndex const > const & lset, ElementSubRegionBase & subRegion, string const & ) { - if( fs.getLogLevel() >= 1 && isFirstNonlinearIteration ) - { - globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); - GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - solverName, time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); - } - // Specify the bc value of the field fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( lset, @@ -913,12 +978,12 @@ void SinglePhaseBase::applyDirichletBC( real64 const time_n, MeshLevel & mesh, arrayView1d< string const > const & ) { - applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, getName(), + applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, 0, fields::flow::pressure::key(), fields::flow::bcPressure::key(), localMatrix, localRhs ); if( m_isThermal ) { - applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, getName(), + applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, 1, fields::flow::temperature::key(), fields::flow::bcTemperature::key(), localMatrix, localRhs ); } @@ -983,25 +1048,6 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, ElementSubRegionBase & subRegion, string const & ) { - if( fs.getLogLevel() >= 1 && m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) - { - globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); - GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time_n+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); - - if( isThermal ) - { - char const msg[] = "SinglePhaseBase {} with isThermal = 1. At time {}s, " - "the <{}> source flux boundary condition '{}' will be applied with the following behavior" - "\n - negative value (injection): the mass balance equation is modified to considered the additional source term" - "\n - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. " \ - "\n For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced."; - GEOS_LOG_RANK_0( GEOS_FMT( msg, - getName(), time_n+dt, SourceFluxBoundaryCondition::catalogName(), fs.getName() ) ); - } - } - if( targetSet.size() == 0 ) { return; @@ -1026,6 +1072,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -1065,7 +1113,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, dEnthalpy_dPressure, rhsContributionArrayView, localRhs, - localMatrix] GEOS_HOST_DEVICE ( localIndex const a ) + localMatrix, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1079,6 +1128,7 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, globalIndex const energyRowIndex = massRowIndex + 1; real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! localRhs[massRowIndex] += rhsValue; + massProd += rhsValue; //add the value to the energey balance equation if the flux is positive (i.e., it's a producer) if( rhsContributionArrayView[a] > 0.0 ) { @@ -1105,7 +1155,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, ghostRank, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1116,9 +1167,20 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, // add the value to the mass balance equation globalIndex const rowIndex = dofNumber[ei] - rankOffset; - localRhs[rowIndex] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; + localRhs[rowIndex] += rhsValue; + massProd += rhsValue; } ); } + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ 1 }; + massProdArr[0] = massProd.get(); + wrapper.gatherTimeStepStats( time_n, dt, massProdArr.toViewConst(), targetSet.size() ); + } ); } ); } ); } @@ -1193,6 +1255,9 @@ void SinglePhaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; + if( m_keepFlowVariablesConstantDuringInitStep ) + return; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -1206,6 +1271,7 @@ void SinglePhaseBase::updateState( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); @@ -1237,6 +1303,7 @@ void SinglePhaseBase::resetStateToBeginningOfStep( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); @@ -1276,7 +1343,7 @@ real64 SinglePhaseBase::scalingForSystemSolution( DomainPartition & domain, scalingFactor = MpiWrapper::min( scalingFactor ); maxDeltaPres = MpiWrapper::max( maxDeltaPres ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change: {} Pa (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", getName(), fmt::format( "{:.{}f}", maxDeltaPres, 3 ) ) ); return scalingFactor; @@ -1324,4 +1391,13 @@ bool SinglePhaseBase::checkSystemSolution( DomainPartition & domain, return (m_allowNegativePressure || numNegativePressures == 0) ? 1 : 0; } +void SinglePhaseBase::saveConvergedState( ElementSubRegionBase & subRegion ) const +{ + FlowSolverBase::saveConvergedState( subRegion ); + + arrayView1d< real64 const > const mass = subRegion.template getField< fields::flow::mass >(); + arrayView1d< real64 > const mass_n = subRegion.template getField< fields::flow::mass_n >(); + mass_n.setValues< parallelDevicePolicy<> >( mass ); +} + } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 56dbab8979e..9853469cd70 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -169,6 +169,22 @@ class SinglePhaseBase : public FlowSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; + /** + * @brief assembles the flux terms for all cells including jump stabilization + * @param time_n previous time value + * @param dt time step + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param localMatrix the system matrix + * @param localRhs the system right-hand side vector + */ + virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) = 0; + /** * @brief assembles the flux terms for all cells for the poroelastic case * @param time_n previous time value @@ -210,10 +226,6 @@ class SinglePhaseBase : public FlowSolverBase struct viewKeyStruct : FlowSolverBase::viewKeyStruct { static constexpr char const * elemDofFieldString() { return "singlePhaseVariables"; } - - // inputs - static constexpr char const * inputTemperatureString() { return "temperature"; } - static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } }; /** @@ -272,10 +284,10 @@ class SinglePhaseBase : public FlowSolverBase /** * @brief Function to update all constitutive state and dependent variables - * @param dataGroup group that contains the fields + * @param subRegion subregion that contains the fields */ - void - updateFluidState( ObjectManagerBase & subRegion ) const; + real64 + updateFluidState( ElementSubRegionBase & subRegion ) const; /** @@ -285,6 +297,20 @@ class SinglePhaseBase : public FlowSolverBase virtual void updateFluidModel( ObjectManagerBase & dataGroup ) const; + /** + * @brief Function to update fluid mass + * @param subRegion subregion that contains the fields + */ + void + updateMass( ElementSubRegionBase & subRegion ) const; + + /** + * @brief Function to update energy + * @param subRegion subregion that contains the fields + */ + void + updateEnergy( ElementSubRegionBase & subRegion ) const; + /** * @brief Update all relevant solid internal energy models using current values of temperature * @param dataGroup the group storing the required fields @@ -314,12 +340,12 @@ class SinglePhaseBase : public FlowSolverBase void computeHydrostaticEquilibrium(); /** - * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) - * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step - * @detail This function is meant to be called by a specific task before/after the initialization step + * @brief Update the cell-wise pressure gradient */ - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } + virtual void updatePressureGradient( DomainPartition & domain ) + { + GEOS_UNUSED_VAR( domain ); + } /** * @brief Function to fix the initial state during the initialization step in coupled problems @@ -354,6 +380,11 @@ class SinglePhaseBase : public FlowSolverBase virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override; + /** + * @brief Utility function to save the converged state + * @param[in] subRegion the element subRegion + */ + virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const override; /** * @brief Structure holding views into fluid properties used by the base solver. @@ -391,12 +422,6 @@ class SinglePhaseBase : public FlowSolverBase virtual ThermalFluidPropViews getThermalFluidProperties( constitutive::ConstitutiveBase const & fluid ) const; - /// the input temperature - real64 m_inputTemperature; - - /// flag to freeze the initial state during initialization in coupled problems - integer m_keepFlowVariablesConstantDuringInitStep; - private: virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index 1a53a221166..2d908b6dc10 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -151,12 +151,11 @@ class ElementBasedAssemblyKernel m_elemGhostRank( subRegion.ghostRank() ), m_volume( subRegion.getElementVolume() ), m_deltaVolume( subRegion.template getField< fields::flow::deltaVolume >() ), - m_porosity_n( solid.getPorosity_n() ), - m_porosityNew( solid.getPorosity() ), + m_porosity( solid.getPorosity() ), m_dPoro_dPres( solid.getDporosity_dPressure() ), - m_density_n( fluid.density_n() ), m_density( fluid.density() ), m_dDensity_dPres( fluid.dDensity_dPressure() ), + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ), m_localMatrix( localMatrix ), m_localRhs( localRhs ) {} @@ -174,9 +173,6 @@ class ElementBasedAssemblyKernel /// Pore volume at time n+1 real64 poreVolume = 0.0; - /// Pore volume at the previous converged time step - real64 poreVolume_n = 0.0; - /// Derivative of pore volume with respect to pressure real64 dPoreVolume_dPres = 0.0; @@ -216,8 +212,7 @@ class ElementBasedAssemblyKernel StackVariables & stack ) const { // initialize the pore volume - stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosityNew[ei][0]; - stack.poreVolume_n = m_volume[ei] * m_porosity_n[ei][0]; + stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosity[ei][0]; stack.dPoreVolume_dPres = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; // set row index and degrees of freedom indices for this element @@ -242,7 +237,7 @@ class ElementBasedAssemblyKernel FUNC && kernelOp = NoOpFunc{} ) const { // Residual contribution is mass conservation in the cell - stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - stack.poreVolume_n * m_density_n[ei][0]; + stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - m_mass_n[ei]; // Derivative of residual wrt to pressure in the cell stack.localJacobian[0][0] = stack.dPoreVolume_dPres * m_density[ei][0] + m_dDensity_dPres[ei][0] * stack.poreVolume; @@ -314,15 +309,16 @@ class ElementBasedAssemblyKernel arrayView1d< real64 const > const m_deltaVolume; /// Views on the porosity - arrayView2d< real64 const > const m_porosity_n; - arrayView2d< real64 const > const m_porosityNew; + arrayView2d< real64 const > const m_porosity; arrayView2d< real64 const > const m_dPoro_dPres; /// Views on density - arrayView2d< real64 const > const m_density_n; arrayView2d< real64 const > const m_density; arrayView2d< real64 const > const m_dDensity_dPres; + /// View on mass + arrayView1d< real64 const > const m_mass_n; + /// View on the local CRS matrix CRSMatrixView< real64, globalIndex const > const m_localMatrix; /// View on the local RHS @@ -359,14 +355,8 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) -#if ALLOW_CREATION_MASS , m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) -#endif - { -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - } + {} /** * @brief Compute the local accumulation contributions to the residual and Jacobian @@ -380,20 +370,16 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur { Base::computeAccumulation( ei, stack, [&] () { -#if ALLOW_CREATION_MASS - if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } -#endif } ); } protected: -#if ALLOW_CREATION_MASS arrayView1d< real64 const > const m_creationMass; -#endif }; @@ -480,24 +466,20 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > arrayView1d< globalIndex const > const & dofNumber, arrayView1d< localIndex const > const & ghostRank, ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, real64 const minNormalizer ) : Base( rankOffset, localResidual, dofNumber, ghostRank, minNormalizer ), - m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), - m_density_n( fluid.density_n() ) + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ) {} GEOS_HOST_DEVICE virtual void computeLinf( localIndex const ei, LinfStackVariables & stack ) const override { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; if( valMass > stack.localValue[0] ) { @@ -509,7 +491,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > virtual void computeL2( localIndex const ei, L2StackVariables & stack ) const override { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; stack.localNormalizer[0] += massNormalizer; } @@ -517,14 +499,8 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > protected: - /// View on the volume - arrayView1d< real64 const > const m_volume; - - /// View on porosity at the previous converged time step - arrayView2d< real64 const > const m_porosity_n; - - /// View on total mass/molar density at the previous converged time step - arrayView2d< real64 const > const m_density_n; + /// View on mass at the previous converged time step + arrayView1d< real64 const > const m_mass_n; }; @@ -555,8 +531,6 @@ class ResidualNormKernelFactory string const dofKey, arrayView1d< real64 const > const & localResidual, ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, real64 const minNormalizer, real64 (& residualNorm)[1], real64 (& residualNormalizer)[1] ) @@ -564,7 +538,7 @@ class ResidualNormKernelFactory arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, fluid, solid, minNormalizer ); + ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); if( normType == solverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index e207d50ad99..35023530b12 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -36,6 +36,7 @@ #include "physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp" @@ -150,13 +151,13 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED string const & fluidName = subRegion.template getReference< string >( BASE::viewKeyStruct::fluidNamesString() ); SingleFluidBase const & fluid = SolverBase::getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); - string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = SolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - // step 1: compute the norm in the subRegion if( m_isThermal ) { + string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & solid = SolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + string const & solidInternalEnergyName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidInternalEnergyNamesString() ); SolidInternalEnergy const & solidInternalEnergy = SolverBase::getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); @@ -185,8 +186,6 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED dofKey, localRhs, subRegion, - fluid, - solid, m_nonlinearSolverParameters.m_minNormalizer, subRegionFlowResidualNorm, subRegionFlowResidualNormalizer ); @@ -307,12 +306,12 @@ void SinglePhaseFVM< BASE >::applySystemSolution( DofManager const & dofManager, } ); } -template< > -void SinglePhaseFVM< SinglePhaseBase >::assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template<> +void SinglePhaseFVM<>::assembleFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -363,6 +362,46 @@ void SinglePhaseFVM< SinglePhaseBase >::assembleFluxTerms( real64 const dt, } +template< > +void SinglePhaseFVM< SinglePhaseBase >::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); + FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); + FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); + + string const & dofKey = dofManager.getKey( SinglePhaseBase::viewKeyStruct::elemDofFieldString() ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & ) + { + fluxApprox.forAllStencils( mesh, [&]( auto & stencil ) + { + typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); + + // No thermal support yet + stabilizedSinglePhaseFVMKernels::FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); + + } ); + } ); + +} + + + template<> void SinglePhaseFVM< SinglePhaseProppantBase >::assembleFluxTerms( real64 const dt, DomainPartition const & domain, @@ -417,6 +456,16 @@ void SinglePhaseFVM< SinglePhaseProppantBase >::assembleFluxTerms( real64 const } ); } +template< > +void SinglePhaseFVM< SinglePhaseProppantBase >::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available with this flow solver" ); +} template< typename BASE > void SinglePhaseFVM< BASE >::assembleEDFMFluxTerms( real64 const GEOS_UNUSED_PARAM ( time_n ), @@ -671,8 +720,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) @@ -705,8 +754,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) @@ -774,8 +823,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) @@ -833,12 +882,12 @@ void SinglePhaseFVM< SinglePhaseProppantBase >::applyAquiferBC( real64 const GEO } template<> -void SinglePhaseFVM< SinglePhaseBase >::applyAquiferBC( real64 const time, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const +void SinglePhaseFVM<>::applyAquiferBC( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const { GEOS_MARK_FUNCTION; @@ -904,9 +953,9 @@ void SinglePhaseFVM< SinglePhaseBase >::applyAquiferBC( real64 const time, namespace { -typedef SinglePhaseFVM< SinglePhaseBase > NoProppant; -typedef SinglePhaseFVM< SinglePhaseProppantBase > Proppant; -REGISTER_CATALOG_ENTRY( SolverBase, NoProppant, string const &, Group * const ) -REGISTER_CATALOG_ENTRY( SolverBase, Proppant, string const &, Group * const ) +typedef SinglePhaseFVM< SinglePhaseProppantBase > SinglePhaseFVMProppant; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVMProppant, string const &, Group * const ) +typedef SinglePhaseFVM<> SinglePhaseFVM; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVM, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index ef6705b4f5e..b0e60c4dd3b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -96,20 +96,20 @@ class SinglePhaseFVM : public BASE * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - template< typename _BASE=BASE > - static - typename std::enable_if< std::is_same< _BASE, SinglePhaseBase >::value, string >::type - catalogName() + static string catalogName() { - return "SinglePhaseFVM"; - } - - template< typename _BASE=BASE > - static - typename std::enable_if< std::is_same< _BASE, SinglePhaseProppantBase >::value, string >::type - catalogName() - { - return "SinglePhaseProppantFVM"; + if constexpr ( std::is_same_v< BASE, SinglePhaseBase > ) + { + return "SinglePhaseFVM"; + } + else if constexpr ( std::is_same_v< BASE, SinglePhaseProppantBase > ) + { + return "SinglePhaseProppantFVM"; + } + else + { + return BASE::catalogName(); + } } /** @@ -165,6 +165,12 @@ class SinglePhaseFVM : public BASE arrayView1d< real64 > const & localRhs ) override; virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + virtual void assembleEDFMFluxTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 24ebda97229..4bf626b5b91 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -18,7 +18,6 @@ #include "SinglePhaseHybridFVM.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" @@ -28,6 +27,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" /** @@ -56,10 +56,26 @@ SinglePhaseHybridFVM::SinglePhaseHybridFVM( const string & name, void SinglePhaseHybridFVM::registerDataOnMesh( Group & meshBodies ) { + using namespace fields::flow; // 1) Register the cell-centered data SinglePhaseBase::registerDataOnMesh( meshBodies ); + // pressureGradient is specific for HybridFVM + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + subRegion.registerField< pressureGradient >( getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); + } ); + // 2) Register the face data meshBodies.forSubGroups< MeshBody >( [&] ( MeshBody & meshBody ) { @@ -260,6 +276,19 @@ void SinglePhaseHybridFVM::assembleFluxTerms( real64 const dt, } + +void SinglePhaseHybridFVM::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + // pressure stabilization not implemented + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available for this flow solver" ); +} + + void SinglePhaseHybridFVM::assembleEDFMFluxTerms( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const dt, DomainPartition const & domain, @@ -365,8 +394,8 @@ void SinglePhaseHybridFVM::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } // next, we use the field specification functions to apply the boundary conditions to the system @@ -471,9 +500,6 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P defaultViscosity += fluid.defaultViscosity(); subRegionCounter++; - string const & solidName = subRegion.getReference< string >( viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - // step 1.1: compute the norm in the subRegion singlePhaseBaseKernels:: @@ -483,8 +509,6 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P elemDofKey, localRhs, subRegion, - fluid, - solid, m_nonlinearSolverParameters.m_minNormalizer, subRegionResidualNorm, subRegionResidualNormalizer ); @@ -627,5 +651,22 @@ void SinglePhaseHybridFVM::resetStateToBeginningOfStep( DomainPartition & domain } ); } +void SinglePhaseHybridFVM::updatePressureGradient( DomainPartition & domain ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + FaceManager & faceManager = mesh.getFaceManager(); + + mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + singlePhaseHybridFVMKernels::AveragePressureGradientKernelFactory::createAndLaunch< parallelHostPolicy >( subRegion, + faceManager ); + } ); + } ); +} + REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHybridFVM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 2f124db3319..64f50465847 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -20,7 +20,6 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEHYBRIDFVM_HPP_ #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" namespace geos { @@ -126,6 +125,13 @@ class SinglePhaseHybridFVM : public SinglePhaseBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; + virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + virtual void assembleEDFMFluxTerms( real64 const time_n, real64 const dt, @@ -157,6 +163,8 @@ class SinglePhaseHybridFVM : public SinglePhaseBase real64 const & dt, DomainPartition & domain ) override; + virtual void updatePressureGradient( DomainPartition & domain ) override final; + /** * @brief Function to perform the application of Dirichlet BCs on faces * @param[in] time_n current time diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp index 4c6bc274f4c..f6c59f63df9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp @@ -30,6 +30,8 @@ #include "finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp" +#include "linearAlgebra/interfaces/InterfaceTypes.hpp" +#include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" #include "mesh/MeshLevel.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp" @@ -43,6 +45,7 @@ namespace geos namespace singlePhaseHybridFVMKernels { +/******************************** AssemblerKernelHelper ********************************/ /******************************** Kernel switches ********************************/ namespace internal @@ -81,6 +84,133 @@ void kernelLaunchSelectorFaceSwitch( T value, LAMBDA && lambda ) } // namespace internal +/******************************** AveragePressureGradientKernel ********************************/ + +template< integer NUM_FACES > +class AveragePressureGradientKernel +{ +public: + AveragePressureGradientKernel( CellElementSubRegion & subRegion, + FaceManager const & faceManager ) + : + // get the face-centered pressures + m_facePressure( faceManager.getField< fields::flow::facePressure >() ), + m_faceCenter( faceManager.faceCenter() ), + m_pres( subRegion.template getField< fields::flow::pressure >() ), + m_elemCenter( subRegion.getElementCenter() ), + m_elemsToFaces( subRegion.faceList() ), + m_presGradient( subRegion.template getField< fields::flow::pressureGradient >() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { + + GEOS_HOST_DEVICE + StackVariables(): + coordinates( NUM_FACES+1, 4 ), + pressures( NUM_FACES+1 ), + presGradientLocal( 4 ) + {} + + stackArray2d< real64, (NUM_FACES + 1) * 4 > coordinates; + stackArray1d< real64, NUM_FACES + 1 > pressures; + stackArray1d< real64, 4 > presGradientLocal; + }; + + + inline + void compute( localIndex const elemIndex, + StackVariables stack ) const + { + + for( integer dim=0; dim<3; ++dim ) + { + stack.coordinates( 0, dim ) = m_elemCenter( elemIndex, dim ); + } + stack.coordinates( 0, 3 ) = 1.0; + stack.pressures[0] = m_pres[elemIndex]; + + for( integer fi=0; fi + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] ( localIndex const ei ) + { + typename KERNEL_TYPE::StackVariables stack; + kernelComponent.compute( ei, stack ); + } ); + } + +private: + /// face pressure + arrayView1d< real64 const > const m_facePressure; + + /// the face center coordinates + arrayView2d< real64 const > const m_faceCenter; + + /// the cell-centered pressures + arrayView1d< real64 const > const m_pres; + + /// the cell center coordinates + arrayView2d< real64 const > const m_elemCenter; + + /// the elements to faces map + arrayView2d< localIndex const > const m_elemsToFaces; + + /// pressure gradient in the cell + arrayView2d< real64 > const m_presGradient; + +}; + +class AveragePressureGradientKernelFactory +{ +public: + + template< typename POLICY > + static void createAndLaunch( CellElementSubRegion & subRegion, + FaceManager const & faceManager ) + { + internal::kernelLaunchSelectorFaceSwitch( subRegion.numFacesPerElement(), [&] ( auto NUM_FACES ) + { + AveragePressureGradientKernel< NUM_FACES > kernel( subRegion, faceManager ); + AveragePressureGradientKernel< NUM_FACES >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } +}; + + /******************************** ElementBasedAssemblyKernel ********************************/ /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index e74bdc9619a..6ad40238385 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -22,12 +22,9 @@ #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/singlefluid/SlurryFluidSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" -#include "constitutive/fluid/singlefluid/SlurryFluidFields.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" #include "constitutive/solid/ProppantSolid.hpp" #include "constitutive/solid/porosity/ProppantPorosity.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index c74a9e906b1..73b34b0703b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -175,7 +175,7 @@ void SinglePhaseStatistics::computeRegionStatistics( real64 const time, subRegionTotalPoreVol, subRegionTotalMass ); - ElementRegionBase & region = elemManager.getRegion( subRegion.getParent().getParent().getName() ); + ElementRegionBase & region = elemManager.getRegion( ElementRegionBase::getParentRegion( subRegion ).getName() ); RegionStatistics & regionStatistics = region.getReference< RegionStatistics >( viewKeyStruct::regionStatisticsString() ); regionStatistics.averagePressure += subRegionAvgPresNumerator; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp index bfd1360fd92..57ac9fc1f64 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp @@ -62,9 +62,6 @@ class SinglePhaseStatistics : public FieldStatisticsBase< SinglePhaseBase > /**@}*/ -private: - - using Base = FieldStatisticsBase< SinglePhaseBase >; /** * @struct viewKeyStruct holds char strings and viewKeys for fast lookup @@ -105,6 +102,10 @@ class SinglePhaseStatistics : public FieldStatisticsBase< SinglePhaseBase > real64 totalUncompactedPoreVolume; }; +private: + + using Base = FieldStatisticsBase< SinglePhaseBase >; + /** * @brief Compute some statistics on the reservoir (average field pressure, etc) * @param[in] mesh the mesh level object diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp new file mode 100644 index 00000000000..e6ca524febc --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp @@ -0,0 +1,310 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StabilizedSinglePhaseFVMKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP + +#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" + +namespace geos +{ + +namespace stabilizedSinglePhaseFVMKernels +{ + +using namespace constitutive; + + +/******************************** FaceBasedAssemblyKernel ********************************/ + +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > +class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > +{ +public: + + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; + using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + + using StabSinglePhaseFlowAccessors = + StencilAccessors< fields::flow::macroElementIndex, + fields::flow::elementStabConstant, + fields::flow::pressure_n >; + + using StabSinglePhaseFluidAccessors = + StencilMaterialAccessors< SingleFluidBase, + fields::singlefluid::density_n >; + + using AbstractBase::m_dt; + using AbstractBase::m_rankOffset; + using AbstractBase::m_ghostRank; + using AbstractBase::m_dofNumber; + using AbstractBase::m_gravCoef; + using AbstractBase::m_pres; + + using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using Base::numDof; + using Base::numEqn; + using Base::maxNumElems; + using Base::maxNumConns; + using Base::maxStencilSize; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor accessor for the dofs numbers + * @param[in] singlePhaseFlowAccessor accessor for wrappers registered by the solver + * @param[in] stabSinglePhaseFlowAccessor accessor for wrappers registered by the solver needed for stabilization + * @param[in] singlePhaseFluidAccessor accessor for wrappers registered by the single fluid model + * @param[in] stabSinglePhaseFluidAccessor accessor for wrappers registered by the single fluid model needed for stabilization + * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + FaceBasedAssemblyKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + StabSinglePhaseFlowAccessors const & stabSinglePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + StabSinglePhaseFluidAccessors const & stabSinglePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, + stencilWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ), + m_pres_n( stabSinglePhaseFlowAccessors.get( fields::flow::pressure_n {} ) ), + m_dens_n( stabSinglePhaseFluidAccessors.get( fields::singlefluid::density_n {} ) ), + m_macroElementIndex( stabSinglePhaseFlowAccessors.get( fields::flow::macroElementIndex {} ) ), + m_elementStabConstant( stabSinglePhaseFlowAccessors.get( fields::flow::elementStabConstant {} ) ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : Base::StackVariables( size, numElems ) + {} + + using Base::StackVariables::stencilSize; + using Base::StackVariables::numFluxElems; + using Base::StackVariables::transmissibility; + using Base::StackVariables::dTrans_dPres; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + + /// Stabilization transmissibility + real64 stabTransmissibility[maxNumConns][2]{}; + + }; + + /** + * @brief Compute the local flux contributions to the residual and Jacobian, including stabilization + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack ) const + { + + m_stencilWrapper.computeStabilizationWeights( iconn, + stack.stabTransmissibility ); + + // *********************************************** + // We call the base computeFlux, + // + // We use the lambda below to compute stabilization terms + Base::computeFlux( iconn, stack, [&] ( localIndex const (&k)[2], + localIndex const (&seri)[2], + localIndex const (&sesri)[2], + localIndex const (&sei)[2], + localIndex const connectionIndex, + real64 const alpha, + real64 const mobility, + real64 const potGrad, + real64 const fluxVal, + real64 const (&dFlux_dP)[2] ) + { + + GEOS_UNUSED_VAR( alpha, mobility, potGrad, fluxVal, dFlux_dP ); + + /// stabilization flux and derivatives + real64 stabFlux{}; + real64 dStabFlux_dP[2]{}; + + real64 const stabTrans[2] = { stack.stabTransmissibility[connectionIndex][0], + stack.stabTransmissibility[connectionIndex][1] }; + + + real64 dPresGradStab = 0.0; + integer stencilMacroElements[2]{}; + + // Step 1: compute the pressure jump at the interface + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + localIndex const er = seri[ke]; + localIndex const esr = sesri[ke]; + localIndex const ei = sei[ke]; + + stencilMacroElements[ke] = m_macroElementIndex[er][esr][ei]; + + // use the jump in *delta* pressure in the stabilization term + dPresGradStab += m_elementStabConstant[er][esr][ei] * stabTrans[ke] * (m_pres[er][esr][ei] - m_pres_n[er][esr][ei]); + } + + // Step 2: compute the stabilization flux + integer const k_up_stab = (dPresGradStab >= 0) ? 0 : 1; + + localIndex const er_up_stab = seri[k_up_stab]; + localIndex const esr_up_stab = sesri[k_up_stab]; + localIndex const ei_up_stab = sei[k_up_stab]; + + bool const areInSameMacroElement = stencilMacroElements[0] == stencilMacroElements[1]; + bool const isStabilizationActive = stencilMacroElements[0] >= 0 && stencilMacroElements[1] >= 0; + if( isStabilizationActive && areInSameMacroElement ) + { + + real64 const laggedUpwindCoef = m_dens_n[er_up_stab][esr_up_stab][ei_up_stab][0]; + stabFlux += dPresGradStab * laggedUpwindCoef; + + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + real64 const tauStab = m_elementStabConstant[seri[ke]][sesri[ke]][sei[ke]]; + dStabFlux_dP[ke] += tauStab * stabTrans[ke] * laggedUpwindCoef; + } + } + + // Step 3: add the stabilization flux and its derivatives to the residual and Jacobian + integer const eqIndex0 = k[0] * numEqn; + integer const eqIndex1 = k[1] * numEqn; + + stack.localFlux[eqIndex0] += stabFlux; + stack.localFlux[eqIndex1] += -stabFlux; + + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + localIndex const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[eqIndex0][localDofIndexPres] += dStabFlux_dP[ke]; + stack.localFluxJacobian[eqIndex1][localDofIndexPres] += -dStabFlux_dP[ke]; + } + + } ); // end call to Base::computeFlux + + } + +protected: + + /// Views on flow properties at the previous converged time step + ElementViewConst< arrayView1d< real64 const > > const m_pres_n; + ElementViewConst< arrayView2d< real64 const > > const m_dens_n; + + /// Views on the macroelement indices and stab constant + ElementViewConst< arrayView1d< integer const > > const m_macroElementIndex; + ElementViewConst< arrayView1d< real64 const > > const m_elementStabConstant; + +}; + +/** + * @class FaceBasedAssemblyKernelFactory + */ +class FaceBasedAssemblyKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( globalIndex const rankOffset, + string const & dofKey, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + + integer constexpr NUM_EQN = 1; + integer constexpr NUM_DOF = 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + typename KERNEL_TYPE::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); + typename KERNEL_TYPE::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); + typename KERNEL_TYPE::StabSinglePhaseFlowAccessors stabSinglePhaseFlowAccessors( elemManager, solverName ); + typename KERNEL_TYPE::StabSinglePhaseFluidAccessors stabSinglePhaseFluidAccessors( elemManager, solverName ); + typename KERNEL_TYPE::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + KERNEL_TYPE kernel( rankOffset, stencilWrapper, dofNumberAccessor, + singlePhaseFlowAccessors, stabSinglePhaseFlowAccessors, singlePhaseFluidAccessors, stabSinglePhaseFluidAccessors, + permeabilityAccessors, + dt, localMatrix, localRhs ); + KERNEL_TYPE::template launch< POLICY >( stencilWrapper.size(), kernel ); + } +}; + +} // namespace stabilizedSinglePhaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 0fec20002a4..c79344410e6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -159,17 +159,13 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK using Base::m_dofNumber; using Base::m_elemGhostRank; using Base::m_volume; - using Base::m_porosity_n; using Base::m_porosity; using Base::m_dPoro_dPres; using Base::m_dCompFrac_dCompDens; - using Base::m_phaseVolFrac_n; using Base::m_phaseVolFrac; using Base::m_dPhaseVolFrac; - using Base::m_phaseDens_n; using Base::m_phaseDens; using Base::m_dPhaseDens; - using Base::m_phaseCompFrac_n; using Base::m_phaseCompFrac; using Base::m_dPhaseCompFrac; using Base::m_localMatrix; @@ -197,12 +193,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) : Base( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ), m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n() ), m_phaseInternalEnergy( fluid.phaseInternalEnergy() ), m_dPhaseInternalEnergy( fluid.dPhaseInternalEnergy() ), - m_rockInternalEnergy_n( solid.getInternalEnergy_n() ), m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ) + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.getField< fields::flow::energy_n >() ) {} struct StackVariables : public Base::StackVariables @@ -214,9 +209,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK : Base::StackVariables() {} - using Base::StackVariables::poreVolume; - using Base::StackVariables::poreVolume_n; - using Base::StackVariables::dPoreVolume_dPres; using Base::StackVariables::localRow; using Base::StackVariables::dofIndices; using Base::StackVariables::localResidual; @@ -230,9 +222,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK /// Solid energy at time n+1 real64 solidEnergy = 0.0; - /// Solid energy at the previous converged time step - real64 solidEnergy_n = 0.0; - /// Derivative of solid internal energy with respect to pressure real64 dSolidEnergy_dPres = 0.0; @@ -257,13 +246,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // initialize the solid volume real64 const solidVolume = m_volume[ei] * ( 1.0 - m_porosity[ei][0] ); - real64 const solidVolume_n = m_volume[ei] * ( 1.0 - m_porosity_n[ei][0] ); real64 const dSolidVolume_dPres = -m_volume[ei] * m_dPoro_dPres[ei][0]; real64 const dSolidVolume_dTemp = -stack.dPoreVolume_dTemp; // initialize the solid internal energy stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.solidEnergy_n = solidVolume_n * m_rockInternalEnergy_n[ei][0]; stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; @@ -281,9 +268,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK { using Deriv = multifluid::DerivativeOffset; + // start with old time step value + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + Base::computeAccumulation( ei, stack, [&] ( integer const ip, real64 const & phaseAmount, - real64 const & phaseAmount_n, real64 const & dPhaseAmount_dP, real64 const (&dPhaseAmount_dC)[numComp] ) { @@ -302,7 +291,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy_n = m_phaseInternalEnergy_n[ei][0]; arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; @@ -319,14 +307,13 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // Step 2: assemble the phase-dependent part of the accumulation term of the energy equation real64 const phaseEnergy = phaseAmount * phaseInternalEnergy[ip]; - real64 const phaseEnergy_n = phaseAmount_n * phaseInternalEnergy_n[ip]; real64 const dPhaseEnergy_dP = dPhaseAmount_dP * phaseInternalEnergy[ip] + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dP]; real64 const dPhaseEnergy_dT = dPhaseAmount_dT * phaseInternalEnergy[ip] + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dT]; // local accumulation - stack.localResidual[numEqn-1] += phaseEnergy - phaseEnergy_n; + stack.localResidual[numEqn-1] += phaseEnergy; // derivatives w.r.t. pressure and temperature stack.localJacobian[numEqn-1][0] += dPhaseEnergy_dP; @@ -344,7 +331,7 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // Step 3: assemble the solid part of the accumulation term // local accumulation and derivatives w.r.t. pressure and temperature - stack.localResidual[numEqn-1] += stack.solidEnergy - stack.solidEnergy_n; + stack.localResidual[numEqn-1] += stack.solidEnergy; stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; @@ -396,15 +383,16 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arrayView2d< real64 const > const m_dPoro_dTemp; /// Views on phase internal energy - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy_n; arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy; arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; /// Views on rock internal energy - arrayView2d< real64 const > m_rockInternalEnergy_n; arrayView2d< real64 const > m_rockInternalEnergy; arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; + /// Views on energy + arrayView1d< real64 const > m_energy_n; + }; /** @@ -534,8 +522,10 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB /** * @brief Create a new kernel instance * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxRelativeTempChange the max allowed relative temperature change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -552,6 +542,7 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB real64 const maxAbsolutePresChange, real64 const maxRelativeTempChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -566,6 +557,7 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB : Base( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, + maxRelativeCompDensChange, rankOffset, numComp, dofKey, @@ -658,8 +650,10 @@ class ScalingForSystemSolutionKernelFactory * @brief Create a new kernel and launch * @tparam POLICY the policy used in the RAJA kernel * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxRelativeTempChange the max allowed relative temperature change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompdensChange the max allowed relative component density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -672,6 +666,7 @@ class ScalingForSystemSolutionKernelFactory real64 const maxAbsolutePresChange, real64 const maxRelativeTempChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -684,7 +679,8 @@ class ScalingForSystemSolutionKernelFactory arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, maxCompFracChange, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, + maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, temperature, compDens, pressureScalingFactor, temperatureScalingFactor, compDensScalingFactor ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index 8db24520903..bc006a230c6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -120,10 +120,8 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs using Base::m_elemGhostRank; using Base::m_volume; using Base::m_deltaVolume; - using Base::m_porosity_n; - using Base::m_porosityNew; + using Base::m_porosity; using Base::m_dPoro_dPres; - using Base::m_density_n; using Base::m_density; using Base::m_dDensity_dPres; using Base::m_localMatrix; @@ -149,13 +147,12 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), m_dDensity_dTemp( fluid.dDensity_dTemperature() ), m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_internalEnergy_n( fluid.internalEnergy_n() ), m_internalEnergy( fluid.internalEnergy() ), m_dInternalEnergy_dPres( fluid.dInternalEnergy_dPressure() ), m_dInternalEnergy_dTemp( fluid.dInternalEnergy_dTemperature() ), - m_rockInternalEnergy_n( solid.getInternalEnergy_n() ), m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ) + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.template getField< fields::flow::energy_n >() ) {} /** @@ -172,7 +169,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs {} using Base::StackVariables::poreVolume; - using Base::StackVariables::poreVolume_n; using Base::StackVariables::dPoreVolume_dPres; using Base::StackVariables::localRow; using Base::StackVariables::dofIndices; @@ -187,9 +183,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs /// Solid energy at time n+1 real64 solidEnergy = 0.0; - /// Solid energy at the previous converged time step - real64 solidEnergy_n = 0.0; - /// Derivative of solid internal energy with respect to pressure real64 dSolidEnergy_dPres = 0.0; @@ -212,14 +205,12 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs stack.dPoreVolume_dTemp = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; // initialize the solid volume - real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosityNew[ei][0] ); - real64 const solidVolume_n = m_volume[ei] * ( 1.0 - m_porosity_n[ei][0] ); + real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosity[ei][0] ); real64 const dSolidVolume_dPres = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; real64 const dSolidVolume_dTemp = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; // initialize the solid internal energy stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.solidEnergy_n = solidVolume_n * m_rockInternalEnergy_n[ei][0]; stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; } @@ -235,6 +226,8 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs void computeAccumulation( localIndex const ei, StackVariables & stack ) const { + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + Base::computeAccumulation( ei, stack, [&] () { // Step 1: assemble the derivatives of the mass balance equation w.r.t temperature @@ -242,7 +235,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs // Step 2: assemble the fluid part of the accumulation term of the energy equation real64 const fluidEnergy = stack.poreVolume * m_density[ei][0] * m_internalEnergy[ei][0]; - real64 const fluidEnergy_n = stack.poreVolume_n * m_density_n[ei][0] * m_internalEnergy_n[ei][0]; real64 const dFluidEnergy_dP = stack.dPoreVolume_dPres * m_density[ei][0] * m_internalEnergy[ei][0] + stack.poreVolume * m_dDensity_dPres[ei][0] * m_internalEnergy[ei][0] @@ -253,7 +245,7 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs + stack.dPoreVolume_dTemp * m_density[ei][0] * m_internalEnergy[ei][0]; // local accumulation - stack.localResidual[numEqn-1] = fluidEnergy - fluidEnergy_n; + stack.localResidual[numEqn-1] += fluidEnergy; // derivatives w.r.t. pressure and temperature stack.localJacobian[numEqn-1][0] = dFluidEnergy_dP; @@ -261,7 +253,7 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs } ); // Step 3: assemble the solid part of the accumulation term of the energy equation - stack.localResidual[numEqn-1] += stack.solidEnergy - stack.solidEnergy_n; + stack.localResidual[numEqn-1] += stack.solidEnergy; stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; } @@ -297,15 +289,16 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs arrayView2d< real64 const > const m_dPoro_dTemp; /// Views on fluid internal energy - arrayView2d< real64 const > const m_internalEnergy_n; arrayView2d< real64 const > const m_internalEnergy; arrayView2d< real64 const > const m_dInternalEnergy_dPres; arrayView2d< real64 const > const m_dInternalEnergy_dTemp; /// Views on rock internal energy - arrayView2d< real64 const > m_rockInternalEnergy_n; - arrayView2d< real64 const > m_rockInternalEnergy; - arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; + arrayView2d< real64 const > const m_rockInternalEnergy; + arrayView2d< real64 const > const m_dRockInternalEnergy_dTemp; + + /// View on energy + arrayView1d< real64 const > const m_energy_n; }; @@ -337,15 +330,9 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) -#if ALLOW_CREATION_MASS - , m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) -#endif - { -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - } + : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), + m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) + {} /** * @brief Compute the local accumulation contributions to the residual and Jacobian @@ -358,20 +345,15 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur Base::StackVariables & stack ) const { Base::computeAccumulation( ei, stack ); - -#if ALLOW_CREATION_MASS - if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } -#endif } protected: -#if ALLOW_CREATION_MASS arrayView1d< real64 const > const m_creationMass; -#endif }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index be24ccd834d..365c38eda92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -35,6 +35,8 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp" +#include "mesh/MeshFields.hpp" + /** * @namespace the geosx namespace that encapsulates the majority of the code @@ -286,7 +288,7 @@ void ProppantTransport::updateProppantMobility( ObjectManagerBase & dataGroup ) GEOS_MARK_FUNCTION; arrayView1d< real64 const > const conc = dataGroup.getField< fields::proppant::proppantConcentration >(); - arrayView1d< real64 const > const aperture = dataGroup.getReference< array1d< real64 > >( FaceElementSubRegion::viewKeyStruct::elementApertureString() ); + arrayView1d< real64 const > const aperture = dataGroup.getReference< array1d< real64 > >( fields::elementAperture::key() ); arrayView1d< integer > const isProppantMobile = dataGroup.getField< fields::proppant::isProppantMobile >(); real64 const minAperture = m_minAperture; @@ -1054,7 +1056,7 @@ void ProppantTransport::updateProppantPackVolume( real64 const GEOS_UNUSED_PARAM elemManager.constructViewAccessor< array1d< real64 >, arrayView1d< real64 > >( fields::proppant::proppantLiftFlux::key() ); ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const - aperture = elemManager.constructArrayViewAccessor< real64, 1 >( FaceElementSubRegion::viewKeyStruct::elementApertureString() ); + aperture = elemManager.constructArrayViewAccessor< real64, 1 >( fields::elementAperture::key() ); typename ProppantPackVolumeKernel::FlowAccessors flowAccessors( elemManager, getName() ); typename ProppantPackVolumeKernel::SlurryFluidAccessors slurryFluidAccessors( elemManager, getName() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 6620d93c277..572f6332645 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -73,8 +73,8 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Use mass formulation instead of molar" ); - this->registerWrapper( viewKeyStruct::useMassFlagString(), &m_useTotalMassEquation ). - setApplyDefaultValue( 0 ). + this->registerWrapper( viewKeyStruct::useTotalMassEquationString(), &m_useTotalMassEquation ). + setApplyDefaultValue( 1 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Use total mass equation" ); @@ -84,6 +84,12 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setApplyDefaultValue( 1.0 ). setDescription( "Maximum (absolute) change in a component fraction between two Newton iterations" ); + this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Maximum (relative) change in a component density between two Newton iterations" ); + this->registerWrapper( viewKeyStruct::maxRelativePresChangeString(), &m_maxRelativePresChange ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -114,6 +120,9 @@ void CompositionalMultiphaseWell::postProcessInput() getWrapperDataContext( viewKeyStruct::maxCompFracChangeString() ) << ": The maximum absolute change in component fraction must larger or equal to 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_maxRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::maxRelativeCompDensChangeString() ) << + ": The maximum relative change in component density must be larger than 0.0" ); } void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) @@ -162,15 +171,11 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) WellElementSubRegion & subRegion ) { string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); + GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ) ); MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - subRegion.registerField< fields::well::pressure >( getName() ); - subRegion.registerField< fields::well::pressure_n >( getName() ); - - subRegion.registerField< fields::well::temperature >( getName() ); - subRegion.registerField< fields::well::temperature_n >( getName() ); - // The resizing of the arrays needs to happen here, before the call to initializePreSubGroups, // to make sure that the dimensions are properly set before the timeHistoryOutput starts its initialization. @@ -240,6 +245,7 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) reference().resizeDimension< 0 >( m_numPhases ); wellControls.registerWrapper< real64 >( viewKeyStruct::currentTotalVolRateString() ); + wellControls.registerWrapper< real64 >( viewKeyStruct::massDensityString() ); wellControls.registerWrapper< real64 >( viewKeyStruct::dCurrentTotalVolRate_dPresString() ). setRestartFlags( RestartFlags::NO_WRITE ); wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ). @@ -496,28 +502,17 @@ void CompositionalMultiphaseWell::initializePostSubGroups() MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion & subRegion ) { - string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); - fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); - string & relPermName = subRegion.getReference< string >( viewKeyStruct::relPermNamesString() ); relPermName = getConstitutiveName< RelativePermeabilityBase >( subRegion ); GEOS_THROW_IF( relPermName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", + GEOS_FMT( "{}: Relative permeability not found on subregion {}", getDataContext(), subRegion.getName() ), InputError ); validateInjectionStreams( subRegion ); - - validateWellConstraints( 0, 0, subRegion ); - } ); } ); } @@ -687,7 +682,8 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); real64 & dCurrentTotalVolRate_dRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); - + real64 & massDensity = + wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); @@ -721,7 +717,8 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg &iwelemRef, &logLevel, &wellControlsName, - &massUnit] ( localIndex const ) + &massUnit, + &massDensity] ( localIndex const ) { GEOS_UNUSED_VAR( massUnit ); using Deriv = multifluid::DerivativeOffset; @@ -757,7 +754,7 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg real64 const currentTotalRate = connRate[iwelemRef]; // Step 2.1: compute the inverse of the total density and derivatives - + massDensity = totalDens[iwelemRef][0]; // need to verify this is surface dens real64 const totalDensInv = 1.0 / totalDens[iwelemRef][0]; real64 const dTotalDensInv_dPres = -dTotalDens[iwelemRef][0][Deriv::dP] * totalDensInv * totalDensInv; stackArray1d< real64, maxNumComp > dTotalDensInv_dCompDens( numComp ); @@ -1291,6 +1288,7 @@ CompositionalMultiphaseWell::scalingForSystemSolution( DomainPartition & domain, createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, wellDofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index e0b95e4799b..05cffcbff85 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -19,10 +19,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_ -#include "constitutive/fluid/multifluid/Layouts.hpp" -#include "constitutive/relativePermeability/layouts.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBase.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" namespace geos @@ -289,10 +286,13 @@ class CompositionalMultiphaseWell : public WellSolverBase static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; } + static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; } + static constexpr char const * allowLocalCompDensChoppingString() { return CompositionalMultiphaseBase::viewKeyStruct::allowLocalCompDensChoppingString(); } // control data (not registered on the mesh) + static constexpr char const * massDensityString() { return "massDensity";} static constexpr char const * currentBHPString() { return "currentBHP"; } static constexpr char const * dCurrentBHP_dPresString() { return "dCurrentBHP_dPres"; } @@ -354,9 +354,9 @@ class CompositionalMultiphaseWell : public WellSolverBase * @param dt the time step dt * @param subRegion the well subRegion */ - void validateWellConstraints( real64 const & time_n, - real64 const & dt, - WellElementSubRegion const & subRegion ); + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) override; void printRates( real64 const & time_n, real64 const & dt, @@ -396,6 +396,9 @@ class CompositionalMultiphaseWell : public WellSolverBase /// maximum (absolute) change in pressure between two Newton iterations real64 m_maxAbsolutePresChange; + /// maximum (relative) change in component density between two Newton iterations + real64 m_maxRelativeCompDensChange; + /// minimum value of the scaling factor obtained by enforcing maxCompFracChange real64 m_minScalingFactor; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 70a8e51721d..d16557c96c6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -40,6 +40,7 @@ ControlEquationHelper:: real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, real64 const & currentTotalVolRate, @@ -102,9 +103,18 @@ ControlEquationHelper:: } else { - newControl = ( currentControl == WellControls::Control::BHP ) - ? WellControls::Control::TOTALVOLRATE - : WellControls::Control::BHP; + if( isZero( targetMassRate ) ) + { + newControl = ( currentControl == WellControls::Control::BHP ) + ? WellControls::Control::TOTALVOLRATE + : WellControls::Control::BHP; + } + else + { + newControl = ( currentControl == WellControls::Control::BHP ) + ? WellControls::Control::MASSRATE + : WellControls::Control::BHP; + } } } } @@ -120,6 +130,7 @@ ControlEquationHelper:: real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, real64 const & dCurrentBHP_dPres, arrayView1d< real64 const > const & dCurrentBHP_dCompDens, @@ -131,6 +142,7 @@ ControlEquationHelper:: real64 const & dCurrentTotalVolRate_dPres, arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, real64 const & dCurrentTotalVolRate_dRate, + real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) @@ -189,6 +201,17 @@ ControlEquationHelper:: dControlEqn_dComp[ic] = dCurrentTotalVolRate_dCompDens[ic]; } } + // Total mass rate control + else if( currentControl == WellControls::Control::MASSRATE ) + { + controlEqn = massDensity*currentTotalVolRate - targetMassRate; + dControlEqn_dPres = massDensity*dCurrentTotalVolRate_dPres; + dControlEqn_dRate = massDensity*dCurrentTotalVolRate_dRate; + for( integer ic = 0; ic < NC; ++ic ) + { + dControlEqn_dComp[ic] = massDensity*dCurrentTotalVolRate_dCompDens[ic]; + } + } else { GEOS_ERROR( "This constraint is not supported in CompositionalMultiphaseWell" ); @@ -610,6 +633,7 @@ PressureRelationKernel:: real64 const targetBHP = wellControls.getTargetBHP( timeAtEndOfStep ); real64 const targetTotalRate = wellControls.getTargetTotalRate( timeAtEndOfStep ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( timeAtEndOfStep ); + real64 const targetMassRate = wellControls.getTargetMassRate( timeAtEndOfStep ); // dynamic well control data real64 const & currentBHP = @@ -636,6 +660,8 @@ PressureRelationKernel:: wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); real64 const & dCurrentTotalVolRate_dRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); + real64 const & massDensity = + wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); RAJA::ReduceMax< parallelDeviceReduce, localIndex > switchControl( 0 ); @@ -653,6 +679,7 @@ PressureRelationKernel:: targetBHP, targetPhaseRate, targetTotalRate, + targetMassRate, currentBHP, currentPhaseVolRate, currentTotalVolRate, @@ -668,6 +695,7 @@ PressureRelationKernel:: targetBHP, targetPhaseRate, targetTotalRate, + targetMassRate, currentBHP, dCurrentBHP_dPres, dCurrentBHP_dCompDens, @@ -679,6 +707,7 @@ PressureRelationKernel:: dCurrentTotalVolRate_dPres, dCurrentTotalVolRate_dCompDens, dCurrentTotalVolRate_dRate, + massDensity, wellElemDofNumber[iwelemControl], localMatrix, localRhs ); @@ -1690,7 +1719,7 @@ PresTempCompFracInitializationKernel:: { foundNegativeTemp.max( 1 ); } - if( !isZero( sumCompFracForCheck - 1.0 ) ) + if( !isZero( sumCompFracForCheck - 1.0, constitutive::MultiFluidConstants::minForSpeciesPresence ) ) { foundInconsistentCompFrac.max( 1 ); } @@ -1746,6 +1775,7 @@ RateInitializationKernel:: bool const isProducer = wellControls.isProducer(); real64 const targetTotalRate = wellControls.getTargetTotalRate( currentTime ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( currentTime ); + real64 const targetMassRate = wellControls.getTargetMassRate( currentTime ); // Estimate the connection rates forAll< parallelDevicePolicy<> >( subRegionSize, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) @@ -1760,9 +1790,22 @@ RateInitializationKernel:: } else { - connRate[iwelem] = LvArray::math::min( 0.1 * targetTotalRate * totalDens[iwelem][0], 1e3 ); + if( isZero( targetMassRate ) ) + { + connRate[iwelem] = LvArray::math::min( 0.1 * targetTotalRate * totalDens[iwelem][0], 1e3 ); + } + else + { + connRate[iwelem] = targetMassRate; + } + } } + else if( control == WellControls::Control::MASSRATE ) + { + connRate[iwelem] = targetMassRate; + connRate[iwelem] = targetMassRate* totalDens[iwelem][0]; + } else { if( isProducer ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index ea06e3ae2ad..9f7466b2758 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -92,6 +92,7 @@ struct ControlEquationHelper real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, real64 const & currentTotalVolRate, @@ -107,6 +108,7 @@ struct ControlEquationHelper real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, real64 const & dCurrentBHP_dPres, arrayView1d< real64 const > const & dCurrentBHP_dCompDens, @@ -118,6 +120,7 @@ struct ControlEquationHelper real64 const & dCurrentTotalVolRate_dPres, arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, real64 const & dCurrentTotalVolRate_dRate, + real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); @@ -692,6 +695,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > m_targetBHP( wellControls.getTargetBHP( timeAtEndOfStep ) ), m_targetTotalRate( wellControls.getTargetTotalRate( timeAtEndOfStep ) ), m_targetPhaseRate( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ), + m_targetMassRate( wellControls.getTargetMassRate( timeAtEndOfStep ) ), m_volume( subRegion.getElementVolume() ), m_phaseDens_n( fluid.phaseDensity_n() ), m_totalDens_n( fluid.totalDensity_n() ) @@ -731,6 +735,11 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > // the residual entry is in volume / time units normalizer = LvArray::math::max( LvArray::math::abs( m_targetPhaseRate ), m_minNormalizer ); } + else if( m_currentControl == WellControls::Control::MASSRATE ) + { + // the residual entry is in volume / time units + normalizer = LvArray::math::max( LvArray::math::abs( m_targetMassRate ), m_minNormalizer ); + } } // for the pressure difference equation, always normalize by the BHP else @@ -748,8 +757,16 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > } else // Type::INJECTOR, only TOTALVOLRATE is supported for now { - // the residual is in mass units - normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ) * m_totalDens_n[iwelem][0]; + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate ); + } + else + { + // the residual is in mass units + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ) * m_totalDens_n[iwelem][0]; + } + } // to make sure that everything still works well if the rate is zero, we add this check @@ -765,7 +782,15 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > } else // Type::INJECTOR, only TOTALVOLRATE is supported for now { - normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ); + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate/ m_totalDens_n[iwelem][0] ); + } + else + { + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ); + } + } // to make sure that everything still works well if the rate is zero, we add this check @@ -819,6 +844,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > real64 const m_targetBHP; real64 const m_targetTotalRate; real64 const m_targetPhaseRate; + real64 const m_targetMassRate; /// View on the volume arrayView1d< real64 const > const m_volume; @@ -891,7 +917,9 @@ class ScalingForSystemSolutionKernelFactory * @brief Create a new kernel and launch * @tparam POLICY the policy used in the RAJA kernel * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed relative comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -903,6 +931,7 @@ class ScalingForSystemSolutionKernelFactory createAndLaunch( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -918,7 +947,7 @@ class ScalingForSystemSolutionKernelFactory arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, rankOffset, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return isothermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernel:: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index a1f1777c5e3..f495b15a488 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -66,12 +66,10 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) [&]( localIndex const, WellElementSubRegion & subRegion ) { - subRegion.registerField< fields::well::pressure_n >( getName() ); - subRegion.registerField< fields::well::pressure >( getName() ). - setRestartFlags( RestartFlags::WRITE_AND_READ ); - - subRegion.registerField< fields::well::temperature_n >( getName() ); - subRegion.registerField< fields::well::temperature >( getName() ); + string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); + GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ) ); subRegion.registerField< fields::well::connectionRate_n >( getName() ); subRegion.registerField< fields::well::connectionRate >( getName() ); @@ -101,31 +99,6 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) outputFile << "Time [s],BHP [Pa],Total rate [kg/s],Total " << conditionKey << " volumetric rate ["<( viewKeyStruct::fluidNamesString() ); - fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); - - } ); - } ); -} - -void SinglePhaseWell::initializePostSubGroups() -{ - - WellSolverBase::initializePostSubGroups(); - DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager & elemManager = mesh.getElemManager(); - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion & subRegion ) - { - validateWellConstraints( 0, 0, subRegion ); } ); } ); } @@ -137,7 +110,7 @@ string SinglePhaseWell::resElementDofName() const void SinglePhaseWell::validateWellConstraints( real64 const & time_n, real64 const & dt, - WellElementSubRegion const & subRegion ) const + WellElementSubRegion const & subRegion ) { WellControls const & wellControls = getWellControls( subRegion ); WellControls::Control const currentControl = wellControls.getControl(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 9df8cfcec0f..259db5d692b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -255,8 +255,6 @@ class SinglePhaseWell : public WellSolverBase protected: - virtual void initializePostSubGroups() override; - void printRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) override; @@ -275,9 +273,9 @@ class SinglePhaseWell : public WellSolverBase * @param dt the time step dt * @param subRegion the well subRegion */ - void validateWellConstraints( real64 const & time_n, - real64 const & dt, - WellElementSubRegion const & subRegion ) const; + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) override; }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 147f7027661..4d97682591b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -36,6 +36,7 @@ WellControls::WellControls( string const & name, Group * const parent ) m_targetBHP( 0.0 ), m_targetTotalRate( 0.0 ), m_targetPhaseRate( 0.0 ), + m_targetMassRate( 0.0 ), m_useSurfaceConditions( 0 ), m_surfacePres( 0.0 ), m_surfaceTemp( 0.0 ), @@ -79,6 +80,11 @@ WellControls::WellControls( string const & name, Group * const parent ) setInputFlag( InputFlags::OPTIONAL ). setDescription( "Target phase volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s])" ); + registerWrapper( viewKeyStruct::targetMassRateString(), &m_targetMassRate ). + setDefaultValue( 0.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Target Mass Rate rate ( [kg^3/s])" ); + registerWrapper( viewKeyStruct::targetPhaseNameString(), &m_targetPhaseName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setDefaultValue( "" ). @@ -146,6 +152,11 @@ WellControls::WellControls( string const & name, Group * const parent ) setInputFlag( InputFlags::OPTIONAL ). setDescription( "Name of the phase rate table when the rate is a time dependent function" ); + registerWrapper( viewKeyStruct::targetMassRateTableNameString(), &m_targetMassRateTableName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of the mass rate table when the rate is a time dependent function" ); + registerWrapper( viewKeyStruct::statusTableNameString(), &m_statusTableName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setInputFlag( InputFlags::OPTIONAL ). @@ -175,6 +186,12 @@ void WellControls::switchToPhaseRateControl( real64 const & val ) m_targetPhaseRate = val; } +void WellControls::switchToMassRateControl( real64 const & val ) +{ + m_currentControl = Control::MASSRATE; + m_targetMassRate = val; +} + namespace { @@ -228,6 +245,10 @@ void WellControls::postProcessInput() getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", InputError ); + GEOS_THROW_IF( m_targetMassRate < 0, + getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", + InputError ); + GEOS_THROW_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || (!m_injectionStream.empty() && m_injectionTemperature < 0), "WellControls " << getDataContext() << ": Both " @@ -267,14 +288,18 @@ void WellControls::postProcessInput() // 4) check that at least one rate constraint has been defined GEOS_THROW_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && + (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You need to specify a phase rate constraint or a total rate constraint. \n" << + "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << "The phase rate constraint can be specified using " << "either " << viewKeyStruct::targetPhaseRateString() << " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << "The total rate constraint can be specified using " << "either " << viewKeyStruct::targetTotalRateString() << - " or " << viewKeyStruct::targetTotalRateTableNameString(), + " or " << viewKeyStruct::targetTotalRateTableNameString()<< + "The mass rate constraint can be specified using " << + "either " << viewKeyStruct::targetMassRateString() << + " or " << viewKeyStruct::targetMassRateTableNameString(), InputError ); // 5) check whether redundant information has been provided @@ -293,6 +318,15 @@ void WellControls::postProcessInput() " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", InputError ); + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << + " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", + InputError ); + + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), + "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", + InputError ); + // 6.1) If the well is under BHP control then the BHP must be specified. // Otherwise the BHP will be set to a default value. if( m_currentControl == Control::BHP ) @@ -317,6 +351,12 @@ void WellControls::postProcessInput() << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), InputError ); + // An injector must be controlled by TotalVolRate + GEOS_THROW_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::MASSRATE ), + InputError ); + // 7) Make sure that the flag disabling crossflow is not used for producers GEOS_THROW_IF( isProducer() && m_isCrossflowEnabled == 0, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << @@ -380,7 +420,22 @@ void WellControls::postProcessInput() << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } + // Create time-dependent mass rate table + if( m_targetMassRateTableName.empty() ) + { + m_targetMassRateTableName = getName()+"_ConstantMassRate_table"; + m_targetMassRateTable = createWellTable( m_targetMassRateTableName, m_targetMassRate ); + } + else + { + FunctionManager & functionManager = FunctionManager::getInstance(); + m_targetMassRateTable = &(functionManager.getGroup< TableFunction const >( m_targetMassRateTableName )); + GEOS_THROW_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " + << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError ); + } // 12) Create the time-dependent well status table if( m_statusTableName.empty()) { @@ -408,7 +463,8 @@ void WellControls::postProcessInput() bool WellControls::isWellOpen( real64 const & currentTime ) const { bool isOpen = true; - if( isZero( getTargetTotalRate( currentTime ) ) && isZero( getTargetPhaseRate( currentTime ) ) ) + if( isZero( getTargetTotalRate( currentTime ) ) && isZero( getTargetPhaseRate( currentTime ) ) + && isZero( getTargetMassRate( currentTime ) )) { isOpen = false; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index 78f1524e518..b5a3af4205c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -61,6 +61,7 @@ class WellControls : public dataRepository::Group BHP, /**< The well operates at a specified bottom hole pressure (BHP) */ PHASEVOLRATE, /**< The well operates at a specified phase volumetric flow rate */ TOTALVOLRATE, /**< The well operates at a specified total volumetric flow rate */ + MASSRATE, /**evaluate( ¤tTime ); + } + + /** * @brief Const accessor for the composition of the injection stream * @return a global component fraction vector @@ -276,6 +293,8 @@ class WellControls : public dataRepository::Group static constexpr char const * targetPhaseRateString() { return "targetPhaseRate"; } /// String key for the well target phase name static constexpr char const * targetPhaseNameString() { return "targetPhaseName"; } + /// String key for the well target phase name + static constexpr char const * targetMassRateString() { return "targetMassRate"; } /// String key for the well injection stream static constexpr char const * injectionStreamString() { return "injectionStream"; } /// String key for the well injection temperature @@ -290,6 +309,8 @@ class WellControls : public dataRepository::Group static constexpr char const * targetTotalRateTableNameString() { return "targetTotalRateTableName"; } /// string key for phase rate table name static constexpr char const * targetPhaseRateTableNameString() { return "targetPhaseRateTableName"; } + /// string key for mass rate table name + static constexpr char const * targetMassRateTableNameString() { return "targetMassRateTableName"; } /// string key for BHP table name static constexpr char const * targetBHPTableNameString() { return "targetBHPTableName"; } /// string key for status table name @@ -336,6 +357,9 @@ class WellControls : public dataRepository::Group /// Name of the targeted phase string m_targetPhaseName; + /// Target MassRate + real64 m_targetMassRate; + /// Vector with global component fractions at the injector array1d< real64 > m_injectionStream; @@ -357,6 +381,9 @@ class WellControls : public dataRepository::Group /// Phase rate table name string m_targetPhaseRateTableName; + /// Mass rate table name + string m_targetMassRateTableName; + /// BHP table name string m_targetBHPTableName; @@ -378,6 +405,9 @@ class WellControls : public dataRepository::Group /// Phase rate table TableFunction const * m_targetPhaseRateTable; + /// Mass rate table + TableFunction const * m_targetMassRateTable; + /// BHP table TableFunction const * m_targetBHPTable; @@ -393,6 +423,7 @@ ENUM_STRINGS( WellControls::Control, "BHP", "phaseVolRate", "totalVolRate", + "massRate", "uninitialized" ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index a25112cd74a..f1c32fc0bd6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -93,7 +93,7 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) { SolverBase::registerDataOnMesh( meshBodies ); - + // loop over the wells forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & meshLevel, arrayView1d< string const > const & regionNames ) @@ -104,6 +104,11 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) [&]( localIndex const, WellElementSubRegion & subRegion ) { + subRegion.registerField< fields::well::pressure >( getName() ); + subRegion.registerField< fields::well::pressure_n >( getName() ); + + subRegion.registerField< fields::well::temperature >( getName() ); + subRegion.registerField< fields::well::temperature_n >( getName() ); subRegion.registerField< fields::well::gravityCoefficient >( getName() ); @@ -118,6 +123,23 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) } ); } +void WellSolverBase::initializePostSubGroups() +{ + DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + validateWellConstraints( 0, 0, subRegion ); + } ); + } ); +} + void WellSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { SolverBase::setConstitutiveNamesCallSuper( subRegion ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 6f53122b71e..ea55443dd17 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -293,12 +293,24 @@ class WellSolverBase : public SolverBase virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void initializePostSubGroups() override; + /** * @brief Initialize all the primary and secondary variables in all the wells * @param domain the domain containing the well manager to access individual wells */ virtual void initializeWells( DomainPartition & domain ) = 0; + /** + * @brief Make sure that the well constraints are compatible + * @param time_n the time at the beginning of the time step + * @param dt the time step dt + * @param subRegion the well subRegion + */ + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) = 0; + virtual void printRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) = 0; diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp new file mode 100644 index 00000000000..9755cca80a3 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -0,0 +1,413 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SeismicityRate.cpp + */ + +#include "SeismicityRate.hpp" + +#include "dataRepository/InputFlags.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" +#include "SeismicityRateKernels.hpp" + +namespace geos +{ + +using namespace dataRepository; +using namespace fields; +using namespace constitutive; + +SeismicityRate::SeismicityRate( const string & name, + Group * const parent ): + SolverBase( name, parent ), + m_stressSolver( nullptr ) +{ + this->registerWrapper( viewKeyStruct::directEffectString(), &m_directEffect ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Rate-and-state friction direct effect parameter" ); + + this->registerWrapper( viewKeyStruct::backgroundStressingRateString(), &m_backgroundStressingRate ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Background stressing rate" ); + + this->registerWrapper( viewKeyStruct::stressSolverNameString(), &m_stressSolverName ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of solver for computing stress" ); + + this->registerWrapper( viewKeyStruct::faultNormalDirectionString(), &m_faultNormalDirection ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Fault normal direction" ); + + this->registerWrapper( viewKeyStruct::faultShearDirectionString(), &m_faultShearDirection ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Fault shear direction" ); + + this->getWrapper< string >( viewKeyStruct::discretizationString() ). + setInputFlag( InputFlags::FALSE ); +} + +void SeismicityRate::postProcessInput() +{ + // Check orthogonality of user-specified faults + if( std::abs( LvArray::tensorOps::AiBi< 3 >( m_faultNormalDirection, m_faultShearDirection )) > 1e-8 ) + { + GEOS_ERROR( "Fault normal and fault shear directions must be orthogonal" ); + } + // If user has specified faults, normalize them to be unit vectors + else if( LvArray::tensorOps::l2Norm< 3 >( m_faultNormalDirection ) > 1e-8 ) + { + LvArray::tensorOps::normalize< 3 >( m_faultNormalDirection ); + LvArray::tensorOps::normalize< 3 >( m_faultShearDirection ); + } + + // Initialize member stress solver as specified in XML input + if( !m_stressSolverName.empty() ) + { + m_stressSolver = &this->getParent().getGroup< SolverBase >( m_stressSolverName ); + } + + SolverBase::postProcessInput(); +} + +SeismicityRate::~SeismicityRate() +{ + // TODO Auto-generated destructor stub +} + +void SeismicityRate::registerDataOnMesh( Group & meshBodies ) +{ + SolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + subRegion.registerField< inducedSeismicity::initialProjectedNormalTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::initialProjectedShearTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedNormalTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedNormalTraction_n >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedShearTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedShearTraction_n >( getName() ); + + subRegion.registerField< inducedSeismicity::seismicityRate >( getName() ); + + subRegion.registerField< inducedSeismicity::logDenom >( getName() ); + } ); + } ); +} + +void SeismicityRate::updateFaultTraction( ElementSubRegionBase & subRegion ) const +{ + // Retrieve field variables + arrayView1d< real64 > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + + // Retrieve stress state computed by m_stressSolver, called in solverStep + string const & solidModelName = subRegion.getReference< string >( SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString()); + SolidBase const & solidModel = getConstitutiveModel< SolidBase >( subRegion, solidModelName ); + arrayView3d< real64 const, solid::STRESS_USD > const stress = solidModel.getStress(); + + // Construct Voigt notation projection tensor (dyadic product of fault normal and shear vectors) + // for when multiplying in inner dot product with symmetric stress tensor + real64 faultNormalProjectionTensor[6]{}; + real64 faultShearProjectionTensor[6]{}; + constructFaultStressProjectionTensors( faultNormalProjectionTensor, faultShearProjectionTensor ); + + // loop over all elements and compute unweighted average across all nodes + // as average stress state acting over the cell ceneter + // TODO: APPLY WEIGHTS TO AVERAGE TO ACCOUNT FOR ELEMENT SHAPE + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Compute average stress state + real64 meanStress[ 6 ]{}; + for( int q = 0; q < stress.size( 1 ); q++ ) + { + LvArray::tensorOps::add< 6 >( meanStress, stress[k][q] ); + } + LvArray::tensorOps::scale< 6 >( meanStress, 1./stress.size( 1 )); + + // Project average stress state to fault + sig[k] = LvArray::tensorOps::AiBi< 6 >( meanStress, faultNormalProjectionTensor ); + tau[k] = LvArray::tensorOps::AiBi< 6 >( meanStress, faultShearProjectionTensor ); + } ); + + // For poroelastic models, we must calculate the total stress before computing the effective stresses + // on the fault. This requires retrieving both the pressure field and the Biot coefficient. We first check + // to see if a flow solver exists, retrive the pressure field, then pass the porous model through the lambda + // cast to access the Biot coefficient. Finally, effective stresses on the fault are calculated. + if( subRegion.hasWrapper( FlowSolverBase::viewKeyStruct::fluidNamesString() ) ) + { + arrayView1d< real64 const > const pres = subRegion.getField< flow::pressure >(); + + string const & porousSolidModelName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); + CoupledSolidBase & porousSolid = getConstitutiveModel< CoupledSolidBase >( subRegion, porousSolidModelName ); + constitutive::ConstitutivePassThru< CoupledSolidBase >::execute( porousSolid, [&] ( auto & castedPorousSolid ) + { + // Initialize biotCoefficient as const arrayView before passing it through the lambda cast + arrayView1d< real64 const > const biotCoefficient = castedPorousSolid.getBiotCoefficient(); + + // To calculate the action of the total stress on the fault from our previous calculations, + // we need to project the action of the pore pressure on the stress tensor onto the fault + computeTotalStressOnFault( biotCoefficient, + pres, + faultNormalProjectionTensor, + faultShearProjectionTensor, + sig, + tau ); + } ); + } +} + +void SeismicityRate::computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, + arrayView1d< real64 const > const pres, + real64 const (&faultNormalProjectionTensor)[6], + real64 const (&faultShearProjectionTensor)[6], + arrayView1d< real64 > const sig, + arrayView1d< real64 > const tau ) const +{ + // To calculate the action of the total stress on the fault from our previous calculations, + // we need to project the action of the pore pressure on the stress tensor onto the fault + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Form pressure as tensor + real64 pressureTensor[ 6 ]{}; + LvArray::tensorOps::symAddIdentity< 3 >( pressureTensor, -biotCoefficient[k]*pres[k] ); + + // Project pressure tensor onto fault orientations + real64 const pressureOnFaultNormal = LvArray::tensorOps::AiBi< 6 >( pressureTensor, faultNormalProjectionTensor ); + real64 const pressureOnFaultShear = LvArray::tensorOps::AiBi< 6 >( pressureTensor, faultShearProjectionTensor ); + + // Calculate total stress on the faults + sig[k] += pressureOnFaultNormal; + tau[k] += pressureOnFaultShear; + } ); +} + +void SeismicityRate::initializeFaultTraction( real64 const time_n, integer const cycleNumber, DomainPartition & domain ) const +{ + // Only call initialization step before stress solver has been called for first time step + if( cycleNumber == 0 ) + { + // Call solverStep of stress solver with dt=0 to initialize stresses in the matrix + + updateStresses( time_n, 0.0, cycleNumber, domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + + saveOldState( subRegion ); + + // Retrieve field variables + arrayView1d< real64 const > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 const > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + + arrayView1d< real64 > const sig_i = subRegion.getField< inducedSeismicity::initialProjectedNormalTraction >(); + arrayView1d< real64 > const tau_i = subRegion.getField< inducedSeismicity::initialProjectedShearTraction >(); + + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Set initial stress conditions on faults + sig_i[k] = sig[k]; + tau_i[k] = tau[k]; + } ); + } ); + } ); + } +} + +void SeismicityRate::constructFaultStressProjectionTensors( real64 (& faultNormalProjectionTensor)[6], + real64 (& faultShearProjectionTensor)[6] ) const +{ + faultNormalProjectionTensor[0] = m_faultNormalDirection[0]*m_faultNormalDirection[0]; + faultNormalProjectionTensor[1] = m_faultNormalDirection[1]*m_faultNormalDirection[1]; + faultNormalProjectionTensor[2] = m_faultNormalDirection[2]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[3] = 2*m_faultNormalDirection[1]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[4] = 2*m_faultNormalDirection[0]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[5] = 2*m_faultNormalDirection[0]*m_faultNormalDirection[1]; + + faultShearProjectionTensor[0] = m_faultShearDirection[0]*m_faultNormalDirection[0]; + faultShearProjectionTensor[1] = m_faultShearDirection[1]*m_faultNormalDirection[1]; + faultShearProjectionTensor[2] = m_faultShearDirection[2]*m_faultNormalDirection[2]; + faultShearProjectionTensor[3] = m_faultShearDirection[1]*m_faultNormalDirection[2] + m_faultShearDirection[2]*m_faultNormalDirection[1]; + faultShearProjectionTensor[4] = m_faultShearDirection[0]*m_faultNormalDirection[2] + m_faultShearDirection[2]*m_faultNormalDirection[0]; + faultShearProjectionTensor[5] = m_faultShearDirection[0]*m_faultNormalDirection[1] + m_faultShearDirection[1]*m_faultNormalDirection[0]; +} + +real64 SeismicityRate::solverStep( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) +{ + // Save initial stress state on pre-defined fault orientations to field variables + if( cycleNumber == 0 ) + { + initializeFaultTraction( time_n, cycleNumber, domain ); + } + + real64 const dtStress = updateStresses( time_n, dt, cycleNumber, domain ); + + // Loop over subRegions to solve for seismicity rate + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + // solve for the seismicity rate given new stresses on faults + integralSolverStep( time_n, dtStress, subRegion ); + + // save old state + saveOldState( subRegion ); + } ); + } ); + + // return time step size achieved by stress solver + return dtStress; +} + +real64 SeismicityRate::updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const +{ + // Call member variable stress solver to update the stress state + if( m_stressSolver ) + { + + // 1. Solve the momentum balance + real64 const dtStress = m_stressSolver->solverStep( time_n, dt, cycleNumber, domain ); + + // 2. Loop over subRegions to update stress on faults + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + updateFaultTraction( subRegion ); + } ); + } ); + return dtStress; + } + else + { + char const bcLogMessage[] = + "SeismicityRate {}: at time {}s, " + "the <{}> boundary condition '{}' is applied to the element set '{}' in subRegion '{}'. " + "\nThe scale of this boundary condition is {} and multiplies the value of the provided function (if any). " + "\nThe total number of target elements (including ghost elements) is {}. " + "\nNote that if this number is equal to zero for all subRegions, the boundary condition will not be applied on this element set."; + + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + + FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); + + std::vector< string > const keys = { inducedSeismicity::projectedNormalTraction::key(), + inducedSeismicity::projectedShearTraction::key() }; + + for( auto const & key : keys ) + { + fsManager.apply< ElementSubRegionBase >( time_n + dt, + mesh, + key, + [&]( FieldSpecificationBase const & fs, + string const & setName, + SortedArrayView< localIndex const > const & lset, + ElementSubRegionBase & subRegion, + string const & ) + { + if( fs.getLogLevel() >= 1 ) + { + globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); + GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, + this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), + fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + } + + // Specify the bc value of the field + fs.applyFieldValue< FieldSpecificationEqual, + parallelDevicePolicy<> >( lset, + time_n + dt, + subRegion, + key ); + } ); + } + } ); + } + return dt; +} + +void SeismicityRate::saveOldState( ElementSubRegionBase & subRegion ) const +{ + // Retrieve field variables + arrayView1d< real64 > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 > const sig_n = subRegion.getField< inducedSeismicity::projectedNormalTraction_n >(); + arrayView1d< real64 > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + arrayView1d< real64 > const tau_n = subRegion.getField< inducedSeismicity::projectedShearTraction_n >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // update projected stresses from previou step + sig_n[k] = sig[k]; + tau_n[k] = tau[k]; + } ); +} + +// Solve integral solution to ODE +void SeismicityRate::integralSolverStep( real64 const & time_n, + real64 const & dt, + ElementSubRegionBase & subRegion ) +{ + if( subRegion.hasWrapper( FlowSolverBase::viewKeyStruct::fluidNamesString() ) ) + { + seismicityRateKernels::createAndLaunch< parallelDevicePolicy<>, true >( subRegion, time_n, dt, m_directEffect, m_backgroundStressingRate ); + } + else + { + seismicityRateKernels::createAndLaunch< parallelDevicePolicy<>, false >( subRegion, time_n, dt, m_directEffect, m_backgroundStressingRate ); + } +} + +REGISTER_CATALOG_ENTRY( SolverBase, SeismicityRate, string const &, dataRepository::Group * const ) +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp new file mode 100644 index 00000000000..c8985312643 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -0,0 +1,161 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP +#define GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP + +#include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) +#include "physicsSolvers/SolverBase.hpp" // an abstraction class shared by all physics solvers +#include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain + +#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" + +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" + +namespace geos +{ + +class SeismicityRate : public SolverBase +{ +public: + /// The default nullary constructor is disabled to avoid compiler auto-generation: + SeismicityRate() = delete; + + /// The constructor needs a user-defined "name" and a parent Group (to place this instance in the tree structure of classes) + SeismicityRate( const string & name, + Group * const parent ); + + /// Destructor + virtual ~SeismicityRate() override; + + static string catalogName() { return "SeismicityRate"; } + + /** + * @return Get the final class Catalog name + */ + virtual string getCatalogName() const override { return catalogName(); } + + /// This method ties properties with their supporting mesh + virtual void registerDataOnMesh( Group & meshBodies ) override; + + struct viewKeyStruct : public SolverBase::viewKeyStruct + { + static constexpr char const * stressSolverNameString() { return "stressSolverName"; } + static constexpr char const * initialFaultNormalTractionString() { return "initialFaultNormalTraction"; } + static constexpr char const * initialFaultShearTractionString() { return "initialFaultShearTraction"; } + static constexpr char const * faultNormalDirectionString() { return "faultNormalDirection"; } + static constexpr char const * faultShearDirectionString() { return "faultShearDirection"; } + static constexpr char const * directEffectString() { return "directEffect"; } + static constexpr char const * backgroundStressingRateString() { return "backgroundStressingRate"; } + }; + + virtual real64 solverStep( real64 const & time_n, + real64 const & dt, + integer const cycleNumber, + DomainPartition & domain ) override final; + + /** + * @brief single step advance in computing the seismicity rate based on + * stress history according to closed form integral solution (Heimisson & Segall, 2018) + * to the ODE formulated by Dieterich, 1994 + * @param time_n time at previous converged step + * @param dt time step size + * @param subRegion ElementSubRegionBase to compute the solution in + */ + void integralSolverStep( real64 const & time_n, + real64 const & dt, + ElementSubRegionBase & subRegion ); + + /** + * @brief called in SolverStep after member stress solver is called to + * project the stress state to pre-defined fault orientations + * @param subRegion The ElementSubRegionBase that will have the stress information + */ + void updateFaultTraction( ElementSubRegionBase & subRegion ) const; + + /** + * @brief save the old state + * @param subRegion + */ + void saveOldState( ElementSubRegionBase & subRegion ) const; + + /** + * @brief + * @param biotCoefficient + * @param pres + * @param sig + * @param tau + */ + void computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, + arrayView1d< real64 const > const pres, + real64 const (&faultNormalProjectionTensor)[6], + real64 const (&faultShearProjectionTensor)[6], + arrayView1d< real64 > const sig, + arrayView1d< real64 > const tau ) const; + + /** + * @brief called in SolverStep before member stress solver is called to + * project the initial stress state to pre-defined fault orientations, + * only when cycleNumber == 0 + * @param cycleNumber current cycle number + * @param domain The DomainPartition of the problem + */ + void initializeFaultTraction( real64 const time_n, + integer const cycleNumber, + DomainPartition & domain ) const; + + +protected: + + /** + * @brief update the stresses either by asking the stressSolver or by applying b.c. + * @param time_n the current time + * @param dt the current time step + * @param cycleNumber the cycle number + * @param domain the DomainPartion group + */ + real64 updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const; + + + + void constructFaultStressProjectionTensors( real64 ( &faultNormalProjectionTensor )[6], + real64 ( &faultShearProjectionTensor )[6] ) const; + + virtual void postProcessInput() override; + + /// pointer to stress solver + SolverBase * m_stressSolver; + + /// stress solver name string + string m_stressSolverName; + + /// fault orientation: normal direction + R1Tensor m_faultNormalDirection; + + /// fault orientation: shear direction + R1Tensor m_faultShearDirection; + + /// direct effect coefficient + real64 m_directEffect; + + /// bacground stressing rate + real64 m_backgroundStressingRate; +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp new file mode 100644 index 00000000000..d708f28f9e5 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp @@ -0,0 +1,201 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" + +namespace geos +{ + +namespace seismicityRateKernels +{ +/** + * @class DieterichSeismicityRate + * + * @brief Solving the ODE for seismicity rate from Dieterich, 1994 + * + * @details This solver finds a solution R(x, t) - the seismicity rate - to the ordinary differential equation (ODE) + * formulated by Dieterich, 1994 given a certain stressing history. The stressing history can consist + * of mechanical stresses and pore pressure. The solver class includes a member variable + * pointing to the stress solver that is specified in the XML file. SolverStep for the + * stress solver is then called in the SolverStep function for the seismicity rate, to take + * the updated stress history as the input. + * + * Solving the ODE is currently implemented by computing the closed-form integral solution + * to the ODE which involves numerical calculation of an integral of a stress functional. + * We initially solve for the log of the seismicity rate in order to avoid overflow that + * typically occurs in the exponential of the stress history. + */ +class SeismicityRateKernel +{ +public: + + SeismicityRateKernel( ElementSubRegionBase & subRegion ): + m_R( subRegion.getField< fields::inducedSeismicity::seismicityRate >() ), + m_logDenom( subRegion.getField< fields::inducedSeismicity::logDenom >() ), + m_sigma_0( subRegion.getField< fields::inducedSeismicity::initialProjectedNormalTraction >() ), + m_sigma_n( subRegion.getField< fields::inducedSeismicity::projectedNormalTraction_n >() ), + m_sigma( subRegion.getField< fields::inducedSeismicity::projectedNormalTraction >() ), + m_tau_0( subRegion.getField< fields::inducedSeismicity::initialProjectedShearTraction >() ), + m_tau_n( subRegion.getField< fields::inducedSeismicity::projectedShearTraction_n >() ), + m_tau( subRegion.getField< fields::inducedSeismicity::projectedShearTraction >() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( real64 const directEffect, + real64 const backgroundStressingRate ): + directEffectValue( directEffect ), + backgroundStressingRateValue( backgroundStressingRate ), + effectiveNormalTraction_0( 0.0 ), + effectiveNormalTraction_n( 0.0 ), + effectiveNormalTraction( 0.0 ) + {} + + real64 const directEffectValue; + + real64 const backgroundStressingRateValue; + + real64 effectiveNormalTraction_0; + + real64 effectiveNormalTraction_n; + + real64 effectiveNormalTraction; + }; + + GEOS_HOST_DEVICE + void setup( localIndex const k, + StackVariables & stack ) const + { + stack.effectiveNormalTraction_0 = -m_sigma_0[k]; + stack.effectiveNormalTraction_n = -m_sigma_n[k]; + stack.effectiveNormalTraction = -m_sigma[k]; + } + + GEOS_HOST_DEVICE + void computeSeismicityRate( localIndex const k, + real64 const & time_n, + real64 const & dt, + StackVariables & stack ) const + { + + // arguments of stress exponential at current and previous time step + real64 const g = ( m_tau[k] + stack.backgroundStressingRateValue*(time_n+dt))/(stack.directEffectValue*stack.effectiveNormalTraction ) + - m_tau_0[k]/(stack.directEffectValue * stack.effectiveNormalTraction_0 ); + + real64 const g_n = ( m_tau_n[k] + stack.backgroundStressingRateValue*time_n)/(stack.directEffectValue*stack.effectiveNormalTraction_n ) + - m_tau_0[k]/(stack.directEffectValue*stack.effectiveNormalTraction_0); + + // Compute the difference of the log of the denominator of closed for integral solution. + // This avoids directly computing the exponential of the current stress state which is more prone to overflow. + m_logDenom[k] += std::log( 1 + dt/(2*(stack.directEffectValue*stack.effectiveNormalTraction_0/stack.backgroundStressingRateValue)) + *(std::exp( g - m_logDenom[k] ) + std::exp( g_n - m_logDenom[k] ) )); + + // Convert log seismicity rate to raw value + m_R[k] = LvArray::math::exp( g - m_logDenom[k] ); + } + +protected: + + arrayView1d< real64 > m_R; + + arrayView1d< real64 > m_logDenom; + + arrayView1d< real64 const > m_sigma_0; + + arrayView1d< real64 const > m_sigma_n; + + arrayView1d< real64 const > m_sigma; + + arrayView1d< real64 const > m_tau_0; + + arrayView1d< real64 const > m_tau_n; + + arrayView1d< real64 const > m_tau; +}; + + +class SeismicityRateKernelPoroelastic : public SeismicityRateKernel +{ + +public: + + SeismicityRateKernelPoroelastic( ElementSubRegionBase & subRegion ): + SeismicityRateKernel( subRegion ), + m_pressure_0( subRegion.getField< fields::flow::initialPressure >() ), + m_pressure_n( subRegion.getField< fields::flow::pressure_n >() ), + m_pressure( subRegion.getField< fields::flow::pressure >() ) + {} + + GEOS_HOST_DEVICE + void setup( localIndex const k, + StackVariables & stack ) const + { + stack.effectiveNormalTraction_0 = -m_sigma_0[k] - m_pressure_0[k]; + stack.effectiveNormalTraction_n = -m_sigma_n[k] - m_pressure_n[k]; + stack.effectiveNormalTraction = -m_sigma[k] - m_pressure[k]; + } + +private: + + arrayView1d< real64 const > m_pressure_0; + + arrayView1d< real64 const > m_pressure_n; + + arrayView1d< real64 const > m_pressure; +}; + + +/** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + */ +template< typename POLICY, bool ISPORO > +static void +createAndLaunch( ElementSubRegionBase & subRegion, + real64 const time_n, + real64 const dt, + real64 const directEffectValue, + real64 const backgroundStressingRateValue ) +{ + GEOS_MARK_FUNCTION; + + using kernelType = std::conditional_t< ISPORO, SeismicityRateKernelPoroelastic, SeismicityRateKernel >; + kernelType kernel( subRegion ); + + forAll< POLICY >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + typename kernelType::StackVariables stack( directEffectValue, backgroundStressingRateValue ); + kernel.setup( k, stack ); + kernel.computeSeismicityRate( k, time_n, dt, stack ); + } ); +} + +} /* namespace seismicityRateKernels */ + +}/* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp new file mode 100644 index 00000000000..f993990949a --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -0,0 +1,104 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file inducedSeismicityFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ + +namespace fields +{ + +namespace inducedSeismicity +{ + +DECLARE_FIELD( initialProjectedNormalTraction, + "initialProjectedNormalTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Initial meanNormal stress acting on the fault" ); + +DECLARE_FIELD( projectedNormalTraction, + "projectedNormalTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "meanNormal stress acting on the fault" ); + +DECLARE_FIELD( projectedNormalTraction_n, + "projectedNormalTraction_n", + array1d< real64 >, + 0, + LEVEL_1, + WRITE_AND_READ, + "meanNormal stress acting on the fault at the previous converged time step" ); + +DECLARE_FIELD( initialProjectedShearTraction, + "initialProjectedShearTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Initial meanShear stress acting on the fault" ); + +DECLARE_FIELD( projectedShearTraction, + "projectedShearTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "meanShear stress acting on the fault" ); + +DECLARE_FIELD( projectedShearTraction_n, + "projectedShearTraction_n", + array1d< real64 >, + 0, + LEVEL_1, + WRITE_AND_READ, + "meanShear stress acting on the fault at the previous converged time step" ); + +DECLARE_FIELD( seismicityRate, + "seismicityRate", + array1d< real64 >, + 1.0, + LEVEL_0, + WRITE_AND_READ, + "Seismicity rate" ); + +DECLARE_FIELD( logDenom, + "logDenom", + array1d< real64 >, + 0, + LEVEL_2, + WRITE_AND_READ, + "Log of the denominator of the integral form of the seismicity rate" ); + +} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index ef75ab18317..6cb5b0f5a6d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -37,54 +37,21 @@ namespace geos using namespace dataRepository; using namespace constitutive; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > class - CompositionalCatalogNames {}; - -// Class specialization for a RESERVOIR_SOLVER set to CompositionalMultiphaseFlow -template<> class CompositionalCatalogNames< CompositionalMultiphaseBase > -{ -public: - // TODO: find a way to use the catalog name here - static string name() { return "CompositionalMultiphaseReservoir"; } -}; -// Class specialization for a RESERVOIR_SOLVER set to MultiphasePoromechanics -template<> class CompositionalCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseBase >::catalogName()+"Reservoir"; } -}; - -} - -// provide a definition for catalogName() -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -string -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: -catalogName() -{ - return CompositionalCatalogNames< COMPOSITIONAL_RESERVOIR_SOLVER >::name(); -} - - -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: CompositionalMultiphaseReservoirAndWells( const string & name, Group * const parent ) : Base( name, parent ) {} -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: ~CompositionalMultiphaseReservoirAndWells() {} template<> CompositionalMultiphaseBase * -CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >:: +CompositionalMultiphaseReservoirAndWells<>:: flowSolver() const { return this->reservoirSolver(); @@ -92,7 +59,7 @@ flowSolver() const template<> CompositionalMultiphaseBase * -CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >:: +CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: flowSolver() const { return this->reservoirSolver()->flowSolver(); @@ -100,37 +67,41 @@ flowSolver() const template<> void -CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >:: +CompositionalMultiphaseReservoirAndWells<>:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseFVM ) + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; + // add Reservoir + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; } else { - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; + // add Reservoir + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; } } template<> void -CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >:: +CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: setMGRStrategy() { + // flow solver here is indeed flow solver, not poromechanics solver if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { - GEOS_LOG_RANK_0( "The MGR strategy for hybrid FVM is not implemented" ); + GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; } } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePreSubGroups() { Base::initializePreSubGroups(); @@ -147,18 +118,18 @@ initializePreSubGroups() InputError ); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); setMGRStrategy(); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: addCouplingSparsityPattern( DomainPartition const & domain, DofManager const & dofManager, SparsityPatternView< globalIndex > const & pattern ) const @@ -263,9 +234,9 @@ addCouplingSparsityPattern( DomainPartition const & domain, } ); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: assembleCouplingTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, @@ -455,13 +426,13 @@ assembleCouplingTerms( real64 const time_n, } ); } -template class CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >; -template class CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >; +template class CompositionalMultiphaseReservoirAndWells<>; +template class CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >; namespace { -typedef CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > CompositionalMultiphaseFlowAndWells; -typedef CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > > CompositionalMultiphasePoromechanicsAndWells; +typedef CompositionalMultiphaseReservoirAndWells<> CompositionalMultiphaseFlowAndWells; +typedef CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> > CompositionalMultiphasePoromechanicsAndWells; REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseFlowAndWells, string const &, Group * const ) REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphasePoromechanicsAndWells, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 6dafaf94948..4effbe54621 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -26,13 +26,14 @@ namespace geos { -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWellsBase< COMPOSITIONAL_RESERVOIR_SOLVER, +/// @tparam RESERVOIR_SOLVER compositional flow or compositional poromechanics solver +template< typename RESERVOIR_SOLVER = CompositionalMultiphaseBase > +class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, CompositionalMultiphaseWell > { public: - using Base = CoupledReservoirAndWellsBase< COMPOSITIONAL_RESERVOIR_SOLVER, + using Base = CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, CompositionalMultiphaseWell >; using Base::getLogLevel; using Base::m_solvers; @@ -55,7 +56,18 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr (std::is_same_v< RESERVOIR_SOLVER, CompositionalMultiphaseBase > ) // special case + { + return "CompositionalMultiphaseReservoir"; + } + else // default + { + return RESERVOIR_SOLVER::catalogName() + "Reservoir"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ @@ -72,42 +84,11 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - void - assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - void - assembleStabilizedFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - - real64 updateFluidState( ObjectManagerBase & subRegion ) const - { return flowSolver()->updateFluidState( subRegion ); } - void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const - { flowSolver()->updatePorosityAndPermeability( subRegion ); } - void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const - { flowSolver()->updateSolidInternalEnergyModel( dataGroup ); } - - integer & isThermal() { return flowSolver()->isThermal(); } integer useSimpleAccumulation() const { return flowSolver()->useSimpleAccumulation(); } integer useTotalMassEquation() const { return flowSolver()->useTotalMassEquation(); } integer numFluidPhases() { return flowSolver()->numFluidPhases(); } integer numFluidComponents() { return flowSolver()->numFluidComponents(); } - void enableFixedStressPoromechanicsUpdate() - { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - - virtual void saveSequentialIterationState( DomainPartition & domain ) override final { flowSolver()->saveSequentialIterationState( domain ); } - protected: virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index e08ccb8ea4a..515d778271e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -26,6 +26,7 @@ #include "constitutive/permeability/PermeabilityFields.hpp" #include "constitutive/permeability/PermeabilityBase.hpp" #include "mesh/PerforationFields.hpp" +#include "mesh/DomainPartition.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBase.hpp" @@ -126,7 +127,8 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL { GEOS_MARK_FUNCTION; - GEOS_UNUSED_VAR( setSparsity ); + // call reservoir solver setup (needed in case of SinglePhasePoromechanicsConformingFractures) + reservoirSolver()->setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); dofManager.setDomain( domain ); @@ -220,6 +222,43 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL } } + void + assembleFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const + { reservoirSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + + void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const + { reservoirSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + + real64 updateFluidState( ElementSubRegionBase & subRegion ) const + { return reservoirSolver()->updateFluidState( subRegion ); } + void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const + { reservoirSolver()->updatePorosityAndPermeability( subRegion ); } + void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const + { reservoirSolver()->updateSolidInternalEnergyModel( dataGroup ); } + + integer & isThermal() { return reservoirSolver()->isThermal(); } + + void enableJumpStabilization() + { reservoirSolver()->enableJumpStabilization(); } + + void enableFixedStressPoromechanicsUpdate() + { reservoirSolver()->enableFixedStressPoromechanicsUpdate(); } + + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { reservoirSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } + + virtual void saveSequentialIterationState( DomainPartition & domain ) override + { reservoirSolver()->saveSequentialIterationState( domain ); } + protected: /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 36eaa63652f..4cf0109a221 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -87,7 +87,7 @@ class CoupledSolver : public SolverBase getDataContext(), solverName, solverType ), InputError ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->catalogName(), solverName ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); } ); } @@ -161,6 +161,7 @@ class CoupledSolver : public SolverBase } ); } + // general version of assembleSystem function, keep in mind many solvers will override it virtual void assembleSystem( real64 const time_n, real64 const dt, @@ -171,18 +172,13 @@ class CoupledSolver : public SolverBase { /// Fully-coupled assembly. - // 1. we sync the nonlinear convergence history. The coupled solver parameters are the one being - // used. We want to propagate the info to subsolvers. It can be important for solvers that - // have special treatment for specific iterations. - synchronizeNonLinearParameters(); - - // 2. Assemble matrix blocks of each individual solver + // 1. Assemble matrix blocks of each individual solver forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { solver->assembleSystem( time_n, dt, domain, dofManager, localMatrix, localRhs ); } ); - // 3. Assemble coupling blocks + // 2. Assemble coupling blocks assembleCouplingTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); } @@ -355,6 +351,42 @@ class CoupledSolver : public SolverBase return isConverged; } + virtual bool updateConfiguration( DomainPartition & domain ) override + { + bool result = true; + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + result &= solver->updateConfiguration( domain ); + } ); + return result; + } + + virtual void outputConfigurationStatistics( DomainPartition const & domain ) const override + { + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + solver->outputConfigurationStatistics( domain ); + } ); + } + + virtual void resetConfigurationToBeginningOfStep( DomainPartition & domain ) override + { + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + solver->resetConfigurationToBeginningOfStep( domain ); + } ); + } + + virtual bool resetConfigurationToDefault( DomainPartition & domain ) const override + { + bool result = true; + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + result &= solver->resetConfigurationToDefault( domain ); + } ); + return result; + } + protected: /** @@ -433,9 +465,9 @@ class CoupledSolver : public SolverBase resetStateToBeginningOfStep( domain ); integer & iter = solverParams.m_numNewtonIterations; - iter = 0; + /// Sequential coupling loop - while( iter < solverParams.m_maxIterNewton ) + for( iter = 0; iter < solverParams.m_maxIterNewton; iter++ ) { // Increment the solver statistics for reporting purposes // Pass a "0" as argument (0 linear iteration) to skip the output of linear iteration stats at the end @@ -472,6 +504,8 @@ class CoupledSolver : public SolverBase if( isConverged ) { + // we still want to count current iteration + ++iter; // exit outer loop break; } @@ -479,8 +513,6 @@ class CoupledSolver : public SolverBase { finishSequentialIteration( iter, domain ); } - - ++iter; } if( isConverged ) @@ -539,10 +571,10 @@ class CoupledSolver : public SolverBase GEOS_UNUSED_VAR( domain, solverType ); } - bool checkSequentialConvergence( int const & iter, - real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) + virtual bool checkSequentialConvergence( int const & iter, + real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) { NonlinearSolverParameters const & params = getNonlinearSolverParameters(); bool isConverged = true; @@ -643,6 +675,11 @@ class CoupledSolver : public SolverBase EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), InputError ); + if( !isSequential ) + { + synchronizeNonlinearSolverParameters(); + } + if( m_nonlinearSolverParameters.m_nonlinearAccelerationType != NonlinearSolverParameters::NonlinearAccelerationType::None ) validateNonlinearAcceleration(); } @@ -656,12 +693,12 @@ class CoupledSolver : public SolverBase InputError ); } - void - synchronizeNonLinearParameters() + virtual void + synchronizeNonlinearSolverParameters() override { forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { - solver->getNonlinearSolverParameters() = m_nonlinearSolverParameters; + solver->getNonlinearSolverParameters() = getNonlinearSolverParameters(); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 46d83cd528c..971b3852b78 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -26,6 +26,7 @@ #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "mesh/MeshFields.hpp" namespace geos { @@ -34,39 +35,6 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; - -namespace -{ - -// This is meant to be specialized to work, see below -template< typename POROMECHANICS_SOLVER > class - HydrofractureSolverCatalogNames {}; - -// Class specialization for a POROMECHANICS_SOLVER set to SinglePhasePoromechanics -template<> class HydrofractureSolverCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return "Hydrofracture"; } -}; - -// Class specialization for a POROMECHANICS_SOLVER set to MultiphasePoromechanics -template<> class HydrofractureSolverCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return "MultiphaseHydrofracture"; } -}; -} - -// provide a definition for catalogName() -template< typename POROMECHANICS_SOLVER > -string -HydrofractureSolver< POROMECHANICS_SOLVER >:: -catalogName() -{ - return HydrofractureSolverCatalogNames< POROMECHANICS_SOLVER >::name(); -} - - template< typename POROMECHANICS_SOLVER > HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & name, Group * const parent ) @@ -75,7 +43,8 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & m_surfaceGeneratorName(), m_surfaceGenerator( nullptr ), m_maxNumResolves( 10 ), - m_isMatrixPoroelastic() + m_isMatrixPoroelastic(), + m_newFractureInitializationType() { registerWrapper( viewKeyStruct::surfaceGeneratorNameString(), &m_surfaceGeneratorName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). @@ -96,6 +65,12 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); + /// GEOS mainly initializes pressure in the new fracture elements. + registerWrapper( viewKeyStruct::newFractureInitializationTypeString(), &m_newFractureInitializationType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( InitializationType::Pressure ). + setDescription( "Type of new fracture element initialization. Can be Pressure or Displacement. " ); + registerWrapper( viewKeyStruct::useQuasiNewtonString(), &m_useQuasiNewton ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); @@ -176,6 +151,9 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::postProcessInput() static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_isMatrixPoroelastic ) == 0, viewKeyStruct::isMatrixPoroelasticString() << " option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_IF( m_newFractureInitializationType != InitializationType::Pressure && m_newFractureInitializationType != InitializationType::Displacement, + viewKeyStruct::newFractureInitializationTypeString() << " option can be either Pressure or Displacement" ); + m_surfaceGenerator = &this->getParent().template getGroup< SurfaceGenerator >( m_surfaceGeneratorName ); flowSolver()->allowNegativePressure(); @@ -189,6 +167,11 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real int const cycleNumber, DomainPartition & domain ) { + if( cycleNumber == 0 && time_n <= 0 ) + { + initializeNewFractureFields( domain ); + } + real64 dtReturn = dt; implicitStepSetup( time_n, dt, domain ); @@ -220,7 +203,7 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real dtReturn = nonlinearImplicitStep( time_n, dt, cycleNumber, domain ); - if( m_surfaceGenerator->solverStep( time_n, dt, cycleNumber, domain ) > 0 ) + if( !this->m_performStressInitialization && m_surfaceGenerator->solverStep( time_n, dt, cycleNumber, domain ) > 0 ) { locallyFractured = 1; } @@ -236,11 +219,14 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real } else { + // We initialize the fields for new fracture cells + initializeNewFractureFields( domain ); + FieldIdentifiers fieldsToBeSync; fieldsToBeSync.addElementFields( { flow::pressure::key(), flow::pressure_n::key(), - SurfaceElementSubRegion::viewKeyStruct::elementApertureString() }, + fields::elementAperture::key() }, { m_surfaceGenerator->getFractureRegionName() } ); fieldsToBeSync.addFields( FieldLocation::Node, @@ -971,11 +957,176 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::setUpDflux_dApertureMatrix( Do } ); } +template< typename POROMECHANICS_SOLVER > +void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( DomainPartition & domain ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = meshLevel.getElemManager(); + NodeManager & nodeManager = meshLevel.getNodeManager(); + FaceManager const & faceManager = meshLevel.getFaceManager(); + ArrayOfArraysView< localIndex const > const faceToNodesMap = faceManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceNormal = faceManager.faceNormal(); + + solidMechanics::arrayView2dLayoutIncrDisplacement const incrementalDisplacement = + nodeManager.getField< fields::solidMechanics::incrementalDisplacement >(); + solidMechanics::arrayView2dLayoutTotalDisplacement const totalDisplacement = + nodeManager.getField< fields::solidMechanics::totalDisplacement >(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, + [=]( localIndex const, + FaceElementSubRegion & subRegion ) + { + ArrayOfArraysView< localIndex const > const facesToEdges = subRegion.edgeList().toViewConst(); + ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = subRegion.m_2dFaceTo2dElems.toViewConst(); + map< localIndex, localIndex > const & edgesToConnectorEdges = subRegion.m_edgesTo2dFaces; + + ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); + + arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); + arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); + + arrayView1d< real64 > const aperture = subRegion.getField< fields::elementAperture >(); + + // Get the list of newFractureElements + SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); + + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + arrayView1d< real64 > const apertureF = subRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); + #endif + + // arrayView1d< real64 > const dens = subRegion.getReference< array1d< real64 > >( "density_n" ); // change it to make aperture + // zero + + forAll< serialPolicy >( newFractureElements.size(), [&] ( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + real64 initialPressure = 1.0e99; + real64 initialAperture = 1.0e99; + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + apertureF[newElemIndex] = aperture[newElemIndex]; + #endif + if( m_newFractureInitializationType == InitializationType::Displacement ) + { + aperture[newElemIndex] = 1.0e99; + } + arraySlice1d< localIndex const > const faceToEdges = facesToEdges[newElemIndex]; + + for( localIndex ke=0; ke 1.0e98? 0.0:initialPressure; + fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; + } + else if( m_newFractureInitializationType == InitializationType::Displacement ) + { + // Set the aperture/fluid pressure for the new face element to be the minimum + // of the existing value, smallest aperture/pressure from a connected face element. + // aperture[newElemIndex] = std::min(aperture[newElemIndex], initialAperture); + + localIndex const faceIndex0 = faceMap[newElemIndex][0]; + localIndex const faceIndex1 = faceMap[newElemIndex][1]; + + localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + + bool zeroDisp = true; + + for( localIndex a=0; a( totalDisplacement[node0] ) ) > 1.0e-99 && + LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) + { + zeroDisp = false; + } + } + if( zeroDisp ) + { + aperture[newElemIndex] = 0; + } + } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", + newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); + } ); + + if( m_newFractureInitializationType == InitializationType::Displacement ) + { + SortedArray< localIndex > touchedNodes; + forAll< serialPolicy >( newFractureElements.size(), [ newFractureElements + , aperture + , faceMap + , faceNormal + , faceToNodesMap + , &touchedNodes + , incrementalDisplacement + , totalDisplacement ]( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + + if( aperture[newElemIndex] < 1e98 ) + { + localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); + localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); + localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + + real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); + LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); + for( localIndex a=0; a( incrementalDisplacement[node0], newDisp ); + LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); + LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); + LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); + } + } + } + } ); + } + + subRegion.m_recalculateConnectionsFor2dFaces.clear(); + subRegion.m_newFaceElements.clear(); + } ); + } ); +} + namespace { -typedef HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhaseHydrofracture; -// typedef HydrofractureSolver< MultiphasePoromechanics< CompositionalMultiphaseBase > > MultiphaseHydrofracture; +typedef HydrofractureSolver<> SinglePhaseHydrofracture; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHydrofracture, string const &, Group * const ) +// typedef HydrofractureSolver< MultiphasePoromechanics<> > MultiphaseHydrofracture; // REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseHydrofracture, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 9ee4adcdd04..803e38153a9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -29,7 +29,7 @@ namespace geos using dataRepository::Group; -template< typename POROMECHANICS_SOLVER = SinglePhasePoromechanics< SinglePhaseBase > > +template< typename POROMECHANICS_SOLVER = SinglePhasePoromechanics<> > class HydrofractureSolver : public POROMECHANICS_SOLVER { public: @@ -68,7 +68,19 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER /// Destructor for the class ~HydrofractureSolver() override {} - static string catalogName(); + static string catalogName() + { + // single phase + if constexpr ( std::is_same_v< POROMECHANICS_SOLVER, SinglePhasePoromechanics< SinglePhaseBase > > ) + { + return "Hydrofracture"; + } +// // multi phase (TODO) +// else if constexpr ( std::is_same_v< POROMECHANICS_SOLVER, MultiphasePoromechanics< CompositionalMultiphaseBase > > ) +// { +// return "MultiphaseHydrofracture"; +// } + } /** * @copydoc SolverBase::getCatalogName() */ @@ -138,6 +150,12 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER return m_derivativeFluxResidual_dAperture->toViewConst(); } + enum class InitializationType : integer + { + Pressure, + Displacement, + }; + struct viewKeyStruct : Base::viewKeyStruct { constexpr static char const * contactRelationNameString() { return "contactRelationName"; } @@ -148,6 +166,8 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER constexpr static char const * isMatrixPoroelasticString() { return "isMatrixPoroelastic"; } + constexpr static char const * newFractureInitializationTypeString() { return "newFractureInitializationType"; } + constexpr static char const * useQuasiNewtonString() { return "useQuasiNewton"; } #ifdef GEOSX_USE_SEPARATION_COEFFICIENT @@ -194,6 +214,13 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER int const cycleNumber, DomainPartition & domain ) override final; + + /** + * @brief Initialize fields on the newly created elements of the fracture. + * @param domain the physical domain object + */ + void initializeNewFractureFields( DomainPartition & domain ); + // name of the contact relation string m_contactRelationName; @@ -211,10 +238,17 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER integer m_isMatrixPoroelastic; + // flag to determine which initialization type to use for the new fracture cell + InitializationType m_newFractureInitializationType; + integer m_useQuasiNewton; // use Quasi-Newton (see https://arxiv.org/abs/2111.00264) }; +ENUM_STRINGS( HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > >::InitializationType, + "Pressure", + "Displacement" ); + } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index ac12d92bbf7..354519b9f15 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -22,14 +22,14 @@ #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" +//#include "physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp" +//#include "physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp" namespace geos { @@ -39,56 +39,11 @@ using namespace constitutive; using namespace fields; using namespace stabilization; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename FLOW_SOLVER > class - MultiphaseCatalogNames {}; -// Class specialization for a FLOW_SOLVER set to CompositionalMultiphaseBase -template<> class MultiphaseCatalogNames< CompositionalMultiphaseBase > -{ -public: - static string name() { return "MultiphasePoromechanics"; } -}; -// Class specialization for a FLOW_SOLVER set to CompositionalMultiphaseReservoirAndWells -template<> class MultiphaseCatalogNames< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > -{ -public: - static string name() { return CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >::catalogName() + "Poromechanics"; } -}; -} - -// provide a definition for catalogName() -template< typename FLOW_SOLVER > -string -MultiphasePoromechanics< FLOW_SOLVER >:: -catalogName() -{ - return MultiphaseCatalogNames< FLOW_SOLVER >::name(); -} - -template< typename FLOW_SOLVER > -MultiphasePoromechanics< FLOW_SOLVER >::MultiphasePoromechanics( const string & name, - Group * const parent ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanics( const string & name, + Group * const parent ) : Base( name, parent ) { - this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Stabilization type. Options are:\n" + - toString( StabilizationType::None ) + " - Add no stabilization to mass equation,\n" + - toString( StabilizationType::Global ) + " - Add stabilization to all faces,\n" + - toString( StabilizationType::Local ) + " - Add stabilization only to interiors of macro elements." ); - - this->registerWrapper( viewKeyStruct::stabilizationRegionNamesString(), &m_stabilizationRegionNames ). - setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Regions where stabilization is applied." ); - - this->registerWrapper( viewKeyStruct::stabilizationMultiplierString(), &m_stabilizationMultiplier ). - setApplyDefaultValue( 1.0 ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Constant multiplier of stabilization strength." ); LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; @@ -97,12 +52,12 @@ MultiphasePoromechanics< FLOW_SOLVER >::MultiphasePoromechanics( const string & linearSolverParameters.dofsPerNode = 3; } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::postProcessInput() +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput() { Base::postProcessInput(); - GEOS_ERROR_IF( this->flowSolver()->catalogName() == "CompositionalMultiphaseReservoir" && + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "CompositionalMultiphaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", this->getDataContext(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), @@ -110,47 +65,22 @@ void MultiphasePoromechanics< FLOW_SOLVER >::postProcessInput() )); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::registerDataOnMesh( Group & meshBodies ) -{ - Base::registerDataOnMesh( meshBodies ); - - if( m_stabilizationType == StabilizationType::Global || - m_stabilizationType == StabilizationType::Local ) - { - this->template forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) - { - subRegion.registerField< fields::flow::macroElementIndex >( this->getName() ); - subRegion.registerField< fields::flow::elementStabConstant >( this->getName() ); - } ); - } ); - } -} - -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::setupCoupling( DomainPartition const & GEOS_UNUSED_PARAM( domain ), - DofManager & dofManager ) const +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::setupCoupling( DomainPartition const & GEOS_UNUSED_PARAM( domain ), + DofManager & dofManager ) const { dofManager.addCoupling( solidMechanics::totalDisplacement::key(), CompositionalMultiphaseBase::viewKeyStruct::elemDofFieldString(), DofManager::Connector::Elem ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::assembleSystem( real64 const time, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -166,7 +96,6 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleSystem( real64 const time, if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) { - updateStabilizationParameters( domain ); this->flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, @@ -183,13 +112,13 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleSystem( real64 const time, } } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBasedTerms( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n ); GEOS_UNUSED_VAR( dt ); @@ -216,7 +145,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c thermalPoromechanicsKernels::ThermalMultiphasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, - viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt, @@ -224,6 +153,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->flowSolver()->numFluidComponents(), this->flowSolver()->numFluidPhases(), this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else @@ -233,7 +163,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c poromechanicsKernels::MultiphasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, - viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt, @@ -242,6 +172,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->flowSolver()->numFluidPhases(), this->flowSolver()->useSimpleAccumulation(), this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); @@ -287,8 +218,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->solidMechanicsSolver()->getMaxForce() = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateState( DomainPartition & domain ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -317,8 +248,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::updateState( DomainPartition & doma this->getName(), GEOS_FMT( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::initializePostInitialConditionsPreSubGroups() +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); @@ -350,90 +281,15 @@ void MultiphasePoromechanics< FLOW_SOLVER >::initializePostInitialConditionsPreS } } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::initializePreSubGroups() -{ - Base::initializePreSubGroups(); - - GEOS_THROW_IF( m_stabilizationType == StabilizationType::Local, - this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << - ": Local stabilization has been disabled temporarily", - InputError ); -} - -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateStabilizationParameters( DomainPartition & domain ) const -{ - // Step 1: we loop over the regions where stabilization is active and collect their name - - set< string > regionFilter; - for( string const & regionName : m_stabilizationRegionNames ) - { - regionFilter.insert( regionName ); - } - - // Step 2: loop over the target regions of the solver, and tag the elements belonging to stabilization regions - this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & targetRegionNames ) - { - // keep only the target regions that are in the filter - array1d< string > filteredTargetRegionNames; - filteredTargetRegionNames.reserve( targetRegionNames.size() ); - - for( string const & targetRegionName : targetRegionNames ) - { - if( regionFilter.count( targetRegionName ) ) - { - filteredTargetRegionNames.emplace_back( targetRegionName ); - } - } - - // loop over the elements and update the stabilization constant - mesh.getElemManager().forElementSubRegions( filteredTargetRegionNames.toViewConst(), [&]( localIndex const, - ElementSubRegionBase & subRegion ) - - { - arrayView1d< integer > const macroElementIndex = subRegion.getField< fields::flow::macroElementIndex >(); - arrayView1d< real64 > const elementStabConstant = subRegion.getField< fields::flow::elementStabConstant >(); - - geos::constitutive::CoupledSolidBase const & porousSolid = - this->template getConstitutiveModel< geos::constitutive::CoupledSolidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ) ); - - arrayView1d< real64 const > const bulkModulus = porousSolid.getBulkModulus(); - arrayView1d< real64 const > const shearModulus = porousSolid.getShearModulus(); - arrayView1d< real64 const > const biotCoefficient = porousSolid.getBiotCoefficient(); - - real64 const stabilizationMultiplier = m_stabilizationMultiplier; - - forAll< parallelDevicePolicy<> >( subRegion.size(), [bulkModulus, - shearModulus, - biotCoefficient, - stabilizationMultiplier, - macroElementIndex, - elementStabConstant] GEOS_HOST_DEVICE ( localIndex const ei ) - { - real64 const bM = bulkModulus[ei]; - real64 const sM = shearModulus[ei]; - real64 const bC = biotCoefficient[ei]; - - macroElementIndex[ei] = 1; - elementStabConstant[ei] = stabilizationMultiplier * 9.0 * (bC * bC) / (32.0 * (10.0 * sM / 3.0 + bM)); - - } ); - } ); - } ); -} - -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) { // get the fluid model (to access fluid density) string const fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); MultiFluidBase const & fluid = this->template getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); // get the solid model (to access porosity and solid density) - string const solidName = subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ); + string const solidName = subRegion.getReference< string >( Base::viewKeyStruct::porousMaterialNamesString() ); CoupledSolidBase const & solid = this->template getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); // update the bulk density @@ -445,14 +301,16 @@ void MultiphasePoromechanics< FLOW_SOLVER >::updateBulkDensity( ElementSubRegion subRegion ); } -template class MultiphasePoromechanics< CompositionalMultiphaseBase >; -template class MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >; +template class MultiphasePoromechanics<>; +//template class MultiphasePoromechanics< CompositionalMultiphaseBase, SolidMechanicsLagrangeContact >; +//template class MultiphasePoromechanics< CompositionalMultiphaseBase, SolidMechanicsEmbeddedFractures >; +template class MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> >; namespace { -typedef MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > MultiphaseReservoirPoromechanics; +typedef MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > MultiphaseReservoirPoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseReservoirPoromechanics, string const &, Group * const ) -typedef MultiphasePoromechanics< CompositionalMultiphaseBase > MultiphasePoromechanics; +typedef MultiphasePoromechanics<> MultiphasePoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, MultiphasePoromechanics, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 0d0835869cb..c69d3829e54 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -21,37 +21,25 @@ #include "physicsSolvers/multiphysics/PoromechanicsSolver.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" - +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" namespace geos { -namespace stabilization -{ -enum class StabilizationType : integer -{ - None, - Global, - Local, -}; - -ENUM_STRINGS( StabilizationType, - "None", - "Global", - "Local" ); -} - -template< typename FLOW_SOLVER > -class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > +template< typename FLOW_SOLVER = CompositionalMultiphaseBase, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > +class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER > { public: - using Base = PoromechanicsSolver< FLOW_SOLVER >; + using Base = PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER >; using Base::m_solvers; using Base::m_dofManager; using Base::m_localMatrix; using Base::m_rhs; using Base::m_solution; + using Base::m_stabilizationType; + using Base::m_stabilizationRegionNames; + using Base::m_stabilizationMultiplier; /** * @brief main constructor for MultiphasePoromechanics Objects @@ -68,7 +56,18 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new MultiphasePoromechanics object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, CompositionalMultiphaseBase > ) // special case + { + return "MultiphasePoromechanics"; + } + else // default + { + return FLOW_SOLVER::catalogName() + "Poromechanics"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ @@ -83,8 +82,6 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > virtual void postProcessInput() override; - virtual void registerDataOnMesh( dataRepository::Group & meshBodies ) override; - virtual void setupCoupling( DomainPartition const & domain, DofManager & dofManager ) const override; @@ -106,29 +103,11 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > /**@}*/ - /* - * @brief Utility function to update the stabilization parameters at each time step - * @param[in] domain the domain partition - */ - void updateStabilizationParameters( DomainPartition & domain ) const; - protected: virtual void initializePostInitialConditionsPreSubGroups() override; - virtual void initializePreSubGroups() override; - - struct viewKeyStruct : Base::viewKeyStruct - { - /// Type of stabilization used in the simulation - constexpr static char const * stabilizationTypeString() { return "stabilizationType"; } - - /// Names of the regions where the stabilization is applied - constexpr static char const * stabilizationRegionNamesString() { return "stabilizationRegionNames"; } - /// Multiplier on stabilization - constexpr static char const * stabilizationMultiplierString() { return "stabilizationMultiplier"; } - }; private: @@ -150,29 +129,21 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > real64 const dt, PARAMS && ... params ); - /// Type of stabilization used in the simulation - stabilization::StabilizationType m_stabilizationType; - - /// Names of the regions where the stabilization is applied - array1d< string > m_stabilizationRegionNames; - - /// Multiplier on stabilization constant - real64 m_stabilizationMultiplier; }; -template< typename FLOW_SOLVER > +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > template< typename CONSTITUTIVE_BASE, typename KERNEL_WRAPPER, typename ... PARAMS > -real64 MultiphasePoromechanics< FLOW_SOLVER >::assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ) +real64 MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch( MeshLevel & mesh, + DofManager const & dofManager, + arrayView1d< string const > const & regionNames, + string const & materialNamesString, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + real64 const dt, + PARAMS && ... params ) { GEOS_MARK_FUNCTION; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index cb0e6541120..5cf7d5d791e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -21,63 +21,28 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp" +#include "physicsSolvers/multiphysics/HydrofractureSolver.hpp" #include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp" +#include "events/tasks/TasksManager.hpp" namespace geos { using namespace dataRepository; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename POROMECHANICS_SOLVER > class - PoromechanicsCatalogNames {}; - -// Class specializations for a POROMECHANICS_SOLVER set to SinglePhasePoromechanics -template<> class PoromechanicsCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseBase >::catalogName() + "Initialization"; } -}; -template<> class PoromechanicsCatalogNames< SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > >::catalogName() + "Initialization"; } -}; -// Class specializations for a POROMECHANICS_SOLVER set to MultiphasePoromechanics -template<> class PoromechanicsCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseBase >::catalogName() + "Initialization"; } -}; -template<> class PoromechanicsCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >::catalogName() + "Initialization"; } -}; - -} - -// provide a definition for catalogName() -template< typename POROMECHANICS_SOLVER > -string -PoromechanicsInitialization< POROMECHANICS_SOLVER >:: -catalogName() -{ - return PoromechanicsCatalogNames< POROMECHANICS_SOLVER >::name(); -} - template< typename POROMECHANICS_SOLVER > PoromechanicsInitialization< POROMECHANICS_SOLVER >:: PoromechanicsInitialization( const string & name, Group * const parent ): TaskBase( name, parent ), m_poromechanicsSolverName(), + m_solidMechanicsStatistics(), m_solidMechanicsStateResetTask( name, parent ) { enableLogLevelInput(); @@ -87,10 +52,11 @@ PoromechanicsInitialization( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the poromechanics solver" ); - registerWrapper( viewKeyStruct::performStressInitializationString(), &m_performStressInitialization ). - setApplyDefaultValue( true ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Flag to indicate that the solver is going to perform stress initialization" ); + registerWrapper( viewKeyStruct::solidMechanicsStatisticsNameString(), &m_solidMechanicsStatisticsName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( "" ). + setDescription( "Name of the solid mechanics statistics" ); } template< typename POROMECHANICS_SOLVER > @@ -105,13 +71,27 @@ postProcessInput() PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), - GEOS_FMT( "{}: physics solver named {} not found", + GEOS_FMT( "{}: {} solver named {} not found", getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), + POROMECHANICS_SOLVER::catalogName(), m_poromechanicsSolverName ), InputError ); m_poromechanicsSolver = &physicsSolverManager.getGroup< POROMECHANICS_SOLVER >( m_poromechanicsSolverName ); + if( !m_solidMechanicsStatisticsName.empty()) + { + TasksManager & tasksManager = problemManager.getTasksManager(); + + GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), + GEOS_FMT( "{}: statistics task named {} not found", + getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), + m_solidMechanicsStatisticsName ), + InputError ); + + m_solidMechanicsStatistics = &tasksManager.getGroup< SolidMechanicsStatistics >( m_solidMechanicsStatisticsName ); + } + m_solidMechanicsStateResetTask.setLogLevel( getLogLevel()); m_solidMechanicsStateResetTask.m_solidSolverName = m_poromechanicsSolver->solidMechanicsSolver()->getName(); m_solidMechanicsStateResetTask.postProcessInput(); @@ -127,17 +107,21 @@ execute( real64 const time_n, real64 const eventProgress, DomainPartition & domain ) { - if( m_performStressInitialization ) - { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", - getName(), time_n, m_poromechanicsSolverName ) ); - m_poromechanicsSolver->setStressInitialization( true ); - } - else + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", + getName(), time_n, m_poromechanicsSolverName ) ); + m_poromechanicsSolver->setStressInitialization( true ); + + m_solidMechanicsStateResetTask.execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); + + m_poromechanicsSolver->execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", + getName(), time_n + dt, m_poromechanicsSolverName ) ); + m_poromechanicsSolver->setStressInitialization( false ); + + if( m_solidMechanicsStatistics != nullptr ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", - getName(), time_n, m_poromechanicsSolverName ) ); - m_poromechanicsSolver->setStressInitialization( false ); + m_solidMechanicsStatistics->execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); } m_solidMechanicsStateResetTask.execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); @@ -148,14 +132,20 @@ execute( real64 const time_n, namespace { -typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseBase > > MultiphasePoromechanicsInitialization; -typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > > MultiphaseReservoirPoromechanicsInitialization; -typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhasePoromechanicsInitialization; -typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > > SinglePhaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< MultiphasePoromechanics<> > MultiphasePoromechanicsInitialization; +typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > > MultiphaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanics<> > SinglePhasePoromechanicsInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanicsEmbeddedFractures > SinglePhasePoromechanicsEmbeddedFracturesInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > > SinglePhaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< HydrofractureSolver< SinglePhasePoromechanics<> > > HydrofractureInitialization; REGISTER_CATALOG_ENTRY( TaskBase, MultiphasePoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, MultiphaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsConformingFracturesInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsEmbeddedFracturesInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhaseReservoirPoromechanicsInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, HydrofractureInitialization, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index 22f971dcdb3..7d3933fdb1a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -24,6 +24,7 @@ namespace geos { +class SolidMechanicsStatistics; /** * @class PoromechanicsInitialization @@ -53,7 +54,10 @@ class PoromechanicsInitialization : public TaskBase ~PoromechanicsInitialization() override; /// Accessor for the catalog name - static string catalogName(); + static string catalogName() + { + return POROMECHANICS_SOLVER::catalogName() + "Initialization"; + } /** * @defgroup Tasks Interface Functions @@ -80,21 +84,25 @@ class PoromechanicsInitialization : public TaskBase { /// String for the poromechanics solver name constexpr static char const * poromechanicsSolverNameString() { return "poromechanicsSolverName"; } - /// String for the solver configuration - constexpr static char const * performStressInitializationString() { return "performStressInitialization"; } + /// String for the solid mechanics statistics name + constexpr static char const * solidMechanicsStatisticsNameString() { return "solidMechanicsStatisticsName"; } }; - void postProcessInput() override; +// void registerDataOnMesh( Group & meshBodies ) override; + /// Name of the poromechanics solver string m_poromechanicsSolverName; - /// Pointer to the multiphase poromechanics solver + /// Name of the solid mechanics statistics + string m_solidMechanicsStatisticsName; + + /// Pointer to the poromechanics solver POROMECHANICS_SOLVER * m_poromechanicsSolver; - /// Flag to indicate that the solver is going to perform stress initialization - integer m_performStressInitialization; + /// Pointer to the solid mechanics statistics + SolidMechanicsStatistics * m_solidMechanicsStatistics; SolidMechanicsStateReset m_solidMechanicsStateResetTask; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index d4b3505373a..5f3c6a913a1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -20,17 +20,39 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSSOLVER_HPP_ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSSOLVER_HPP_ +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/multiphysics/CoupledSolver.hpp" #include "physicsSolvers/multiphysics/PoromechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/utilities/AverageOverQuadraturePointsKernel.hpp" #include "codingUtilities/Utilities.hpp" namespace geos { +namespace stabilization +{ +enum class StabilizationType : integer +{ + None, + Global, + Local, +}; + +ENUM_STRINGS( StabilizationType, + "None", + "Global", + "Local" ); +} + +using namespace stabilization; +using namespace fields; +using namespace constitutive; +using namespace dataRepository; + template< typename FLOW_SOLVER, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER > { @@ -71,6 +93,23 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER setApplyDefaultValue( false ). setInputFlag( dataRepository::InputFlags::FALSE ). setDescription( "Flag to indicate that the solver is going to perform stress initialization" ); + + this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "StabilizationType. Options are:\n" + + toString( StabilizationType::None ) + "- Add no stabilization to mass equation \n" + + toString( StabilizationType::Global ) + "- Add jump stabilization to all faces \n" + + toString( StabilizationType::Local ) + "- Add jump stabilization on interior of macro elements" ); + + this->registerWrapper( viewKeyStruct::stabilizationRegionNamesString(), &m_stabilizationRegionNames ). + setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Regions where stabilization is applied." ); + + this->registerWrapper( viewKeyStruct::stabilizationMultiplierString(), &m_stabilizationMultiplier ). + setApplyDefaultValue( 1.0 ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Constant multiplier of stabilization strength" ); } virtual void initializePostInitialConditionsPreSubGroups() override @@ -87,6 +126,11 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { Base::initializePreSubGroups(); + GEOS_THROW_IF( m_stabilizationType == StabilizationType::Local, + this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << + ": Local stabilization has been temporarily disabled", + InputError ); + DomainPartition & domain = this->template getGroupByPath< DomainPartition >( "/Problem/domain" ); this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -109,7 +153,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER porosityModelName = this->template getConstitutiveName< constitutive::PorosityBase >( subRegion ); GEOS_THROW_IF( porosityModelName.empty(), GEOS_FMT( "{} {} : Porosity model not found on subregion {}", - this->catalogName(), this->getDataContext().toString(), subRegion.getName() ), + this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), InputError ); if( subRegion.hasField< fields::poromechanics::bulkDensity >() ) @@ -134,6 +178,11 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER flowSolver()->enableFixedStressPoromechanicsUpdate(); } + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + flowSolver()->enableJumpStabilization(); + } + SolverBase::forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -161,6 +210,12 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER // ideally we would resize it here as well, but the solid model name is not available yet (see below) subRegion.registerField< fields::poromechanics::bulkDensity >( this->getName() ); } + + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + subRegion.registerField< fields::flow::macroElementIndex >( this->getName()); + subRegion.registerField< fields::flow::elementStabConstant >( this->getName()); + } } ); } ); } @@ -169,7 +224,13 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER real64 const & dt, DomainPartition & domain ) override { - flowSolver()->keepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); + flowSolver()->setKeepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); + + if( this->m_stabilizationType == StabilizationType::Global || this->m_stabilizationType == StabilizationType::Local ) + { + this->updateStabilizationParameters( domain ); + } + Base::implicitStepSetup( time_n, dt, domain ); } @@ -181,10 +242,28 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER // that's the reason why this function is here and not in CoupledSolvers.hpp solidMechanicsSolver()->setupDofs( domain, dofManager ); flowSolver()->setupDofs( domain, dofManager ); - this->setupCoupling( domain, dofManager ); } + virtual bool checkSequentialConvergence( int const & iter, + real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override + { + // always force outer loop for initialization + auto & subcycling = this->getNonlinearSolverParameters().m_subcyclingOption; + auto const subcycling_orig = subcycling; + if( m_performStressInitialization ) + subcycling = 1; + + bool isConverged = Base::checkSequentialConvergence( iter, time_n, dt, domain ); + + // restore original + subcycling = subcycling_orig; + + return isConverged; + } + /** * @brief accessor for the pointer to the solid mechanics solver * @return a pointer to the solid mechanics solver @@ -222,8 +301,79 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER /// Flag to indicate that the solver is going to perform stress initialization constexpr static char const * performStressInitializationString() { return "performStressInitialization"; } + + /// Type of pressure stabilization + constexpr static char const * stabilizationTypeString() {return "stabilizationType"; } + + /// Name of regions on which stabilization applied + constexpr static const char * stabilizationRegionNamesString() {return "stabilizationRegionNames"; } + + /// Multiplier on stabilization strength + constexpr static const char * stabilizationMultiplierString() {return "stabilizationMultiplier"; } }; + void updateStabilizationParameters( DomainPartition & domain ) const + { + // Step 1: we loop over the regions where stabilization is active and collect their name + set< string > regionFilter; + for( string const & regionName : m_stabilizationRegionNames ) + { + regionFilter.insert( regionName ); + } + + // Step 2: loop over target regions of solver, and tag the elements belonging to the stabilization regions + this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & targetRegionNames ) + { + //keep only target regions in filter + array1d< string > filteredTargetRegionNames; + filteredTargetRegionNames.reserve( targetRegionNames.size() ); + + for( string const & targetRegionName : targetRegionNames ) + { + if( regionFilter.count( targetRegionName ) ) + { + filteredTargetRegionNames.emplace_back( targetRegionName ); + } + } + + // Loop over elements and update stabilization constant + mesh.getElemManager().forElementSubRegions( filteredTargetRegionNames.toViewConst(), [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + arrayView1d< integer > const macroElementIndex = subRegion.getField< fields::flow::macroElementIndex >(); + arrayView1d< real64 > const elementStabConstant = subRegion.getField< fields::flow::elementStabConstant >(); + + geos::constitutive::CoupledSolidBase const & porousSolid = + this->template getConstitutiveModel< geos::constitutive::CoupledSolidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ) ); + + arrayView1d< real64 const > const bulkModulus = porousSolid.getBulkModulus(); + arrayView1d< real64 const > const shearModulus = porousSolid.getShearModulus(); + arrayView1d< real64 const > const biotCoefficient = porousSolid.getBiotCoefficient(); + + real64 const stabilizationMultiplier = m_stabilizationMultiplier; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [bulkModulus, + shearModulus, + biotCoefficient, + stabilizationMultiplier, + macroElementIndex, + elementStabConstant] GEOS_HOST_DEVICE ( localIndex const ei ) + + { + real64 const bM = bulkModulus[ei]; + real64 const sM = shearModulus[ei]; + real64 const bC = biotCoefficient[ei]; + + macroElementIndex[ei] = 1; + elementStabConstant[ei] = stabilizationMultiplier * 9.0 * (bC * bC) / (32.0 * (10.0 * sM / 3.0 + bM)); + } ); + } ); + } ); + + } + protected: /* Implementation of Nonlinear Acceleration (Aitken) of averageMeanTotalStressIncrement */ @@ -369,7 +519,8 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER } /// After the solid mechanics solver - if( solverType == static_cast< integer >( SolverType::SolidMechanics ) ) + if( solverType == static_cast< integer >( SolverType::SolidMechanics ) + && !m_performStressInitialization ) // do not update during poromechanics initialization { // compute the average of the mean total stress increment over quadrature points averageMeanTotalStressIncrement( domain ); @@ -460,6 +611,15 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER /// Flag to indicate that the solver is going to perform stress initialization integer m_performStressInitialization; + /// Type of stabilization used + stabilization::StabilizationType m_stabilizationType; + + /// Names of regions where stabilization applied + array1d< string > m_stabilizationRegionNames; + + /// Stabilization Multiplier + real64 m_stabilizationMultiplier; + /// Member variables needed for Nonlinear Acceleration ( Aitken ). Naming convention follows ( Jiang & Tchelepi, 2019 ) array1d< real64 > m_s0; // Accelerated averageMeanTotalStresIncrement @ outer iteration v ( two iterations ago ) array1d< real64 > m_s1; // Accelerated averageMeanTotalStresIncrement @ outer iteration v + 1 ( previous iteration ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index d21eef612ae..ea86367a721 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -24,8 +24,6 @@ #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -41,36 +39,6 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename FLOW_SOLVER > class - SinglePhaseCatalogNames {}; - -// Class specialization for a FLOW_SOLVER set to SinglePhaseFlow -template<> class SinglePhaseCatalogNames< SinglePhaseBase > -{ -public: - static string name() { return "SinglePhasePoromechanics"; } -}; -// Class specialization for a FLOW_SOLVER set to SinglePhaseReservoirAndWells -template<> class SinglePhaseCatalogNames< SinglePhaseReservoirAndWells< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhaseReservoirAndWells< SinglePhaseBase >::catalogName() + "Poromechanics"; } -}; -} - -// provide a definition for catalogName() -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -string -SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >:: -catalogName() -{ - return SinglePhaseCatalogNames< FLOW_SOLVER >::name(); -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechanics( const string & name, Group * const parent ) @@ -88,7 +56,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput { Base::postProcessInput(); - GEOS_ERROR_IF( this->flowSolver()->catalogName() == "SinglePhaseReservoir" && + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "SinglePhaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", this->getName(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), @@ -177,11 +145,22 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( localRhs ); // Step 3: compute the fluxes (face-based contributions) - this->flowSolver()->assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + this->flowSolver()->assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + this->flowSolver()->assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } @@ -223,6 +202,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB localRhs, dt, flowDofKey, + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else @@ -237,6 +217,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB localRhs, dt, flowDofKey, + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); @@ -276,6 +257,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB dt ); } ); + this->solidMechanicsSolver()->applyContactConstraint( dofManager, domain, localMatrix, localRhs ); this->solidMechanicsSolver()->getMaxForce() = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } @@ -351,16 +333,18 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensit subRegion ); } -template class SinglePhasePoromechanics< SinglePhaseBase >; +template class SinglePhasePoromechanics<>; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact >; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures >; -template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > >; +template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> >; +//template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangeContact >; +//template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsEmbeddedFractures >; namespace { -typedef SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > SinglePhaseReservoirPoromechanics; +typedef SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > SinglePhaseReservoirPoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanics, string const &, Group * const ) -typedef SinglePhasePoromechanics< SinglePhaseBase > SinglePhasePoromechanics; +typedef SinglePhasePoromechanics<> SinglePhasePoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanics, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 58077a81cfe..21cc282a1dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -20,12 +20,13 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASEPOROMECHANICS_HPP_ #include "physicsSolvers/multiphysics/PoromechanicsSolver.hpp" - +#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" namespace geos { -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > +template< typename FLOW_SOLVER = SinglePhaseBase, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER > { public: @@ -36,6 +37,9 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN using Base::m_localMatrix; using Base::m_rhs; using Base::m_solution; + using Base::m_stabilizationType; + using Base::m_stabilizationRegionNames; + using Base::m_stabilizationMultiplier; /** * @brief main constructor for SinglePhasePoromechanics objects @@ -52,7 +56,18 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new SinglePhasePoromechanics object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, SinglePhaseBase > ) // special case + { + return "SinglePhasePoromechanics"; + } + else // default + { + return FLOW_SOLVER::catalogName() + "Poromechanics"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 86d04ed2cf1..fbec79f454b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -23,6 +23,7 @@ #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +//#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp" @@ -36,19 +37,21 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; -SinglePhasePoromechanicsConformingFractures::SinglePhasePoromechanicsConformingFractures( const string & name, - Group * const parent ) +template< typename FLOW_SOLVER > +SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::SinglePhasePoromechanicsConformingFractures( const string & name, + Group * const parent ) : Base( name, parent ) { - LinearSolverParameters & params = m_linearSolverParameters.get(); + LinearSolverParameters & params = this->m_linearSolverParameters.get(); params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsConformingFractures; params.mgr.separateComponents = false; params.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); params.dofsPerNode = 3; } -void SinglePhasePoromechanicsConformingFractures::setupCoupling( DomainPartition const & domain, - DofManager & dofManager ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupCoupling( DomainPartition const & domain, + DofManager & dofManager ) const { /// We need to add 2 coupling terms: // 1. Poromechanical coupling in the bulk @@ -60,22 +63,13 @@ void SinglePhasePoromechanicsConformingFractures::setupCoupling( DomainPartition DofManager::Connector::Elem ); } -bool SinglePhasePoromechanicsConformingFractures::updateConfiguration( DomainPartition & domain ) -{ - return solidMechanicsSolver()->updateConfiguration( domain ); -} - -bool SinglePhasePoromechanicsConformingFractures::resetConfigurationToDefault( DomainPartition & domain ) const -{ - return solidMechanicsSolver()->resetConfigurationToDefault( domain ); -} - -void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & domain, - DofManager & dofManager, - CRSMatrix< real64, globalIndex > & localMatrix, - ParallelVector & rhs, - ParallelVector & solution, - bool const setSparsity ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity ) { GEOS_MARK_FUNCTION; @@ -83,10 +77,10 @@ void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & /// 1. Add all coupling terms handled directly by the DofManager dofManager.setDomain( domain ); - setupDofs( domain, dofManager ); + this->setupDofs( domain, dofManager ); dofManager.reorderByRank(); - if( getLogLevel() > 2 ) + if( this->getLogLevel() > 2 ) { dofManager.printFieldInfo(); } @@ -140,19 +134,18 @@ void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & // } } -void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleSystem( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - solidMechanicsSolver()->synchronizeFractureState( domain ); - - synchronizeNonLinearParameters(); + this->solidMechanicsSolver()->synchronizeFractureState( domain ); assembleElementBasedContributions( time_n, dt, @@ -162,13 +155,13 @@ void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const t localRhs ); // Assemble fluxes 3D/2D and get dFluidResidualDAperture - flowSolver()->assembleHydrofracFluxTerms( time_n, - dt, - domain, - dofManager, - localMatrix, - localRhs, - getDerivativeFluxResidual_dNormalJump() ); + this->flowSolver()->assembleHydrofracFluxTerms( time_n, + dt, + domain, + dofManager, + localMatrix, + localRhs, + getDerivativeFluxResidual_dNormalJump() ); // This step must occur after the fluxes are assembled because that's when DerivativeFluxResidual_dAperture is filled. assembleCouplingTerms( time_n, @@ -179,49 +172,48 @@ void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const t localRhs ); } -void SinglePhasePoromechanicsConformingFractures::assembleElementBasedContributions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleElementBasedContributions( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n, dt ); /// 3. assemble Force Residual w.r.t. pressure and Flow mass residual w.r.t. displacement Base::assembleElementBasedTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); - this->solidMechanicsSolver()->getMaxForce() = 0.0; - /// TODO: this is to be consistent with old version but it should be changed. We likely want to scale the residual for contact the same - /// way we scale the mechanics one. // Flow accumulation for fractures - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, FaceElementSubRegion const & subRegion ) { - flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); + this->flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } ); } ); - solidMechanicsSolver()->assembleContact( domain, dofManager, localMatrix, localRhs ); + this->solidMechanicsSolver()->assembleContact( domain, dofManager, localMatrix, localRhs ); } -void SinglePhasePoromechanicsConformingFractures::assembleCouplingTerms( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleCouplingTerms( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n, dt ); // These 2 steps need to occur after the fluxes are assembled because that's when DerivativeFluxResidual_dAperture is filled. - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) { /// 3. assemble Force Residual w.r.t. pressure and Flow mass residual w.r.t. displacement assembleForceResidualDerivativeWrtPressure( mesh, regionNames, dofManager, localMatrix, localRhs ); @@ -229,14 +221,15 @@ void SinglePhasePoromechanicsConformingFractures::assembleCouplingTerms( real64 } ); } -void SinglePhasePoromechanicsConformingFractures:: - setUpDflux_dApertureMatrix( DomainPartition & domain, - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - CRSMatrix< real64, globalIndex > & localMatrix ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +setUpDflux_dApertureMatrix( DomainPartition & domain, + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + CRSMatrix< real64, globalIndex > & localMatrix ) { - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) { std::unique_ptr< CRSMatrix< real64, localIndex > > & derivativeFluxResidual_dAperture = this->getRefDerivativeFluxResidual_dAperture(); @@ -267,7 +260,7 @@ void SinglePhasePoromechanicsConformingFractures:: NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( flowSolver()->getDiscretizationName() ); + FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( this->flowSolver()->getDiscretizationName() ); fluxApprox.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { @@ -288,16 +281,17 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - addTransmissibilityCouplingNNZ( DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< localIndex > const & rowLengths ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +addTransmissibilityCouplingNNZ( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< localIndex > const & rowLengths ) const { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, // meshBodyName, - MeshLevel const & mesh, - arrayView1d< string const > const & ) // regionNames + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, // meshBodyName, + MeshLevel const & mesh, + arrayView1d< string const > const & ) // regionNames { ElementRegionManager const & elemManager = mesh.getElemManager(); @@ -307,7 +301,7 @@ void SinglePhasePoromechanicsConformingFractures:: NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( solidMechanicsSolver()->getStabilizationName() ); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( this->solidMechanicsSolver()->getStabilizationName() ); stabilizationMethod.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { @@ -350,16 +344,17 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - addTransmissibilityCouplingPattern( DomainPartition const & domain, - DofManager const & dofManager, - SparsityPatternView< globalIndex > const & pattern ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +addTransmissibilityCouplingPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & ) { FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); @@ -375,15 +370,15 @@ void SinglePhasePoromechanicsConformingFractures:: // Get the finite volume method used to compute the stabilization NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( solidMechanicsSolver()->getStabilizationName() ); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( this->solidMechanicsSolver()->getStabilizationName() ); SurfaceElementRegion const & fractureRegion = - elemManager.getRegion< SurfaceElementRegion >( solidMechanicsSolver()->getUniqueFractureRegionName() ); + elemManager.getRegion< SurfaceElementRegion >( this->solidMechanicsSolver()->getUniqueFractureRegionName() ); FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); GEOS_ERROR_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), - getDataContext() << ": The fracture subregion must contain pressure field." ); + this->getDataContext() << ": The fracture subregion must contain pressure field." ); ArrayOfArraysView< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); @@ -445,12 +440,13 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, - arrayView1d< string const > const & regionNames, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -505,7 +501,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; array1d< real64 > globalNodalForce( 3 ); @@ -540,12 +536,13 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, - arrayView1d< string const > const & regionNames, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) { GEOS_MARK_FUNCTION; @@ -575,7 +572,7 @@ void SinglePhasePoromechanicsConformingFractures:: { string const & fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); - SingleFluidBase const & fluid = getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); + SingleFluidBase const & fluid = this->template getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); arrayView2d< real64 const > const & density = fluid.density(); arrayView1d< globalIndex const > const & presDofNumber = subRegion.getReference< array1d< globalIndex > >( presDofKey ); @@ -610,7 +607,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); // TODO: move to something like this plus a static method. // localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][kf] ); @@ -661,7 +658,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe2][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe2][kf], nodalArea ); for( localIndex a=0; a +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; // call base poromechanics update Base::updateState( domain ); // need to call solid mechanics update separately to compute face displacement jump - solidMechanicsSolver()->updateState( domain ); + this->solidMechanicsSolver()->updateState( domain ); // remove the contribution of the hydraulic aperture from the stencil weights - flowSolver()->prepareStencilWeights( domain ); + this->flowSolver()->prepareStencilWeights( domain ); updateHydraulicApertureAndFracturePermeability( domain ); // update the stencil weights using the updated hydraulic aperture - flowSolver()->updateStencilWeights( domain ); + this->flowSolver()->updateStencilWeights( domain ); } -void SinglePhasePoromechanicsConformingFractures::updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ) { - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { ElementRegionManager & elemManager = mesh.getElemManager(); @@ -761,12 +760,16 @@ void SinglePhasePoromechanicsConformingFractures::updateHydraulicApertureAndFrac } ); } +template class SinglePhasePoromechanicsConformingFractures<>; +//template class SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> >; -void SinglePhasePoromechanicsConformingFractures::outputConfigurationStatistics( DomainPartition const & domain ) const +namespace { - solidMechanicsSolver()->outputConfigurationStatistics( domain ); -} - +//typedef SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > +// SinglePhaseReservoirPoromechanicsConformingFractures; +//REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) +typedef SinglePhasePoromechanicsConformingFractures<> SinglePhasePoromechanicsConformingFractures; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) +} } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 06ed8c35d55..8008e8b5f82 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -23,15 +23,17 @@ #include "physicsSolvers/multiphysics/CoupledSolver.hpp" #include "physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "dataRepository/Group.hpp" namespace geos { -class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact > +template< typename FLOW_SOLVER = SinglePhaseBase > +class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechanics< FLOW_SOLVER, SolidMechanicsLagrangeContact > { public: - using Base = SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact >; + using Base = SinglePhasePoromechanics< FLOW_SOLVER, SolidMechanicsLagrangeContact >; using Base::m_solvers; using Base::m_dofManager; using Base::m_localMatrix; @@ -47,7 +49,7 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan * @param parent the parent group of this instantiation of SinglePhasePoromechanicsConformingFractures */ SinglePhasePoromechanicsConformingFractures( const string & name, - Group * const parent ); + dataRepository::Group * const parent ); /// Destructor for the class ~SinglePhasePoromechanicsConformingFractures() override {} @@ -57,7 +59,18 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan * @return string that contains the catalog name to generate a new SinglePhasePoromechanicsConformingFractures object through the object * catalog. */ - static string catalogName() { return "SinglePhasePoromechanicsConformingFractures"; } + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, SinglePhaseBase > ) + { + return "SinglePhasePoromechanicsConformingFractures"; + } + else + { + return FLOW_SOLVER::catalogName() + "PoromechanicsConformingFractures"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ @@ -89,12 +102,6 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan virtual void updateState( DomainPartition & domain ) override final; - bool resetConfigurationToDefault( DomainPartition & domain ) const override final; - - bool updateConfiguration( DomainPartition & domain ) override final; - - void outputConfigurationStatistics( DomainPartition const & domain ) const override final; - /**@}*/ private: diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 5d890ad3003..74413953f66 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -50,9 +50,19 @@ SinglePhasePoromechanicsEmbeddedFractures::SinglePhasePoromechanicsEmbeddedFract SinglePhasePoromechanicsEmbeddedFractures::~SinglePhasePoromechanicsEmbeddedFractures() {} +void SinglePhasePoromechanicsEmbeddedFractures::postProcessInput() +{ + Base::postProcessInput(); + + GEOS_ERROR_IF( solidMechanicsSolver()->useStaticCondensation(), + GEOS_FMT( "{}: {} = 1 in {} solver named {} is not supported for {}", + this->getName(), SolidMechanicsEmbeddedFractures::viewKeyStruct::useStaticCondensationString(), + solidMechanicsSolver()->getCatalogName(), solidMechanicsSolver()->getName(), getCatalogName() )); +} + void SinglePhasePoromechanicsEmbeddedFractures::registerDataOnMesh( dataRepository::Group & meshBodies ) { - SinglePhasePoromechanics::registerDataOnMesh( meshBodies ); + Base::registerDataOnMesh( meshBodies ); forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, @@ -69,7 +79,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::registerDataOnMesh( dataReposito void SinglePhasePoromechanicsEmbeddedFractures::initializePostInitialConditionsPreSubGroups() { - SinglePhasePoromechanics::initializePostInitialConditionsPreSubGroups(); + Base::initializePostInitialConditionsPreSubGroups(); updateState( this->getGroupByPath< DomainPartition >( "/Problem/domain" ) ); } @@ -406,7 +416,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim thermoPoromechanicsEFEMKernels::ThermalSinglePhasePoromechanicsEFEMKernelFactory >( mesh, dofManager, regionNames, - SinglePhasePoromechanics::viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt ); @@ -419,7 +429,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim poromechanicsEFEMKernels::SinglePhaseKernelFactory >( mesh, dofManager, regionNames, - SinglePhasePoromechanics::viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt ); @@ -438,84 +448,12 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim } -void SinglePhasePoromechanicsEmbeddedFractures::applyBoundaryConditions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - solidMechanicsSolver()->applyBoundaryConditions( time_n, dt, - domain, - dofManager, - localMatrix, - localRhs ); - - flowSolver()->applyBoundaryConditions( time_n, dt, - domain, - dofManager, - localMatrix, - localRhs ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) -{ - flowSolver()->implicitStepSetup( time_n, dt, domain ); - solidMechanicsSolver()->implicitStepSetup( time_n, dt, domain ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::implicitStepComplete( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) -{ - solidMechanicsSolver()->implicitStepComplete( time_n, dt, domain ); - flowSolver()->implicitStepComplete( time_n, dt, domain ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::resetStateToBeginningOfStep( DomainPartition & domain ) -{ - flowSolver()->resetStateToBeginningOfStep( domain ); - solidMechanicsSolver()->resetStateToBeginningOfStep( domain ); -} - - -real64 SinglePhasePoromechanicsEmbeddedFractures::calculateResidualNorm( real64 const & time_n, - real64 const & dt, - DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< real64 const > const & localRhs ) -{ - // compute norm of momentum balance residual equations - real64 const momentumResidualNorm = solidMechanicsSolver()->calculateResidualNorm( time_n, dt, domain, dofManager, localRhs ); - - // compute norm of mass balance residual equations - real64 const massResidualNorm = flowSolver()->calculateResidualNorm( time_n, dt, domain, dofManager, localRhs ); - - real64 const residual = sqrt( momentumResidualNorm * momentumResidualNorm + massResidualNorm * massResidualNorm ); - - return residual; -} - -void SinglePhasePoromechanicsEmbeddedFractures::applySystemSolution( DofManager const & dofManager, - arrayView1d< real64 const > const & localSolution, - real64 const scalingFactor, - real64 const dt, - DomainPartition & domain ) -{ - // update displacement and jump - solidMechanicsSolver()->applySystemSolution( dofManager, localSolution, scalingFactor, dt, domain ); - // update pressure field - flowSolver()->applySystemSolution( dofManager, localSolution, scalingFactor, dt, domain ); -} - void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; /// 1. update the reservoir - SinglePhasePoromechanics::updateState( domain ); + Base::updateState( domain ); // remove the contribution of the hydraulic aperture from the stencil weights flowSolver()->prepareStencilWeights( domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index e34b3289a7a..f33efce4a10 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -29,6 +29,9 @@ namespace geos class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures > { public: + + using Base = SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures >; + SinglePhasePoromechanicsEmbeddedFractures( const std::string & name, Group * const parent ); ~SinglePhasePoromechanicsEmbeddedFractures() override; @@ -38,7 +41,7 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic * @return string that contains the catalog name to generate a new SinglePhasePoromechanicsEmbeddedFractures object through the object * catalog. */ - static string catalogName() { return "SinglePhasePoromechanicsEmbeddedFractures"; } + static string catalogName() { return Base::catalogName() + "EmbeddedFractures"; } /** * @copydoc SolverBase::getCatalogName() */ @@ -57,11 +60,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic setupDofs( DomainPartition const & domain, DofManager & dofManager ) const override; - virtual void - implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) override final; - virtual void assembleSystem( real64 const time, real64 const dt, @@ -70,36 +68,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - virtual void - applyBoundaryConditions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - - virtual real64 - calculateResidualNorm( real64 const & time_n, - real64 const & dt, - DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< real64 const > const & localRhs ) override; - - virtual void - applySystemSolution( DofManager const & dofManager, - arrayView1d< real64 const > const & localSolution, - real64 const scalingFactor, - real64 const dt, - DomainPartition & domain ) override; - - virtual void - implicitStepComplete( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) override final; - - virtual void - resetStateToBeginningOfStep( DomainPartition & domain ) override; - /** * @Brief add extra nnz to each row induced by the coupling * @param domain the physical domain object @@ -132,6 +100,8 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic protected: + virtual void postProcessInput() override final; + virtual void initializePostInitialConditionsPreSubGroups() override final; private: @@ -185,6 +155,7 @@ real64 SinglePhasePoromechanicsEmbeddedFractures::assemblyLaunch( MeshLevel & me dt, gravityVectorData, flowDofKey, + m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); real64 const maxForce = diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 871982d3787..1fce8ac29e9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -26,6 +26,7 @@ #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" namespace geos { @@ -33,60 +34,29 @@ namespace geos using namespace dataRepository; using namespace constitutive; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename SINGLEPHASE_RESERVOIR_SOLVER > class - SinglePhaseCatalogNames {}; - -// Class specialization for a RESERVOIR_SOLVER set to SinglePhaseFlow -template<> class SinglePhaseCatalogNames< SinglePhaseBase > -{ -public: - // TODO: find a way to use the catalog name here - static string name() { return "SinglePhaseReservoir"; } -}; -// Class specialization for a RESERVOIR_SOLVER set to SinglePhasePoromechanics -template<> class SinglePhaseCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseBase >::catalogName()+"Reservoir"; } -}; -} - -// provide a definition for catalogName() -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -string -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: -catalogName() -{ - return SinglePhaseCatalogNames< SINGLEPHASE_RESERVOIR_SOLVER >::name(); -} - -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: SinglePhaseReservoirAndWells( const string & name, Group * const parent ) : Base( name, parent ) {} -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: ~SinglePhaseReservoirAndWells() {} template<> SinglePhaseBase * -SinglePhaseReservoirAndWells< SinglePhaseBase >:: +SinglePhaseReservoirAndWells<>:: flowSolver() const { return this->reservoirSolver(); } -template<> +template< typename POROMECHANICS_SOLVER > SinglePhaseBase * -SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >:: +SinglePhaseReservoirAndWells< POROMECHANICS_SOLVER >:: flowSolver() const { return this->reservoirSolver()->flowSolver(); @@ -94,37 +64,41 @@ flowSolver() const template<> void -SinglePhaseReservoirAndWells< SinglePhaseBase >:: +SinglePhaseReservoirAndWells<>:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM ) + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM; } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM; } } -template<> +template< typename POROMECHANICS_SOLVER > void -SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >:: +SinglePhaseReservoirAndWells< POROMECHANICS_SOLVER >:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM ) + // flow solver here is indeed flow solver, not poromechanics solver + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) { - GEOS_LOG_RANK_0( "The MGR strategy for hybrid FVM is not implemented" ); + GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsReservoirFVM; } } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePreSubGroups() { Base::initializePreSubGroups(); @@ -132,18 +106,18 @@ initializePreSubGroups() Base::wellSolver()->setFlowSolverName( flowSolver->getName() ); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); setMGRStrategy(); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: addCouplingSparsityPattern( DomainPartition const & domain, DofManager const & dofManager, SparsityPatternView< globalIndex > const & pattern ) const @@ -234,9 +208,9 @@ addCouplingSparsityPattern( DomainPartition const & domain, } ); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: assembleCouplingTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, @@ -367,15 +341,18 @@ assembleCouplingTerms( real64 const time_n, } -template class SinglePhaseReservoirAndWells< SinglePhaseBase >; -template class SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >; +template class SinglePhaseReservoirAndWells<>; +template class SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> >; +template class SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingFractures<> >; namespace { -typedef SinglePhaseReservoirAndWells< SinglePhaseBase > SinglePhaseFlowAndWells; -typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhasePoromechanicsAndWells; +typedef SinglePhaseReservoirAndWells<> SinglePhaseFlowAndWells; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFlowAndWells, string const &, Group * const ) +typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> > SinglePhasePoromechanicsAndWells; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsAndWells, string const &, Group * const ) +typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesAndWells; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFracturesAndWells, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 04891c91dd3..ca86c257f7b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -26,13 +26,14 @@ namespace geos { -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLEPHASE_RESERVOIR_SOLVER, +/// @tparam RESERVOIR_SOLVER single-phase flow or single-phase poromechanics solver +template< typename RESERVOIR_SOLVER = SinglePhaseBase > +class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, SinglePhaseWell > { public: - using Base = CoupledReservoirAndWellsBase< SINGLEPHASE_RESERVOIR_SOLVER, + using Base = CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, SinglePhaseWell >; using Base::m_solvers; using Base::m_linearSolverParameters; @@ -54,7 +55,18 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLE * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr (std::is_same_v< RESERVOIR_SOLVER, SinglePhaseBase > ) // special case + { + return "SinglePhaseReservoir"; + } + else // default + { + return RESERVOIR_SOLVER::catalogName() + "Reservoir"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ @@ -72,28 +84,26 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLE arrayView1d< real64 > const & localRhs ) override; void - assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - - void updateFluidState( ObjectManagerBase & subRegion ) const - { flowSolver()->updateFluidState( subRegion ); } - void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const - { flowSolver()->updatePorosityAndPermeability( subRegion ); } - void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const - { flowSolver()->updateSolidInternalEnergyModel( dataGroup ); } - - integer & isThermal() { return flowSolver()->isThermal(); } - - void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - - virtual void saveSequentialIterationState( DomainPartition & domain ) override { flowSolver()->saveSequentialIterationState( domain ); } + assembleHydrofracFluxTerms( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, localIndex const > const & dR_dAper ) + { flowSolver()->assembleHydrofracFluxTerms( time_n, dt, domain, dofManager, localMatrix, localRhs, dR_dAper ); } + + template< typename SUBREGION_TYPE > + void accumulationAssemblyLaunch( DofManager const & dofManager, + SUBREGION_TYPE const & subRegion, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } + + void prepareStencilWeights( DomainPartition & domain ) const + { flowSolver()->prepareStencilWeights( domain ); } + void updateStencilWeights( DomainPartition & domain ) const + { flowSolver()->updateStencilWeights( domain ); } protected: diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index 0367fb42b67..c6dabc3a35a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -102,6 +102,7 @@ class MultiphasePoromechanics : localIndex const numPhases, integer const useSimpleAccumulation, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -354,6 +355,8 @@ class MultiphasePoromechanics : /// Use total mass equation flag integer const m_useTotalMassEquation; + + integer const m_performStressInitialization; }; using MultiphasePoromechanicsKernelFactory = @@ -369,6 +372,7 @@ using MultiphasePoromechanicsKernelFactory = localIndex const, integer const, integer const, + integer const, string const >; /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index 51645867ddc..b7104c38fb8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -54,6 +54,7 @@ MultiphasePoromechanics( NodeManager const & nodeManager, localIndex const numPhases, integer const useSimpleAccumulation, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -79,7 +80,8 @@ MultiphasePoromechanics( NodeManager const & nodeManager, m_numComponents( numComponents ), m_numPhases( numPhases ), m_useSimpleAccumulation( useSimpleAccumulation ), - m_useTotalMassEquation( useTotalMassEquation ) + m_useTotalMassEquation( useTotalMassEquation ), + m_performStressInitialization( performStressInitialization ) { GEOS_ERROR_IF_GT_MSG( m_numComponents, maxNumComponents, "MultiphasePoromechanics solver allows at most " << @@ -162,6 +164,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp index 08b9c07e5d7..f8902f25f4e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp @@ -94,6 +94,7 @@ class SinglePhasePoromechanics : real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -257,6 +258,7 @@ class SinglePhasePoromechanics : /// Derivative of fluid density wrt pressure arrayView2d< real64 const > const m_dFluidDensity_dPressure; + integer const m_performStressInitialization; }; using SinglePhasePoromechanicsKernelFactory = @@ -268,6 +270,7 @@ using SinglePhasePoromechanicsKernelFactory = real64 const, real64 const (&)[3], string const, + integer const, string const >; /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp index 023aeb08bff..e76c112220a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp @@ -50,6 +50,7 @@ SinglePhasePoromechanics( NodeManager const & nodeManager, real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -68,7 +69,8 @@ SinglePhasePoromechanics( NodeManager const & nodeManager, fluidModelKey ), m_fluidDensity( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).density() ), m_fluidDensity_n( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).density_n() ), - m_dFluidDensity_dPressure( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dPressure() ) + m_dFluidDensity_dPressure( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dPressure() ), + m_performStressInitialization( performStressInitialization ) {} template< typename SUBREGION_TYPE, @@ -100,6 +102,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp index 5c60e6820da..62833506841 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp @@ -76,6 +76,7 @@ class ThermalMultiphasePoromechanics : using Base::m_numComponents; using Base::m_numPhases; using Base::m_useTotalMassEquation; + using Base::m_performStressInitialization; using Base::m_solidDensity; using Base::m_fluidPhaseMassDensity; using Base::m_dFluidPhaseMassDensity; @@ -110,6 +111,7 @@ class ThermalMultiphasePoromechanics : localIndex const numComponents, localIndex const numPhases, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ); /** @@ -341,6 +343,7 @@ using ThermalMultiphasePoromechanicsKernelFactory = localIndex const, localIndex const, integer const, + integer const, string const >; } // namespace thermalporomechanicsKernels diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index 0c19141489f..fe18bd5f75c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -52,6 +52,7 @@ ThermalMultiphasePoromechanics( NodeManager const & nodeManager, localIndex const numComponents, localIndex const numPhases, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -71,6 +72,7 @@ ThermalMultiphasePoromechanics( NodeManager const & nodeManager, numPhases, false, // do not use simple accumulation form useTotalMassEquation, + performStressInitialization, fluidModelKey ), m_rockInternalEnergy_n( inputConstitutiveType.getInternalEnergy_n() ), m_rockInternalEnergy( inputConstitutiveType.getInternalEnergy() ), @@ -137,6 +139,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp index 5fe11040d59..178da2ea3bc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp @@ -70,6 +70,7 @@ class ThermalSinglePhasePoromechanics : using Base::m_solidDensity; using Base::m_flowDofNumber; using Base::m_dt; + using Base::m_performStressInitialization; /** * @brief Constructor @@ -90,6 +91,7 @@ class ThermalSinglePhasePoromechanics : real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -305,6 +307,7 @@ using ThermalSinglePhasePoromechanicsKernelFactory = real64 const, real64 const (&)[3], string const, + integer const, string const >; } // namespace thermalPoromechanicsKernels diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp index a3f3d4db3a9..76584fb52dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp @@ -46,6 +46,7 @@ ThermalSinglePhasePoromechanics( NodeManager const & nodeManager, real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -61,6 +62,7 @@ ThermalSinglePhasePoromechanics( NodeManager const & nodeManager, inputDt, gravityVector, inputFlowDofKey, + performStressInitialization, fluidModelKey ), m_dFluidDensity_dTemperature( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dTemperature() ), @@ -121,6 +123,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index b4feca82892..8e9cdf0438d 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -5,6 +5,7 @@ #include "PySolver.hpp" #include "dataRepository/python/PyGroupType.hpp" #include "PySolverType.hpp" +#include "mesh/DomainPartition.hpp" #define VERIFY_NON_NULL_SELF( self ) \ PYTHON_ERROR_IF( self == nullptr, PyExc_RuntimeError, "Passed a nullptr as self.", nullptr ) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 92faf16b5b5..b7e02bf0c41 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -1243,8 +1243,8 @@ SolidMechanicsLagrangianFEM:: MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); - real64 const residual = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first - // time-step when maxForce = 0; + real64 const residual = sqrt( globalResidualNorm[0] ) / ( globalResidualNorm[1] + 1 ); // the + 1 is for the first + // time-step when maxForce = 0; totalResidualNorm = std::max( residual, totalResidualNorm ); } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index d7bf9af216b..dc24a47e941 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -262,6 +262,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase } real64 & getMaxForce() { return m_maxForce; } + real64 const & getMaxForce() const { return m_maxForce; } arrayView1d< ParallelVector > const & getRigidBodyModes() const { diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 96179dd8a5c..f77dd4fd535 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -21,6 +21,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index ec97b4bc55d..855fb547a3f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -23,6 +23,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "fileIO/Outputs/OutputBase.hpp" +#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index 2c2b6dd8ae1..2d8775cb1ab 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -98,6 +98,11 @@ class EmbeddedSurfaceGenerator : public SolverBase virtual void initializePostInitialConditionsPreSubGroups() override final; + virtual void postRestartInitialization() override final + { + GEOS_ERROR( "Restarting is not supported for cases involving EmbeddedSurfaceGenerator" ); + } + private: void addToFractureStencil( DomainPartition & domain ); diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 42e8639eab7..7ba5b85c955 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -453,7 +453,7 @@ void SurfaceGenerator::postRestartInitialization() FluxApproximationBase * const fluxApprox = fvManager.getGroupPointer< FluxApproximationBase >( a ); if( fluxApprox!=nullptr ) { - fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName, false ); + fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName ); } } @@ -508,13 +508,11 @@ real64 SurfaceGenerator::solverStep( real64 const & time_n, FluxApproximationBase * const fluxApprox = fvManager.getGroupPointer< FluxApproximationBase >( a ); if( fluxApprox!=nullptr ) { - fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName, true ); + fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName ); } } FaceElementSubRegion & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - fractureSubRegion.m_recalculateConnectionsFor2dFaces.clear(); - fractureSubRegion.m_newFaceElements.clear(); // Recreate geometric sets meshLevel.getNodeManager().buildGeometricSets( GeometricObjectManager::getInstance() ); @@ -727,13 +725,11 @@ int SurfaceGenerator::separationDriver( DomainPartition & domain, localIndex const numNodesInFace = faceToNodeMap.sizeOfArray( faceMap[ kfe ][ 0 ] ); for( localIndex a = 0; a < numNodesInFace; ++a ) { - localIndex const aa = a < 2 ? a : numNodesInFace - a + 1; - localIndex const bb = aa == 0 ? aa : numNodesInFace - aa; // TODO HACK need to generalize to something other than quads //wu40: I temporarily make it work for tet mesh. Need further check with Randy. - nodeMap[ kfe ][ a ] = faceToNodeMap( faceMap[ kfe ][ 0 ], aa ); - nodeMap[ kfe ][ a + numNodesInFace ] = faceToNodeMap( faceMap[ kfe ][ 1 ], bb ); + nodeMap[ kfe ][ a ] = faceToNodeMap( faceMap[ kfe ][ 0 ], a ); + nodeMap[ kfe ][ a + numNodesInFace ] = faceToNodeMap( faceMap[ kfe ][ 1 ], a ); } if( numNodesInFace == 3 ) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp deleted file mode 100644 index 97eddf54faf..00000000000 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ /dev/null @@ -1,589 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file AcousticFirstOrderWaveEquationSEMKernel.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ -#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ - -#include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" - - - -namespace geos -{ - -/// Namespace to contain the first order acoustic wave kernels. -namespace acousticFirstOrderWaveEquationSEMKernels -{ - -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank rank of the ghost element - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal normal of each faces - * @param[in] faceCenter coordinates of the center of a face - * @param[in] sourceCoordinates coordinates of the source terms - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceElem element where a source is located - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstants constant part of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] rcvElem element where a receiver is located - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue value of the temporal source (eg. Ricker) - * @param[in] dt time-step - * @param[in] timeSourceFrequency the central frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder order of the Ricker wavelet - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const regionIndex, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView1d< localIndex > const sourceElem, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView1d< localIndex > const sourceRegion, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView1d< localIndex > const rcvElem, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView1d< localIndex > const receiverRegion, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - sourceIsAccessible[isrc] = 1; - sourceElem[isrc] = k; - sourceRegion[isrc] = regionIndex; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes[k][a]; - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - receiverIsLocal[ircv] = 1; - rcvElem[ircv] = k; - receiverRegion[ircv] = regionIndex; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes[k][a]; - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - - } ); - - } -}; - -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrix - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - - real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 > const damping ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const alpha = 1.0 / velocity[e]; - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - - - -template< typename FE_TYPE > -struct VelocityComputation -{ - - VelocityComputation( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of the velocity for one iteration - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] p_np1 pressure array (only used here) - * @param[in] dt time-step - * @param[out] velocity_x velocity array in the x direction (updated here) - * @param[out] velocity_y velocity array in the y direction (updated here) - * @param[out] velocity_z velocity array in the z direction (updated here) - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const p_np1, - arrayView1d< real32 const > const density, - real64 const dt, - arrayView2d< real32 > const velocity_x, - arrayView2d< real32 > const velocity_y, - arrayView2d< real32 > const velocity_z ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[8][3]; - for( localIndex a=0; a< 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - real32 uelemx[numNodesPerElem] = {0.0}; - real32 uelemy[numNodesPerElem] = {0.0}; - real32 uelemz[numNodesPerElem] = {0.0}; - real32 flowx[numNodesPerElem] = {0.0}; - real32 flowy[numNodesPerElem] = {0.0}; - real32 flowz[numNodesPerElem] = {0.0}; - - for( localIndex i = 0; i < numNodesPerElem; ++i ) - { - real32 massLoc = m_finiteElement.computeMassTerm( i, xLocal ); - uelemx[i] = massLoc*velocity_x[k][i]; - uelemy[i] = massLoc*velocity_y[k][i]; - uelemz[i] = massLoc*velocity_z[k][i]; - } - - for( localIndex q = 0; q < numNodesPerElem; q++ ) - { - - m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int i, int j, real32 dfx1, real32 dfx2, real32 dfx3 ) - { - flowx[j] += dfx1*p_np1[elemsToNodes[k][i]]; - flowy[j] += dfx2*p_np1[elemsToNodes[k][i]]; - flowz[j] += dfx3*p_np1[elemsToNodes[k][i]]; - } ); - - m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int i, int j, real32 dfy1, real32 dfy2, real32 dfy3 ) - { - flowx[j] += dfy1*p_np1[elemsToNodes[k][i]]; - flowy[j] += dfy2*p_np1[elemsToNodes[k][i]]; - flowz[j] += dfy3*p_np1[elemsToNodes[k][i]]; - } ); - - m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int i, int j, real32 dfz1, real32 dfz2, real32 dfz3 ) - { - flowx[j] += dfz1*p_np1[elemsToNodes[k][i]]; - flowy[j] += dfz2*p_np1[elemsToNodes[k][i]]; - flowz[j] += dfz3*p_np1[elemsToNodes[k][i]]; - - } ); - - } - for( localIndex i = 0; i < numNodesPerElem; ++i ) - { - real32 massLoc = m_finiteElement.computeMassTerm( i, xLocal ); - uelemx[i]+=dt*flowx[i]/density[k]; - uelemy[i]+=dt*flowy[i]/density[k]; - uelemz[i]+=dt*flowz[i]/density[k]; - - velocity_x[k][i] = uelemx[i]/massLoc; - velocity_y[k][i] = uelemy[i]/massLoc; - velocity_z[k][i] = uelemz[i]/massLoc; - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; -}; - -template< typename FE_TYPE > -struct PressureComputation -{ - - PressureComputation( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of the pressure for one iteration - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] regionIndex Index of the subregion - * @param[in] size_node the number of nodes in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[out] velocity_x velocity array in the x direction (only used here) - * @param[out] velocity_y velocity array in the y direction (only used here) - * @param[out] velocity_z velocity array in the z direction (only used here) - * @param[in] mass the mass matrix - * @param[in] damping the damping matrix - * @param[in] sourceConstants constant part of the source terms - * @param[in] sourceValue value of the temporal source (eg. Ricker) - * @param[in] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[in] sourceElem element where a source is located - * @param[in] cycleNumber the number of cycle - * @param[in] dt time-step - * @param[out] p_np1 pressure array (updated here) - */ - - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - localIndex const regionIndex, - localIndex const size_node, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView2d< real32 const > const velocity_x, - arrayView2d< real32 const > const velocity_y, - arrayView2d< real32 const > const velocity_z, - arrayView1d< real32 const > const mass, - arrayView1d< real32 const > const damping, - arrayView2d< real64 const > const sourceConstants, - arrayView2d< real32 const > const sourceValue, - arrayView1d< localIndex const > const sourceIsAccessible, - arrayView1d< localIndex const > const sourceElem, - arrayView1d< localIndex const > const sourceRegion, - real64 const dt, - integer const cycleNumber, - arrayView1d< real32 > const p_np1 ) - - { - - //Pre-mult by the first factor for damping - forAll< EXEC_POLICY >( size_node, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - p_np1[a] *= 1.0-((dt/2)*(damping[a]/mass[a])); - } ); - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[8][3]; - for( localIndex a=0; a< 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - real32 auxx[numNodesPerElem] = {0.0}; - real32 auyy[numNodesPerElem] = {0.0}; - real32 auzz[numNodesPerElem] = {0.0}; - real32 uelemx[numNodesPerElem] = {0.0}; - - - // Volume integration - for( localIndex q=0; q < numNodesPerElem; q++ ) - { - - - m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int i, int j, real32 dfx1, real32 dfx2, real32 dfx3 ) - { - auxx[i] -= dfx1*velocity_x[k][j]; - auyy[i] -= dfx2*velocity_y[k][j]; - auzz[i] -= dfx3*velocity_z[k][j]; - } ); - - m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int i, int j, real32 dfy1, real32 dfy2, real32 dfy3 ) - { - auxx[i] -= dfy1*velocity_x[k][j]; - auyy[i] -= dfy2*velocity_y[k][j]; - auzz[i] -= dfy3*velocity_z[k][j]; - } ); - - m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int i, int j, real32 dfz1, real32 dfz2, real32 dfz3 ) - { - auxx[i] -= dfz1*velocity_x[k][j]; - auyy[i] -= dfz2*velocity_y[k][j]; - auzz[i] -= dfz3*velocity_z[k][j]; - } ); - - - - } - - //Time update + multiplication by inverse of the mass matrix - for( localIndex i = 0; i < numNodesPerElem; ++i ) - { - real32 diag=(auxx[i]+auyy[i]+auzz[i]); - uelemx[i]+=dt*diag; - - real32 const localIncrement = uelemx[i]/mass[elemsToNodes[k][i]]; - RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[elemsToNodes[k][i]], localIncrement ); - } - - //Source Injection - for( localIndex isrc = 0; isrc < sourceConstants.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 1 ) - { - if( sourceElem[isrc]==k && sourceRegion[isrc] == regionIndex ) - { - for( localIndex i = 0; i < numNodesPerElem; ++i ) - { - real32 const localIncrement2 = dt*(sourceConstants[isrc][i]*sourceValue[cycleNumber][isrc])/(mass[elemsToNodes[k][i]]); - RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[elemsToNodes[k][i]], localIncrement2 ); - } - } - } - } - - } ); - - //Pre-mult by the first factor for damping - forAll< EXEC_POLICY >( size_node, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - p_np1[a] /= 1.0+((dt/2)*(damping[a]/mass[a])); - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -} // namespace AcousticFirstOrderWaveEquationSEMKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp deleted file mode 100644 index a0179b278d9..00000000000 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp +++ /dev/null @@ -1,864 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file AcousticWaveEquationSEMKernel.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ -#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ - -#include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" -#if !defined( GEOS_USE_HIP ) -#include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" -#endif -#include "AcousticFields.hpp" - -namespace geos -{ - -using namespace fields; - -/// Namespace to contain the acoustic wave kernels. -namespace acousticWaveEquationSEMKernels -{ - -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] facesToNodes map from faces to nodes - * @param[in] elemCenter coordinates of the element centers - * @param[in] sourceCoordinates coordinates of the source terms - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceNodeConstants constant part of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - sourceIsAccessible[isrc] = 1; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes( k, a ); - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - receiverIsLocal[ircv] = 1; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes( k, a ); - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - - } ); - - } -}; - -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const damping ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - real32 const alpha = 1.0 / (density[e] * velocity[e]); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -struct PMLKernelHelper -{ - /** - * @brief Compute the damping profile for the Perfectly Matched Layer (PML) - * @param xLocal a given x-y-z coordinates (3-components array) - * @param xMin coordinate limits of the inner PML boundaries, left-front-top - * @param xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param dMin PML thickness, left-front-top - * @param dMax PML thickness, right-back-bottom - * @param cMin PML wave speed, left-front-top - * @param cMax PML wave speed, right-back-bottom - * @param r desired reflectivity of the PML - * @param sigma 3-components array to hold the damping profile in each direction - */ - GEOS_HOST_DEVICE - inline - static void computeDampingProfilePML( real32 const (&xLocal)[3], - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 const (&dMin)[3], - real32 const (&dMax)[3], - real32 const (&cMin)[3], - real32 const (&cMax)[3], - real32 const r, - real32 (& sigma)[3] ) - { - - sigma[0] = 0; - sigma[1] = 0; - sigma[2] = 0; - - if( xLocal[0] < xMin[0] ) - { - real32 const factor = -3.0/2.0*cMin[0]*log( r )/(dMin[0]*dMin[0]*dMin[0]); - sigma[0] = factor*(xLocal[0]-xMin[0])*(xLocal[0]-xMin[0]); - } - else if( xLocal[0] > xMax[0] ) - { - real32 const factor = -3.0/2.0*cMax[0]*log( r )/(dMax[0]*dMax[0]*dMax[0]); - sigma[0] = factor*(xLocal[0]-xMax[0])*(xLocal[0]-xMax[0]); - } - if( xLocal[1] < xMin[1] ) - { - real32 const factor = -3.0/2.0*cMin[1]*log( r )/(dMin[1]*dMin[1]*dMin[1]); - sigma[1] = factor*(xLocal[1]-xMin[1])*(xLocal[1]-xMin[1]); - } - else if( xLocal[1] > xMax[1] ) - { - real32 const factor = -3.0/2.0*cMax[1]*log( r )/(dMax[1]*dMax[1]*dMax[1]); - sigma[1] = factor*(xLocal[1]-xMax[1])*(xLocal[1]-xMax[1]); - } - if( xLocal[2] < xMin[2] ) - { - real32 const factor = -3.0/2.0*cMin[2]*log( r )/(dMin[2]*dMin[2]*dMin[2]); - sigma[2] = factor*(xLocal[2]-xMin[2])*(xLocal[2]-xMin[2]); - } - else if( xLocal[2] > xMax[2] ) - { - real32 const factor = -3.0/2.0*cMax[2]*log( r )/(dMax[2]*dMax[2]*dMax[2]); - sigma[2] = factor*(xLocal[2]-xMax[2])*(xLocal[2]-xMax[2]); - } - } -}; - -template< typename FE_TYPE > -struct PMLKernel -{ - - PMLKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of field gradients and divergence for PML region - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] targetSet list of cells in the target set - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemToNodes constant array view of map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] p_n pressure field at time n - * @param[in] v_n PML auxiliary field at time n - * @param[in] u_n PML auxiliary field at time n - * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top - * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param[in] dMin PML thickness, left-front-top - * @param[in] dMax PML thickness, right-back-bottom - * @param[in] cMin PML wave speed, left-front-top - * @param[in] cMax PML wave speed, right-back-bottom - * @param[in] r desired reflectivity of the PML - * @param[out] grad_n array holding the gradients at time n - * @param[out] divV_n array holding the divergence at time n - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( SortedArrayView< localIndex const > const targetSet, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const p_n, - arrayView2d< real32 const > const v_n, - arrayView1d< real32 const > const u_n, - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 const (&dMin)[3], - real32 const (&dMax)[3], - real32 const (&cMin)[3], - real32 const (&cMax)[3], - real32 const r, - arrayView2d< real32 > const grad_n, - arrayView1d< real32 > const divV_n ) - { - /// Loop over elements in the subregion, 'l' is the element index within the target set - forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - /// global element index - localIndex const k = targetSet[l]; - - /// wave speed at the element - real32 const c = velocity[k]; - - /// coordinates of the element nodes - real64 xLocal[ numNodesPerElem ][ 3 ]; - real32 xLocal32[ numNodesPerElem ][ 3 ]; - - /// local arrays to store the pressure at all nodes and its gradient at a given node - real64 pressure[ numNodesPerElem ]; - real64 pressureGrad[ 3 ]; - - /// local arrays to store the PML vectorial auxiliary variable at all nodes and its gradient at a given node - real64 auxV[3][ numNodesPerElem ]; - real64 auxVGrad[3][3]; - - /// local arrays to store the PML scalar auxiliary variable at all nodes and its gradient at a given node - real64 auxU[ numNodesPerElem ]; - real64 auxUGrad[3]; - - /// local array to store the PML damping profile - real32 sigma[ 3 ]; - - /// copy from global to local arrays - for( localIndex i=0; i( k, i, xLocal, gradN ); - GEOS_UNUSED_VAR ( detJ ); - - /// compute the gradient of the pressure and the PML auxiliary variables at the node - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, pressure, pressureGrad ); - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxU, auxUGrad ); - for( int j=0; j<3; ++j ) - { - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxV[j], auxVGrad[j] ); - } - - /// compute the PML damping profile - PMLKernelHelper::computeDampingProfilePML( - xLocal32[i], - xMin, - xMax, - dMin, - dMax, - cMin, - cMax, - r, - sigma ); - - /// compute B.pressureGrad - C.auxUGrad where B and C are functions of the damping profile - /// WARNING: the division by 'numNodesPerElem' below is needed because the average of - /// gradient and divergence at the nodes are sought. It is the number of cells contributing - /// to each node that is needed. In this case, it is equal to 'numNodesPerElem'. For high-order - /// SEM, this approach won't work and the average needs to be computed differently (maybe using counters). - real32 localIncrementArray[3]; - localIncrementArray[0] = (sigma[0]-sigma[1]-sigma[2])*pressureGrad[0] - (sigma[1]*sigma[2])*auxUGrad[0]; - localIncrementArray[1] = (sigma[1]-sigma[0]-sigma[2])*pressureGrad[1] - (sigma[0]*sigma[2])*auxUGrad[1]; - localIncrementArray[2] = (sigma[2]-sigma[0]-sigma[1])*pressureGrad[2] - (sigma[0]*sigma[1])*auxUGrad[2]; - for( int j=0; j<3; ++j ) - { - RAJA::atomicAdd< ATOMIC_POLICY >( &grad_n[elemToNodes( k, i )][j], localIncrementArray[j]/numNodesPerElem ); - } - /// compute beta.pressure + gamma.u - c^2 * divV where beta and gamma are functions of the damping profile - real32 const beta = sigma[0]*sigma[1]+sigma[0]*sigma[2]+sigma[1]*sigma[2]; - real32 const gamma = sigma[0]*sigma[1]*sigma[2]; - real32 const localIncrement = beta*p_n[elemToNodes( k, i )] - + gamma*u_n[elemToNodes( k, i )] - - c*c*( auxVGrad[0][0] + auxVGrad[1][1] + auxVGrad[2][2] ); - - RAJA::atomicAdd< ATOMIC_POLICY >( &divV_n[elemToNodes( k, i )], localIncrement/numNodesPerElem ); - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; -}; - - -template< typename FE_TYPE > -struct waveSpeedPMLKernel -{ - - waveSpeedPMLKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of average wave speeds in the PML region - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] targetSet list of cells in the target set - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemToNodes constant array view of map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top - * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param[out] cMin PML wave speed, left-front-top - * @param[out] cMax PML wave speed, right-back-bottom - * @param[out] counterMin PML wave speed counter, left-front-top - * @param[out] counterMax PML wave speed counter, left-front-top - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( SortedArrayView< localIndex const > const targetSet, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, - arrayView1d< real32 const > const velocity, - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 (& cMin)[3], - real32 (& cMax)[3], - int (& counterMin)[3], - int (& counterMax)[3] ) - { - - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedLeft( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedRight( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedFront( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBack( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedTop( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBottom( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterLeft( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterRight( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterFront( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBack( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterTop( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBottom( 0 ); - - /// Loop over elements in the subregion, 'l' is the element index within the target set - forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - /// global element index - localIndex const k = targetSet[l]; - - /// wave speed at the element - real32 const c = velocity[k]; - - /// coordinates of the element center - real64 xLocal[ 3 ] = {0.0, 0.0, 0.0}; - - /// compute the coordinates of the element center - for( int j=0; j<3; ++j ) - { - for( localIndex i=0; i= xMin[1] && xLocal[1] <= xMax[1] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedLeft += c; - subRegionAvgWaveSpeedCounterLeft += 1; - } - else if( xLocal[0] > xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedRight += c; - subRegionAvgWaveSpeedCounterRight += 1; - } - if( xLocal[1] < xMin[1] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedFront += c; - subRegionAvgWaveSpeedCounterFront += 1; - } - else if( xLocal[1] > xMax[1] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedBack += c; - subRegionAvgWaveSpeedCounterBack += 1; - } - if( xLocal[2] < xMin[2] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) - { - subRegionAvgWaveSpeedTop += c; - subRegionAvgWaveSpeedCounterTop += 1; - } - else if( xLocal[2] > xMax[2] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) - { - subRegionAvgWaveSpeedBottom += c; - subRegionAvgWaveSpeedCounterBottom += 1; - } - } ); - - /// transfer local results to global variables - cMin[0]+=subRegionAvgWaveSpeedLeft.get(); - cMin[1]+=subRegionAvgWaveSpeedFront.get(); - cMin[2]+=subRegionAvgWaveSpeedTop.get(); - cMax[0]+=subRegionAvgWaveSpeedRight.get(); - cMax[1]+=subRegionAvgWaveSpeedBack.get(); - cMax[2]+=subRegionAvgWaveSpeedBottom.get(); - counterMin[0]+=subRegionAvgWaveSpeedCounterLeft.get(); - counterMin[1]+=subRegionAvgWaveSpeedCounterFront.get(); - counterMin[2]+=subRegionAvgWaveSpeedCounterTop.get(); - counterMax[0]+=subRegionAvgWaveSpeedCounterRight.get(); - counterMax[1]+=subRegionAvgWaveSpeedCounterBack.get(); - counterMax[2]+=subRegionAvgWaveSpeedCounterBottom.get(); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; -}; - - - -/** - * @brief Implements kernels for solving the acoustic wave equations - * explicit central FD method and SEM - * @copydoc geos::finiteElement::KernelBase - * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. - * - * ### AcousticWaveEquationSEMKernel Description - * Implements the KernelBase interface functions required for solving - * the acoustic wave equations using the - * "finite element kernel application" functions such as - * geos::finiteElement::RegionBasedKernelApplication. - * - * The number of degrees of freedom per support point for both - * the test and trial spaces are specified as `1`. - */ - - -template< typename SUBREGION_TYPE, - typename CONSTITUTIVE_TYPE, - typename FE_TYPE > -class ExplicitAcousticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, - CONSTITUTIVE_TYPE, - FE_TYPE, - 1, - 1 > -{ -public: - - /// Alias for the base class; - using Base = finiteElement::KernelBase< SUBREGION_TYPE, - CONSTITUTIVE_TYPE, - FE_TYPE, - 1, - 1 >; - - /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and - /// maxNumTrialSupportPointPerElem by definition. When the FE_TYPE is not a Virtual Element, this - /// will be the actual number of nodes per element. - static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; - - using Base::numDofPerTestSupportPoint; - using Base::numDofPerTrialSupportPoint; - using Base::m_elemsToNodes; - using Base::m_elemGhostRank; - using Base::m_constitutiveUpdate; - using Base::m_finiteElementSpace; - -//***************************************************************************** - /** - * @brief Constructor - * @copydoc geos::finiteElement::KernelBase::KernelBase - * @param nodeManager Reference to the NodeManager object. - * @param edgeManager Reference to the EdgeManager object. - * @param faceManager Reference to the FaceManager object. - * @param targetRegionIndex Index of the region the subregion belongs to. - * @param dt The time interval for the step. - * elements to be processed during this kernel launch. - */ - ExplicitAcousticSEM( NodeManager & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - SUBREGION_TYPE const & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - real64 const dt ): - Base( elementSubRegion, - finiteElementSpace, - inputConstitutiveType ), - m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_p_n( nodeManager.getField< acousticfields::Pressure_n >() ), - m_stiffnessVector( nodeManager.getField< acousticfields::StiffnessVector >() ), - m_density( elementSubRegion.template getField< acousticfields::AcousticDensity >() ), - m_dt( dt ) - { - GEOS_UNUSED_VAR( edgeManager ); - GEOS_UNUSED_VAR( faceManager ); - GEOS_UNUSED_VAR( targetRegionIndex ); - } - - //***************************************************************************** - /** - * @copydoc geos::finiteElement::KernelBase::StackVariables - * - * ### ExplicitAcousticSEM Description - * Adds a stack arrays for the nodal force, primary displacement variable, etc. - */ - struct StackVariables : Base::StackVariables - { -public: - GEOS_HOST_DEVICE - StackVariables(): - xLocal(), - stiffnessVectorLocal() - {} - - /// C-array stack storage for element local the nodal positions. - real64 xLocal[ 8 ][ 3 ]; - real32 stiffnessVectorLocal[ numNodesPerElem ]{}; - real32 invDensity; - }; - //*************************************************************************** - - - /** - * @copydoc geos::finiteElement::KernelBase::setup - * - * Copies the primary variable, and position into the local stack array. - */ - GEOS_HOST_DEVICE - inline - void setup( localIndex const k, - StackVariables & stack ) const - { - stack.invDensity = 1./m_density[k]; - for( localIndex a=0; a< 8; a++ ) - { - localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( int i=0; i< 3; ++i ) - { - stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; - } - } - } - - /** - * @copydoc geos::finiteElement::KernelBase::complete - */ - GEOS_HOST_DEVICE - GEOS_FORCE_INLINE - real64 complete( localIndex const k, - StackVariables & stack ) const - { - for( int i=0; i( &m_stiffnessVector[m_elemsToNodes( k, i )], stack.stiffnessVectorLocal[i] ); - } - return 0; - } - - - /** - * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel - * - * ### ExplicitAcousticSEM Description - * Calculates stiffness vector - * - */ - GEOS_HOST_DEVICE - GEOS_FORCE_INLINE - void quadraturePointKernel( localIndex const k, - localIndex const q, - StackVariables & stack ) const - { - - m_finiteElementSpace.template computeStiffnessTerm( q, stack.xLocal, [&] ( const int i, const int j, const real64 val ) - { - real32 const localIncrement = stack.invDensity*val*m_p_n[m_elemsToNodes( k, j )]; - stack.stiffnessVectorLocal[ i ] += localIncrement; - } ); - } - -protected: - /// The array containing the nodal position array. - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; - - /// The array containing the nodal pressure array. - arrayView1d< real32 const > const m_p_n; - - /// The array containing the product of the stiffness matrix and the nodal pressure. - arrayView1d< real32 > const m_stiffnessVector; - - /// The array containing the cell-wise density - arrayView1d< real32 const > const m_density; - - /// The time increment for this time integration step. - real64 const m_dt; - - -}; - - - -/// The factory used to construct a ExplicitAcousticWaveEquation kernel. -using ExplicitAcousticSEMFactory = finiteElement::KernelFactory< ExplicitAcousticSEM, - real64 >; - - -} // namespace acousticWaveEquationSEMKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp deleted file mode 100644 index 78b7292eda7..00000000000 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp +++ /dev/null @@ -1,681 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file ElasticWaveEquationSEMKernel.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ -#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ - -#include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" -#include "ElasticFields.hpp" - -namespace geos -{ -using namespace fields; -/// Namespace to contain the elastic wave kernels. -namespace elasticWaveEquationSEMKernels -{ - -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of face on an element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank array containing the ghost rank - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal array containing the normal of all faces - * @param[in] faceCenter array containing the center of all faces - * @param[in] sourceCoordinates coordinates of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] sourceForce force vector of the source - * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source - * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) - * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain - * integration - * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed - * @param[in] rickerOrder Order of the Ricker wavelet - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstantsx constant part of the source terms in x-direction - * @param[out] sourceConstantsy constant part of the source terms in y-direction - * @param[out] sourceConstantsz constant part of the source terms in z-direction - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term - * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstantsx, - arrayView2d< real64 > const sourceConstantsy, - arrayView2d< real64 > const sourceConstantsz, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder, - WaveSolverUtils::DASType useDAS, - integer linearDASSamples, - arrayView2d< real64 const > const linearDASGeometry, - R1Tensor const sourceForce, - R2SymTensor const sourceMoment ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - integer nSamples = useDAS == WaveSolverUtils::DASType::none ? 1 : linearDASSamples; - array1d< real64 > const samplePointLocationsA( nSamples ); - arrayView1d< real64 > const samplePointLocations = samplePointLocationsA.toView(); - array1d< real64 > const sampleIntegrationConstantsA( nSamples ); - arrayView1d< real64 > const sampleIntegrationConstants = sampleIntegrationConstantsA.toView(); - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - real64 xLocal[numNodesPerElem][3]; - - for( localIndex a=0; a< numNodesPerElem; ++a ) - { - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); - } - } - - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - sourceIsAccessible[isrc] = 1; - - real64 N[numNodesPerElem]; - real64 gradN[numNodesPerElem][3]; - FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); - R2SymTensor moment = sourceMoment; - for( localIndex q=0; q< numNodesPerElem; ++q ) - { - real64 inc[3] = { 0, 0, 0 }; - sourceNodeIds[isrc][q] = elemsToNodes( k, q ); - inc[0] += sourceForce[0] * N[q]; - inc[1] += sourceForce[1] * N[q]; - inc[2] += sourceForce[2] * N[q]; - - LvArray::tensorOps::Ri_add_symAijBj< 3 >( inc, moment.data, gradN[q] ); - sourceConstantsx[isrc][q] += inc[0]; - sourceConstantsy[isrc][q] += inc[1]; - sourceConstantsz[isrc][q] += inc[2]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - - } - } - } // end loop over all sources - - // Step 2: locate the receivers, and precompute the receiver term - - // for geophones, we need only a point per receiver. - // for DAS, we need multiple points - - /// compute locations of samples along receiver - if( nSamples == 1 ) - { - samplePointLocations[ 0 ] = 0; - } - else - { - for( integer i = 0; i < nSamples; ++i ) - { - samplePointLocations[ i ] = -0.5 + (real64) i / ( linearDASSamples - 1 ); - } - } - - /// compute integration constants of samples - /// for displacement difference (dipole) DAS, take the discrete derivative of the pair of geophones - if( useDAS == WaveSolverUtils::DASType::dipole ) - { - sampleIntegrationConstants[ 0 ] = -1.0; - sampleIntegrationConstants[ 1 ] = 1.0; - } - /// for strain integration DAS, take the average of strains to average strain data - else if( nSamples == 1 ) - { - sampleIntegrationConstants[ 0 ] = 1.0; - } - else - { - for( integer i = 0; i < linearDASSamples; i++ ) - { - sampleIntegrationConstants[ i ] = 1.0 / nSamples; - } - } - - /// loop over all the receivers - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - R1Tensor receiverCenter = { receiverCoordinates[ ircv ][ 0 ], receiverCoordinates[ ircv ][ 1 ], receiverCoordinates[ ircv ][ 2 ] }; - R1Tensor receiverVector; - if( useDAS == WaveSolverUtils::DASType::none ) - { - receiverVector = { 0, 0, 0 }; - } - else - { - receiverVector = WaveSolverUtils::computeDASVector( linearDASGeometry[ ircv ][ 0 ], linearDASGeometry[ ircv ][ 1 ] ); - } - real64 receiverLength = useDAS == WaveSolverUtils::DASType::none ? 0 : linearDASGeometry[ ircv ][ 2 ]; - /// loop over samples - for( integer iSample = 0; iSample < nSamples; ++iSample ) - { - /// compute sample coordinates and locate the element containing it - real64 const coords[3] = { receiverCenter[ 0 ] + receiverVector[ 0 ] * receiverLength * samplePointLocations[ iSample ], - receiverCenter[ 1 ] + receiverVector[ 1 ] * receiverLength * samplePointLocations[ iSample ], - receiverCenter[ 2 ] + receiverVector[ 2 ] * receiverLength * samplePointLocations[ iSample ] }; - bool const sampleFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( sampleFound && elemGhostRank[k] < 0 ) - { - real64 coordsOnRefElem[3]{}; - real64 xLocal[numNodesPerElem][3]; - - for( localIndex a=0; a< numNodesPerElem; ++a ) - { - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); - } - } - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - real64 N[numNodesPerElem]; - real64 gradN[numNodesPerElem][3]; - FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][iSample * numNodesPerElem + a] = elemsToNodes( k, - a ); - if( useDAS == WaveSolverUtils::DASType::strainIntegration ) - { - receiverConstants[ircv][iSample * numNodesPerElem + a] += ( gradN[a][0] * receiverVector[0] + gradN[a][1] * receiverVector[1] + gradN[a][2] * receiverVector[2] ) * - sampleIntegrationConstants[ iSample ]; - } - else - { - receiverConstants[ircv][iSample * numNodesPerElem + a] += N[a] * sampleIntegrationConstants[ iSample ]; - } - } - receiverIsLocal[ ircv ] = 2; - } - } // end loop over samples - // determine if the current rank is the owner of this receiver - real64 const coords[3] = { receiverCenter[ 0 ], receiverCenter[ 1 ], receiverCenter[ 2 ] }; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( receiverFound && elemGhostRank[k] < 0 ) - { - receiverIsLocal[ ircv ] = 1; - } - } // end loop over receivers - } ); - - } -}; - -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - //std::enable_if_t< geos::is_sem_formulation< std::remove_cv_t< FE_TYPE_ > >::value, void > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = density[e] * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - //std::enable_if_t< geos::is_sem_formulation< std::remove_cv_t< FE_TYPE_ > >::value, void > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView2d< real64 const > const faceNormal, - arrayView1d< real32 const > const density, - arrayView1d< real32 const > const velocityVp, - arrayView1d< real32 const > const velocityVs, - arrayView1d< real32 > const dampingx, - arrayView1d< real32 > const dampingy, - arrayView1d< real32 > const dampingz ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); - real32 const localIncrementx = aux * ( velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ); - real32 const localIncrementy = aux * ( velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ); - real32 const localIncrementz = aux * ( velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ); - - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -/** - * @brief Implements kernels for solving the elastic wave equations - * explicit central FD method and SEM - * @copydoc geos::finiteElement::KernelBase - * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. - * - * ### ElasticWaveEquationSEMKernel Description - * Implements the KernelBase interface functions required for solving - * the acoustic wave equations using the - * "finite element kernel application" functions such as - * geos::finiteElement::RegionBasedKernelApplication. - * - * The number of degrees of freedom per support point for both - * the test and trial spaces are specified as `1`. - */ - - -template< typename SUBREGION_TYPE, - typename CONSTITUTIVE_TYPE, - typename FE_TYPE > -class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, - CONSTITUTIVE_TYPE, - FE_TYPE, - 1, - 1 > -{ -public: - - /// Alias for the base class; - using Base = finiteElement::KernelBase< SUBREGION_TYPE, - CONSTITUTIVE_TYPE, - FE_TYPE, - 1, - 1 >; - - /// Number of nodes per element...which is equal to the - /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. - static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; - - using Base::numDofPerTestSupportPoint; - using Base::numDofPerTrialSupportPoint; - using Base::m_elemsToNodes; - using Base::m_elemGhostRank; - using Base::m_constitutiveUpdate; - using Base::m_finiteElementSpace; - -//***************************************************************************** - /** - * @brief Constructor - * @copydoc geos::finiteElement::KernelBase::KernelBase - * @param nodeManager Reference to the NodeManager object. - * @param edgeManager Reference to the EdgeManager object. - * @param faceManager Reference to the FaceManager object. - * @param targetRegionIndex Index of the region the subregion belongs to. - * @param dt The time interval for the step. - */ - ExplicitElasticSEM( NodeManager & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - SUBREGION_TYPE const & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - real64 const dt ): - Base( elementSubRegion, - finiteElementSpace, - inputConstitutiveType ), - m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), - m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), - m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), - m_stiffnessVectorx( nodeManager.getField< elasticfields::StiffnessVectorx >() ), - m_stiffnessVectory( nodeManager.getField< elasticfields::StiffnessVectory >() ), - m_stiffnessVectorz( nodeManager.getField< elasticfields::StiffnessVectorz >() ), - m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), - m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), - m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), - m_dt( dt ) - { - GEOS_UNUSED_VAR( edgeManager ); - GEOS_UNUSED_VAR( faceManager ); - GEOS_UNUSED_VAR( targetRegionIndex ); - } - - - - //***************************************************************************** - /** - * @copydoc geos::finiteElement::KernelBase::StackVariables - * - * ### ExplicitElasticSEM Description - * Adds a stack arrays for the nodal force, primary displacement variable, etc. - */ - struct StackVariables : Base::StackVariables - { -public: - GEOS_HOST_DEVICE - StackVariables(): - xLocal(), - stiffnessVectorxLocal(), - stiffnessVectoryLocal(), - stiffnessVectorzLocal() - {} - /// C-array stack storage for element local the nodal positions. - real64 xLocal[ 8 ][ 3 ]{}; - real32 stiffnessVectorxLocal[ numNodesPerElem ]; - real32 stiffnessVectoryLocal[ numNodesPerElem ]; - real32 stiffnessVectorzLocal[ numNodesPerElem ]; - real32 mu=0; - real32 lambda=0; - }; - //*************************************************************************** - - - /** - * @copydoc geos::finiteElement::KernelBase::setup - * - * Copies the primary variable, and position into the local stack array. - */ - GEOS_HOST_DEVICE - inline - void setup( localIndex const k, - StackVariables & stack ) const - { - for( localIndex a=0; a< 8; a++ ) - { - localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( int i=0; i< 3; ++i ) - { - stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; - } - } - stack.mu = m_density[k] * pow( m_velocityVs[k], 2 ); - stack.lambda = m_density[k] * pow( m_velocityVp[k], 2 ) - 2.0 * stack.mu; - } - - /** - * @copydoc geos::finiteElement::KernelBase::complete - */ - GEOS_HOST_DEVICE - GEOS_FORCE_INLINE - real64 complete( localIndex const k, - StackVariables & stack ) const - { - for( int i=0; i( &m_stiffnessVectorx[ nodeIndex ], stack.stiffnessVectorxLocal[ i ] ); - RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectory[ nodeIndex ], stack.stiffnessVectoryLocal[ i ] ); - RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectorz[ nodeIndex ], stack.stiffnessVectorzLocal[ i ] ); - } - return 0; - } - - /** - * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel - * - * ### ExplicitElasticSEM Description - * Calculates stiffness vector - * - */ - GEOS_HOST_DEVICE - GEOS_FORCE_INLINE - void quadraturePointKernel( localIndex const k, - localIndex const q, - StackVariables & stack ) const - { - - m_finiteElementSpace.template computeFirstOrderStiffnessTerm( q, stack.xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) - { - real32 const Rxx_ij = val*((stack.lambda+2.0*stack.mu)*J[p][0]*J[r][0]+stack.mu*(J[p][1]*J[r][1]+J[p][2]*J[r][2])); - real32 const Ryy_ij = val*((stack.lambda+2.0*stack.mu)*J[p][1]*J[r][1]+stack.mu*(J[p][0]*J[r][0]+J[p][2]*J[r][2])); - real32 const Rzz_ij = val*((stack.lambda+2.0*stack.mu)*J[p][2]*J[r][2]+stack.mu*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); - real32 const Rxy_ij = val*(stack.lambda*J[p][0]*J[r][1]+stack.mu*J[p][1]*J[r][0]); - real32 const Ryx_ij = val*(stack.mu*J[p][0]*J[r][1]+stack.lambda*J[p][1]*J[r][0]); - real32 const Rxz_ij = val*(stack.lambda*J[p][0]*J[r][2]+stack.mu*J[p][2]*J[r][0]); - real32 const Rzx_ij = val*(stack.mu*J[p][0]*J[r][2]+stack.lambda*J[p][2]*J[r][0]); - real32 const Ryz_ij = val*(stack.lambda*J[p][1]*J[r][2]+stack.mu*J[p][2]*J[r][1]); - real32 const Rzy_ij = val*(stack.mu*J[p][1]*J[r][2]+stack.lambda*J[p][2]*J[r][1]); - - real32 const localIncrementx = (Rxx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rxy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rxz_ij*m_uz_n[m_elemsToNodes( k, j )]); - real32 const localIncrementy = (Ryx_ij * m_ux_n[m_elemsToNodes( k, j )] + Ryy_ij*m_uy_n[m_elemsToNodes( k, j )] + Ryz_ij*m_uz_n[m_elemsToNodes( k, j )]); - real32 const localIncrementz = (Rzx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rzy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rzz_ij*m_uz_n[m_elemsToNodes( k, j )]); - - stack.stiffnessVectorxLocal[ i ] += localIncrementx; - stack.stiffnessVectoryLocal[ i ] += localIncrementy; - stack.stiffnessVectorzLocal[ i ] += localIncrementz; - } ); - } - - -protected: - /// The array containing the nodal position array. - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; - - /// The array containing the nodal displacement array in x direction. - arrayView1d< real32 > const m_ux_n; - - /// The array containing the nodal displacement array in y direction. - arrayView1d< real32 > const m_uy_n; - - /// The array containing the nodal displacement array in z direction. - arrayView1d< real32 > const m_uz_n; - - /// The array containing the product of the stiffness matrix and the nodal displacement. - arrayView1d< real32 > const m_stiffnessVectorx; - - /// The array containing the product of the stiffness matrix and the nodal displacement. - arrayView1d< real32 > const m_stiffnessVectory; - - /// The array containing the product of the stiffness matrix and the nodal displacement. - arrayView1d< real32 > const m_stiffnessVectorz; - - /// The array containing the density of the medium - arrayView1d< real32 const > const m_density; - - /// The array containing the P-wavespeed - arrayView1d< real32 const > const m_velocityVp; - - /// The array containing the S-wavespeed - arrayView1d< real32 const > const m_velocityVs; - - /// The time increment for this time integration step. - real64 const m_dt; - - -}; - - -/// The factory used to construct a ExplicitAcousticWaveEquation kernel. -using ExplicitElasticSEMFactory = finiteElement::KernelFactory< ExplicitElasticSEM, - real64 >; - -} // namespace ElasticWaveEquationSEMKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp similarity index 90% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 1ede25c9b42..e1311f20a66 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -26,6 +26,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" +#include "events/EventManager.hpp" namespace geos { @@ -145,7 +148,7 @@ void AcousticFirstOrderWaveEquationSEM::postProcessInput() m_uzNp1AtReceivers.resize( m_nsamplesSeismoTrace, numReceiversGlobal + 1 ); m_sourceElem.resize( numSourcesGlobal ); m_sourceRegion.resize( numSourcesGlobal ); - m_rcvElem.resize( numReceiversGlobal ); + m_receiverElem.resize( numReceiversGlobal ); m_receiverRegion.resize( numReceiversGlobal ); } @@ -173,7 +176,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev arrayView2d< localIndex > const receiverNodeIds = m_receiverNodeIds.toView(); arrayView2d< real64 > const receiverConstants = m_receiverConstants.toView(); arrayView1d< localIndex > const receiverIsLocal = m_receiverIsLocal.toView(); - arrayView1d< localIndex > const rcvElem = m_rcvElem.toView(); + arrayView1d< localIndex > const receiverElem = m_receiverElem.toView(); arrayView1d< localIndex > const receiverRegion = m_receiverRegion.toView(); receiverNodeIds.setValues< EXEC_POLICY >( -1 ); receiverConstants.setValues< EXEC_POLICY >( -1 ); @@ -211,9 +214,9 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - acousticFirstOrderWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, numFacesPerElem, @@ -232,7 +235,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev sourceRegion, receiverCoordinates, receiverIsLocal, - rcvElem, + receiverElem, receiverNodeIds, receiverConstants, receiverRegion, @@ -265,7 +268,7 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro /// get the array of indicators: 1 if the face is on the boundary; 0 otherwise arrayView1d< integer const > const & facesDomainBoundaryIndicator = faceManager.getDomainBoundaryIndicator(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); /// get table containing face to nodes map ArrayOfArraysView< localIndex const > const facesToNodes = faceManager.nodeList().toViewConst(); @@ -295,25 +298,26 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToNodes, - velocity, - density, - mass ); - - acousticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - velocity, - damping ); + AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + velocity, + density, + mass ); + + AcousticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + velocity, + density, + damping ); + + } ); } ); } ); @@ -453,6 +457,10 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t { using FE_TYPE = TYPEOFREF( finiteElement ); + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); acousticFirstOrderWaveEquationSEMKernels:: @@ -486,7 +494,7 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t sourceElem, sourceRegion, dt, - cycleNumber, + cycleForSource, p_np1 ); } ); arrayView2d< real32 > const uxReceivers = m_uxNp1AtReceivers.toView(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 14a6dc502ae..eba7dc066c0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -21,8 +21,8 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTORDERWAVEEQUATIONSEM_HPP_ #include "mesh/MeshFields.hpp" -#include "AcousticFields.hpp" -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp new file mode 100644 index 00000000000..744e288fd87 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -0,0 +1,292 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticFirstOrderWaveEquationSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ + +#include "finiteElement/kernelInterface/KernelBase.hpp" + +namespace geos +{ + +/// Namespace to contain the first order acoustic wave kernels. +namespace acousticFirstOrderWaveEquationSEMKernels +{ + +template< typename FE_TYPE > +struct VelocityComputation +{ + + VelocityComputation( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of the velocity for one iteration + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] p_np1 pressure array (only used here) + * @param[in] density cell-wise density + * @param[in] dt time-step + * @param[out] velocity_x velocity array in the x direction (updated here) + * @param[out] velocity_y velocity array in the y direction (updated here) + * @param[out] velocity_z velocity array in the z direction (updated here) + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< real32 const > const p_np1, + arrayView1d< real32 const > const density, + real64 const dt, + arrayView2d< real32 > const velocity_x, + arrayView2d< real32 > const velocity_y, + arrayView2d< real32 > const velocity_z ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[8][3]; + for( localIndex a=0; a< 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + real32 uelemx[numNodesPerElem] = {0.0}; + real32 uelemy[numNodesPerElem] = {0.0}; + real32 uelemz[numNodesPerElem] = {0.0}; + real32 flowx[numNodesPerElem] = {0.0}; + real32 flowy[numNodesPerElem] = {0.0}; + real32 flowz[numNodesPerElem] = {0.0}; + + for( localIndex i = 0; i < numNodesPerElem; ++i ) + { + real32 massLoc = m_finiteElement.computeMassTerm( i, xLocal ); + uelemx[i] = massLoc*velocity_x[k][i]; + uelemy[i] = massLoc*velocity_y[k][i]; + uelemz[i] = massLoc*velocity_z[k][i]; + } + + for( localIndex q = 0; q < numNodesPerElem; q++ ) + { + + m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int i, int j, real32 dfx1, real32 dfx2, real32 dfx3 ) + { + flowx[j] += dfx1*p_np1[elemsToNodes[k][i]]; + flowy[j] += dfx2*p_np1[elemsToNodes[k][i]]; + flowz[j] += dfx3*p_np1[elemsToNodes[k][i]]; + } ); + + m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int i, int j, real32 dfy1, real32 dfy2, real32 dfy3 ) + { + flowx[j] += dfy1*p_np1[elemsToNodes[k][i]]; + flowy[j] += dfy2*p_np1[elemsToNodes[k][i]]; + flowz[j] += dfy3*p_np1[elemsToNodes[k][i]]; + } ); + + m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int i, int j, real32 dfz1, real32 dfz2, real32 dfz3 ) + { + flowx[j] += dfz1*p_np1[elemsToNodes[k][i]]; + flowy[j] += dfz2*p_np1[elemsToNodes[k][i]]; + flowz[j] += dfz3*p_np1[elemsToNodes[k][i]]; + + } ); + + } + for( localIndex i = 0; i < numNodesPerElem; ++i ) + { + real32 massLoc = m_finiteElement.computeMassTerm( i, xLocal ); + uelemx[i]+=dt*flowx[i]/density[k]; + uelemy[i]+=dt*flowy[i]/density[k]; + uelemz[i]+=dt*flowz[i]/density[k]; + + velocity_x[k][i] = uelemx[i]/massLoc; + velocity_y[k][i] = uelemy[i]/massLoc; + velocity_z[k][i] = uelemz[i]/massLoc; + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; +}; + +template< typename FE_TYPE > +struct PressureComputation +{ + + PressureComputation( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of the pressure for one iteration + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] regionIndex Index of the subregion + * @param[in] size_node the number of nodes in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[out] velocity_x velocity array in the x direction (only used here) + * @param[out] velocity_y velocity array in the y direction (only used here) + * @param[out] velocity_z velocity array in the z direction (only used here) + * @param[in] mass the mass matrix + * @param[in] damping the damping matrix + * @param[in] sourceConstants constant part of the source terms + * @param[in] sourceValue value of the temporal source (eg. Ricker) + * @param[in] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[in] sourceElem element where a source is located + * @param[in] cycleNumber the number of cycle + * @param[in] dt time-step + * @param[out] p_np1 pressure array (updated here) + */ + + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( localIndex const size, + localIndex const regionIndex, + localIndex const size_node, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView2d< real32 const > const velocity_x, + arrayView2d< real32 const > const velocity_y, + arrayView2d< real32 const > const velocity_z, + arrayView1d< real32 const > const mass, + arrayView1d< real32 const > const damping, + arrayView2d< real64 const > const sourceConstants, + arrayView2d< real32 const > const sourceValue, + arrayView1d< localIndex const > const sourceIsAccessible, + arrayView1d< localIndex const > const sourceElem, + arrayView1d< localIndex const > const sourceRegion, + real64 const dt, + integer const cycleNumber, + arrayView1d< real32 > const p_np1 ) + + { + + //Pre-mult by the first factor for damping + forAll< EXEC_POLICY >( size_node, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + p_np1[a] *= 1.0-((dt/2)*(damping[a]/mass[a])); + } ); + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[8][3]; + for( localIndex a=0; a< 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + real32 auxx[numNodesPerElem] = {0.0}; + real32 auyy[numNodesPerElem] = {0.0}; + real32 auzz[numNodesPerElem] = {0.0}; + real32 uelemx[numNodesPerElem] = {0.0}; + + + // Volume integration + for( localIndex q=0; q < numNodesPerElem; q++ ) + { + + + m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int i, int j, real32 dfx1, real32 dfx2, real32 dfx3 ) + { + auxx[i] -= dfx1*velocity_x[k][j]; + auyy[i] -= dfx2*velocity_y[k][j]; + auzz[i] -= dfx3*velocity_z[k][j]; + } ); + + m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int i, int j, real32 dfy1, real32 dfy2, real32 dfy3 ) + { + auxx[i] -= dfy1*velocity_x[k][j]; + auyy[i] -= dfy2*velocity_y[k][j]; + auzz[i] -= dfy3*velocity_z[k][j]; + } ); + + m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int i, int j, real32 dfz1, real32 dfz2, real32 dfz3 ) + { + auxx[i] -= dfz1*velocity_x[k][j]; + auyy[i] -= dfz2*velocity_y[k][j]; + auzz[i] -= dfz3*velocity_z[k][j]; + } ); + + + + } + + //Time update + multiplication by inverse of the mass matrix + for( localIndex i = 0; i < numNodesPerElem; ++i ) + { + real32 diag=(auxx[i]+auyy[i]+auzz[i]); + uelemx[i]+=dt*diag; + + real32 const localIncrement = uelemx[i]/mass[elemsToNodes[k][i]]; + RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[elemsToNodes[k][i]], localIncrement ); + } + + //Source Injection + for( localIndex isrc = 0; isrc < sourceConstants.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 1 ) + { + if( sourceElem[isrc]==k && sourceRegion[isrc] == regionIndex ) + { + for( localIndex i = 0; i < numNodesPerElem; ++i ) + { + real32 const localIncrement2 = dt*(sourceConstants[isrc][i]*sourceValue[cycleNumber][isrc])/(mass[elemsToNodes[k][i]]); + RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[elemsToNodes[k][i]], localIncrement2 ); + } + } + } + } + + } ); + + //Pre-mult by the first factor for damping + forAll< EXEC_POLICY >( size_node, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + p_np1[a] /= 1.0+((dt/2)*(damping[a]/mass[a])); + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + +}; + +} // namespace AcousticFirstOrderWaveEquationSEMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp similarity index 95% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 967327730a6..5f9497ffc37 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -26,7 +26,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" +#include "events/EventManager.hpp" namespace geos { @@ -586,54 +588,13 @@ real64 AcousticVTIWaveEquationSEM::explicitStepInternal( real64 const & time_n, addSourceToRightHandSide( cycleNumber, rhs ); /// calculate your time integrators - real64 const dt2 = dt*dt; GEOS_MARK_SCOPE ( updateP ); - forAll< EXEC_POLICY >( nodeManager.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - if( freeSurfaceNodeIndicator[a] != 1 ) - { - p_np1[a] = 2.0*mass[a]*p_n[a]/dt2; - p_np1[a] -= mass[a]*p_nm1[a]/dt2; - p_np1[a] += stiffnessVector_p[a]; - p_np1[a] += rhs[a]; - q_np1[a] = 2.0*mass[a]*q_n[a]/dt2; - q_np1[a] -= mass[a]*q_nm1[a]/dt2; - q_np1[a] += stiffnessVector_q[a]; - q_np1[a] += rhs[a]; - - if( lateralSurfaceNodeIndicator[a] != 1 && bottomSurfaceNodeIndicator[a] != 1 ) - { - // Interior node, no boundary terms - p_np1[a] /= mass[a]/dt2; - q_np1[a] /= mass[a]/dt2; - } - else - { - // Boundary node - p_np1[a] += damping_p[a]*p_nm1[a]/dt/2; - p_np1[a] += damping_pq[a]*q_nm1[a]/dt/2; - - q_np1[a] += damping_q[a]*q_nm1[a]/dt/2; - q_np1[a] += damping_qp[a]*p_nm1[a]/dt/2; - // Hand-made Inversion of 2x2 matrix - real32 coef_pp = mass[a]/dt2; - coef_pp += damping_p[a]/dt/2; - real32 coef_pq = damping_pq[a]/dt/2; - - real32 coef_qq = mass[a]/dt2; - coef_qq += damping_q[a]/2/dt; - real32 coef_qp = damping_qp[a]/dt/2; - - real32 det_pq = 1/(coef_pp * coef_qq - coef_pq*coef_qp); - - real32 aux_p_np1 = p_np1[a]; - p_np1[a] = det_pq*(coef_qq*p_np1[a] - coef_pq*q_np1[a]); - q_np1[a] = det_pq*(coef_pp*q_np1[a] - coef_qp*aux_p_np1); - } - } - } ); + AcousticTimeSchemeSEM::LeapFrogforVTI( nodeManager.size(), dt, p_np1, p_n, p_nm1, q_np1, q_n, q_nm1, mass, stiffnessVector_p, + stiffnessVector_q, damping_p, damping_pq, damping_q, damping_qp, + rhs, freeSurfaceNodeIndicator, lateralSurfaceNodeIndicator, + bottomSurfaceNodeIndicator ); /// synchronize pressure fields FieldIdentifiers fieldsToBeSync; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 932568e3f6e..712104350de 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -22,8 +22,8 @@ #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "WaveSolverBase.hpp" -#include "AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" #include "AcousticVTIFields.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 72cd2da8d73..1f9f15608a1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -21,7 +21,7 @@ #include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "AcousticVTIFields.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp new file mode 100644 index 00000000000..c6f2f54586c --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp @@ -0,0 +1,389 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticPMLSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticPMLSEM +{ + struct ComputeDamping + { + /** + * @brief Compute the damping profile for the Perfectly Matched Layer (PML) + * @param xLocal a given x-y-z coordinates (3-components array) + * @param xMin coordinate limits of the inner PML boundaries, left-front-top + * @param xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param dMin PML thickness, left-front-top + * @param dMax PML thickness, right-back-bottom + * @param cMin PML wave speed, left-front-top + * @param cMax PML wave speed, right-back-bottom + * @param r desired reflectivity of the PML + * @param sigma 3-components array to hold the damping profile in each direction + */ + GEOS_HOST_DEVICE + inline + static void computeDampingProfile( real32 const (&xLocal)[3], + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 const (&dMin)[3], + real32 const (&dMax)[3], + real32 const (&cMin)[3], + real32 const (&cMax)[3], + real32 const r, + real32 (& sigma)[3] ) + { + + sigma[0] = 0; + sigma[1] = 0; + sigma[2] = 0; + + if( xLocal[0] < xMin[0] ) + { + real32 const factor = -3.0/2.0*cMin[0]*log( r )/(dMin[0]*dMin[0]*dMin[0]); + sigma[0] = factor*(xLocal[0]-xMin[0])*(xLocal[0]-xMin[0]); + } + else if( xLocal[0] > xMax[0] ) + { + real32 const factor = -3.0/2.0*cMax[0]*log( r )/(dMax[0]*dMax[0]*dMax[0]); + sigma[0] = factor*(xLocal[0]-xMax[0])*(xLocal[0]-xMax[0]); + } + if( xLocal[1] < xMin[1] ) + { + real32 const factor = -3.0/2.0*cMin[1]*log( r )/(dMin[1]*dMin[1]*dMin[1]); + sigma[1] = factor*(xLocal[1]-xMin[1])*(xLocal[1]-xMin[1]); + } + else if( xLocal[1] > xMax[1] ) + { + real32 const factor = -3.0/2.0*cMax[1]*log( r )/(dMax[1]*dMax[1]*dMax[1]); + sigma[1] = factor*(xLocal[1]-xMax[1])*(xLocal[1]-xMax[1]); + } + if( xLocal[2] < xMin[2] ) + { + real32 const factor = -3.0/2.0*cMin[2]*log( r )/(dMin[2]*dMin[2]*dMin[2]); + sigma[2] = factor*(xLocal[2]-xMin[2])*(xLocal[2]-xMin[2]); + } + else if( xLocal[2] > xMax[2] ) + { + real32 const factor = -3.0/2.0*cMax[2]*log( r )/(dMax[2]*dMax[2]*dMax[2]); + sigma[2] = factor*(xLocal[2]-xMax[2])*(xLocal[2]-xMax[2]); + } + } + }; + + template< typename FE_TYPE > + struct PMLKernel + { + + PMLKernel( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of field gradients and divergence for PML region + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] targetSet list of cells in the target set + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemToNodes constant array view of map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] p_n pressure field at time n + * @param[in] v_n PML auxiliary field at time n + * @param[in] u_n PML auxiliary field at time n + * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top + * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param[in] dMin PML thickness, left-front-top + * @param[in] dMax PML thickness, right-back-bottom + * @param[in] cMin PML wave speed, left-front-top + * @param[in] cMax PML wave speed, right-back-bottom + * @param[in] r desired reflectivity of the PML + * @param[out] grad_n array holding the gradients at time n + * @param[out] divV_n array holding the divergence at time n + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( SortedArrayView< localIndex const > const targetSet, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const p_n, + arrayView2d< real32 const > const v_n, + arrayView1d< real32 const > const u_n, + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 const (&dMin)[3], + real32 const (&dMax)[3], + real32 const (&cMin)[3], + real32 const (&cMax)[3], + real32 const r, + arrayView2d< real32 > const grad_n, + arrayView1d< real32 > const divV_n ) + { + /// Loop over elements in the subregion, 'l' is the element index within the target set + forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + /// global element index + localIndex const k = targetSet[l]; + + /// wave speed at the element + real32 const c = velocity[k]; + + /// coordinates of the element nodes + real64 xLocal[ numNodesPerElem ][ 3 ]; + real32 xLocal32[ numNodesPerElem ][ 3 ]; + + /// local arrays to store the pressure at all nodes and its gradient at a given node + real64 pressure[ numNodesPerElem ]; + real64 pressureGrad[ 3 ]; + + /// local arrays to store the PML vectorial auxiliary variable at all nodes and its gradient at a given node + real64 auxV[3][ numNodesPerElem ]; + real64 auxVGrad[3][3]; + + /// local arrays to store the PML scalar auxiliary variable at all nodes and its gradient at a given node + real64 auxU[ numNodesPerElem ]; + real64 auxUGrad[3]; + + /// local array to store the PML damping profile + real32 sigma[ 3 ]; + + /// copy from global to local arrays + for( localIndex i=0; i( k, i, xLocal, gradN ); + GEOS_UNUSED_VAR ( detJ ); + + /// compute the gradient of the pressure and the PML auxiliary variables at the node + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, pressure, pressureGrad ); + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxU, auxUGrad ); + for( int j=0; j<3; ++j ) + { + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxV[j], auxVGrad[j] ); + } + + /// compute the PML damping profile + ComputeDamping::computeDampingProfile( + xLocal32[i], + xMin, + xMax, + dMin, + dMax, + cMin, + cMax, + r, + sigma ); + + /// compute B.pressureGrad - C.auxUGrad where B and C are functions of the damping profile + /// WARNING: the division by 'numNodesPerElem' below is needed because the average of + /// gradient and divergence at the nodes are sought. It is the number of cells contributing + /// to each node that is needed. In this case, it is equal to 'numNodesPerElem'. For high-order + /// SEM, this approach won't work and the average needs to be computed differently (maybe using counters). + real32 localIncrementArray[3]; + localIncrementArray[0] = (sigma[0]-sigma[1]-sigma[2])*pressureGrad[0] - (sigma[1]*sigma[2])*auxUGrad[0]; + localIncrementArray[1] = (sigma[1]-sigma[0]-sigma[2])*pressureGrad[1] - (sigma[0]*sigma[2])*auxUGrad[1]; + localIncrementArray[2] = (sigma[2]-sigma[0]-sigma[1])*pressureGrad[2] - (sigma[0]*sigma[1])*auxUGrad[2]; + for( int j=0; j<3; ++j ) + { + RAJA::atomicAdd< ATOMIC_POLICY >( &grad_n[elemToNodes( k, i )][j], localIncrementArray[j]/numNodesPerElem ); + } + /// compute beta.pressure + gamma.u - c^2 * divV where beta and gamma are functions of the damping profile + real32 const beta = sigma[0]*sigma[1]+sigma[0]*sigma[2]+sigma[1]*sigma[2]; + real32 const gamma = sigma[0]*sigma[1]*sigma[2]; + real32 const localIncrement = beta*p_n[elemToNodes( k, i )] + + gamma*u_n[elemToNodes( k, i )] + - c*c*( auxVGrad[0][0] + auxVGrad[1][1] + auxVGrad[2][2] ); + + RAJA::atomicAdd< ATOMIC_POLICY >( &divV_n[elemToNodes( k, i )], localIncrement/numNodesPerElem ); + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + }; + + + template< typename FE_TYPE > + struct waveSpeedPMLKernel + { + + waveSpeedPMLKernel( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of average wave speeds in the PML region + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] targetSet list of cells in the target set + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemToNodes constant array view of map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top + * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param[out] cMin PML wave speed, left-front-top + * @param[out] cMax PML wave speed, right-back-bottom + * @param[out] counterMin PML wave speed counter, left-front-top + * @param[out] counterMax PML wave speed counter, left-front-top + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( SortedArrayView< localIndex const > const targetSet, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, + arrayView1d< real32 const > const velocity, + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 (& cMin)[3], + real32 (& cMax)[3], + int (& counterMin)[3], + int (& counterMax)[3] ) + { + + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedLeft( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedRight( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedFront( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBack( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedTop( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBottom( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterLeft( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterRight( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterFront( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBack( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterTop( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBottom( 0 ); + + /// Loop over elements in the subregion, 'l' is the element index within the target set + forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + /// global element index + localIndex const k = targetSet[l]; + + /// wave speed at the element + real32 const c = velocity[k]; + + /// coordinates of the element center + real64 xLocal[ 3 ] = {0.0, 0.0, 0.0}; + + /// compute the coordinates of the element center + for( int j=0; j<3; ++j ) + { + for( localIndex i=0; i= xMin[1] && xLocal[1] <= xMax[1] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedLeft += c; + subRegionAvgWaveSpeedCounterLeft += 1; + } + else if( xLocal[0] > xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedRight += c; + subRegionAvgWaveSpeedCounterRight += 1; + } + if( xLocal[1] < xMin[1] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedFront += c; + subRegionAvgWaveSpeedCounterFront += 1; + } + else if( xLocal[1] > xMax[1] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedBack += c; + subRegionAvgWaveSpeedCounterBack += 1; + } + if( xLocal[2] < xMin[2] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) + { + subRegionAvgWaveSpeedTop += c; + subRegionAvgWaveSpeedCounterTop += 1; + } + else if( xLocal[2] > xMax[2] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) + { + subRegionAvgWaveSpeedBottom += c; + subRegionAvgWaveSpeedCounterBottom += 1; + } + } ); + + /// transfer local results to global variables + cMin[0]+=subRegionAvgWaveSpeedLeft.get(); + cMin[1]+=subRegionAvgWaveSpeedFront.get(); + cMin[2]+=subRegionAvgWaveSpeedTop.get(); + cMax[0]+=subRegionAvgWaveSpeedRight.get(); + cMax[1]+=subRegionAvgWaveSpeedBack.get(); + cMax[2]+=subRegionAvgWaveSpeedBottom.get(); + counterMin[0]+=subRegionAvgWaveSpeedCounterLeft.get(); + counterMin[1]+=subRegionAvgWaveSpeedCounterFront.get(); + counterMin[2]+=subRegionAvgWaveSpeedCounterTop.get(); + counterMax[0]+=subRegionAvgWaveSpeedCounterRight.get(); + counterMax[1]+=subRegionAvgWaveSpeedCounterBack.get(); + counterMax[2]+=subRegionAvgWaveSpeedCounterBottom.get(); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + }; + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp similarity index 95% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 0dc0f3f97c7..e8452ae08dd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -26,7 +26,12 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp" +#include "events/EventManager.hpp" +#include "AcousticPMLSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -175,9 +180,9 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, { GEOS_MARK_SCOPE( acousticWaveEquationSEMKernels::PrecomputeSourceAndReceiverKernel ); - acousticWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstants + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), numFacesPerElem, nodeCoords32, @@ -294,24 +299,25 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToNodes, - velocity, - density, - mass ); - - acousticWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - velocity, - density, - damping ); + AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + velocity, + density, + mass ); + + AcousticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + velocity, + density, + damping ); + } ); } ); @@ -342,9 +348,6 @@ void AcousticWaveEquationSEM::applyFreeSurfaceBC( real64 time, DomainPartition & /// array of indicators: 1 if a node is on on free surface; 0 otherwise arrayView1d< localIndex > const freeSurfaceNodeIndicator = nodeManager.getField< acousticfields::AcousticFreeSurfaceNodeIndicator >(); - // freeSurfaceFaceIndicator.zero(); - // freeSurfaceNodeIndicator.zero(); - fsManager.apply< FaceManager >( time, domain.getMeshBody( 0 ).getMeshLevel( m_discretizationName ), string( "FreeSurface" ), @@ -565,7 +568,7 @@ void AcousticWaveEquationSEM::initializePML() { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticWaveEquationSEMKernels:: + AcousticPMLSEM:: waveSpeedPMLKernel< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( targetSet, @@ -713,7 +716,7 @@ void AcousticWaveEquationSEM::applyPML( real64 const time, DomainPartition & dom using FE_TYPE = TYPEOFREF( finiteElement ); /// apply the PML kernel - acousticWaveEquationSEMKernels:: + AcousticPMLSEM:: PMLKernel< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( targetSet, @@ -952,7 +955,7 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, getDiscretizationName(), "", kernelFactory ); - + //Modification of cycleNember useful when minTime < 0 EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); @@ -965,18 +968,8 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, if( !m_usePML ) { GEOS_MARK_SCOPE ( updateP ); - forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) - { - localIndex const a = solverTargetNodesSet[n]; - if( freeSurfaceNodeIndicator[a] != 1 ) - { - p_np1[a] = p_n[a]; - p_np1[a] *= 2.0 * mass[a]; - p_np1[a] -= (mass[a] - 0.5 * dt * damping[a]) * p_nm1[a]; - p_np1[a] += dt2 * (rhs[a] - stiffnessVector[a]); - p_np1[a] /= mass[a] + 0.5 * dt * damping[a]; - } - } ); + AcousticTimeSchemeSEM::LeapFrogWithoutPML( dt, p_np1, p_n, p_nm1, mass, stiffnessVector, damping, + rhs, freeSurfaceNodeIndicator, solverTargetNodesSet ); } else { @@ -1014,7 +1007,7 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, xLocal[i] = nodeCoords32[a][i]; } - acousticWaveEquationSEMKernels::PMLKernelHelper::computeDampingProfilePML( + AcousticPMLSEM::ComputeDamping::computeDampingProfile( xLocal, xMin, xMax, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 9396a8201bf..d8d7e6fc981 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -20,10 +20,10 @@ #ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEM_HPP_ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEM_HPP_ -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp new file mode 100644 index 00000000000..60b3bfe56c1 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -0,0 +1,230 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticWaveEquationSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ + +#include "finiteElement/kernelInterface/KernelBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#if !defined( GEOS_USE_HIP ) +#include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" +#endif +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" + +namespace geos +{ + +using namespace fields; + +/// Namespace to contain the acoustic wave kernels. +namespace acousticWaveEquationSEMKernels +{ + +/** + * @brief Implements kernels for solving the acoustic wave equations + * explicit central FD method and SEM + * @copydoc geos::finiteElement::KernelBase + * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. + * + * ### AcousticWaveEquationSEMKernel Description + * Implements the KernelBase interface functions required for solving + * the acoustic wave equations using the + * "finite element kernel application" functions such as + * geos::finiteElement::RegionBasedKernelApplication. + * + * The number of degrees of freedom per support point for both + * the test and trial spaces are specified as `1`. + */ + + +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ExplicitAcousticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 > +{ +public: + + /// Alias for the base class; + using Base = finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 >; + + /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and + /// maxNumTrialSupportPointPerElem by definition. When the FE_TYPE is not a Virtual Element, this + /// will be the actual number of nodes per element. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + using Base::numDofPerTestSupportPoint; + using Base::numDofPerTrialSupportPoint; + using Base::m_elemsToNodes; + using Base::m_elemGhostRank; + using Base::m_constitutiveUpdate; + using Base::m_finiteElementSpace; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + * elements to be processed during this kernel launch. + */ + ExplicitAcousticSEM( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( elementSubRegion, + finiteElementSpace, + inputConstitutiveType ), + m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), + m_p_n( nodeManager.getField< acousticfields::Pressure_n >() ), + m_stiffnessVector( nodeManager.getField< acousticfields::StiffnessVector >() ), + m_density( elementSubRegion.template getField< acousticfields::AcousticDensity >() ), + m_dt( dt ) + { + GEOS_UNUSED_VAR( edgeManager ); + GEOS_UNUSED_VAR( faceManager ); + GEOS_UNUSED_VAR( targetRegionIndex ); + } + + //***************************************************************************** + /** + * @copydoc geos::finiteElement::KernelBase::StackVariables + * + * ### ExplicitAcousticSEM Description + * Adds a stack arrays for the nodal force, primary displacement variable, etc. + */ + struct StackVariables : Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables(): + xLocal(), + stiffnessVectorLocal() + {} + + /// C-array stack storage for element local the nodal positions. + real64 xLocal[ 8 ][ 3 ]; + real32 stiffnessVectorLocal[ numNodesPerElem ]{}; + real32 invDensity; + }; + //*************************************************************************** + + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + stack.invDensity = 1./m_density[k]; + for( localIndex a=0; a< 8; a++ ) + { + localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( int i=0; i< 3; ++i ) + { + stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; + } + } + } + + /** + * @copydoc geos::finiteElement::KernelBase::complete + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + real64 complete( localIndex const k, + StackVariables & stack ) const + { + for( int i=0; i( &m_stiffnessVector[m_elemsToNodes( k, i )], stack.stiffnessVectorLocal[i] ); + } + return 0; + } + + + /** + * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel + * + * ### ExplicitAcousticSEM Description + * Calculates stiffness vector + * + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + void quadraturePointKernel( localIndex const k, + localIndex const q, + StackVariables & stack ) const + { + + m_finiteElementSpace.template computeStiffnessTerm( q, stack.xLocal, [&] ( const int i, const int j, const real64 val ) + { + real32 const localIncrement = stack.invDensity*val*m_p_n[m_elemsToNodes( k, j )]; + stack.stiffnessVectorLocal[ i ] += localIncrement; + } ); + } + +protected: + /// The array containing the nodal position array. + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; + + /// The array containing the nodal pressure array. + arrayView1d< real32 const > const m_p_n; + + /// The array containing the product of the stiffness matrix and the nodal pressure. + arrayView1d< real32 > const m_stiffnessVector; + + /// The array containing the cell-wise density + arrayView1d< real32 const > const m_density; + + /// The time increment for this time integration step. + real64 const m_dt; + + +}; + + + +/// The factory used to construct a ExplicitAcousticWaveEquation kernel. +using ExplicitAcousticSEMFactory = finiteElement::KernelFactory< ExplicitAcousticSEM, + real64 >; + + +} // namespace acousticWaveEquationSEMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index 903809d893b..8901bea6a47 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -141,7 +141,7 @@ DECLARE_FIELD( AcousticVelocity, DECLARE_FIELD( AcousticDensity, "acousticDensity", array1d< real32 >, - 0, + 1, NOPLOT, WRITE_AND_READ, "Medium density of the cell" ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp new file mode 100644 index 00000000000..811fcef0f3f --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp @@ -0,0 +1,160 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticMatricesSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticMatricesSEM +{ + + template< typename FE_TYPE > + struct MassMatrix + { + + MassMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + /** + * @brief Launches the precomputation of the mass matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @tparam FE_TYPE the type of discretization + * @param[in] finiteElement The finite element discretization used + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] density cell-wise density + * @param[out] mass diagonal of the mass matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeMassMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const mass ) + + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + + real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[ 8 ][ 3 ]; + for( localIndex a = 0; a < 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i = 0; i < 3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) + { + real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); + } + } ); // end loop over element + } + + FE_TYPE const & m_finiteElement; + + }; + template< typename FE_TYPE > + struct DampingMatrix + { + + DampingMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the damping matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToFaces map from elements to faces + * @param[in] facesToNodes map from face to nodes + * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise + * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise + * @param[in] velocity cell-wise velocity + * @param[in] density cell-wise density + * @param[out] damping diagonal of the damping matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeDampingMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const > const elemsToFaces, + ArrayOfArraysView< localIndex const > const facesToNodes, + arrayView1d< integer const > const facesDomainBoundaryIndicator, + arrayView1d< localIndex const > const freeSurfaceFaceIndicator, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const damping ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) + { + localIndex const f = elemsToFaces( e, i ); + // face on the domain boundary and not on free surface + if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) + { + // only the four corners of the mesh face are needed to compute the Jacobian + real64 xLocal[ 4 ][ 3 ]; + for( localIndex a = 0; a < 4; ++a ) + { + localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); + for( localIndex d = 0; d < 3; ++d ) + { + xLocal[a][d] = nodeCoords( nodeIndex, d ); + } + } + real32 const alpha = 1.0 / (density[e] * velocity[e]); + constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + for( localIndex q = 0; q < numNodesPerFace; ++q ) + { + real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); + } + } + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..d656fbaa803 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp @@ -0,0 +1,168 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + + + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML + * @param[in] dt time-step + * @param[out] p_np1 pressure array at time n+1 (updated here) + * @param[in] p_n pressure array at time n + * @param[in] p_nm1 pressure array at time n-1 + * @param[in] mass the mass matrix + * @param[in] stiffnessVector array containing the product of the stiffness matrix R and the pressure at time n + * @param[in] damping the damping matrix + * @param[in] rhs the right-hand-side + * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void LeapFrogWithoutPML( real64 const dt, + arrayView1d< real32 > const p_np1, + arrayView1d< real32 > const p_n, + arrayView1d< real32 > const p_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 > const stiffnessVector, + arrayView1d< real32 const > const damping, + arrayView1d< real32 > const rhs, + arrayView1d< localIndex const > const freeSurfaceNodeIndicator, + SortedArrayView< localIndex const > const solverTargetNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + if( freeSurfaceNodeIndicator[a] != 1 ) + { + p_np1[a] = p_n[a]; + p_np1[a] *= 2.0 * mass[a]; + p_np1[a] -= (mass[a] - 0.5 * dt * damping[a]) * p_nm1[a]; + p_np1[a] += dt2 * (rhs[a] - stiffnessVector[a]); + p_np1[a] /= mass[a] + 0.5 * dt * damping[a]; + } + } ); + + }; + + /** + * @brief Apply second order Leap-Frog time scheme for VTI case without PML + * @param[in] size The number of nodes in the nodeManager + * @param[in] dt time-step + * @param[out] p_np1 pressure array at time n+1 (updated here) + * @param[in] p_n pressure array at time n + * @param[in] p_nm1 pressure array at time n-1 + * @param[out] q_np1 auxiliary pressure array at time n+1 (updated here) + * @param[in] q_n auxiliary pressure array at time n + * @param[in] q_nm1 auxiliary pressure array at time n-1 + * @param[in] mass the mass matrix + * @param[in] stiffnessVector_p array containing the product of the stiffness matrix R and the pressure at time n + * @param[in] stiffnessVector_q array containing the product of the stiffness matrix R and the auxiliary pressure at time n + * @param[in] damping_p the damping matrix + * @param[in] damping_pq the damping matrix + * @param[in] damping_q the damping matrix + * @param[in] damping_qp the damping matrix + * @param[in] rhs the right-hand-side + * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not + * @param[in] lateralSurfaceNodeIndicator array which contains indicators to tell if we are on a lateral boundary or not + * @param[in] bottomSurfaceNodeIndicator array which contains indicators to telle if we are on the bottom boundary or not + */ + static void LeapFrogforVTI( localIndex const size, + real64 const dt, + arrayView1d< real32 > const p_np1, + arrayView1d< real32 > const p_n, + arrayView1d< real32 > const p_nm1, + arrayView1d< real32 > const q_np1, + arrayView1d< real32 > const q_n, + arrayView1d< real32 > const q_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 > const stiffnessVector_p, + arrayView1d< real32 > const stiffnessVector_q, + arrayView1d< real32 const > const damping_p, + arrayView1d< real32 const > const damping_pq, + arrayView1d< real32 const > const damping_q, + arrayView1d< real32 const > const damping_qp, + arrayView1d< real32 > const rhs, + arrayView1d< localIndex const > const freeSurfaceNodeIndicator, + arrayView1d< localIndex const > const lateralSurfaceNodeIndicator, + arrayView1d< localIndex const > const bottomSurfaceNodeIndicator ) + + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + if( freeSurfaceNodeIndicator[a] != 1 ) + { + p_np1[a] = 2.0*mass[a]*p_n[a]/dt2; + p_np1[a] -= mass[a]*p_nm1[a]/dt2; + p_np1[a] += stiffnessVector_p[a]; + p_np1[a] += rhs[a]; + + q_np1[a] = 2.0*mass[a]*q_n[a]/dt2; + q_np1[a] -= mass[a]*q_nm1[a]/dt2; + q_np1[a] += stiffnessVector_q[a]; + q_np1[a] += rhs[a]; + + if( lateralSurfaceNodeIndicator[a] != 1 && bottomSurfaceNodeIndicator[a] != 1 ) + { + // Interior node, no boundary terms + p_np1[a] /= mass[a]/dt2; + q_np1[a] /= mass[a]/dt2; + } + else + { + // Boundary node + p_np1[a] += damping_p[a]*p_nm1[a]/dt/2; + p_np1[a] += damping_pq[a]*q_nm1[a]/dt/2; + + q_np1[a] += damping_q[a]*q_nm1[a]/dt/2; + q_np1[a] += damping_qp[a]*p_nm1[a]/dt/2; + // Hand-made Inversion of 2x2 matrix + real32 coef_pp = mass[a]/dt2; + coef_pp += damping_p[a]/dt/2; + real32 coef_pq = damping_pq[a]/dt/2; + + real32 coef_qq = mass[a]/dt2; + coef_qq += damping_q[a]/2/dt; + real32 coef_qp = damping_qp[a]/dt/2; + + real32 det_pq = 1/(coef_pp * coef_qq - coef_pq*coef_qp); + + real32 aux_p_np1 = p_np1[a]; + p_np1[a] = det_pq*(coef_qq*p_np1[a] - coef_pq*q_np1[a]); + q_np1[a] = det_pq*(coef_pp*q_np1[a] - coef_qp*aux_p_np1); + } + } + } ); + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp similarity index 88% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index 590cfd0f084..3686bc52d71 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -18,7 +18,9 @@ #include "AcousticElasticWaveEquationSEM.hpp" #include "AcousticElasticWaveEquationSEMKernel.hpp" +#include "AcoustoElasticTimeSchemeSEMKernel.hpp" #include "dataRepository/Group.hpp" +#include "mesh/DomainPartition.hpp" #include #include @@ -67,7 +69,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, - arrayView1d< string const > const & GEOS_UNUSED_PARAM( regionNames ) ) + arrayView1d< string const > const & ) { NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); @@ -76,6 +78,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView2d< real64 const > const faceNormals = faceManager.faceNormal().toViewConst(); + arrayView2d< real64 const > const faceCenters = faceManager.faceCenter().toViewConst(); ArrayOfArraysView< localIndex const > const faceToNode = faceManager.nodeList().toViewConst(); arrayView2d< localIndex const > const faceToSubRegion = faceManager.elementSubRegionList(); arrayView2d< localIndex const > const faceToRegion = faceManager.elementRegionList(); @@ -96,6 +99,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups { finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); + arrayView2d< real64 const > const elemCenters = elementSubRegion.getElementCenter().toViewConst(); finiteElement::FiniteElementDispatchHandler< SEM_FE_TYPES >::dispatch3D( fe, [&] ( auto const finiteElement ) { @@ -111,6 +115,8 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups faceToElement, faceToNode, faceNormals, + faceCenters, + elemCenters, couplingVectorx, couplingVectory, couplingVectorz ); @@ -134,7 +140,7 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, - arrayView1d< string const > const & GEOS_UNUSED_PARAM( regionNames ) ) + arrayView1d< string const > const & ) { NodeManager & nodeManager = mesh.getNodeManager(); @@ -150,6 +156,7 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, arrayView1d< real32 const > const ux_n = nodeManager.getField< elasticfields::Displacementx_n >(); arrayView1d< real32 const > const uy_n = nodeManager.getField< elasticfields::Displacementy_n >(); arrayView1d< real32 const > const uz_n = nodeManager.getField< elasticfields::Displacementz_n >(); + // acoutic -> elastic coupling vectors arrayView1d< real32 const > const atoex = nodeManager.getField< acoustoelasticfields::CouplingVectorx >(); arrayView1d< real32 const > const atoey = nodeManager.getField< acoustoelasticfields::CouplingVectory >(); arrayView1d< real32 const > const atoez = nodeManager.getField< acoustoelasticfields::CouplingVectorz >(); @@ -159,43 +166,28 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - real32 const dt2 = pow( dt, 2 ); - elasSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); - forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) - { - localIndex const a = interfaceNodesSet[n]; - if( elasticFSNodeIndicator[a] == 1 ) - return; - - real32 const aux = -p_n[a] / elasticMass[a]; - real32 const localIncrementx = dt2 * atoex[a] * aux; - real32 const localIncrementy = dt2 * atoey[a] * aux; - real32 const localIncrementz = dt2 * atoez[a] * aux; - - RAJA::atomicAdd< ATOMIC_POLICY >( &ux_np1[a], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &uy_np1[a], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &uz_np1[a], localIncrementz ); - } ); + AcoustoElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, uy_np1, uz_np1, p_n, elasticMass, atoex, atoey, atoez, + elasticFSNodeIndicator, interfaceNodesSet ); elasSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); acousSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); - forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const in ) { - localIndex const a = interfaceNodesSet[n]; - if( acousticFSNodeIndicator[a] == 1 ) + localIndex const n = interfaceNodesSet[in]; + if( acousticFSNodeIndicator[n] == 1 ) return; real32 const localIncrement = ( - atoex[a] * ( ux_np1[a] - 2.0 * ux_n[a] + ux_nm1[a] ) + - atoey[a] * ( uy_np1[a] - 2.0 * uy_n[a] + uy_nm1[a] ) + - atoez[a] * ( uz_np1[a] - 2.0 * uz_n[a] + uz_nm1[a] ) - ) / acousticMass[a]; + atoex[n] * ( ux_np1[n] - 2.0 * ux_n[n] + ux_nm1[n] ) + + atoey[n] * ( uy_np1[n] - 2.0 * uy_n[n] + uy_nm1[n] ) + + atoez[n] * ( uz_np1[n] - 2.0 * uz_n[n] + uz_nm1[n] ) + ) / acousticMass[n]; - RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[a], localIncrement ); + RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[n], localIncrement ); } ); acousSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp similarity index 93% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index ea72af060af..31a5a2d7969 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -20,8 +20,8 @@ #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICELASTICWAVEEQUATIONSEM_HPP_ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICELASTICWAVEEQUATIONSEM_HPP_ -#include "physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp" -#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" #include "physicsSolvers/SolverBase.hpp" #include "AcoustoElasticFields.hpp" #include @@ -140,8 +140,8 @@ class AcousticElasticWaveEquationSEM : public CoupledWaveSolver< AcousticWaveEqu string getCatalogName() const override { return catalogName(); } /** - * @brief accessor for the pointer to the solid mechanics solver - * @return a pointer to the solid mechanics solver + * @brief accessor for the pointer to the acoustic solver + * @return a pointer to the acoustic solver */ AcousticWaveEquationSEM * acousticSolver() const { @@ -149,8 +149,8 @@ class AcousticElasticWaveEquationSEM : public CoupledWaveSolver< AcousticWaveEqu } /** - * @brief accessor for the pointer to the flow solver - * @return a pointer to the flow solver + * @brief accessor for the pointer to the elastic solver + * @return a pointer to the elastic solver */ ElasticWaveEquationSEM * elasticSolver() const { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp similarity index 57% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp index 9c3e9f5fbdc..8a9db1426a4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp @@ -37,32 +37,57 @@ struct CouplingKernel { static constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + + /** + * @brief Launches the computation of the coupling vector + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of faces + * @param[in] nodeCoords coordinates of the nodes + * @param[in] fluidRegionIndex Acoustic region + * @param[in] fluidSubRegionIndex Acoustic subregion + * @param[in] faceToSubRegion Array which gives you the subregion on which the face belongs + * @param[in] faceToRegion Array which gives you the region on which the face belongs + * @param[in] faceToElement Array which gives you the element on which the face belongs + * @param[in] facesToNodes Array which gives the nodes on the mesh knowing the face and the local node on an element + * @param[in] faceNormal Normals of the faces + * @param[in] faceCenters Centers of the faces + * @param[in] elemCenters Centers of the elements + * @param[out] couplingVectorx x-component of the coupling vector + * @param[out] couplingVectory y-component of the coupling vector + * @param[out] couplingVectorz z-component of the coupling vector + */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > void launch( localIndex const size, arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - localIndex const regionIndex, - localIndex const subRegionIndex, + localIndex const fluidRegionIndex, + localIndex const fluidSubRegionIndex, arrayView2d< localIndex const > const faceToSubRegion, arrayView2d< localIndex const > const faceToRegion, arrayView2d< localIndex const > const faceToElement, ArrayOfArraysView< localIndex const > const facesToNodes, arrayView2d< real64 const > const faceNormals, + arrayView2d< real64 const > const faceCenters, + arrayView2d< real64 const > const elemCenters, arrayView1d< real32 > const couplingVectorx, arrayView1d< real32 > const couplingVectory, arrayView1d< real32 > const couplingVectorz ) { forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const f ) { - localIndex e0 = faceToElement( f, 0 ), e1 = faceToElement( f, 1 ); - localIndex er0 = faceToRegion( f, 0 ), er1 = faceToRegion( f, 1 ); - localIndex esr0 = faceToSubRegion( f, 0 ), esr1 = faceToSubRegion( f, 1 ); + localIndex const e0 = faceToElement( f, 0 ), e1 = faceToElement( f, 1 ); + localIndex const er0 = faceToRegion( f, 0 ), er1 = faceToRegion( f, 1 ); + localIndex const esr0 = faceToSubRegion( f, 0 ), esr1 = faceToSubRegion( f, 1 ); if( e0 != -1 && e1 != -1 && er0 != er1 ) // an interface is defined as a transition between regions { // check that one of the region is the fluid subregion for the fluid -> solid coupling term - if((er0 == regionIndex && esr0 == subRegionIndex) || (er1 == regionIndex && esr1 == subRegionIndex)) + bool const e0IsFluid = er0 == fluidRegionIndex && esr0 == fluidSubRegionIndex; + bool const e1IsFluid = er1 == fluidRegionIndex && esr1 == fluidSubRegionIndex; + + if( e0IsFluid != e1IsFluid ) // xor: a single element must be fluid { // only the four corners of the mesh face are needed to compute the Jacobian real64 xLocal[ 4 ][ 3 ]; @@ -75,16 +100,23 @@ struct CouplingKernel } } - // determine normal sign for fluid -> solid coupling - localIndex sgn = er0 == regionIndex ? 1 : (er1 == regionIndex ? -1 : 0); + real64 const nx = faceNormals( f, 0 ), ny = faceNormals( f, 1 ), nz = faceNormals( f, 2 ); + + // determine sign to get an outward pointing normal for the fluid -> solid coupling + localIndex const e = e0IsFluid ? e0 : (e1IsFluid ? e1 : -1); // fluid element + localIndex const sgn = ( + (faceCenters( f, 0 ) - elemCenters( e, 0 )) * nx + + (faceCenters( f, 1 ) - elemCenters( e, 1 )) * ny + + (faceCenters( f, 2 ) - elemCenters( e, 2 )) * nz + ) < 0 ? 1 : -1; for( localIndex q = 0; q < numNodesPerFace; ++q ) { real64 const aux = FE_TYPE::computeDampingTerm( q, xLocal ); - real32 const localIncrementx = aux * (sgn * faceNormals( f, 0 )); - real32 const localIncrementy = aux * (sgn * faceNormals( f, 1 )); - real32 const localIncrementz = aux * (sgn * faceNormals( f, 2 )); + real32 const localIncrementx = aux * (sgn * nx); + real32 const localIncrementy = aux * (sgn * ny); + real32 const localIncrementz = aux * (sgn * nz); RAJA::atomicAdd< ATOMIC_POLICY >( &couplingVectorx[facesToNodes( f, q )], localIncrementx ); RAJA::atomicAdd< ATOMIC_POLICY >( &couplingVectory[facesToNodes( f, q )], localIncrementy ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..4676d6174b9 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp @@ -0,0 +1,80 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcoustoElasticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct AcoustoElasticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + using ATOMIC_POLICY = parallelDeviceAtomic; + /** + * @brief Apply second order Leap-Frog time scheme for the coupling condition of elasto-acoustic scheme + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] p_n pressure at time n + * @param[in] elasticMass the mass matrix for the elastic equation + * @param[in] atoex the coupling matrix for x-component + * @param[in] atoey the coupling matrix for y-component + * @param[in] atoez the coupling matrix for z-component + * @param[in] elasticFSNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not (elastic region) + * @param[in] interfaceNodesSet the nodeset containing the nodes belonging to the interface + */ + + static void LeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 const > const p_n, + arrayView1d< real32 const > const elasticMass, + arrayView1d< real32 const > const atoex, + arrayView1d< real32 const > const atoey, + arrayView1d< real32 const > const atoez, + arrayView1d< localIndex const > const elasticFSNodeIndicator, + SortedArrayView< localIndex const > const interfaceNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = interfaceNodesSet[n]; + if( elasticFSNodeIndicator[a] == 1 ) + return; + + real32 const aux = -p_n[a] / elasticMass[a]; + real32 const localIncrementx = dt2 * atoex[a] * aux; + real32 const localIncrementy = dt2 * atoey[a] * aux; + real32 const localIncrementz = dt2 * atoez[a] * aux; + + RAJA::atomicAdd< ATOMIC_POLICY >( &ux_np1[a], localIncrementx ); + RAJA::atomicAdd< ATOMIC_POLICY >( &uy_np1[a], localIncrementy ); + RAJA::atomicAdd< ATOMIC_POLICY >( &uz_np1[a], localIncrementz ); + } ); + + }; + +}; + +} + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp similarity index 92% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 5a2c9e053b8..6d72fb55188 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -25,6 +25,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" +#include "events/EventManager.hpp" namespace geos { @@ -182,7 +185,7 @@ void ElasticFirstOrderWaveEquationSEM::postProcessInput() m_sourceRegion.resize( numSourcesGlobal ); localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); - m_rcvElem.resize( numReceiversGlobal ); + m_receiverElem.resize( numReceiversGlobal ); m_receiverRegion.resize( numReceiversGlobal ); m_displacementxNp1AtReceivers.resize( m_nsamplesSeismoTrace, numReceiversGlobal + 1 ); @@ -221,7 +224,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve arrayView2d< localIndex > const receiverNodeIds = m_receiverNodeIds.toView(); arrayView2d< real64 > const receiverConstants = m_receiverConstants.toView(); arrayView1d< localIndex > const receiverIsLocal = m_receiverIsLocal.toView(); - arrayView1d< localIndex > const rcvElem = m_rcvElem.toView(); + arrayView1d< localIndex > const receiverElem = m_receiverElem.toView(); arrayView1d< localIndex > const receiverRegion = m_receiverRegion.toView(); receiverNodeIds.setValues< serialPolicy >( -1 ); @@ -262,9 +265,9 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - elasticFirstOrderWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, numFacesPerElem, @@ -283,7 +286,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve sourceRegion, receiverCoordinates, receiverIsLocal, - rcvElem, + receiverElem, receiverNodeIds, receiverConstants, receiverRegion, @@ -317,7 +320,7 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou /// get the array of indicators: 1 if the face is on the boundary; 0 otherwise arrayView1d< integer const > const & facesDomainBoundaryIndicator = faceManager.getDomainBoundaryIndicator(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); /// get face to node map @@ -356,29 +359,29 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou { using FE_TYPE = TYPEOFREF( finiteElement ); - elasticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToNodes, - density, - mass ); - - elasticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - faceNormal, - density, - velocityVp, - velocityVs, - dampingx, - dampingy, - dampingz ); + ElasticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + density, + mass ); + + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + faceNormal, + density, + velocityVp, + velocityVs, + dampingx, + dampingy, + dampingz ); } ); } ); } ); @@ -535,6 +538,11 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti { using FE_TYPE = TYPEOFREF( finiteElement ); + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); + elasticFirstOrderWaveEquationSEMKernels:: StressComputation< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > @@ -556,7 +564,7 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti sourceRegion, sourceValue, dt, - cycleNumber, + cycleForSource, stressxx, stressyy, stresszz, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index b96d8697412..dc9939f117b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -21,8 +21,8 @@ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICFIRSTORDERWAVEEQUATIONSEM_HPP_ #include "mesh/MeshFields.hpp" -#include "ElasticFields.hpp" -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp similarity index 51% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index 8ab22a047d1..e831ecf902b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -20,7 +20,7 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICFIRSTORDERWAVEEQUATIONSEMKERNEL_HPP_ #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" namespace geos @@ -30,310 +30,42 @@ namespace geos namespace elasticFirstOrderWaveEquationSEMKernels { -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of face on an element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank array containing the ghost rank - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal array containing the normal of all faces - * @param[in] faceCenter array containing the center of all faces - * @param[in] sourceCoordinates coordinates of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder Order of the Ricker wavelet - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstants constant part of the source terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const regionIndex, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView1d< localIndex > const sourceElem, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView1d< localIndex > const sourceRegion, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView1d< localIndex > const rcvElem, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView1d< localIndex > const receiverRegion, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - sourceIsAccessible[isrc] = 1; - sourceElem[isrc] = k; - sourceRegion[isrc] = regionIndex; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes[k][a]; - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - receiverIsLocal[ircv] = 1; - rcvElem[ircv] = k; - receiverRegion[ircv] = regionIndex; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes[k][a]; - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - } ); - - } -}; - template< typename FE_TYPE > -struct MassMatrixKernel +struct StressComputation { - MassMatrixKernel( FE_TYPE const & finiteElement ) + StressComputation( FE_TYPE const & finiteElement ) : m_finiteElement( finiteElement ) {} /** - * @brief Launches the precomputation of the mass matrices + * @brief Launches the computation of the strain tensor for one iteration * @tparam EXEC_POLICY the execution policy * @tparam ATOMIC_POLICY the atomic policy * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element + * @param[in] regionIndex Index of the subregion * @param[in] nodeCoords coordinates of the nodes * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = density[k] * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes[k][q]], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView2d< real64 const > const faceNormal, - arrayView1d< real32 const > const density, - arrayView1d< real32 const > const velocityVp, - arrayView1d< real32 const > const velocityVs, - arrayView1d< real32 > const dampingx, - arrayView1d< real32 > const dampingy, - arrayView1d< real32 > const dampingz ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); - real32 const localIncrementx = density[e] * (velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ) * aux; - real32 const localIncrementy = density[e] * (velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ) * aux; - real32 const localIncrementz = density[e] * (velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ) * aux; - - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct StressComputation -{ - - StressComputation( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * Add comments + * @param[in] ux_np1 displacement array in the x direction (only used here) + * @param[in] uy_np1 displacement array in the y direction (only used here) + * @param[in] uz_np1 displacement array in the z direction (only used here) + * @param[in] velocityVp P-wavespeed array + * @param[in] velocityVs S-wavespeed array + * @param[in] lambda lambda (Lamé parameter) array + * @param[in] mu mu (Lamé parameter) array + * @param[in] sourceConstants constant part of the source terms + * @param[in] sourceIsLocal flag indicating whether the source is accessible or not + * @param[in] sourceElem element where a source is located + * @param[in] sourceRegion region where the source is located + * @param[in] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] cycleNumber the number of cycle + * @param[out] stressxx xx-component of the strain tensor array (updated here) + * @param[out] stressyy yy-component of the strain tensor array (updated here) + * @param[out] stresszz zz-component of the strain tensor array (updated here) + * @param[out] stressxy xy-component of the strain tensor array (updated here) + * @param[out] stressxz xz-component of the strain tensor array (updated here) + * @param[out] stressyz yz-component of the strain tensor array (updated here) */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > @@ -509,7 +241,27 @@ struct VelocityComputation {} /** - * add doc + * @brief Launches the computation of the displacement for one iteration + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] size_node the number of nodes in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[out] stressxx xx-component of the strain tensor array (only used here) + * @param[out] stressyy yy-component of the strain tensor array (only used here) + * @param[out] stresszz zz-component of the strain tensor array (only used here) + * @param[out] stressxy xy-component of the strain tensor array (only used here) + * @param[out] stressxz xz-component of the strain tensor array (only used here) + * @param[out] stressyz yz-component of the strain tensor array (only used here) + * @param[in] mass the mass matrix + * @param[in] dampingx the damping (x-component) matrix + * @param[in] dampingy the damping for (y-component) matrix + * @param[in] dampingz the damping for (z-component) matrix + * @param[in] dt time-step + * @param[in] ux_np1 displacement array in the x direction (updated here) + * @param[in] uy_np1 displacement array in the y direction (updated here) + * @param[in] uz_np1 displacement array in the z direction (updated here) */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp new file mode 100644 index 00000000000..e5834a0a564 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp @@ -0,0 +1,64 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + + +/** + * @file ElasticVTIFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICVTIFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICVTIFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ + +namespace fields +{ + +namespace elasticvtifields +{ +DECLARE_FIELD( Delta, + "delta", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Delta thomsen anisotropy parameter" ); + +DECLARE_FIELD( Epsilon, + "epsilon", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Epsilon thomsen anisotropy parameter" ); + +DECLARE_FIELD( Gamma, + "gamma", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Gamma thomsen anisotropy parameter" ); + +} + +} + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_WAVEPROPAGATION__HPP_ELASTICVTIFIELDS */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp new file mode 100644 index 00000000000..8905493ee58 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -0,0 +1,293 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticVTIWaveEquationSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ + +#include "finiteElement/kernelInterface/KernelBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" +#include "ElasticVTIFields.hpp" + +namespace geos +{ +using namespace fields; +/// Namespace to contain the elastic wave kernels. +namespace elasticVTIWaveEquationSEMKernels +{ + +/** + * @brief Implements kernels for solving the elastic wave equations + * explicit central FD method and SEM in the Vertical Transverse Isotropic (VTI) case + * @copydoc geos::finiteElement::KernelBase + * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. + * + * ### ElasticVTIWaveEquationSEMKernel Description + * Implements the KernelBase interface functions required for solving + * the acoustic wave equations using the + * "finite element kernel application" functions such as + * geos::finiteElement::RegionBasedKernelApplication. + * + * The number of degrees of freedom per support point for both + * the test and trial spaces are specified as `1`. + */ + + +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ExplicitElasticVTISEM : public finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 > +{ +public: + + /// Alias for the base class; + using Base = finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 >; + + /// Number of nodes per element...which is equal to the + /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + using Base::numDofPerTestSupportPoint; + using Base::numDofPerTrialSupportPoint; + using Base::m_elemsToNodes; + using Base::m_elemGhostRank; + using Base::m_constitutiveUpdate; + using Base::m_finiteElementSpace; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + */ + ExplicitElasticVTISEM( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( elementSubRegion, + finiteElementSpace, + inputConstitutiveType ), + m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), + m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), + m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), + m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), + m_stiffnessVectorx( nodeManager.getField< elasticfields::StiffnessVectorx >() ), + m_stiffnessVectory( nodeManager.getField< elasticfields::StiffnessVectory >() ), + m_stiffnessVectorz( nodeManager.getField< elasticfields::StiffnessVectorz >() ), + m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), + m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), + m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), + m_gamma( elementSubRegion.template getField< elasticvtifields::Gamma >()), + m_epsilon( elementSubRegion.template getField< elasticvtifields::Epsilon >()), + m_delta( elementSubRegion.template getField< elasticvtifields::Delta >()), + m_dt( dt ) + { + GEOS_UNUSED_VAR( edgeManager ); + GEOS_UNUSED_VAR( faceManager ); + GEOS_UNUSED_VAR( targetRegionIndex ); + } + + + + //***************************************************************************** + /** + * @copydoc geos::finiteElement::KernelBase::StackVariables + * + * ### ExplicitElasticVTISEM Description + * Adds a stack arrays for the nodal force, primary displacement variable, etc. + */ + struct StackVariables : Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables(): + xLocal(), + stiffnessVectorxLocal(), + stiffnessVectoryLocal(), + stiffnessVectorzLocal() + {} + /// C-array stack storage for element local the nodal positions. + real64 xLocal[ 8 ][ 3 ]{}; + real32 stiffnessVectorxLocal[ numNodesPerElem ]; + real32 stiffnessVectoryLocal[ numNodesPerElem ]; + real32 stiffnessVectorzLocal[ numNodesPerElem ]; + real32 Cvti[6]; + + }; + //*************************************************************************** + + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + for( localIndex a=0; a< 8; a++ ) + { + localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( int i=0; i< 3; ++i ) + { + stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; + } + } + + stack.Cvti[0] = m_density[k] * pow( m_velocityVp[k], 2 ) * (1.0 + 2.0*m_epsilon[k]); + stack.Cvti[1] = m_density[k] * pow( m_velocityVp[k], 2 ); + stack.Cvti[2] = m_density[k] * + sqrt( pow((pow( m_velocityVp[k], + 2 ) - pow( m_velocityVs[k], 2 )), + 2 ) + 2.0 * pow( m_velocityVp[k], 2 ) * m_delta[k] * (pow( m_velocityVp[k], 2 ) - pow( m_velocityVs[k], 2 )) ) - m_density[k] * pow( + m_velocityVs[k], 2 ); + stack.Cvti[3] = m_density[k] * pow( m_velocityVs[k], 2 ); + stack.Cvti[4] = m_density[k] * pow( m_velocityVs[k], 2 )*(1.0 + 2.0 * m_gamma[k]); + stack.Cvti[5] = stack.Cvti[0] - 2.0 * stack.Cvti[4]; + + } + + /** + * @copydoc geos::finiteElement::KernelBase::complete + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + real64 complete( localIndex const k, + StackVariables & stack ) const + { + for( int i=0; i( &m_stiffnessVectorx[ nodeIndex ], stack.stiffnessVectorxLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectory[ nodeIndex ], stack.stiffnessVectoryLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectorz[ nodeIndex ], stack.stiffnessVectorzLocal[ i ] ); + } + return 0; + } + + /** + * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel + * + * ### ExplicitElasticVTISEM Description + * Calculates stiffness vector + * + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + void quadraturePointKernel( localIndex const k, + localIndex const q, + StackVariables & stack ) const + { + + m_finiteElementSpace.template computeFirstOrderStiffnessTerm( q, stack.xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) + { + real32 const Rxx_ij = val*(stack.Cvti[0]*J[p][0]*J[r][0]+stack.Cvti[4]*(J[p][1]*J[r][1])+stack.Cvti[3]*(J[p][2]*J[r][2])); + real32 const Ryy_ij = val*(stack.Cvti[0]*J[p][1]*J[r][1]+stack.Cvti[4]*(J[p][0]*J[r][0])+stack.Cvti[3]*(J[p][2]*J[r][2])); + real32 const Rzz_ij = val*(stack.Cvti[1]*J[p][2]*J[r][2]+stack.Cvti[3]*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); + real32 const Rxy_ij = val*(stack.Cvti[5]*J[p][0]*J[r][1]+stack.Cvti[4]*J[p][1]*J[r][0]); + real32 const Ryx_ij = val*(stack.Cvti[4]*J[p][0]*J[r][1]+stack.Cvti[5]*J[p][1]*J[r][0]); + real32 const Rxz_ij = val*(stack.Cvti[2]*J[p][0]*J[r][2]+stack.Cvti[3]*J[p][2]*J[r][0]); + real32 const Rzx_ij = val*(stack.Cvti[3]*J[p][0]*J[r][2]+stack.Cvti[2]*J[p][2]*J[r][0]); + real32 const Ryz_ij = val*(stack.Cvti[2]*J[p][1]*J[r][2]+stack.Cvti[3]*J[p][2]*J[r][1]); + real32 const Rzy_ij = val*(stack.Cvti[3]*J[p][1]*J[r][2]+stack.Cvti[2]*J[p][2]*J[r][1]); + + real32 const localIncrementx = (Rxx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rxy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rxz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementy = (Ryx_ij * m_ux_n[m_elemsToNodes( k, j )] + Ryy_ij*m_uy_n[m_elemsToNodes( k, j )] + Ryz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementz = (Rzx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rzy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rzz_ij*m_uz_n[m_elemsToNodes( k, j )]); + + stack.stiffnessVectorxLocal[ i ] += localIncrementx; + stack.stiffnessVectoryLocal[ i ] += localIncrementy; + stack.stiffnessVectorzLocal[ i ] += localIncrementz; + } ); + } + + +protected: + /// The array containing the nodal position array. + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; + + /// The array containing the nodal displacement array in x direction. + arrayView1d< real32 > const m_ux_n; + + /// The array containing the nodal displacement array in y direction. + arrayView1d< real32 > const m_uy_n; + + /// The array containing the nodal displacement array in z direction. + arrayView1d< real32 > const m_uz_n; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorx; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectory; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorz; + + /// The array containing the density of the medium + arrayView1d< real32 const > const m_density; + + /// The array containing the P-wavespeed + arrayView1d< real32 const > const m_velocityVp; + + /// The array containing the S-wavespeed + arrayView1d< real32 const > const m_velocityVs; + + ///The array containing the Thomsen constant gamma + arrayView1d< real32 const > const m_gamma; + + ///The array containing the Thomsen constant epsilon + arrayView1d< real32 const > const m_epsilon; + + ///The array containing the Thomsen constant delta + arrayView1d< real32 const > const m_delta; + + /// The time increment for this time integration step. + real64 const m_dt; + + +}; + + +/// The factory used to construct a ExplicitAcousticWaveEquation kernel. +using ExplicitElasticVTISEMFactory = finiteElement::KernelFactory< ExplicitElasticVTISEM, + real64 >; + +} // namespace elasticVTIWaveEquationSEMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp similarity index 76% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 1d9e8fed402..669d9e43184 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -19,13 +19,18 @@ #include "ElasticWaveEquationSEM.hpp" #include "ElasticWaveEquationSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "finiteElement/FiniteElementDiscretization.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp" +#include "events/EventManager.hpp" namespace geos { @@ -87,6 +92,13 @@ ElasticWaveEquationSEM::ElasticWaveEquationSEM( const std::string & name, setApplyDefaultValue( { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 } ). setDescription( "Moment of the source: 6 real values describing a symmetric tensor in Voigt notation." "The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion)." ); + + + registerWrapper( viewKeyStruct::useVtiString(), &m_useVTI ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( 0 ). + setDescription( "Flag to apply VTI anisotropy. The default is to use isotropic physic." ); } ElasticWaveEquationSEM::~ElasticWaveEquationSEM() @@ -144,6 +156,20 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) elasticfields::StiffnessVectorz, elasticfields::ElasticFreeSurfaceNodeIndicator >( getName() ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + integer l = m_slsReferenceAngularFrequencies.size( 0 ); + nodeManager.registerField< elasticfields::DivPsix, + elasticfields::DivPsiy, + elasticfields::DivPsiz, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz >( getName() ); + nodeManager.getField< elasticfields::DivPsix >().resizeDimension< 1 >( l ); + nodeManager.getField< elasticfields::DivPsiy >().resizeDimension< 1 >( l ); + nodeManager.getField< elasticfields::DivPsiz >().resizeDimension< 1 >( l ); + } + FaceManager & faceManager = mesh.getFaceManager(); faceManager.registerField< elasticfields::ElasticFreeSurfaceFaceIndicator >( getName() ); @@ -154,6 +180,18 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< elasticfields::ElasticVelocityVp >( getName() ); subRegion.registerField< elasticfields::ElasticVelocityVs >( getName() ); subRegion.registerField< elasticfields::ElasticDensity >( getName() ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + subRegion.registerField< elasticfields::ElasticQualityFactorP >( getName() ); + subRegion.registerField< elasticfields::ElasticQualityFactorS >( getName() ); + } + + if( m_useVTI ) + { + subRegion.registerField< elasticvtifields::Gamma >( getName() ); + subRegion.registerField< elasticvtifields::Epsilon >( getName() ); + subRegion.registerField< elasticvtifields::Delta >( getName() ); + } } ); } ); @@ -165,34 +203,6 @@ void ElasticWaveEquationSEM::postProcessInput() { WaveSolverBase::postProcessInput(); - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & maxTime = event.getReference< real64 >( EventManager::viewKeyStruct::maxTimeString() ); - real64 dt = 0; - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - - GEOS_THROW_IF( dt < epsilonLoc*maxTime, getDataContext() << ": Value for dt: " << dt <<" is smaller than local threshold: " << epsilonLoc, std::runtime_error ); - - if( m_dtSeismoTrace > 0 ) - { - m_nsamplesSeismoTrace = int( maxTime / m_dtSeismoTrace ) + 1; - } - else - { - m_nsamplesSeismoTrace = 0; - } - localIndex const nsamples = int( maxTime / dt ) + 1; - - localIndex const numSourcesGlobal = m_sourceCoordinates.size( 0 ); - m_sourceIsAccessible.resize( numSourcesGlobal ); - m_sourceValue.resize( nsamples, numSourcesGlobal ); - if( m_useDAS == WaveSolverUtils::DASType::none ) { localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); @@ -276,9 +286,9 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, using FE_TYPE = TYPEOFREF( finiteElement ); localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - elasticWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute3DSourceAndReceiverConstantsWithDAS + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), numFacesPerElem, X, @@ -400,35 +410,76 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { using FE_TYPE = TYPEOFREF( finiteElement ); - elasticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToNodes, - density, - mass ); - - elasticWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - faceNormal, - density, - velocityVp, - velocityVs, - dampingx, - dampingy, - dampingz ); + ElasticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + density, + mass ); + + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + faceNormal, + density, + velocityVp, + velocityVs, + dampingx, + dampingy, + dampingz ); } ); } ); + + // check anelasticity coefficient and/or compute it if needed + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + real32 minQVal = computeGlobalMinQFactor(); + if( m_slsAnelasticityCoefficients.size( 0 ) == 1 && m_slsAnelasticityCoefficients[ 0 ] < 0 ) + { + m_slsAnelasticityCoefficients[ 0 ] = 2.0 * minQVal / ( minQVal - 1.0 ); + } + // test if anelasticity is too high and artifacts could appear + real32 ySum = 0.0; + for( integer l = 0; l < m_slsAnelasticityCoefficients.size( 0 ); l++ ) + { + ySum += m_slsAnelasticityCoefficients[ l ]; + } + GEOS_WARNING_IF( ySum > minQVal, "The anelasticity parameters are too high for the given quality factor. This could lead to solution artifacts such as zero-velocity waves." ); + } + } ); WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); WaveSolverUtils::initTrace( "dasTraceReceiver", getName(), m_outputSeismoTrace, m_linearDASGeometry.size( 0 ), m_receiverIsLocal ); } +real32 ElasticWaveEquationSEM::computeGlobalMinQFactor() +{ + RAJA::ReduceMin< ReducePolicy< EXEC_POLICY >, real32 > minQ( LvArray::NumericLimits< real32 >::max ); + DomainPartition & domain = getGroupByPath< DomainPartition >( "/Problem/domain" ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, + CellElementSubRegion & elementSubRegion ) + { + arrayView1d< real32 const > const qp = elementSubRegion.getField< elasticfields::ElasticQualityFactorP >(); + arrayView1d< real32 const > const qs = elementSubRegion.getField< elasticfields::ElasticQualityFactorS >(); + forAll< EXEC_POLICY >( elementSubRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const e ) { + minQ.min( qp[e] ); + minQ.min( qs[e] ); + } ); + } ); + } ); + real32 minQVal = minQ.get(); + return MpiWrapper::min< real32 >( minQVal ); +} void ElasticWaveEquationSEM::applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) { @@ -554,51 +605,79 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - /// get array of indicators: 1 if node on free surface; 0 otherwise - arrayView1d< localIndex const > const freeSurfaceNodeIndicator = nodeManager.getField< elasticfields::ElasticFreeSurfaceNodeIndicator >(); - arrayView1d< real32 > const rhsx = nodeManager.getField< elasticfields::ForcingRHSx >(); arrayView1d< real32 > const rhsy = nodeManager.getField< elasticfields::ForcingRHSy >(); arrayView1d< real32 > const rhsz = nodeManager.getField< elasticfields::ForcingRHSz >(); - auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dt ); + if( m_useVTI ) + { + auto kernelFactory = elasticVTIWaveEquationSEMKernels::ExplicitElasticVTISEMFactory( dt ); + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } + else + { + auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dt ); + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } - finiteElement:: - regionBasedKernelApplication< EXEC_POLICY, - constitutive::NullModel, - CellElementSubRegion >( mesh, - regionNames, - getDiscretizationName(), - "", - kernelFactory ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticAttenuativeSEMFactory( dt ); + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); - addSourceToRightHandSide( cycleNumber, rhsx, rhsy, rhsz ); + addSourceToRightHandSide( cycleForSource, rhsx, rhsy, rhsz ); - real64 const dt2 = pow( dt, 2 ); SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); - forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) { - localIndex const a = solverTargetNodesSet[n]; - if( freeSurfaceNodeIndicator[a] != 1 ) - { - ux_np1[a] = ux_n[a]; - ux_np1[a] *= 2.0*mass[a]; - ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; - ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); - ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; - uy_np1[a] = uy_n[a]; - uy_np1[a] *= 2.0*mass[a]; - uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; - uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); - uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; - uz_np1[a] = uz_n[a]; - uz_np1[a] *= 2.0*mass[a]; - uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; - uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); - uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; - } - } ); + arrayView1d< real32 > const stiffnessVectorAx = nodeManager.getField< elasticfields::StiffnessVectorAx >(); + arrayView1d< real32 > const stiffnessVectorAy = nodeManager.getField< elasticfields::StiffnessVectorAy >(); + arrayView1d< real32 > const stiffnessVectorAz = nodeManager.getField< elasticfields::StiffnessVectorAz >(); + arrayView2d< real32 > const divpsix = nodeManager.getField< elasticfields::DivPsix >(); + arrayView2d< real32 > const divpsiy = nodeManager.getField< elasticfields::DivPsiy >(); + arrayView2d< real32 > const divpsiz = nodeManager.getField< elasticfields::DivPsiz >(); + arrayView1d< real32 > const referenceFrequencies = m_slsReferenceAngularFrequencies.toView(); + arrayView1d< real32 > const anelasticityCoefficients = m_slsAnelasticityCoefficients.toView(); + ElasticTimeSchemeSEM::AttenuationLeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, + divpsix, divpsiy, divpsiz, + mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, + stiffnessVectorz, stiffnessVectorAx, stiffnessVectorAy, stiffnessVectorAz, + rhsx, rhsy, rhsz, solverTargetNodesSet, + referenceFrequencies, anelasticityCoefficients ); + } + else + { + ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, + mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, + stiffnessVectorz, rhsx, rhsy, rhsz, solverTargetNodesSet ); + } } void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, @@ -610,13 +689,6 @@ void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, { NodeManager & nodeManager = mesh.getNodeManager(); - arrayView1d< real32 > const stiffnessVectorx = nodeManager.getField< elasticfields::StiffnessVectorx >(); - arrayView1d< real32 > const stiffnessVectory = nodeManager.getField< elasticfields::StiffnessVectory >(); - arrayView1d< real32 > const stiffnessVectorz = nodeManager.getField< elasticfields::StiffnessVectorz >(); - - arrayView1d< real32 > const ux_nm1 = nodeManager.getField< elasticfields::Displacementx_nm1 >(); - arrayView1d< real32 > const uy_nm1 = nodeManager.getField< elasticfields::Displacementy_nm1 >(); - arrayView1d< real32 > const uz_nm1 = nodeManager.getField< elasticfields::Displacementz_nm1 >(); arrayView1d< real32 > const ux_n = nodeManager.getField< elasticfields::Displacementx_n >(); arrayView1d< real32 > const uy_n = nodeManager.getField< elasticfields::Displacementy_n >(); arrayView1d< real32 > const uz_n = nodeManager.getField< elasticfields::Displacementz_n >(); @@ -624,14 +696,15 @@ void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - arrayView1d< real32 > const rhsx = nodeManager.getField< elasticfields::ForcingRHSx >(); - arrayView1d< real32 > const rhsy = nodeManager.getField< elasticfields::ForcingRHSy >(); - arrayView1d< real32 > const rhsz = nodeManager.getField< elasticfields::ForcingRHSz >(); - /// synchronize displacement fields FieldIdentifiers fieldsToBeSync; fieldsToBeSync.addFields( FieldLocation::Node, { elasticfields::Displacementx_np1::key(), elasticfields::Displacementy_np1::key(), elasticfields::Displacementz_np1::key() } ); + if( m_slsReferenceAngularFrequencies.size( 0 ) > 0 ) + { + fieldsToBeSync.addFields( FieldLocation::Node, { elasticfields::DivPsix::key(), elasticfields::DivPsiy::key(), elasticfields::DivPsiz::key() } ); + } + CommunicationTools & syncFields = CommunicationTools::getInstance(); syncFields.synchronizeFields( fieldsToBeSync, domain.getMeshBody( 0 ).getMeshLevel( m_discretizationName ), @@ -696,6 +769,17 @@ void ElasticWaveEquationSEM::prepareNextTimestep( MeshLevel & mesh ) stiffnessVectorx[a] = stiffnessVectory[a] = stiffnessVectorz[a] = 0.0; rhsx[a] = rhsy[a] = rhsz[a] = 0.0; } ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + arrayView1d< real32 > const stiffnessVectorAx = nodeManager.getField< elasticfields::StiffnessVectorAx >(); + arrayView1d< real32 > const stiffnessVectorAy = nodeManager.getField< elasticfields::StiffnessVectorAy >(); + arrayView1d< real32 > const stiffnessVectorAz = nodeManager.getField< elasticfields::StiffnessVectorAz >(); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + stiffnessVectorAx[a] = stiffnessVectorAy[a] = stiffnessVectorAz[a] = 0.0; + } ); + } } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp similarity index 94% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 74d58e3cfd0..511c6b599ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -20,10 +20,10 @@ #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEM_HPP_ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEM_HPP_ -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "ElasticFields.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" namespace geos { @@ -121,6 +121,8 @@ class ElasticWaveEquationSEM : public WaveSolverBase static constexpr char const * sourceForceString() { return "sourceForce"; } static constexpr char const * sourceMomentString() { return "sourceMoment"; } + static constexpr char const * useVtiString() { return "useVTI"; } + } waveEquationViewKeys; @@ -152,6 +154,13 @@ class ElasticWaveEquationSEM : public WaveSolverBase arrayView1d< string const > const & regionNames ); void prepareNextTimestep( MeshLevel & mesh ); + + /** + * @brief Computes the minimum attenuation quality factor over all the mesh. This is useful for computing anelasticity coefficients, which + * are usually global parameters + */ + real32 computeGlobalMinQFactor(); + protected: virtual void postProcessInput() override final; @@ -214,6 +223,9 @@ class ElasticWaveEquationSEM : public WaveSolverBase /// Symmetric tensor describing the moment of the source R2SymTensor m_sourceMoment; + /// Flag to appliy VTI anisotropy + integer m_useVTI; + }; } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp new file mode 100644 index 00000000000..c17dc27a5ef --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -0,0 +1,352 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticWaveEquationSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ + +#include "finiteElement/kernelInterface/KernelBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" + +namespace geos +{ +using namespace fields; +/// Namespace to contain the elastic wave kernels. +namespace elasticWaveEquationSEMKernels +{ + +/** + * @brief Implements kernels for solving the elastic wave equations + * explicit central FD method and SEM + * @copydoc geos::finiteElement::KernelBase + * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. + * + * ### ElasticWaveEquationSEMKernel Description + * Implements the KernelBase interface functions required for solving + * the acoustic wave equations using the + * "finite element kernel application" functions such as + * geos::finiteElement::RegionBasedKernelApplication. + * + * The number of degrees of freedom per support point for both + * the test and trial spaces are specified as `1`. + */ + + +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE, + typename SX = elasticfields::StiffnessVectorx, typename SY = elasticfields::StiffnessVectory, typename SZ = elasticfields::StiffnessVectorz > +class ExplicitElasticSEMBase : public finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 > +{ +public: + + /// Alias for the base class; + using Base = finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 >; + + /// Number of nodes per element...which is equal to the + /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + using Base::numDofPerTestSupportPoint; + using Base::numDofPerTrialSupportPoint; + using Base::m_elemsToNodes; + using Base::m_elemGhostRank; + using Base::m_constitutiveUpdate; + using Base::m_finiteElementSpace; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + */ + ExplicitElasticSEMBase( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( elementSubRegion, + finiteElementSpace, + inputConstitutiveType ), + m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), + m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), + m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), + m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), + m_stiffnessVectorx( nodeManager.getField< SX >() ), + m_stiffnessVectory( nodeManager.getField< SY >() ), + m_stiffnessVectorz( nodeManager.getField< SZ >() ), + m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), + m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), + m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), + m_dt( dt ) + { + GEOS_UNUSED_VAR( edgeManager ); + GEOS_UNUSED_VAR( faceManager ); + GEOS_UNUSED_VAR( targetRegionIndex ); + } + + + //***************************************************************************** + /** + * @copydoc geos::finiteElement::KernelBase::StackVariables + * + * ### ExplicitElasticSEMBase Description + * Adds a stack arrays for the nodal force, primary displacement variable, etc. + */ + struct StackVariables : Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables(): + xLocal(), + stiffnessVectorxLocal(), + stiffnessVectoryLocal(), + stiffnessVectorzLocal() + {} + /// C-array stack storage for element local the nodal positions. + real64 xLocal[ 8 ][ 3 ]{}; + real32 stiffnessVectorxLocal[ numNodesPerElem ]; + real32 stiffnessVectoryLocal[ numNodesPerElem ]; + real32 stiffnessVectorzLocal[ numNodesPerElem ]; + real32 mu=0; + real32 lambda=0; + }; + //*************************************************************************** + + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + for( localIndex a=0; a< 8; a++ ) + { + localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( int i=0; i< 3; ++i ) + { + stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; + } + } + stack.mu = m_density[k] * pow( m_velocityVs[k], 2 ); + stack.lambda = m_density[k] * pow( m_velocityVp[k], 2 ) - 2.0 * stack.mu; + } + + /** + * @copydoc geos::finiteElement::KernelBase::complete + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + real64 complete( localIndex const k, + StackVariables & stack ) const + { + for( int i=0; i( &m_stiffnessVectorx[ nodeIndex ], stack.stiffnessVectorxLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectory[ nodeIndex ], stack.stiffnessVectoryLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectorz[ nodeIndex ], stack.stiffnessVectorzLocal[ i ] ); + } + return 0; + } + + /** + * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel + * + * ### ExplicitElasticSEMBase Description + * Calculates stiffness vector + * + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + void quadraturePointKernel( localIndex const k, + localIndex const q, + StackVariables & stack ) const + { + + m_finiteElementSpace.template computeFirstOrderStiffnessTerm( q, stack.xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) + { + real32 const Rxx_ij = val*((stack.lambda+2.0*stack.mu)*J[p][0]*J[r][0]+stack.mu*(J[p][1]*J[r][1]+J[p][2]*J[r][2])); + real32 const Ryy_ij = val*((stack.lambda+2.0*stack.mu)*J[p][1]*J[r][1]+stack.mu*(J[p][0]*J[r][0]+J[p][2]*J[r][2])); + real32 const Rzz_ij = val*((stack.lambda+2.0*stack.mu)*J[p][2]*J[r][2]+stack.mu*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); + real32 const Rxy_ij = val*(stack.lambda*J[p][0]*J[r][1]+stack.mu*J[p][1]*J[r][0]); + real32 const Ryx_ij = val*(stack.mu*J[p][0]*J[r][1]+stack.lambda*J[p][1]*J[r][0]); + real32 const Rxz_ij = val*(stack.lambda*J[p][0]*J[r][2]+stack.mu*J[p][2]*J[r][0]); + real32 const Rzx_ij = val*(stack.mu*J[p][0]*J[r][2]+stack.lambda*J[p][2]*J[r][0]); + real32 const Ryz_ij = val*(stack.lambda*J[p][1]*J[r][2]+stack.mu*J[p][2]*J[r][1]); + real32 const Rzy_ij = val*(stack.mu*J[p][1]*J[r][2]+stack.lambda*J[p][2]*J[r][1]); + + real32 const localIncrementx = (Rxx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rxy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rxz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementy = (Ryx_ij * m_ux_n[m_elemsToNodes( k, j )] + Ryy_ij*m_uy_n[m_elemsToNodes( k, j )] + Ryz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementz = (Rzx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rzy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rzz_ij*m_uz_n[m_elemsToNodes( k, j )]); + + stack.stiffnessVectorxLocal[ i ] += localIncrementx; + stack.stiffnessVectoryLocal[ i ] += localIncrementy; + stack.stiffnessVectorzLocal[ i ] += localIncrementz; + } ); + } + + +protected: + /// The array containing the nodal position array. + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; + + /// The array containing the nodal displacement array in x direction. + arrayView1d< real32 > const m_ux_n; + + /// The array containing the nodal displacement array in y direction. + arrayView1d< real32 > const m_uy_n; + + /// The array containing the nodal displacement array in z direction. + arrayView1d< real32 > const m_uz_n; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorx; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectory; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorz; + + /// The array containing the density of the medium + arrayView1d< real32 const > const m_density; + + /// The array containing the P-wavespeed + arrayView1d< real32 const > const m_velocityVp; + + /// The array containing the S-wavespeed + arrayView1d< real32 const > const m_velocityVs; + + /// The time increment for this time integration step. + real64 const m_dt; + +}; + + +/// Specialization for standard iso elastic kernel +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +using ExplicitElasticSEM = ExplicitElasticSEMBase< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE >; +using ExplicitElasticSEMFactory = finiteElement::KernelFactory< ExplicitElasticSEM, + real64 >; +/// Specialization for attenuation kernel +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ExplicitElasticAttenuativeSEM : public ExplicitElasticSEMBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz > +{ +public: + + /// Alias for the base class; + using Base = ExplicitElasticSEMBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz >; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + */ + ExplicitElasticAttenuativeSEM( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + dt ), + m_qualityFactorP( elementSubRegion.template getField< elasticfields::ElasticQualityFactorP >() ), + m_qualityFactorS( elementSubRegion.template getField< elasticfields::ElasticQualityFactorS >() ) + {} + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + typename Base::StackVariables & stack ) const + { + Base::setup( k, stack ); + real64 lambdap2mua= (stack.lambda + 2.0 * stack.mu ) / m_qualityFactorP[ k ]; + stack.mu = stack.mu / m_qualityFactorS[ k ]; + stack.lambda = (lambdap2mua - 2.0 * stack.mu ); + } + +protected: + + /// The array containing the P-wave attenuation quality factor + arrayView1d< real32 const > const m_qualityFactorP; + + /// The array containing the S-wave attenuation quality factor + arrayView1d< real32 const > const m_qualityFactorS; + +}; + +using ExplicitElasticAttenuativeSEMFactory = finiteElement::KernelFactory< ExplicitElasticAttenuativeSEM, + real64 >; + +} // namespace ElasticWaveEquationSEMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp similarity index 81% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp index 8669c653534..a7ff2c600ac 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp @@ -104,6 +104,30 @@ DECLARE_FIELD( Displacementz_np1, WRITE_AND_READ, "z-component of displacement at time n+1." ); +DECLARE_FIELD( DivPsix, + "divpsix", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "x-component of memory variables for attenuation." ); + +DECLARE_FIELD( DivPsiy, + "divpsiy", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "y-component of memory variables for attenuation." ); + +DECLARE_FIELD( DivPsiz, + "divpsiz", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "z-component of memory variables for attenuation." ); + DECLARE_FIELD( Stresstensorxx, "stresstensorxx", array2d< real32 >, @@ -216,6 +240,30 @@ DECLARE_FIELD( StiffnessVectorz, WRITE_AND_READ, "z-component of stiffness vector." ); +DECLARE_FIELD( StiffnessVectorAx, + "stiffnessVectorAx", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "x-component of attenuation stiffness vector." ); + +DECLARE_FIELD( StiffnessVectorAy, + "stiffnessVectorAy", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "y-component of attenuation stiffness vector." ); + +DECLARE_FIELD( StiffnessVectorAz, + "stiffnessVectorAz", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "z-component of attenuation stiffness vector." ); + DECLARE_FIELD( DampingVectorx, "dampingVectorx", array1d< real32 >, @@ -264,6 +312,22 @@ DECLARE_FIELD( ElasticDensity, WRITE_AND_READ, "Medium density of the cell" ); +DECLARE_FIELD( ElasticQualityFactorP, + "elasticQualityFactorP", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Quality factor for P-wave attenuation in the cell" ); + +DECLARE_FIELD( ElasticQualityFactorS, + "elasticQualityFactorS", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Quality factor for S-wave attenuation in the cell" ); + DECLARE_FIELD( ElasticFreeSurfaceFaceIndicator, "elasticFreeSurfaceFaceIndicator", array1d< localIndex >, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp new file mode 100644 index 00000000000..575602a53c8 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp @@ -0,0 +1,173 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticMatricesSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ + +namespace geos +{ + +struct ElasticMatricesSEM +{ + template< typename FE_TYPE > + struct MassMatrix + { + + MassMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the mass matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[out] mass diagonal of the mass matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeMassMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const mass ) + + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[ 8 ][ 3 ]; + for( localIndex a = 0; a < 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i = 0; i < 3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + + constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) + { + real32 const localIncrement = density[e] * m_finiteElement.computeMassTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); + } + } ); // end loop over element + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + template< typename FE_TYPE > + struct DampingMatrix + { + + DampingMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the damping matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToFaces map from elements to faces + * @param[in] facesToNodes map from face to nodes + * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise + * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise + * @param[in] faceNormal array containing the normal fo the faces + * @param[in] density cell-wise density + * @param[in] velocityVp cell-wise P-wavespeed + * @param[in] velocityVs cell-wise S-wavespeed + * @param[out] dampingx diagonal of the damping matrix (x-direction) + * @param[out] dampingy diagonal of the damping matrix (y-direction) + * @param[out] dampingz diagonal of the damping matrix (z-direction) + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeDampingMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const > const elemsToFaces, + ArrayOfArraysView< localIndex const > const facesToNodes, + arrayView1d< integer const > const facesDomainBoundaryIndicator, + arrayView1d< localIndex const > const freeSurfaceFaceIndicator, + arrayView2d< real64 const > const faceNormal, + arrayView1d< real32 const > const density, + arrayView1d< real32 const > const velocityVp, + arrayView1d< real32 const > const velocityVs, + arrayView1d< real32 > const dampingx, + arrayView1d< real32 > const dampingy, + arrayView1d< real32 > const dampingz ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) + { + localIndex const f = elemsToFaces( e, i ); + // face on the domain boundary and not on free surface + if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) + { + // only the four corners of the mesh face are needed to compute the Jacobian + real64 xLocal[ 4 ][ 3 ]; + for( localIndex a = 0; a < 4; ++a ) + { + localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); + for( localIndex d = 0; d < 3; ++d ) + { + xLocal[a][d] = nodeCoords( nodeIndex, d ); + } + } + + real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); + constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + for( localIndex q = 0; q < numNodesPerFace; ++q ) + { + real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); + real32 const localIncrementx = aux * ( velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ); + real32 const localIncrementy = aux * ( velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ); + real32 const localIncrementz = aux * ( velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ); + + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); + } + } + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..619815ee653 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp @@ -0,0 +1,202 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct ElasticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[in] ux_n displacement in x-direction array at time n + * @param[in] ux_nm1 displacement in x-direction array at time n-1 + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[in] uy_n displacement in y-direction array at time n + * @param[in] uy_nm1 displacement in y-direction array at time n-1 + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] uz_n displacement in z-direction array at time n + * @param[in] uz_nm1 displacement in z-direction array at time n-1 + * @param[in] mass the mass matrix + * @param[in] dampingx the damping matrix for x-component + * @param[in] dampingy the damping matrix for y-component + * @param[in] dampingz the damping matrix for z-component + * @param[in] stiffnessVectorx array containing the product of the stiffness matrix R and the displacement in x-direction at time n + * @param[in] stiffnessVectory array containing the product of the stiffness matrix R and the displacement in y-direction at time n + * @param[in] stiffnessVectorz array containing the product of the stiffness matrix R and the displacement in z-direction at time n + * @param[in] rhsx the right-hand-side for displacement in x-direction + * @param[in] rhsy the right-hand-side for displacement in y-direction + * @param[in] rhsz the right-hand-side for displacement in z-direction + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void LeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const ux_n, + arrayView1d< real32 > const ux_nm1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uy_n, + arrayView1d< real32 > const uy_nm1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 > const uz_n, + arrayView1d< real32 > const uz_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 const > const dampingx, + arrayView1d< real32 const > const dampingy, + arrayView1d< real32 const > const dampingz, + arrayView1d< real32 > const stiffnessVectorx, + arrayView1d< real32 > const stiffnessVectory, + arrayView1d< real32 > const stiffnessVectorz, + arrayView1d< real32 > const rhsx, + arrayView1d< real32 > const rhsy, + arrayView1d< real32 > const rhsz, + SortedArrayView< localIndex const > const solverTargetNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + ux_np1[a] = ux_n[a]; + ux_np1[a] *= 2.0*mass[a]; + ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; + ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); + ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; + uy_np1[a] = uy_n[a]; + uy_np1[a] *= 2.0*mass[a]; + uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; + uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); + uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; + uz_np1[a] = uz_n[a]; + uz_np1[a] *= 2.0*mass[a]; + uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; + uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); + uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; + } ); + + }; + + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML, but with attenuation + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[in] ux_n displacement in x-direction array at time n + * @param[in] ux_nm1 displacement in x-direction array at time n-1 + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[in] uy_n displacement in y-direction array at time n + * @param[in] uy_nm1 displacement in y-direction array at time n-1 + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] uz_n displacement in z-direction array at time n + * @param[in] uz_nm1 displacement in z-direction array at time n-1 + * @param[in] divpsix divergence of the memory variables in the x direction + * @param[in] divpsiy divergence of the memory variables in the y direction + * @param[in] divpsiz divergence of the memory variables in the z direction + * @param[in] mass the mass matrix + * @param[in] dampingx the damping matrix for x-component + * @param[in] dampingy the damping matrix for y-component + * @param[in] dampingz the damping matrix for z-component + * @param[in] stiffnessVectorx array containing the product of the stiffness matrix R and the displacement in x-direction at time n + * @param[in] stiffnessVectory array containing the product of the stiffness matrix R and the displacement in y-direction at time n + * @param[in] stiffnessVectorz array containing the product of the stiffness matrix R and the displacement in z-direction at time n + * @param[in] stiffnessVectorAx array containing the product of the attenuation stiffness matrix R and the displacement in x-direction at + * time n + * @param[in] stiffnessVectorAy array containing the product of the attenuation stiffness matrix R and the displacement in y-direction at + * time n + * @param[in] stiffnessVectorAz array containing the product of the attenuation stiffness matrix R and the displacement in z-direction at + * time n + * @param[in] rhsx the right-hand-side for displacement in x-direction + * @param[in] rhsy the right-hand-side for displacement in y-direction + * @param[in] rhsz the right-hand-side for displacement in z-direction + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void AttenuationLeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const ux_n, + arrayView1d< real32 > const ux_nm1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uy_n, + arrayView1d< real32 > const uy_nm1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 > const uz_n, + arrayView1d< real32 > const uz_nm1, + arrayView2d< real32 > const divpsix, + arrayView2d< real32 > const divpsiy, + arrayView2d< real32 > const divpsiz, + arrayView1d< real32 const > const mass, + arrayView1d< real32 const > const dampingx, + arrayView1d< real32 const > const dampingy, + arrayView1d< real32 const > const dampingz, + arrayView1d< real32 > const stiffnessVectorx, + arrayView1d< real32 > const stiffnessVectory, + arrayView1d< real32 > const stiffnessVectorz, + arrayView1d< real32 > const stiffnessVectorAx, + arrayView1d< real32 > const stiffnessVectorAy, + arrayView1d< real32 > const stiffnessVectorAz, + arrayView1d< real32 > const rhsx, + arrayView1d< real32 > const rhsy, + arrayView1d< real32 > const rhsz, + SortedArrayView< localIndex const > const solverTargetNodesSet, + arrayView1d< real32 > referenceFrequencies, + arrayView1d< real32 > anelasticityCoefficients ) + { + real64 const dt2 = pow( dt, 2 ); + integer nl = referenceFrequencies.size( 0 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + ux_np1[a] = ux_n[a]; + ux_np1[a] *= 2.0*mass[a]; + ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; + ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); + uy_np1[a] = uy_n[a]; + uy_np1[a] *= 2.0*mass[a]; + uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; + uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); + uz_np1[a] = uz_n[a]; + uz_np1[a] *= 2.0*mass[a]; + uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; + uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); + for( integer l = 0; l < nl; l++ ) + { + real32 gammal = ( 2.0 - referenceFrequencies[ l ] * dt )/( 2.0 + referenceFrequencies[ l ] * dt ); + real32 betal = anelasticityCoefficients[ l ] * referenceFrequencies[ l ] * 2.0 * dt /( 2.0 + referenceFrequencies[ l ] * dt ); + real32 gammalp = 0.5 + 0.5 * gammal; + real32 betalp = 0.5 * betal; + ux_np1[a] += dt2 * ( gammalp * divpsix( a, l ) + betalp * stiffnessVectorAx[ a ] ); + uy_np1[a] += dt2 * ( gammalp * divpsiy( a, l ) + betalp * stiffnessVectorAy[ a ] ); + uz_np1[a] += dt2 * ( gammalp * divpsiz( a, l ) + betalp * stiffnessVectorAz[ a ] ); + divpsix( a, l ) = gammal * divpsix( a, l ) + betal * stiffnessVectorAx[ a ]; + divpsiy( a, l ) = gammal * divpsiy( a, l ) + betal * stiffnessVectorAy[ a ]; + divpsiz( a, l ) = gammal * divpsiz( a, l ) + betal * stiffnessVectorAz[ a ]; + } + ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; + uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; + uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; + } ); + + }; + +}; + +} + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp new file mode 100644 index 00000000000..51e9cbfd04c --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -0,0 +1,624 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PrecomputeSourcesAndReceiversKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ + +namespace geos +{ + +struct PreComputeSourcesAndReceivers +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + + /** + * @brief Launches the precomputation of the source and receiver terms for 1D solution (2nd order acoustic) + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank rank of the ghost element + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal normal of each faces + * @param[in] faceCenter coordinates of the center of a face + * @param[in] sourceCoordinates coordinates of the source terms + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstants constant part of the source terms + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute1DSourceAndReceiverConstants( localIndex const size, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstants, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + sourceIsAccessible[isrc] = 1; + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + sourceNodeIds[isrc][a] = elemsToNodes( k, a ); + sourceConstants[isrc][a] = Ntest[a]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + } + } + } // end loop over all sources + + + // Step 2: locate the receivers, and precompute the receiver term + + /// loop over all the receivers that haven't been found yet + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + if( receiverIsLocal[ircv] == 0 ) + { + real64 const coords[3] = { receiverCoordinates[ircv][0], + receiverCoordinates[ircv][1], + receiverCoordinates[ircv][2] }; + + real64 coordsOnRefElem[3]{}; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( receiverFound && elemGhostRank[k] < 0 ) + { + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + receiverIsLocal[ircv] = 1; + + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][a] = elemsToNodes( k, a ); + receiverConstants[ircv][a] = Ntest[a]; + } + } + } + } // end loop over receivers + + } ); + + } + + + /** + * @brief Launches the precomputation of the source and receiver terms with storage of elements and region + * in which the receivers and sources are located + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank rank of the ghost element + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal normal of each faces + * @param[in] faceCenter coordinates of the center of a face + * @param[in] sourceCoordinates coordinates of the source terms + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceElem element where a source is located + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstants constant part of the source terms + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] receiverElem element where a receiver is located + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage( localIndex const size, + localIndex const regionIndex, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView1d< localIndex > const sourceElem, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstants, + arrayView1d< localIndex > const sourceRegion, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView1d< localIndex > const receiverElem, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView1d< localIndex > const receiverRegion, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + sourceIsAccessible[isrc] = 1; + sourceElem[isrc] = k; + sourceRegion[isrc] = regionIndex; + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + sourceNodeIds[isrc][a] = elemsToNodes[k][a]; + sourceConstants[isrc][a] = Ntest[a]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + } + } + } // end loop over all sources + + + // Step 2: locate the receivers, and precompute the receiver term + + /// loop over all the receivers that haven't been found yet + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + if( receiverIsLocal[ircv] == 0 ) + { + real64 const coords[3] = { receiverCoordinates[ircv][0], + receiverCoordinates[ircv][1], + receiverCoordinates[ircv][2] }; + + real64 coordsOnRefElem[3]{}; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( receiverFound && elemGhostRank[k] < 0 ) + { + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + receiverIsLocal[ircv] = 1; + receiverElem[ircv] = k; + receiverRegion[ircv] = regionIndex; + + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][a] = elemsToNodes[k][a]; + receiverConstants[ircv][a] = Ntest[a]; + } + } + } + } // end loop over receivers + + } ); + + } + + + + /** + * @brief Launches the precomputation of the source and receiver terms for 3D arrays solution and DAS receiver constants + * computation + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of face on an element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank array containing the ghost rank + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal array containing the normal of all faces + * @param[in] faceCenter array containing the center of all faces + * @param[in] sourceCoordinates coordinates of the source terms + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstantsx constant part of the source terms in x-direction + * @param[out] sourceConstantsy constant part of the source terms in y-direction + * @param[out] sourceConstantsz constant part of the source terms in z-direction + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) + * @param[in] dt time-step + * @param[in] timeSourceFrequency Peak frequency of the source + * @param[in] timeSourceDelay Delay of the source + * @param[in] rickerOrder Order of the Ricker wavelet + * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) + * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain + * integration + * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed + * @param[in] sourceForce force vector of the source + * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute3DSourceAndReceiverConstantsWithDAS( localIndex const size, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstantsx, + arrayView2d< real64 > const sourceConstantsy, + arrayView2d< real64 > const sourceConstantsz, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder, + WaveSolverUtils::DASType useDAS, + integer linearDASSamples, + arrayView2d< real64 const > const linearDASGeometry, + R1Tensor const sourceForce, + R2SymTensor const sourceMoment ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + integer nSamples = useDAS == WaveSolverUtils::DASType::none ? 1 : linearDASSamples; + array1d< real64 > const samplePointLocationsA( nSamples ); + arrayView1d< real64 > const samplePointLocations = samplePointLocationsA.toView(); + array1d< real64 > const sampleIntegrationConstantsA( nSamples ); + arrayView1d< real64 > const sampleIntegrationConstants = sampleIntegrationConstantsA.toView(); + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + real64 xLocal[numNodesPerElem][3]; + + for( localIndex a=0; a< numNodesPerElem; ++a ) + { + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + } + } + + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + sourceIsAccessible[isrc] = 1; + + real64 N[numNodesPerElem]; + real64 gradN[numNodesPerElem][3]; + FE_TYPE::calcN( coordsOnRefElem, N ); + FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + R2SymTensor moment = sourceMoment; + for( localIndex q=0; q< numNodesPerElem; ++q ) + { + real64 inc[3] = { 0, 0, 0 }; + sourceNodeIds[isrc][q] = elemsToNodes( k, q ); + inc[0] += sourceForce[0] * N[q]; + inc[1] += sourceForce[1] * N[q]; + inc[2] += sourceForce[2] * N[q]; + + LvArray::tensorOps::Ri_add_symAijBj< 3 >( inc, moment.data, gradN[q] ); + sourceConstantsx[isrc][q] += inc[0]; + sourceConstantsy[isrc][q] += inc[1]; + sourceConstantsz[isrc][q] += inc[2]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + + } + } + } // end loop over all sources + + // Step 2: locate the receivers, and precompute the receiver term + + // for geophones, we need only a point per receiver. + // for DAS, we need multiple points + + /// compute locations of samples along receiver + if( nSamples == 1 ) + { + samplePointLocations[ 0 ] = 0; + } + else + { + for( integer i = 0; i < nSamples; ++i ) + { + samplePointLocations[ i ] = -0.5 + (real64) i / ( linearDASSamples - 1 ); + } + } + + /// compute integration constants of samples + /// for displacement difference (dipole) DAS, take the discrete derivative of the pair of geophones + if( useDAS == WaveSolverUtils::DASType::dipole ) + { + sampleIntegrationConstants[ 0 ] = -1.0; + sampleIntegrationConstants[ 1 ] = 1.0; + } + /// for strain integration DAS, take the average of strains to average strain data + else if( nSamples == 1 ) + { + sampleIntegrationConstants[ 0 ] = 1.0; + } + else + { + for( integer i = 0; i < linearDASSamples; i++ ) + { + sampleIntegrationConstants[ i ] = 1.0 / nSamples; + } + } + + /// loop over all the receivers + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + R1Tensor receiverCenter = { receiverCoordinates[ ircv ][ 0 ], receiverCoordinates[ ircv ][ 1 ], receiverCoordinates[ ircv ][ 2 ] }; + R1Tensor receiverVector; + if( useDAS == WaveSolverUtils::DASType::none ) + { + receiverVector = { 0, 0, 0 }; + } + else + { + receiverVector = WaveSolverUtils::computeDASVector( linearDASGeometry[ ircv ][ 0 ], linearDASGeometry[ ircv ][ 1 ] ); + } + real64 receiverLength = useDAS == WaveSolverUtils::DASType::none ? 0 : linearDASGeometry[ ircv ][ 2 ]; + /// loop over samples + for( integer iSample = 0; iSample < nSamples; ++iSample ) + { + /// compute sample coordinates and locate the element containing it + real64 const coords[3] = { receiverCenter[ 0 ] + receiverVector[ 0 ] * receiverLength * samplePointLocations[ iSample ], + receiverCenter[ 1 ] + receiverVector[ 1 ] * receiverLength * samplePointLocations[ iSample ], + receiverCenter[ 2 ] + receiverVector[ 2 ] * receiverLength * samplePointLocations[ iSample ] }; + bool const sampleFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( sampleFound && elemGhostRank[k] < 0 ) + { + real64 coordsOnRefElem[3]{}; + real64 xLocal[numNodesPerElem][3]; + + for( localIndex a=0; a< numNodesPerElem; ++a ) + { + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + } + } + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + real64 N[numNodesPerElem]; + real64 gradN[numNodesPerElem][3]; + FE_TYPE::calcN( coordsOnRefElem, N ); + FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][iSample * numNodesPerElem + a] = elemsToNodes( k, + a ); + if( useDAS == WaveSolverUtils::DASType::strainIntegration ) + { + receiverConstants[ircv][iSample * numNodesPerElem + a] += ( gradN[a][0] * receiverVector[0] + gradN[a][1] * receiverVector[1] + gradN[a][2] * receiverVector[2] ) * + sampleIntegrationConstants[ iSample ]; + } + else + { + receiverConstants[ircv][iSample * numNodesPerElem + a] += N[a] * sampleIntegrationConstants[ iSample ]; + } + } + receiverIsLocal[ ircv ] = 2; + } + } // end loop over samples + // determine if the current rank is the owner of this receiver + real64 const coords[3] = { receiverCenter[ 0 ], receiverCenter[ 1 ], receiverCenter[ 2 ] }; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( receiverFound && elemGhostRank[k] < 0 ) + { + receiverIsLocal[ ircv ] = 1; + } + } // end loop over receivers + } ); + + } + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp similarity index 89% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 3278086f9e4..0716f971ad4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -27,6 +27,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" +#include "events/EventManager.hpp" #include @@ -130,7 +131,8 @@ WaveSolverBase::WaveSolverBase( const std::string & name, registerWrapper( viewKeyStruct::useDASString(), &m_useDAS ). setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( WaveSolverUtils::DASType::none ). - setDescription( "Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference" ); + setDescription( + "Flag to indicate if DAS data will be modeled, and which DAS type to use: \"none\" to deactivate DAS, \"strainIntegration\" for strain integration, \"dipole\" for displacement difference" ); registerWrapper( viewKeyStruct::linearDASSamplesString(), &m_linearDASSamples ). setInputFlag( InputFlags::OPTIONAL ). @@ -192,10 +194,30 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setSizedFromParent( 0 ). setDescription( "Region containing the receivers" ); - registerWrapper( viewKeyStruct::receiverElemString(), &m_rcvElem ). + registerWrapper( viewKeyStruct::receiverElemString(), &m_receiverElem ). setInputFlag( InputFlags::FALSE ). setSizedFromParent( 0 ). setDescription( "Element containing the receivers" ); + + registerWrapper( viewKeyStruct::slsReferenceAngularFrequenciesString(), &m_slsReferenceAngularFrequencies ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( { } ). + setDescription( "Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity." + "The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided." ); + + registerWrapper( viewKeyStruct::slsAnelasticityCoefficientsString(), &m_slsAnelasticityCoefficients ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( { } ). + setDescription( "Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity." + "The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided." ); + + registerWrapper( viewKeyStruct::attenuationTypeString(), &m_attenuationType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( WaveSolverUtils::AttenuationType::none ). + setDescription( "Flag to indicate which attenuation model to use: \"none\" for no attenuation, \"sls\\" " for the standard-linear-solid (SLS) model (Fichtner, 2014)." ); + } WaveSolverBase::~WaveSolverBase() @@ -309,6 +331,22 @@ void WaveSolverBase::postProcessInput() } } + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + GEOS_THROW_IF( m_slsReferenceAngularFrequencies.size( 0 ) != m_slsAnelasticityCoefficients.size( 0 ), + "The number of attenuation anelasticity coefficients for the SLS model must be equal to the number of reference angular frequencies", + InputError ); + if( m_slsReferenceAngularFrequencies.size( 0 ) == 0 || m_slsAnelasticityCoefficients.size( 0 ) == 0 ) + { + m_slsReferenceAngularFrequencies.resize( 1 ); + m_slsReferenceAngularFrequencies[ 0 ] = 2.0 * M_PI * m_timeSourceFrequency; + m_slsAnelasticityCoefficients.resize( 1 ); + // set the coefficient to a negative value, so that it will be recomputed when the quality factor is available + m_slsAnelasticityCoefficients[ 0 ] = -1; + } + } + + GEOS_THROW_IF( m_sourceCoordinates.size( 0 ) > 0 && m_sourceCoordinates.size( 1 ) != 3, "Invalid number of physical coordinates for the sources", InputError ); @@ -489,7 +527,7 @@ void WaveSolverBase::compute2dVariableAllSeismoTraces( localIndex const regionIn real64 const timeSeismo = m_dtSeismoTrace * (m_forward ? iSeismo : (m_nsamplesSeismoTrace - 1) - iSeismo); if( dir * timeSeismo > dir * (time_n + epsilonLoc)) break; - WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, iSeismo, m_rcvElem, + WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, iSeismo, m_receiverElem, m_receiverConstants, m_receiverIsLocal, var_np1, var_n, varAtReceivers ); } } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp similarity index 94% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 93819ec6a60..a8868b23992 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -118,9 +118,13 @@ class WaveSolverBase : public SolverBase static constexpr char const * usePMLString() { return "usePML"; } static constexpr char const * parametersPMLString() { return "parametersPML"; } - static constexpr char const * receiverElemString() { return "rcvElem"; } + static constexpr char const * receiverElemString() { return "receiverElem"; } static constexpr char const * receiverRegionString() { return "receiverRegion"; } static constexpr char const * freeSurfaceString() { return "FreeSurface"; } + + static constexpr char const * attenuationTypeString() { return "attenuationType"; } + static constexpr char const * slsReferenceAngularFrequenciesString() { return "slsReferenceAngularFrequencies"; } + static constexpr char const * slsAnelasticityCoefficientsString() { return "slsAnelasticityCoefficients"; } }; /** @@ -270,7 +274,7 @@ class WaveSolverBase : public SolverBase /// Amount of seismoTrace that will be recorded for each receiver localIndex m_nsamplesSeismoTrace; - /// Flag to indicate which DAS type will be modeled + /// Flag to indicate which DAS type will be modeled WaveSolverUtils::DASType m_useDAS; /// Number of points used for strain integration for dipole DAS @@ -288,6 +292,15 @@ class WaveSolverBase : public SolverBase /// Z component of the linear DAS direction vector array1d< real32 > m_linearDASVectorZ; + /// Flag to indicate which attenuation type will be modeled + WaveSolverUtils::AttenuationType m_attenuationType; + + /// Vector containing the reference frequencies for the standard-linear-solid (SLS) anelasticity model. + array1d< real32 > m_slsReferenceAngularFrequencies; + + /// Vector containing the anelasticity coefficients for the standard-linear-solid (SLS) anelasticity model. + array1d< real32 > m_slsAnelasticityCoefficients; + /// Indicate if we want to compute forward ou backward localIndex m_forward; @@ -319,7 +332,7 @@ class WaveSolverBase : public SolverBase array1d< localIndex > m_receiverIsLocal; /// Array containing the elements which contain a receiver - array1d< localIndex > m_rcvElem; + array1d< localIndex > m_receiverElem; /// Array containing the elements which contain the region which the receiver belongs array1d< localIndex > m_receiverRegion; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp similarity index 78% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 5b9e91dbcb8..8447e824b8e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -41,16 +41,18 @@ struct WaveSolverUtils strainIntegration, ///< use strain integration for DAS }; + enum class AttenuationType : integer + { + none, ///< deactivate attenuation (default) + sls, ///< istandard-linear-solid description [Fichtner 2014] + }; + + GEOS_HOST_DEVICE static real32 evaluateRicker( real64 const time_n, real32 const f0, real32 const t0, localIndex const order ) { real32 const delay = t0 > 0 ? t0 : 1 / f0; real32 pulse = 0.0; - if( time_n <= -0.9 * delay || time_n >= 2.9 * delay ) - { - return pulse; - } - real32 const alpha = -pow( f0 * M_PI, 2 ); real32 const time_d = time_n - delay; real32 const gaussian = exp( alpha * pow( time_d, 2 )); @@ -82,6 +84,11 @@ struct WaveSolverUtils /** * @brief Initialize (clear) the trace file. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition */ static void initTrace( char const * prefix, string const & name, @@ -110,6 +117,15 @@ struct WaveSolverUtils /** * @brief Convenient helper for 3D vectors calling 3 times the scalar version with only the sampled variable argument changed. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition + * @param[in] nsamplesSeismoTrace Number of samples per seismo trace + * @param[out] varAtReceiversx Array containing the variable (x-direction) computed at the receivers + * @param[out] varAtReceiversy Array containing the variable (y-direction) computed at the receivers + * @param[out] varAtReceiversz Array containing the variable (z-direction) computed at the receivers */ static void writeSeismoTraceVector( char const * prefix, string const & name, @@ -128,6 +144,13 @@ struct WaveSolverUtils /** * @brief Write the seismo traces to a file. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition + * @param[in] nsamplesSeismoTrace Number of samples per seismo trace + * @param[in] varAtReceivers Array containing the the variable computed at the receivers */ static void writeSeismoTrace( char const * prefix, string const & name, @@ -166,6 +189,18 @@ struct WaveSolverUtils /** * @brief Compute the seismo traces. + * @param[in] time_n Current time iteration + * @param[in] dt time-step + * @param[in] timeSeismo time when the seismo is computed + * @param[in] iSeismo i-th seismo trace + * @param[in] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[in] receiverConstants constant part of the receiver term + * @param[in] receiverIsLocal flag indicating whether the receiver is local or not + * @param[in] var_np1 Array containing the variable at time n+1 + * @param[in] var_n Array containing the variable at time n + * @param[out] varAtReceivers Array containing the the variable computed at the receivers + * @param[in] coeffs Coefficients array for receivers + * @param[in] add Boolean to say if you want to add the value of interpolation to the same receiver coefficient or not */ static void computeSeismoTrace( real64 const time_n, real64 const dt, @@ -200,14 +235,14 @@ struct WaveSolverUtils } } // linear interpolation between the pressure value at time_n and time_{n+1} - real32 rcvCoeff = coeffs.size( 0 ) == 0 ? 1.0 : coeffs( ircv ); + real32 receiverCoeff = coeffs.size( 0 ) == 0 ? 1.0 : coeffs( ircv ); if( add ) { - varAtReceivers( iSeismo, ircv ) += rcvCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); + varAtReceivers( iSeismo, ircv ) += receiverCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); } else { - varAtReceivers( iSeismo, ircv ) = rcvCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); + varAtReceivers( iSeismo, ircv ) = receiverCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); } // NOTE: varAtReceivers has size(1) = numReceiversGlobal + 1, this does not OOB // left in the forAll loop for sync issues since the following does not depend on `ircv` @@ -216,13 +251,28 @@ struct WaveSolverUtils } ); } + /** + * @brief Compute the seismo traces for 2d arrays + * @param[in] time_n Current time iteration + * @param[in] dt time-step + * @param[in] regionIndex Index of the current region + * @param[in] receiverRegion Array containing the region in which the receiver is located + * @param[in] timeSeismo time when the seismo is computed + * @param[in] iSeismo i-th seismo trace + * @param[in] receiverElem Array containing the element on which the receiver is located + * @param[in] receiverConstants constant part of the receiver term + * @param[in] receiverIsLocal flag indicating whether the receiver is local or not + * @param[in] var_np1 Array containing the variable at time n+1 + * @param[in] var_n Array containing the variable at time n + * @param[out] varAtReceivers Array containing the the variable computed at the receivers + */ static void compute2dVariableSeismoTrace( real64 const time_n, real64 const dt, localIndex const regionIndex, arrayView1d< localIndex const > const receiverRegion, real64 const timeSeismo, localIndex const iSeismo, - arrayView1d< localIndex const > const rcvElem, + arrayView1d< localIndex const > const receiverElem, arrayView2d< real64 const > const receiverConstants, arrayView1d< localIndex const > const receiverIsLocal, arrayView2d< real32 const > const var_np1, @@ -245,8 +295,8 @@ struct WaveSolverUtils real32 vtmp_np1 = 0.0, vtmp_n = 0.0; for( localIndex inode = 0; inode < receiverConstants.size( 1 ); ++inode ) { - vtmp_np1 += var_np1( rcvElem[ircv], inode ) * receiverConstants( ircv, inode ); - vtmp_n += var_n( rcvElem[ircv], inode ) * receiverConstants( ircv, inode ); + vtmp_np1 += var_np1( receiverElem[ircv], inode ) * receiverConstants( ircv, inode ); + vtmp_n += var_n( receiverElem[ircv], inode ) * receiverConstants( ircv, inode ); } // linear interpolation between the pressure value at time_n and time_{n+1} varAtReceivers( iSeismo, ircv ) = a1 * vtmp_n + a2 * vtmp_np1; @@ -371,6 +421,10 @@ ENUM_STRINGS( WaveSolverUtils::DASType, "dipole", "strainIntegration" ); +ENUM_STRINGS( WaveSolverUtils::AttenuationType, + "none", + "sls" ); + } /* namespace geos */ #endif /* GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_WAVESOLVERUTILS_HPP_ */ diff --git a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst b/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst index 955f1c1ca6d..88ca2990ec7 100644 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst @@ -1,33 +1,33 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -uxNp1AtReceivers real32_array2d Ux value at each receiver for each timestep -uyNp1AtReceivers real32_array2d Uy value at each receiver for each timestep -uzNp1AtReceivers real32_array2d Uz value at each receiver for each timestep -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceElem integer_array Element containing the sources +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceRegion integer_array Region containing the sources +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +uxNp1AtReceivers real32_array2d Ux value at each receiver for each timestep +uyNp1AtReceivers real32_array2d Uy value at each receiver for each timestep +uzNp1AtReceivers real32_array2d Uz value at each receiver for each timestep +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/AcousticSEM_other.rst b/src/coreComponents/schema/docs/AcousticSEM_other.rst index 280974da35a..1ef831de5ac 100644 --- a/src/coreComponents/schema/docs/AcousticSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticSEM_other.rst @@ -1,28 +1,28 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst index 280974da35a..1ef831de5ac 100644 --- a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst @@ -1,28 +1,28 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/BiotPorosity.rst b/src/coreComponents/schema/docs/BiotPorosity.rst index 1045d74ae9e..e0098540256 100644 --- a/src/coreComponents/schema/docs/BiotPorosity.rst +++ b/src/coreComponents/schema/docs/BiotPorosity.rst @@ -3,9 +3,9 @@ ======================== ========= ======== =========================================================== Name Type Default Description ======================== ========= ======== =========================================================== +defaultGrainBulkModulus real64 required Grain bulk modulus defaultPorosityTEC real64 0 Default thermal expansion coefficient defaultReferencePorosity real64 required Default value of the reference porosity -grainBulkModulus real64 required Grain bulk modulus name groupName required A name is required for any non-unique nodes useUniaxialFixedStress integer 0 Flag enabling uniaxial approximation in fixed stress update ======================== ========= ======== =========================================================== diff --git a/src/coreComponents/schema/docs/BiotPorosity_other.rst b/src/coreComponents/schema/docs/BiotPorosity_other.rst index d5bd2487301..335965a9ad6 100644 --- a/src/coreComponents/schema/docs/BiotPorosity_other.rst +++ b/src/coreComponents/schema/docs/BiotPorosity_other.rst @@ -7,6 +7,7 @@ averageMeanTotalStressIncrement_k real64_array Mean total stress increment ave biotCoefficient real64_array Biot coefficient dPorosity_dPressure real64_array2d Derivative of rock porosity with respect to pressure dPorosity_dTemperature real64_array2d Derivative of rock porosity with respect to temperature +grainBulkModulus real64_array Grain Bulk modulus. initialPorosity real64_array2d Initial porosity meanTotalStressIncrement_k real64_array2d Mean total stress increment at quadrature points at the previous sequential iteration porosity real64_array2d Rock porosity diff --git a/src/coreComponents/schema/docs/BlackOilFluid_other.rst b/src/coreComponents/schema/docs/BlackOilFluid_other.rst index 60b6325d615..0ceddaa556f 100644 --- a/src/coreComponents/schema/docs/BlackOilFluid_other.rst +++ b/src/coreComponents/schema/docs/BlackOilFluid_other.rst @@ -1,36 +1,36 @@ -=============================== ======================================================================================================= ============================================================================================================ -Name Type Description -=============================== ======================================================================================================= ============================================================================================================ -PVTO geos_constitutive_PVTOData (no description available) -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -=============================== ======================================================================================================= ============================================================================================================ +=============================== =================================================================================================== ============================================================================================================ +Name Type Description +=============================== =================================================================================================== ============================================================================================================ +PVTO geos_constitutive_PVTOData (no description available) +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +hydrocarbonPhaseOrder integer_array (no description available) +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +=============================== =================================================================================================== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CellElementRegion_other.rst b/src/coreComponents/schema/docs/CellElementRegion_other.rst index a65968b0105..bb012ac8ff4 100644 --- a/src/coreComponents/schema/docs/CellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/CellElementRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index 7202cd18e81..33e2a2e5cb5 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -21,6 +21,7 @@ maxSequentialCompDensChange real64 maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor miscibleDBC integer 0 Flag for enabling DBC formulation with/without miscibility name groupName required A name is required for any non-unique nodes omegaDBC real64 1 Factor by which DBC flux is multiplied @@ -35,7 +36,7 @@ targetRelativePressureChangeInTimeStep real64 targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) temperature real64 required Temperature useDBC integer 0 Enable Dissipation-based continuation flux -useMass integer 0 Use mass formulation instead of molar +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used useTotalMassEquation integer 1 Flag indicating whether total mass equation is used LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst index c9db4e7d190..dab7f7ffa9f 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst @@ -11,6 +11,7 @@ componentCriticalTemperature real64_array required Component critical temp componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Viscosity for each phase equationsOfState string_array required List of equation of state types for each phase name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index 4cdd10dd766..1627f7eae15 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -18,6 +18,7 @@ maxSequentialCompDensChange real64 1 Maximum (a maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor name groupName required A name is required for any non-unique nodes solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. @@ -26,7 +27,7 @@ targetRegions groupNameRef_array required Allowable targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) temperature real64 required Temperature -useMass integer 0 Use mass formulation instead of molar +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used useTotalMassEquation integer 1 Flag indicating whether total mass equation is used LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst index c69ff8f4e38..2944d71993d 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_faceManager` Mimetic gravity coefficient -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================ ================================================================ +========================= ====================================================================================================================================================== ================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step +mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_faceManager` Mimetic gravity coefficient +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================ ================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst index 3f16a155d2b..f2c739b92d8 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +WellControls node :ref:`DATASTRUCTURE_WellControls` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst similarity index 94% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst index cf67a8118c4..daeebbf1cce 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst @@ -8,10 +8,10 @@ componentAcentricFactor real64_array required Component acentric fact componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients componentCriticalPressure real64_array required Component critical pressures componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Constant phase viscosity name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases ============================ ================== ======== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst new file mode 100644 index 00000000000..91834dab00d --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst @@ -0,0 +1,23 @@ + + +============================ ================== =============== ========================================================================================================================= +Name Type Default Description +============================ ================== =============== ========================================================================================================================= +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: + | * HerningZipperer + | * Wilke + | * Brokaw +============================ ================== =============== ========================================================================================================================= + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst similarity index 94% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst index cf67a8118c4..daeebbf1cce 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst @@ -8,10 +8,10 @@ componentAcentricFactor real64_array required Component acentric fact componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients componentCriticalPressure real64_array required Component critical pressures componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Constant phase viscosity name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases ============================ ================== ======== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst new file mode 100644 index 00000000000..91834dab00d --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst @@ -0,0 +1,23 @@ + + +============================ ================== =============== ========================================================================================================================= +Name Type Default Description +============================ ================== =============== ========================================================================================================================= +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: + | * HerningZipperer + | * Wilke + | * Brokaw +============================ ================== =============== ========================================================================================================================= + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst deleted file mode 100644 index 476b50195e5..00000000000 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst deleted file mode 100644 index 476b50195e5..00000000000 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst new file mode 100644 index 00000000000..7d6d29602c1 --- /dev/null +++ b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst @@ -0,0 +1,13 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +name groupName required A name is required for any non-unique nodes +permeabilityModelName groupNameRef required Name of the permeability model. +porosityModelName groupNameRef required Name of the porosity model. +solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. +solidModelName groupNameRef required Name of the solid model. +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index f0a48fcf31f..d094325ded1 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -1,90 +1,93 @@ -============================================= ==== ======= ======================================================== -Name Type Default Description -============================================= ==== ======= ======================================================== -BiotPorosity node :ref:`XML_BiotPorosity` -BlackOilFluid node :ref:`XML_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` -CeramicDamage node :ref:`XML_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` -CompositonalTwoPhaseFluidPengRobinson node :ref:`XML_CompositonalTwoPhaseFluidPengRobinson` -CompositonalTwoPhaseFluidSoaveRedlichKwong node :ref:`XML_CompositonalTwoPhaseFluidSoaveRedlichKwong` -CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`XML_ConstantDiffusion` -ConstantPermeability node :ref:`XML_ConstantPermeability` -Coulomb node :ref:`XML_Coulomb` -DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`XML_DeadOilFluid` -DelftEgg node :ref:`XML_DelftEgg` -DruckerPrager node :ref:`XML_DruckerPrager` -ElasticIsotropic node :ref:`XML_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` -FrictionlessContact node :ref:`XML_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`XML_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`XML_NullModel` -ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` -ParticleFluid node :ref:`XML_ParticleFluid` -PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` -PermeabilityBase node :ref:`XML_PermeabilityBase` -PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`XML_PorousDelftEgg` -PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` -PressurePorosity node :ref:`XML_PressurePorosity` -ProppantPermeability node :ref:`XML_ProppantPermeability` -ProppantPorosity node :ref:`XML_ProppantPorosity` -ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`XML_ReactiveBrine` -ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` -SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` -TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` -TableRelativePermeability node :ref:`XML_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` -============================================= ==== ======= ======================================================== +============================================== ==== ======= ========================================================= +Name Type Default Description +============================================== ==== ======= ========================================================= +BiotPorosity node :ref:`XML_BiotPorosity` +BlackOilFluid node :ref:`XML_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` +CeramicDamage node :ref:`XML_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluidPengRobinson node :ref:`XML_CompositionalTwoPhaseFluidPengRobinson` +CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`XML_CompositionalTwoPhaseFluidPengRobinsonLBC` +CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwong` +CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` +CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`XML_CompressibleSolidPressurePermeability` +CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`XML_ConstantDiffusion` +ConstantPermeability node :ref:`XML_ConstantPermeability` +Coulomb node :ref:`XML_Coulomb` +DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`XML_DeadOilFluid` +DelftEgg node :ref:`XML_DelftEgg` +DruckerPrager node :ref:`XML_DruckerPrager` +ElasticIsotropic node :ref:`XML_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` +FrictionlessContact node :ref:`XML_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`XML_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`XML_NullModel` +ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` +ParticleFluid node :ref:`XML_ParticleFluid` +PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` +PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`XML_PorousDelftEgg` +PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`XML_PressurePermeability` +PressurePorosity node :ref:`XML_PressurePorosity` +ProppantPermeability node :ref:`XML_ProppantPermeability` +ProppantPorosity node :ref:`XML_ProppantPorosity` +ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`XML_ReactiveBrine` +ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` +SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` +TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` +TableRelativePermeability node :ref:`XML_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` +============================================== ==== ======= ========================================================= diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index 9ce0f20a901..93ffa5b4966 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -1,90 +1,93 @@ -============================================= ==== ================================================================== -Name Type Description -============================================= ==== ================================================================== -BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` -BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` -CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` -CompositonalTwoPhaseFluidPengRobinson node :ref:`DATASTRUCTURE_CompositonalTwoPhaseFluidPengRobinson` -CompositonalTwoPhaseFluidSoaveRedlichKwong node :ref:`DATASTRUCTURE_CompositonalTwoPhaseFluidSoaveRedlichKwong` -CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` -ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` -Coulomb node :ref:`DATASTRUCTURE_Coulomb` -DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` -DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` -DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` -ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` -FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`DATASTRUCTURE_NullModel` -ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` -ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` -PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` -PermeabilityBase node :ref:`DATASTRUCTURE_PermeabilityBase` -PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` -PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` -PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` -ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` -ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` -ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` -ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` -SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` -TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` -TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` -============================================= ==== ================================================================== +============================================== ==== =================================================================== +Name Type Description +============================================== ==== =================================================================== +BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` +BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` +CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluidPengRobinson node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinson` +CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinsonLBC` +CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwong` +CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` +CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`DATASTRUCTURE_CompressibleSolidPressurePermeability` +CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` +ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` +Coulomb node :ref:`DATASTRUCTURE_Coulomb` +DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` +DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` +DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` +ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` +FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`DATASTRUCTURE_NullModel` +ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` +ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` +PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` +PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` +PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`DATASTRUCTURE_PressurePermeability` +PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` +ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` +ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` +ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` +ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` +SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` +TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` +TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` +============================================== ==== =================================================================== diff --git a/src/coreComponents/schema/docs/DeadOilFluid_other.rst b/src/coreComponents/schema/docs/DeadOilFluid_other.rst index 139d0708316..de90cbaf87f 100644 --- a/src/coreComponents/schema/docs/DeadOilFluid_other.rst +++ b/src/coreComponents/schema/docs/DeadOilFluid_other.rst @@ -1,35 +1,35 @@ -=============================== ======================================================================================================= ============================================================================================================ -Name Type Description -=============================== ======================================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -=============================== ======================================================================================================= ============================================================================================================ +=============================== =================================================================================================== ============================================================================================================ +Name Type Description +=============================== =================================================================================================== ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +hydrocarbonPhaseOrder integer_array (no description available) +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +=============================== =================================================================================================== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst index a5e6f05623a..24ca5ae2f69 100644 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst @@ -1,38 +1,38 @@ -=========================== ============================================================================================================================================================== ======================================================================= -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================= -displacementxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-components) -displacementyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-components) -displacementzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sigmaxxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmazzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================= +=========================== ====================================================================================================================================================== ======================================================================= +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================= +displacementxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-components) +displacementyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-components) +displacementzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sigmaxxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmaxyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmaxzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmayyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmayzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmazzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceElem integer_array Element containing the sources +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceRegion integer_array Region containing the sources +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/ElasticSEM.rst b/src/coreComponents/schema/docs/ElasticSEM.rst index 6cc28146502..41902f589eb 100644 --- a/src/coreComponents/schema/docs/ElasticSEM.rst +++ b/src/coreComponents/schema/docs/ElasticSEM.rst @@ -28,6 +28,7 @@ targetRegions groupNameRef_array required Allowable r timeSourceDelay real32 -1 Source time delay (1 / f0 by default) timeSourceFrequency real32 0 Central frequency for the time source useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference +useVTI integer 0 Flag to apply VTI anisotropy. The default is to use isotropic physic. LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ============================ ============= ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ElasticSEM_other.rst b/src/coreComponents/schema/docs/ElasticSEM_other.rst index 06969fee16a..2e9e89c914f 100644 --- a/src/coreComponents/schema/docs/ElasticSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticSEM_other.rst @@ -1,31 +1,31 @@ -=========================== ============================================================================================================================================================== ================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ================================================================================== -dasSignalNp1AtReceivers real32_array2d DAS signal value at each receiver for each timestep -displacementXNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-component) -displacementYNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-component) -displacementZNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-component) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds in z-direction -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ================================================================================== +=========================== ====================================================================================================================================================== ================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ================================================================================== +dasSignalNp1AtReceivers real32_array2d DAS signal value at each receiver for each timestep +displacementXNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-component) +displacementYNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-component) +displacementZNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-component) +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds in z-direction +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ================================================================================== diff --git a/src/coreComponents/schema/docs/ElementRegions_other.rst b/src/coreComponents/schema/docs/ElementRegions_other.rst index 17af822cdb0..f62357429ae 100644 --- a/src/coreComponents/schema/docs/ElementRegions_other.rst +++ b/src/coreComponents/schema/docs/ElementRegions_other.rst @@ -1,19 +1,19 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` -SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` -WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` -elementRegionsGroup node :ref:`DATASTRUCTURE_elementRegionsGroup` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` +SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` +WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` +elementRegionsGroup node :ref:`DATASTRUCTURE_elementRegionsGroup` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst index 46c029f2c1a..f2590daca7c 100644 --- a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst +++ b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` Index of parent edge within the mesh object it is registered on. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================ ================================================================ +========================= ====================================================================================================================================================== ================================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +parentEdgeIndex integer_array :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` Index of parent edge within the mesh object it is registered on. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================ ================================================================ diff --git a/src/coreComponents/schema/docs/Events.rst b/src/coreComponents/schema/docs/Events.rst index 4073b6fdc2c..a9963170314 100644 --- a/src/coreComponents/schema/docs/Events.rst +++ b/src/coreComponents/schema/docs/Events.rst @@ -1,16 +1,16 @@ -================ ================================== ============ =================================================== -Name Type Default Description -================ ================================== ============ =================================================== -logLevel integer 0 Log level -maxCycle integer 2147483647 Maximum simulation cycle for the global event loop. -maxTime real64 1.79769e+308 Maximum simulation time for the global event loop. -minTime real64 0 Start simulation time for the global event loop. -timeOutputFormat geos_EventManager_TimeOutputFormat seconds Format of the time in the GEOS log. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -================ ================================== ============ =================================================== +================ ================================== ============ ======================================================================== +Name Type Default Description +================ ================================== ============ ======================================================================== +logLevel integer 0 Log level +maxCycle integer 2147483647 Maximum simulation cycle for the global event loop. Disabled by default. +maxTime real64 1.79769e+308 Maximum simulation time for the global event loop. Disabled by default. +minTime real64 0 Start simulation time for the global event loop. +timeOutputFormat geos_EventManager_TimeOutputFormat seconds Format of the time in the GEOS log. +HaltEvent node :ref:`XML_HaltEvent` +PeriodicEvent node :ref:`XML_PeriodicEvent` +SoloEvent node :ref:`XML_SoloEvent` +================ ================================== ============ ======================================================================== diff --git a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst b/src/coreComponents/schema/docs/FlowProppantTransport_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst +++ b/src/coreComponents/schema/docs/FlowProppantTransport_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index c65d103f356..2c63529e0c0 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -1,23 +1,24 @@ -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isMatrixPoroelastic integer 0 (no description available) -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useQuasiNewton integer 0 (no description available) -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isMatrixPoroelastic integer 0 (no description available) +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. +name groupName required A name is required for any non-unique nodes +newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +useQuasiNewton integer 0 (no description available) +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization.rst b/src/coreComponents/schema/docs/HydrofractureInitialization.rst new file mode 100644 index 00000000000..18e3a0dd9e7 --- /dev/null +++ b/src/coreComponents/schema/docs/HydrofractureInitialization.rst @@ -0,0 +1,12 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst b/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/Hydrofracture_other.rst b/src/coreComponents/schema/docs/Hydrofracture_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/Hydrofracture_other.rst +++ b/src/coreComponents/schema/docs/Hydrofracture_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst b/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst index 68708936927..a9cd8c30fda 100644 --- a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst +++ b/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst @@ -1,14 +1,14 @@ -=================================== ======================================================================================================= ============================================================================ -Name Type Description -=================================== ======================================================================================================= ============================================================================ -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -jFuncMultiplier real64_array2d Multiplier for the Leverett J-function -jFunctionWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== ======================================================================================================= ============================================================================ +=================================== =================================================================================================== ============================================================================ +Name Type Description +=================================== =================================================================================================== ============================================================================ +dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction +jFuncMultiplier real64_array2d Multiplier for the Leverett J-function +jFunctionWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +phaseCapPressure real64_array3d Phase capillary pressure +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +=================================== =================================================================================================== ============================================================================ diff --git a/src/coreComponents/schema/docs/LaplaceFEM_other.rst b/src/coreComponents/schema/docs/LaplaceFEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/LaplaceFEM_other.rst +++ b/src/coreComponents/schema/docs/LaplaceFEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst index 0a48c42e401..536793a2dea 100644 --- a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst +++ b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst @@ -4,6 +4,7 @@ Name Type Default Description ============================== ============================================================= ============= =================================================================================================================================================================================================================================================================================================================== allowNonConverged integer 0 Allow non-converged solution to be accepted. (i.e. exit from the Newton loop without achieving the desired tolerance) +configurationTolerance real64 0 Configuration tolerance couplingType geos_NonlinearSolverParameters_CouplingType FullyImplicit | Type of coupling. Valid options: | * FullyImplicit | * Sequential @@ -16,6 +17,7 @@ lineSearchInterpolationType geos_NonlinearSolverParameters_LineSearchInterpol | * Linear | * Parabolic lineSearchMaxCuts integer 4 Maximum number of line search cuts. +lineSearchResidualFactor real64 1 Factor to determine residual increase (recommended values: 1.1 (conservative), 2.0 (relaxed), 10.0 (aggressive)). lineSearchStartingIteration integer 0 Iteration when line search starts. logLevel integer 0 Log level maxAllowedResidualNorm real64 1e+09 Maximum value of residual norm that is allowed in a Newton loop diff --git a/src/coreComponents/schema/docs/PVTDriver.rst b/src/coreComponents/schema/docs/PVTDriver.rst index 6faf196ec68..9196c73c11a 100644 --- a/src/coreComponents/schema/docs/PVTDriver.rst +++ b/src/coreComponents/schema/docs/PVTDriver.rst @@ -1,19 +1,20 @@ -====================== ============ ======== ================================================================ -Name Type Default Description -====================== ============ ======== ================================================================ -baseline path none Baseline file -feedComposition real64_array required Feed composition array [mol fraction] -fluid groupNameRef required Fluid to test -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -output string none Output file -outputCompressibility integer 0 Flag to indicate that the total compressibility should be output -outputPhaseComposition integer 0 Flag to indicate that phase compositions should be output -pressureControl groupNameRef required Function controlling pressure time history -steps integer required Number of load steps to take -temperatureControl groupNameRef required Function controlling temperature time history -====================== ============ ======== ================================================================ +====================== ============ ======== ===================================================================== +Name Type Default Description +====================== ============ ======== ===================================================================== +baseline path none Baseline file +feedComposition real64_array required Feed composition array [mol fraction] +fluid groupNameRef required Fluid to test +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +output string none Output file +outputCompressibility integer 0 Flag to indicate that the total compressibility should be output +outputMassDensity integer 0 Flag to indicate that the mass density of each phase should be output +outputPhaseComposition integer 0 Flag to indicate that phase compositions should be output +pressureControl groupNameRef required Function controlling pressure time history +steps integer required Number of load steps to take +temperatureControl groupNameRef required Function controlling temperature time history +====================== ============ ======== ===================================================================== diff --git a/src/coreComponents/schema/docs/ParticleRegion_other.rst b/src/coreComponents/schema/docs/ParticleRegion_other.rst index fbfc33ebf7f..f57cca08d6b 100644 --- a/src/coreComponents/schema/docs/ParticleRegion_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +neighborData node :ref:`DATASTRUCTURE_neighborData` +particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/ParticleRegions_other.rst b/src/coreComponents/schema/docs/ParticleRegions_other.rst index 48075ebfe05..94022d14540 100644 --- a/src/coreComponents/schema/docs/ParticleRegions_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegions_other.rst @@ -1,17 +1,17 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` +neighborData node :ref:`DATASTRUCTURE_neighborData` +particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/PermeabilityBase.rst b/src/coreComponents/schema/docs/PermeabilityBase.rst deleted file mode 100644 index f6c735e1d91..00000000000 --- a/src/coreComponents/schema/docs/PermeabilityBase.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ========= ======== =========================================== -Name Type Default Description -==== ========= ======== =========================================== -name groupName required A name is required for any non-unique nodes -==== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PermeabilityBase_other.rst b/src/coreComponents/schema/docs/PermeabilityBase_other.rst deleted file mode 100644 index fa997a57413..00000000000 --- a/src/coreComponents/schema/docs/PermeabilityBase_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -=============== ============== ======================================================== -Name Type Description -=============== ============== ======================================================== -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ======================================================== - - diff --git a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst b/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst +++ b/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst b/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst +++ b/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/PressurePermeability.rst b/src/coreComponents/schema/docs/PressurePermeability.rst new file mode 100644 index 00000000000..b8f04d3f124 --- /dev/null +++ b/src/coreComponents/schema/docs/PressurePermeability.rst @@ -0,0 +1,14 @@ + + +=============================== =================================== ========== ===================================================================== +Name Type Default Description +=============================== =================================== ========== ===================================================================== +maxPermeability real64 1 Max. permeability can be reached. +name groupName required A name is required for any non-unique nodes +pressureDependenceConstants R1Tensor required Pressure dependence coefficients for each permeability component. +pressureModelType geos_constitutive_PressureModelType Hyperbolic Type of the pressure dependence model. +referencePermeabilityComponents R1Tensor required Reference xx, yy and zz components of a diagonal permeability tensor. +referencePressure real64 required Reference pressure for the pressure permeability model +=============================== =================================== ========== ===================================================================== + + diff --git a/src/coreComponents/schema/docs/PressurePermeability_other.rst b/src/coreComponents/schema/docs/PressurePermeability_other.rst new file mode 100644 index 00000000000..dd549711708 --- /dev/null +++ b/src/coreComponents/schema/docs/PressurePermeability_other.rst @@ -0,0 +1,11 @@ + + +===================== ============== ======================================================== +Name Type Description +===================== ============== ======================================================== +dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure +permeability real64_array3d Rock permeability +referencePermeability real64_array3d Reference permeability field +===================== ============== ======================================================== + + diff --git a/src/coreComponents/schema/docs/ProppantTransport_other.rst b/src/coreComponents/schema/docs/ProppantTransport_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/ProppantTransport_other.rst +++ b/src/coreComponents/schema/docs/ProppantTransport_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst b/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst index 74f30d53b77..05bd31c0020 100644 --- a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst +++ b/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst @@ -1,34 +1,34 @@ -================================ ============================================================================================= ============================================================================================================ -Name Type Description -================================ ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ============================================================================================= ============================================================================================================ +================================ ========================================================================================= ============================================================================================================ +Name Type Description +================================ ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kineticReactionRates real64_array2d kineticReactionRates +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +primarySpeciesConcentration real64_array2d primarySpeciesConcentration +primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration +secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +================================ ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveBrine_other.rst b/src/coreComponents/schema/docs/ReactiveBrine_other.rst index 74f30d53b77..05bd31c0020 100644 --- a/src/coreComponents/schema/docs/ReactiveBrine_other.rst +++ b/src/coreComponents/schema/docs/ReactiveBrine_other.rst @@ -1,34 +1,34 @@ -================================ ============================================================================================= ============================================================================================================ -Name Type Description -================================ ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ============================================================================================= ============================================================================================================ +================================ ========================================================================================= ============================================================================================================ +Name Type Description +================================ ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kineticReactionRates real64_array2d kineticReactionRates +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +primarySpeciesConcentration real64_array2d primarySpeciesConcentration +primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration +secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +================================ ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst +++ b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SeismicityRate.rst b/src/coreComponents/schema/docs/SeismicityRate.rst new file mode 100644 index 00000000000..492a69e75e2 --- /dev/null +++ b/src/coreComponents/schema/docs/SeismicityRate.rst @@ -0,0 +1,20 @@ + + +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +backgroundStressingRate real64 required Background stressing rate +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +directEffect real64 required Rate-and-state friction direct effect parameter +faultNormalDirection R1Tensor {0,0,0} Fault normal direction +faultShearDirection R1Tensor {0,0,0} Fault shear direction +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +stressSolverName string Name of solver for computing stress +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SeismicityRate_other.rst b/src/coreComponents/schema/docs/SeismicityRate_other.rst new file mode 100644 index 00000000000..cccf4603c70 --- /dev/null +++ b/src/coreComponents/schema/docs/SeismicityRate_other.rst @@ -0,0 +1,14 @@ + + +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM.rst b/src/coreComponents/schema/docs/SinglePhaseFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst index d1627f7fba7..f0cca96f3a1 100644 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================ ================================================================ +========================= ====================================================================================================================================================== ================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================ ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst b/src/coreComponents/schema/docs/SinglePhaseWell_other.rst index 3f16a155d2b..f2c739b92d8 100644 --- a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseWell_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +WellControls node :ref:`DATASTRUCTURE_WellControls` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidInternalEnergy.rst b/src/coreComponents/schema/docs/SolidInternalEnergy.rst index 3eea9887790..b4432cbfb54 100644 --- a/src/coreComponents/schema/docs/SolidInternalEnergy.rst +++ b/src/coreComponents/schema/docs/SolidInternalEnergy.rst @@ -1,12 +1,13 @@ -======================= ========= ======== =================================================== -Name Type Default Description -======================= ========= ======== =================================================== -name groupName required A name is required for any non-unique nodes -referenceInternalEnergy real64 required Internal energy at the reference temperature [J/kg] -referenceTemperature real64 required Reference temperature [K] -volumetricHeatCapacity real64 required Solid volumetric heat capacity [J/(kg.K)] -======================= ========= ======== =================================================== +==================================== ========= ======== ================================================================================= +Name Type Default Description +==================================== ========= ======== ================================================================================= +dVolumetricHeatCapacity_dTemperature real64 0 Derivative of the solid volumetric heat capacity w.r.t. temperature [J/(m^3.K^2)] +name groupName required A name is required for any non-unique nodes +referenceInternalEnergy real64 required Internal energy at the reference temperature [J/kg] +referenceTemperature real64 required Reference temperature [K] +referenceVolumetricHeatCapacity real64 required Reference solid volumetric heat capacity [J/(kg.K)] +==================================== ========= ======== ================================================================================= diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst index 17da1cb5b33..1a9ad823675 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst @@ -1,16 +1,16 @@ -========================= ============================================================================================================================================================== ===================================================================== -Name Type Description -========================= ============================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ===================================================================== +========================= ====================================================================================================================================================== ===================================================================== +Name Type Description +========================= ====================================================================================================================================================== ===================================================================== +contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +surfaceGeneratorName string Name of the surface generator to use +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ===================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst index dcc17ebc657..9e6224ccea1 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst @@ -1,29 +1,30 @@ -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stabilizationName groupNameRef required Name of the stabilization to use in the lagrangian contact solver -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +massDamping real64 0 Value of mass based damping coefficient. +maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. +name groupName required A name is required for any non-unique nodes +newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. +newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option +stabilizationName groupNameRef required Name of the stabilization to use in the lagrangian contact solver +stabilizationScalingCoefficient real64 1 It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix. +stiffnessDamping real64 0 Value of stiffness based damping coefficient. +strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: + | 0 - Infinitesimal Strain + | 1 - Finite Strain +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: + | * QuasiStatic + | * ImplicitDynamic + | * ExplicitDynamic +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst index 17da1cb5b33..1a9ad823675 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst @@ -1,16 +1,16 @@ -========================= ============================================================================================================================================================== ===================================================================== -Name Type Description -========================= ============================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ===================================================================== +========================= ====================================================================================================================================================== ===================================================================== +Name Type Description +========================= ====================================================================================================================================================== ===================================================================== +contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +surfaceGeneratorName string Name of the surface generator to use +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ===================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst index a4018f48d74..e458a0e69b3 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst index a4018f48d74..e458a0e69b3 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst index 4cd129ff504..e0b8502fb7f 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst @@ -1,34 +1,34 @@ -========================= ============================================================================================================================================================== ================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ================================================================================================== -bcTable real64_array2d Array that stores time-dependent bc types on x-, x+, y-, y+, z- and z+ faces. -binSizeMultiplier integer Multiplier for setting bin size, used to speed up particle neighbor sorting -domainExtent real64_array domain extent -domainF real64_array domain deformation gradient -domainL real64_array domain L -elementSize real64_array Minimum element size in x, y and z -fTable real64_array2d Array that stores time-dependent grid-aligned stretches interpreted as a global background grid F. -globalMaximum real64_array global maximum -globalMinimum real64_array global minimum -localMaximum real64_array local maximum -localMaximumNoGhost real64_array local maximum without ghost cells -localMinimum real64_array local minimum -localMinimumNoGhost real64_array local minimum without ghost cells -m_ijkMap integer_array3d Map from indices in each spatial dimension to local node ID -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -numContactFlags integer Number of contact flags that can appear due to damage -numContactGroups integer Number of prescribed contact groups -numDims integer The number of active spatial dimensions, 2 for plane strain, 3 otherwise -numElements integer_array number of elements along partition directions -numVelocityFields integer Number of velocity fields -partitionExtent real64_array parititon extent -smallMass real64 The small mass threshold for ignoring extremely low-mass nodes. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================================================== +========================= ====================================================================================================================================================== ================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ================================================================================================== +bcTable real64_array2d Array that stores time-dependent bc types on x-, x+, y-, y+, z- and z+ faces. +binSizeMultiplier integer Multiplier for setting bin size, used to speed up particle neighbor sorting +domainExtent real64_array domain extent +domainF real64_array domain deformation gradient +domainL real64_array domain L +elementSize real64_array Minimum element size in x, y and z +fTable real64_array2d Array that stores time-dependent grid-aligned stretches interpreted as a global background grid F. +globalMaximum real64_array global maximum +globalMinimum real64_array global minimum +localMaximum real64_array local maximum +localMaximumNoGhost real64_array local maximum without ghost cells +localMinimum real64_array local minimum +localMinimumNoGhost real64_array local minimum without ghost cells +m_ijkMap integer_array3d Map from indices in each spatial dimension to local node ID +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +numContactFlags integer Number of contact flags that can appear due to damage +numContactGroups integer Number of prescribed contact groups +numDims integer The number of active spatial dimensions, 2 for plane strain, 3 otherwise +numElements integer_array number of elements along partition directions +numVelocityFields integer Number of velocity fields +partitionExtent real64_array parititon extent +smallMass real64 The small mass threshold for ignoring extremely low-mass nodes. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================================================== diff --git a/src/coreComponents/schema/docs/Solvers.rst b/src/coreComponents/schema/docs/Solvers.rst index b592e00dde7..87f18a99508 100644 --- a/src/coreComponents/schema/docs/Solvers.rst +++ b/src/coreComponents/schema/docs/Solvers.rst @@ -25,6 +25,7 @@ PhaseFieldDamageFEM node :ref:`XML_Pha PhaseFieldFracture node :ref:`XML_PhaseFieldFracture` ProppantTransport node :ref:`XML_ProppantTransport` ReactiveCompositionalMultiphaseOBL node :ref:`XML_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`XML_SeismicityRate` SinglePhaseFVM node :ref:`XML_SinglePhaseFVM` SinglePhaseHybridFVM node :ref:`XML_SinglePhaseHybridFVM` SinglePhasePoromechanics node :ref:`XML_SinglePhasePoromechanics` diff --git a/src/coreComponents/schema/docs/Solvers_other.rst b/src/coreComponents/schema/docs/Solvers_other.rst index a4b9911d0f2..3eca415d7e0 100644 --- a/src/coreComponents/schema/docs/Solvers_other.rst +++ b/src/coreComponents/schema/docs/Solvers_other.rst @@ -24,6 +24,7 @@ PhaseFieldDamageFEM node :ref:`DATASTRUCTURE_PhaseFiel PhaseFieldFracture node :ref:`DATASTRUCTURE_PhaseFieldFracture` ProppantTransport node :ref:`DATASTRUCTURE_ProppantTransport` ReactiveCompositionalMultiphaseOBL node :ref:`DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`DATASTRUCTURE_SeismicityRate` SinglePhaseFVM node :ref:`DATASTRUCTURE_SinglePhaseFVM` SinglePhaseHybridFVM node :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` SinglePhasePoromechanics node :ref:`DATASTRUCTURE_SinglePhasePoromechanics` diff --git a/src/coreComponents/schema/docs/SourceFlux.rst b/src/coreComponents/schema/docs/SourceFlux.rst index c227dcbd7d8..660880a3b49 100644 --- a/src/coreComponents/schema/docs/SourceFlux.rst +++ b/src/coreComponents/schema/docs/SourceFlux.rst @@ -1,20 +1,20 @@ -====================== ================== ======== ============================================================================== -Name Type Default Description -====================== ================== ======== ============================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -====================== ================== ======== ============================================================================== +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== +Name Type Default Description +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== +bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. +beginTime real64 -1e+99 Time at which the boundary condition will start being applied. +component integer -1 Component of field (if tensor) to apply boundary condition to. +direction R1Tensor {0,0,0} Direction to apply boundary condition to. +endTime real64 1e+99 Time at which the boundary condition will stop being applied. +functionName groupNameRef Name of a function that specifies the variation of the production rate variations of this SourceFlux.Multiplied by scale. If no function is provided, a constant value of 1 is used.The producted fluid rate unit is in kg by default, or in mole if the flow solver has a useMass of 0. +initialCondition integer 0 Boundary condition is applied as an initial condition. +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +objectPath groupNameRef Path to the target field +scale real64 0 Multiplier of the functionName value. If no functionName is provided, this value is used directly. +setNames groupNameRef_array required Name of sets that boundary condition is applied to. +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics.rst b/src/coreComponents/schema/docs/SourceFluxStatistics.rst new file mode 100644 index 00000000000..a5ef4f42a89 --- /dev/null +++ b/src/coreComponents/schema/docs/SourceFluxStatistics.rst @@ -0,0 +1,16 @@ + + +============== ================== ======== ===================================================================================================================================================================================== +Name Type Default Description +============== ================== ======== ===================================================================================================================================================================================== +flowSolverName groupNameRef required Name of the flow solver +fluxNames groupNameRef_array {*} Name(s) array of the SourceFlux(s) for which we want the statistics. Use "*" to target all SourceFlux. +logLevel integer 0 | Log level + | - Log Level 1 outputs the sum of all SourceFlux(s) produced rate & mass, + | - Log Level 2 details values for each SourceFlux, + | - Log Level 3 details values for each region. +name groupName required A name is required for any non-unique nodes +writeCSV integer 0 Write statistics into a CSV file +============== ================== ======== ===================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst b/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst index a65968b0105..bb012ac8ff4 100644 --- a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst +++ b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst b/src/coreComponents/schema/docs/SurfaceGenerator_other.rst index d9e8cac2e2d..644325ed6a9 100644 --- a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst +++ b/src/coreComponents/schema/docs/SurfaceGenerator_other.rst @@ -1,19 +1,19 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -failCriterion integer (no description available) -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -tipEdges LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the tip edges -tipFaces LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the tip faces -tipNodes LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the nodes at the fracture tip -trailingFaces LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the trailing faces -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +failCriterion integer (no description available) +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +tipEdges LvArray_SortedArray Set containing all the tip edges +tipFaces LvArray_SortedArray Set containing all the tip faces +tipNodes LvArray_SortedArray Set containing all the nodes at the fracture tip +trailingFaces LvArray_SortedArray Set containing all the trailing faces +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst b/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst index d8e9f22248c..d4c775cae61 100644 --- a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst +++ b/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst @@ -1,13 +1,13 @@ -=================================== ======================================================================================================= ============================================================================ -Name Type Description -=================================== ======================================================================================================= ============================================================================ -capPresWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== ======================================================================================================= ============================================================================ +=================================== =================================================================================================== ============================================================================ +Name Type Description +=================================== =================================================================================================== ============================================================================ +capPresWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction +phaseCapPressure real64_array3d Phase capillary pressure +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +=================================== =================================================================================================== ============================================================================ diff --git a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst index 1952771c2e9..f8e13266217 100644 --- a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst +++ b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst @@ -1,27 +1,27 @@ -================================ ======================================================================================================= =============================================================================== -Name Type Description -================================ ======================================================================================================= =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -drainagePhaseMaxVolumeFraction real64_array (no description available) -drainagePhaseMinVolumeFraction real64_array (no description available) -drainagePhaseRelPermEndPoint real64_array (no description available) -drainageRelPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -imbibitionPhaseMaxVolumeFraction real64_array (no description available) -imbibitionPhaseMinVolumeFraction real64_array (no description available) -imbibitionPhaseRelPermEndPoint real64_array (no description available) -imbibitionRelPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -landParameter real64_array (no description available) -phaseHasHysteresis integer_array (no description available) -phaseMaxHistoricalVolFraction real64_array2d Phase max historical phase volume fraction -phaseMinHistoricalVolFraction real64_array2d Phase min historical phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -waterOilMaxRelPerm real64 (no description available) -================================ ======================================================================================================= =============================================================================== +================================ =================================================================================================== =============================================================================== +Name Type Description +================================ =================================================================================================== =============================================================================== +dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction +drainagePhaseMaxVolumeFraction real64_array (no description available) +drainagePhaseMinVolumeFraction real64_array (no description available) +drainagePhaseRelPermEndPoint real64_array (no description available) +drainageRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +imbibitionPhaseMaxVolumeFraction real64_array (no description available) +imbibitionPhaseMinVolumeFraction real64_array (no description available) +imbibitionPhaseRelPermEndPoint real64_array (no description available) +imbibitionRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +landParameter real64_array (no description available) +phaseHasHysteresis integer_array (no description available) +phaseMaxHistoricalVolFraction real64_array2d Phase max historical phase volume fraction +phaseMinHistoricalVolFraction real64_array2d Phase min historical phase volume fraction +phaseOrder integer_array (no description available) +phaseRelPerm real64_array3d Phase relative permeability +phaseRelPerm_n real64_array3d Phase relative permeability at previous time +phaseTrappedVolFraction real64_array3d Phase trapped volume fraction +phaseTypes integer_array (no description available) +waterOilMaxRelPerm real64 (no description available) +================================ =================================================================================================== =============================================================================== diff --git a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst b/src/coreComponents/schema/docs/TableRelativePermeability_other.rst index d71522f8a7a..4d6a2f00651 100644 --- a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst +++ b/src/coreComponents/schema/docs/TableRelativePermeability_other.rst @@ -1,17 +1,17 @@ -=============================== ======================================================================================================= =============================================================================== -Name Type Description -=============================== ======================================================================================================= =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseMinVolumeFraction real64_array (no description available) -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -relPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -waterOilMaxRelPerm real64 (no description available) -=============================== ======================================================================================================= =============================================================================== +=============================== =================================================================================================== =============================================================================== +Name Type Description +=============================== =================================================================================================== =============================================================================== +dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction +phaseMinVolumeFraction real64_array (no description available) +phaseOrder integer_array (no description available) +phaseRelPerm real64_array3d Phase relative permeability +phaseRelPerm_n real64_array3d Phase relative permeability at previous time +phaseTrappedVolFraction real64_array3d Phase trapped volume fraction +phaseTypes integer_array (no description available) +relPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +waterOilMaxRelPerm real64 (no description available) +=============================== =================================================================================================== =============================================================================== diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst index 95301497c5c..4b2e9649e5a 100644 --- a/src/coreComponents/schema/docs/Tasks.rst +++ b/src/coreComponents/schema/docs/Tasks.rst @@ -5,6 +5,7 @@ Name Type Default Descrip =========================================================== ==== ======= ====================================================================== CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`XML_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`XML_CompositionalMultiphaseStatistics` +HydrofractureInitialization node :ref:`XML_HydrofractureInitialization` MultiphasePoromechanicsInitialization node :ref:`XML_MultiphasePoromechanicsInitialization` PVTDriver node :ref:`XML_PVTDriver` PackCollection node :ref:`XML_PackCollection` @@ -15,6 +16,7 @@ SinglePhaseReservoirPoromechanicsInitialization node :ref:`X SinglePhaseStatistics node :ref:`XML_SinglePhaseStatistics` SolidMechanicsStateReset node :ref:`XML_SolidMechanicsStateReset` SolidMechanicsStatistics node :ref:`XML_SolidMechanicsStatistics` +SourceFluxStatistics node :ref:`XML_SourceFluxStatistics` TriaxialDriver node :ref:`XML_TriaxialDriver` =========================================================== ==== ======= ====================================================================== diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst index dca37a26a99..991b7d3f475 100644 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ b/src/coreComponents/schema/docs/Tasks_other.rst @@ -5,6 +5,7 @@ Name Type Description =========================================================== ==== ================================================================================ CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`DATASTRUCTURE_CompositionalMultiphaseStatistics` +HydrofractureInitialization node :ref:`DATASTRUCTURE_HydrofractureInitialization` MultiphasePoromechanicsInitialization node :ref:`DATASTRUCTURE_MultiphasePoromechanicsInitialization` PVTDriver node :ref:`DATASTRUCTURE_PVTDriver` PackCollection node :ref:`DATASTRUCTURE_PackCollection` @@ -15,6 +16,7 @@ SinglePhaseReservoirPoromechanicsInitialization node :ref:`DATASTRUC SinglePhaseStatistics node :ref:`DATASTRUCTURE_SinglePhaseStatistics` SolidMechanicsStateReset node :ref:`DATASTRUCTURE_SolidMechanicsStateReset` SolidMechanicsStatistics node :ref:`DATASTRUCTURE_SolidMechanicsStatistics` +SourceFluxStatistics node :ref:`DATASTRUCTURE_SourceFluxStatistics` TriaxialDriver node :ref:`DATASTRUCTURE_TriaxialDriver` =========================================================== ==== ================================================================================ diff --git a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst b/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst index 9194c2431f9..a21d5757d0f 100644 --- a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst +++ b/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst @@ -1,15 +1,15 @@ -======================== ========================================================================================================================================== ======================================== -Name Type Description -======================== ========================================================================================================================================== ======================================== -cellStencil geos_CellElementStencilTPFA (no description available) -coefficientName groupNameRef Name of coefficient field -edfmStencil geos_EmbeddedSurfaceToCellStencil (no description available) -faceElementToCellStencil geos_FaceElementToCellStencil (no description available) -fieldName groupNameRef_array Name of primary solution field -fractureStencil geos_SurfaceElementStencil (no description available) -targetRegions geos_mapBase< string, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > List of regions to build the stencil for -======================== ========================================================================================================================================== ======================================== +======================== =================================================================================================================================== ======================================== +Name Type Description +======================== =================================================================================================================================== ======================================== +cellStencil geos_CellElementStencilTPFA (no description available) +coefficientName groupNameRef Name of coefficient field +edfmStencil geos_EmbeddedSurfaceToCellStencil (no description available) +faceElementToCellStencil geos_FaceElementToCellStencil (no description available) +fieldName groupNameRef_array Name of primary solution field +fractureStencil geos_SurfaceElementStencil (no description available) +targetRegions geos_mapBase, int, LvArray_ChaiBuffer>, std_integral_constant > List of regions to build the stencil for +======================== =================================================================================================================================== ======================================== diff --git a/src/coreComponents/schema/docs/VTK.rst b/src/coreComponents/schema/docs/VTK.rst index 3a376546ee3..b4e40348cb3 100644 --- a/src/coreComponents/schema/docs/VTK.rst +++ b/src/coreComponents/schema/docs/VTK.rst @@ -15,7 +15,7 @@ parallelThreads integer 1 Number of plot file plotFileRoot string VTK Name of the root file for this output. plotLevel integer 1 Level detail plot. Only fields with lower of equal plot level will be output. writeFEMFaces integer 0 (no description available) -writeGhostCells integer 0 Should the vtk files contain the ghost cells or not. +writeGhostCells integer 0 Should the face elements be written as 3d volumes or not. =========================== ======================= ======== ======================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/WellControls.rst b/src/coreComponents/schema/docs/WellControls.rst index 6560ae29291..c31d40067e7 100644 --- a/src/coreComponents/schema/docs/WellControls.rst +++ b/src/coreComponents/schema/docs/WellControls.rst @@ -7,6 +7,7 @@ control geos_WellControls_Control required | Well control. Va | * BHP | * phaseVolRate | * totalVolRate + | * massRate | * uninitialized enableCrossflow integer 1 | Flag to enable crossflow. Currently only supported for injectors: | - If the flag is set to 1, both reservoir-to-well flow and well-to-reservoir flow are allowed at the perforations. @@ -25,6 +26,8 @@ surfacePressure real64 0 Surface pressure u surfaceTemperature real64 0 Surface temperature used to compute volumetric rates when surface conditions are used [K] targetBHP real64 0 Target bottom-hole pressure [Pa] targetBHPTableName groupNameRef Name of the BHP table when the rate is a time dependent function +targetMassRate real64 0 Target Mass Rate rate ( [kg^3/s]) +targetMassRateTableName groupNameRef Name of the mass rate table when the rate is a time dependent function targetPhaseName groupNameRef Name of the target phase targetPhaseRate real64 0 Target phase volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s]) targetPhaseRateTableName groupNameRef Name of the phase rate table when the rate is a time dependent function diff --git a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst index 3a4675201c0..eca5644ac14 100644 --- a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst @@ -1,29 +1,29 @@ -========================== ========================================================================================================== ========================================================= -Name Type Description -========================== ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -elementCenter real64_array2d (no description available) -elementVolume real64_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nextWellElementIndex integer_array (no description available) -nextWellElementIndexGlobal integer_array (no description available) -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -numEdgesPerElement integer (no description available) -numFacesPerElement integer (no description available) -numNodesPerElement integer (no description available) -radius real64_array (no description available) -topRank integer (no description available) -topWellElementIndex integer (no description available) -wellControlsName groupNameRef (no description available) -ConstitutiveModels node :ref:`DATASTRUCTURE_ConstitutiveModels` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -wellElementSubRegion node :ref:`DATASTRUCTURE_wellElementSubRegion` -========================== ========================================================================================================== ========================================================= +========================== ===================================================================================================== ========================================================= +Name Type Description +========================== ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +elementCenter real64_array2d (no description available) +elementVolume real64_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nextWellElementIndex integer_array (no description available) +nextWellElementIndexGlobal integer_array (no description available) +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +numEdgesPerElement integer (no description available) +numFacesPerElement integer (no description available) +numNodesPerElement integer (no description available) +radius real64_array (no description available) +topRank integer (no description available) +topWellElementIndex integer (no description available) +wellControlsName groupNameRef (no description available) +ConstitutiveModels node :ref:`DATASTRUCTURE_ConstitutiveModels` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +wellElementSubRegion node :ref:`DATASTRUCTURE_wellElementSubRegion` +========================== ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/WellElementRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegion_other.rst index 7235a663f6d..bb655ec67d1 100644 --- a/src/coreComponents/schema/docs/WellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegion_other.rst @@ -1,18 +1,18 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -wellControlsName groupNameRef (no description available) -wellGeneratorName groupNameRef (no description available) -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +wellControlsName groupNameRef (no description available) +wellGeneratorName groupNameRef (no description available) +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/domain_other.rst b/src/coreComponents/schema/docs/domain_other.rst index 18e678dae42..4cbdf6ffbda 100644 --- a/src/coreComponents/schema/docs/domain_other.rst +++ b/src/coreComponents/schema/docs/domain_other.rst @@ -1,12 +1,12 @@ -================ =================================================================================== ================================= -Name Type Description -================ =================================================================================== ================================= -Neighbors std_vector< geos_NeighborCommunicator, std_allocator< geos_NeighborCommunicator > > (no description available) -partitionManager geos_PartitionBase (no description available) -Constitutive node :ref:`DATASTRUCTURE_Constitutive` -MeshBodies node :ref:`DATASTRUCTURE_MeshBodies` -================ =================================================================================== ================================= +================ ================================================================================ ================================= +Name Type Description +================ ================================================================================ ================================= +Neighbors std_vector > (no description available) +partitionManager geos_PartitionBase (no description available) +Constitutive node :ref:`DATASTRUCTURE_Constitutive` +MeshBodies node :ref:`DATASTRUCTURE_MeshBodies` +================ ================================================================================ ================================= diff --git a/src/coreComponents/schema/docs/edgeManager_other.rst b/src/coreComponents/schema/docs/edgeManager_other.rst index 597da5bf9b8..0d02ec6d8c8 100644 --- a/src/coreComponents/schema/docs/edgeManager_other.rst +++ b/src/coreComponents/schema/docs/edgeManager_other.rst @@ -1,17 +1,17 @@ -======================= ========================================================================================================== ========================================================= -Name Type Description -======================= ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ========================================================================================================== ========================================================= +======================= ===================================================================================================== ========================================================= +Name Type Description +======================= ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst index 597da5bf9b8..0d02ec6d8c8 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst @@ -1,17 +1,17 @@ -======================= ========================================================================================================== ========================================================= -Name Type Description -======================= ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ========================================================================================================== ========================================================= +======================= ===================================================================================================== ========================================================= +Name Type Description +======================= ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst index 7c14a19c09a..3a3c4f725f8 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst @@ -1,22 +1,22 @@ -======================= =============================================================================== ============================================= ================================================================ -Name Type Registered By Description -======================= =============================================================================== ============================================= ================================================================ -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -elemList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemSubRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -parentEdgeGlobalIndex globalIndex_array (no description available) -referencePosition real64_array2d (no description available) -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= =============================================================================== ============================================= ================================================================ +======================= ============================================================================ ============================================= ================================================================ +Name Type Registered By Description +======================= ============================================================================ ============================================= ================================================================ +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList LvArray_ArrayOfArrays (no description available) +elemRegionList LvArray_ArrayOfArrays (no description available) +elemSubRegionList LvArray_ArrayOfArrays (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +parentEdgeGlobalIndex globalIndex_array (no description available) +referencePosition real64_array2d (no description available) +parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================ ============================================= ================================================================ diff --git a/src/coreComponents/schema/docs/faceManager_other.rst b/src/coreComponents/schema/docs/faceManager_other.rst index f821f295cfd..7f1730f0304 100644 --- a/src/coreComponents/schema/docs/faceManager_other.rst +++ b/src/coreComponents/schema/docs/faceManager_other.rst @@ -1,25 +1,25 @@ -======================= ================================================================================= ================================================================================================ ========================================================= -Name Type Registered By Description -======================= ================================================================================= ================================================================================================ ========================================================= -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > > (no description available) -elemList integer_array2d (no description available) -elemRegionList integer_array2d (no description available) -elemSubRegionList integer_array2d (no description available) -faceArea real64_array (no description available) -faceCenter real64_array2d (no description available) -faceNormal real64_array2d (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > > (no description available) -facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================================= ================================================================================================ ========================================================= +======================= ============================================================================== ================================================================================================ ========================================================= +Name Type Registered By Description +======================= ============================================================================== ================================================================================================ ========================================================= +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList integer_array2d (no description available) +elemRegionList integer_array2d (no description available) +elemSubRegionList integer_array2d (no description available) +faceArea real64_array (no description available) +faceCenter real64_array2d (no description available) +faceNormal real64_array2d (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation > (no description available) +facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step +mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================== ================================================================================================ ========================================================= diff --git a/src/coreComponents/schema/docs/nodeManager_other.rst b/src/coreComponents/schema/docs/nodeManager_other.rst index e4fa1245fee..cde3077884e 100644 --- a/src/coreComponents/schema/docs/nodeManager_other.rst +++ b/src/coreComponents/schema/docs/nodeManager_other.rst @@ -1,22 +1,22 @@ -======================= =============================================================================== ========================================================= -Name Type Description -======================= =============================================================================== ========================================================= -ReferencePosition real64_array2d (no description available) -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -elemList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemSubRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -primaryField real64_array Primary field variable -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= =============================================================================== ========================================================= +======================= ============================================================================ ========================================================= +Name Type Description +======================= ============================================================================ ========================================================= +ReferencePosition real64_array2d (no description available) +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList LvArray_ArrayOfArrays (no description available) +elemRegionList LvArray_ArrayOfArrays (no description available) +elemSubRegionList LvArray_ArrayOfArrays (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +primaryField real64_array Primary field variable +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================ ========================================================= diff --git a/src/coreComponents/schema/docs/sets_other.rst b/src/coreComponents/schema/docs/sets_other.rst index 07baf6428bc..59e718c41f8 100644 --- a/src/coreComponents/schema/docs/sets_other.rst +++ b/src/coreComponents/schema/docs/sets_other.rst @@ -1,9 +1,9 @@ -=========== =================================================== ========================== -Name Type Description -=========== =================================================== ========================== -externalSet LvArray_SortedArray< int, int, LvArray_ChaiBuffer > (no description available) -=========== =================================================== ========================== +=========== ================================================= ========================== +Name Type Description +=========== ================================================= ========================== +externalSet LvArray_SortedArray (no description available) +=========== ================================================= ========================== diff --git a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst index 13799ea3e78..6ceeee5546c 100644 --- a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst +++ b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst @@ -1,23 +1,23 @@ -========================= ==================================================================== ====================================================================== -Name Type Description -========================= ==================================================================== ====================================================================== -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -location real64_array2d For each perforation, physical location (x,y,z coordinates) -numPerforationsGlobal globalIndex (no description available) -reservoirElementIndex integer_array For each perforation, element index of the perforated element -reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element -reservoirElementSubregion integer_array For each perforation, elementSubRegion index of the perforated element -wellElementIndex integer_array For each perforation, index of the well element -wellSkinFactor real64_array For each perforation, well skin factor -wellTransmissibility real64_array For each perforation, well transmissibility -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -========================= ==================================================================== ====================================================================== +========================= ================================================================= ====================================================================== +Name Type Description +========================= ================================================================= ====================================================================== +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +location real64_array2d For each perforation, physical location (x,y,z coordinates) +numPerforationsGlobal globalIndex (no description available) +reservoirElementIndex integer_array For each perforation, element index of the perforated element +reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element +reservoirElementSubregion integer_array For each perforation, elementSubRegion index of the perforated element +wellElementIndex integer_array For each perforation, index of the well element +wellSkinFactor real64_array For each perforation, well skin factor +wellTransmissibility real64_array For each perforation, well transmissibility +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +========================= ================================================================= ====================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 1f6363b218c..9faa9453548 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -393,6 +393,10 @@ + + + + @@ -467,6 +471,10 @@ + + + + @@ -507,6 +515,10 @@ + + + + @@ -565,12 +577,20 @@ - - + + + + + + - - + + + + + + @@ -593,6 +613,10 @@ + + + + @@ -701,10 +725,6 @@ - - - - @@ -757,6 +777,10 @@ + + + + @@ -906,9 +930,9 @@ - + - + @@ -1229,7 +1253,7 @@ This keyword is ignored for single-phase flow simulations--> - + @@ -1237,7 +1261,7 @@ This keyword is ignored for single-phase flow simulations--> - + @@ -1851,6 +1875,8 @@ the relative residual norm satisfies: + + @@ -1868,6 +1894,8 @@ the relative residual norm satisfies: + + @@ -2087,7 +2115,7 @@ the relative residual norm satisfies: - + @@ -2130,6 +2158,7 @@ the relative residual norm satisfies: + @@ -2379,6 +2408,8 @@ the relative residual norm satisfies: + + @@ -2403,7 +2434,7 @@ the relative residual norm satisfies: - + @@ -2457,6 +2488,8 @@ the relative residual norm satisfies: + + @@ -2471,7 +2504,7 @@ the relative residual norm satisfies: - + @@ -2570,6 +2603,7 @@ Local - Add stabilization only to interiors of macro elements.--> * BHP * phaseVolRate * totalVolRate +* massRate * uninitialized--> + + + + @@ -2621,7 +2659,7 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -2734,6 +2772,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2802,6 +2842,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2813,6 +2855,11 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + + + + @@ -3041,6 +3088,32 @@ Local - Add stabilization only to interiors of macro elements.--> + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3054,7 +3127,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3084,7 +3161,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3200,7 +3281,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3345,6 +3430,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + + @@ -3551,16 +3639,17 @@ Local - Add stabilization only to interiors of macro elements.--> + - - + + @@ -3580,13 +3669,23 @@ Local - Add stabilization only to interiors of macro elements.--> + + + + + + + + + + - - + + @@ -3603,6 +3702,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3665,20 +3766,20 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + - - + + @@ -3714,6 +3815,21 @@ Local - Add stabilization only to interiors of macro elements.--> + + + + + + + + + + + + @@ -3756,13 +3872,16 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + + + + @@ -3790,7 +3909,6 @@ Local - Add stabilization only to interiors of macro elements.--> - @@ -3804,6 +3922,7 @@ Local - Add stabilization only to interiors of macro elements.--> + @@ -3828,12 +3947,12 @@ Local - Add stabilization only to interiors of macro elements.--> + + - - @@ -4068,6 +4187,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4075,7 +4196,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + @@ -4086,7 +4207,31 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4096,10 +4241,39 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -4110,7 +4284,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + @@ -4120,6 +4294,11 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4204,6 +4383,18 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + + + + + + + + + + + @@ -4748,10 +4939,6 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia - - - - @@ -4908,6 +5095,25 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + + + + + + + + + + + + + + + + + + @@ -5019,12 +5225,14 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + - - + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index c4c0af4cf3e..a0fbfc4a731 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -471,7 +471,7 @@ - + @@ -523,6 +523,7 @@ + @@ -550,7 +551,7 @@ - + @@ -587,13 +588,13 @@ - + - - + + @@ -638,13 +639,13 @@ - + - - + + @@ -679,13 +680,13 @@ - + - - + + @@ -712,7 +713,7 @@ - + @@ -723,7 +724,7 @@ - + @@ -736,7 +737,7 @@ - + @@ -749,7 +750,7 @@ - + @@ -765,7 +766,7 @@ - + @@ -773,7 +774,7 @@ - + @@ -799,11 +800,11 @@ - - - + + + @@ -862,11 +863,11 @@ - - - + + + @@ -893,7 +894,7 @@ - + @@ -906,7 +907,7 @@ - + @@ -919,7 +920,7 @@ - + @@ -932,7 +933,7 @@ - + @@ -945,7 +946,7 @@ - + @@ -960,7 +961,7 @@ - + @@ -971,7 +972,7 @@ - + @@ -984,7 +985,7 @@ - + @@ -995,7 +996,7 @@ - + @@ -1006,7 +1007,20 @@ - + + + + + + + + + + + + + + @@ -1017,7 +1031,7 @@ - + @@ -1028,7 +1042,7 @@ - + @@ -1041,7 +1055,7 @@ - + @@ -1056,7 +1070,7 @@ - + @@ -1071,7 +1085,7 @@ - + @@ -1086,7 +1100,7 @@ - + @@ -1097,7 +1111,7 @@ - + @@ -1110,7 +1124,7 @@ - + @@ -1123,7 +1137,7 @@ - + @@ -1139,7 +1153,7 @@ - + @@ -1154,7 +1168,7 @@ - + @@ -1171,7 +1185,7 @@ - + @@ -1186,7 +1200,7 @@ - + @@ -1199,7 +1213,7 @@ - + @@ -1238,7 +1252,7 @@ - + @@ -1267,20 +1281,21 @@ - + - + - + - + - + + @@ -1291,11 +1306,13 @@ + + @@ -1306,6 +1323,7 @@ + @@ -1339,7 +1357,7 @@ - + @@ -1358,13 +1376,16 @@ - - + + + + + @@ -1392,7 +1413,6 @@ - @@ -1406,6 +1426,7 @@ + @@ -1438,6 +1459,8 @@ + + @@ -1459,7 +1482,7 @@ - + @@ -1475,7 +1498,7 @@ - + @@ -1511,7 +1534,7 @@ - + @@ -1575,7 +1598,7 @@ - + @@ -1621,7 +1644,7 @@ - + @@ -1667,7 +1690,7 @@ - + @@ -1713,7 +1736,7 @@ - + @@ -1787,7 +1810,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1802,6 +1871,8 @@ + + @@ -1831,9 +1902,9 @@ - + - + @@ -1848,6 +1919,8 @@ + + @@ -1877,9 +1950,9 @@ - + - + @@ -1894,6 +1967,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1957,6 +2080,7 @@ + @@ -2039,7 +2163,7 @@ - + @@ -2055,7 +2179,7 @@ - + @@ -2091,7 +2215,7 @@ - + @@ -2268,7 +2392,7 @@ - + @@ -2361,12 +2485,6 @@ - - - - - - @@ -2380,6 +2498,14 @@ + + + + + + + + @@ -2479,7 +2605,7 @@ - + @@ -2533,7 +2659,7 @@ - + @@ -2607,7 +2733,7 @@ - + @@ -2633,7 +2759,7 @@ - + @@ -2647,7 +2773,7 @@ - + @@ -2655,7 +2781,7 @@ - + @@ -2879,7 +3005,7 @@ - + @@ -2889,7 +3015,7 @@ - + @@ -2903,7 +3029,7 @@ - + @@ -2918,17 +3044,17 @@ - + - + - + @@ -2938,17 +3064,17 @@ - + - + - + @@ -2958,17 +3084,17 @@ - + - + - + - + - + @@ -2988,7 +3114,7 @@ - + @@ -3006,7 +3132,7 @@ - + @@ -3014,7 +3140,7 @@ - + @@ -3026,19 +3152,19 @@ - + - + - + - + - + - + @@ -3057,7 +3183,7 @@ - + @@ -3079,7 +3205,7 @@ - + @@ -3096,7 +3222,7 @@ - + @@ -3122,7 +3248,7 @@ - + @@ -3132,7 +3258,7 @@ - + @@ -3159,7 +3285,7 @@ - + @@ -3192,7 +3318,7 @@ - + diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index 93eb8ce0f7e..4bf19a4541d 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -76,9 +76,15 @@ string getSchemaTypeName( string_view rtTypeName ) // Note: Some type names involving strings can vary on compiler and be ugly. Convert these to "string" auto constexpr typeMergingRegex = "std_(__cxx11_basic_)?string(<\\s*char,\\s*std_char_traits,\\s*std_allocator\\s*>)?"; - string const xmlSafeName = std::regex_replace( sanitizedName, - std::regex( typeMergingRegex ), - "string" ); + string xmlSafeName = std::regex_replace( sanitizedName, + std::regex( typeMergingRegex ), + "string" ); + + // Replace '<', '>', spaces and ',' because the schema does not like them + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( "<" ), "_lt_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( ">" ), "_gt_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( "," ), "_cm_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( " " ), "-" ); return xmlSafeName; } diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index 3d49c154263..09542ae3472 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -10,5 +10,6 @@ add_subdirectory( meshTests ) add_subdirectory( finiteVolumeTests ) add_subdirectory( fileIOTests ) add_subdirectory( fluidFlowTests ) +add_subdirectory( testingUtilities ) add_subdirectory( wellsTests ) -add_subdirectory( wavePropagationTests ) +add_subdirectory( wavePropagationTests ) diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 5f03cf2eaaa..44890ac660a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -4,6 +4,9 @@ set( gtest_geosx_tests testCO2BrinePVTModels.cpp testCO2SpycherPruessModels.cpp testDamage.cpp + testMultiFluidCO2Brine.cpp + testMultiFluidDeadOil.cpp + testMultiFluidLiveOil.cpp testRelPerm.cpp testRelPermHysteresis.cpp ) @@ -39,8 +42,7 @@ endif() if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests - testMultiFluid.cpp ) - + testMultiFluidCompositionalMultiphasePVTPackage.cpp ) list( APPEND dependencyList PVTPackage ) endif() diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp new file mode 100644 index 00000000000..b6f8d7dde47 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -0,0 +1,529 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file MultiFluidTest.hpp + */ + +#ifndef GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ +#define GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ + +#include "constitutiveTestHelpers.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" + +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::constitutive::multifluid; + +namespace geos +{ +namespace testing +{ + +template< typename FLUID_TYPE > +struct UsePVTPackage +{ + static constexpr bool value = false; +}; + +template< integer N > +using Feed = std::array< real64, N >; + +template< integer N, typename ARRAY1, typename ARRAY2 > +void copy( ARRAY1 const & inputArray, ARRAY2 & outputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray[i] = inputArray[i]; + } +} + +template< integer N, typename T > +void fill( array1d< T > & outputArray, std::array< T const, N > const inputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray.emplace_back( inputArray[i] ); + } +} + +template< integer N, integer U, typename T > +void fill( arraySlice1d< T, U > const & outputArray, std::array< T const, N > const inputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray[i] = inputArray[i]; + } +} + +template< integer NUM_PHASE, integer NUM_COMP > +struct MultiFluidTestData +{ + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_ ); + + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + arraySlice1d< real64 const > const & composition_ ); + + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_, + real64 const totalDensity_, + Feed< NUM_PHASE > && phaseFraction_, + Feed< NUM_PHASE > && phaseDensity_, + Feed< NUM_PHASE > && phaseMassDensity_, + Feed< NUM_PHASE > && phaseViscosity_, + Feed< NUM_PHASE > && phaseEnthalpy_, + Feed< NUM_PHASE > && phaseInternalEnergy_ ); + + real64 const pressure{0.0}; + real64 const temperature{0.0}; + Feed< NUM_COMP > composition{}; + real64 const totalDensity{0.0}; + Feed< NUM_PHASE > phaseFraction{}; + Feed< NUM_PHASE > phaseDensity{}; + Feed< NUM_PHASE > phaseMassDensity{}; + Feed< NUM_PHASE > phaseViscosity{}; + Feed< NUM_PHASE > phaseEnthalpy{}; + Feed< NUM_PHASE > phaseInternalEnergy{}; +}; + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > +{ +public: + static constexpr integer numPhase = NUM_PHASE; + static constexpr integer numComp = NUM_COMP; + using TestData = MultiFluidTestData< numPhase, numComp >; + +public: + MultiFluidTest() = default; + ~MultiFluidTest() override = default; + + MultiFluidBase & getFluid() const { return *m_model; } + + Group & getParent() { return m_parent; } + + void testValuesAgainstPreviousImplementation( typename FLUID_TYPE::KernelWrapper const & wrapper, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const relTol ) const; + + void testNumericalDerivatives( MultiFluidBase & fluid, + Group * parent, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const perturbParameter, + real64 const relTol, + real64 const absTol = std::numeric_limits< real64 >::max() ); + + +protected: + virtual void resetFluid( MultiFluidBase & fluid ) const + { + GEOS_UNUSED_VAR( fluid ); + } + + static void writeTableToFile( string const & fileName, char const * content ) + { + std::ofstream os( fileName ); + ASSERT_TRUE( os.is_open() ); + os << content; + os.close(); + } + + static void removeFile( string const & fileName ) + { + int const ret = std::remove( fileName.c_str() ); + ASSERT_TRUE( ret == 0 ); + } +}; + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >:: +testNumericalDerivatives( MultiFluidBase & fluid, + Group * parent, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const perturbParameter, + real64 const relTol, + real64 const absTol ) +{ + using Deriv = multifluid::DerivativeOffset; + + integer const NC = fluid.numFluidComponents(); + integer const NP = fluid.numFluidPhases(); + integer const NDOF = NC+2; + + bool const isThermal = fluid.isThermal(); + + // Copy input values into an array with expected layout + array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, NC ); + for( integer i = 0; i < NC; ++i ) + { + compositionValues[0][i] = testData.composition[i]; + } + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; + + auto const & components = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + auto const & phases = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + + // create a clone of the fluid to run updates on + string const fluidCopyName = fluid.getName() + "Copy"; + std::unique_ptr< ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( fluidCopyName, parent ); + MultiFluidBase & fluidCopy = dynamicCast< MultiFluidBase & >( *fluidCopyPtr ); + + fluid.allocateConstitutiveData( fluid.getParent(), 1 ); + fluidCopy.allocateConstitutiveData( fluid.getParent(), 1 ); + + // extract data views from both fluids + #define GET_FLUID_DATA( FLUID, TRAIT ) \ + FLUID.getReference< TRAIT::type >( TRAIT::key() )[0][0] + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseFrac { + GET_FLUID_DATA( fluid, fields::multifluid::phaseFraction ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseFraction ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseDens { + GET_FLUID_DATA( fluid, fields::multifluid::phaseDensity ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseDensity ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseVisc { + GET_FLUID_DATA( fluid, fields::multifluid::phaseViscosity ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseViscosity ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseEnthalpy { + GET_FLUID_DATA( fluid, fields::multifluid::phaseEnthalpy ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseEnthalpy ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseInternalEnergy { + GET_FLUID_DATA( fluid, fields::multifluid::phaseInternalEnergy ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseInternalEnergy ) + }; + + MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > phaseCompFrac { + GET_FLUID_DATA( fluid, fields::multifluid::phaseCompFraction ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseCompFraction ) + }; + + MultiFluidVarSlice< real64, 0, USD_FLUID - 2, USD_FLUID_DC - 2 > totalDens { + GET_FLUID_DATA( fluid, fields::multifluid::totalDensity ), + GET_FLUID_DATA( fluid, fields::multifluid::dTotalDensity ) + }; + + auto const & phaseFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseFraction ); + auto const & phaseDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseDensity ); + auto const & phaseViscCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseViscosity ); + auto const & phaseEnthCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseEnthalpy ); + auto const & phaseEnergyCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseInternalEnergy ); + auto const & phaseCompFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseCompFraction ); + auto const & totalDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::totalDensity ); + +#undef GET_FLUID_DATA + + // Enthalpy and internal energy values can be quite large and prone to round-off errors when + // performing finite difference derivatives. We will therefore scale the values using this + // reference enthalpy value to bring them to a more manageable scale. + real64 constexpr referenceEnthalpy = 5.0584e5; + auto const scaleEnthalpy = []( auto & arraySlice ) + { + LvArray::forValuesInSlice( arraySlice, []( real64 & value ){ value /= referenceEnthalpy; } ); + }; + + real64 const pressure = testData.pressure; + real64 const temperature = testData.temperature; + + // set the original fluid state to current + constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) + { + typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); + fluidWrapper.update( 0, 0, pressure, temperature, composition ); + } ); + + if( isThermal ) + { + scaleEnthalpy( phaseEnthalpy.value ); + scaleEnthalpy( phaseEnthalpy.derivs ); + scaleEnthalpy( phaseInternalEnergy.value ); + scaleEnthalpy( phaseInternalEnergy.derivs ); + } + + // now perturb variables and update the copied fluid's state + constitutive::constitutiveUpdatePassThru( fluidCopy, [&] ( auto & castedFluid ) + { + typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); + + // to be able to use the checkDerivative utility function, we have to invert the layout + auto dPhaseFrac = invertLayout( phaseFrac.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseDens = invertLayout( phaseDens.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseVisc = invertLayout( phaseVisc.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseEnth = invertLayout( phaseEnthalpy.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseEnergy = invertLayout( phaseInternalEnergy.derivs.toSliceConst(), NP, NDOF ); + auto dTotalDens = invertLayout( totalDens.derivs.toSliceConst(), NDOF ); + auto dPhaseCompFrac = invertLayout( phaseCompFrac.derivs.toSliceConst(), NP, NC, NDOF ); + + // update pressure and check derivatives + { + real64 const dP = perturbParameter * (pressure + perturbParameter); + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure + dP, temperature, composition ); + + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseFrac", "Pres", phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseDens", "Pres", phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseVisc", "Pres", phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dP], + dP, relTol, absTol, "totalDens", "Pres" ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseCompFrac", "Pres", phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseEnth", "Pres", phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseEnergy", "Pres", phases ); + } + } + + // update temperature and check derivatives + { + real64 const dT = perturbParameter * (temperature + perturbParameter); + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure, temperature + dT, composition ); + + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseFrac", "Temp", phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseDens", "Temp", phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseVisc", "Temp", phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dT], + dT, relTol, absTol, "totalDens", "Temp" ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseCompFrac", "Temp", phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseEnth", "Temp", phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseEnergy", "Temp", phases ); + } + } + + array2d< real64, compflow::LAYOUT_COMP > compNew( 1, NC ); + for( integer jc = 0; jc < NC; ++jc ) + { + real64 const dC = LvArray::math::max( 1.0e-7, perturbParameter * ( composition[jc] + perturbParameter ) ); + for( integer ic = 0; ic < NC; ++ic ) + { + compNew[0][ic] = composition[ic]; + } + compNew[0][jc] += dC; + + // Note: in PVTPackage, derivatives are obtained with finite-difference approx **with normalization of the comp fraction** + // The component fraction is perturbed (just as above), and then all the component fractions are normalized (as below) + // But, in the native DO model and in CO2BrinePhillips, derivatives are computed analytically, which results in different + // derivatives wrt component fractions--although the derivatives wrt component densities obtained with the chain rule + // in the solver will be very similar (see discussion on PR #1325 on GitHub). + // + // Since both approaches--FD approximation of derivatives with normalization, and analytical derivatives--are correct, + // we have to support both when we check the intermediate derivatives wrt component fractions below. Therefore, if the + // PVTPackage is used, then we normalize the perturbed component fractions before taking the FD approx. If the native + // DO or CO2-brine models are used, we skip the normalization below. + if constexpr ( UsePVTPackage< FLUID_TYPE >::value ) + { + // renormalize + real64 sum = 0.0; + for( integer ic = 0; ic < NC; ++ic ) + { + sum += compNew[0][ic]; + } + for( integer ic = 0; ic < NC; ++ic ) + { + compNew[0][ic] /= sum; + } + } + + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure, temperature, compNew[0] ); + + string const var = "compFrac[" + components[jc] + "]"; + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseFrac", var, phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseDens", var, phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseVisc", var, phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dC+jc], + dC, relTol, absTol, "totalDens", var ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseCompFrac", var, phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseEnth", var, phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseEnergy", var, phases ); + } + } + } ); +} + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >::testValuesAgainstPreviousImplementation( typename FLUID_TYPE::KernelWrapper const & wrapper, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const relTol ) const +{ + integer constexpr numDof = numComp + 2; + + // Copy input values into an array with expected layout + array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, numComp ); + for( integer i = 0; i < numComp; ++i ) + { + compositionValues[0][i] = testData.composition[i]; + } + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; + + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); + StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); + StackArray< real64, 2, 1, LAYOUT_FLUID > totalDensity( 1, 1 ); + StackArray< real64, 3, numDof, LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); + + wrapper.compute( testData.pressure, + testData.temperature, + composition, + { phaseFraction[0][0], dPhaseFraction[0][0] }, + { phaseDensity[0][0], dPhaseDensity[0][0] }, + { phaseMassDensity[0][0], dPhaseMassDensity[0][0] }, + { phaseViscosity[0][0], dPhaseViscosity[0][0] }, + { phaseEnthalpy[0][0], dPhaseEnthalpy[0][0] }, + { phaseInternalEnergy[0][0], dPhaseInternalEnergy[0][0] }, + { phaseCompFraction[0][0], dPhaseCompFraction[0][0] }, + { totalDensity[0][0], dTotalDensity[0][0] } ); + + checkRelativeError( totalDensity[0][0], testData.totalDensity, relTol ); + for( integer ip = 0; ip < numPhase; ++ip ) + { + checkRelativeError( phaseFraction[0][0][ip], testData.phaseFraction[ip], relTol ); + checkRelativeError( phaseDensity[0][0][ip], testData.phaseDensity[ip], relTol ); + checkRelativeError( phaseMassDensity[0][0][ip], testData.phaseMassDensity[ip], relTol ); + checkRelativeError( phaseViscosity[0][0][ip], testData.phaseViscosity[ip], relTol ); + checkRelativeError( phaseEnthalpy[0][0][ip], testData.phaseEnthalpy[ip], relTol ); + checkRelativeError( phaseInternalEnergy[0][0][ip], testData.phaseInternalEnergy[ip], relTol ); + } +} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_ ): + pressure( pressure_ ), + temperature( temperature_ ), + composition( composition_ ) +{} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + arraySlice1d< real64 const > const & composition_ ): + pressure( pressure_ ), + temperature( temperature_ ) +{ + copy< NUM_COMP >( composition_, composition ); +} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_, + real64 const totalDensity_, + Feed< NUM_PHASE > && phaseFraction_, + Feed< NUM_PHASE > && phaseDensity_, + Feed< NUM_PHASE > && phaseMassDensity_, + Feed< NUM_PHASE > && phaseViscosity_, + Feed< NUM_PHASE > && phaseEnthalpy_, + Feed< NUM_PHASE > && phaseInternalEnergy_ ): + pressure( pressure_ ), + temperature( temperature_ ), + composition( composition_ ), + totalDensity( totalDensity_ ), + phaseFraction( phaseFraction_ ), + phaseDensity( phaseDensity_ ), + phaseMassDensity( phaseMassDensity_ ), + phaseViscosity( phaseViscosity_ ), + phaseEnthalpy( phaseEnthalpy_ ), + phaseInternalEnergy( phaseInternalEnergy_ ) +{} + +template< integer N > +inline ::std::ostream & PrintTo( string const & name, Feed< N > const & data, ::std::ostream & os ) +{ + os << " \"" << name << "\": [ " << data[0]; + for( integer i = 1; i < N; i++ ) + { + os << ", " << data[i]; + } + os << " ]"; + return os; +} + +template< integer NUM_PHASE, integer NUM_COMP > +inline void PrintTo( MultiFluidTestData< NUM_PHASE, NUM_COMP > const & data, ::std::ostream *s ) +{ + std::ostream & os = *s; + + os << "{\n"; + os << " \"pressure\": " << data.pressure << ",\n"; + os << " \"temperature\": " << data.temperature << ",\n"; + PrintTo< NUM_COMP >( "composition", data.composition, os ) << ",\n"; + os << " \"totalDensity\": " << data.totalDensity << ",\n"; + PrintTo< NUM_PHASE >( "phaseFraction", data.phaseFraction, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseDensity", data.phaseDensity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseMassDensity", data.phaseMassDensity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseViscosity", data.phaseViscosity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseEnthalpy", data.phaseEnthalpy, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseInternalEnergy", data.phaseInternalEnergy, os ) << "\n"; + os << "}"; +} + +} // namespace testing + +} // namespace geos + +#endif //GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ diff --git a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp index 2874dda757f..4b90ca2840a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp @@ -21,7 +21,7 @@ #include "constitutive/capillaryPressure/capillaryPressureSelector.hpp" #include "functions/FunctionManager.hpp" #include "functions/TableFunction.hpp" -#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" +#include "unitTests/fluidFlowTests/testFlowUtils.hpp" // TPL includes #include diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp deleted file mode 100644 index 2297aaba3f3..00000000000 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -// Source includes -#include "common/DataTypes.hpp" -#include "common/TimingMacros.hpp" -#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" -#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" -#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" -#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" -#include "mainInterface/initialization.hpp" -#include "functions/FunctionManager.hpp" -#include "mainInterface/GeosxState.hpp" - -// TPL includes -#include -#include - -using namespace geos; -using namespace geos::testing; -using namespace geos::constitutive; -using namespace geos::constitutive::multifluid; -using namespace geos::dataRepository; -using namespace geos::constitutive::PVTProps; - -/// Black-oil tables written into temporary files during testing - -static const char * pvtoTableContent = "# Rs[sm3/sm3]\tPbub[Pa]\tBo[m3/sm3]\tVisc(Pa.s)\n" - "\n" - " 2\t 2000000\t 1.02\t 0.000975\n" - " 5\t 5000000\t 1.03\t 0.00091\n" - " 10\t 10000000\t1.04\t 0.00083\n" - " 15\t 20000000\t1.05\t 0.000695\n" - " 90000000\t1.03\t 0.000985 -- some line comment\n" - " 30\t 30000000\t1.07\t 0.000594\n" - " 40\t 40000000\t1.08\t 0.00051\n" - " 50000000\t1.07\t 0.000549 -- another one\n" - " 90000000\t1.06\t 0.00074\n" - " 50\t 50000000.7\t1.09\t 0.000449\n" - " 90000000.7\t1.08\t 0.000605"; - -static const char * pvtwTableContent = "#\tPref[Pa]\tBw[m3/sm3]\tCp[1/Pa]\t Visc[Pa.s]\n" - "\t30600000.1\t1.03\t\t0.00000000041\t0.0003"; - -/// Dead-oil tables written into temporary files during testing - -static const char * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" - "3000000 0.04234 0.00001344\n" - "6000000 0.02046 0.0000142\n" - "9000000 0.01328 0.00001526\n" - "12000000 0.00977 0.0000166\n" - "15000000 0.00773 0.00001818\n" - "18000000 0.006426 0.00001994\n" - "21000000 0.005541 0.00002181\n" - "24000000 0.004919 0.0000237\n" - "27000000 0.004471 0.00002559\n" - "29500000 0.004194 0.00002714\n" - "31000000 0.004031 0.00002806\n" - "33000000 0.00391 0.00002832\n" - "53000000 0.003868 0.00002935"; - -static const char * pvdoTableContent = "#P[Pa] Bo[m3/sm3] Visc(Pa.s)\n" - "10000000.0 1.23331 0.00015674\n" - "12500000.0 1.21987 0.00016570\n" - "15000000.0 1.20802 0.00017445\n" - "20000000.0 1.18791 0.00019143\n" - "25000000.0 1.17137 0.00020779\n" - "30000000.0 1.15742 0.00022361\n" - "33200000.3 1.14946 0.00023359\n" - "35000000.0 1.14543 0.00023894\n" - "40000000.0 1.13498 0.00025383\n" - "50000000.0 1.11753 0.00028237\n" - "60000000.0 1.10346 0.00030941\n" - "70000000.0 1.09180 0.00033506\n" - "80000000.0 1.08194 0.00035945\n" - "90000000.0 1.07347 0.00038266\n" - "95000000.0 1.06966 0.00039384\n" - "100000000.0 1.06610 0.00040476\n" - "110000000.0 1.05961 0.00042584\n" - "112500000.0 1.05811 0.00043096\n" - "115000000.0 1.05665 0.00043602\n" - "117500000.0 1.05523 0.00044102\n" - "120000000.0 1.05385 0.00044596\n"; - -static const char * pvdwTableContent = "# Pref[Pa] Bw[m3/sm3] Cp[1/Pa] Visc[Pa.s]\n" - " 30600000.1 1.03 0.00000000041 0.0003"; - -// CO2-brine model - -static const char * pvtLiquidPhillipsTableContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" - "ViscosityFun PhillipsBrineViscosity 0.1"; - -// the last are set relatively high (1e-4) to increase derivative value and check it properly -static const char * pvtLiquidEzrokhiTableContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" - "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4"; - -static const char * pvtGasTableContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" - "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; - -static const char * co2FlashTableContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15"; - -void testNumericalDerivatives( MultiFluidBase & fluid, - Group & parent, - real64 const P, - real64 const T, - arraySlice1d< real64 > const & compositionInput, - real64 const perturbParameter, - bool usePVTPackage, - real64 const relTol, - real64 const absTol = std::numeric_limits< real64 >::max() ) -{ - using Deriv = multifluid::DerivativeOffset; - - integer const NC = fluid.numFluidComponents(); - integer const NP = fluid.numFluidPhases(); - integer const NDOF = NC+2; - - // Copy input values into an array with expected layout - array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, NC ); - for( integer i = 0; i < NC; ++i ) - { - compositionValues[0][i] = compositionInput[i]; - } - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - - auto const & components = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - auto const & phases = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - - // create a clone of the fluid to run updates on - std::unique_ptr< ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( "fluidCopy", &parent ); - MultiFluidBase & fluidCopy = dynamicCast< MultiFluidBase & >( *fluidCopyPtr ); - - fluid.allocateConstitutiveData( fluid.getParent(), 1 ); - fluidCopy.allocateConstitutiveData( fluid.getParent(), 1 ); - - // extract data views from both fluids - #define GET_FLUID_DATA( FLUID, TRAIT ) \ - FLUID.getReference< TRAIT::type >( TRAIT::key() )[0][0] - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseFrac { - GET_FLUID_DATA( fluid, fields::multifluid::phaseFraction ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseFraction ) - }; - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseDens { - GET_FLUID_DATA( fluid, fields::multifluid::phaseDensity ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseDensity ) - }; - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseVisc { - GET_FLUID_DATA( fluid, fields::multifluid::phaseViscosity ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseViscosity ) - }; - - MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > phaseCompFrac { - GET_FLUID_DATA( fluid, fields::multifluid::phaseCompFraction ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseCompFraction ) - }; - - MultiFluidVarSlice< real64, 0, USD_FLUID - 2, USD_FLUID_DC - 2 > totalDens { - GET_FLUID_DATA( fluid, fields::multifluid::totalDensity ), - GET_FLUID_DATA( fluid, fields::multifluid::dTotalDensity ) - }; - - auto const & phaseFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseFraction ); - auto const & phaseDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseDensity ); - auto const & phaseViscCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseViscosity ); - auto const & phaseCompFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseCompFraction ); - auto const & totalDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::totalDensity ); - -#undef GET_FLUID_DATA - - // set the original fluid state to current - constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) - { - typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - fluidWrapper.update( 0, 0, P, T, composition ); - } ); - - // now perturb variables and update the copied fluid's state - constitutive::constitutiveUpdatePassThru( fluidCopy, [&] ( auto & castedFluid ) - { - typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - - // to be able to use the checkDerivative utility function, we have to invert the layout - auto dPhaseFrac = invertLayout( phaseFrac.derivs.toSliceConst(), NP, NDOF ); - auto dPhaseDens = invertLayout( phaseDens.derivs.toSliceConst(), NP, NDOF ); - auto dPhaseVisc = invertLayout( phaseVisc.derivs.toSliceConst(), NP, NDOF ); - auto dTotalDens = invertLayout( totalDens.derivs.toSliceConst(), NDOF ); - auto dPhaseCompFrac = invertLayout( phaseCompFrac.derivs.toSliceConst(), NP, NC, NDOF ); - - // update pressure and check derivatives - { - real64 const dP = perturbParameter * (P + perturbParameter); - fluidWrapper.update( 0, 0, P + dP, T, composition ); - - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseFrac", "Pres", phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseDens", "Pres", phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseVisc", "Pres", phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dP], - dP, relTol, absTol, "totalDens", "Pres" ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseCompFrac", "Pres", phases, components ); - } - - // update temperature and check derivatives - { - real64 const dT = perturbParameter * (T + perturbParameter); - fluidWrapper.update( 0, 0, P, T + dT, composition ); - - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseFrac", "Temp", phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseDens", "Temp", phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseVisc", "Temp", phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dT], - dT, relTol, absTol, "totalDens", "Temp" ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseCompFrac", "Temp", phases, components ); - } - - array2d< real64, compflow::LAYOUT_COMP > compNew( 1, NC ); - for( integer jc = 0; jc < NC; ++jc ) - { - real64 const dC = perturbParameter * ( composition[jc] + perturbParameter ); - for( integer ic = 0; ic < NC; ++ic ) - { - compNew[0][ic] = composition[ic]; - } - compNew[0][jc] += dC; - - // Note: in PVTPackage, derivatives are obtained with finite-difference approx **with normalization of the comp fraction** - // The component fraction is perturbed (just as above), and then all the component fractions are normalized (as below) - // But, in the native DO model and in CO2BrinePhillips, derivatives are computed analytically, which results in different - // derivatives wrt component fractions--although the derivatives wrt component densities obtained with the chain rule - // in the solver will be very similar (see discussion on PR #1325 on GitHub). - // - // Since both approaches--FD approximation of derivatives with normalization, and analytical derivatives--are correct, - // we have to support both when we check the intermediate derivatives wrt component fractions below. Therefore, if the - // PVTPackage is used, then we normalize the perturbed component fractions before taking the FD approx. If the native - // DO or CO2-brine models are used, we skip the normalization below. - if( usePVTPackage ) - { - // renormalize - real64 sum = 0.0; - for( integer ic = 0; ic < NC; ++ic ) - { - sum += compNew[0][ic]; - } - for( integer ic = 0; ic < NC; ++ic ) - { - compNew[0][ic] /= sum; - } - } - - fluidWrapper.update( 0, 0, P, T, compNew[0] ); - - string const var = "compFrac[" + components[jc] + "]"; - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseFrac", var, phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseDens", var, phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseVisc", var, phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dC+jc], - dC, relTol, absTol, "totalDens", var ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseCompFrac", var, phases, components ); - } - } ); -} - -void testValuesAgainstPreviousImplementation( CO2BrinePhillipsFluid::KernelWrapper const & wrapper, - real64 const P, - real64 const T, - arraySlice1d< real64 const > const & compositionInput, - real64 const & savedTotalDensity, - real64 const & savedGasPhaseFrac, - real64 const & savedWaterDens, - real64 const & savedGasDens, - real64 const & savedWaterMassDens, - real64 const & savedGasMassDens, - real64 const & savedWaterVisc, - real64 const & savedGasVisc, - real64 const & savedWaterPhaseGasComp, - real64 const & savedWaterPhaseWaterComp, - real64 const relTol ) -{ - integer constexpr numPhase = 2; - integer constexpr numComp = 2; - integer constexpr numDof = numComp + 2; - - // Copy input values into an array with expected layout - array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, numComp ); - for( integer i = 0; i < numComp; ++i ) - { - compositionValues[0][i] = compositionInput[i]; - } - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); - StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); - StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); - StackArray< real64, 2, 1, LAYOUT_FLUID > totalDensity( 1, 1 ); - StackArray< real64, 3, numDof, LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); - - wrapper.compute( P, T, composition, - { - phaseFraction[0][0], - dPhaseFraction[0][0] - }, - { - phaseDensity[0][0], - dPhaseDensity[0][0] - }, - { - phaseMassDensity[0][0], - dPhaseMassDensity[0][0] - }, - { - phaseViscosity[0][0], - dPhaseViscosity[0][0] - }, - { - phaseEnthalpy[0][0], - dPhaseEnthalpy[0][0] - }, - { - phaseInternalEnergy[0][0], - dPhaseInternalEnergy[0][0] - }, - { - phaseCompFraction[0][0], - dPhaseCompFraction[0][0] - }, - { - totalDensity[0][0], - dTotalDensity[0][0] - } ); - - checkRelativeError( totalDensity[0][0], savedTotalDensity, relTol ); - for( integer ip = 0; ip < numPhase; ++ip ) - { - real64 const savedPhaseFrac = ( ip == 0 ) ? savedGasPhaseFrac : 1 - savedGasPhaseFrac; - checkRelativeError( phaseFraction[0][0][ip], savedPhaseFrac, relTol ); - real64 const savedPhaseDens = ( ip == 0 ) ? savedGasDens : savedWaterDens; - checkRelativeError( phaseDensity[0][0][ip], savedPhaseDens, relTol ); - real64 const savedPhaseMassDens = ( ip == 0 ) ? savedGasMassDens : savedWaterMassDens; - checkRelativeError( phaseMassDensity[0][0][ip], savedPhaseMassDens, relTol ); - real64 const savedPhaseVisc = ( ip == 0 ) ? savedGasVisc : savedWaterVisc; - checkRelativeError( phaseViscosity[0][0][ip], savedPhaseVisc, relTol ); - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 savedCompFrac = 0.0; - if( ip == 0 ) - { - savedCompFrac = ( ic == 0 ) ? 1 : 0; - } - else - { - savedCompFrac = ( ic == 0 ) ? savedWaterPhaseGasComp : savedWaterPhaseWaterComp; - } - checkRelativeError( phaseCompFraction[0][0][ip][ic], savedCompFrac, relTol ); - } - } -} - -MultiFluidBase & makeCompositionalFluid( string const & name, Group & parent ) -{ - CompositionalMultiphaseFluidPVTPackage & fluid = parent.registerGroup< CompositionalMultiphaseFluidPVTPackage >( name ); - - // TODO we should actually create a fake XML node with data, but this seemed easier... - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 4 ); - compNames[0] = "N2"; compNames[1] = "C10"; compNames[2] = "C20"; compNames[3] = "H20"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 4 ); - molarWgt[0] = 28e-3; molarWgt[1] = 134e-3; molarWgt[2] = 275e-3; molarWgt[3] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "oil"; phaseNames[1] = "gas"; - - auto & eqnOfState = fluid.getReference< string_array >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::equationsOfStateString() ); - eqnOfState.resize( 2 ); - eqnOfState[0] = "PR"; eqnOfState[1] = "PR"; - - auto & critPres = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalPressureString() ); - critPres.resize( 4 ); - critPres[0] = 34e5; critPres[1] = 25.3e5; critPres[2] = 14.6e5; critPres[3] = 220.5e5; - - auto & critTemp = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalTemperatureString() ); - critTemp.resize( 4 ); - critTemp[0] = 126.2; critTemp[1] = 622.0; critTemp[2] = 782.0; critTemp[3] = 647.0; - - auto & acFactor = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentAcentricFactorString() ); - acFactor.resize( 4 ); - acFactor[0] = 0.04; acFactor[1] = 0.443; acFactor[2] = 0.816; acFactor[3] = 0.344; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CompositionalFluidTestBase : public ::testing::Test -{ -public: - CompositionalFluidTestBase(): - node(), - parent( "parent", node ) - {} - -protected: - conduit::Node node; - Group parent; - MultiFluidBase * fluid; -}; - -class CompositionalFluidTest : public CompositionalFluidTestBase -{ -public: - CompositionalFluidTest() - { - parent.resize( 1 ); - fluid = &makeCompositionalFluid( "fluid", parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } -}; - -TEST_F( CompositionalFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P = 5e6; - real64 const T = 297.15; - array1d< real64 > comp( 4 ); - comp[0] = 0.099; comp[1] = 0.3; comp[2] = 0.6; comp[3] = 0.001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - testNumericalDerivatives( *fluid, parent, P, T, comp, eps, true, relTol ); -} - -TEST_F( CompositionalFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P = 5e6; - real64 const T = 297.15; - array1d< real64 > comp( 4 ); - comp[0] = 0.099; comp[1] = 0.3; comp[2] = 0.6; comp[3] = 0.001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-2; - - testNumericalDerivatives( *fluid, parent, P, T, comp, eps, true, relTol ); -} - -MultiFluidBase & makeLiveOilFluid( string const & name, Group * parent ) -{ - BlackOilFluid & fluid = parent->registerGroup< BlackOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "oil"; compNames[1] = "gas"; compNames[2] = "water"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 114e-3; molarWgt[1] = 16e-3; molarWgt[2] = 18e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "oil"; phaseNames[1] = "gas"; phaseNames[2] = "water"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 800.0; surfaceDens[1] = 0.9907; surfaceDens[2] = 1022.0; - - path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); - tableNames.resize( 3 ); - tableNames[0] = "pvto.txt"; tableNames[1] = "pvdg.txt"; tableNames[2] = "pvtw.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -MultiFluidBase & makeDeadOilFluid( string const & name, Group * parent ) -{ - DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "oil"; compNames[1] = "water"; compNames[2] = "gas"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 114e-3; molarWgt[1] = 16e-3; molarWgt[2] = 18e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "oil"; phaseNames[1] = "water"; phaseNames[2] = "gas"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 800.0; surfaceDens[1] = 1022.0; surfaceDens[2] = 0.9907; - - path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); - tableNames.resize( 3 ); - tableNames[0] = "pvdo.txt"; tableNames[1] = "pvdw.txt"; tableNames[2] = "pvdg.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -MultiFluidBase & makeDeadOilFluidFromTable( string const & name, Group * parent ) -{ - FunctionManager & functionManager = FunctionManager::getInstance(); - - // 1) First, define the tables (PVDO, PVDG) - - // 1D table with linear interpolation - integer const NaxisPVDO = 21; - integer const NaxisPVDG = 13; - - array1d< real64_array > coordinatesPVDO; - real64_array valuesPVDO_Bo( NaxisPVDO ); - real64_array valuesPVDO_visc( NaxisPVDO ); - coordinatesPVDO.resize( 1 ); - coordinatesPVDO[0].resize( NaxisPVDO ); - coordinatesPVDO[0][0] = 10000000.0; valuesPVDO_Bo[0] = 1.23331; valuesPVDO_visc[0] = 0.00015674; - coordinatesPVDO[0][1] = 12500000.0; valuesPVDO_Bo[1] = 1.21987; valuesPVDO_visc[1] = 0.00016570; - coordinatesPVDO[0][2] = 15000000.0; valuesPVDO_Bo[2] = 1.20802; valuesPVDO_visc[2] = 0.00017445; - coordinatesPVDO[0][3] = 20000000.0; valuesPVDO_Bo[3] = 1.18791; valuesPVDO_visc[3] = 0.00019143; - coordinatesPVDO[0][4] = 25000000.0; valuesPVDO_Bo[4] = 1.17137; valuesPVDO_visc[4] = 0.00020779; - coordinatesPVDO[0][5] = 30000000.0; valuesPVDO_Bo[5] = 1.15742; valuesPVDO_visc[5] = 0.00022361; - coordinatesPVDO[0][6] = 33200000.3; valuesPVDO_Bo[6] = 1.14946; valuesPVDO_visc[6] = 0.00023359; - coordinatesPVDO[0][7] = 35000000.0; valuesPVDO_Bo[7] = 1.14543; valuesPVDO_visc[7] = 0.00023894; - coordinatesPVDO[0][8] = 40000000.0; valuesPVDO_Bo[8] = 1.13498; valuesPVDO_visc[8] = 0.00025383; - coordinatesPVDO[0][9] = 50000000.0; valuesPVDO_Bo[9] = 1.11753; valuesPVDO_visc[9] = 0.00028237; - coordinatesPVDO[0][10] = 60000000.0; valuesPVDO_Bo[10] = 1.10346; valuesPVDO_visc[10] = 0.00030941; - coordinatesPVDO[0][11] = 70000000.0; valuesPVDO_Bo[11] = 1.09180; valuesPVDO_visc[11] = 0.00033506; - coordinatesPVDO[0][12] = 80000000.0; valuesPVDO_Bo[12] = 1.08194; valuesPVDO_visc[12] = 0.00035945; - coordinatesPVDO[0][13] = 90000000.0; valuesPVDO_Bo[13] = 1.07347; valuesPVDO_visc[13] = 0.00038266; - coordinatesPVDO[0][14] = 95000000.0; valuesPVDO_Bo[14] = 1.06966; valuesPVDO_visc[14] = 0.00039384; - coordinatesPVDO[0][15] = 100000000.0; valuesPVDO_Bo[15] = 1.06610; valuesPVDO_visc[15] = 0.00040476; - coordinatesPVDO[0][16] = 110000000.0; valuesPVDO_Bo[16] = 1.05961; valuesPVDO_visc[16] = 0.00042584; - coordinatesPVDO[0][17] = 112500000.0; valuesPVDO_Bo[17] = 1.05811; valuesPVDO_visc[17] = 0.00043096; - coordinatesPVDO[0][18] = 115000000.0; valuesPVDO_Bo[18] = 1.05665; valuesPVDO_visc[18] = 0.00043602; - coordinatesPVDO[0][19] = 117500000.0; valuesPVDO_Bo[19] = 1.05523; valuesPVDO_visc[19] = 0.00044102; - coordinatesPVDO[0][20] = 120000000.0; valuesPVDO_Bo[20] = 1.05385; valuesPVDO_visc[20] = 0.00044596; - - array1d< real64_array > coordinatesPVDG; - real64_array valuesPVDG_Bg( NaxisPVDG ); - real64_array valuesPVDG_visc( NaxisPVDG ); - coordinatesPVDG.resize( 1 ); - coordinatesPVDG[0].resize( NaxisPVDG ); - coordinatesPVDG[0][0] = 3000000; valuesPVDG_Bg[0] = 0.04234; valuesPVDG_visc[0] = 0.00001344; - coordinatesPVDG[0][1] = 6000000; valuesPVDG_Bg[1] = 0.02046; valuesPVDG_visc[1] = 0.0000142; - coordinatesPVDG[0][2] = 9000000; valuesPVDG_Bg[2] = 0.01328; valuesPVDG_visc[2] = 0.00001526; - coordinatesPVDG[0][3] = 12000000; valuesPVDG_Bg[3] = 0.00977; valuesPVDG_visc[3] = 0.0000166; - coordinatesPVDG[0][4] = 15000000; valuesPVDG_Bg[4] = 0.00773; valuesPVDG_visc[4] = 0.00001818; - coordinatesPVDG[0][5] = 18000000; valuesPVDG_Bg[5] = 0.006426; valuesPVDG_visc[5] = 0.00001994; - coordinatesPVDG[0][6] = 21000000; valuesPVDG_Bg[6] = 0.005541; valuesPVDG_visc[6] = 0.00002181; - coordinatesPVDG[0][7] = 24000000; valuesPVDG_Bg[7] = 0.004919; valuesPVDG_visc[7] = 0.0000237; - coordinatesPVDG[0][8] = 27000000; valuesPVDG_Bg[8] = 0.004471; valuesPVDG_visc[8] = 0.00002559; - coordinatesPVDG[0][9] = 29500000; valuesPVDG_Bg[9] = 0.004194; valuesPVDG_visc[9] = 0.00002714; - coordinatesPVDG[0][10] = 31000000; valuesPVDG_Bg[10] = 0.004031; valuesPVDG_visc[10] = 0.00002806; - coordinatesPVDG[0][11] = 33000000; valuesPVDG_Bg[11] = 0.00391; valuesPVDG_visc[11] = 0.00002832; - coordinatesPVDG[0][12] = 53000000; valuesPVDG_Bg[12] = 0.003868; valuesPVDG_visc[12] = 0.00002935; - - TableFunction & tablePVDO_Bo = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDO_Bo" ) ); - tablePVDO_Bo.setTableCoordinates( coordinatesPVDO, { units::Pressure } ); - tablePVDO_Bo.setTableValues( valuesPVDO_Bo, units::Dimensionless ); - tablePVDO_Bo.reInitializeFunction(); - tablePVDO_Bo.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDO_visc = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDO_visc" ) ); - tablePVDO_visc.setTableCoordinates( coordinatesPVDO, { units::Pressure } ); - tablePVDO_visc.setTableValues( valuesPVDO_visc, units::Viscosity ); - tablePVDO_visc.reInitializeFunction(); - tablePVDO_visc.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDG_Bg = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDG_Bg" ) ); - tablePVDG_Bg.setTableCoordinates( coordinatesPVDG, { units::Pressure } ); - tablePVDG_Bg.setTableValues( valuesPVDG_Bg, units::Dimensionless ); - tablePVDG_Bg.reInitializeFunction(); - tablePVDG_Bg.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDG_visc = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDG_visc" ) ); - tablePVDG_visc.setTableCoordinates( coordinatesPVDG, { units::Pressure } ); - tablePVDG_visc.setTableValues( valuesPVDG_visc, units::Viscosity ); - tablePVDG_visc.reInitializeFunction(); - tablePVDG_visc.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - // 2) Then, define the Dead-Oil constitutive model - - DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "gas"; compNames[1] = "water"; compNames[2] = "oil"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 18e-3; molarWgt[1] = 16e-3; molarWgt[2] = 114e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "gas"; phaseNames[1] = "water"; phaseNames[2] = "oil"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( DeadOilFluid::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 0.9907; surfaceDens[1] = 1022.0; surfaceDens[2] = 800.0; - - string_array & FVFTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::formationVolumeFactorTableNamesString() ); - FVFTableNames.resize( 2 ); - FVFTableNames[0] = "PVDG_Bg"; FVFTableNames[1] = "PVDO_Bo"; - - string_array & viscosityTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::viscosityTableNamesString() ); - viscosityTableNames.resize( 2 ); - viscosityTableNames[0] = "PVDG_visc"; viscosityTableNames[1] = "PVDO_visc"; - - real64 & waterRefPressure = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterRefPressureString() ); - waterRefPressure = 30600000.1; - real64 & waterFormationVolumeFactor = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterFormationVolumeFactorString() ); - waterFormationVolumeFactor = 1.03; - real64 & waterCompressibility = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterCompressibilityString() ); - waterCompressibility = 0.00000000041; - real64 & waterViscosity = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterViscosityString() ); - waterViscosity = 0.0003; - - fluid.postProcessInputRecursive(); - return fluid; -} - -void writeTableToFile( string const & filename, char const * str ) -{ - std::ofstream os( filename ); - ASSERT_TRUE( os.is_open() ); - os << str; - os.close(); -} - -void removeFile( string const & filename ) -{ - int const ret = std::remove( filename.c_str() ); - ASSERT_TRUE( ret == 0 ); -} - -class LiveOilFluidTest : public CompositionalFluidTestBase -{ -public: - LiveOilFluidTest() - { - writeTableToFile( "pvto.txt", pvtoTableContent ); - writeTableToFile( "pvdg.txt", pvdgTableContent ); - writeTableToFile( "pvtw.txt", pvtwTableContent ); - - parent.resize( 1 ); - fluid = &makeLiveOilFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~LiveOilFluidTest() - { - removeFile( "pvto.txt" ); - removeFile( "pvdg.txt" ); - removeFile( "pvtw.txt" ); - } -}; - -TEST_F( LiveOilFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.79999; comp[1] = 0.2; comp[2] = 0.00001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-12; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -TEST_F( LiveOilFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.79999; comp[1] = 0.2; comp[2] = 0.00001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-12; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -class DeadOilFluidTest : public CompositionalFluidTestBase -{ -public: - - DeadOilFluidTest() - { - writeTableToFile( "pvdo.txt", pvdoTableContent ); - writeTableToFile( "pvdg.txt", pvdgTableContent ); - writeTableToFile( "pvdw.txt", pvdwTableContent ); - - parent.resize( 1 ); - fluid = &makeDeadOilFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~DeadOilFluidTest() - { - removeFile( "pvdo.txt" ); - removeFile( "pvdg.txt" ); - removeFile( "pvdw.txt" ); - } -}; - -TEST_F( DeadOilFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 1.24e7, 3.21e7, 5.01e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -TEST_F( DeadOilFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - real64 const absTol = 1e-14; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol, absTol ); - } -} - -class DeadOilFluidFromTableTest : public CompositionalFluidTestBase -{ -public: - - DeadOilFluidFromTableTest() - { - parent.resize( 1 ); - fluid = &makeDeadOilFluidFromTable( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } -}; - -TEST_F( DeadOilFluidFromTableTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -MultiFluidBase & makeCO2BrinePhillipsFluid( string const & name, Group * parent ) -{ - CO2BrinePhillipsFluid & fluid = parent->registerGroup< CO2BrinePhillipsFluid >( name ); - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 2 ); - compNames[0] = "co2"; compNames[1] = "water"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 2 ); - molarWgt[0] = 44e-3; molarWgt[1] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "gas"; phaseNames[1] = "liquid"; - - auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrinePhillipsFluid::viewKeyStruct::phasePVTParaFilesString() ); - phasePVTParaFileNames.resize( 2 ); - phasePVTParaFileNames[0] = "pvtgas.txt"; phasePVTParaFileNames[1] = "pvtliquid.txt"; - - auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrinePhillipsFluid::viewKeyStruct::flashModelParaFileString() ); - flashModelParaFileName = "co2flash.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CO2BrinePhillipsFluidTest : public CompositionalFluidTestBase -{ -protected: - - CO2BrinePhillipsFluidTest() - { - writeTableToFile( "pvtliquid.txt", pvtLiquidPhillipsTableContent ); - writeTableToFile( "pvtgas.txt", pvtGasTableContent ); - writeTableToFile( "co2flash.txt", co2FlashTableContent ); - - parent.resize( 1 ); - fluid = &makeCO2BrinePhillipsFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~CO2BrinePhillipsFluidTest() - { - removeFile( "pvtliquid.txt" ); - removeFile( "pvtgas.txt" ); - removeFile( "co2flash.txt" ); - } - -}; - - -TEST_F( CO2BrinePhillipsFluidTest, checkAgainstPreviousImplementationMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const relTol = 1e-10; - - fluid->allocateConstitutiveData( fluid->getParent(), 1 ); - - CO2BrinePhillipsFluid::KernelWrapper wrapper = - dynamicCast< CO2BrinePhillipsFluid * >( fluid )->createKernelWrapper(); - - real64 const savedTotalDens[] = - { 5881.9010529428224, 5869.6094131788523, 5855.0332090690354, 9181.3523596865525, 9157.6071613646127, 9129.5728206336826, 15757.685798517123, 15698.877814368472, - 15630.149353340639 }; - real64 const savedGasPhaseFrac[] = - { 0.29413690046142371148, 0.29415754810481165027, 0.29418169867697463449, 0.29194010802017489326, 0.29196434961986583723, 0.29199266189550621142, 0.2890641335638892695, 0.28908718137828937067, - 0.28911404840933618843 }; - real64 const savedWaterDens[] = - { 53296.719183517576, 53274.578175308554, 53247.856162690216, 53248.577831698305, 53226.801031868054, 53200.505577694363, 53232.959859840405, 53211.345942175059, - 53185.244751356993 }; - real64 const savedGasDens[] = - { 1876.2436091302606656, 1872.184636376355229, 1867.3711104617746059, 3053.1548401973859654, 3044.5748249030266379, 3034.4507978134674886, 5769.0622621289458039, 5742.8476745352018042, - 5712.2837704249559465 }; - real64 const savedWaterMassDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasMassDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterVisc[] = - { 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, - 0.00030157070452334377216, 0.00029959815370251820189 }; - - real64 const savedGasVisc[] = - { 1.9042384704865343673e-05, 1.9062615947696152414e-05, 1.9086923154230274463e-05, 2.0061713844617985449e-05, 2.0075955757102255573e-05, 2.0093249989250199265e-05, 2.3889596884008691474e-05, - 2.3865756080512667728e-05, 2.3839170076324036522e-05 }; - real64 const savedWaterPhaseGasComp[] = - { 0.0083062842389820552153, 0.008277274736736653718, 0.0082433415400525456018, 0.011383065290266058955, 0.011349217198060387521, 0.011309682362800700661, 0.015382352969377973903, - 0.015350431636424789056, 0.015313218057419366105 }; - real64 const savedWaterPhaseWaterComp[] = - { 0.99169371576101794652, 0.9917227252632633272, 0.99175665845994742664, 0.98861693470973388553, 0.98865078280193963156, 0.98869031763719927852, 0.98461764703062204518, 0.98464956836357520054, - 0.98468678194258063563 }; - - integer counter = 0; - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testValuesAgainstPreviousImplementation( wrapper, - P[i], T[j], comp, - savedTotalDens[counter], savedGasPhaseFrac[counter], - savedWaterDens[counter], savedGasDens[counter], - savedWaterMassDens[counter], savedGasMassDens[counter], - savedWaterVisc[counter], savedGasVisc[counter], - savedWaterPhaseGasComp[counter], savedWaterPhaseWaterComp[counter], - relTol ); - counter++; - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, checkAgainstPreviousImplementationMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const relTol = 1e-10; - - fluid->allocateConstitutiveData( fluid->getParent(), 1 ); - - CO2BrinePhillipsFluid::KernelWrapper wrapper = - dynamicCast< CO2BrinePhillipsFluid * >( fluid )->createKernelWrapper(); - - real64 const savedTotalDens[] = - { 238.31504112633914, 237.83897306400553, 237.27445306546298, 353.95258514794097, 353.12773295711992, 352.1532278769692, 549.90502586392017, 548.2725957521294, - 546.35992000222234 }; - real64 const savedGasPhaseFrac[] = - { 0.28566797890570228, 0.28571845092287312, 0.28577748565482669, 0.28029804182709406, 0.28035729907078311, 0.2804265068556816, 0.27326788204506247, 0.27332422114692956, - 0.27338989611171055 }; - real64 const savedWaterDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterMassDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasMassDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterVisc[] = - { 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, - 0.00030157070452334377216, 0.00029959815370251820189 }; - real64 const savedGasVisc[] = - { 1.9042384704865343673e-05, 1.9062615947696152414e-05, 1.9086923154230274463e-05, 2.0061713844617985449e-05, 2.0075955757102255573e-05, 2.0093249989250199265e-05, 2.3889596884008691474e-05, - 2.3865756080512667728e-05, 2.3839170076324036522e-05 }; - real64 const savedWaterPhaseGasComp[] = - { 0.020063528822832473, 0.019994285300494085, 0.019913282008777046, 0.027375162661670061, 0.027295074213708581, 0.02720152052681666, 0.036784005129927563, - 0.036709327088310859, 0.036622259649145526 }; - real64 const savedWaterPhaseWaterComp[] = - { 0.97993647117716742, 0.98000571469950604, 0.98008671799122282, 0.97262483733832983, 0.97270492578629131, 0.97279847947318321, 0.96321599487007259, 0.96329067291168902, - 0.96337774035085455 }; - - integer counter = 0; - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testValuesAgainstPreviousImplementation( wrapper, - P[i], T[j], comp, - savedTotalDens[counter], savedGasPhaseFrac[counter], - savedWaterDens[counter], savedGasDens[counter], - savedWaterMassDens[counter], savedGasMassDens[counter], - savedWaterVisc[counter], savedGasVisc[counter], - savedWaterPhaseGasComp[counter], savedWaterPhaseWaterComp[counter], - relTol ); - counter++; - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-8; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -MultiFluidBase & makeCO2BrineEzrokhiFluid( string const & name, Group * parent ) -{ - CO2BrineEzrokhiFluid & fluid = parent->registerGroup< CO2BrineEzrokhiFluid >( name ); - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 2 ); - compNames[0] = "co2"; compNames[1] = "water"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 2 ); - molarWgt[0] = 44e-3; molarWgt[1] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "gas"; phaseNames[1] = "liquid"; - - auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrineEzrokhiFluid::viewKeyStruct::phasePVTParaFilesString() ); - phasePVTParaFileNames.resize( 2 ); - phasePVTParaFileNames[0] = "pvtgas.txt"; phasePVTParaFileNames[1] = "pvtliquid.txt"; - - auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrineEzrokhiFluid::viewKeyStruct::flashModelParaFileString() ); - flashModelParaFileName = "co2flash.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CO2BrineEzrokhiFluidTest : public CompositionalFluidTestBase -{ -protected: - - CO2BrineEzrokhiFluidTest() - { - writeTableToFile( "pvtliquid.txt", pvtLiquidEzrokhiTableContent ); - writeTableToFile( "pvtgas.txt", pvtGasTableContent ); - writeTableToFile( "co2flash.txt", co2FlashTableContent ); - - parent.resize( 1 ); - fluid = &makeCO2BrineEzrokhiFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~CO2BrineEzrokhiFluidTest() - { - removeFile( "pvtliquid.txt" ); - removeFile( "pvtgas.txt" ); - removeFile( "co2flash.txt" ); - } - -}; - -TEST_F( CO2BrineEzrokhiFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -TEST_F( CO2BrineEzrokhiFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-8; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -int main( int argc, char * * argv ) -{ - ::testing::InitGoogleTest( &argc, argv ); - - geos::GeosxState state( geos::basicSetup( argc, argv ) ); - - int const result = RUN_ALL_TESTS(); - - geos::basicCleanup(); - - return result; -} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp new file mode 100644 index 00000000000..d1ddabca7c7 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -0,0 +1,373 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidCO2Brine.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" +#include "common/GeosxConfig.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +enum class BrineModelType : int {Phillips, Ezrokhi}; +enum class FlashType : int {DuanSun, SpycherPruess}; + +ENUM_STRINGS( BrineModelType, "Phillips", "Ezrokhi" ); +ENUM_STRINGS( FlashType, "DuanSun", "SpycherPruess" ); + +template< BrineModelType BRINE, bool THERMAL > +struct FluidType {}; + +template<> +struct FluidType< BrineModelType::Phillips, false > +{ + using type = CO2BrinePhillipsFluid; + static constexpr const char * brineContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" + "ViscosityFun PhillipsBrineViscosity 0.1"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Phillips, true > +{ + using type = CO2BrinePhillipsThermalFluid; + static constexpr const char * brineContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" + "ViscosityFun PhillipsBrineViscosity 0.1\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1\n" + "EnthalpyFun CO2Enthalpy 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Ezrokhi, false > +{ + using type = CO2BrineEzrokhiFluid; + static constexpr const char * brineContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" + "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Ezrokhi, true > +{ + using type = CO2BrineEzrokhiThermalFluid; + static constexpr const char * brineContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" + "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1\n" + "EnthalpyFun CO2Enthalpy 1e6 1.5e7 5e4 367.15 369.15 1"; +}; + +template< FlashType FLASH > +struct FlashModel {}; + +template<> +struct FlashModel< FlashType::DuanSun > +{ + static constexpr const char * flashContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15"; +}; +template<> +struct FlashModel< FlashType::SpycherPruess > +{ + static constexpr const char * flashContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15 1.0e-10 SpycherPruess"; +}; + +template< BrineModelType BRINE, FlashType FLASH, bool THERMAL > +class MultiFluidCO2BrineTest : public MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >, + public ::testing::WithParamInterface< typename MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >::TestData > +{ +public: + using CO2BrineFluid = typename FluidType< BRINE, THERMAL >::type; + using Base = MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >; + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; + +public: + MultiFluidCO2BrineTest() + { + Base::writeTableToFile( pvtGasFileName, FluidType< BRINE, THERMAL >::gasContent ); + Base::writeTableToFile( pvtLiquidFileName, FluidType< BRINE, THERMAL >::brineContent ); + Base::writeTableToFile( pvtFlashFileName, FlashModel< FLASH >::flashContent ); + + auto & parent = this->m_parent; + parent.resize( 1 ); + string const fluidName = GEOS_FMT( "fluid{}{}{}", + EnumStrings< BrineModelType >::toString( BRINE ), + EnumStrings< FlashType >::toString( FLASH ), + (THERMAL ? "Thermal" : "")); + this->m_model = makeCO2BrineFluid( fluidName, &parent ); + + parent.initialize(); + parent.initializePostInitialConditions(); + } + + ~MultiFluidCO2BrineTest() override + { + Base::removeFile( pvtGasFileName ); + Base::removeFile( pvtLiquidFileName ); + Base::removeFile( pvtFlashFileName ); + } + + // Test numerical derivatives at selected data points + void testNumericalDerivatives( bool const useMass ) + { + auto * parent = &(this->getParent()); + auto & fluid = this->getFluid(); + fluid.setMassFlag( useMass ); + + real64 constexpr eps = 1.0e-5; + + // Some of the functions are simply table lookups. We need to keep the test points away from + // the table nodes because the kink in the linear interpolation might cause numerical derivative + // mismatches. Some of these values have been manually inspected and the differences, although + // not meeting the tolerance here, are small as expected. + constexpr real64 temperatures[] = { 367.65, 368.00, 368.75 }; + constexpr real64 pressures[] = { 5.001e6, 7.501e6, 1.201e7 }; + + for( real64 const pressure : pressures ) + { + for( real64 const temperature : temperatures ) + { + typename Base::TestData data ( pressure, temperature, { 0.3, 0.7 } ); + Base::testNumericalDerivatives( fluid, parent, data, eps, relTol, absTol ); + } + } + } + +private: + static CO2BrineFluid * makeCO2BrineFluid( string const & name, Group * parent ); + static constexpr const char * pvtGasFileName = "pvtgas.txt"; + static constexpr const char * pvtLiquidFileName = "pvtliquid.txt"; + static constexpr const char * pvtFlashFileName = "co2flash.txt"; +}; + +template< BrineModelType BRINE, FlashType FLASH, bool THERMAL > +typename MultiFluidCO2BrineTest< BRINE, FLASH, THERMAL >::CO2BrineFluid * +MultiFluidCO2BrineTest< BRINE, FLASH, THERMAL >::makeCO2BrineFluid( string const & name, Group * parent ) +{ + CO2BrineFluid & co2BrineFluid = parent->registerGroup< CO2BrineFluid >( name ); + + Group & fluid = co2BrineFluid; + + auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 2 >( phaseNames, {"gas", "liquid"} ); + + auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 2 >( compNames, {"co2", "water"} ); + + auto & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 2 >( molarWeight, {44e-3, 18e-3} ); + + auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrineFluid::viewKeyStruct::phasePVTParaFilesString() ); + fill< 2 >( phasePVTParaFileNames, {pvtGasFileName, pvtLiquidFileName} ); + + auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrineFluid::viewKeyStruct::flashModelParaFileString() ); + flashModelParaFileName = pvtFlashFileName; + + co2BrineFluid.postProcessInputRecursive(); + + return &co2BrineFluid; +} + +using MultiFluidCO2BrineBrinePhillipsTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::DuanSun, + false >; +using MultiFluidCO2BrineBrineEzrokhiTest = MultiFluidCO2BrineTest< BrineModelType::Ezrokhi, + FlashType::DuanSun, + false >; +using MultiFluidCO2BrineBrinePhillipsThermalTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::DuanSun, + true >; +using MultiFluidCO2BrineBrinePhillipsSpycherPruessTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::SpycherPruess, + false >; +#if !defined(GEOS_DEVICE_COMPILE) +using MultiFluidCO2BrineBrineEzrokhiThermalTest = MultiFluidCO2BrineTest< BrineModelType::Ezrokhi, + FlashType::DuanSun, + true >; +#endif + +TEST_F( MultiFluidCO2BrineBrinePhillipsTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_F( MultiFluidCO2BrineBrineEzrokhiTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrineEzrokhiTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_F( MultiFluidCO2BrineBrinePhillipsThermalTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsThermalTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +#if !defined(GEOS_DEVICE_COMPILE) +TEST_F( MultiFluidCO2BrineBrineEzrokhiThermalTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrineEzrokhiThermalTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} +#endif + +TEST_F( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrineEzrokhiTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsThermalTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.88317e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.32967e+04}, {8.25738e+01, 9.70853e+02}, {1.90427e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.87456e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.32812e+04}, {8.24487e+01, 9.70542e+02}, {1.90569e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.85630e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.32478e+04}, {8.21833e+01, 9.69875e+02}, {1.90872e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.18273e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.32486e+04}, {1.34361e+02, 9.74235e+02}, {2.00622e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.16610e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.32333e+04}, {1.34097e+02, 9.73923e+02}, {2.00722e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.13094e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.32005e+04}, {1.33538e+02, 9.73254e+02}, {2.00938e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.57730e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.32330e+04}, {2.54147e+02, 9.79494e+02}, {2.39022e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.57318e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.32179e+04}, {2.53338e+02, 9.79185e+02}, {2.38854e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.56452e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.31853e+04}, {2.51643e+02, 9.78520e+02}, {2.38514e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrineEzrokhiTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrineEzrokhiTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.89876e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.51674e+04}, {8.25738e+01, 1.00493e+03}, {1.90427e-05, 3.12148e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.89023e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.51663e+04}, {8.24487e+01, 1.00488e+03}, {1.90569e-05, 3.11023e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.87213e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.51642e+04}, {8.21833e+01, 1.00478e+03}, {1.90872e-05, 3.08611e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.23469e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.58209e+04}, {1.34361e+02, 1.02130e+03}, {2.00622e-05, 3.16876e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.21829e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.58254e+04}, {1.34097e+02, 1.02135e+03}, {2.00722e-05, 3.15764e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.18360e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.58353e+04}, {1.33538e+02, 1.02146e+03}, {2.00938e-05, 3.13381e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.59791e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.67057e+04}, {2.54147e+02, 1.04339e+03}, {2.39022e-05, 3.23075e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.59385e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.67188e+04}, {2.53338e+02, 1.04360e+03}, {2.38854e-05, 3.21991e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.58533e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.67472e+04}, {2.51643e+02, 1.04405e+03}, {2.38514e-05, 3.19665e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsThermalTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsThermalTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.88317e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.32967e+04}, {8.25738e+01, 9.70853e+02}, {1.90427e-05, 3.03214e-04}, {1.21447e+07, 2.18796e+07}, {1.20841e+07, 2.18744e+07} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.87456e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.32812e+04}, {8.24487e+01, 9.70542e+02}, {1.90569e-05, 3.02064e-04}, {1.21537e+07, 2.19628e+07}, {1.20931e+07, 2.19576e+07} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.85630e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.32478e+04}, {8.21833e+01, 9.69875e+02}, {1.90872e-05, 2.99598e-04}, {1.21731e+07, 2.21410e+07}, {1.21123e+07, 2.21359e+07} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.18273e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.32486e+04}, {1.34361e+02, 9.74235e+02}, {2.00622e-05, 3.03214e-04}, {1.17163e+07, 2.18445e+07}, {1.16605e+07, 2.18368e+07} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.16610e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.32333e+04}, {1.34097e+02, 9.73923e+02}, {2.00722e-05, 3.02064e-04}, {1.17269e+07, 2.19275e+07}, {1.16709e+07, 2.19198e+07} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.13094e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.32005e+04}, {1.33538e+02, 9.73254e+02}, {2.00938e-05, 2.99598e-04}, {1.17494e+07, 2.21054e+07}, {1.16932e+07, 2.20977e+07} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.57730e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.32330e+04}, {2.54147e+02, 9.79494e+02}, {2.39022e-05, 3.03214e-04}, {1.08306e+07, 2.17898e+07}, {1.07833e+07, 2.17775e+07} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.57318e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.32179e+04}, {2.53338e+02, 9.79185e+02}, {2.38854e-05, 3.02064e-04}, {1.08453e+07, 2.18726e+07}, {1.07979e+07, 2.18603e+07} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.56452e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.31853e+04}, {2.51643e+02, 9.78520e+02}, {2.38514e-05, 2.99598e-04}, {1.08767e+07, 2.20500e+07}, {1.08290e+07, 2.20378e+07} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsSpycherPruessTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.77217e+03, {3.00488e-01, 6.99512e-01}, {1.87668e+03, 5.32842e+04}, {8.25738e+01, 9.70985e+02}, {1.90427e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.76239e+03, {3.00580e-01, 6.99420e-01}, {1.87383e+03, 5.32686e+04}, {8.24487e+01, 9.70677e+02}, {1.90569e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.74154e+03, {3.00781e-01, 6.99219e-01}, {1.86780e+03, 5.32348e+04}, {8.21833e+01, 9.70013e+02}, {1.90872e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.05928e+03, {2.96731e-01, 7.03269e-01}, {3.05367e+03, 5.32295e+04}, {1.34361e+02, 9.74440e+02}, {2.00622e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.04143e+03, {2.96804e-01, 7.03196e-01}, {3.04766e+03, 5.32141e+04}, {1.34097e+02, 9.74130e+02}, {2.00722e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.00358e+03, {2.96962e-01, 7.03038e-01}, {3.03496e+03, 5.31808e+04}, {1.33538e+02, 9.73465e+02}, {2.00938e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.56195e+04, {2.93050e-01, 7.06950e-01}, {5.77607e+03, 5.32048e+04}, {2.54147e+02, 9.79798e+02}, {2.39022e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.55771e+04, {2.93105e-01, 7.06895e-01}, {5.75768e+03, 5.31894e+04}, {2.53338e+02, 9.79492e+02}, {2.38854e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.54878e+04, {2.93225e-01, 7.06775e-01}, {5.71917e+03, 5.31561e+04}, {2.51643e+02, 9.78834e+02}, {2.38514e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +/* UNCRUSTIFY-ON */ + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp new file mode 100644 index 00000000000..45a7651f812 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -0,0 +1,198 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidCompositionalMultiphasePVTPackage.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +namespace geos +{ +namespace testing +{ + +template< > +struct UsePVTPackage< CompositionalMultiphaseFluidPVTPackage > +{ + static constexpr bool value = true; +}; + +} // namespace testing + +} // namespace geos + +enum class EOS_TYPE : int { PR, SRK }; +ENUM_STRINGS( EOS_TYPE, "PR", "SRK" ); + +template< integer NUM_COMP > +struct Fluid +{}; + +template< EOS_TYPE EOS, integer NUM_COMP > +class MultiFluidCompositionalMultiphasePVTPackageTest : public MultiFluidTest< CompositionalMultiphaseFluidPVTPackage, 2, NUM_COMP > +{ +public: + using Base = MultiFluidTest< CompositionalMultiphaseFluidPVTPackage, 2, NUM_COMP >; + static constexpr real64 relTol = 1.0e-4; +public: + MultiFluidCompositionalMultiphasePVTPackageTest() + { + auto & parent = this->m_parent; + parent.resize( 1 ); + + string fluidName = GEOS_FMT( "fluid{}{}", EnumStrings< EOS_TYPE >::toString( EOS ), NUM_COMP ); + this->m_model = makeFluid( fluidName, &parent ); + + parent.initialize(); + parent.initializePostInitialConditions(); + } + + ~MultiFluidCompositionalMultiphasePVTPackageTest() override = default; + + void testNumericatDerivatives( const bool useMass ) + { + auto & fluid = this->getFluid(); + fluid.setMassFlag( useMass ); + + auto * parent = &(this->getParent()); + + array2d< real64 > samples; + Fluid< Base::numComp >::getSamples( samples ); + integer const sampleCount = samples.size( 0 ); + + real64 constexpr eps = 1.0e-7; + + constexpr real64 pressures[] = { 1.0e5, 50.0e5, 100.0e5, 600.0e5 }; + constexpr real64 temperatures[] = { 15.5, 24.0, 40.0, 80.0 }; + + for( integer sampleIndex = 0; sampleIndex < sampleCount; ++sampleIndex ) + { + for( real64 const pressure : pressures ) + { + for( real64 const temperature : temperatures ) + { + typename Base::TestData data ( pressure, units::convertCToK( temperature ), samples[sampleIndex].toSliceConst() ); + Base::testNumericalDerivatives( fluid, parent, data, eps, relTol ); + } + } + } + } + +private: + static CompositionalMultiphaseFluidPVTPackage * makeFluid( string const & name, Group * parent ); +}; + +template< integer NUM_COMP > +static void fillBinaryCoeffs( array2d< real64 > & binaryCoeff, std::array< real64 const, NUM_COMP *(NUM_COMP-1)/2 > const data ) +{ + auto bic = data.begin(); + binaryCoeff.resize( NUM_COMP, NUM_COMP ); + for( integer i = 0; i < NUM_COMP; ++i ) + { + binaryCoeff( i, i ) = 0.0; + for( integer j = i+1; j < NUM_COMP; ++j ) + { + binaryCoeff( i, j ) = *bic++; + binaryCoeff( j, i ) = binaryCoeff( i, j ); + } + } +} + +template< > +struct Fluid< 4 > +{ + static void fillProperties( Group & fluid ) + { + string_array & componentNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 4 >( componentNames, {"N2", "C10", "C20", "H20"} ); + + array1d< real64 > & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 4 >( molarWeight, {28e-3, 134e-3, 275e-3, 18e-3} ); + + array1d< real64 > & criticalPressure = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalPressureString() ); + fill< 4 >( criticalPressure, {34e5, 25.3e5, 14.6e5, 220.5e5} ); + array1d< real64 > & criticalTemperature = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalTemperatureString() ); + fill< 4 >( criticalTemperature, {126.2, 622.0, 782.0, 647.0} ); + array1d< real64 > & acentricFactor = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentAcentricFactorString() ); + fill< 4 >( acentricFactor, {0.04, 0.443, 0.816, 0.344} ); + } + + static void getSamples( array2d< real64 > & samples ) + { + samples.resize( 2, 4 ); + fill< 4 >( samples[0], {0.099, 0.300, 0.600, 0.001} ); + fill< 4 >( samples[1], {0.000, 0.000, 0.000, 1.000} ); + } +}; + +template< EOS_TYPE EOS, integer NUM_COMP > +CompositionalMultiphaseFluidPVTPackage * +MultiFluidCompositionalMultiphasePVTPackageTest< EOS, NUM_COMP >:: +makeFluid( string const & name, Group * parent ) +{ + CompositionalMultiphaseFluidPVTPackage & fluid = parent->registerGroup< CompositionalMultiphaseFluidPVTPackage >( name ); + + string_array & phaseNames = fluid.getReference< string_array >( string( MultiFluidBase::viewKeyStruct::phaseNamesString()) ); + fill< 2 >( phaseNames, {"oil", "gas"} ); + + string const eosName = EnumStrings< EOS_TYPE >::toString( EOS ); + string_array & equationOfState = fluid.getReference< string_array >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::equationsOfStateString() ); + fill< 2 >( equationOfState, {eosName, eosName} ); + + Fluid< NUM_COMP >::fillProperties( fluid ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +using PengRobinson4Test = MultiFluidCompositionalMultiphasePVTPackageTest< EOS_TYPE::PR, 4 >; +using SoaveRedlichKwong4Test = MultiFluidCompositionalMultiphasePVTPackageTest< EOS_TYPE::SRK, 4 >; + +TEST_F( PengRobinson4Test, numericalDerivativesMolar ) +{ + testNumericatDerivatives( false ); +} +TEST_F( PengRobinson4Test, numericalDerivativesMass ) +{ + testNumericatDerivatives( true ); +} + +TEST_F( SoaveRedlichKwong4Test, numericalDerivativesMolar ) +{ + testNumericatDerivatives( false ); +} +TEST_F( SoaveRedlichKwong4Test, numericalDerivativesMass ) +{ + testNumericatDerivatives( true ); +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp new file mode 100644 index 00000000000..d8356ae9a81 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -0,0 +1,275 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidDeadOil.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" + "3000000 0.04234 0.00001344\n" + "6000000 0.02046 0.0000142\n" + "9000000 0.01328 0.00001526\n" + "12000000 0.00977 0.0000166\n" + "15000000 0.00773 0.00001818\n" + "18000000 0.006426 0.00001994\n" + "21000000 0.005541 0.00002181\n" + "24000000 0.004919 0.0000237\n" + "27000000 0.004471 0.00002559 -- this is a comment\n" + "29500000 0.004194 0.00002714\n" + "31000000 0.004031 0.00002806\n" + "33000000 0.00391 0.00002832\n" + "53000000 0.003868 0.00002935"; + +static constexpr char const * pvdoTableContent = "#P[Pa] Bo[m3/sm3] Visc(Pa.s)\n" + "10000000.0 1.23331 0.00015674\n" + "12500000.0 1.21987 0.00016570\n" + "15000000.0 1.20802 0.00017445\n" + "20000000.0 1.18791 0.00019143\n" + "25000000.0 1.17137 0.00020779\n" + "30000000.0 1.15742 0.00022361\n" + "33200000.3 1.14946 0.00023359\n" + "35000000.0 1.14543 0.00023894\n" + "40000000.0 1.13498 0.00025383 -- this is a comment\n" + "50000000.0 1.11753 0.00028237\n" + "60000000.0 1.10346 0.00030941\n" + "70000000.0 1.09180 0.00033506\n" + "80000000.0 1.08194 0.00035945\n" + "90000000.0 1.07347 0.00038266\n" + "95000000.0 1.06966 0.00039384\n" + "100000000.0 1.06610 0.00040476\n" + "110000000.0 1.05961 0.00042584\n" + "112500000.0 1.05811 0.00043096\n" + "115000000.0 1.05665 0.00043602\n" + "117500000.0 1.05523 0.00044102\n" + "120000000.0 1.05385 0.00044596\n"; + +static constexpr char const * pvdwTableContent = "# Pref[Pa] Bw[m3/sm3] Cp[1/Pa] Visc[Pa.s]\n" + " 30600000.1 1.03 0.00000000041 0.0003"; + +template< bool FROM_TABLE > +class MultiFluidDeadOilTest : public MultiFluidTest< DeadOilFluid, 3, 3 > +{ +public: + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; +public: + MultiFluidDeadOilTest() + { + if constexpr (!FROM_TABLE) + { + writeTableToFile( "pvdo.txt", pvdoTableContent ); + writeTableToFile( "pvdg.txt", pvdgTableContent ); + writeTableToFile( "pvdw.txt", pvdwTableContent ); + } + + m_parent.resize( 1 ); + string const fluidName = GEOS_FMT( "fluid{}", (FROM_TABLE ? "Tables" : "Files")); + m_model = makeDeadOilFluid( fluidName, &m_parent ); + + m_parent.initialize(); + m_parent.initializePostInitialConditions(); + } + + ~MultiFluidDeadOilTest() override + { + if constexpr (!FROM_TABLE) + { + removeFile( "pvdo.txt" ); + removeFile( "pvdg.txt" ); + removeFile( "pvdw.txt" ); + } + } + +private: + static DeadOilFluid * makeDeadOilFluid( string const & name, Group * parent ); + static void fillPhysicalProperties( DeadOilFluid & fluid ); +}; + +template< bool FROM_TABLE > +void MultiFluidDeadOilTest< FROM_TABLE >::fillPhysicalProperties( DeadOilFluid & fluid ) +{ + string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 3 >( phaseNames, {"oil", "water", "gas"} ); + + string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 3 >( compNames, {"oil", "water", "gas"} ); + + array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 3 >( molarWgt, {114e-3, 18e-3, 16e-3} ); + + array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); + fill< 3 >( surfaceDens, {800.0, 1022.0, 0.9907} ); +} + +template<> +DeadOilFluid * MultiFluidDeadOilTest< false >::makeDeadOilFluid( string const & name, Group * parent ) +{ + DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); + + fillPhysicalProperties( fluid ); + + path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); + fill< 3 >( tableNames, {"pvdo.txt", "pvdw.txt", "pvdg.txt"} ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +template<> +DeadOilFluid * MultiFluidDeadOilTest< true >::makeDeadOilFluid( string const & name, Group * parent ) +{ + // 1) First, define the tables (PVDO, PVDG) + + // 1D table with linear interpolation + integer constexpr NaxisPVDO = 21; + integer constexpr NaxisPVDG = 13; + + array1d< real64_array > coordinatesPVDO( 1 ); + real64_array valuesPVDO_Bo; + real64_array valuesPVDO_visc; + fill< NaxisPVDO >( coordinatesPVDO[0], { + 1.000e+07, 1.250e+07, 1.500e+07, 2.000e+07, 2.500e+07, 3.000e+07, 3.320e+07, 3.500e+07, + 4.000e+07, 5.000e+07, 6.000e+07, 7.000e+07, 8.000e+07, 9.000e+07, 9.500e+07, 1.000e+08, + 1.100e+08, 1.125e+08, 1.150e+08, 1.175e+08, 1.200e+08 } ); + fill< NaxisPVDO >( valuesPVDO_Bo, { + 1.23331, 1.21987, 1.20802, 1.18791, 1.17137, 1.15742, 1.14946, 1.14543, + 1.13498, 1.11753, 1.10346, 1.09180, 1.08194, 1.07347, 1.06966, 1.06610, + 1.05961, 1.05811, 1.05665, 1.05523, 1.05385 } ); + fill< NaxisPVDO >( valuesPVDO_visc, { + 1.56740e-04, 1.65700e-04, 1.74450e-04, 1.91430e-04, 2.07790e-04, 2.23610e-04, 2.33590e-04, 2.38940e-04, + 2.53830e-04, 2.82370e-04, 3.09410e-04, 3.35060e-04, 3.59450e-04, 3.82660e-04, 3.93840e-04, 4.04760e-04, + 4.25840e-04, 4.30960e-04, 4.36020e-04, 4.41020e-04, 4.45960e-04 } ); + + array1d< real64_array > coordinatesPVDG( 1 ); + real64_array valuesPVDG_Bg; + real64_array valuesPVDG_visc; + fill< NaxisPVDG >( coordinatesPVDG[0], { + 3.000e+06, 6.000e+06, 9.000e+06, 1.200e+07, 1.500e+07, 1.800e+07, 2.100e+07, 2.400e+07, + 2.700e+07, 2.950e+07, 3.100e+07, 3.300e+07, 5.300e+07 } ); + fill< NaxisPVDG >( valuesPVDG_Bg, { + 4.23400e-02, 2.04600e-02, 1.32800e-02, 9.77000e-03, 7.73000e-03, 6.42600e-03, 5.54100e-03, 4.91900e-03, + 4.47100e-03, 4.19400e-03, 4.03100e-03, 3.91000e-03, 3.86800e-03 } ); + fill< NaxisPVDG >( valuesPVDG_visc, { + 1.34400e-05, 1.42000e-05, 1.52600e-05, 1.66000e-05, 1.81800e-05, 1.99400e-05, 2.18100e-05, 2.37000e-05, + 2.55900e-05, 2.71400e-05, 2.80600e-05, 2.83200e-05, 2.93500e-05 } ); + + initializeTable( "PVDO_Bo", coordinatesPVDO, valuesPVDO_Bo ); + initializeTable( "PVDO_visc", coordinatesPVDO, valuesPVDO_visc ); + initializeTable( "PVDG_Bg", coordinatesPVDG, valuesPVDG_Bg ); + initializeTable( "PVDG_visc", coordinatesPVDG, valuesPVDG_visc ); + + // 2) Then, define the Dead-Oil constitutive model + + DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); + + fillPhysicalProperties( fluid ); + + string_array & FVFTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::formationVolumeFactorTableNamesString() ); + fill< 2 >( FVFTableNames, {"PVDG_Bg", "PVDO_Bo"} ); + + string_array & viscosityTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::viscosityTableNamesString() ); + fill< 2 >( viscosityTableNames, {"PVDG_visc", "PVDO_visc"} ); + + real64 & waterRefPressure = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterRefPressureString() ); + waterRefPressure = 30600000.1; + real64 & waterFormationVolumeFactor = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterFormationVolumeFactorString() ); + waterFormationVolumeFactor = 1.03; + real64 & waterCompressibility = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterCompressibilityString() ); + waterCompressibility = 0.00000000041; + real64 & waterViscosity = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterViscosityString() ); + waterViscosity = 0.0003; + + fluid.postProcessInputRecursive(); + return &fluid; +} + +using MultiFluidDeadOilTestFromFiles = MultiFluidDeadOilTest< false >; +using MultiFluidDeadOilTestFromTables = MultiFluidDeadOilTest< true >; + +TEST_F( MultiFluidDeadOilTestFromFiles, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromFiles, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromTables, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromTables, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp new file mode 100644 index 00000000000..4ea16870680 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -0,0 +1,168 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidLiveOil.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" + "3000000 0.04234 0.00001344\n" + "6000000 0.02046 0.0000142\n" + "9000000 0.01328 0.00001526\n" + "12000000 0.00977 0.0000166\n" + "15000000 0.00773 0.00001818\n" + "18000000 0.006426 0.00001994\n" + "21000000 0.005541 0.00002181\n" + "24000000 0.004919 0.0000237\n" + "27000000 0.004471 0.00002559 -- this is a comment\n" + "29500000 0.004194 0.00002714\n" + "31000000 0.004031 0.00002806\n" + "33000000 0.00391 0.00002832\n" + "53000000 0.003868 0.00002935"; + +static const char * pvtoTableContent = "# Rs[sm3/sm3]\tPbub[Pa]\tBo[m3/sm3]\tVisc(Pa.s)\n" + "\n" + " 2\t 2000000\t 1.02\t 0.000975\n" + " 5\t 5000000\t 1.03\t 0.00091\n" + " 10\t 10000000\t1.04\t 0.00083\n" + " 15\t 20000000\t1.05\t 0.000695\n" + " 90000000\t1.03\t 0.000985 -- some line comment\n" + " 30\t 30000000\t1.07\t 0.000594\n" + " 40\t 40000000\t1.08\t 0.00051\n" + " 50000000\t1.07\t 0.000549 -- another one\n" + " 90000000\t1.06\t 0.00074\n" + " 50\t 50000000.7\t1.09\t 0.000449\n" + " 90000000.7\t1.08\t 0.000605"; + +static const char * pvtwTableContent = "#\tPref[Pa]\tBw[m3/sm3]\tCp[1/Pa]\t Visc[Pa.s]\n" + "\t30600000.1\t1.03\t\t0.00000000041\t0.0003"; + +class MultiFluidLiveOilTest : public MultiFluidTest< BlackOilFluid, 3, 3 > +{ +public: + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; +public: + MultiFluidLiveOilTest() + { + writeTableToFile( pvtoFileName, pvtoTableContent ); + writeTableToFile( pvdgFileName, pvdgTableContent ); + writeTableToFile( pvtwFileName, pvtwTableContent ); + + m_parent.resize( 1 ); + m_model = makeLiveOilFluid( "fluid", &m_parent ); + + m_parent.initialize(); + m_parent.initializePostInitialConditions(); + } + + ~MultiFluidLiveOilTest() override + { + removeFile( pvtoFileName ); + removeFile( pvdgFileName ); + removeFile( pvtwFileName ); + } + +private: + static BlackOilFluid * makeLiveOilFluid( string const & name, Group * parent ); + static constexpr const char * pvtoFileName = "pvto.txt"; + static constexpr const char * pvdgFileName = "pvdg.txt"; + static constexpr const char * pvtwFileName = "pvtw.txt"; +}; + +BlackOilFluid * MultiFluidLiveOilTest::makeLiveOilFluid( string const & name, Group * parent ) +{ + BlackOilFluid & fluid = parent->registerGroup< BlackOilFluid >( name ); + + string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 3 >( phaseNames, {"oil", "gas", "water"} ); + + string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 3 >( compNames, {"oil", "gas", "water"} ); + + array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 3 >( molarWgt, {114e-3, 16e-3, 18e-3} ); + + array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); + fill< 3 >( surfaceDens, {800.0, 0.9907, 1022.0} ); + + path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); + fill< 3 >( tableNames, {pvtoFileName, pvdgFileName, pvtwFileName} ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +TEST_F( MultiFluidLiveOilTest, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 constexpr eps = 1.0e-6; + + array2d< real64 > samples( 2, 3 ); + fill< 3 >( samples[0], { 0.10000, 0.3, 0.60000 } ); + fill< 3 >( samples[1], { 0.79999, 0.2, 0.00001 } ); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + for( integer sampleIndex = 0; sampleIndex < samples.size( 0 ); sampleIndex++ ) + { + TestData data ( pressure, 297.15, samples[sampleIndex] ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } + } +} + +TEST_F( MultiFluidLiveOilTest, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 constexpr eps = 1.0e-6; + + array2d< real64 > samples( 2, 3 ); + fill< 3 >( samples[0], { 0.10000, 0.3, 0.60000 } ); + fill< 3 >( samples[1], { 0.79999, 0.2, 0.00001 } ); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + for( integer sampleIndex = 0; sampleIndex < samples.size( 0 ); sampleIndex++ ) + { + TestData data ( pressure, 297.15, samples[sampleIndex] ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml new file mode 100644 index 00000000000..20ac42736ec --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt new file mode 100644 index 00000000000..d0479350bf9 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt @@ -0,0 +1,112 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.8078e+03 1.3932e-08 1.0000e+00 0.0000e+00 6.8078e+03 6.8078e+03 3.4772e+02 3.4772e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.7113e+03 1.4639e-08 1.0000e+00 0.0000e+00 6.7113e+03 6.7113e+03 3.4279e+02 3.4279e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.6112e+03 1.5406e-08 1.0000e+00 0.0000e+00 6.6112e+03 6.6112e+03 3.3768e+02 3.3768e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.5075e+03 1.6240e-08 1.0000e+00 0.0000e+00 6.5075e+03 6.5075e+03 3.3238e+02 3.3238e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 6.3998e+03 1.7151e-08 0.0000e+00 1.0000e+00 6.3998e+03 6.3998e+03 3.2688e+02 3.2688e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e-01 3.0000e+07 5.5315e+02 6.2879e+03 1.8147e-08 0.0000e+00 1.0000e+00 6.2879e+03 6.2879e+03 3.2117e+02 3.2117e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e-01 2.9000e+07 5.5315e+02 6.1715e+03 1.9240e-08 0.0000e+00 1.0000e+00 6.1715e+03 6.1715e+03 3.1522e+02 3.1522e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e-01 2.8000e+07 5.5315e+02 6.0503e+03 2.0443e-08 0.0000e+00 1.0000e+00 6.0503e+03 6.0503e+03 3.0903e+02 3.0903e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.9240e+03 2.1772e-08 0.0000e+00 1.0000e+00 5.9240e+03 5.9240e+03 3.0258e+02 3.0258e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.7922e+03 2.3244e-08 0.0000e+00 1.0000e+00 5.7922e+03 5.7922e+03 2.9585e+02 2.9585e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.6546e+03 2.4879e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.5107e+03 2.6704e-08 0.0000e+00 1.0000e+00 5.5107e+03 5.5107e+03 2.8147e+02 2.8147e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.3601e+03 2.8747e-08 0.0000e+00 1.0000e+00 5.3601e+03 5.3601e+03 2.7378e+02 2.7378e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 5.2024e+03 3.1042e-08 0.0000e+00 1.0000e+00 5.2024e+03 5.2024e+03 2.6572e+02 2.6572e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 5.0370e+03 3.3630e-08 0.0000e+00 1.0000e+00 5.0370e+03 5.0370e+03 2.5728e+02 2.5728e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.8634e+03 3.6560e-08 0.0000e+00 1.0000e+00 4.8634e+03 4.8634e+03 2.4841e+02 2.4841e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.6812e+03 3.9890e-08 0.0000e+00 1.0000e+00 4.6812e+03 4.6812e+03 2.3910e+02 2.3910e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.4898e+03 4.3686e-08 0.0000e+00 1.0000e+00 4.4898e+03 4.4898e+03 2.2933e+02 2.2933e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.2898e+03 4.6261e-08 4.5641e-02 9.5436e-01 4.7351e+03 4.2706e+03 3.3247e+02 2.1533e+02 1.0000e-03 1.0000e-03 7.6825e-03 2.2373e-03 4.2618e-01 1.0167e-01 8.3774e-02 4.6651e-02 2.2890e-02 1.7745e-02 2.9117e-01 9.0452e-03 3.0262e-03 5.3843e-01 1.1504e-01 8.8042e-02 4.5564e-02 2.0832e-02 1.5009e-02 1.6501e-01 +3.8000e-01 1.6000e+07 5.5315e+02 4.0893e+03 4.9564e-08 1.8812e-01 8.1188e-01 4.6823e+03 3.9727e+03 3.6079e+02 1.8822e+02 1.0000e-03 1.0000e-03 7.1915e-03 1.9892e-03 3.8884e-01 9.6576e-02 8.1672e-02 4.6619e-02 2.3403e-02 1.8552e-02 3.3516e-01 9.2576e-03 3.1440e-03 5.5548e-01 1.1717e-01 8.8787e-02 4.5455e-02 2.0543e-02 1.4608e-02 1.4556e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.8842e+03 5.3440e-08 2.4423e-01 7.5577e-01 4.6085e+03 3.6965e+03 3.8231e+02 1.6795e+02 1.0000e-03 1.0000e-03 6.7572e-03 1.7894e-03 3.5754e-01 9.1894e-02 7.9461e-02 4.6321e-02 2.3709e-02 1.9148e-02 3.7339e-01 9.3969e-03 3.2143e-03 5.6606e-01 1.1862e-01 8.9394e-02 4.5472e-02 2.0403e-02 1.4383e-02 1.3306e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.6739e+03 5.8034e-08 2.7428e-01 7.2572e-01 4.5259e+03 3.4299e+03 4.0050e+02 1.5105e+02 1.0000e-03 1.0000e-03 6.3418e-03 1.6141e-03 3.2902e-01 8.7264e-02 7.7032e-02 4.5789e-02 2.3863e-02 1.9608e-02 4.0947e-01 9.5000e-03 3.2607e-03 5.7339e-01 1.1974e-01 8.9944e-02 4.5565e-02 2.0343e-02 1.4252e-02 1.2401e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.4575e+03 6.3540e-08 2.9189e-01 7.0811e-01 4.4387e+03 3.1688e+03 4.1665e+02 1.3625e+02 1.0000e-03 1.0000e-03 5.9319e-03 1.4546e-03 3.0213e-01 8.2554e-02 7.4331e-02 4.5021e-02 2.3875e-02 1.9947e-02 4.4476e-01 9.5793e-03 3.2918e-03 5.7862e-01 1.2065e-01 9.0462e-02 4.5709e-02 2.0338e-02 1.4185e-02 1.1717e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.2342e+03 7.0225e-08 3.0194e-01 6.9806e-01 4.3489e+03 2.9114e+03 4.3138e+02 1.2292e+02 1.0000e-03 1.0000e-03 5.5208e-03 1.3065e-03 2.7628e-01 7.7691e-02 7.1321e-02 4.4001e-02 2.3741e-02 2.0165e-02 4.7998e-01 9.6405e-03 3.3118e-03 5.8228e-01 1.2140e-01 9.0952e-02 4.5894e-02 2.0377e-02 1.4168e-02 1.1198e-01 +4.8000e-01 1.1000e+07 5.5315e+02 3.0029e+03 7.8464e-08 3.0653e-01 6.9347e-01 4.2574e+03 2.6569e+03 4.4506e+02 1.1069e+02 1.0000e-03 1.0000e-03 5.1047e-03 1.1672e-03 2.5115e-01 7.2629e-02 6.7965e-02 4.2709e-02 2.3447e-02 2.0250e-02 5.1558e-01 9.6862e-03 3.3228e-03 5.8465e-01 1.2199e-01 9.1412e-02 4.6109e-02 2.0451e-02 1.4193e-02 1.0818e-01 +5.0000e-01 1.0000e+07 5.5315e+02 2.7626e+03 8.8797e-08 3.0652e-01 6.9348e-01 4.1650e+03 2.4047e+03 4.5794e+02 9.9319e+01 1.0000e-03 1.0000e-03 4.6810e-03 1.0353e-03 2.2653e-01 6.7336e-02 6.4228e-02 4.1113e-02 2.2974e-02 2.0183e-02 5.5192e-01 9.7171e-03 3.3262e-03 5.8587e-01 1.2245e-01 9.1830e-02 4.6345e-02 2.0556e-02 1.4256e-02 1.0566e-01 +5.2000e-01 9.6040e+06 5.5315e+02 2.6646e+03 9.3634e-08 3.0530e-01 6.9470e-01 4.1282e+03 2.3054e+03 4.6286e+02 9.5019e+01 1.0000e-03 1.0000e-03 4.5107e-03 9.8476e-04 2.1689e-01 6.5170e-02 6.2635e-02 4.0391e-02 2.2731e-02 2.0109e-02 5.6658e-01 9.7252e-03 3.3256e-03 5.8604e-01 1.2259e-01 9.1982e-02 4.6442e-02 2.0604e-02 1.4291e-02 1.0500e-01 +5.4000e-01 9.2080e+06 5.5315e+02 2.5649e+03 9.8987e-08 3.0338e-01 6.9662e-01 4.0913e+03 2.2065e+03 4.6768e+02 9.0820e+01 1.0000e-03 1.0000e-03 4.3389e-03 9.3517e-04 2.0731e-01 6.2962e-02 6.0974e-02 3.9613e-02 2.2454e-02 2.0005e-02 5.8141e-01 9.7309e-03 3.3238e-03 5.8604e-01 1.2270e-01 9.2122e-02 4.6539e-02 2.0656e-02 1.4331e-02 1.0456e-01 +5.6000e-01 8.8120e+06 5.5315e+02 2.4635e+03 1.0494e-07 3.0072e-01 6.9928e-01 4.0544e+03 2.1078e+03 4.7243e+02 8.6716e+01 1.0000e-03 1.0000e-03 4.1655e-03 8.8643e-04 1.9777e-01 6.0710e-02 5.9243e-02 3.8777e-02 2.2141e-02 1.9868e-02 5.9644e-01 9.7341e-03 3.3209e-03 5.8586e-01 1.2278e-01 9.2251e-02 4.6636e-02 2.0712e-02 1.4376e-02 1.0433e-01 +5.8000e-01 8.4160e+06 5.5315e+02 2.3602e+03 1.1158e-07 2.9729e-01 7.0271e-01 4.0174e+03 2.0095e+03 4.7709e+02 8.2700e+01 1.0000e-03 1.0000e-03 3.9904e-03 8.3852e-04 1.8827e-01 5.8414e-02 5.7439e-02 3.7881e-02 2.1790e-02 1.9696e-02 6.1168e-01 9.7345e-03 3.3169e-03 5.8549e-01 1.2284e-01 9.2366e-02 4.6732e-02 2.0769e-02 1.4426e-02 1.0433e-01 +6.0000e-01 8.0200e+06 5.5315e+02 2.2549e+03 1.1902e-07 2.9301e-01 7.0699e-01 3.9803e+03 1.9115e+03 4.8169e+02 7.8767e+01 1.0000e-03 1.0000e-03 3.8136e-03 7.9138e-04 1.7882e-01 5.6072e-02 5.5560e-02 3.6921e-02 2.1398e-02 1.9487e-02 6.2714e-01 9.7319e-03 3.3117e-03 5.8492e-01 1.2286e-01 9.2464e-02 4.6825e-02 2.0830e-02 1.4481e-02 1.0457e-01 +6.2000e-01 7.6240e+06 5.5315e+02 2.1476e+03 1.2742e-07 2.8781e-01 7.1219e-01 3.9433e+03 1.8138e+03 4.8622e+02 7.4911e+01 1.0000e-03 1.0000e-03 3.6350e-03 7.4500e-04 1.6939e-01 5.3682e-02 5.3604e-02 3.5895e-02 2.0962e-02 1.9237e-02 6.4285e-01 9.7262e-03 3.3052e-03 5.8415e-01 1.2285e-01 9.2542e-02 4.6914e-02 2.0892e-02 1.4540e-02 1.0509e-01 +6.4000e-01 7.2280e+06 5.5315e+02 2.0381e+03 1.3694e-07 2.8158e-01 7.1842e-01 3.9062e+03 1.7164e+03 4.9069e+02 7.1128e+01 1.0000e-03 1.0000e-03 3.4546e-03 6.9934e-04 1.6000e-01 5.1244e-02 5.1567e-02 3.4799e-02 2.0480e-02 1.8942e-02 6.5881e-01 9.7170e-03 3.2975e-03 5.8315e-01 1.2279e-01 9.2598e-02 4.6997e-02 2.0954e-02 1.4603e-02 1.0590e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.9265e+03 1.4781e-07 2.7416e-01 7.2584e-01 3.8690e+03 1.6194e+03 4.9510e+02 6.7415e+01 1.0000e-03 1.0000e-03 3.2724e-03 6.5437e-04 1.5064e-01 4.8757e-02 4.9447e-02 3.3630e-02 1.9949e-02 1.8599e-02 6.7505e-01 9.7038e-03 3.2882e-03 5.8189e-01 1.2269e-01 9.2625e-02 4.7071e-02 2.1017e-02 1.4670e-02 1.0704e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.8126e+03 1.6031e-07 2.6540e-01 7.3460e-01 3.8319e+03 1.5227e+03 4.9946e+02 6.3766e+01 1.0000e-03 1.0000e-03 3.0883e-03 6.1007e-04 1.4131e-01 4.6220e-02 4.7241e-02 3.2385e-02 1.9365e-02 1.8204e-02 6.9158e-01 9.6862e-03 3.2774e-03 5.8036e-01 1.2254e-01 9.2619e-02 4.7134e-02 2.1078e-02 1.4740e-02 1.0857e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6964e+03 1.7480e-07 2.5503e-01 7.4497e-01 3.7947e+03 1.4263e+03 5.0378e+02 6.0179e+01 1.0000e-03 1.0000e-03 2.9022e-03 5.6642e-04 1.3200e-01 4.3631e-02 4.4946e-02 3.1059e-02 1.8725e-02 1.7751e-02 7.0842e-01 9.6634e-03 3.2648e-03 5.7851e-01 1.2232e-01 9.2573e-02 4.7182e-02 2.1137e-02 1.4812e-02 1.1054e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5777e+03 1.9174e-07 2.4276e-01 7.5724e-01 3.7575e+03 1.3303e+03 5.0805e+02 5.6650e+01 1.0000e-03 1.0000e-03 2.7143e-03 5.2340e-04 1.2272e-01 4.0990e-02 4.2560e-02 2.9648e-02 1.8024e-02 1.7237e-02 7.2559e-01 9.6346e-03 3.2500e-03 5.7630e-01 1.2203e-01 9.2478e-02 4.7211e-02 2.1190e-02 1.4884e-02 1.1303e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4568e+03 2.1177e-07 2.2816e-01 7.7184e-01 3.7203e+03 1.2347e+03 5.1228e+02 5.3177e+01 1.0000e-03 1.0000e-03 2.5244e-03 4.8100e-04 1.1346e-01 3.8295e-02 4.0080e-02 2.8149e-02 1.7259e-02 1.6654e-02 7.4310e-01 9.5987e-03 3.2329e-03 5.7365e-01 1.2165e-01 9.2321e-02 4.7213e-02 2.1237e-02 1.4956e-02 1.1614e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3334e+03 2.3574e-07 2.1067e-01 7.8933e-01 3.6830e+03 1.1394e+03 5.1647e+02 4.9756e+01 1.0000e-03 1.0000e-03 2.3326e-03 4.3920e-04 1.0422e-01 3.5547e-02 3.7502e-02 2.6557e-02 1.6425e-02 1.5997e-02 7.6098e-01 9.5541e-03 3.2128e-03 5.7048e-01 1.2117e-01 9.2089e-02 4.7183e-02 2.1272e-02 1.5025e-02 1.2002e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.2078e+03 2.6481e-07 1.8950e-01 8.1050e-01 3.6457e+03 1.0445e+03 5.2063e+02 4.6386e+01 1.0000e-03 1.0000e-03 2.1388e-03 3.9798e-04 9.4999e-02 3.2743e-02 3.4823e-02 2.4868e-02 1.5517e-02 1.5258e-02 7.7926e-01 9.4988e-03 3.1892e-03 5.6667e-01 1.2055e-01 9.1759e-02 4.7107e-02 2.1291e-02 1.5089e-02 1.2485e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0802e+03 3.0068e-07 1.6353e-01 8.3647e-01 3.6084e+03 9.5005e+02 5.2476e+02 4.3064e+01 1.0000e-03 1.0000e-03 1.9431e-03 3.5734e-04 8.5803e-02 2.9884e-02 3.2040e-02 2.3075e-02 1.4530e-02 1.4429e-02 7.9794e-01 9.4300e-03 3.1610e-03 5.6205e-01 1.1976e-01 9.1304e-02 4.6973e-02 2.1288e-02 1.5141e-02 1.3089e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.5074e+02 3.4583e-07 1.3110e-01 8.6890e-01 3.5711e+03 8.5597e+02 5.2886e+02 3.9788e+01 1.0000e-03 1.0000e-03 1.7455e-03 3.1726e-04 7.6629e-02 2.6969e-02 2.9151e-02 2.1175e-02 1.3457e-02 1.3502e-02 8.1705e-01 9.3436e-03 3.1270e-03 5.5639e-01 1.1875e-01 9.0682e-02 4.6757e-02 2.1252e-02 1.5176e-02 1.3852e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1998e+02 4.0405e-07 8.9676e-02 9.1032e-01 3.5337e+03 7.6231e+02 5.3294e+02 3.6555e+01 1.0000e-03 1.0000e-03 1.5459e-03 2.7773e-04 6.7475e-02 2.3996e-02 2.6151e-02 1.9163e-02 1.2294e-02 1.2467e-02 8.3663e-01 9.2335e-03 3.0853e-03 5.4933e-01 1.1744e-01 8.9834e-02 4.6428e-02 2.1170e-02 1.5182e-02 1.4830e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8864e+02 4.8147e-07 3.5115e-02 9.6488e-01 3.4962e+03 6.6908e+02 5.3699e+02 3.3364e+01 1.0000e-03 1.0000e-03 1.3444e-03 2.3875e-04 5.8344e-02 2.0966e-02 2.3038e-02 1.7031e-02 1.1033e-02 1.1313e-02 8.5669e-01 9.0905e-03 3.0326e-03 5.4033e-01 1.1571e-01 8.8666e-02 4.5938e-02 2.1017e-02 1.5145e-02 1.6108e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.7384e+02 4.2818e-07 0.0000e+00 1.0000e+00 5.7384e+02 5.7384e+02 2.9310e+01 2.9310e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7739e+02 5.0563e-07 0.0000e+00 1.0000e+00 4.7739e+02 4.7739e+02 2.4384e+01 2.4384e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.8268e+02 6.1919e-07 0.0000e+00 1.0000e+00 3.8268e+02 3.8268e+02 1.9546e+01 1.9546e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8974e+02 8.0221e-07 0.0000e+00 1.0000e+00 2.8974e+02 2.8974e+02 1.4799e+01 1.4799e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9860e+02 1.1473e-06 0.0000e+00 1.0000e+00 1.9860e+02 1.9860e+02 1.0144e+01 1.0144e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0929e+02 2.0427e-06 0.0000e+00 1.0000e+00 1.0929e+02 1.0929e+02 5.5820e+00 5.5820e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1802e+01 1.0027e-05 0.0000e+00 1.0000e+00 2.1802e+01 2.1802e+01 1.1136e+00 1.1136e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0339e+02 2.0372e-06 0.0000e+00 1.0000e+00 1.0339e+02 1.0339e+02 5.2808e+00 5.2808e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8748e+02 1.1418e-06 0.0000e+00 1.0000e+00 1.8748e+02 1.8748e+02 9.5758e+00 9.5758e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7291e+02 7.9661e-07 0.0000e+00 1.0000e+00 2.7291e+02 2.7291e+02 1.3939e+01 1.3939e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5965e+02 6.1354e-07 0.0000e+00 1.0000e+00 3.5965e+02 3.5965e+02 1.8370e+01 1.8370e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4765e+02 4.9994e-07 0.0000e+00 1.0000e+00 4.4765e+02 4.4765e+02 2.2865e+01 2.2865e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.3688e+02 4.2246e-07 0.0000e+00 1.0000e+00 5.3688e+02 5.3688e+02 2.7422e+01 2.7422e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.2727e+02 3.6616e-07 0.0000e+00 1.0000e+00 6.2727e+02 6.2727e+02 3.2039e+01 3.2039e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.1876e+02 3.2331e-07 0.0000e+00 1.0000e+00 7.1876e+02 7.1876e+02 3.6712e+01 3.6712e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 8.1129e+02 2.8954e-07 0.0000e+00 1.0000e+00 8.1129e+02 8.1129e+02 4.1438e+01 4.1438e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 9.0478e+02 2.6219e-07 0.0000e+00 1.0000e+00 9.0478e+02 9.0478e+02 4.6214e+01 4.6214e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.9914e+02 2.3954e-07 0.0000e+00 1.0000e+00 9.9914e+02 9.9914e+02 5.1033e+01 5.1033e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0943e+03 2.2043e-07 0.0000e+00 1.0000e+00 1.0943e+03 1.0943e+03 5.5894e+01 5.5894e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1902e+03 2.0406e-07 0.0000e+00 1.0000e+00 1.1902e+03 1.1902e+03 6.0790e+01 6.0790e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2866e+03 1.8984e-07 0.0000e+00 1.0000e+00 1.2866e+03 1.2866e+03 6.5717e+01 6.5717e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3836e+03 1.7735e-07 0.0000e+00 1.0000e+00 1.3836e+03 1.3836e+03 7.0669e+01 7.0669e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4809e+03 1.6627e-07 0.0000e+00 1.0000e+00 1.4809e+03 1.4809e+03 7.5641e+01 7.5641e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5785e+03 1.5636e-07 0.0000e+00 1.0000e+00 1.5785e+03 1.5785e+03 8.0628e+01 8.0628e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6764e+03 1.4743e-07 0.0000e+00 1.0000e+00 1.6764e+03 1.6764e+03 8.5624e+01 8.5624e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7742e+03 1.3931e-07 0.0000e+00 1.0000e+00 1.7742e+03 1.7742e+03 9.0624e+01 9.0624e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8721e+03 1.3191e-07 0.0000e+00 1.0000e+00 1.8721e+03 1.8721e+03 9.5621e+01 9.5621e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9698e+03 1.2511e-07 0.0000e+00 1.0000e+00 1.9698e+03 1.9698e+03 1.0061e+02 1.0061e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0672e+03 1.1885e-07 0.0000e+00 1.0000e+00 2.0672e+03 2.0672e+03 1.0559e+02 1.0559e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1643e+03 1.1305e-07 0.0000e+00 1.0000e+00 2.1643e+03 2.1643e+03 1.1055e+02 1.1055e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.2610e+03 1.0766e-07 0.0000e+00 1.0000e+00 2.2610e+03 2.2610e+03 1.1549e+02 1.1549e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.3571e+03 1.0264e-07 0.0000e+00 1.0000e+00 2.3571e+03 2.3571e+03 1.2039e+02 1.2039e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5968e+03 9.1381e-08 0.0000e+00 1.0000e+00 2.5968e+03 2.5968e+03 1.3264e+02 1.3264e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.8313e+03 8.1781e-08 0.0000e+00 1.0000e+00 2.8313e+03 2.8313e+03 1.4462e+02 1.4462e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 3.0596e+03 7.3522e-08 0.0000e+00 1.0000e+00 3.0596e+03 3.0596e+03 1.5628e+02 1.5628e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.2810e+03 6.6367e-08 0.0000e+00 1.0000e+00 3.2810e+03 3.2810e+03 1.6759e+02 1.6759e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.4950e+03 6.0138e-08 0.0000e+00 1.0000e+00 3.4950e+03 3.4950e+03 1.7852e+02 1.7852e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.7013e+03 5.4692e-08 0.0000e+00 1.0000e+00 3.7013e+03 3.7013e+03 1.8905e+02 1.8905e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.8999e+03 4.9912e-08 0.0000e+00 1.0000e+00 3.8999e+03 3.8999e+03 1.9920e+02 1.9920e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 4.0907e+03 4.5705e-08 0.0000e+00 1.0000e+00 4.0907e+03 4.0907e+03 2.0894e+02 2.0894e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.2739e+03 4.1989e-08 0.0000e+00 1.0000e+00 4.2739e+03 4.2739e+03 2.1830e+02 2.1830e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.4497e+03 3.8697e-08 0.0000e+00 1.0000e+00 4.4497e+03 4.4497e+03 2.2728e+02 2.2728e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.6183e+03 3.5771e-08 0.0000e+00 1.0000e+00 4.6183e+03 4.6183e+03 2.3589e+02 2.3589e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.7802e+03 3.3162e-08 0.0000e+00 1.0000e+00 4.7802e+03 4.7802e+03 2.4416e+02 2.4416e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.9355e+03 3.0829e-08 0.0000e+00 1.0000e+00 4.9355e+03 4.9355e+03 2.5209e+02 2.5209e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 5.0846e+03 2.8736e-08 0.0000e+00 1.0000e+00 5.0846e+03 5.0846e+03 2.5971e+02 2.5971e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 5.2278e+03 2.6853e-08 0.0000e+00 1.0000e+00 5.2278e+03 5.2278e+03 2.6702e+02 2.6702e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.3654e+03 2.5153e-08 0.0000e+00 1.0000e+00 5.3654e+03 5.3654e+03 2.7405e+02 2.7405e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.4978e+03 2.3615e-08 0.0000e+00 1.0000e+00 5.4978e+03 5.4978e+03 2.8081e+02 2.8081e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.6252e+03 2.2218e-08 0.0000e+00 1.0000e+00 5.6252e+03 5.6252e+03 2.8732e+02 2.8732e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.7479e+03 2.0947e-08 0.0000e+00 1.0000e+00 5.7479e+03 5.7479e+03 2.9359e+02 2.9359e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.8661e+03 1.9787e-08 0.0000e+00 1.0000e+00 5.8661e+03 5.8661e+03 2.9962e+02 2.9962e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.9801e+03 1.8725e-08 0.0000e+00 1.0000e+00 5.9801e+03 5.9801e+03 3.0545e+02 3.0545e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 6.0901e+03 1.7751e-08 0.0000e+00 1.0000e+00 6.0901e+03 6.0901e+03 3.1107e+02 3.1107e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 6.1964e+03 1.6856e-08 0.0000e+00 1.0000e+00 6.1964e+03 6.1964e+03 3.1649e+02 3.1649e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 6.2991e+03 1.6030e-08 0.0000e+00 1.0000e+00 6.2991e+03 6.2991e+03 3.2174e+02 3.2174e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 6.3984e+03 1.5268e-08 0.0000e+00 1.0000e+00 6.3984e+03 6.3984e+03 3.2681e+02 3.2681e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt new file mode 100644 index 00000000000..9094419bc8a --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt @@ -0,0 +1,1012 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.8078e+03 1.3932e-08 1.0000e+00 0.0000e+00 6.8078e+03 6.8078e+03 3.4772e+02 3.4772e+02 4.5175e-05 4.5175e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-03 3.4900e+07 5.5315e+02 6.7983e+03 1.4001e-08 1.0000e+00 0.0000e+00 6.7983e+03 6.7983e+03 3.4724e+02 3.4724e+02 4.5093e-05 4.5093e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-03 3.4800e+07 5.5315e+02 6.7887e+03 1.4069e-08 1.0000e+00 0.0000e+00 6.7887e+03 6.7887e+03 3.4675e+02 3.4675e+02 4.5010e-05 4.5010e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-03 3.4700e+07 5.5315e+02 6.7792e+03 1.4138e-08 1.0000e+00 0.0000e+00 6.7792e+03 6.7792e+03 3.4626e+02 3.4626e+02 4.4928e-05 4.4928e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-03 3.4600e+07 5.5315e+02 6.7696e+03 1.4208e-08 1.0000e+00 0.0000e+00 6.7696e+03 6.7696e+03 3.4577e+02 3.4577e+02 4.4845e-05 4.4845e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-02 3.4500e+07 5.5315e+02 6.7599e+03 1.4278e-08 1.0000e+00 0.0000e+00 6.7599e+03 6.7599e+03 3.4528e+02 3.4528e+02 4.4762e-05 4.4762e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-02 3.4400e+07 5.5315e+02 6.7503e+03 1.4349e-08 1.0000e+00 0.0000e+00 6.7503e+03 6.7503e+03 3.4479e+02 3.4479e+02 4.4679e-05 4.4679e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-02 3.4300e+07 5.5315e+02 6.7406e+03 1.4421e-08 1.0000e+00 0.0000e+00 6.7406e+03 6.7406e+03 3.4429e+02 3.4429e+02 4.4596e-05 4.4596e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-02 3.4200e+07 5.5315e+02 6.7308e+03 1.4493e-08 1.0000e+00 0.0000e+00 6.7308e+03 6.7308e+03 3.4379e+02 3.4379e+02 4.4513e-05 4.4513e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.8000e-02 3.4100e+07 5.5315e+02 6.7211e+03 1.4566e-08 1.0000e+00 0.0000e+00 6.7211e+03 6.7211e+03 3.4329e+02 3.4329e+02 4.4430e-05 4.4430e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.7113e+03 1.4639e-08 1.0000e+00 0.0000e+00 6.7113e+03 6.7113e+03 3.4279e+02 3.4279e+02 4.4346e-05 4.4346e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.2000e-02 3.3900e+07 5.5315e+02 6.7014e+03 1.4713e-08 1.0000e+00 0.0000e+00 6.7014e+03 6.7014e+03 3.4229e+02 3.4229e+02 4.4263e-05 4.4263e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.4000e-02 3.3800e+07 5.5315e+02 6.6915e+03 1.4787e-08 1.0000e+00 0.0000e+00 6.6915e+03 6.6915e+03 3.4179e+02 3.4179e+02 4.4179e-05 4.4179e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.6000e-02 3.3700e+07 5.5315e+02 6.6816e+03 1.4862e-08 1.0000e+00 0.0000e+00 6.6816e+03 6.6816e+03 3.4128e+02 3.4128e+02 4.4095e-05 4.4095e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.8000e-02 3.3600e+07 5.5315e+02 6.6717e+03 1.4938e-08 1.0000e+00 0.0000e+00 6.6717e+03 6.6717e+03 3.4077e+02 3.4077e+02 4.4012e-05 4.4012e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.0000e-02 3.3500e+07 5.5315e+02 6.6617e+03 1.5014e-08 1.0000e+00 0.0000e+00 6.6617e+03 6.6617e+03 3.4026e+02 3.4026e+02 4.3928e-05 4.3928e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.2000e-02 3.3400e+07 5.5315e+02 6.6517e+03 1.5091e-08 1.0000e+00 0.0000e+00 6.6517e+03 6.6517e+03 3.3975e+02 3.3975e+02 4.3843e-05 4.3843e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.4000e-02 3.3300e+07 5.5315e+02 6.6416e+03 1.5169e-08 1.0000e+00 0.0000e+00 6.6416e+03 6.6416e+03 3.3924e+02 3.3924e+02 4.3759e-05 4.3759e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.6000e-02 3.3200e+07 5.5315e+02 6.6315e+03 1.5247e-08 1.0000e+00 0.0000e+00 6.6315e+03 6.6315e+03 3.3872e+02 3.3872e+02 4.3675e-05 4.3675e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.8000e-02 3.3100e+07 5.5315e+02 6.6214e+03 1.5326e-08 1.0000e+00 0.0000e+00 6.6214e+03 6.6214e+03 3.3820e+02 3.3820e+02 4.3590e-05 4.3590e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.6112e+03 1.5406e-08 1.0000e+00 0.0000e+00 6.6112e+03 6.6112e+03 3.3768e+02 3.3768e+02 4.3505e-05 4.3505e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.2000e-02 3.2900e+07 5.5315e+02 6.6010e+03 1.5486e-08 1.0000e+00 0.0000e+00 6.6010e+03 6.6010e+03 3.3716e+02 3.3716e+02 4.3420e-05 4.3420e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.4000e-02 3.2800e+07 5.5315e+02 6.5908e+03 1.5567e-08 1.0000e+00 0.0000e+00 6.5908e+03 6.5908e+03 3.3664e+02 3.3664e+02 4.3336e-05 4.3336e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.6000e-02 3.2700e+07 5.5315e+02 6.5805e+03 1.5648e-08 1.0000e+00 0.0000e+00 6.5805e+03 6.5805e+03 3.3611e+02 3.3611e+02 4.3250e-05 4.3250e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.8000e-02 3.2600e+07 5.5315e+02 6.5702e+03 1.5731e-08 1.0000e+00 0.0000e+00 6.5702e+03 6.5702e+03 3.3559e+02 3.3559e+02 4.3165e-05 4.3165e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.0000e-02 3.2500e+07 5.5315e+02 6.5598e+03 1.5814e-08 1.0000e+00 0.0000e+00 6.5598e+03 6.5598e+03 3.3506e+02 3.3506e+02 4.3080e-05 4.3080e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.2000e-02 3.2400e+07 5.5315e+02 6.5494e+03 1.5898e-08 1.0000e+00 0.0000e+00 6.5494e+03 6.5494e+03 3.3453e+02 3.3453e+02 4.2994e-05 4.2994e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.4000e-02 3.2300e+07 5.5315e+02 6.5390e+03 1.5982e-08 1.0000e+00 0.0000e+00 6.5390e+03 6.5390e+03 3.3400e+02 3.3400e+02 4.2909e-05 4.2909e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.6000e-02 3.2200e+07 5.5315e+02 6.5285e+03 1.6067e-08 1.0000e+00 0.0000e+00 6.5285e+03 6.5285e+03 3.3346e+02 3.3346e+02 4.2823e-05 4.2823e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.8000e-02 3.2100e+07 5.5315e+02 6.5180e+03 1.6153e-08 1.0000e+00 0.0000e+00 6.5180e+03 6.5180e+03 3.3292e+02 3.3292e+02 4.2737e-05 4.2737e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.5075e+03 1.6240e-08 1.0000e+00 0.0000e+00 6.5075e+03 6.5075e+03 3.3238e+02 3.3238e+02 4.2651e-05 4.2651e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.2000e-02 3.1900e+07 5.5315e+02 6.4969e+03 1.6327e-08 1.0000e+00 0.0000e+00 6.4969e+03 6.4969e+03 3.3184e+02 3.3184e+02 4.2564e-05 4.2564e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.4000e-02 3.1800e+07 5.5315e+02 6.4863e+03 1.6416e-08 1.0000e+00 0.0000e+00 6.4863e+03 6.4863e+03 3.3130e+02 3.3130e+02 4.2478e-05 4.2478e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.6000e-02 3.1700e+07 5.5315e+02 6.4756e+03 1.6505e-08 1.0000e+00 0.0000e+00 6.4756e+03 6.4756e+03 3.3076e+02 3.3076e+02 4.2391e-05 4.2391e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.8000e-02 3.1600e+07 5.5315e+02 6.4649e+03 1.6595e-08 1.0000e+00 0.0000e+00 6.4649e+03 6.4649e+03 3.3021e+02 3.3021e+02 4.2305e-05 4.2305e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.0000e-02 3.1500e+07 5.5315e+02 6.4541e+03 1.6685e-08 1.0000e+00 0.0000e+00 6.4541e+03 6.4541e+03 3.2966e+02 3.2966e+02 4.2218e-05 4.2218e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.2000e-02 3.1400e+07 5.5315e+02 6.4434e+03 1.6777e-08 1.0000e+00 0.0000e+00 6.4434e+03 6.4434e+03 3.2911e+02 3.2911e+02 4.2131e-05 4.2131e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.4000e-02 3.1300e+07 5.5315e+02 6.4325e+03 1.6869e-08 0.0000e+00 1.0000e+00 6.4325e+03 6.4325e+03 3.2856e+02 3.2856e+02 4.2044e-05 4.2044e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +7.6000e-02 3.1200e+07 5.5315e+02 6.4216e+03 1.6962e-08 0.0000e+00 1.0000e+00 6.4216e+03 6.4216e+03 3.2800e+02 3.2800e+02 4.1956e-05 4.1956e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +7.8000e-02 3.1100e+07 5.5315e+02 6.4107e+03 1.7056e-08 0.0000e+00 1.0000e+00 6.4107e+03 6.4107e+03 3.2744e+02 3.2744e+02 4.1869e-05 4.1869e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.0000e-02 3.1000e+07 5.5315e+02 6.3998e+03 1.7151e-08 0.0000e+00 1.0000e+00 6.3998e+03 6.3998e+03 3.2688e+02 3.2688e+02 4.1781e-05 4.1781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.2000e-02 3.0900e+07 5.5315e+02 6.3888e+03 1.7246e-08 0.0000e+00 1.0000e+00 6.3888e+03 6.3888e+03 3.2632e+02 3.2632e+02 4.1693e-05 4.1693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.4000e-02 3.0800e+07 5.5315e+02 6.3777e+03 1.7343e-08 0.0000e+00 1.0000e+00 6.3777e+03 6.3777e+03 3.2576e+02 3.2576e+02 4.1605e-05 4.1605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.6000e-02 3.0700e+07 5.5315e+02 6.3667e+03 1.7440e-08 0.0000e+00 1.0000e+00 6.3667e+03 6.3667e+03 3.2519e+02 3.2519e+02 4.1517e-05 4.1517e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-02 3.0600e+07 5.5315e+02 6.3555e+03 1.7538e-08 0.0000e+00 1.0000e+00 6.3555e+03 6.3555e+03 3.2462e+02 3.2462e+02 4.1429e-05 4.1429e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-02 3.0500e+07 5.5315e+02 6.3444e+03 1.7637e-08 0.0000e+00 1.0000e+00 6.3444e+03 6.3444e+03 3.2405e+02 3.2405e+02 4.1341e-05 4.1341e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-02 3.0400e+07 5.5315e+02 6.3332e+03 1.7737e-08 0.0000e+00 1.0000e+00 6.3332e+03 6.3332e+03 3.2348e+02 3.2348e+02 4.1252e-05 4.1252e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-02 3.0300e+07 5.5315e+02 6.3219e+03 1.7838e-08 0.0000e+00 1.0000e+00 6.3219e+03 6.3219e+03 3.2291e+02 3.2291e+02 4.1163e-05 4.1163e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-02 3.0200e+07 5.5315e+02 6.3106e+03 1.7940e-08 0.0000e+00 1.0000e+00 6.3106e+03 6.3106e+03 3.2233e+02 3.2233e+02 4.1074e-05 4.1074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-02 3.0100e+07 5.5315e+02 6.2993e+03 1.8043e-08 0.0000e+00 1.0000e+00 6.2993e+03 6.2993e+03 3.2175e+02 3.2175e+02 4.0985e-05 4.0985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e-01 3.0000e+07 5.5315e+02 6.2879e+03 1.8147e-08 0.0000e+00 1.0000e+00 6.2879e+03 6.2879e+03 3.2117e+02 3.2117e+02 4.0896e-05 4.0896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e-01 2.9900e+07 5.5315e+02 6.2764e+03 1.8252e-08 0.0000e+00 1.0000e+00 6.2764e+03 6.2764e+03 3.2058e+02 3.2058e+02 4.0806e-05 4.0806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e-01 2.9800e+07 5.5315e+02 6.2650e+03 1.8357e-08 0.0000e+00 1.0000e+00 6.2650e+03 6.2650e+03 3.2000e+02 3.2000e+02 4.0717e-05 4.0717e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e-01 2.9700e+07 5.5315e+02 6.2534e+03 1.8464e-08 0.0000e+00 1.0000e+00 6.2534e+03 6.2534e+03 3.1941e+02 3.1941e+02 4.0627e-05 4.0627e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e-01 2.9600e+07 5.5315e+02 6.2419e+03 1.8572e-08 0.0000e+00 1.0000e+00 6.2419e+03 6.2419e+03 3.1882e+02 3.1882e+02 4.0537e-05 4.0537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e-01 2.9500e+07 5.5315e+02 6.2303e+03 1.8681e-08 0.0000e+00 1.0000e+00 6.2303e+03 6.2303e+03 3.1822e+02 3.1822e+02 4.0447e-05 4.0447e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e-01 2.9400e+07 5.5315e+02 6.2186e+03 1.8790e-08 0.0000e+00 1.0000e+00 6.2186e+03 6.2186e+03 3.1763e+02 3.1763e+02 4.0356e-05 4.0356e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e-01 2.9300e+07 5.5315e+02 6.2069e+03 1.8901e-08 0.0000e+00 1.0000e+00 6.2069e+03 6.2069e+03 3.1703e+02 3.1703e+02 4.0266e-05 4.0266e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e-01 2.9200e+07 5.5315e+02 6.1951e+03 1.9013e-08 0.0000e+00 1.0000e+00 6.1951e+03 6.1951e+03 3.1643e+02 3.1643e+02 4.0175e-05 4.0175e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e-01 2.9100e+07 5.5315e+02 6.1833e+03 1.9126e-08 0.0000e+00 1.0000e+00 6.1833e+03 6.1833e+03 3.1583e+02 3.1583e+02 4.0084e-05 4.0084e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e-01 2.9000e+07 5.5315e+02 6.1715e+03 1.9240e-08 0.0000e+00 1.0000e+00 6.1715e+03 6.1715e+03 3.1522e+02 3.1522e+02 3.9993e-05 3.9993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e-01 2.8900e+07 5.5315e+02 6.1596e+03 1.9355e-08 0.0000e+00 1.0000e+00 6.1596e+03 6.1596e+03 3.1461e+02 3.1461e+02 3.9902e-05 3.9902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e-01 2.8800e+07 5.5315e+02 6.1476e+03 1.9472e-08 0.0000e+00 1.0000e+00 6.1476e+03 6.1476e+03 3.1400e+02 3.1400e+02 3.9811e-05 3.9811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e-01 2.8700e+07 5.5315e+02 6.1356e+03 1.9589e-08 0.0000e+00 1.0000e+00 6.1356e+03 6.1356e+03 3.1339e+02 3.1339e+02 3.9719e-05 3.9719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e-01 2.8600e+07 5.5315e+02 6.1236e+03 1.9707e-08 0.0000e+00 1.0000e+00 6.1236e+03 6.1236e+03 3.1278e+02 3.1278e+02 3.9627e-05 3.9627e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e-01 2.8500e+07 5.5315e+02 6.1115e+03 1.9827e-08 0.0000e+00 1.0000e+00 6.1115e+03 6.1115e+03 3.1216e+02 3.1216e+02 3.9535e-05 3.9535e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e-01 2.8400e+07 5.5315e+02 6.0994e+03 1.9948e-08 0.0000e+00 1.0000e+00 6.0994e+03 6.0994e+03 3.1154e+02 3.1154e+02 3.9443e-05 3.9443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e-01 2.8300e+07 5.5315e+02 6.0872e+03 2.0070e-08 0.0000e+00 1.0000e+00 6.0872e+03 6.0872e+03 3.1092e+02 3.1092e+02 3.9351e-05 3.9351e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e-01 2.8200e+07 5.5315e+02 6.0749e+03 2.0193e-08 0.0000e+00 1.0000e+00 6.0749e+03 6.0749e+03 3.1029e+02 3.1029e+02 3.9258e-05 3.9258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e-01 2.8100e+07 5.5315e+02 6.0626e+03 2.0318e-08 0.0000e+00 1.0000e+00 6.0626e+03 6.0626e+03 3.0966e+02 3.0966e+02 3.9166e-05 3.9166e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e-01 2.8000e+07 5.5315e+02 6.0503e+03 2.0443e-08 0.0000e+00 1.0000e+00 6.0503e+03 6.0503e+03 3.0903e+02 3.0903e+02 3.9073e-05 3.9073e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e-01 2.7900e+07 5.5315e+02 6.0379e+03 2.0570e-08 0.0000e+00 1.0000e+00 6.0379e+03 6.0379e+03 3.0840e+02 3.0840e+02 3.8979e-05 3.8979e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e-01 2.7800e+07 5.5315e+02 6.0254e+03 2.0699e-08 0.0000e+00 1.0000e+00 6.0254e+03 6.0254e+03 3.0776e+02 3.0776e+02 3.8886e-05 3.8886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e-01 2.7700e+07 5.5315e+02 6.0129e+03 2.0828e-08 0.0000e+00 1.0000e+00 6.0129e+03 6.0129e+03 3.0713e+02 3.0713e+02 3.8793e-05 3.8793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e-01 2.7600e+07 5.5315e+02 6.0004e+03 2.0959e-08 0.0000e+00 1.0000e+00 6.0004e+03 6.0004e+03 3.0648e+02 3.0648e+02 3.8699e-05 3.8699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e-01 2.7500e+07 5.5315e+02 5.9878e+03 2.1091e-08 0.0000e+00 1.0000e+00 5.9878e+03 5.9878e+03 3.0584e+02 3.0584e+02 3.8605e-05 3.8605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e-01 2.7400e+07 5.5315e+02 5.9751e+03 2.1224e-08 0.0000e+00 1.0000e+00 5.9751e+03 5.9751e+03 3.0519e+02 3.0519e+02 3.8511e-05 3.8511e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e-01 2.7300e+07 5.5315e+02 5.9624e+03 2.1359e-08 0.0000e+00 1.0000e+00 5.9624e+03 5.9624e+03 3.0455e+02 3.0455e+02 3.8416e-05 3.8416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e-01 2.7200e+07 5.5315e+02 5.9497e+03 2.1495e-08 0.0000e+00 1.0000e+00 5.9497e+03 5.9497e+03 3.0389e+02 3.0389e+02 3.8322e-05 3.8322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e-01 2.7100e+07 5.5315e+02 5.9369e+03 2.1633e-08 0.0000e+00 1.0000e+00 5.9369e+03 5.9369e+03 3.0324e+02 3.0324e+02 3.8227e-05 3.8227e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.9240e+03 2.1772e-08 0.0000e+00 1.0000e+00 5.9240e+03 5.9240e+03 3.0258e+02 3.0258e+02 3.8132e-05 3.8132e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e-01 2.6900e+07 5.5315e+02 5.9111e+03 2.1912e-08 0.0000e+00 1.0000e+00 5.9111e+03 5.9111e+03 3.0192e+02 3.0192e+02 3.8037e-05 3.8037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e-01 2.6800e+07 5.5315e+02 5.8981e+03 2.2054e-08 0.0000e+00 1.0000e+00 5.8981e+03 5.8981e+03 3.0126e+02 3.0126e+02 3.7942e-05 3.7942e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e-01 2.6700e+07 5.5315e+02 5.8850e+03 2.2198e-08 0.0000e+00 1.0000e+00 5.8850e+03 5.8850e+03 3.0059e+02 3.0059e+02 3.7846e-05 3.7846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e-01 2.6600e+07 5.5315e+02 5.8720e+03 2.2342e-08 0.0000e+00 1.0000e+00 5.8720e+03 5.8720e+03 2.9992e+02 2.9992e+02 3.7750e-05 3.7750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e-01 2.6500e+07 5.5315e+02 5.8588e+03 2.2489e-08 0.0000e+00 1.0000e+00 5.8588e+03 5.8588e+03 2.9925e+02 2.9925e+02 3.7654e-05 3.7654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e-01 2.6400e+07 5.5315e+02 5.8456e+03 2.2637e-08 0.0000e+00 1.0000e+00 5.8456e+03 5.8456e+03 2.9858e+02 2.9858e+02 3.7558e-05 3.7558e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e-01 2.6300e+07 5.5315e+02 5.8323e+03 2.2786e-08 0.0000e+00 1.0000e+00 5.8323e+03 5.8323e+03 2.9790e+02 2.9790e+02 3.7462e-05 3.7462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e-01 2.6200e+07 5.5315e+02 5.8190e+03 2.2937e-08 0.0000e+00 1.0000e+00 5.8190e+03 5.8190e+03 2.9722e+02 2.9722e+02 3.7365e-05 3.7365e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e-01 2.6100e+07 5.5315e+02 5.8056e+03 2.3090e-08 0.0000e+00 1.0000e+00 5.8056e+03 5.8056e+03 2.9654e+02 2.9654e+02 3.7268e-05 3.7268e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.7922e+03 2.3244e-08 0.0000e+00 1.0000e+00 5.7922e+03 5.7922e+03 2.9585e+02 2.9585e+02 3.7171e-05 3.7171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e-01 2.5900e+07 5.5315e+02 5.7787e+03 2.3400e-08 0.0000e+00 1.0000e+00 5.7787e+03 5.7787e+03 2.9516e+02 2.9516e+02 3.7074e-05 3.7074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e-01 2.5800e+07 5.5315e+02 5.7652e+03 2.3557e-08 0.0000e+00 1.0000e+00 5.7652e+03 5.7652e+03 2.9447e+02 2.9447e+02 3.6976e-05 3.6976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e-01 2.5700e+07 5.5315e+02 5.7516e+03 2.3716e-08 0.0000e+00 1.0000e+00 5.7516e+03 5.7516e+03 2.9377e+02 2.9377e+02 3.6879e-05 3.6879e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e-01 2.5600e+07 5.5315e+02 5.7379e+03 2.3877e-08 0.0000e+00 1.0000e+00 5.7379e+03 5.7379e+03 2.9308e+02 2.9308e+02 3.6781e-05 3.6781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e-01 2.5500e+07 5.5315e+02 5.7242e+03 2.4040e-08 0.0000e+00 1.0000e+00 5.7242e+03 5.7242e+03 2.9237e+02 2.9237e+02 3.6682e-05 3.6682e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e-01 2.5400e+07 5.5315e+02 5.7104e+03 2.4204e-08 0.0000e+00 1.0000e+00 5.7104e+03 5.7104e+03 2.9167e+02 2.9167e+02 3.6584e-05 3.6584e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e-01 2.5300e+07 5.5315e+02 5.6965e+03 2.4370e-08 0.0000e+00 1.0000e+00 5.6965e+03 5.6965e+03 2.9096e+02 2.9096e+02 3.6485e-05 3.6485e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e-01 2.5200e+07 5.5315e+02 5.6826e+03 2.4538e-08 0.0000e+00 1.0000e+00 5.6826e+03 5.6826e+03 2.9025e+02 2.9025e+02 3.6387e-05 3.6387e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e-01 2.5100e+07 5.5315e+02 5.6686e+03 2.4708e-08 0.0000e+00 1.0000e+00 5.6686e+03 5.6686e+03 2.8954e+02 2.8954e+02 3.6287e-05 3.6287e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.6546e+03 2.4879e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 3.6188e-05 3.6188e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0200e-01 2.4900e+07 5.5315e+02 5.6405e+03 2.5053e-08 0.0000e+00 1.0000e+00 5.6405e+03 5.6405e+03 2.8810e+02 2.8810e+02 3.6089e-05 3.6089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0400e-01 2.4800e+07 5.5315e+02 5.6263e+03 2.5228e-08 0.0000e+00 1.0000e+00 5.6263e+03 5.6263e+03 2.8738e+02 2.8738e+02 3.5989e-05 3.5989e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0600e-01 2.4700e+07 5.5315e+02 5.6121e+03 2.5406e-08 0.0000e+00 1.0000e+00 5.6121e+03 5.6121e+03 2.8665e+02 2.8665e+02 3.5889e-05 3.5889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0800e-01 2.4600e+07 5.5315e+02 5.5978e+03 2.5585e-08 0.0000e+00 1.0000e+00 5.5978e+03 5.5978e+03 2.8592e+02 2.8592e+02 3.5789e-05 3.5789e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1000e-01 2.4500e+07 5.5315e+02 5.5835e+03 2.5766e-08 0.0000e+00 1.0000e+00 5.5835e+03 5.5835e+03 2.8519e+02 2.8519e+02 3.5688e-05 3.5688e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1200e-01 2.4400e+07 5.5315e+02 5.5690e+03 2.5950e-08 0.0000e+00 1.0000e+00 5.5690e+03 5.5690e+03 2.8445e+02 2.8445e+02 3.5587e-05 3.5587e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1400e-01 2.4300e+07 5.5315e+02 5.5545e+03 2.6135e-08 0.0000e+00 1.0000e+00 5.5545e+03 5.5545e+03 2.8371e+02 2.8371e+02 3.5487e-05 3.5487e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1600e-01 2.4200e+07 5.5315e+02 5.5400e+03 2.6323e-08 0.0000e+00 1.0000e+00 5.5400e+03 5.5400e+03 2.8297e+02 2.8297e+02 3.5385e-05 3.5385e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1800e-01 2.4100e+07 5.5315e+02 5.5254e+03 2.6512e-08 0.0000e+00 1.0000e+00 5.5254e+03 5.5254e+03 2.8222e+02 2.8222e+02 3.5284e-05 3.5284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.5107e+03 2.6704e-08 0.0000e+00 1.0000e+00 5.5107e+03 5.5107e+03 2.8147e+02 2.8147e+02 3.5182e-05 3.5182e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2200e-01 2.3900e+07 5.5315e+02 5.4960e+03 2.6898e-08 0.0000e+00 1.0000e+00 5.4960e+03 5.4960e+03 2.8072e+02 2.8072e+02 3.5080e-05 3.5080e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2400e-01 2.3800e+07 5.5315e+02 5.4811e+03 2.7094e-08 0.0000e+00 1.0000e+00 5.4811e+03 5.4811e+03 2.7996e+02 2.7996e+02 3.4978e-05 3.4978e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2600e-01 2.3700e+07 5.5315e+02 5.4663e+03 2.7292e-08 0.0000e+00 1.0000e+00 5.4663e+03 5.4663e+03 2.7920e+02 2.7920e+02 3.4876e-05 3.4876e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2800e-01 2.3600e+07 5.5315e+02 5.4513e+03 2.7493e-08 0.0000e+00 1.0000e+00 5.4513e+03 5.4513e+03 2.7844e+02 2.7844e+02 3.4773e-05 3.4773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3000e-01 2.3500e+07 5.5315e+02 5.4363e+03 2.7696e-08 0.0000e+00 1.0000e+00 5.4363e+03 5.4363e+03 2.7767e+02 2.7767e+02 3.4671e-05 3.4671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3200e-01 2.3400e+07 5.5315e+02 5.4212e+03 2.7901e-08 0.0000e+00 1.0000e+00 5.4212e+03 5.4212e+03 2.7690e+02 2.7690e+02 3.4568e-05 3.4568e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3400e-01 2.3300e+07 5.5315e+02 5.4060e+03 2.8109e-08 0.0000e+00 1.0000e+00 5.4060e+03 5.4060e+03 2.7613e+02 2.7613e+02 3.4464e-05 3.4464e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3600e-01 2.3200e+07 5.5315e+02 5.3908e+03 2.8319e-08 0.0000e+00 1.0000e+00 5.3908e+03 5.3908e+03 2.7535e+02 2.7535e+02 3.4361e-05 3.4361e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3800e-01 2.3100e+07 5.5315e+02 5.3755e+03 2.8532e-08 0.0000e+00 1.0000e+00 5.3755e+03 5.3755e+03 2.7457e+02 2.7457e+02 3.4257e-05 3.4257e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.3601e+03 2.8747e-08 0.0000e+00 1.0000e+00 5.3601e+03 5.3601e+03 2.7378e+02 2.7378e+02 3.4153e-05 3.4153e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4200e-01 2.2900e+07 5.5315e+02 5.3447e+03 2.8964e-08 0.0000e+00 1.0000e+00 5.3447e+03 5.3447e+03 2.7299e+02 2.7299e+02 3.4049e-05 3.4049e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4400e-01 2.2800e+07 5.5315e+02 5.3292e+03 2.9184e-08 0.0000e+00 1.0000e+00 5.3292e+03 5.3292e+03 2.7220e+02 2.7220e+02 3.3944e-05 3.3944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4600e-01 2.2700e+07 5.5315e+02 5.3136e+03 2.9407e-08 0.0000e+00 1.0000e+00 5.3136e+03 5.3136e+03 2.7140e+02 2.7140e+02 3.3839e-05 3.3839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4800e-01 2.2600e+07 5.5315e+02 5.2979e+03 2.9632e-08 0.0000e+00 1.0000e+00 5.2979e+03 5.2979e+03 2.7060e+02 2.7060e+02 3.3734e-05 3.3734e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5000e-01 2.2500e+07 5.5315e+02 5.2822e+03 2.9860e-08 0.0000e+00 1.0000e+00 5.2822e+03 5.2822e+03 2.6980e+02 2.6980e+02 3.3629e-05 3.3629e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5200e-01 2.2400e+07 5.5315e+02 5.2664e+03 3.0091e-08 0.0000e+00 1.0000e+00 5.2664e+03 5.2664e+03 2.6899e+02 2.6899e+02 3.3524e-05 3.3524e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5400e-01 2.2300e+07 5.5315e+02 5.2505e+03 3.0324e-08 0.0000e+00 1.0000e+00 5.2505e+03 5.2505e+03 2.6818e+02 2.6818e+02 3.3418e-05 3.3418e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5600e-01 2.2200e+07 5.5315e+02 5.2345e+03 3.0561e-08 0.0000e+00 1.0000e+00 5.2345e+03 5.2345e+03 2.6737e+02 2.6737e+02 3.3312e-05 3.3312e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5800e-01 2.2100e+07 5.5315e+02 5.2185e+03 3.0800e-08 0.0000e+00 1.0000e+00 5.2185e+03 5.2185e+03 2.6655e+02 2.6655e+02 3.3206e-05 3.3206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 5.2024e+03 3.1042e-08 0.0000e+00 1.0000e+00 5.2024e+03 5.2024e+03 2.6572e+02 2.6572e+02 3.3099e-05 3.3099e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6200e-01 2.1900e+07 5.5315e+02 5.1862e+03 3.1286e-08 0.0000e+00 1.0000e+00 5.1862e+03 5.1862e+03 2.6490e+02 2.6490e+02 3.2993e-05 3.2993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6400e-01 2.1800e+07 5.5315e+02 5.1699e+03 3.1534e-08 0.0000e+00 1.0000e+00 5.1699e+03 5.1699e+03 2.6407e+02 2.6407e+02 3.2886e-05 3.2886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6600e-01 2.1700e+07 5.5315e+02 5.1536e+03 3.1785e-08 0.0000e+00 1.0000e+00 5.1536e+03 5.1536e+03 2.6323e+02 2.6323e+02 3.2779e-05 3.2779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6800e-01 2.1600e+07 5.5315e+02 5.1372e+03 3.2039e-08 0.0000e+00 1.0000e+00 5.1372e+03 5.1372e+03 2.6239e+02 2.6239e+02 3.2671e-05 3.2671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7000e-01 2.1500e+07 5.5315e+02 5.1207e+03 3.2296e-08 0.0000e+00 1.0000e+00 5.1207e+03 5.1207e+03 2.6155e+02 2.6155e+02 3.2564e-05 3.2564e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7200e-01 2.1400e+07 5.5315e+02 5.1041e+03 3.2556e-08 0.0000e+00 1.0000e+00 5.1041e+03 5.1041e+03 2.6070e+02 2.6070e+02 3.2456e-05 3.2456e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7400e-01 2.1300e+07 5.5315e+02 5.0874e+03 3.2820e-08 0.0000e+00 1.0000e+00 5.0874e+03 5.0874e+03 2.5985e+02 2.5985e+02 3.2348e-05 3.2348e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7600e-01 2.1200e+07 5.5315e+02 5.0707e+03 3.3087e-08 0.0000e+00 1.0000e+00 5.0707e+03 5.0707e+03 2.5900e+02 2.5900e+02 3.2239e-05 3.2239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7800e-01 2.1100e+07 5.5315e+02 5.0539e+03 3.3357e-08 0.0000e+00 1.0000e+00 5.0539e+03 5.0539e+03 2.5814e+02 2.5814e+02 3.2131e-05 3.2131e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 5.0370e+03 3.3630e-08 0.0000e+00 1.0000e+00 5.0370e+03 5.0370e+03 2.5728e+02 2.5728e+02 3.2022e-05 3.2022e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8200e-01 2.0900e+07 5.5315e+02 5.0200e+03 3.3907e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 3.1913e-05 3.1913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8400e-01 2.0800e+07 5.5315e+02 5.0029e+03 3.4187e-08 0.0000e+00 1.0000e+00 5.0029e+03 5.0029e+03 2.5554e+02 2.5554e+02 3.1803e-05 3.1803e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8600e-01 2.0700e+07 5.5315e+02 4.9858e+03 3.4471e-08 0.0000e+00 1.0000e+00 4.9858e+03 4.9858e+03 2.5466e+02 2.5466e+02 3.1694e-05 3.1694e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8800e-01 2.0600e+07 5.5315e+02 4.9686e+03 3.4758e-08 0.0000e+00 1.0000e+00 4.9686e+03 4.9686e+03 2.5378e+02 2.5378e+02 3.1584e-05 3.1584e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9000e-01 2.0500e+07 5.5315e+02 4.9512e+03 3.5049e-08 0.0000e+00 1.0000e+00 4.9512e+03 4.9512e+03 2.5290e+02 2.5290e+02 3.1474e-05 3.1474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9200e-01 2.0400e+07 5.5315e+02 4.9339e+03 3.5344e-08 0.0000e+00 1.0000e+00 4.9339e+03 4.9339e+03 2.5201e+02 2.5201e+02 3.1364e-05 3.1364e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9400e-01 2.0300e+07 5.5315e+02 4.9164e+03 3.5642e-08 0.0000e+00 1.0000e+00 4.9164e+03 4.9164e+03 2.5112e+02 2.5112e+02 3.1253e-05 3.1253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9600e-01 2.0200e+07 5.5315e+02 4.8988e+03 3.5944e-08 0.0000e+00 1.0000e+00 4.8988e+03 4.8988e+03 2.5022e+02 2.5022e+02 3.1143e-05 3.1143e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9800e-01 2.0100e+07 5.5315e+02 4.8812e+03 3.6250e-08 0.0000e+00 1.0000e+00 4.8812e+03 4.8812e+03 2.4932e+02 2.4932e+02 3.1032e-05 3.1032e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.8634e+03 3.6560e-08 0.0000e+00 1.0000e+00 4.8634e+03 4.8634e+03 2.4841e+02 2.4841e+02 3.0921e-05 3.0921e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0200e-01 1.9900e+07 5.5315e+02 4.8456e+03 3.6874e-08 0.0000e+00 1.0000e+00 4.8456e+03 4.8456e+03 2.4750e+02 2.4750e+02 3.0809e-05 3.0809e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0400e-01 1.9800e+07 5.5315e+02 4.8277e+03 3.7192e-08 0.0000e+00 1.0000e+00 4.8277e+03 4.8277e+03 2.4659e+02 2.4659e+02 3.0698e-05 3.0698e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0600e-01 1.9700e+07 5.5315e+02 4.8097e+03 3.7514e-08 0.0000e+00 1.0000e+00 4.8097e+03 4.8097e+03 2.4567e+02 2.4567e+02 3.0586e-05 3.0586e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0800e-01 1.9600e+07 5.5315e+02 4.7916e+03 3.7840e-08 0.0000e+00 1.0000e+00 4.7916e+03 4.7916e+03 2.4474e+02 2.4474e+02 3.0474e-05 3.0474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1000e-01 1.9500e+07 5.5315e+02 4.7734e+03 3.8171e-08 0.0000e+00 1.0000e+00 4.7734e+03 4.7734e+03 2.4381e+02 2.4381e+02 3.0362e-05 3.0362e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1200e-01 1.9400e+07 5.5315e+02 4.7552e+03 3.8506e-08 0.0000e+00 1.0000e+00 4.7552e+03 4.7552e+03 2.4288e+02 2.4288e+02 3.0249e-05 3.0249e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1400e-01 1.9300e+07 5.5315e+02 4.7368e+03 3.8845e-08 0.0000e+00 1.0000e+00 4.7368e+03 4.7368e+03 2.4194e+02 2.4194e+02 3.0137e-05 3.0137e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1600e-01 1.9200e+07 5.5315e+02 4.7184e+03 3.9189e-08 0.0000e+00 1.0000e+00 4.7184e+03 4.7184e+03 2.4100e+02 2.4100e+02 3.0024e-05 3.0024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1800e-01 1.9100e+07 5.5315e+02 4.6998e+03 3.9537e-08 0.0000e+00 1.0000e+00 4.6998e+03 4.6998e+03 2.4005e+02 2.4005e+02 2.9911e-05 2.9911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.6812e+03 3.9890e-08 0.0000e+00 1.0000e+00 4.6812e+03 4.6812e+03 2.3910e+02 2.3910e+02 2.9797e-05 2.9797e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2200e-01 1.8900e+07 5.5315e+02 4.6625e+03 4.0247e-08 0.0000e+00 1.0000e+00 4.6625e+03 4.6625e+03 2.3815e+02 2.3815e+02 2.9684e-05 2.9684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2400e-01 1.8800e+07 5.5315e+02 4.6437e+03 4.0609e-08 0.0000e+00 1.0000e+00 4.6437e+03 4.6437e+03 2.3719e+02 2.3719e+02 2.9570e-05 2.9570e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2600e-01 1.8700e+07 5.5315e+02 4.6248e+03 4.0976e-08 0.0000e+00 1.0000e+00 4.6248e+03 4.6248e+03 2.3622e+02 2.3622e+02 2.9456e-05 2.9456e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2800e-01 1.8600e+07 5.5315e+02 4.6058e+03 4.1348e-08 0.0000e+00 1.0000e+00 4.6058e+03 4.6058e+03 2.3525e+02 2.3525e+02 2.9342e-05 2.9342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3000e-01 1.8500e+07 5.5315e+02 4.5867e+03 4.1725e-08 0.0000e+00 1.0000e+00 4.5867e+03 4.5867e+03 2.3427e+02 2.3427e+02 2.9228e-05 2.9228e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3200e-01 1.8400e+07 5.5315e+02 4.5675e+03 4.2107e-08 0.0000e+00 1.0000e+00 4.5675e+03 4.5675e+03 2.3329e+02 2.3329e+02 2.9114e-05 2.9114e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3400e-01 1.8300e+07 5.5315e+02 4.5482e+03 4.2494e-08 0.0000e+00 1.0000e+00 4.5482e+03 4.5482e+03 2.3231e+02 2.3231e+02 2.8999e-05 2.8999e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3600e-01 1.8200e+07 5.5315e+02 4.5288e+03 4.2886e-08 0.0000e+00 1.0000e+00 4.5288e+03 4.5288e+03 2.3132e+02 2.3132e+02 2.8885e-05 2.8885e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3800e-01 1.8100e+07 5.5315e+02 4.5094e+03 4.3283e-08 0.0000e+00 1.0000e+00 4.5094e+03 4.5094e+03 2.3033e+02 2.3033e+02 2.8770e-05 2.8770e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.4898e+03 4.3686e-08 0.0000e+00 1.0000e+00 4.4898e+03 4.4898e+03 2.2933e+02 2.2933e+02 2.8654e-05 2.8654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4200e-01 1.7900e+07 5.5315e+02 4.4701e+03 4.4094e-08 0.0000e+00 1.0000e+00 4.4701e+03 4.4701e+03 2.2832e+02 2.2832e+02 2.8539e-05 2.8539e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4400e-01 1.7800e+07 5.5315e+02 4.4504e+03 4.4508e-08 0.0000e+00 1.0000e+00 4.4504e+03 4.4504e+03 2.2731e+02 2.2731e+02 2.8424e-05 2.8424e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4600e-01 1.7700e+07 5.5315e+02 4.4305e+03 4.4928e-08 0.0000e+00 1.0000e+00 4.4305e+03 4.4305e+03 2.2630e+02 2.2630e+02 2.8308e-05 2.8308e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4800e-01 1.7600e+07 5.5315e+02 4.4106e+03 4.5353e-08 0.0000e+00 1.0000e+00 4.4106e+03 4.4106e+03 2.2528e+02 2.2528e+02 2.8193e-05 2.8193e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5000e-01 1.7500e+07 5.5315e+02 4.3905e+03 4.5784e-08 0.0000e+00 1.0000e+00 4.3905e+03 4.3905e+03 2.2426e+02 2.2426e+02 2.8077e-05 2.8077e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5200e-01 1.7400e+07 5.5315e+02 4.3704e+03 4.6221e-08 0.0000e+00 1.0000e+00 4.3704e+03 4.3704e+03 2.2323e+02 2.2323e+02 2.7961e-05 2.7961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5400e-01 1.7300e+07 5.5315e+02 4.3501e+03 4.6664e-08 0.0000e+00 1.0000e+00 4.3501e+03 4.3501e+03 2.2219e+02 2.2219e+02 2.7845e-05 2.7845e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5600e-01 1.7200e+07 5.5315e+02 4.3298e+03 4.7113e-08 0.0000e+00 1.0000e+00 4.3298e+03 4.3298e+03 2.2115e+02 2.2115e+02 2.7728e-05 2.7728e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5800e-01 1.7100e+07 5.5315e+02 4.3097e+03 4.5958e-08 1.6940e-02 9.8306e-01 4.7378e+03 4.3030e+03 3.2888e+02 2.1879e+02 4.0756e-05 2.7484e-05 7.7388e-03 2.2673e-03 4.3060e-01 1.0225e-01 8.3990e-02 4.6636e-02 2.2821e-02 1.7645e-02 2.8606e-01 9.0159e-03 3.0092e-03 5.3601e-01 1.1476e-01 8.7949e-02 4.5587e-02 2.0876e-02 1.5068e-02 1.6773e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.2898e+03 4.6261e-08 4.5641e-02 9.5436e-01 4.7351e+03 4.2706e+03 3.3247e+02 2.1533e+02 4.1261e-05 2.7137e-05 7.6825e-03 2.2373e-03 4.2618e-01 1.0167e-01 8.3774e-02 4.6651e-02 2.2890e-02 1.7745e-02 2.9117e-01 9.0452e-03 3.0262e-03 5.3843e-01 1.1504e-01 8.8042e-02 4.5564e-02 2.0832e-02 1.5009e-02 1.6501e-01 +3.6200e-01 1.6900e+07 5.5315e+02 4.2700e+03 4.6569e-08 6.9687e-02 9.3031e-01 4.7316e+03 4.2390e+03 3.3585e+02 2.1206e+02 4.1743e-05 2.6815e-05 7.6282e-03 2.2087e-03 4.2194e-01 1.0112e-01 8.3562e-02 4.6663e-02 2.2955e-02 1.7841e-02 2.9608e-01 9.0724e-03 3.0418e-03 5.4065e-01 1.1531e-01 8.8129e-02 4.5544e-02 2.0792e-02 1.4955e-02 1.6250e-01 +3.6400e-01 1.6800e+07 5.5315e+02 4.2501e+03 4.6881e-08 9.0201e-02 9.0980e-01 4.7276e+03 4.2079e+03 3.3906e+02 2.0897e+02 4.2206e-05 2.6512e-05 7.5755e-03 2.1812e-03 4.1786e-01 1.0058e-01 8.3351e-02 4.6671e-02 2.3016e-02 1.7932e-02 3.0083e-01 9.0978e-03 3.0562e-03 5.4272e-01 1.1556e-01 8.8212e-02 4.5527e-02 2.0755e-02 1.4906e-02 1.6016e-01 +3.6600e-01 1.6700e+07 5.5315e+02 4.2301e+03 4.7199e-08 1.0796e-01 8.9204e-01 4.7231e+03 4.1773e+03 3.4214e+02 2.0601e+02 4.2651e-05 2.6227e-05 7.5242e-03 2.1547e-03 4.1391e-01 1.0005e-01 8.3141e-02 4.6675e-02 2.3074e-02 1.8020e-02 3.0545e-01 9.1216e-03 3.0697e-03 5.4465e-01 1.1580e-01 8.8292e-02 4.5511e-02 2.0721e-02 1.4859e-02 1.5797e-01 +3.6800e-01 1.6600e+07 5.5315e+02 4.2101e+03 4.7521e-08 1.2352e-01 8.7648e-01 4.7181e+03 4.1472e+03 3.4508e+02 2.0319e+02 4.3082e-05 2.5958e-05 7.4742e-03 2.1291e-03 4.1008e-01 9.9536e-02 8.2932e-02 4.6676e-02 2.3128e-02 1.8104e-02 3.0994e-01 9.1441e-03 3.0822e-03 5.4647e-01 1.1602e-01 8.8369e-02 4.5498e-02 2.0690e-02 1.4816e-02 1.5591e-01 +3.7000e-01 1.6500e+07 5.5315e+02 4.1901e+03 4.7848e-08 1.3730e-01 8.6270e-01 4.7129e+03 4.1174e+03 3.4792e+02 2.0048e+02 4.3501e-05 2.5702e-05 7.4251e-03 2.1042e-03 4.0634e-01 9.9028e-02 8.2724e-02 4.6673e-02 2.3180e-02 1.8185e-02 3.1434e-01 9.1653e-03 3.0940e-03 5.4817e-01 1.1623e-01 8.8443e-02 4.5487e-02 2.0661e-02 1.4776e-02 1.5396e-01 +3.7200e-01 1.6400e+07 5.5315e+02 4.1700e+03 4.8181e-08 1.4960e-01 8.5040e-01 4.7072e+03 4.0880e+03 3.5065e+02 1.9786e+02 4.3908e-05 2.5458e-05 7.3770e-03 2.0801e-03 4.0269e-01 9.8526e-02 8.2515e-02 4.6668e-02 2.3229e-02 1.8263e-02 3.1865e-01 9.1855e-03 3.1051e-03 5.4979e-01 1.1644e-01 8.8516e-02 4.5478e-02 2.0634e-02 1.4738e-02 1.5212e-01 +3.7400e-01 1.6300e+07 5.5315e+02 4.1499e+03 4.8518e-08 1.6066e-01 8.3934e-01 4.7014e+03 4.0588e+03 3.5330e+02 1.9534e+02 4.4304e-05 2.5225e-05 7.3297e-03 2.0566e-03 3.9913e-01 9.8031e-02 8.2305e-02 4.6660e-02 2.3276e-02 1.8339e-02 3.2287e-01 9.2048e-03 3.1157e-03 5.5132e-01 1.1663e-01 8.8586e-02 4.5470e-02 2.0609e-02 1.4703e-02 1.5036e-01 +3.7600e-01 1.6200e+07 5.5315e+02 4.1298e+03 4.8861e-08 1.7067e-01 8.2933e-01 4.6952e+03 4.0299e+03 3.5587e+02 1.9289e+02 4.4692e-05 2.5002e-05 7.2830e-03 2.0336e-03 3.9563e-01 9.7542e-02 8.2095e-02 4.6649e-02 2.3320e-02 1.8412e-02 3.2703e-01 9.2231e-03 3.1256e-03 5.5277e-01 1.1682e-01 8.8654e-02 4.5464e-02 2.0585e-02 1.4670e-02 1.4869e-01 +3.7800e-01 1.6100e+07 5.5315e+02 4.1096e+03 4.9210e-08 1.7978e-01 8.2022e-01 4.6888e+03 4.0012e+03 3.5836e+02 1.9052e+02 4.5072e-05 2.4788e-05 7.2370e-03 2.0112e-03 3.9221e-01 9.7057e-02 8.1884e-02 4.6635e-02 2.3363e-02 1.8483e-02 3.3112e-01 9.2407e-03 3.1350e-03 5.5416e-01 1.1700e-01 8.8722e-02 4.5459e-02 2.0564e-02 1.4638e-02 1.4709e-01 +3.8000e-01 1.6000e+07 5.5315e+02 4.0893e+03 4.9564e-08 1.8812e-01 8.1188e-01 4.6823e+03 3.9727e+03 3.6079e+02 1.8822e+02 4.5444e-05 2.4582e-05 7.1915e-03 1.9892e-03 3.8884e-01 9.6576e-02 8.1672e-02 4.6619e-02 2.3403e-02 1.8552e-02 3.3516e-01 9.2576e-03 3.1440e-03 5.5548e-01 1.1717e-01 8.8787e-02 4.5455e-02 2.0543e-02 1.4608e-02 1.4556e-01 +3.8200e-01 1.5900e+07 5.5315e+02 4.0690e+03 4.9924e-08 1.9577e-01 8.0423e-01 4.6755e+03 3.9445e+03 3.6315e+02 1.8597e+02 4.5809e-05 2.4384e-05 7.1465e-03 1.9677e-03 3.8552e-01 9.6099e-02 8.1458e-02 4.6600e-02 2.3441e-02 1.8619e-02 3.3915e-01 9.2739e-03 3.1525e-03 5.5674e-01 1.1733e-01 8.8852e-02 4.5452e-02 2.0525e-02 1.4580e-02 1.4409e-01 +3.8400e-01 1.5800e+07 5.5315e+02 4.0487e+03 5.0289e-08 2.0283e-01 7.9717e-01 4.6686e+03 3.9164e+03 3.6546e+02 1.8379e+02 4.6168e-05 2.4193e-05 7.1020e-03 1.9466e-03 3.8225e-01 9.5624e-02 8.1244e-02 4.6578e-02 2.3478e-02 1.8684e-02 3.4309e-01 9.2895e-03 3.1607e-03 5.5795e-01 1.1749e-01 8.8915e-02 4.5451e-02 2.0507e-02 1.4553e-02 1.4268e-01 +3.8600e-01 1.5700e+07 5.5315e+02 4.0283e+03 5.0661e-08 2.0936e-01 7.9064e-01 4.6615e+03 3.8884e+03 3.6772e+02 1.8166e+02 4.6521e-05 2.4008e-05 7.0579e-03 1.9258e-03 3.7903e-01 9.5152e-02 8.1027e-02 4.6555e-02 2.3512e-02 1.8748e-02 3.4699e-01 9.3046e-03 3.1684e-03 5.5911e-01 1.1765e-01 8.8978e-02 4.5450e-02 2.0490e-02 1.4528e-02 1.4132e-01 +3.8800e-01 1.5600e+07 5.5315e+02 4.0079e+03 5.1038e-08 2.1541e-01 7.8459e-01 4.6543e+03 3.8607e+03 3.6993e+02 1.7957e+02 4.6868e-05 2.3829e-05 7.0141e-03 1.9054e-03 3.7586e-01 9.4683e-02 8.0809e-02 4.6528e-02 2.3545e-02 1.8810e-02 3.5085e-01 9.3191e-03 3.1759e-03 5.6022e-01 1.1780e-01 8.9039e-02 4.5451e-02 2.0475e-02 1.4504e-02 1.4001e-01 +3.9000e-01 1.5500e+07 5.5315e+02 3.9874e+03 5.1422e-08 2.2105e-01 7.7895e-01 4.6469e+03 3.8330e+03 3.7209e+02 1.7754e+02 4.7211e-05 2.3656e-05 6.9706e-03 1.8854e-03 3.7272e-01 9.4215e-02 8.0589e-02 4.6500e-02 2.3576e-02 1.8870e-02 3.5467e-01 9.3331e-03 3.1830e-03 5.6129e-01 1.1795e-01 8.9100e-02 4.5452e-02 2.0461e-02 1.4481e-02 1.3875e-01 +3.9200e-01 1.5400e+07 5.5315e+02 3.9669e+03 5.1812e-08 2.2631e-01 7.7369e-01 4.6394e+03 3.8055e+03 3.7421e+02 1.7554e+02 4.7550e-05 2.3489e-05 6.9274e-03 1.8656e-03 3.6962e-01 9.3749e-02 8.0368e-02 4.6468e-02 2.3606e-02 1.8928e-02 3.5847e-01 9.3467e-03 3.1898e-03 5.6232e-01 1.1809e-01 8.9160e-02 4.5455e-02 2.0447e-02 1.4460e-02 1.3754e-01 +3.9400e-01 1.5300e+07 5.5315e+02 3.9463e+03 5.2209e-08 2.3123e-01 7.6877e-01 4.6318e+03 3.7781e+03 3.7629e+02 1.7359e+02 4.7884e-05 2.3326e-05 6.8845e-03 1.8462e-03 3.6655e-01 9.3284e-02 8.0144e-02 4.6435e-02 2.3634e-02 1.8985e-02 3.6224e-01 9.3599e-03 3.1963e-03 5.6330e-01 1.1823e-01 8.9219e-02 4.5458e-02 2.0435e-02 1.4439e-02 1.3636e-01 +3.9600e-01 1.5200e+07 5.5315e+02 3.9257e+03 5.2612e-08 2.3584e-01 7.6416e-01 4.6242e+03 3.7508e+03 3.7833e+02 1.7168e+02 4.8214e-05 2.3168e-05 6.8419e-03 1.8270e-03 3.6352e-01 9.2820e-02 7.9919e-02 4.6399e-02 2.3660e-02 1.9041e-02 3.6598e-01 9.3726e-03 3.2025e-03 5.6426e-01 1.1836e-01 8.9278e-02 4.5462e-02 2.0423e-02 1.4420e-02 1.3523e-01 +3.9800e-01 1.5100e+07 5.5315e+02 3.9050e+03 5.3023e-08 2.4016e-01 7.5984e-01 4.6164e+03 3.7236e+03 3.8033e+02 1.6980e+02 4.8540e-05 2.3014e-05 6.7994e-03 1.8081e-03 3.6051e-01 9.2356e-02 7.9691e-02 4.6361e-02 2.3685e-02 1.9095e-02 3.6969e-01 9.3850e-03 3.2085e-03 5.6517e-01 1.1849e-01 8.9336e-02 4.5467e-02 2.0413e-02 1.4401e-02 1.3413e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.8842e+03 5.3440e-08 2.4423e-01 7.5577e-01 4.6085e+03 3.6965e+03 3.8231e+02 1.6795e+02 4.8863e-05 2.2865e-05 6.7572e-03 1.7894e-03 3.5754e-01 9.1894e-02 7.9461e-02 4.6321e-02 2.3709e-02 1.9148e-02 3.7339e-01 9.3969e-03 3.2143e-03 5.6606e-01 1.1862e-01 8.9394e-02 4.5472e-02 2.0403e-02 1.4383e-02 1.3306e-01 +4.0200e-01 1.4900e+07 5.5315e+02 3.8635e+03 5.3864e-08 2.4805e-01 7.5195e-01 4.6005e+03 3.6695e+03 3.8425e+02 1.6614e+02 4.9182e-05 2.2720e-05 6.7151e-03 1.7710e-03 3.5459e-01 9.1431e-02 7.9229e-02 4.6278e-02 2.3730e-02 1.9200e-02 3.7706e-01 9.4086e-03 3.2198e-03 5.6691e-01 1.1874e-01 8.9451e-02 4.5479e-02 2.0394e-02 1.4367e-02 1.3203e-01 +4.0400e-01 1.4800e+07 5.5315e+02 3.8426e+03 5.4296e-08 2.5166e-01 7.4834e-01 4.5925e+03 3.6426e+03 3.8616e+02 1.6436e+02 4.9499e-05 2.2578e-05 6.6732e-03 1.7528e-03 3.5166e-01 9.0969e-02 7.8995e-02 4.6233e-02 2.3751e-02 1.9250e-02 3.8072e-01 9.4199e-03 3.2251e-03 5.6773e-01 1.1886e-01 8.9507e-02 4.5486e-02 2.0386e-02 1.4351e-02 1.3103e-01 +4.0600e-01 1.4700e+07 5.5315e+02 3.8217e+03 5.4735e-08 2.5506e-01 7.4494e-01 4.5844e+03 3.6158e+03 3.8804e+02 1.6261e+02 4.9812e-05 2.2440e-05 6.6314e-03 1.7348e-03 3.4876e-01 9.0507e-02 7.8758e-02 4.6185e-02 2.3770e-02 1.9299e-02 3.8435e-01 9.4309e-03 3.2302e-03 5.6853e-01 1.1898e-01 8.9563e-02 4.5494e-02 2.0378e-02 1.4336e-02 1.3006e-01 +4.0800e-01 1.4600e+07 5.5315e+02 3.8008e+03 5.5182e-08 2.5828e-01 7.4172e-01 4.5762e+03 3.5890e+03 3.8989e+02 1.6088e+02 5.0123e-05 2.2306e-05 6.5897e-03 1.7170e-03 3.4588e-01 9.0045e-02 7.8519e-02 4.6136e-02 2.3787e-02 1.9347e-02 3.8798e-01 9.4416e-03 3.2351e-03 5.6929e-01 1.1910e-01 8.9619e-02 4.5502e-02 2.0371e-02 1.4322e-02 1.2912e-01 +4.1000e-01 1.4500e+07 5.5315e+02 3.7798e+03 5.5636e-08 2.6132e-01 7.3868e-01 4.5680e+03 3.5623e+03 3.9172e+02 1.5918e+02 5.0432e-05 2.2175e-05 6.5482e-03 1.6994e-03 3.4302e-01 8.9583e-02 7.8277e-02 4.6084e-02 2.3803e-02 1.9394e-02 3.9159e-01 9.4520e-03 3.2398e-03 5.7003e-01 1.1921e-01 8.9674e-02 4.5511e-02 2.0365e-02 1.4309e-02 1.2820e-01 +4.1200e-01 1.4400e+07 5.5315e+02 3.7587e+03 5.6099e-08 2.6420e-01 7.3580e-01 4.5597e+03 3.5357e+03 3.9352e+02 1.5751e+02 5.0738e-05 2.2046e-05 6.5068e-03 1.6820e-03 3.4019e-01 8.9120e-02 7.8033e-02 4.6029e-02 2.3818e-02 1.9439e-02 3.9518e-01 9.4621e-03 3.2443e-03 5.7075e-01 1.1932e-01 8.9729e-02 4.5520e-02 2.0359e-02 1.4296e-02 1.2732e-01 +4.1400e-01 1.4300e+07 5.5315e+02 3.7376e+03 5.6570e-08 2.6693e-01 7.3307e-01 4.5513e+03 3.5092e+03 3.9530e+02 1.5586e+02 5.1041e-05 2.1921e-05 6.4654e-03 1.6648e-03 3.3737e-01 8.8657e-02 7.7787e-02 4.5973e-02 2.3831e-02 1.9483e-02 3.9877e-01 9.4720e-03 3.2486e-03 5.7144e-01 1.1943e-01 8.9783e-02 4.5531e-02 2.0354e-02 1.4284e-02 1.2645e-01 +4.1600e-01 1.4200e+07 5.5315e+02 3.7164e+03 5.7049e-08 2.6951e-01 7.3049e-01 4.5429e+03 3.4827e+03 3.9706e+02 1.5424e+02 5.1343e-05 2.1799e-05 6.4241e-03 1.6477e-03 3.3457e-01 8.8194e-02 7.7538e-02 4.5914e-02 2.3843e-02 1.9526e-02 4.0234e-01 9.4815e-03 3.2528e-03 5.7211e-01 1.1954e-01 8.9837e-02 4.5541e-02 2.0350e-02 1.4273e-02 1.2561e-01 +4.1800e-01 1.4100e+07 5.5315e+02 3.6952e+03 5.7537e-08 2.7196e-01 7.2804e-01 4.5344e+03 3.4563e+03 3.9879e+02 1.5263e+02 5.1642e-05 2.1680e-05 6.3829e-03 1.6308e-03 3.3179e-01 8.7729e-02 7.7286e-02 4.5852e-02 2.3854e-02 1.9567e-02 4.0591e-01 9.4909e-03 3.2568e-03 5.7276e-01 1.1964e-01 8.9891e-02 4.5553e-02 2.0346e-02 1.4262e-02 1.2480e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.6739e+03 5.8034e-08 2.7428e-01 7.2572e-01 4.5259e+03 3.4299e+03 4.0050e+02 1.5105e+02 5.1940e-05 2.1563e-05 6.3418e-03 1.6141e-03 3.2902e-01 8.7264e-02 7.7032e-02 4.5789e-02 2.3863e-02 1.9608e-02 4.0947e-01 9.5000e-03 3.2607e-03 5.7339e-01 1.1974e-01 8.9944e-02 4.5565e-02 2.0343e-02 1.4252e-02 1.2401e-01 +4.2200e-01 1.3900e+07 5.5315e+02 3.6526e+03 5.8540e-08 2.7649e-01 7.2351e-01 4.5174e+03 3.4036e+03 4.0220e+02 1.4949e+02 5.2236e-05 2.1449e-05 6.3007e-03 1.5975e-03 3.2627e-01 8.6798e-02 7.6774e-02 4.5723e-02 2.3870e-02 1.9647e-02 4.1302e-01 9.5089e-03 3.2644e-03 5.7399e-01 1.1984e-01 8.9997e-02 4.5577e-02 2.0340e-02 1.4243e-02 1.2324e-01 +4.2400e-01 1.3800e+07 5.5315e+02 3.6312e+03 5.9055e-08 2.7858e-01 7.2142e-01 4.5088e+03 3.3773e+03 4.0387e+02 1.4795e+02 5.2530e-05 2.1337e-05 6.2596e-03 1.5811e-03 3.2354e-01 8.6332e-02 7.6515e-02 4.5654e-02 2.3876e-02 1.9685e-02 4.1656e-01 9.5175e-03 3.2680e-03 5.7458e-01 1.1994e-01 9.0050e-02 4.5590e-02 2.0338e-02 1.4234e-02 1.2248e-01 +4.2600e-01 1.3700e+07 5.5315e+02 3.6097e+03 5.9579e-08 2.8057e-01 7.1943e-01 4.5001e+03 3.3511e+03 4.0553e+02 1.4643e+02 5.2822e-05 2.1227e-05 6.2186e-03 1.5648e-03 3.2082e-01 8.5864e-02 7.6252e-02 4.5584e-02 2.3881e-02 1.9722e-02 4.2010e-01 9.5260e-03 3.2714e-03 5.7515e-01 1.2003e-01 9.0103e-02 4.5603e-02 2.0336e-02 1.4226e-02 1.2176e-01 +4.2800e-01 1.3600e+07 5.5315e+02 3.5881e+03 6.0114e-08 2.8245e-01 7.1755e-01 4.4915e+03 3.3249e+03 4.0716e+02 1.4492e+02 5.3113e-05 2.1120e-05 6.1776e-03 1.5487e-03 3.1811e-01 8.5395e-02 7.5986e-02 4.5510e-02 2.3885e-02 1.9758e-02 4.2363e-01 9.5342e-03 3.2747e-03 5.7569e-01 1.2013e-01 9.0155e-02 4.5617e-02 2.0335e-02 1.4218e-02 1.2104e-01 +4.3000e-01 1.3500e+07 5.5315e+02 3.5665e+03 6.0658e-08 2.8424e-01 7.1576e-01 4.4828e+03 3.2988e+03 4.0878e+02 1.4344e+02 5.3402e-05 2.1015e-05 6.1367e-03 1.5327e-03 3.1542e-01 8.4925e-02 7.5718e-02 4.5435e-02 2.3887e-02 1.9792e-02 4.2716e-01 9.5422e-03 3.2778e-03 5.7622e-01 1.2022e-01 9.0207e-02 4.5631e-02 2.0334e-02 1.4212e-02 1.2035e-01 +4.3200e-01 1.3400e+07 5.5315e+02 3.5449e+03 6.1213e-08 2.8594e-01 7.1406e-01 4.4740e+03 3.2727e+03 4.1039e+02 1.4197e+02 5.3690e-05 2.0912e-05 6.0957e-03 1.5168e-03 3.1273e-01 8.4453e-02 7.5447e-02 4.5357e-02 2.3887e-02 1.9825e-02 4.3068e-01 9.5500e-03 3.2809e-03 5.7673e-01 1.2031e-01 9.0258e-02 4.5646e-02 2.0334e-02 1.4205e-02 1.1968e-01 +4.3400e-01 1.3300e+07 5.5315e+02 3.5231e+03 6.1778e-08 2.8755e-01 7.1245e-01 4.4652e+03 3.2467e+03 4.1198e+02 1.4052e+02 5.3977e-05 2.0811e-05 6.0547e-03 1.5011e-03 3.1007e-01 8.3980e-02 7.5172e-02 4.5276e-02 2.3886e-02 1.9858e-02 4.3421e-01 9.5576e-03 3.2838e-03 5.7723e-01 1.2040e-01 9.0310e-02 4.5661e-02 2.0335e-02 1.4199e-02 1.1903e-01 +4.3600e-01 1.3200e+07 5.5315e+02 3.5013e+03 6.2354e-08 2.8908e-01 7.1092e-01 4.4564e+03 3.2207e+03 4.1355e+02 1.3908e+02 5.4262e-05 2.0713e-05 6.0138e-03 1.4855e-03 3.0741e-01 8.3506e-02 7.4895e-02 4.5194e-02 2.3884e-02 1.9889e-02 4.3773e-01 9.5650e-03 3.2866e-03 5.7771e-01 1.2048e-01 9.0361e-02 4.5677e-02 2.0335e-02 1.4194e-02 1.1839e-01 +4.3800e-01 1.3100e+07 5.5315e+02 3.4795e+03 6.2941e-08 2.9052e-01 7.0948e-01 4.4476e+03 3.1947e+03 4.1511e+02 1.3766e+02 5.4546e-05 2.0616e-05 5.9728e-03 1.4700e-03 3.0476e-01 8.3031e-02 7.4615e-02 4.5108e-02 2.3880e-02 1.9918e-02 4.4124e-01 9.5723e-03 3.2893e-03 5.7817e-01 1.2057e-01 9.0412e-02 4.5693e-02 2.0337e-02 1.4189e-02 1.1777e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.4575e+03 6.3540e-08 2.9189e-01 7.0811e-01 4.4387e+03 3.1688e+03 4.1665e+02 1.3625e+02 5.4829e-05 2.0521e-05 5.9319e-03 1.4546e-03 3.0213e-01 8.2554e-02 7.4331e-02 4.5021e-02 2.3875e-02 1.9947e-02 4.4476e-01 9.5793e-03 3.2918e-03 5.7862e-01 1.2065e-01 9.0462e-02 4.5709e-02 2.0338e-02 1.4185e-02 1.1717e-01 +4.4200e-01 1.2900e+07 5.5315e+02 3.4355e+03 6.4150e-08 2.9319e-01 7.0681e-01 4.4299e+03 3.1429e+03 4.1818e+02 1.3486e+02 5.5111e-05 2.0427e-05 5.8909e-03 1.4393e-03 2.9950e-01 8.2075e-02 7.4045e-02 4.4930e-02 2.3868e-02 1.9974e-02 4.4828e-01 9.5862e-03 3.2943e-03 5.7905e-01 1.2073e-01 9.0512e-02 4.5726e-02 2.0340e-02 1.4181e-02 1.1658e-01 +4.4400e-01 1.2800e+07 5.5315e+02 3.4135e+03 6.4773e-08 2.9442e-01 7.0558e-01 4.4209e+03 3.1171e+03 4.1969e+02 1.3348e+02 5.5392e-05 2.0336e-05 5.8499e-03 1.4241e-03 2.9689e-01 8.1595e-02 7.3755e-02 4.4837e-02 2.3860e-02 2.0000e-02 4.5179e-01 9.5929e-03 3.2966e-03 5.7946e-01 1.2081e-01 9.0562e-02 4.5744e-02 2.0343e-02 1.4178e-02 1.1601e-01 +4.4600e-01 1.2700e+07 5.5315e+02 3.3913e+03 6.5407e-08 2.9557e-01 7.0443e-01 4.4120e+03 3.0912e+03 4.2120e+02 1.3212e+02 5.5672e-05 2.0246e-05 5.8089e-03 1.4091e-03 2.9428e-01 8.1113e-02 7.3462e-02 4.4742e-02 2.3851e-02 2.0025e-02 4.5531e-01 9.5994e-03 3.2989e-03 5.7986e-01 1.2089e-01 9.0612e-02 4.5761e-02 2.0346e-02 1.4175e-02 1.1546e-01 +4.4800e-01 1.2600e+07 5.5315e+02 3.3691e+03 6.6055e-08 2.9667e-01 7.0333e-01 4.4031e+03 3.0655e+03 4.2269e+02 1.3077e+02 5.5951e-05 2.0157e-05 5.7679e-03 1.3941e-03 2.9168e-01 8.0630e-02 7.3166e-02 4.4644e-02 2.3840e-02 2.0049e-02 4.5883e-01 9.6058e-03 3.3010e-03 5.8025e-01 1.2097e-01 9.0662e-02 4.5779e-02 2.0349e-02 1.4172e-02 1.1492e-01 +4.5000e-01 1.2500e+07 5.5315e+02 3.3468e+03 6.6715e-08 2.9769e-01 7.0231e-01 4.3941e+03 3.0397e+03 4.2416e+02 1.2943e+02 5.6229e-05 2.0071e-05 5.7268e-03 1.3793e-03 2.8910e-01 8.0145e-02 7.2867e-02 4.4544e-02 2.3827e-02 2.0071e-02 4.6235e-01 9.6120e-03 3.3030e-03 5.8062e-01 1.2104e-01 9.0711e-02 4.5798e-02 2.0353e-02 1.4170e-02 1.1439e-01 +4.5200e-01 1.2400e+07 5.5315e+02 3.3244e+03 6.7389e-08 2.9866e-01 7.0134e-01 4.3851e+03 3.0140e+03 4.2563e+02 1.2810e+02 5.6506e-05 1.9985e-05 5.6857e-03 1.3645e-03 2.8652e-01 7.9657e-02 7.2564e-02 4.4441e-02 2.3813e-02 2.0093e-02 4.6587e-01 9.6180e-03 3.3050e-03 5.8098e-01 1.2112e-01 9.0760e-02 4.5816e-02 2.0357e-02 1.4169e-02 1.1388e-01 +4.5400e-01 1.2300e+07 5.5315e+02 3.3020e+03 6.8076e-08 2.9957e-01 7.0043e-01 4.3761e+03 2.9883e+03 4.2708e+02 1.2679e+02 5.6783e-05 1.9902e-05 5.6445e-03 1.3499e-03 2.8394e-01 7.9169e-02 7.2259e-02 4.4335e-02 2.3797e-02 2.0113e-02 4.6939e-01 9.6239e-03 3.3068e-03 5.8132e-01 1.2119e-01 9.0808e-02 4.5835e-02 2.0361e-02 1.4168e-02 1.1339e-01 +4.5600e-01 1.2200e+07 5.5315e+02 3.2795e+03 6.8778e-08 3.0041e-01 6.9959e-01 4.3670e+03 2.9627e+03 4.2853e+02 1.2549e+02 5.7058e-05 1.9819e-05 5.6033e-03 1.3353e-03 2.8138e-01 7.8678e-02 7.1949e-02 4.4226e-02 2.3780e-02 2.0131e-02 4.7292e-01 9.6296e-03 3.3086e-03 5.8165e-01 1.2126e-01 9.0857e-02 4.5855e-02 2.0366e-02 1.4167e-02 1.1290e-01 +4.5800e-01 1.2100e+07 5.5315e+02 3.2569e+03 6.9494e-08 3.0121e-01 6.9879e-01 4.3580e+03 2.9370e+03 4.2996e+02 1.2420e+02 5.7333e-05 1.9739e-05 5.5621e-03 1.3208e-03 2.7883e-01 7.8185e-02 7.1637e-02 4.4115e-02 2.3761e-02 2.0149e-02 4.7644e-01 9.6351e-03 3.3102e-03 5.8197e-01 1.2133e-01 9.0905e-02 4.5874e-02 2.0371e-02 1.4167e-02 1.1244e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.2342e+03 7.0225e-08 3.0194e-01 6.9806e-01 4.3489e+03 2.9114e+03 4.3138e+02 1.2292e+02 5.7608e-05 1.9659e-05 5.5208e-03 1.3065e-03 2.7628e-01 7.7691e-02 7.1321e-02 4.4001e-02 2.3741e-02 2.0165e-02 4.7998e-01 9.6405e-03 3.3118e-03 5.8228e-01 1.2140e-01 9.0952e-02 4.5894e-02 2.0377e-02 1.4168e-02 1.1198e-01 +4.6200e-01 1.1900e+07 5.5315e+02 3.2115e+03 7.0972e-08 3.0263e-01 6.9737e-01 4.3398e+03 2.8859e+03 4.3279e+02 1.2165e+02 5.7881e-05 1.9581e-05 5.4795e-03 1.2922e-03 2.7374e-01 7.7194e-02 7.1001e-02 4.3885e-02 2.3719e-02 2.0180e-02 4.8351e-01 9.6458e-03 3.3133e-03 5.8257e-01 1.2146e-01 9.1000e-02 4.5915e-02 2.0383e-02 1.4168e-02 1.1155e-01 +4.6400e-01 1.1800e+07 5.5315e+02 3.1886e+03 7.1734e-08 3.0326e-01 6.9674e-01 4.3307e+03 2.8603e+03 4.3419e+02 1.2039e+02 5.8154e-05 1.9504e-05 5.4381e-03 1.2780e-03 2.7120e-01 7.6695e-02 7.0678e-02 4.3766e-02 2.3696e-02 2.0193e-02 4.8705e-01 9.6509e-03 3.3147e-03 5.8285e-01 1.2153e-01 9.1047e-02 4.5935e-02 2.0389e-02 1.4169e-02 1.1112e-01 +4.6600e-01 1.1700e+07 5.5315e+02 3.1657e+03 7.2513e-08 3.0384e-01 6.9616e-01 4.3216e+03 2.8348e+03 4.3558e+02 1.1915e+02 5.8427e-05 1.9428e-05 5.3966e-03 1.2638e-03 2.6867e-01 7.6195e-02 7.0352e-02 4.3644e-02 2.3670e-02 2.0205e-02 4.9060e-01 9.6558e-03 3.3160e-03 5.8312e-01 1.2159e-01 9.1094e-02 4.5956e-02 2.0396e-02 1.4171e-02 1.1071e-01 +4.6800e-01 1.1600e+07 5.5315e+02 3.1427e+03 7.3309e-08 3.0436e-01 6.9564e-01 4.3125e+03 2.8093e+03 4.3696e+02 1.1791e+02 5.8699e-05 1.9354e-05 5.3551e-03 1.2498e-03 2.6615e-01 7.5692e-02 7.0022e-02 4.3519e-02 2.3644e-02 2.0216e-02 4.9415e-01 9.6606e-03 3.3172e-03 5.8337e-01 1.2165e-01 9.1140e-02 4.5977e-02 2.0403e-02 1.4173e-02 1.1031e-01 +4.7000e-01 1.1500e+07 5.5315e+02 3.1196e+03 7.4121e-08 3.0484e-01 6.9516e-01 4.3033e+03 2.7838e+03 4.3833e+02 1.1668e+02 5.8970e-05 1.9281e-05 5.3136e-03 1.2358e-03 2.6364e-01 7.5187e-02 6.9688e-02 4.3391e-02 2.3615e-02 2.0225e-02 4.9771e-01 9.6652e-03 3.3183e-03 5.8361e-01 1.2171e-01 9.1186e-02 4.5999e-02 2.0410e-02 1.4175e-02 1.0992e-01 +4.7200e-01 1.1400e+07 5.5315e+02 3.0965e+03 7.4952e-08 3.0527e-01 6.9473e-01 4.2942e+03 2.7584e+03 4.3970e+02 1.1546e+02 5.9241e-05 1.9208e-05 5.2719e-03 1.2220e-03 2.6113e-01 7.4680e-02 6.9351e-02 4.3260e-02 2.3585e-02 2.0233e-02 5.0127e-01 9.6697e-03 3.3194e-03 5.8384e-01 1.2177e-01 9.1232e-02 4.6020e-02 2.0418e-02 1.4178e-02 1.0955e-01 +4.7400e-01 1.1300e+07 5.5315e+02 3.0732e+03 7.5801e-08 3.0566e-01 6.9434e-01 4.2850e+03 2.7330e+03 4.4105e+02 1.1426e+02 5.9511e-05 1.9138e-05 5.2302e-03 1.2082e-03 2.5862e-01 7.4171e-02 6.9010e-02 4.3127e-02 2.3553e-02 2.0239e-02 5.0484e-01 9.6740e-03 3.3204e-03 5.8406e-01 1.2183e-01 9.1278e-02 4.6042e-02 2.0426e-02 1.4181e-02 1.0919e-01 +4.7600e-01 1.1200e+07 5.5315e+02 3.0499e+03 7.6669e-08 3.0599e-01 6.9401e-01 4.2758e+03 2.7076e+03 4.4240e+02 1.1306e+02 5.9781e-05 1.9068e-05 5.1884e-03 1.1944e-03 2.5613e-01 7.3659e-02 6.8665e-02 4.2990e-02 2.3520e-02 2.0244e-02 5.0841e-01 9.6782e-03 3.3213e-03 5.8427e-01 1.2188e-01 9.1323e-02 4.6064e-02 2.0434e-02 1.4185e-02 1.0884e-01 +4.7800e-01 1.1100e+07 5.5315e+02 3.0265e+03 7.7556e-08 3.0628e-01 6.9372e-01 4.2666e+03 2.6822e+03 4.4373e+02 1.1187e+02 6.0051e-05 1.8999e-05 5.1466e-03 1.1808e-03 2.5363e-01 7.3145e-02 6.8317e-02 4.2851e-02 2.3484e-02 2.0248e-02 5.1199e-01 9.6823e-03 3.3221e-03 5.8446e-01 1.2194e-01 9.1367e-02 4.6087e-02 2.0442e-02 1.4189e-02 1.0851e-01 +4.8000e-01 1.1000e+07 5.5315e+02 3.0029e+03 7.8464e-08 3.0653e-01 6.9347e-01 4.2574e+03 2.6569e+03 4.4506e+02 1.1069e+02 6.0320e-05 1.8931e-05 5.1047e-03 1.1672e-03 2.5115e-01 7.2629e-02 6.7965e-02 4.2709e-02 2.3447e-02 2.0250e-02 5.1558e-01 9.6862e-03 3.3228e-03 5.8465e-01 1.2199e-01 9.1412e-02 4.6109e-02 2.0451e-02 1.4193e-02 1.0818e-01 +4.8200e-01 1.0900e+07 5.5315e+02 2.9793e+03 7.9392e-08 3.0673e-01 6.9327e-01 4.2482e+03 2.6316e+03 4.4638e+02 1.0951e+02 6.0589e-05 1.8864e-05 5.0627e-03 1.1537e-03 2.4866e-01 7.2111e-02 6.7609e-02 4.2563e-02 2.3408e-02 2.0251e-02 5.1918e-01 9.6899e-03 3.3235e-03 5.8482e-01 1.2205e-01 9.1456e-02 4.6132e-02 2.0460e-02 1.4197e-02 1.0787e-01 +4.8400e-01 1.0800e+07 5.5315e+02 2.9556e+03 8.0342e-08 3.0688e-01 6.9312e-01 4.2390e+03 2.6063e+03 4.4770e+02 1.0835e+02 6.0857e-05 1.8798e-05 5.0206e-03 1.1403e-03 2.4619e-01 7.1590e-02 6.7249e-02 4.2415e-02 2.3368e-02 2.0250e-02 5.2278e-01 9.6935e-03 3.3241e-03 5.8498e-01 1.2210e-01 9.1499e-02 4.6155e-02 2.0470e-02 1.4203e-02 1.0758e-01 +4.8600e-01 1.0700e+07 5.5315e+02 2.9318e+03 8.1314e-08 3.0699e-01 6.9301e-01 4.2298e+03 2.5810e+03 4.4900e+02 1.0719e+02 6.1125e-05 1.8734e-05 4.9785e-03 1.1269e-03 2.4371e-01 7.1067e-02 6.6885e-02 4.2263e-02 2.3325e-02 2.0247e-02 5.2639e-01 9.6970e-03 3.3246e-03 5.8513e-01 1.2214e-01 9.1542e-02 4.6178e-02 2.0480e-02 1.4208e-02 1.0729e-01 +4.8800e-01 1.0600e+07 5.5315e+02 2.9080e+03 8.2308e-08 3.0705e-01 6.9295e-01 4.2205e+03 2.5557e+03 4.5030e+02 1.0605e+02 6.1393e-05 1.8670e-05 4.9362e-03 1.1136e-03 2.4125e-01 7.0542e-02 6.6518e-02 4.2109e-02 2.3281e-02 2.0243e-02 5.3001e-01 9.7003e-03 3.3251e-03 5.8527e-01 1.2219e-01 9.1585e-02 4.6202e-02 2.0490e-02 1.4214e-02 1.0702e-01 +4.9000e-01 1.0500e+07 5.5315e+02 2.8840e+03 8.3326e-08 3.0707e-01 6.9293e-01 4.2113e+03 2.5305e+03 4.5159e+02 1.0491e+02 6.1661e-05 1.8607e-05 4.8939e-03 1.1004e-03 2.3878e-01 7.0014e-02 6.6146e-02 4.1951e-02 2.3234e-02 2.0237e-02 5.3364e-01 9.7035e-03 3.3254e-03 5.8540e-01 1.2224e-01 9.1627e-02 4.6225e-02 2.0500e-02 1.4220e-02 1.0676e-01 +4.9200e-01 1.0400e+07 5.5315e+02 2.8599e+03 8.4368e-08 3.0705e-01 6.9295e-01 4.2021e+03 2.5053e+03 4.5287e+02 1.0377e+02 6.1928e-05 1.8545e-05 4.8515e-03 1.0873e-03 2.3632e-01 6.9483e-02 6.5771e-02 4.1790e-02 2.3186e-02 2.0230e-02 5.3728e-01 9.7065e-03 3.3257e-03 5.8551e-01 1.2228e-01 9.1669e-02 4.6249e-02 2.0511e-02 1.4226e-02 1.0652e-01 +4.9400e-01 1.0300e+07 5.5315e+02 2.8357e+03 8.5436e-08 3.0698e-01 6.9302e-01 4.1928e+03 2.4801e+03 4.5415e+02 1.0265e+02 6.2195e-05 1.8483e-05 4.8090e-03 1.0742e-03 2.3387e-01 6.8950e-02 6.5391e-02 4.1626e-02 2.3136e-02 2.0221e-02 5.4092e-01 9.7094e-03 3.3260e-03 5.8562e-01 1.2233e-01 9.1710e-02 4.6273e-02 2.0522e-02 1.4233e-02 1.0628e-01 +4.9600e-01 1.0200e+07 5.5315e+02 2.8114e+03 8.6529e-08 3.0687e-01 6.9313e-01 4.1835e+03 2.4550e+03 4.5542e+02 1.0153e+02 6.2462e-05 1.8423e-05 4.7664e-03 1.0611e-03 2.3142e-01 6.8415e-02 6.5007e-02 4.1458e-02 2.3084e-02 2.0210e-02 5.4458e-01 9.7121e-03 3.3261e-03 5.8571e-01 1.2237e-01 9.1751e-02 4.6297e-02 2.0533e-02 1.4241e-02 1.0606e-01 +4.9800e-01 1.0100e+07 5.5315e+02 2.7871e+03 8.7649e-08 3.0672e-01 6.9328e-01 4.1743e+03 2.4298e+03 4.5668e+02 1.0042e+02 6.2728e-05 1.8364e-05 4.7238e-03 1.0482e-03 2.2897e-01 6.7877e-02 6.4620e-02 4.1288e-02 2.3030e-02 2.0197e-02 5.4824e-01 9.7147e-03 3.3262e-03 5.8580e-01 1.2241e-01 9.1791e-02 4.6321e-02 2.0544e-02 1.4248e-02 1.0585e-01 +5.0000e-01 1.0000e+07 5.5315e+02 2.7626e+03 8.8797e-08 3.0652e-01 6.9348e-01 4.1650e+03 2.4047e+03 4.5794e+02 9.9319e+01 6.2995e-05 1.8305e-05 4.6810e-03 1.0353e-03 2.2653e-01 6.7336e-02 6.4228e-02 4.1113e-02 2.2974e-02 2.0183e-02 5.5192e-01 9.7171e-03 3.3262e-03 5.8587e-01 1.2245e-01 9.1830e-02 4.6345e-02 2.0556e-02 1.4256e-02 1.0566e-01 +5.0200e-01 9.9604e+06 5.5315e+02 2.7529e+03 8.9259e-08 3.0643e-01 6.9357e-01 4.1613e+03 2.3947e+03 4.5844e+02 9.8885e+01 6.3100e-05 1.8282e-05 4.6640e-03 1.0302e-03 2.2556e-01 6.7121e-02 6.4071e-02 4.1044e-02 2.2951e-02 2.0177e-02 5.5338e-01 9.7180e-03 3.3262e-03 5.8589e-01 1.2246e-01 9.1846e-02 4.6355e-02 2.0560e-02 1.4259e-02 1.0558e-01 +5.0400e-01 9.9208e+06 5.5315e+02 2.7431e+03 8.9726e-08 3.0633e-01 6.9367e-01 4.1576e+03 2.3848e+03 4.5893e+02 9.8451e+01 6.3206e-05 1.8259e-05 4.6471e-03 1.0251e-03 2.2460e-01 6.6906e-02 6.3914e-02 4.0973e-02 2.2928e-02 2.0171e-02 5.5484e-01 9.7189e-03 3.3262e-03 5.8592e-01 1.2248e-01 9.1861e-02 4.6364e-02 2.0565e-02 1.4263e-02 1.0551e-01 +5.0600e-01 9.8812e+06 5.5315e+02 2.7334e+03 9.0198e-08 3.0623e-01 6.9377e-01 4.1540e+03 2.3749e+03 4.5943e+02 9.8018e+01 6.3311e-05 1.8236e-05 4.6301e-03 1.0200e-03 2.2363e-01 6.6691e-02 6.3757e-02 4.0902e-02 2.2904e-02 2.0164e-02 5.5630e-01 9.7198e-03 3.3261e-03 5.8594e-01 1.2249e-01 9.1877e-02 4.6374e-02 2.0570e-02 1.4266e-02 1.0544e-01 +5.0800e-01 9.8416e+06 5.5315e+02 2.7236e+03 9.0674e-08 3.0612e-01 6.9388e-01 4.1503e+03 2.3649e+03 4.5992e+02 9.7587e+01 6.3416e-05 1.8213e-05 4.6131e-03 1.0150e-03 2.2267e-01 6.6475e-02 6.3599e-02 4.0831e-02 2.2881e-02 2.0157e-02 5.5776e-01 9.7206e-03 3.3261e-03 5.8596e-01 1.2251e-01 9.1892e-02 4.6383e-02 2.0575e-02 1.4269e-02 1.0537e-01 +5.1000e-01 9.8020e+06 5.5315e+02 2.7138e+03 9.1155e-08 3.0600e-01 6.9400e-01 4.1466e+03 2.3550e+03 4.6041e+02 9.7156e+01 6.3522e-05 1.8191e-05 4.5960e-03 1.0099e-03 2.2170e-01 6.6258e-02 6.3440e-02 4.0759e-02 2.2857e-02 2.0150e-02 5.5923e-01 9.7215e-03 3.3260e-03 5.8598e-01 1.2252e-01 9.1907e-02 4.6393e-02 2.0579e-02 1.4273e-02 1.0530e-01 +5.1200e-01 9.7624e+06 5.5315e+02 2.7040e+03 9.1641e-08 3.0587e-01 6.9413e-01 4.1429e+03 2.3451e+03 4.6090e+02 9.6727e+01 6.3627e-05 1.8168e-05 4.5790e-03 1.0049e-03 2.2074e-01 6.6042e-02 6.3280e-02 4.0686e-02 2.2832e-02 2.0142e-02 5.6069e-01 9.7223e-03 3.3260e-03 5.8599e-01 1.2253e-01 9.1922e-02 4.6403e-02 2.0584e-02 1.4276e-02 1.0524e-01 +5.1400e-01 9.7228e+06 5.5315e+02 2.6942e+03 9.2132e-08 3.0574e-01 6.9426e-01 4.1392e+03 2.3352e+03 4.6139e+02 9.6298e+01 6.3732e-05 1.8146e-05 4.5620e-03 9.9982e-04 2.1978e-01 6.5824e-02 6.3120e-02 4.0613e-02 2.2807e-02 2.0134e-02 5.6216e-01 9.7231e-03 3.3259e-03 5.8601e-01 1.2255e-01 9.1937e-02 4.6412e-02 2.0589e-02 1.4280e-02 1.0518e-01 +5.1600e-01 9.6832e+06 5.5315e+02 2.6843e+03 9.2627e-08 3.0560e-01 6.9440e-01 4.1356e+03 2.3252e+03 4.6188e+02 9.5871e+01 6.3837e-05 1.8124e-05 4.5449e-03 9.9479e-04 2.1882e-01 6.5607e-02 6.2959e-02 4.0540e-02 2.2782e-02 2.0126e-02 5.6363e-01 9.7238e-03 3.3258e-03 5.8602e-01 1.2256e-01 9.1952e-02 4.6422e-02 2.0594e-02 1.4283e-02 1.0512e-01 +5.1800e-01 9.6436e+06 5.5315e+02 2.6745e+03 9.3128e-08 3.0545e-01 6.9455e-01 4.1319e+03 2.3153e+03 4.6237e+02 9.5444e+01 6.3943e-05 1.8102e-05 4.5278e-03 9.8977e-04 2.1785e-01 6.5389e-02 6.2797e-02 4.0465e-02 2.2757e-02 2.0118e-02 5.6510e-01 9.7245e-03 3.3257e-03 5.8603e-01 1.2257e-01 9.1967e-02 4.6432e-02 2.0599e-02 1.4287e-02 1.0506e-01 +5.2000e-01 9.6040e+06 5.5315e+02 2.6646e+03 9.3634e-08 3.0530e-01 6.9470e-01 4.1282e+03 2.3054e+03 4.6286e+02 9.5019e+01 6.4048e-05 1.8080e-05 4.5107e-03 9.8476e-04 2.1689e-01 6.5170e-02 6.2635e-02 4.0391e-02 2.2731e-02 2.0109e-02 5.6658e-01 9.7252e-03 3.3256e-03 5.8604e-01 1.2259e-01 9.1982e-02 4.6442e-02 2.0604e-02 1.4291e-02 1.0500e-01 +5.2200e-01 9.5644e+06 5.5315e+02 2.6547e+03 9.4145e-08 3.0514e-01 6.9486e-01 4.1245e+03 2.2955e+03 4.6335e+02 9.4595e+01 6.4153e-05 1.8058e-05 4.4936e-03 9.7976e-04 2.1593e-01 6.4951e-02 6.2472e-02 4.0315e-02 2.2705e-02 2.0100e-02 5.6805e-01 9.7259e-03 3.3254e-03 5.8605e-01 1.2260e-01 9.1996e-02 4.6451e-02 2.0609e-02 1.4295e-02 1.0495e-01 +5.2400e-01 9.5248e+06 5.5315e+02 2.6448e+03 9.4661e-08 3.0497e-01 6.9503e-01 4.1208e+03 2.2856e+03 4.6383e+02 9.4171e+01 6.4258e-05 1.8036e-05 4.4765e-03 9.7477e-04 2.1497e-01 6.4732e-02 6.2308e-02 4.0240e-02 2.2679e-02 2.0091e-02 5.6953e-01 9.7266e-03 3.3253e-03 5.8606e-01 1.2261e-01 9.2011e-02 4.6461e-02 2.0614e-02 1.4298e-02 1.0490e-01 +5.2600e-01 9.4852e+06 5.5315e+02 2.6349e+03 9.5182e-08 3.0480e-01 6.9520e-01 4.1171e+03 2.2757e+03 4.6432e+02 9.3749e+01 6.4363e-05 1.8014e-05 4.4593e-03 9.6979e-04 2.1401e-01 6.4512e-02 6.2144e-02 4.0163e-02 2.2652e-02 2.0081e-02 5.7101e-01 9.7272e-03 3.3251e-03 5.8606e-01 1.2262e-01 9.2025e-02 4.6471e-02 2.0619e-02 1.4302e-02 1.0485e-01 +5.2800e-01 9.4456e+06 5.5315e+02 2.6250e+03 9.5709e-08 3.0462e-01 6.9538e-01 4.1134e+03 2.2658e+03 4.6480e+02 9.3328e+01 6.4469e-05 1.7993e-05 4.4422e-03 9.6482e-04 2.1305e-01 6.4292e-02 6.1979e-02 4.0086e-02 2.2625e-02 2.0071e-02 5.7249e-01 9.7278e-03 3.3250e-03 5.8606e-01 1.2263e-01 9.2039e-02 4.6480e-02 2.0625e-02 1.4306e-02 1.0480e-01 +5.3000e-01 9.4060e+06 5.5315e+02 2.6150e+03 9.6241e-08 3.0443e-01 6.9557e-01 4.1098e+03 2.2559e+03 4.6528e+02 9.2908e+01 6.4574e-05 1.7971e-05 4.4250e-03 9.5985e-04 2.1209e-01 6.4071e-02 6.1813e-02 4.0009e-02 2.2597e-02 2.0061e-02 5.7397e-01 9.7284e-03 3.3248e-03 5.8606e-01 1.2264e-01 9.2053e-02 4.6490e-02 2.0630e-02 1.4310e-02 1.0476e-01 +5.3200e-01 9.3664e+06 5.5315e+02 2.6050e+03 9.6779e-08 3.0423e-01 6.9577e-01 4.1061e+03 2.2460e+03 4.6576e+02 9.2488e+01 6.4679e-05 1.7950e-05 4.4078e-03 9.5490e-04 2.1113e-01 6.3850e-02 6.1646e-02 3.9931e-02 2.2569e-02 2.0050e-02 5.7546e-01 9.7290e-03 3.3246e-03 5.8606e-01 1.2266e-01 9.2067e-02 4.6500e-02 2.0635e-02 1.4314e-02 1.0471e-01 +5.3400e-01 9.3268e+06 5.5315e+02 2.5950e+03 9.7322e-08 3.0403e-01 6.9597e-01 4.1024e+03 2.2361e+03 4.6625e+02 9.2070e+01 6.4784e-05 1.7928e-05 4.3906e-03 9.4995e-04 2.1018e-01 6.3629e-02 6.1479e-02 3.9852e-02 2.2541e-02 2.0039e-02 5.7694e-01 9.7295e-03 3.3244e-03 5.8606e-01 1.2267e-01 9.2081e-02 4.6510e-02 2.0640e-02 1.4318e-02 1.0467e-01 +5.3600e-01 9.2872e+06 5.5315e+02 2.5850e+03 9.7871e-08 3.0382e-01 6.9618e-01 4.0987e+03 2.2262e+03 4.6673e+02 9.1652e+01 6.4889e-05 1.7907e-05 4.3734e-03 9.4502e-04 2.0922e-01 6.3407e-02 6.1312e-02 3.9773e-02 2.2513e-02 2.0028e-02 5.7843e-01 9.7300e-03 3.3242e-03 5.8605e-01 1.2268e-01 9.2095e-02 4.6519e-02 2.0646e-02 1.4322e-02 1.0463e-01 +5.3800e-01 9.2476e+06 5.5315e+02 2.5750e+03 9.8426e-08 3.0360e-01 6.9640e-01 4.0950e+03 2.2163e+03 4.6721e+02 9.1236e+01 6.4994e-05 1.7886e-05 4.3562e-03 9.4009e-04 2.0826e-01 6.3185e-02 6.1143e-02 3.9693e-02 2.2484e-02 2.0016e-02 5.7992e-01 9.7305e-03 3.3240e-03 5.8605e-01 1.2269e-01 9.2109e-02 4.6529e-02 2.0651e-02 1.4327e-02 1.0459e-01 +5.4000e-01 9.2080e+06 5.5315e+02 2.5649e+03 9.8987e-08 3.0338e-01 6.9662e-01 4.0913e+03 2.2065e+03 4.6768e+02 9.0820e+01 6.5099e-05 1.7865e-05 4.3389e-03 9.3517e-04 2.0731e-01 6.2962e-02 6.0974e-02 3.9613e-02 2.2454e-02 2.0005e-02 5.8141e-01 9.7309e-03 3.3238e-03 5.8604e-01 1.2270e-01 9.2122e-02 4.6539e-02 2.0656e-02 1.4331e-02 1.0456e-01 +5.4200e-01 9.1684e+06 5.5315e+02 2.5549e+03 9.9554e-08 3.0315e-01 6.9685e-01 4.0876e+03 2.1966e+03 4.6816e+02 9.0406e+01 6.5204e-05 1.7844e-05 4.3217e-03 9.3026e-04 2.0635e-01 6.2739e-02 6.0804e-02 3.9532e-02 2.2425e-02 1.9992e-02 5.8291e-01 9.7314e-03 3.3236e-03 5.8603e-01 1.2271e-01 9.2136e-02 4.6549e-02 2.0662e-02 1.4335e-02 1.0453e-01 +5.4400e-01 9.1288e+06 5.5315e+02 2.5448e+03 1.0013e-07 3.0291e-01 6.9709e-01 4.0839e+03 2.1867e+03 4.6864e+02 8.9992e+01 6.5309e-05 1.7824e-05 4.3044e-03 9.2535e-04 2.0540e-01 6.2515e-02 6.0633e-02 3.9450e-02 2.2395e-02 1.9980e-02 5.8440e-01 9.7318e-03 3.3233e-03 5.8602e-01 1.2272e-01 9.2149e-02 4.6558e-02 2.0667e-02 1.4340e-02 1.0450e-01 +5.4600e-01 9.0892e+06 5.5315e+02 2.5347e+03 1.0071e-07 3.0266e-01 6.9734e-01 4.0802e+03 2.1768e+03 4.6912e+02 8.9579e+01 6.5414e-05 1.7803e-05 4.2871e-03 9.2046e-04 2.0444e-01 6.2291e-02 6.0462e-02 3.9368e-02 2.2364e-02 1.9967e-02 5.8590e-01 9.7321e-03 3.3231e-03 5.8600e-01 1.2273e-01 9.2162e-02 4.6568e-02 2.0673e-02 1.4344e-02 1.0447e-01 +5.4800e-01 9.0496e+06 5.5315e+02 2.5246e+03 1.0129e-07 3.0241e-01 6.9759e-01 4.0765e+03 2.1670e+03 4.6959e+02 8.9168e+01 6.5519e-05 1.7782e-05 4.2698e-03 9.1557e-04 2.0349e-01 6.2066e-02 6.0290e-02 3.9285e-02 2.2334e-02 1.9954e-02 5.8740e-01 9.7325e-03 3.3228e-03 5.8599e-01 1.2273e-01 9.2175e-02 4.6578e-02 2.0678e-02 1.4348e-02 1.0444e-01 +5.5000e-01 9.0100e+06 5.5315e+02 2.5145e+03 1.0188e-07 3.0215e-01 6.9785e-01 4.0729e+03 2.1571e+03 4.7007e+02 8.8757e+01 6.5624e-05 1.7762e-05 4.2524e-03 9.1069e-04 2.0253e-01 6.1842e-02 6.0117e-02 3.9202e-02 2.2303e-02 1.9940e-02 5.8890e-01 9.7328e-03 3.3225e-03 5.8597e-01 1.2274e-01 9.2188e-02 4.6588e-02 2.0684e-02 1.4353e-02 1.0442e-01 +5.5200e-01 8.9704e+06 5.5315e+02 2.5043e+03 1.0248e-07 3.0188e-01 6.9812e-01 4.0692e+03 2.1472e+03 4.7054e+02 8.8347e+01 6.5729e-05 1.7742e-05 4.2351e-03 9.0583e-04 2.0158e-01 6.1616e-02 5.9944e-02 3.9118e-02 2.2271e-02 1.9927e-02 5.9040e-01 9.7331e-03 3.3222e-03 5.8595e-01 1.2275e-01 9.2201e-02 4.6597e-02 2.0689e-02 1.4357e-02 1.0439e-01 +5.5400e-01 8.9308e+06 5.5315e+02 2.4941e+03 1.0308e-07 3.0160e-01 6.9840e-01 4.0655e+03 2.1374e+03 4.7101e+02 8.7938e+01 6.5834e-05 1.7721e-05 4.2177e-03 9.0096e-04 2.0063e-01 6.1390e-02 5.9770e-02 3.9034e-02 2.2239e-02 1.9912e-02 5.9191e-01 9.7334e-03 3.3219e-03 5.8593e-01 1.2276e-01 9.2214e-02 4.6607e-02 2.0695e-02 1.4362e-02 1.0437e-01 +5.5600e-01 8.8912e+06 5.5315e+02 2.4839e+03 1.0369e-07 3.0132e-01 6.9868e-01 4.0618e+03 2.1275e+03 4.7149e+02 8.7530e+01 6.5939e-05 1.7701e-05 4.2003e-03 8.9611e-04 1.9967e-01 6.1164e-02 5.9595e-02 3.8949e-02 2.2207e-02 1.9898e-02 5.9342e-01 9.7336e-03 3.3216e-03 5.8591e-01 1.2277e-01 9.2227e-02 4.6617e-02 2.0700e-02 1.4367e-02 1.0436e-01 +5.5800e-01 8.8516e+06 5.5315e+02 2.4737e+03 1.0431e-07 3.0102e-01 6.9898e-01 4.0581e+03 2.1177e+03 4.7196e+02 8.7123e+01 6.6044e-05 1.7681e-05 4.1829e-03 8.9127e-04 1.9872e-01 6.0937e-02 5.9419e-02 3.8863e-02 2.2174e-02 1.9883e-02 5.9493e-01 9.7339e-03 3.3213e-03 5.8588e-01 1.2278e-01 9.2239e-02 4.6626e-02 2.0706e-02 1.4371e-02 1.0434e-01 +5.6000e-01 8.8120e+06 5.5315e+02 2.4635e+03 1.0494e-07 3.0072e-01 6.9928e-01 4.0544e+03 2.1078e+03 4.7243e+02 8.6716e+01 6.6149e-05 1.7661e-05 4.1655e-03 8.8643e-04 1.9777e-01 6.0710e-02 5.9243e-02 3.8777e-02 2.2141e-02 1.9868e-02 5.9644e-01 9.7341e-03 3.3209e-03 5.8586e-01 1.2278e-01 9.2251e-02 4.6636e-02 2.0712e-02 1.4376e-02 1.0433e-01 +5.6200e-01 8.7724e+06 5.5315e+02 2.4533e+03 1.0557e-07 3.0042e-01 6.9958e-01 4.0507e+03 2.0980e+03 4.7290e+02 8.6311e+01 6.6254e-05 1.7641e-05 4.1481e-03 8.8160e-04 1.9682e-01 6.0483e-02 5.9066e-02 3.8690e-02 2.2108e-02 1.9852e-02 5.9795e-01 9.7342e-03 3.3206e-03 5.8583e-01 1.2279e-01 9.2263e-02 4.6646e-02 2.0717e-02 1.4381e-02 1.0432e-01 +5.6400e-01 8.7328e+06 5.5315e+02 2.4430e+03 1.0621e-07 3.0010e-01 6.9990e-01 4.0470e+03 2.0881e+03 4.7337e+02 8.5906e+01 6.6358e-05 1.7621e-05 4.1306e-03 8.7678e-04 1.9587e-01 6.0255e-02 5.8888e-02 3.8603e-02 2.2074e-02 1.9836e-02 5.9947e-01 9.7344e-03 3.3202e-03 5.8580e-01 1.2280e-01 9.2275e-02 4.6655e-02 2.0723e-02 1.4386e-02 1.0431e-01 +5.6600e-01 8.6932e+06 5.5315e+02 2.4327e+03 1.0685e-07 2.9978e-01 7.0022e-01 4.0433e+03 2.0783e+03 4.7384e+02 8.5502e+01 6.6463e-05 1.7601e-05 4.1132e-03 8.7197e-04 1.9492e-01 6.0026e-02 5.8709e-02 3.8514e-02 2.2040e-02 1.9820e-02 6.0099e-01 9.7345e-03 3.3198e-03 5.8577e-01 1.2280e-01 9.2287e-02 4.6665e-02 2.0729e-02 1.4391e-02 1.0430e-01 +5.6800e-01 8.6536e+06 5.5315e+02 2.4224e+03 1.0750e-07 2.9945e-01 7.0055e-01 4.0396e+03 2.0684e+03 4.7430e+02 8.5100e+01 6.6568e-05 1.7582e-05 4.0957e-03 8.6717e-04 1.9397e-01 5.9797e-02 5.8530e-02 3.8426e-02 2.2006e-02 1.9804e-02 6.0251e-01 9.7345e-03 3.3194e-03 5.8573e-01 1.2281e-01 9.2299e-02 4.6675e-02 2.0734e-02 1.4396e-02 1.0430e-01 +5.7000e-01 8.6140e+06 5.5315e+02 2.4121e+03 1.0816e-07 2.9911e-01 7.0089e-01 4.0359e+03 2.0586e+03 4.7477e+02 8.4698e+01 6.6673e-05 1.7562e-05 4.0782e-03 8.6237e-04 1.9302e-01 5.9568e-02 5.8350e-02 3.8336e-02 2.1971e-02 1.9787e-02 6.0403e-01 9.7346e-03 3.3191e-03 5.8570e-01 1.2281e-01 9.2310e-02 4.6684e-02 2.0740e-02 1.4401e-02 1.0430e-01 +5.7200e-01 8.5744e+06 5.5315e+02 2.4017e+03 1.0883e-07 2.9876e-01 7.0124e-01 4.0322e+03 2.0488e+03 4.7524e+02 8.4296e+01 6.6778e-05 1.7543e-05 4.0607e-03 8.5759e-04 1.9207e-01 5.9338e-02 5.8169e-02 3.8246e-02 2.1935e-02 1.9769e-02 6.0556e-01 9.7346e-03 3.3186e-03 5.8566e-01 1.2282e-01 9.2322e-02 4.6694e-02 2.0746e-02 1.4406e-02 1.0430e-01 +5.7400e-01 8.5348e+06 5.5315e+02 2.3914e+03 1.0950e-07 2.9840e-01 7.0160e-01 4.0285e+03 2.0390e+03 4.7570e+02 8.3896e+01 6.6883e-05 1.7523e-05 4.0431e-03 8.5281e-04 1.9112e-01 5.9108e-02 5.7988e-02 3.8156e-02 2.1900e-02 1.9752e-02 6.0708e-01 9.7346e-03 3.3182e-03 5.8562e-01 1.2282e-01 9.2333e-02 4.6703e-02 2.0752e-02 1.4411e-02 1.0430e-01 +5.7600e-01 8.4952e+06 5.5315e+02 2.3810e+03 1.1019e-07 2.9804e-01 7.0196e-01 4.0248e+03 2.0291e+03 4.7617e+02 8.3497e+01 6.6988e-05 1.7504e-05 4.0256e-03 8.4804e-04 1.9017e-01 5.8877e-02 5.7806e-02 3.8065e-02 2.1864e-02 1.9733e-02 6.0861e-01 9.7346e-03 3.3178e-03 5.8558e-01 1.2283e-01 9.2344e-02 4.6713e-02 2.0758e-02 1.4416e-02 1.0431e-01 +5.7800e-01 8.4556e+06 5.5315e+02 2.3706e+03 1.1088e-07 2.9767e-01 7.0233e-01 4.0211e+03 2.0193e+03 4.7663e+02 8.3098e+01 6.7093e-05 1.7485e-05 4.0080e-03 8.4327e-04 1.8922e-01 5.8646e-02 5.7623e-02 3.7973e-02 2.1827e-02 1.9715e-02 6.1014e-01 9.7345e-03 3.3173e-03 5.8554e-01 1.2283e-01 9.2355e-02 4.6722e-02 2.0764e-02 1.4421e-02 1.0432e-01 +5.8000e-01 8.4160e+06 5.5315e+02 2.3602e+03 1.1158e-07 2.9729e-01 7.0271e-01 4.0174e+03 2.0095e+03 4.7709e+02 8.2700e+01 6.7198e-05 1.7465e-05 3.9904e-03 8.3852e-04 1.8827e-01 5.8414e-02 5.7439e-02 3.7881e-02 2.1790e-02 1.9696e-02 6.1168e-01 9.7345e-03 3.3169e-03 5.8549e-01 1.2284e-01 9.2366e-02 4.6732e-02 2.0769e-02 1.4426e-02 1.0433e-01 +5.8200e-01 8.3764e+06 5.5315e+02 2.3497e+03 1.1228e-07 2.9690e-01 7.0310e-01 4.0137e+03 1.9997e+03 4.7756e+02 8.2303e+01 6.7302e-05 1.7446e-05 3.9728e-03 8.3377e-04 1.8733e-01 5.8182e-02 5.7255e-02 3.7787e-02 2.1753e-02 1.9677e-02 6.1321e-01 9.7343e-03 3.3164e-03 5.8544e-01 1.2284e-01 9.2376e-02 4.6741e-02 2.0775e-02 1.4431e-02 1.0434e-01 +5.8400e-01 8.3368e+06 5.5315e+02 2.3393e+03 1.1300e-07 2.9650e-01 7.0350e-01 4.0100e+03 1.9899e+03 4.7802e+02 8.1907e+01 6.7407e-05 1.7427e-05 3.9552e-03 8.2903e-04 1.8638e-01 5.7949e-02 5.7069e-02 3.7694e-02 2.1715e-02 1.9657e-02 6.1475e-01 9.7342e-03 3.3159e-03 5.8539e-01 1.2284e-01 9.2387e-02 4.6751e-02 2.0781e-02 1.4437e-02 1.0436e-01 +5.8600e-01 8.2972e+06 5.5315e+02 2.3288e+03 1.1372e-07 2.9610e-01 7.0390e-01 4.0063e+03 1.9801e+03 4.7848e+02 8.1512e+01 6.7512e-05 1.7408e-05 3.9376e-03 8.2430e-04 1.8543e-01 5.7716e-02 5.6883e-02 3.7599e-02 2.1677e-02 1.9638e-02 6.1629e-01 9.7340e-03 3.3155e-03 5.8534e-01 1.2285e-01 9.2397e-02 4.6760e-02 2.0787e-02 1.4442e-02 1.0438e-01 +5.8800e-01 8.2576e+06 5.5315e+02 2.3183e+03 1.1445e-07 2.9568e-01 7.0432e-01 4.0026e+03 1.9703e+03 4.7894e+02 8.1117e+01 6.7617e-05 1.7389e-05 3.9199e-03 8.1957e-04 1.8449e-01 5.7482e-02 5.6697e-02 3.7504e-02 2.1638e-02 1.9617e-02 6.1784e-01 9.7338e-03 3.3150e-03 5.8529e-01 1.2285e-01 9.2407e-02 4.6769e-02 2.0793e-02 1.4448e-02 1.0440e-01 +5.9000e-01 8.2180e+06 5.5315e+02 2.3078e+03 1.1519e-07 2.9526e-01 7.0474e-01 3.9989e+03 1.9604e+03 4.7940e+02 8.0724e+01 6.7722e-05 1.7371e-05 3.9022e-03 8.1485e-04 1.8354e-01 5.7248e-02 5.6509e-02 3.7409e-02 2.1599e-02 1.9596e-02 6.1938e-01 9.7336e-03 3.3144e-03 5.8523e-01 1.2285e-01 9.2417e-02 4.6779e-02 2.0799e-02 1.4453e-02 1.0442e-01 +5.9200e-01 8.1784e+06 5.5315e+02 2.2973e+03 1.1594e-07 2.9483e-01 7.0517e-01 3.9952e+03 1.9506e+03 4.7986e+02 8.0331e+01 6.7827e-05 1.7352e-05 3.8845e-03 8.1014e-04 1.8259e-01 5.7014e-02 5.6321e-02 3.7313e-02 2.1560e-02 1.9575e-02 6.2093e-01 9.7333e-03 3.3139e-03 5.8517e-01 1.2285e-01 9.2427e-02 4.6788e-02 2.0805e-02 1.4458e-02 1.0444e-01 +5.9400e-01 8.1388e+06 5.5315e+02 2.2867e+03 1.1670e-07 2.9439e-01 7.0561e-01 3.9915e+03 1.9409e+03 4.8032e+02 7.9939e+01 6.7931e-05 1.7333e-05 3.8668e-03 8.0544e-04 1.8165e-01 5.6779e-02 5.6132e-02 3.7216e-02 2.1520e-02 1.9554e-02 6.2248e-01 9.7330e-03 3.3134e-03 5.8512e-01 1.2286e-01 9.2436e-02 4.6797e-02 2.0811e-02 1.4464e-02 1.0447e-01 +5.9600e-01 8.0992e+06 5.5315e+02 2.2761e+03 1.1746e-07 2.9394e-01 7.0606e-01 3.9878e+03 1.9311e+03 4.8077e+02 7.9547e+01 6.8036e-05 1.7315e-05 3.8491e-03 8.0075e-04 1.8070e-01 5.6544e-02 5.5942e-02 3.7118e-02 2.1480e-02 1.9532e-02 6.2403e-01 9.7327e-03 3.3128e-03 5.8505e-01 1.2286e-01 9.2446e-02 4.6807e-02 2.0818e-02 1.4470e-02 1.0450e-01 +5.9800e-01 8.0596e+06 5.5315e+02 2.2655e+03 1.1824e-07 2.9348e-01 7.0652e-01 3.9841e+03 1.9213e+03 4.8123e+02 7.9157e+01 6.8141e-05 1.7296e-05 3.8314e-03 7.9606e-04 1.7976e-01 5.6308e-02 5.5752e-02 3.7020e-02 2.1439e-02 1.9510e-02 6.2558e-01 9.7323e-03 3.3123e-03 5.8499e-01 1.2286e-01 9.2455e-02 4.6816e-02 2.0824e-02 1.4475e-02 1.0454e-01 +6.0000e-01 8.0200e+06 5.5315e+02 2.2549e+03 1.1902e-07 2.9301e-01 7.0699e-01 3.9803e+03 1.9115e+03 4.8169e+02 7.8767e+01 6.8246e-05 1.7278e-05 3.8136e-03 7.9138e-04 1.7882e-01 5.6072e-02 5.5560e-02 3.6921e-02 2.1398e-02 1.9487e-02 6.2714e-01 9.7319e-03 3.3117e-03 5.8492e-01 1.2286e-01 9.2464e-02 4.6825e-02 2.0830e-02 1.4481e-02 1.0457e-01 +6.0200e-01 7.9804e+06 5.5315e+02 2.2443e+03 1.1982e-07 2.9254e-01 7.0746e-01 3.9766e+03 1.9017e+03 4.8214e+02 7.8378e+01 6.8351e-05 1.7259e-05 3.7958e-03 7.8671e-04 1.7787e-01 5.5835e-02 5.5368e-02 3.6821e-02 2.1356e-02 1.9464e-02 6.2870e-01 9.7315e-03 3.3111e-03 5.8486e-01 1.2286e-01 9.2473e-02 4.6834e-02 2.0836e-02 1.4487e-02 1.0461e-01 +6.0400e-01 7.9408e+06 5.5315e+02 2.2336e+03 1.2062e-07 2.9205e-01 7.0795e-01 3.9729e+03 1.8919e+03 4.8260e+02 7.7990e+01 6.8456e-05 1.7241e-05 3.7780e-03 7.8205e-04 1.7693e-01 5.5597e-02 5.5175e-02 3.6721e-02 2.1314e-02 1.9440e-02 6.3026e-01 9.7310e-03 3.3105e-03 5.8479e-01 1.2286e-01 9.2481e-02 4.6843e-02 2.0842e-02 1.4492e-02 1.0465e-01 +6.0600e-01 7.9012e+06 5.5315e+02 2.2229e+03 1.2144e-07 2.9155e-01 7.0845e-01 3.9692e+03 1.8821e+03 4.8305e+02 7.7602e+01 6.8560e-05 1.7223e-05 3.7602e-03 7.7739e-04 1.7599e-01 5.5360e-02 5.4982e-02 3.6620e-02 2.1272e-02 1.9416e-02 6.3183e-01 9.7306e-03 3.3099e-03 5.8471e-01 1.2286e-01 9.2490e-02 4.6852e-02 2.0848e-02 1.4498e-02 1.0470e-01 +6.0800e-01 7.8616e+06 5.5315e+02 2.2122e+03 1.2226e-07 2.9105e-01 7.0895e-01 3.9655e+03 1.8724e+03 4.8351e+02 7.7216e+01 6.8665e-05 1.7204e-05 3.7424e-03 7.7274e-04 1.7504e-01 5.5121e-02 5.4787e-02 3.6519e-02 2.1229e-02 1.9392e-02 6.3339e-01 9.7300e-03 3.3093e-03 5.8464e-01 1.2286e-01 9.2498e-02 4.6861e-02 2.0854e-02 1.4504e-02 1.0474e-01 +6.1000e-01 7.8220e+06 5.5315e+02 2.2015e+03 1.2309e-07 2.9053e-01 7.0947e-01 3.9618e+03 1.8626e+03 4.8396e+02 7.6830e+01 6.8770e-05 1.7186e-05 3.7245e-03 7.6810e-04 1.7410e-01 5.4883e-02 5.4592e-02 3.6416e-02 2.1186e-02 1.9367e-02 6.3496e-01 9.7295e-03 3.3086e-03 5.8456e-01 1.2286e-01 9.2506e-02 4.6870e-02 2.0860e-02 1.4510e-02 1.0479e-01 +6.1200e-01 7.7824e+06 5.5315e+02 2.1908e+03 1.2394e-07 2.9001e-01 7.0999e-01 3.9581e+03 1.8528e+03 4.8441e+02 7.6444e+01 6.8875e-05 1.7168e-05 3.7067e-03 7.6347e-04 1.7316e-01 5.4644e-02 5.4396e-02 3.6313e-02 2.1142e-02 1.9342e-02 6.3654e-01 9.7289e-03 3.3080e-03 5.8448e-01 1.2286e-01 9.2514e-02 4.6879e-02 2.0867e-02 1.4516e-02 1.0485e-01 +6.1400e-01 7.7428e+06 5.5315e+02 2.1800e+03 1.2479e-07 2.8947e-01 7.1053e-01 3.9544e+03 1.8431e+03 4.8487e+02 7.6060e+01 6.8980e-05 1.7150e-05 3.6888e-03 7.5884e-04 1.7222e-01 5.4404e-02 5.4199e-02 3.6210e-02 2.1098e-02 1.9316e-02 6.3811e-01 9.7283e-03 3.3073e-03 5.8440e-01 1.2285e-01 9.2521e-02 4.6888e-02 2.0873e-02 1.4522e-02 1.0490e-01 +6.1600e-01 7.7032e+06 5.5315e+02 2.1692e+03 1.2566e-07 2.8893e-01 7.1107e-01 3.9507e+03 1.8333e+03 4.8532e+02 7.5676e+01 6.9085e-05 1.7132e-05 3.6709e-03 7.5422e-04 1.7128e-01 5.4164e-02 5.4001e-02 3.6105e-02 2.1053e-02 1.9290e-02 6.3969e-01 9.7276e-03 3.3066e-03 5.8432e-01 1.2285e-01 9.2528e-02 4.6896e-02 2.0879e-02 1.4528e-02 1.0496e-01 +6.1800e-01 7.6636e+06 5.5315e+02 2.1584e+03 1.2653e-07 2.8838e-01 7.1162e-01 3.9470e+03 1.8236e+03 4.8577e+02 7.5293e+01 6.9189e-05 1.7114e-05 3.6530e-03 7.4961e-04 1.7033e-01 5.3923e-02 5.3803e-02 3.6000e-02 2.1008e-02 1.9263e-02 6.4127e-01 9.7269e-03 3.3059e-03 5.8424e-01 1.2285e-01 9.2536e-02 4.6905e-02 2.0885e-02 1.4534e-02 1.0502e-01 +6.2000e-01 7.6240e+06 5.5315e+02 2.1476e+03 1.2742e-07 2.8781e-01 7.1219e-01 3.9433e+03 1.8138e+03 4.8622e+02 7.4911e+01 6.9294e-05 1.7097e-05 3.6350e-03 7.4500e-04 1.6939e-01 5.3682e-02 5.3604e-02 3.5895e-02 2.0962e-02 1.9237e-02 6.4285e-01 9.7262e-03 3.3052e-03 5.8415e-01 1.2285e-01 9.2542e-02 4.6914e-02 2.0892e-02 1.4540e-02 1.0509e-01 +6.2200e-01 7.5844e+06 5.5315e+02 2.1367e+03 1.2832e-07 2.8724e-01 7.1276e-01 3.9396e+03 1.8040e+03 4.8667e+02 7.4530e+01 6.9399e-05 1.7079e-05 3.6171e-03 7.4040e-04 1.6845e-01 5.3440e-02 5.3404e-02 3.5788e-02 2.0916e-02 1.9209e-02 6.4443e-01 9.7255e-03 3.3045e-03 5.8406e-01 1.2284e-01 9.2549e-02 4.6922e-02 2.0898e-02 1.4546e-02 1.0515e-01 +6.2400e-01 7.5448e+06 5.5315e+02 2.1259e+03 1.2923e-07 2.8665e-01 7.1335e-01 3.9359e+03 1.7943e+03 4.8712e+02 7.4149e+01 6.9504e-05 1.7061e-05 3.5991e-03 7.3581e-04 1.6751e-01 5.3198e-02 5.3203e-02 3.5681e-02 2.0870e-02 1.9181e-02 6.4602e-01 9.7247e-03 3.3038e-03 5.8397e-01 1.2284e-01 9.2555e-02 4.6931e-02 2.0904e-02 1.4552e-02 1.0522e-01 +6.2600e-01 7.5052e+06 5.5315e+02 2.1150e+03 1.3015e-07 2.8605e-01 7.1395e-01 3.9321e+03 1.7846e+03 4.8757e+02 7.3769e+01 6.9609e-05 1.7043e-05 3.5811e-03 7.3123e-04 1.6657e-01 5.2956e-02 5.3001e-02 3.5573e-02 2.0823e-02 1.9153e-02 6.4761e-01 9.7238e-03 3.3031e-03 5.8387e-01 1.2283e-01 9.2562e-02 4.6939e-02 2.0910e-02 1.4559e-02 1.0530e-01 +6.2800e-01 7.4656e+06 5.5315e+02 2.1041e+03 1.3108e-07 2.8545e-01 7.1455e-01 3.9284e+03 1.7748e+03 4.8801e+02 7.3390e+01 6.9714e-05 1.7026e-05 3.5631e-03 7.2665e-04 1.6563e-01 5.2713e-02 5.2799e-02 3.5465e-02 2.0775e-02 1.9124e-02 6.4920e-01 9.7230e-03 3.3023e-03 5.8378e-01 1.2283e-01 9.2568e-02 4.6948e-02 2.0917e-02 1.4565e-02 1.0537e-01 +6.3000e-01 7.4260e+06 5.5315e+02 2.0931e+03 1.3203e-07 2.8483e-01 7.1517e-01 3.9247e+03 1.7651e+03 4.8846e+02 7.3011e+01 6.9818e-05 1.7008e-05 3.5451e-03 7.2208e-04 1.6469e-01 5.2469e-02 5.2595e-02 3.5356e-02 2.0727e-02 1.9095e-02 6.5080e-01 9.7221e-03 3.3015e-03 5.8368e-01 1.2282e-01 9.2573e-02 4.6956e-02 2.0923e-02 1.4571e-02 1.0545e-01 +6.3200e-01 7.3864e+06 5.5315e+02 2.0822e+03 1.3299e-07 2.8420e-01 7.1580e-01 3.9210e+03 1.7553e+03 4.8891e+02 7.2633e+01 6.9923e-05 1.6991e-05 3.5270e-03 7.1752e-04 1.6376e-01 5.2225e-02 5.2391e-02 3.5246e-02 2.0679e-02 1.9065e-02 6.5239e-01 9.7211e-03 3.3007e-03 5.8358e-01 1.2282e-01 9.2579e-02 4.6964e-02 2.0929e-02 1.4578e-02 1.0553e-01 +6.3400e-01 7.3468e+06 5.5315e+02 2.0712e+03 1.3396e-07 2.8356e-01 7.1644e-01 3.9173e+03 1.7456e+03 4.8935e+02 7.2256e+01 7.0028e-05 1.6973e-05 3.5089e-03 7.1296e-04 1.6282e-01 5.1981e-02 5.2186e-02 3.5135e-02 2.0630e-02 1.9035e-02 6.5399e-01 9.7201e-03 3.2999e-03 5.8347e-01 1.2281e-01 9.2584e-02 4.6972e-02 2.0935e-02 1.4584e-02 1.0562e-01 +6.3600e-01 7.3072e+06 5.5315e+02 2.0602e+03 1.3494e-07 2.8291e-01 7.1709e-01 3.9136e+03 1.7359e+03 4.8980e+02 7.1879e+01 7.0133e-05 1.6956e-05 3.4909e-03 7.0841e-04 1.6188e-01 5.1736e-02 5.1981e-02 3.5024e-02 2.0581e-02 1.9004e-02 6.5560e-01 9.7191e-03 3.2991e-03 5.8337e-01 1.2281e-01 9.2589e-02 4.6981e-02 2.0942e-02 1.4590e-02 1.0571e-01 +6.3800e-01 7.2676e+06 5.5315e+02 2.0492e+03 1.3593e-07 2.8225e-01 7.1775e-01 3.9099e+03 1.7262e+03 4.9024e+02 7.1504e+01 7.0238e-05 1.6938e-05 3.4728e-03 7.0387e-04 1.6094e-01 5.1490e-02 5.1774e-02 3.4912e-02 2.0531e-02 1.8973e-02 6.5720e-01 9.7181e-03 3.2983e-03 5.8326e-01 1.2280e-01 9.2593e-02 4.6989e-02 2.0948e-02 1.4597e-02 1.0580e-01 +6.4000e-01 7.2280e+06 5.5315e+02 2.0381e+03 1.3694e-07 2.8158e-01 7.1842e-01 3.9062e+03 1.7164e+03 4.9069e+02 7.1128e+01 7.0343e-05 1.6921e-05 3.4546e-03 6.9934e-04 1.6000e-01 5.1244e-02 5.1567e-02 3.4799e-02 2.0480e-02 1.8942e-02 6.5881e-01 9.7170e-03 3.2975e-03 5.8315e-01 1.2279e-01 9.2598e-02 4.6997e-02 2.0954e-02 1.4603e-02 1.0590e-01 +6.4200e-01 7.1884e+06 5.5315e+02 2.0271e+03 1.3797e-07 2.8089e-01 7.1911e-01 3.9025e+03 1.7067e+03 4.9113e+02 7.0754e+01 7.0447e-05 1.6904e-05 3.4365e-03 6.9481e-04 1.5907e-01 5.0998e-02 5.1359e-02 3.4685e-02 2.0430e-02 1.8910e-02 6.6042e-01 9.7158e-03 3.2966e-03 5.8303e-01 1.2278e-01 9.2602e-02 4.7004e-02 2.0961e-02 1.4610e-02 1.0600e-01 +6.4400e-01 7.1488e+06 5.5315e+02 2.0160e+03 1.3900e-07 2.8019e-01 7.1981e-01 3.8987e+03 1.6970e+03 4.9157e+02 7.0380e+01 7.0552e-05 1.6887e-05 3.4183e-03 6.9029e-04 1.5813e-01 5.0751e-02 5.1150e-02 3.4571e-02 2.0378e-02 1.8877e-02 6.6204e-01 9.7147e-03 3.2957e-03 5.8292e-01 1.2278e-01 9.2606e-02 4.7012e-02 2.0967e-02 1.4616e-02 1.0610e-01 +6.4600e-01 7.1092e+06 5.5315e+02 2.0049e+03 1.4005e-07 2.7948e-01 7.2052e-01 3.8950e+03 1.6873e+03 4.9202e+02 7.0007e+01 7.0657e-05 1.6870e-05 3.4002e-03 6.8577e-04 1.5719e-01 5.0503e-02 5.0940e-02 3.4456e-02 2.0326e-02 1.8844e-02 6.6365e-01 9.7135e-03 3.2948e-03 5.8280e-01 1.2277e-01 9.2609e-02 4.7020e-02 2.0973e-02 1.4623e-02 1.0620e-01 +6.4800e-01 7.0696e+06 5.5315e+02 1.9938e+03 1.4112e-07 2.7876e-01 7.2124e-01 3.8913e+03 1.6776e+03 4.9246e+02 6.9635e+01 7.0762e-05 1.6852e-05 3.3820e-03 6.8127e-04 1.5626e-01 5.0255e-02 5.0729e-02 3.4340e-02 2.0274e-02 1.8811e-02 6.6527e-01 9.7122e-03 3.2939e-03 5.8268e-01 1.2276e-01 9.2612e-02 4.7027e-02 2.0979e-02 1.4630e-02 1.0631e-01 +6.5000e-01 7.0300e+06 5.5315e+02 1.9826e+03 1.4219e-07 2.7803e-01 7.2197e-01 3.8876e+03 1.6679e+03 4.9290e+02 6.9263e+01 7.0867e-05 1.6835e-05 3.3637e-03 6.7677e-04 1.5532e-01 5.0007e-02 5.0517e-02 3.4224e-02 2.0221e-02 1.8777e-02 6.6689e-01 9.7109e-03 3.2930e-03 5.8255e-01 1.2275e-01 9.2615e-02 4.7035e-02 2.0986e-02 1.4636e-02 1.0642e-01 +6.5200e-01 6.9904e+06 5.5315e+02 1.9714e+03 1.4329e-07 2.7728e-01 7.2272e-01 3.8839e+03 1.6582e+03 4.9334e+02 6.8892e+01 7.0972e-05 1.6818e-05 3.3455e-03 6.7227e-04 1.5438e-01 4.9758e-02 5.0305e-02 3.4107e-02 2.0168e-02 1.8742e-02 6.6852e-01 9.7096e-03 3.2921e-03 5.8243e-01 1.2274e-01 9.2618e-02 4.7042e-02 2.0992e-02 1.4643e-02 1.0654e-01 +6.5400e-01 6.9508e+06 5.5315e+02 1.9602e+03 1.4440e-07 2.7652e-01 7.2348e-01 3.8802e+03 1.6485e+03 4.9378e+02 6.8522e+01 7.1077e-05 1.6801e-05 3.3273e-03 6.6779e-04 1.5345e-01 4.9509e-02 5.0092e-02 3.3989e-02 2.0114e-02 1.8707e-02 6.7015e-01 9.7082e-03 3.2912e-03 5.8230e-01 1.2273e-01 9.2620e-02 4.7050e-02 2.0998e-02 1.4650e-02 1.0666e-01 +6.5600e-01 6.9112e+06 5.5315e+02 1.9490e+03 1.4552e-07 2.7575e-01 7.2425e-01 3.8765e+03 1.6388e+03 4.9422e+02 6.8152e+01 7.1181e-05 1.6784e-05 3.3090e-03 6.6331e-04 1.5251e-01 4.9259e-02 4.9878e-02 3.3870e-02 2.0059e-02 1.8672e-02 6.7178e-01 9.7068e-03 3.2902e-03 5.8216e-01 1.2271e-01 9.2622e-02 4.7057e-02 2.1004e-02 1.4656e-02 1.0678e-01 +6.5800e-01 6.8716e+06 5.5315e+02 1.9378e+03 1.4666e-07 2.7496e-01 7.2504e-01 3.8727e+03 1.6291e+03 4.9466e+02 6.7783e+01 7.1286e-05 1.6767e-05 3.2907e-03 6.5883e-04 1.5158e-01 4.9008e-02 4.9663e-02 3.3750e-02 2.0005e-02 1.8636e-02 6.7341e-01 9.7053e-03 3.2892e-03 5.8203e-01 1.2270e-01 9.2624e-02 4.7064e-02 2.1011e-02 1.4663e-02 1.0691e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.9265e+03 1.4781e-07 2.7416e-01 7.2584e-01 3.8690e+03 1.6194e+03 4.9510e+02 6.7415e+01 7.1391e-05 1.6750e-05 3.2724e-03 6.5437e-04 1.5064e-01 4.8757e-02 4.9447e-02 3.3630e-02 1.9949e-02 1.8599e-02 6.7505e-01 9.7038e-03 3.2882e-03 5.8189e-01 1.2269e-01 9.2625e-02 4.7071e-02 2.1017e-02 1.4670e-02 1.0704e-01 +6.6200e-01 6.7924e+06 5.5315e+02 1.9152e+03 1.4898e-07 2.7335e-01 7.2665e-01 3.8653e+03 1.6097e+03 4.9554e+02 6.7047e+01 7.1496e-05 1.6734e-05 3.2541e-03 6.4991e-04 1.4971e-01 4.8506e-02 4.9230e-02 3.3509e-02 1.9893e-02 1.8562e-02 6.7669e-01 9.7023e-03 3.2872e-03 5.8175e-01 1.2268e-01 9.2626e-02 4.7078e-02 2.1023e-02 1.4677e-02 1.0718e-01 +6.6400e-01 6.7528e+06 5.5315e+02 1.9039e+03 1.5017e-07 2.7253e-01 7.2747e-01 3.8616e+03 1.6000e+03 4.9598e+02 6.6680e+01 7.1601e-05 1.6717e-05 3.2357e-03 6.4546e-04 1.4877e-01 4.8254e-02 4.9013e-02 3.3387e-02 1.9837e-02 1.8524e-02 6.7833e-01 9.7007e-03 3.2862e-03 5.8161e-01 1.2266e-01 9.2627e-02 4.7084e-02 2.1029e-02 1.4684e-02 1.0731e-01 +6.6600e-01 6.7132e+06 5.5315e+02 1.8926e+03 1.5138e-07 2.7169e-01 7.2831e-01 3.8579e+03 1.5904e+03 4.9642e+02 6.6313e+01 7.1706e-05 1.6700e-05 3.2173e-03 6.4101e-04 1.4784e-01 4.8001e-02 4.8794e-02 3.3265e-02 1.9780e-02 1.8486e-02 6.7998e-01 9.6990e-03 3.2852e-03 5.8146e-01 1.2265e-01 9.2627e-02 4.7091e-02 2.1035e-02 1.4691e-02 1.0746e-01 +6.6800e-01 6.6736e+06 5.5315e+02 1.8812e+03 1.5260e-07 2.7083e-01 7.2917e-01 3.8542e+03 1.5807e+03 4.9685e+02 6.5947e+01 7.1811e-05 1.6683e-05 3.1990e-03 6.3657e-04 1.4691e-01 4.7748e-02 4.8575e-02 3.3141e-02 1.9722e-02 1.8447e-02 6.8163e-01 9.6973e-03 3.2841e-03 5.8132e-01 1.2264e-01 9.2627e-02 4.7098e-02 2.1042e-02 1.4698e-02 1.0760e-01 +6.7000e-01 6.6340e+06 5.5315e+02 1.8698e+03 1.5384e-07 2.6996e-01 7.3004e-01 3.8505e+03 1.5710e+03 4.9729e+02 6.5582e+01 7.1916e-05 1.6666e-05 3.1806e-03 6.3214e-04 1.4597e-01 4.7495e-02 4.8355e-02 3.3017e-02 1.9664e-02 1.8408e-02 6.8328e-01 9.6956e-03 3.2830e-03 5.8116e-01 1.2262e-01 9.2627e-02 4.7104e-02 2.1048e-02 1.4705e-02 1.0775e-01 +6.7200e-01 6.5944e+06 5.5315e+02 1.8584e+03 1.5510e-07 2.6908e-01 7.3092e-01 3.8467e+03 1.5613e+03 4.9772e+02 6.5218e+01 7.2020e-05 1.6650e-05 3.1621e-03 6.2771e-04 1.4504e-01 4.7241e-02 4.8134e-02 3.2892e-02 1.9605e-02 1.8368e-02 6.8493e-01 9.6938e-03 3.2819e-03 5.8101e-01 1.2261e-01 9.2626e-02 4.7110e-02 2.1054e-02 1.4712e-02 1.0791e-01 +6.7400e-01 6.5548e+06 5.5315e+02 1.8470e+03 1.5637e-07 2.6818e-01 7.3182e-01 3.8430e+03 1.5517e+03 4.9816e+02 6.4854e+01 7.2125e-05 1.6633e-05 3.1437e-03 6.2329e-04 1.4411e-01 4.6986e-02 4.7912e-02 3.2766e-02 1.9546e-02 1.8328e-02 6.8659e-01 9.6920e-03 3.2808e-03 5.8085e-01 1.2259e-01 9.2625e-02 4.7116e-02 2.1060e-02 1.4719e-02 1.0807e-01 +6.7600e-01 6.5152e+06 5.5315e+02 1.8356e+03 1.5767e-07 2.6727e-01 7.3273e-01 3.8393e+03 1.5420e+03 4.9860e+02 6.4491e+01 7.2230e-05 1.6616e-05 3.1252e-03 6.1888e-04 1.4317e-01 4.6731e-02 4.7689e-02 3.2640e-02 1.9486e-02 1.8287e-02 6.8825e-01 9.6901e-03 3.2797e-03 5.8069e-01 1.2257e-01 9.2623e-02 4.7122e-02 2.1066e-02 1.4726e-02 1.0823e-01 +6.7800e-01 6.4756e+06 5.5315e+02 1.8241e+03 1.5898e-07 2.6634e-01 7.3366e-01 3.8356e+03 1.5324e+03 4.9903e+02 6.4128e+01 7.2335e-05 1.6600e-05 3.1068e-03 6.1447e-04 1.4224e-01 4.6476e-02 4.7465e-02 3.2513e-02 1.9426e-02 1.8246e-02 6.8991e-01 9.6882e-03 3.2786e-03 5.8053e-01 1.2255e-01 9.2622e-02 4.7128e-02 2.1072e-02 1.4733e-02 1.0840e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.8126e+03 1.6031e-07 2.6540e-01 7.3460e-01 3.8319e+03 1.5227e+03 4.9946e+02 6.3766e+01 7.2440e-05 1.6583e-05 3.0883e-03 6.1007e-04 1.4131e-01 4.6220e-02 4.7241e-02 3.2385e-02 1.9365e-02 1.8204e-02 6.9158e-01 9.6862e-03 3.2774e-03 5.8036e-01 1.2254e-01 9.2619e-02 4.7134e-02 2.1078e-02 1.4740e-02 1.0857e-01 +6.8200e-01 6.3964e+06 5.5315e+02 1.8011e+03 1.6166e-07 2.6444e-01 7.3556e-01 3.8282e+03 1.5130e+03 4.9990e+02 6.3404e+01 7.2545e-05 1.6567e-05 3.0697e-03 6.0568e-04 1.4038e-01 4.5963e-02 4.7016e-02 3.2256e-02 1.9304e-02 1.8161e-02 6.9325e-01 9.6841e-03 3.2762e-03 5.8019e-01 1.2252e-01 9.2617e-02 4.7139e-02 2.1084e-02 1.4747e-02 1.0874e-01 +6.8400e-01 6.3568e+06 5.5315e+02 1.7895e+03 1.6304e-07 2.6346e-01 7.3654e-01 3.8244e+03 1.5034e+03 5.0033e+02 6.3044e+01 7.2650e-05 1.6550e-05 3.0512e-03 6.0129e-04 1.3944e-01 4.5706e-02 4.6789e-02 3.2126e-02 1.9242e-02 1.8118e-02 6.9492e-01 9.6821e-03 3.2750e-03 5.8002e-01 1.2250e-01 9.2614e-02 4.7145e-02 2.1090e-02 1.4754e-02 1.0892e-01 +6.8600e-01 6.3172e+06 5.5315e+02 1.7780e+03 1.6443e-07 2.6247e-01 7.3753e-01 3.8207e+03 1.4938e+03 5.0076e+02 6.2683e+01 7.2754e-05 1.6534e-05 3.0327e-03 5.9691e-04 1.3851e-01 4.5448e-02 4.6562e-02 3.1995e-02 1.9179e-02 1.8074e-02 6.9660e-01 9.6799e-03 3.2738e-03 5.7984e-01 1.2248e-01 9.2610e-02 4.7150e-02 2.1096e-02 1.4761e-02 1.0911e-01 +6.8800e-01 6.2776e+06 5.5315e+02 1.7664e+03 1.6584e-07 2.6146e-01 7.3854e-01 3.8170e+03 1.4841e+03 5.0120e+02 6.2324e+01 7.2859e-05 1.6517e-05 3.0141e-03 5.9253e-04 1.3758e-01 4.5190e-02 4.6334e-02 3.1864e-02 1.9116e-02 1.8030e-02 6.9828e-01 9.6777e-03 3.2726e-03 5.7966e-01 1.2246e-01 9.2606e-02 4.7155e-02 2.1102e-02 1.4768e-02 1.0930e-01 +6.9000e-01 6.2380e+06 5.5315e+02 1.7548e+03 1.6728e-07 2.6043e-01 7.3957e-01 3.8133e+03 1.4745e+03 5.0163e+02 6.1965e+01 7.2964e-05 1.6501e-05 2.9955e-03 5.8817e-04 1.3665e-01 4.4932e-02 4.6105e-02 3.1732e-02 1.9052e-02 1.7985e-02 6.9996e-01 9.6755e-03 3.2713e-03 5.7948e-01 1.2244e-01 9.2602e-02 4.7160e-02 2.1108e-02 1.4775e-02 1.0949e-01 +6.9200e-01 6.1984e+06 5.5315e+02 1.7431e+03 1.6874e-07 2.5939e-01 7.4061e-01 3.8096e+03 1.4648e+03 5.0206e+02 6.1606e+01 7.3069e-05 1.6484e-05 2.9769e-03 5.8380e-04 1.3572e-01 4.4673e-02 4.5875e-02 3.1599e-02 1.8988e-02 1.7939e-02 7.0164e-01 9.6732e-03 3.2700e-03 5.7929e-01 1.2242e-01 9.2597e-02 4.7165e-02 2.1114e-02 1.4783e-02 1.0969e-01 +6.9400e-01 6.1588e+06 5.5315e+02 1.7315e+03 1.7022e-07 2.5832e-01 7.4168e-01 3.8058e+03 1.4552e+03 5.0249e+02 6.1248e+01 7.3174e-05 1.6468e-05 2.9582e-03 5.7945e-04 1.3479e-01 4.4413e-02 4.5644e-02 3.1465e-02 1.8923e-02 1.7893e-02 7.0333e-01 9.6708e-03 3.2688e-03 5.7910e-01 1.2239e-01 9.2592e-02 4.7169e-02 2.1120e-02 1.4790e-02 1.0989e-01 +6.9600e-01 6.1192e+06 5.5315e+02 1.7198e+03 1.7172e-07 2.5725e-01 7.4275e-01 3.8021e+03 1.4456e+03 5.0292e+02 6.0891e+01 7.3279e-05 1.6451e-05 2.9396e-03 5.7510e-04 1.3386e-01 4.4153e-02 4.5413e-02 3.1330e-02 1.8857e-02 1.7847e-02 7.0503e-01 9.6684e-03 3.2674e-03 5.7891e-01 1.2237e-01 9.2586e-02 4.7174e-02 2.1125e-02 1.4797e-02 1.1010e-01 +6.9800e-01 6.0796e+06 5.5315e+02 1.7081e+03 1.7325e-07 2.5615e-01 7.4385e-01 3.7984e+03 1.4360e+03 5.0335e+02 6.0535e+01 7.3384e-05 1.6435e-05 2.9209e-03 5.7076e-04 1.3293e-01 4.3892e-02 4.5180e-02 3.1195e-02 1.8791e-02 1.7799e-02 7.0672e-01 9.6659e-03 3.2661e-03 5.7871e-01 1.2235e-01 9.2580e-02 4.7178e-02 2.1131e-02 1.4804e-02 1.1032e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6964e+03 1.7480e-07 2.5503e-01 7.4497e-01 3.7947e+03 1.4263e+03 5.0378e+02 6.0179e+01 7.3489e-05 1.6418e-05 2.9022e-03 5.6642e-04 1.3200e-01 4.3631e-02 4.4946e-02 3.1059e-02 1.8725e-02 1.7751e-02 7.0842e-01 9.6634e-03 3.2648e-03 5.7851e-01 1.2232e-01 9.2573e-02 4.7182e-02 2.1137e-02 1.4812e-02 1.1054e-01 +7.0200e-01 6.0004e+06 5.5315e+02 1.6846e+03 1.7637e-07 2.5390e-01 7.4610e-01 3.7910e+03 1.4167e+03 5.0421e+02 5.9823e+01 7.3593e-05 1.6402e-05 2.8835e-03 5.6209e-04 1.3107e-01 4.3369e-02 4.4712e-02 3.0921e-02 1.8657e-02 1.7703e-02 7.1012e-01 9.6608e-03 3.2634e-03 5.7831e-01 1.2230e-01 9.2566e-02 4.7186e-02 2.1142e-02 1.4819e-02 1.1076e-01 +7.0400e-01 5.9608e+06 5.5315e+02 1.6728e+03 1.7797e-07 2.5274e-01 7.4726e-01 3.7873e+03 1.4071e+03 5.0464e+02 5.9468e+01 7.3698e-05 1.6385e-05 2.8648e-03 5.5777e-04 1.3014e-01 4.3107e-02 4.4477e-02 3.0783e-02 1.8589e-02 1.7654e-02 7.1183e-01 9.6582e-03 3.2620e-03 5.7810e-01 1.2227e-01 9.2558e-02 4.7189e-02 2.1148e-02 1.4826e-02 1.1099e-01 +7.0600e-01 5.9212e+06 5.5315e+02 1.6610e+03 1.7960e-07 2.5157e-01 7.4843e-01 3.7835e+03 1.3975e+03 5.0506e+02 5.9114e+01 7.3803e-05 1.6369e-05 2.8461e-03 5.5345e-04 1.2921e-01 4.2844e-02 4.4240e-02 3.0645e-02 1.8521e-02 1.7604e-02 7.1353e-01 9.6554e-03 3.2606e-03 5.7789e-01 1.2224e-01 9.2550e-02 4.7193e-02 2.1153e-02 1.4833e-02 1.1122e-01 +7.0800e-01 5.8816e+06 5.5315e+02 1.6492e+03 1.8125e-07 2.5037e-01 7.4963e-01 3.7798e+03 1.3879e+03 5.0549e+02 5.8760e+01 7.3908e-05 1.6353e-05 2.8273e-03 5.4914e-04 1.2828e-01 4.2581e-02 4.4003e-02 3.0505e-02 1.8452e-02 1.7553e-02 7.1525e-01 9.6527e-03 3.2591e-03 5.7767e-01 1.2221e-01 9.2541e-02 4.7196e-02 2.1159e-02 1.4841e-02 1.1146e-01 +7.1000e-01 5.8420e+06 5.5315e+02 1.6373e+03 1.8293e-07 2.4916e-01 7.5084e-01 3.7761e+03 1.3783e+03 5.0592e+02 5.8407e+01 7.4013e-05 1.6336e-05 2.8085e-03 5.4484e-04 1.2736e-01 4.2317e-02 4.3765e-02 3.0364e-02 1.8382e-02 1.7502e-02 7.1696e-01 9.6498e-03 3.2577e-03 5.7745e-01 1.2219e-01 9.2532e-02 4.7199e-02 2.1164e-02 1.4848e-02 1.1171e-01 +7.1200e-01 5.8024e+06 5.5315e+02 1.6255e+03 1.8463e-07 2.4792e-01 7.5208e-01 3.7724e+03 1.3687e+03 5.0635e+02 5.8055e+01 7.4118e-05 1.6320e-05 2.7897e-03 5.4054e-04 1.2643e-01 4.2052e-02 4.3526e-02 3.0223e-02 1.8312e-02 1.7450e-02 7.1868e-01 9.6469e-03 3.2562e-03 5.7723e-01 1.2216e-01 9.2522e-02 4.7202e-02 2.1170e-02 1.4855e-02 1.1196e-01 +7.1400e-01 5.7628e+06 5.5315e+02 1.6136e+03 1.8637e-07 2.4666e-01 7.5334e-01 3.7686e+03 1.3591e+03 5.0677e+02 5.7703e+01 7.4222e-05 1.6304e-05 2.7709e-03 5.3624e-04 1.2550e-01 4.1788e-02 4.3286e-02 3.0080e-02 1.8241e-02 1.7398e-02 7.2040e-01 9.6440e-03 3.2547e-03 5.7700e-01 1.2213e-01 9.2512e-02 4.7204e-02 2.1175e-02 1.4862e-02 1.1222e-01 +7.1600e-01 5.7232e+06 5.5315e+02 1.6017e+03 1.8813e-07 2.4538e-01 7.5462e-01 3.7649e+03 1.3495e+03 5.0720e+02 5.7351e+01 7.4327e-05 1.6287e-05 2.7520e-03 5.3196e-04 1.2457e-01 4.1522e-02 4.3045e-02 2.9937e-02 1.8169e-02 1.7345e-02 7.2213e-01 9.6409e-03 3.2532e-03 5.7677e-01 1.2210e-01 9.2501e-02 4.7207e-02 2.1180e-02 1.4870e-02 1.1248e-01 +7.1800e-01 5.6836e+06 5.5315e+02 1.5897e+03 1.8992e-07 2.4408e-01 7.5592e-01 3.7612e+03 1.3399e+03 5.0762e+02 5.7000e+01 7.4432e-05 1.6271e-05 2.7332e-03 5.2768e-04 1.2364e-01 4.1256e-02 4.2803e-02 2.9793e-02 1.8097e-02 1.7291e-02 7.2386e-01 9.6378e-03 3.2516e-03 5.7654e-01 1.2206e-01 9.2490e-02 4.7209e-02 2.1185e-02 1.4877e-02 1.1275e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5777e+03 1.9174e-07 2.4276e-01 7.5724e-01 3.7575e+03 1.3303e+03 5.0805e+02 5.6650e+01 7.4537e-05 1.6254e-05 2.7143e-03 5.2340e-04 1.2272e-01 4.0990e-02 4.2560e-02 2.9648e-02 1.8024e-02 1.7237e-02 7.2559e-01 9.6346e-03 3.2500e-03 5.7630e-01 1.2203e-01 9.2478e-02 4.7211e-02 2.1190e-02 1.4884e-02 1.1303e-01 +7.2200e-01 5.6044e+06 5.5315e+02 1.5658e+03 1.9359e-07 2.4141e-01 7.5859e-01 3.7538e+03 1.3208e+03 5.0847e+02 5.6300e+01 7.4642e-05 1.6238e-05 2.6954e-03 5.1914e-04 1.2179e-01 4.0723e-02 4.2317e-02 2.9502e-02 1.7950e-02 1.7181e-02 7.2732e-01 9.6314e-03 3.2484e-03 5.7605e-01 1.2200e-01 9.2465e-02 4.7212e-02 2.1195e-02 1.4892e-02 1.1331e-01 +7.2400e-01 5.5648e+06 5.5315e+02 1.5537e+03 1.9548e-07 2.4004e-01 7.5996e-01 3.7500e+03 1.3112e+03 5.0890e+02 5.5951e+01 7.4746e-05 1.6221e-05 2.6765e-03 5.1488e-04 1.2086e-01 4.0455e-02 4.2072e-02 2.9356e-02 1.7876e-02 1.7126e-02 7.2906e-01 9.6281e-03 3.2468e-03 5.7580e-01 1.2196e-01 9.2452e-02 4.7213e-02 2.1200e-02 1.4899e-02 1.1359e-01 +7.2600e-01 5.5252e+06 5.5315e+02 1.5417e+03 1.9739e-07 2.3864e-01 7.6136e-01 3.7463e+03 1.3016e+03 5.0932e+02 5.5602e+01 7.4851e-05 1.6205e-05 2.6575e-03 5.1062e-04 1.1994e-01 4.0187e-02 4.1826e-02 2.9208e-02 1.7801e-02 1.7069e-02 7.3080e-01 9.6247e-03 3.2452e-03 5.7555e-01 1.2193e-01 9.2438e-02 4.7214e-02 2.1205e-02 1.4906e-02 1.1389e-01 +7.2800e-01 5.4856e+06 5.5315e+02 1.5296e+03 1.9934e-07 2.3722e-01 7.6278e-01 3.7426e+03 1.2920e+03 5.0975e+02 5.5254e+01 7.4956e-05 1.6189e-05 2.6386e-03 5.0637e-04 1.1901e-01 3.9918e-02 4.1580e-02 2.9060e-02 1.7726e-02 1.7012e-02 7.3255e-01 9.6212e-03 3.2435e-03 5.7529e-01 1.2189e-01 9.2423e-02 4.7215e-02 2.1210e-02 1.4913e-02 1.1419e-01 +7.3000e-01 5.4460e+06 5.5315e+02 1.5175e+03 2.0132e-07 2.3578e-01 7.6422e-01 3.7389e+03 1.2825e+03 5.1017e+02 5.4906e+01 7.5061e-05 1.6172e-05 2.6196e-03 5.0213e-04 1.1808e-01 3.9649e-02 4.1332e-02 2.8910e-02 1.7650e-02 1.6954e-02 7.3430e-01 9.6176e-03 3.2418e-03 5.7503e-01 1.2186e-01 9.2408e-02 4.7216e-02 2.1215e-02 1.4921e-02 1.1450e-01 +7.3200e-01 5.4064e+06 5.5315e+02 1.5054e+03 2.0334e-07 2.3431e-01 7.6569e-01 3.7352e+03 1.2729e+03 5.1059e+02 5.4559e+01 7.5166e-05 1.6156e-05 2.6006e-03 4.9789e-04 1.1716e-01 3.9379e-02 4.1084e-02 2.8760e-02 1.7573e-02 1.6895e-02 7.3605e-01 9.6140e-03 3.2401e-03 5.7476e-01 1.2182e-01 9.2392e-02 4.7216e-02 2.1219e-02 1.4928e-02 1.1481e-01 +7.3400e-01 5.3668e+06 5.5315e+02 1.4933e+03 2.0539e-07 2.3281e-01 7.6719e-01 3.7314e+03 1.2634e+03 5.1102e+02 5.4213e+01 7.5270e-05 1.6139e-05 2.5816e-03 4.9366e-04 1.1623e-01 3.9109e-02 4.0834e-02 2.8609e-02 1.7495e-02 1.6836e-02 7.3781e-01 9.6103e-03 3.2383e-03 5.7449e-01 1.2178e-01 9.2375e-02 4.7216e-02 2.1224e-02 1.4935e-02 1.1513e-01 +7.3600e-01 5.3272e+06 5.5315e+02 1.4811e+03 2.0748e-07 2.3129e-01 7.6871e-01 3.7277e+03 1.2538e+03 5.1144e+02 5.3867e+01 7.5375e-05 1.6123e-05 2.5625e-03 4.8943e-04 1.1531e-01 3.8838e-02 4.0584e-02 2.8456e-02 1.7417e-02 1.6776e-02 7.3957e-01 9.6065e-03 3.2365e-03 5.7421e-01 1.2174e-01 9.2358e-02 4.7215e-02 2.1228e-02 1.4942e-02 1.1546e-01 +7.3800e-01 5.2876e+06 5.5315e+02 1.4690e+03 2.0961e-07 2.2974e-01 7.7026e-01 3.7240e+03 1.2442e+03 5.1186e+02 5.3522e+01 7.5480e-05 1.6106e-05 2.5435e-03 4.8522e-04 1.1438e-01 3.8567e-02 4.0332e-02 2.8303e-02 1.7338e-02 1.6715e-02 7.4133e-01 9.6027e-03 3.2347e-03 5.7393e-01 1.2170e-01 9.2340e-02 4.7214e-02 2.1232e-02 1.4949e-02 1.1580e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4568e+03 2.1177e-07 2.2816e-01 7.7184e-01 3.7203e+03 1.2347e+03 5.1228e+02 5.3177e+01 7.5584e-05 1.6090e-05 2.5244e-03 4.8100e-04 1.1346e-01 3.8295e-02 4.0080e-02 2.8149e-02 1.7259e-02 1.6654e-02 7.4310e-01 9.5987e-03 3.2329e-03 5.7365e-01 1.2165e-01 9.2321e-02 4.7213e-02 2.1237e-02 1.4956e-02 1.1614e-01 +7.4200e-01 5.2084e+06 5.5315e+02 1.4445e+03 2.1397e-07 2.2655e-01 7.7345e-01 3.7165e+03 1.2252e+03 5.1270e+02 5.2832e+01 7.5689e-05 1.6073e-05 2.5053e-03 4.7679e-04 1.1253e-01 3.8023e-02 3.9826e-02 2.7994e-02 1.7179e-02 1.6592e-02 7.4487e-01 9.5947e-03 3.2310e-03 5.7335e-01 1.2161e-01 9.2302e-02 4.7212e-02 2.1241e-02 1.4963e-02 1.1649e-01 +7.4400e-01 5.1688e+06 5.5315e+02 1.4323e+03 2.1622e-07 2.2491e-01 7.7509e-01 3.7128e+03 1.2156e+03 5.1312e+02 5.2488e+01 7.5794e-05 1.6056e-05 2.4862e-03 4.7259e-04 1.1161e-01 3.7750e-02 3.9572e-02 2.7838e-02 1.7098e-02 1.6529e-02 7.4665e-01 9.5905e-03 3.2291e-03 5.7306e-01 1.2157e-01 9.2281e-02 4.7210e-02 2.1245e-02 1.4970e-02 1.1685e-01 +7.4600e-01 5.1292e+06 5.5315e+02 1.4200e+03 2.1850e-07 2.2325e-01 7.7675e-01 3.7091e+03 1.2061e+03 5.1354e+02 5.2145e+01 7.5899e-05 1.6040e-05 2.4671e-03 4.6840e-04 1.1068e-01 3.7476e-02 3.9317e-02 2.7682e-02 1.7016e-02 1.6465e-02 7.4843e-01 9.5863e-03 3.2272e-03 5.7275e-01 1.2152e-01 9.2260e-02 4.7208e-02 2.1249e-02 1.4978e-02 1.1722e-01 +7.4800e-01 5.0896e+06 5.5315e+02 1.4077e+03 2.2083e-07 2.2155e-01 7.7845e-01 3.7054e+03 1.1965e+03 5.1396e+02 5.1802e+01 7.6003e-05 1.6023e-05 2.4479e-03 4.6421e-04 1.0976e-01 3.7202e-02 3.9060e-02 2.7524e-02 1.6934e-02 1.6400e-02 7.5021e-01 9.5820e-03 3.2253e-03 5.7245e-01 1.2148e-01 9.2238e-02 4.7206e-02 2.1252e-02 1.4985e-02 1.1759e-01 +7.5000e-01 5.0500e+06 5.5315e+02 1.3954e+03 2.2320e-07 2.1982e-01 7.8018e-01 3.7016e+03 1.1870e+03 5.1438e+02 5.1460e+01 7.6108e-05 1.6006e-05 2.4288e-03 4.6003e-04 1.0883e-01 3.6928e-02 3.8803e-02 2.7365e-02 1.6851e-02 1.6335e-02 7.5200e-01 9.5776e-03 3.2233e-03 5.7213e-01 1.2143e-01 9.2216e-02 4.7203e-02 2.1256e-02 1.4991e-02 1.1797e-01 +7.5200e-01 5.0104e+06 5.5315e+02 1.3830e+03 2.2561e-07 2.1805e-01 7.8195e-01 3.6979e+03 1.1775e+03 5.1480e+02 5.1118e+01 7.6212e-05 1.5990e-05 2.4096e-03 4.5585e-04 1.0791e-01 3.6653e-02 3.8545e-02 2.7206e-02 1.6767e-02 1.6269e-02 7.5379e-01 9.5731e-03 3.2212e-03 5.7181e-01 1.2138e-01 9.2192e-02 4.7200e-02 2.1259e-02 1.4998e-02 1.1836e-01 +7.5400e-01 4.9708e+06 5.5315e+02 1.3707e+03 2.2807e-07 2.1626e-01 7.8374e-01 3.6942e+03 1.1680e+03 5.1522e+02 5.0777e+01 7.6317e-05 1.5973e-05 2.3903e-03 4.5168e-04 1.0699e-01 3.6377e-02 3.8285e-02 2.7045e-02 1.6682e-02 1.6202e-02 7.5558e-01 9.5685e-03 3.2192e-03 5.7149e-01 1.2133e-01 9.2167e-02 4.7196e-02 2.1263e-02 1.5005e-02 1.1876e-01 +7.5600e-01 4.9312e+06 5.5315e+02 1.3583e+03 2.3058e-07 2.1443e-01 7.8557e-01 3.6905e+03 1.1585e+03 5.1564e+02 5.0436e+01 7.6422e-05 1.5956e-05 2.3711e-03 4.4751e-04 1.0606e-01 3.6101e-02 3.8025e-02 2.6883e-02 1.6597e-02 1.6134e-02 7.5738e-01 9.5638e-03 3.2171e-03 5.7116e-01 1.2128e-01 9.2142e-02 4.7192e-02 2.1266e-02 1.5012e-02 1.1917e-01 +7.5800e-01 4.8916e+06 5.5315e+02 1.3459e+03 2.3313e-07 2.1257e-01 7.8743e-01 3.6867e+03 1.1489e+03 5.1606e+02 5.0096e+01 7.6526e-05 1.5939e-05 2.3519e-03 4.4335e-04 1.0514e-01 3.5824e-02 3.7764e-02 2.6721e-02 1.6511e-02 1.6066e-02 7.5918e-01 9.5590e-03 3.2150e-03 5.7082e-01 1.2122e-01 9.2116e-02 4.7188e-02 2.1269e-02 1.5019e-02 1.1959e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3334e+03 2.3574e-07 2.1067e-01 7.8933e-01 3.6830e+03 1.1394e+03 5.1647e+02 4.9756e+01 7.6631e-05 1.5922e-05 2.3326e-03 4.3920e-04 1.0422e-01 3.5547e-02 3.7502e-02 2.6557e-02 1.6425e-02 1.5997e-02 7.6098e-01 9.5541e-03 3.2128e-03 5.7048e-01 1.2117e-01 9.2089e-02 4.7183e-02 2.1272e-02 1.5025e-02 1.2002e-01 +7.6200e-01 4.8124e+06 5.5315e+02 1.3210e+03 2.3839e-07 2.0873e-01 7.9127e-01 3.6793e+03 1.1299e+03 5.1689e+02 4.9417e+01 7.6735e-05 1.5905e-05 2.3133e-03 4.3505e-04 1.0329e-01 3.5269e-02 3.7238e-02 2.6393e-02 1.6337e-02 1.5926e-02 7.6279e-01 9.5491e-03 3.2106e-03 5.7013e-01 1.2111e-01 9.2060e-02 4.7177e-02 2.1275e-02 1.5032e-02 1.2045e-01 +7.6400e-01 4.7728e+06 5.5315e+02 1.3085e+03 2.4110e-07 2.0676e-01 7.9324e-01 3.6755e+03 1.1204e+03 5.1731e+02 4.9078e+01 7.6840e-05 1.5888e-05 2.2940e-03 4.3091e-04 1.0237e-01 3.4990e-02 3.6974e-02 2.6227e-02 1.6249e-02 1.5855e-02 7.6461e-01 9.5440e-03 3.2084e-03 5.6977e-01 1.2106e-01 9.2031e-02 4.7172e-02 2.1277e-02 1.5039e-02 1.2090e-01 +7.6600e-01 4.7332e+06 5.5315e+02 1.2960e+03 2.4386e-07 2.0475e-01 7.9525e-01 3.6718e+03 1.1109e+03 5.1773e+02 4.8740e+01 7.6944e-05 1.5871e-05 2.2747e-03 4.2677e-04 1.0145e-01 3.4711e-02 3.6709e-02 2.6061e-02 1.6160e-02 1.5784e-02 7.6642e-01 9.5388e-03 3.2061e-03 5.6941e-01 1.2100e-01 9.2001e-02 4.7165e-02 2.1280e-02 1.5045e-02 1.2136e-01 +7.6800e-01 4.6936e+06 5.5315e+02 1.2835e+03 2.4667e-07 2.0269e-01 7.9731e-01 3.6681e+03 1.1014e+03 5.1814e+02 4.8402e+01 7.7049e-05 1.5854e-05 2.2553e-03 4.2264e-04 1.0053e-01 3.4432e-02 3.6442e-02 2.5893e-02 1.6071e-02 1.5711e-02 7.6825e-01 9.5334e-03 3.2038e-03 5.6904e-01 1.2094e-01 9.1970e-02 4.7159e-02 2.1282e-02 1.5052e-02 1.2182e-01 +7.7000e-01 4.6540e+06 5.5315e+02 1.2709e+03 2.4954e-07 2.0060e-01 7.9940e-01 3.6644e+03 1.0919e+03 5.1856e+02 4.8065e+01 7.7153e-05 1.5837e-05 2.2360e-03 4.1852e-04 9.9605e-02 3.4152e-02 3.6175e-02 2.5725e-02 1.5980e-02 1.5638e-02 7.7007e-01 9.5280e-03 3.2015e-03 5.6866e-01 1.2088e-01 9.1937e-02 4.7151e-02 2.1284e-02 1.5058e-02 1.2230e-01 +7.7200e-01 4.6144e+06 5.5315e+02 1.2583e+03 2.5247e-07 1.9847e-01 8.0153e-01 3.6606e+03 1.0824e+03 5.1897e+02 4.7728e+01 7.7258e-05 1.5819e-05 2.2166e-03 4.1440e-04 9.8684e-02 3.3871e-02 3.5907e-02 2.5555e-02 1.5889e-02 1.5563e-02 7.7190e-01 9.5224e-03 3.1991e-03 5.6828e-01 1.2082e-01 9.1904e-02 4.7144e-02 2.1286e-02 1.5064e-02 1.2279e-01 +7.7400e-01 4.5748e+06 5.5315e+02 1.2458e+03 2.5546e-07 1.9629e-01 8.0371e-01 3.6569e+03 1.0730e+03 5.1939e+02 4.7392e+01 7.7362e-05 1.5802e-05 2.1972e-03 4.1028e-04 9.7762e-02 3.3590e-02 3.5637e-02 2.5385e-02 1.5797e-02 1.5488e-02 7.7373e-01 9.5167e-03 3.1967e-03 5.6789e-01 1.2075e-01 9.1870e-02 4.7135e-02 2.1288e-02 1.5071e-02 1.2328e-01 +7.7600e-01 4.5352e+06 5.5315e+02 1.2331e+03 2.5852e-07 1.9407e-01 8.0593e-01 3.6532e+03 1.0635e+03 5.1980e+02 4.7056e+01 7.7466e-05 1.5785e-05 2.1777e-03 4.0618e-04 9.6841e-02 3.3308e-02 3.5367e-02 2.5214e-02 1.5704e-02 1.5412e-02 7.7557e-01 9.5109e-03 3.1942e-03 5.6749e-01 1.2069e-01 9.1834e-02 4.7127e-02 2.1289e-02 1.5077e-02 1.2379e-01 +7.7800e-01 4.4956e+06 5.5315e+02 1.2205e+03 2.6163e-07 1.9181e-01 8.0819e-01 3.6494e+03 1.0540e+03 5.2022e+02 4.6721e+01 7.7571e-05 1.5767e-05 2.1583e-03 4.0208e-04 9.5920e-02 3.3026e-02 3.5095e-02 2.5041e-02 1.5611e-02 1.5335e-02 7.7741e-01 9.5049e-03 3.1917e-03 5.6708e-01 1.2062e-01 9.1797e-02 4.7117e-02 2.1290e-02 1.5083e-02 1.2431e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.2078e+03 2.6481e-07 1.8950e-01 8.1050e-01 3.6457e+03 1.0445e+03 5.2063e+02 4.6386e+01 7.7675e-05 1.5750e-05 2.1388e-03 3.9798e-04 9.4999e-02 3.2743e-02 3.4823e-02 2.4868e-02 1.5517e-02 1.5258e-02 7.7926e-01 9.4988e-03 3.1892e-03 5.6667e-01 1.2055e-01 9.1759e-02 4.7107e-02 2.1291e-02 1.5089e-02 1.2485e-01 +7.8200e-01 4.4164e+06 5.5315e+02 1.1952e+03 2.6806e-07 1.8714e-01 8.1286e-01 3.6420e+03 1.0351e+03 5.2105e+02 4.6052e+01 7.7779e-05 1.5732e-05 2.1194e-03 3.9389e-04 9.4079e-02 3.2460e-02 3.4549e-02 2.4693e-02 1.5422e-02 1.5179e-02 7.8111e-01 9.4926e-03 3.1866e-03 5.6625e-01 1.2048e-01 9.1720e-02 4.7097e-02 2.1292e-02 1.5094e-02 1.2539e-01 +7.8400e-01 4.3768e+06 5.5315e+02 1.1825e+03 2.7138e-07 1.8473e-01 8.1527e-01 3.6383e+03 1.0256e+03 5.2146e+02 4.5718e+01 7.7884e-05 1.5714e-05 2.0998e-03 3.8981e-04 9.3159e-02 3.2176e-02 3.4275e-02 2.4518e-02 1.5326e-02 1.5099e-02 7.8296e-01 9.4863e-03 3.1839e-03 5.6582e-01 1.2041e-01 9.1679e-02 4.7086e-02 2.1293e-02 1.5100e-02 1.2595e-01 +7.8600e-01 4.3372e+06 5.5315e+02 1.1698e+03 2.7477e-07 1.8227e-01 8.1773e-01 3.6345e+03 1.0162e+03 5.2188e+02 4.5385e+01 7.7988e-05 1.5696e-05 2.0803e-03 3.8573e-04 9.2238e-02 3.1891e-02 3.3999e-02 2.4341e-02 1.5229e-02 1.5019e-02 7.8482e-01 9.4798e-03 3.1813e-03 5.6538e-01 1.2033e-01 9.1637e-02 4.7074e-02 2.1293e-02 1.5106e-02 1.2652e-01 +7.8800e-01 4.2976e+06 5.5315e+02 1.1570e+03 2.7823e-07 1.7976e-01 8.2024e-01 3.6308e+03 1.0067e+03 5.2229e+02 4.5052e+01 7.8092e-05 1.5679e-05 2.0608e-03 3.8165e-04 9.1319e-02 3.1606e-02 3.3722e-02 2.4163e-02 1.5132e-02 1.4937e-02 7.8668e-01 9.4731e-03 3.1785e-03 5.6493e-01 1.2026e-01 9.1594e-02 4.7062e-02 2.1293e-02 1.5111e-02 1.2710e-01 +7.9000e-01 4.2580e+06 5.5315e+02 1.1443e+03 2.8177e-07 1.7720e-01 8.2280e-01 3.6271e+03 9.9724e+02 5.2270e+02 4.4719e+01 7.8196e-05 1.5661e-05 2.0412e-03 3.7759e-04 9.0399e-02 3.1321e-02 3.3445e-02 2.3985e-02 1.5033e-02 1.4855e-02 7.8854e-01 9.4663e-03 3.1757e-03 5.6447e-01 1.2018e-01 9.1549e-02 4.7049e-02 2.1293e-02 1.5116e-02 1.2770e-01 +7.9200e-01 4.2184e+06 5.5315e+02 1.1315e+03 2.8538e-07 1.7458e-01 8.2542e-01 3.6233e+03 9.8780e+02 5.2312e+02 4.4387e+01 7.8300e-05 1.5642e-05 2.0216e-03 3.7353e-04 8.9479e-02 3.1034e-02 3.3166e-02 2.3805e-02 1.4934e-02 1.4772e-02 7.9041e-01 9.4594e-03 3.1729e-03 5.6401e-01 1.2010e-01 9.1503e-02 4.7035e-02 2.1293e-02 1.5122e-02 1.2830e-01 +7.9400e-01 4.1788e+06 5.5315e+02 1.1187e+03 2.8908e-07 1.7191e-01 8.2809e-01 3.6196e+03 9.7835e+02 5.2353e+02 4.4056e+01 7.8404e-05 1.5624e-05 2.0020e-03 3.6947e-04 8.8560e-02 3.0748e-02 3.2886e-02 2.3624e-02 1.4834e-02 1.4688e-02 7.9229e-01 9.4523e-03 3.1700e-03 5.6353e-01 1.2002e-01 9.1456e-02 4.7020e-02 2.1292e-02 1.5127e-02 1.2893e-01 +7.9600e-01 4.1392e+06 5.5315e+02 1.1059e+03 2.9286e-07 1.6918e-01 8.3082e-01 3.6159e+03 9.6892e+02 5.2394e+02 4.3725e+01 7.8508e-05 1.5606e-05 1.9824e-03 3.6542e-04 8.7641e-02 3.0460e-02 3.2605e-02 2.3442e-02 1.4734e-02 1.4602e-02 7.9417e-01 9.4450e-03 3.1671e-03 5.6305e-01 1.1994e-01 9.1407e-02 4.7005e-02 2.1291e-02 1.5132e-02 1.2957e-01 +7.9800e-01 4.0996e+06 5.5315e+02 1.0930e+03 2.9673e-07 1.6638e-01 8.3362e-01 3.6121e+03 9.5948e+02 5.2435e+02 4.3394e+01 7.8612e-05 1.5587e-05 1.9628e-03 3.6138e-04 8.6722e-02 3.0173e-02 3.2323e-02 2.3259e-02 1.4632e-02 1.4516e-02 7.9605e-01 9.4376e-03 3.1641e-03 5.6256e-01 1.1985e-01 9.1356e-02 4.6989e-02 2.1290e-02 1.5136e-02 1.3022e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0802e+03 3.0068e-07 1.6353e-01 8.3647e-01 3.6084e+03 9.5005e+02 5.2476e+02 4.3064e+01 7.8716e-05 1.5569e-05 1.9431e-03 3.5734e-04 8.5803e-02 2.9884e-02 3.2040e-02 2.3075e-02 1.4530e-02 1.4429e-02 7.9794e-01 9.4300e-03 3.1610e-03 5.6205e-01 1.1976e-01 9.1304e-02 4.6973e-02 2.1288e-02 1.5141e-02 1.3089e-01 +8.0200e-01 4.0204e+06 5.5315e+02 1.0673e+03 3.0473e-07 1.6061e-01 8.3939e-01 3.6047e+03 9.4062e+02 5.2517e+02 4.2734e+01 7.8820e-05 1.5550e-05 1.9234e-03 3.5330e-04 8.4885e-02 2.9595e-02 3.1756e-02 2.2890e-02 1.4426e-02 1.4341e-02 7.9983e-01 9.4222e-03 3.1579e-03 5.6154e-01 1.1967e-01 9.1250e-02 4.6955e-02 2.1286e-02 1.5145e-02 1.3157e-01 +8.0400e-01 3.9808e+06 5.5315e+02 1.0544e+03 3.0887e-07 1.5763e-01 8.4237e-01 3.6009e+03 9.3120e+02 5.2559e+02 4.2405e+01 7.8924e-05 1.5531e-05 1.9038e-03 3.4928e-04 8.3967e-02 2.9306e-02 3.1471e-02 2.2704e-02 1.4322e-02 1.4252e-02 8.0173e-01 9.4143e-03 3.1548e-03 5.6101e-01 1.1958e-01 9.1194e-02 4.6937e-02 2.1284e-02 1.5150e-02 1.3227e-01 +8.0600e-01 3.9412e+06 5.5315e+02 1.0415e+03 3.1311e-07 1.5457e-01 8.4543e-01 3.5972e+03 9.2178e+02 5.2600e+02 4.2076e+01 7.9028e-05 1.5513e-05 1.8840e-03 3.4525e-04 8.3049e-02 2.9015e-02 3.1185e-02 2.2517e-02 1.4217e-02 1.4162e-02 8.0363e-01 9.4061e-03 3.1515e-03 5.6048e-01 1.1948e-01 9.1137e-02 4.6917e-02 2.1281e-02 1.5154e-02 1.3299e-01 +8.0800e-01 3.9016e+06 5.5315e+02 1.0286e+03 3.1745e-07 1.5145e-01 8.4855e-01 3.5935e+03 9.1237e+02 5.2641e+02 4.1748e+01 7.9132e-05 1.5493e-05 1.8643e-03 3.4124e-04 8.2131e-02 2.8725e-02 3.0898e-02 2.2329e-02 1.4111e-02 1.4071e-02 8.0553e-01 9.3978e-03 3.1482e-03 5.5993e-01 1.1939e-01 9.1078e-02 4.6897e-02 2.1278e-02 1.5157e-02 1.3372e-01 +8.1000e-01 3.8620e+06 5.5315e+02 1.0157e+03 3.2190e-07 1.4826e-01 8.5174e-01 3.5897e+03 9.0296e+02 5.2682e+02 4.1420e+01 7.9236e-05 1.5474e-05 1.8445e-03 3.3723e-04 8.1213e-02 2.8433e-02 3.0609e-02 2.2139e-02 1.4004e-02 1.3979e-02 8.0744e-01 9.3893e-03 3.1449e-03 5.5937e-01 1.1929e-01 9.1017e-02 4.6876e-02 2.1275e-02 1.5161e-02 1.3448e-01 +8.1200e-01 3.8224e+06 5.5315e+02 1.0027e+03 3.2645e-07 1.4499e-01 8.5501e-01 3.5860e+03 8.9355e+02 5.2723e+02 4.1093e+01 7.9339e-05 1.5455e-05 1.8248e-03 3.3322e-04 8.0296e-02 2.8142e-02 3.0320e-02 2.1949e-02 1.3897e-02 1.3885e-02 8.0935e-01 9.3806e-03 3.1414e-03 5.5880e-01 1.1919e-01 9.0954e-02 4.6854e-02 2.1271e-02 1.5164e-02 1.3525e-01 +8.1400e-01 3.7828e+06 5.5315e+02 9.8973e+02 3.3112e-07 1.4164e-01 8.5836e-01 3.5823e+03 8.8415e+02 5.2764e+02 4.0766e+01 7.9443e-05 1.5435e-05 1.8050e-03 3.2922e-04 7.9379e-02 2.7849e-02 3.0029e-02 2.1757e-02 1.3788e-02 1.3791e-02 8.1127e-01 9.3717e-03 3.1380e-03 5.5822e-01 1.1908e-01 9.0889e-02 4.6832e-02 2.1267e-02 1.5168e-02 1.3603e-01 +8.1600e-01 3.7432e+06 5.5315e+02 9.7675e+02 3.3590e-07 1.3821e-01 8.6179e-01 3.5785e+03 8.7475e+02 5.2805e+02 4.0439e+01 7.9547e-05 1.5416e-05 1.7852e-03 3.2523e-04 7.8462e-02 2.7556e-02 2.9737e-02 2.1564e-02 1.3679e-02 1.3696e-02 8.1319e-01 9.3625e-03 3.1344e-03 5.5762e-01 1.1897e-01 9.0822e-02 4.6808e-02 2.1263e-02 1.5171e-02 1.3684e-01 +8.1800e-01 3.7036e+06 5.5315e+02 9.6375e+02 3.4080e-07 1.3470e-01 8.6530e-01 3.5748e+03 8.6536e+02 5.2846e+02 4.0113e+01 7.9650e-05 1.5396e-05 1.7653e-03 3.2124e-04 7.7545e-02 2.7263e-02 2.9445e-02 2.1370e-02 1.3569e-02 1.3600e-02 8.1512e-01 9.3531e-03 3.1308e-03 5.5702e-01 1.1886e-01 9.0753e-02 4.6783e-02 2.1258e-02 1.5173e-02 1.3767e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.5074e+02 3.4583e-07 1.3110e-01 8.6890e-01 3.5711e+03 8.5597e+02 5.2886e+02 3.9788e+01 7.9754e-05 1.5376e-05 1.7455e-03 3.1726e-04 7.6629e-02 2.6969e-02 2.9151e-02 2.1175e-02 1.3457e-02 1.3502e-02 8.1705e-01 9.3436e-03 3.1270e-03 5.5639e-01 1.1875e-01 9.0682e-02 4.6757e-02 2.1252e-02 1.5176e-02 1.3852e-01 +8.2200e-01 3.6244e+06 5.5315e+02 9.3771e+02 3.5098e-07 1.2742e-01 8.7258e-01 3.5673e+03 8.4658e+02 5.2927e+02 3.9462e+01 7.9857e-05 1.5356e-05 1.7256e-03 3.1328e-04 7.5712e-02 2.6674e-02 2.8856e-02 2.0979e-02 1.3345e-02 1.3404e-02 8.1899e-01 9.3337e-03 3.1233e-03 5.5576e-01 1.1863e-01 9.0609e-02 4.6730e-02 2.1247e-02 1.5178e-02 1.3939e-01 +8.2400e-01 3.5848e+06 5.5315e+02 9.2467e+02 3.5627e-07 1.2364e-01 8.7636e-01 3.5636e+03 8.3720e+02 5.2968e+02 3.9138e+01 7.9961e-05 1.5335e-05 1.7057e-03 3.0931e-04 7.4796e-02 2.6379e-02 2.8560e-02 2.0782e-02 1.3232e-02 1.3304e-02 8.2093e-01 9.3237e-03 3.1194e-03 5.5511e-01 1.1851e-01 9.0533e-02 4.6701e-02 2.1240e-02 1.5180e-02 1.4028e-01 +8.2600e-01 3.5452e+06 5.5315e+02 9.1162e+02 3.6170e-07 1.1977e-01 8.8023e-01 3.5598e+03 8.2782e+02 5.3009e+02 3.8813e+01 8.0064e-05 1.5315e-05 1.6858e-03 3.0534e-04 7.3880e-02 2.6083e-02 2.8263e-02 2.0584e-02 1.3118e-02 1.3204e-02 8.2288e-01 9.3134e-03 3.1154e-03 5.5444e-01 1.1839e-01 9.0455e-02 4.6672e-02 2.1233e-02 1.5181e-02 1.4119e-01 +8.2800e-01 3.5056e+06 5.5315e+02 8.9855e+02 3.6727e-07 1.1580e-01 8.8420e-01 3.5561e+03 8.1845e+02 5.3050e+02 3.8489e+01 8.0167e-05 1.5294e-05 1.6659e-03 3.0138e-04 7.2965e-02 2.5787e-02 2.7964e-02 2.0384e-02 1.3003e-02 1.3102e-02 8.2483e-01 9.3028e-03 3.1114e-03 5.5376e-01 1.1827e-01 9.0374e-02 4.6641e-02 2.1226e-02 1.5182e-02 1.4213e-01 +8.3000e-01 3.4660e+06 5.5315e+02 8.8548e+02 3.7299e-07 1.1172e-01 8.8828e-01 3.5524e+03 8.0908e+02 5.3091e+02 3.8166e+01 8.0271e-05 1.5273e-05 1.6459e-03 2.9742e-04 7.2049e-02 2.5490e-02 2.7665e-02 2.0184e-02 1.2888e-02 1.2999e-02 8.2678e-01 9.2920e-03 3.1073e-03 5.5307e-01 1.1814e-01 9.0291e-02 4.6609e-02 2.1218e-02 1.5183e-02 1.4309e-01 +8.3200e-01 3.4264e+06 5.5315e+02 8.7240e+02 3.7887e-07 1.0754e-01 8.9246e-01 3.5486e+03 7.9972e+02 5.3131e+02 3.7843e+01 8.0374e-05 1.5252e-05 1.6260e-03 2.9347e-04 7.1134e-02 2.5192e-02 2.7365e-02 1.9982e-02 1.2771e-02 1.2895e-02 8.2874e-01 9.2808e-03 3.1031e-03 5.5236e-01 1.1801e-01 9.0206e-02 4.6576e-02 2.1210e-02 1.5184e-02 1.4408e-01 +8.3400e-01 3.3868e+06 5.5315e+02 8.5930e+02 3.8490e-07 1.0325e-01 8.9675e-01 3.5449e+03 7.9036e+02 5.3172e+02 3.7520e+01 8.0477e-05 1.5231e-05 1.6060e-03 2.8953e-04 7.0219e-02 2.4894e-02 2.7063e-02 1.9779e-02 1.2653e-02 1.2790e-02 8.3071e-01 9.2695e-03 3.0988e-03 5.5163e-01 1.1787e-01 9.0117e-02 4.6541e-02 2.1201e-02 1.5184e-02 1.4509e-01 +8.3600e-01 3.3472e+06 5.5315e+02 8.4620e+02 3.9111e-07 9.8849e-02 9.0115e-01 3.5412e+03 7.8100e+02 5.3213e+02 3.7198e+01 8.0580e-05 1.5209e-05 1.5860e-03 2.8559e-04 6.9304e-02 2.4595e-02 2.6760e-02 1.9574e-02 1.2535e-02 1.2683e-02 8.3268e-01 9.2578e-03 3.0944e-03 5.5088e-01 1.1773e-01 9.0026e-02 4.6505e-02 2.1191e-02 1.5184e-02 1.4613e-01 +8.3800e-01 3.3076e+06 5.5315e+02 8.3309e+02 3.9749e-07 9.4324e-02 9.0568e-01 3.5374e+03 7.7165e+02 5.3253e+02 3.6876e+01 8.0683e-05 1.5187e-05 1.5659e-03 2.8166e-04 6.8390e-02 2.4296e-02 2.6456e-02 1.9369e-02 1.2415e-02 1.2576e-02 8.3465e-01 9.2458e-03 3.0899e-03 5.5012e-01 1.1759e-01 8.9931e-02 4.6467e-02 2.1181e-02 1.5183e-02 1.4720e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1998e+02 4.0405e-07 8.9676e-02 9.1032e-01 3.5337e+03 7.6231e+02 5.3294e+02 3.6555e+01 8.0786e-05 1.5165e-05 1.5459e-03 2.7773e-04 6.7475e-02 2.3996e-02 2.6151e-02 1.9163e-02 1.2294e-02 1.2467e-02 8.3663e-01 9.2335e-03 3.0853e-03 5.4933e-01 1.1744e-01 8.9834e-02 4.6428e-02 2.1170e-02 1.5182e-02 1.4830e-01 +8.4200e-01 3.2284e+06 5.5315e+02 8.0685e+02 4.1080e-07 8.4898e-02 9.1510e-01 3.5299e+03 7.5296e+02 5.3335e+02 3.6234e+01 8.0889e-05 1.5143e-05 1.5258e-03 2.7381e-04 6.6561e-02 2.3696e-02 2.5845e-02 1.8955e-02 1.2173e-02 1.2357e-02 8.3861e-01 9.2208e-03 3.0806e-03 5.4853e-01 1.1729e-01 8.9734e-02 4.6387e-02 2.1158e-02 1.5181e-02 1.4942e-01 +8.4400e-01 3.1888e+06 5.5315e+02 7.9372e+02 4.1774e-07 7.9986e-02 9.2001e-01 3.5262e+03 7.4363e+02 5.3375e+02 3.5914e+01 8.0992e-05 1.5120e-05 1.5058e-03 2.6989e-04 6.5647e-02 2.3395e-02 2.5538e-02 1.8746e-02 1.2050e-02 1.2246e-02 8.4060e-01 9.2079e-03 3.0757e-03 5.4771e-01 1.1713e-01 8.9630e-02 4.6345e-02 2.1145e-02 1.5179e-02 1.5058e-01 +8.4600e-01 3.1492e+06 5.5315e+02 7.8059e+02 4.2489e-07 7.4935e-02 9.2507e-01 3.5224e+03 7.3429e+02 5.3416e+02 3.5594e+01 8.1094e-05 1.5097e-05 1.4857e-03 2.6598e-04 6.4733e-02 2.3093e-02 2.5229e-02 1.8536e-02 1.1927e-02 1.2134e-02 8.4260e-01 9.1946e-03 3.0708e-03 5.4687e-01 1.1697e-01 8.9523e-02 4.6301e-02 2.1132e-02 1.5177e-02 1.5176e-01 +8.4800e-01 3.1096e+06 5.5315e+02 7.6746e+02 4.3226e-07 6.9737e-02 9.3026e-01 3.5187e+03 7.2496e+02 5.3456e+02 3.5274e+01 8.1197e-05 1.5074e-05 1.4655e-03 2.6207e-04 6.3820e-02 2.2791e-02 2.4920e-02 1.8325e-02 1.1802e-02 1.2020e-02 8.4459e-01 9.1809e-03 3.0657e-03 5.4601e-01 1.1680e-01 8.9412e-02 4.6255e-02 2.1118e-02 1.5174e-02 1.5298e-01 +8.5000e-01 3.0700e+06 5.5315e+02 7.5432e+02 4.3984e-07 6.4388e-02 9.3561e-01 3.5150e+03 7.1564e+02 5.3497e+02 3.4955e+01 8.1300e-05 1.5050e-05 1.4454e-03 2.5817e-04 6.2907e-02 2.2488e-02 2.4609e-02 1.8112e-02 1.1677e-02 1.1906e-02 8.4660e-01 9.1668e-03 3.0606e-03 5.4512e-01 1.1663e-01 8.9298e-02 4.6207e-02 2.1104e-02 1.5171e-02 1.5424e-01 +8.5200e-01 3.0304e+06 5.5315e+02 7.4118e+02 4.4766e-07 5.8880e-02 9.4112e-01 3.5112e+03 7.0632e+02 5.3538e+02 3.4636e+01 8.1402e-05 1.5026e-05 1.4252e-03 2.5428e-04 6.1994e-02 2.2185e-02 2.4297e-02 1.7898e-02 1.1550e-02 1.1790e-02 8.4861e-01 9.1524e-03 3.0552e-03 5.4421e-01 1.1646e-01 8.9180e-02 4.6157e-02 2.1088e-02 1.5167e-02 1.5553e-01 +8.5400e-01 2.9908e+06 5.5315e+02 7.2804e+02 4.5572e-07 5.3206e-02 9.4679e-01 3.5075e+03 6.9700e+02 5.3578e+02 3.4317e+01 8.1505e-05 1.5002e-05 1.4051e-03 2.5039e-04 6.1081e-02 2.1881e-02 2.3984e-02 1.7683e-02 1.1422e-02 1.1672e-02 8.5062e-01 9.1376e-03 3.0498e-03 5.4328e-01 1.1628e-01 8.9058e-02 4.6106e-02 2.1072e-02 1.5162e-02 1.5686e-01 +8.5600e-01 2.9512e+06 5.5315e+02 7.1490e+02 4.6404e-07 4.7360e-02 9.5264e-01 3.5037e+03 6.8769e+02 5.3619e+02 3.3999e+01 8.1607e-05 1.4978e-05 1.3849e-03 2.4650e-04 6.0168e-02 2.1577e-02 2.3670e-02 1.7467e-02 1.1294e-02 1.1554e-02 8.5264e-01 9.1223e-03 3.0442e-03 5.4232e-01 1.1609e-01 8.8932e-02 4.6052e-02 2.1054e-02 1.5157e-02 1.5822e-01 +8.5800e-01 2.9116e+06 5.5315e+02 7.0177e+02 4.7262e-07 4.1332e-02 9.5867e-01 3.5000e+03 6.7838e+02 5.3659e+02 3.3682e+01 8.1709e-05 1.4953e-05 1.3646e-03 2.4262e-04 5.9256e-02 2.1272e-02 2.3355e-02 1.7250e-02 1.1164e-02 1.1434e-02 8.5466e-01 9.1066e-03 3.0385e-03 5.4134e-01 1.1590e-01 8.8801e-02 4.5996e-02 2.1036e-02 1.5151e-02 1.5963e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8864e+02 4.8147e-07 3.5115e-02 9.6488e-01 3.4962e+03 6.6908e+02 5.3699e+02 3.3364e+01 8.1811e-05 1.4928e-05 1.3444e-03 2.3875e-04 5.8344e-02 2.0966e-02 2.3038e-02 1.7031e-02 1.1033e-02 1.1313e-02 8.5669e-01 9.0905e-03 3.0326e-03 5.4033e-01 1.1571e-01 8.8666e-02 4.5938e-02 2.1017e-02 1.5145e-02 1.6108e-01 +8.6200e-01 2.8324e+06 5.5315e+02 6.7551e+02 4.9062e-07 2.8700e-02 9.7130e-01 3.4925e+03 6.5978e+02 5.3740e+02 3.3048e+01 8.1913e-05 1.4902e-05 1.3242e-03 2.3488e-04 5.7432e-02 2.0660e-02 2.2721e-02 1.6811e-02 1.0902e-02 1.1190e-02 8.5873e-01 9.0738e-03 3.0266e-03 5.3929e-01 1.1550e-01 8.8527e-02 4.5877e-02 2.0996e-02 1.5138e-02 1.6257e-01 +8.6400e-01 2.7928e+06 5.5315e+02 6.6239e+02 5.0007e-07 2.2078e-02 9.7792e-01 3.4887e+03 6.5049e+02 5.3780e+02 3.2731e+01 8.2015e-05 1.4876e-05 1.3039e-03 2.3102e-04 5.6520e-02 2.0353e-02 2.2402e-02 1.6590e-02 1.0769e-02 1.1067e-02 8.6076e-01 9.0567e-03 3.0204e-03 5.3822e-01 1.1529e-01 8.8383e-02 4.5814e-02 2.0975e-02 1.5130e-02 1.6410e-01 +8.6600e-01 2.7532e+06 5.5315e+02 6.4927e+02 5.0984e-07 1.5238e-02 9.8476e-01 3.4850e+03 6.4120e+02 5.3821e+02 3.2415e+01 8.2117e-05 1.4850e-05 1.2836e-03 2.2716e-04 5.5608e-02 2.0046e-02 2.2082e-02 1.6368e-02 1.0635e-02 1.0941e-02 8.6281e-01 9.0391e-03 3.0140e-03 5.3713e-01 1.1508e-01 8.8233e-02 4.5748e-02 2.0952e-02 1.5121e-02 1.6569e-01 +8.6800e-01 2.7136e+06 5.5315e+02 6.3617e+02 5.1995e-07 8.1691e-03 9.9183e-01 3.4813e+03 6.3192e+02 5.3861e+02 3.2100e+01 8.2219e-05 1.4823e-05 1.2633e-03 2.2331e-04 5.4697e-02 1.9738e-02 2.1761e-02 1.6144e-02 1.0500e-02 1.0815e-02 8.6486e-01 9.0209e-03 3.0075e-03 5.3600e-01 1.1486e-01 8.8079e-02 4.5680e-02 2.0928e-02 1.5112e-02 1.6732e-01 +8.7000e-01 2.6740e+06 5.5315e+02 6.2308e+02 5.3041e-07 8.6069e-04 9.9914e-01 3.4775e+03 6.2264e+02 5.3901e+02 3.1784e+01 8.2321e-05 1.4796e-05 1.2430e-03 2.1946e-04 5.3786e-02 1.9429e-02 2.1438e-02 1.5919e-02 1.0364e-02 1.0687e-02 8.6691e-01 9.0022e-03 3.0008e-03 5.3484e-01 1.1463e-01 8.7919e-02 4.5608e-02 2.0903e-02 1.5101e-02 1.6900e-01 +8.7200e-01 2.6344e+06 5.5315e+02 6.1289e+02 4.0366e-07 0.0000e+00 1.0000e+00 6.1289e+02 6.1289e+02 3.1305e+01 3.1305e+01 1.4781e-05 1.4781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7400e-01 2.5948e+06 5.5315e+02 6.0311e+02 4.0951e-07 0.0000e+00 1.0000e+00 6.0311e+02 6.0311e+02 3.0805e+01 3.0805e+01 1.4768e-05 1.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7600e-01 2.5552e+06 5.5315e+02 5.9333e+02 4.1554e-07 0.0000e+00 1.0000e+00 5.9333e+02 5.9333e+02 3.0306e+01 3.0306e+01 1.4755e-05 1.4755e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7800e-01 2.5156e+06 5.5315e+02 5.8358e+02 4.2176e-07 0.0000e+00 1.0000e+00 5.8358e+02 5.8358e+02 2.9808e+01 2.9808e+01 1.4743e-05 1.4743e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.7384e+02 4.2818e-07 0.0000e+00 1.0000e+00 5.7384e+02 5.7384e+02 2.9310e+01 2.9310e+01 1.4730e-05 1.4730e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8200e-01 2.4364e+06 5.5315e+02 5.6412e+02 4.3480e-07 0.0000e+00 1.0000e+00 5.6412e+02 5.6412e+02 2.8814e+01 2.8814e+01 1.4718e-05 1.4718e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8400e-01 2.3968e+06 5.5315e+02 5.5441e+02 4.4164e-07 0.0000e+00 1.0000e+00 5.5441e+02 5.5441e+02 2.8318e+01 2.8318e+01 1.4705e-05 1.4705e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8600e-01 2.3572e+06 5.5315e+02 5.4473e+02 4.4871e-07 0.0000e+00 1.0000e+00 5.4473e+02 5.4473e+02 2.7823e+01 2.7823e+01 1.4693e-05 1.4693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8800e-01 2.3176e+06 5.5315e+02 5.3506e+02 4.5602e-07 0.0000e+00 1.0000e+00 5.3506e+02 5.3506e+02 2.7329e+01 2.7329e+01 1.4681e-05 1.4681e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9000e-01 2.2780e+06 5.5315e+02 5.2540e+02 4.6357e-07 0.0000e+00 1.0000e+00 5.2540e+02 5.2540e+02 2.6836e+01 2.6836e+01 1.4669e-05 1.4669e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9200e-01 2.2384e+06 5.5315e+02 5.1577e+02 4.7140e-07 0.0000e+00 1.0000e+00 5.1577e+02 5.1577e+02 2.6344e+01 2.6344e+01 1.4657e-05 1.4657e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9400e-01 2.1988e+06 5.5315e+02 5.0615e+02 4.7950e-07 0.0000e+00 1.0000e+00 5.0615e+02 5.0615e+02 2.5853e+01 2.5853e+01 1.4645e-05 1.4645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9600e-01 2.1592e+06 5.5315e+02 4.9654e+02 4.8789e-07 0.0000e+00 1.0000e+00 4.9654e+02 4.9654e+02 2.5362e+01 2.5362e+01 1.4634e-05 1.4634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9800e-01 2.1196e+06 5.5315e+02 4.8696e+02 4.9660e-07 0.0000e+00 1.0000e+00 4.8696e+02 4.8696e+02 2.4873e+01 2.4873e+01 1.4622e-05 1.4622e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7739e+02 5.0563e-07 0.0000e+00 1.0000e+00 4.7739e+02 4.7739e+02 2.4384e+01 2.4384e+01 1.4611e-05 1.4611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0200e-01 2.0404e+06 5.5315e+02 4.6784e+02 5.1502e-07 0.0000e+00 1.0000e+00 4.6784e+02 4.6784e+02 2.3896e+01 2.3896e+01 1.4600e-05 1.4600e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0400e-01 2.0008e+06 5.5315e+02 4.5831e+02 5.2477e-07 0.0000e+00 1.0000e+00 4.5831e+02 4.5831e+02 2.3409e+01 2.3409e+01 1.4588e-05 1.4588e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0600e-01 1.9612e+06 5.5315e+02 4.4879e+02 5.3491e-07 0.0000e+00 1.0000e+00 4.4879e+02 4.4879e+02 2.2923e+01 2.2923e+01 1.4577e-05 1.4577e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0800e-01 1.9216e+06 5.5315e+02 4.3930e+02 5.4547e-07 0.0000e+00 1.0000e+00 4.3930e+02 4.3930e+02 2.2438e+01 2.2438e+01 1.4566e-05 1.4566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1000e-01 1.8820e+06 5.5315e+02 4.2981e+02 5.5647e-07 0.0000e+00 1.0000e+00 4.2981e+02 4.2981e+02 2.1954e+01 2.1954e+01 1.4555e-05 1.4555e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1200e-01 1.8424e+06 5.5315e+02 4.2035e+02 5.6794e-07 0.0000e+00 1.0000e+00 4.2035e+02 4.2035e+02 2.1470e+01 2.1470e+01 1.4545e-05 1.4545e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1400e-01 1.8028e+06 5.5315e+02 4.1091e+02 5.7991e-07 0.0000e+00 1.0000e+00 4.1091e+02 4.1091e+02 2.0988e+01 2.0988e+01 1.4534e-05 1.4534e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1600e-01 1.7632e+06 5.5315e+02 4.0148e+02 5.9242e-07 0.0000e+00 1.0000e+00 4.0148e+02 4.0148e+02 2.0506e+01 2.0506e+01 1.4523e-05 1.4523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1800e-01 1.7236e+06 5.5315e+02 3.9207e+02 6.0550e-07 0.0000e+00 1.0000e+00 3.9207e+02 3.9207e+02 2.0026e+01 2.0026e+01 1.4513e-05 1.4513e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.8268e+02 6.1919e-07 0.0000e+00 1.0000e+00 3.8268e+02 3.8268e+02 1.9546e+01 1.9546e+01 1.4503e-05 1.4503e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2200e-01 1.6444e+06 5.5315e+02 3.7330e+02 6.3354e-07 0.0000e+00 1.0000e+00 3.7330e+02 3.7330e+02 1.9067e+01 1.9067e+01 1.4492e-05 1.4492e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2400e-01 1.6048e+06 5.5315e+02 3.6395e+02 6.4859e-07 0.0000e+00 1.0000e+00 3.6395e+02 3.6395e+02 1.8589e+01 1.8589e+01 1.4482e-05 1.4482e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2600e-01 1.5652e+06 5.5315e+02 3.5461e+02 6.6440e-07 0.0000e+00 1.0000e+00 3.5461e+02 3.5461e+02 1.8112e+01 1.8112e+01 1.4472e-05 1.4472e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2800e-01 1.5256e+06 5.5315e+02 3.4529e+02 6.8103e-07 0.0000e+00 1.0000e+00 3.4529e+02 3.4529e+02 1.7636e+01 1.7636e+01 1.4462e-05 1.4462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3000e-01 1.4860e+06 5.5315e+02 3.3598e+02 6.9854e-07 0.0000e+00 1.0000e+00 3.3598e+02 3.3598e+02 1.7161e+01 1.7161e+01 1.4453e-05 1.4453e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3200e-01 1.4464e+06 5.5315e+02 3.2670e+02 7.1701e-07 0.0000e+00 1.0000e+00 3.2670e+02 3.2670e+02 1.6687e+01 1.6687e+01 1.4443e-05 1.4443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3400e-01 1.4068e+06 5.5315e+02 3.1743e+02 7.3652e-07 0.0000e+00 1.0000e+00 3.1743e+02 3.1743e+02 1.6214e+01 1.6214e+01 1.4433e-05 1.4433e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3600e-01 1.3672e+06 5.5315e+02 3.0818e+02 7.5715e-07 0.0000e+00 1.0000e+00 3.0818e+02 3.0818e+02 1.5741e+01 1.5741e+01 1.4424e-05 1.4424e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3800e-01 1.3276e+06 5.5315e+02 2.9895e+02 7.7901e-07 0.0000e+00 1.0000e+00 2.9895e+02 2.9895e+02 1.5270e+01 1.5270e+01 1.4414e-05 1.4414e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8974e+02 8.0221e-07 0.0000e+00 1.0000e+00 2.8974e+02 2.8974e+02 1.4799e+01 1.4799e+01 1.4405e-05 1.4405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4200e-01 1.2484e+06 5.5315e+02 2.8054e+02 8.2688e-07 0.0000e+00 1.0000e+00 2.8054e+02 2.8054e+02 1.4329e+01 1.4329e+01 1.4396e-05 1.4396e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4400e-01 1.2088e+06 5.5315e+02 2.7137e+02 8.5316e-07 0.0000e+00 1.0000e+00 2.7137e+02 2.7137e+02 1.3861e+01 1.3861e+01 1.4387e-05 1.4387e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4600e-01 1.1692e+06 5.5315e+02 2.6221e+02 8.8122e-07 0.0000e+00 1.0000e+00 2.6221e+02 2.6221e+02 1.3393e+01 1.3393e+01 1.4378e-05 1.4378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4800e-01 1.1296e+06 5.5315e+02 2.5307e+02 9.1124e-07 0.0000e+00 1.0000e+00 2.5307e+02 2.5307e+02 1.2926e+01 1.2926e+01 1.4369e-05 1.4369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5000e-01 1.0900e+06 5.5315e+02 2.4394e+02 9.4344e-07 0.0000e+00 1.0000e+00 2.4394e+02 2.4394e+02 1.2460e+01 1.2460e+01 1.4360e-05 1.4360e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5200e-01 1.0504e+06 5.5315e+02 2.3484e+02 9.7807e-07 0.0000e+00 1.0000e+00 2.3484e+02 2.3484e+02 1.1995e+01 1.1995e+01 1.4351e-05 1.4351e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5400e-01 1.0108e+06 5.5315e+02 2.2575e+02 1.0154e-06 0.0000e+00 1.0000e+00 2.2575e+02 2.2575e+02 1.1531e+01 1.1531e+01 1.4343e-05 1.4343e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5600e-01 9.7120e+05 5.5315e+02 2.1668e+02 1.0558e-06 0.0000e+00 1.0000e+00 2.1668e+02 2.1668e+02 1.1068e+01 1.1068e+01 1.4334e-05 1.4334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5800e-01 9.3160e+05 5.5315e+02 2.0763e+02 1.0996e-06 0.0000e+00 1.0000e+00 2.0763e+02 2.0763e+02 1.0605e+01 1.0605e+01 1.4326e-05 1.4326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9860e+02 1.1473e-06 0.0000e+00 1.0000e+00 1.9860e+02 1.9860e+02 1.0144e+01 1.0144e+01 1.4317e-05 1.4317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6200e-01 8.5240e+05 5.5315e+02 1.8959e+02 1.1994e-06 0.0000e+00 1.0000e+00 1.8959e+02 1.8959e+02 9.6836e+00 9.6836e+00 1.4309e-05 1.4309e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6400e-01 8.1280e+05 5.5315e+02 1.8059e+02 1.2566e-06 0.0000e+00 1.0000e+00 1.8059e+02 1.8059e+02 9.2241e+00 9.2241e+00 1.4301e-05 1.4301e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6600e-01 7.7320e+05 5.5315e+02 1.7161e+02 1.3196e-06 0.0000e+00 1.0000e+00 1.7161e+02 1.7161e+02 8.7656e+00 8.7656e+00 1.4293e-05 1.4293e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6800e-01 7.3360e+05 5.5315e+02 1.6266e+02 1.3895e-06 0.0000e+00 1.0000e+00 1.6266e+02 1.6266e+02 8.3080e+00 8.3080e+00 1.4285e-05 1.4285e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7000e-01 6.9400e+05 5.5315e+02 1.5371e+02 1.4673e-06 0.0000e+00 1.0000e+00 1.5371e+02 1.5371e+02 7.8513e+00 7.8513e+00 1.4277e-05 1.4277e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7200e-01 6.5440e+05 5.5315e+02 1.4479e+02 1.5545e-06 0.0000e+00 1.0000e+00 1.4479e+02 1.4479e+02 7.3956e+00 7.3956e+00 1.4269e-05 1.4269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7400e-01 6.1480e+05 5.5315e+02 1.3589e+02 1.6530e-06 0.0000e+00 1.0000e+00 1.3589e+02 1.3589e+02 6.9408e+00 6.9408e+00 1.4261e-05 1.4261e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7600e-01 5.7520e+05 5.5315e+02 1.2700e+02 1.7650e-06 0.0000e+00 1.0000e+00 1.2700e+02 1.2700e+02 6.4869e+00 6.4869e+00 1.4254e-05 1.4254e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7800e-01 5.3560e+05 5.5315e+02 1.1813e+02 1.8936e-06 0.0000e+00 1.0000e+00 1.1813e+02 1.1813e+02 6.0340e+00 6.0340e+00 1.4246e-05 1.4246e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0929e+02 2.0427e-06 0.0000e+00 1.0000e+00 1.0929e+02 1.0929e+02 5.5820e+00 5.5820e+00 1.4239e-05 1.4239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8200e-01 4.5640e+05 5.5315e+02 1.0045e+02 2.2176e-06 0.0000e+00 1.0000e+00 1.0045e+02 1.0045e+02 5.1309e+00 5.1309e+00 1.4232e-05 1.4232e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8400e-01 4.1680e+05 5.5315e+02 9.1642e+01 2.4258e-06 0.0000e+00 1.0000e+00 9.1642e+01 9.1642e+01 4.6808e+00 4.6808e+00 1.4224e-05 1.4224e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8600e-01 3.7720e+05 5.5315e+02 8.2848e+01 2.6777e-06 0.0000e+00 1.0000e+00 8.2848e+01 8.2848e+01 4.2316e+00 4.2316e+00 1.4217e-05 1.4217e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8800e-01 3.3760e+05 5.5315e+02 7.4072e+01 2.9887e-06 0.0000e+00 1.0000e+00 7.4072e+01 7.4072e+01 3.7834e+00 3.7834e+00 1.4210e-05 1.4210e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9000e-01 2.9800e+05 5.5315e+02 6.5314e+01 3.3824e-06 0.0000e+00 1.0000e+00 6.5314e+01 6.5314e+01 3.3361e+00 3.3361e+00 1.4203e-05 1.4203e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9200e-01 2.5840e+05 5.5315e+02 5.6575e+01 3.8967e-06 0.0000e+00 1.0000e+00 5.6575e+01 5.6575e+01 2.8897e+00 2.8897e+00 1.4196e-05 1.4196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9400e-01 2.1880e+05 5.5315e+02 4.7854e+01 4.5971e-06 0.0000e+00 1.0000e+00 4.7854e+01 4.7854e+01 2.4443e+00 2.4443e+00 1.4189e-05 1.4189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9600e-01 1.7920e+05 5.5315e+02 3.9152e+01 5.6071e-06 0.0000e+00 1.0000e+00 3.9152e+01 3.9152e+01 1.9998e+00 1.9998e+00 1.4183e-05 1.4183e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9800e-01 1.3960e+05 5.5315e+02 3.0467e+01 7.1901e-06 0.0000e+00 1.0000e+00 3.0467e+01 3.0467e+01 1.5562e+00 1.5562e+00 1.4176e-05 1.4176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1802e+01 1.0027e-05 0.0000e+00 1.0000e+00 2.1802e+01 2.1802e+01 1.1136e+00 1.1136e+00 1.4170e-05 1.4170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0020e+00 1.3960e+05 5.8315e+02 2.8879e+01 7.1848e-06 0.0000e+00 1.0000e+00 2.8879e+01 2.8879e+01 1.4750e+00 1.4750e+00 1.4780e-05 1.4780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0040e+00 1.7920e+05 5.8315e+02 3.7102e+01 5.6018e-06 0.0000e+00 1.0000e+00 3.7102e+01 3.7102e+01 1.8951e+00 1.8951e+00 1.4786e-05 1.4786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0060e+00 2.1880e+05 5.8315e+02 4.5339e+01 4.5918e-06 0.0000e+00 1.0000e+00 4.5339e+01 4.5339e+01 2.3158e+00 2.3158e+00 1.4793e-05 1.4793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0080e+00 2.5840e+05 5.8315e+02 5.3591e+01 3.8913e-06 0.0000e+00 1.0000e+00 5.3591e+01 5.3591e+01 2.7373e+00 2.7373e+00 1.4799e-05 1.4799e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0100e+00 2.9800e+05 5.8315e+02 6.1856e+01 3.3770e-06 0.0000e+00 1.0000e+00 6.1856e+01 6.1856e+01 3.1594e+00 3.1594e+00 1.4806e-05 1.4806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0120e+00 3.3760e+05 5.8315e+02 7.0135e+01 2.9834e-06 0.0000e+00 1.0000e+00 7.0135e+01 7.0135e+01 3.5823e+00 3.5823e+00 1.4812e-05 1.4812e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0140e+00 3.7720e+05 5.8315e+02 7.8427e+01 2.6724e-06 0.0000e+00 1.0000e+00 7.8427e+01 7.8427e+01 4.0059e+00 4.0059e+00 1.4819e-05 1.4819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0160e+00 4.1680e+05 5.8315e+02 8.6734e+01 2.4204e-06 0.0000e+00 1.0000e+00 8.6734e+01 8.6734e+01 4.4301e+00 4.4301e+00 1.4826e-05 1.4826e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0180e+00 4.5640e+05 5.8315e+02 9.5054e+01 2.2122e-06 0.0000e+00 1.0000e+00 9.5054e+01 9.5054e+01 4.8551e+00 4.8551e+00 1.4832e-05 1.4832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0339e+02 2.0372e-06 0.0000e+00 1.0000e+00 1.0339e+02 1.0339e+02 5.2808e+00 5.2808e+00 1.4839e-05 1.4839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0220e+00 5.3560e+05 5.8315e+02 1.1174e+02 1.8881e-06 0.0000e+00 1.0000e+00 1.1174e+02 1.1174e+02 5.7071e+00 5.7071e+00 1.4846e-05 1.4846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0240e+00 5.7520e+05 5.8315e+02 1.2010e+02 1.7596e-06 0.0000e+00 1.0000e+00 1.2010e+02 1.2010e+02 6.1342e+00 6.1342e+00 1.4853e-05 1.4853e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0260e+00 6.1480e+05 5.8315e+02 1.2847e+02 1.6475e-06 0.0000e+00 1.0000e+00 1.2847e+02 1.2847e+02 6.5620e+00 6.5620e+00 1.4860e-05 1.4860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0280e+00 6.5440e+05 5.8315e+02 1.3686e+02 1.5491e-06 0.0000e+00 1.0000e+00 1.3686e+02 1.3686e+02 6.9905e+00 6.9905e+00 1.4868e-05 1.4868e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0300e+00 6.9400e+05 5.8315e+02 1.4526e+02 1.4618e-06 0.0000e+00 1.0000e+00 1.4526e+02 1.4526e+02 7.4196e+00 7.4196e+00 1.4875e-05 1.4875e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0320e+00 7.3360e+05 5.8315e+02 1.5368e+02 1.3840e-06 0.0000e+00 1.0000e+00 1.5368e+02 1.5368e+02 7.8495e+00 7.8495e+00 1.4882e-05 1.4882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0340e+00 7.7320e+05 5.8315e+02 1.6211e+02 1.3141e-06 0.0000e+00 1.0000e+00 1.6211e+02 1.6211e+02 8.2800e+00 8.2800e+00 1.4890e-05 1.4890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0360e+00 8.1280e+05 5.8315e+02 1.7055e+02 1.2511e-06 0.0000e+00 1.0000e+00 1.7055e+02 1.7055e+02 8.7113e+00 8.7113e+00 1.4897e-05 1.4897e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0380e+00 8.5240e+05 5.8315e+02 1.7901e+02 1.1939e-06 0.0000e+00 1.0000e+00 1.7901e+02 1.7901e+02 9.1432e+00 9.1432e+00 1.4905e-05 1.4905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8748e+02 1.1418e-06 0.0000e+00 1.0000e+00 1.8748e+02 1.8748e+02 9.5758e+00 9.5758e+00 1.4912e-05 1.4912e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0420e+00 9.3160e+05 5.8315e+02 1.9596e+02 1.0941e-06 0.0000e+00 1.0000e+00 1.9596e+02 1.9596e+02 1.0009e+01 1.0009e+01 1.4920e-05 1.4920e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0440e+00 9.7120e+05 5.8315e+02 2.0446e+02 1.0502e-06 0.0000e+00 1.0000e+00 2.0446e+02 2.0446e+02 1.0443e+01 1.0443e+01 1.4928e-05 1.4928e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0460e+00 1.0108e+06 5.8315e+02 2.1297e+02 1.0099e-06 0.0000e+00 1.0000e+00 2.1297e+02 2.1297e+02 1.0878e+01 1.0878e+01 1.4936e-05 1.4936e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0480e+00 1.0504e+06 5.8315e+02 2.2149e+02 9.7252e-07 0.0000e+00 1.0000e+00 2.2149e+02 2.2149e+02 1.1313e+01 1.1313e+01 1.4944e-05 1.4944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0500e+00 1.0900e+06 5.8315e+02 2.3003e+02 9.3789e-07 0.0000e+00 1.0000e+00 2.3003e+02 2.3003e+02 1.1749e+01 1.1749e+01 1.4952e-05 1.4952e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0520e+00 1.1296e+06 5.8315e+02 2.3858e+02 9.0568e-07 0.0000e+00 1.0000e+00 2.3858e+02 2.3858e+02 1.2186e+01 1.2186e+01 1.4960e-05 1.4960e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0540e+00 1.1692e+06 5.8315e+02 2.4714e+02 8.7565e-07 0.0000e+00 1.0000e+00 2.4714e+02 2.4714e+02 1.2623e+01 1.2623e+01 1.4968e-05 1.4968e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0560e+00 1.2088e+06 5.8315e+02 2.5572e+02 8.4758e-07 0.0000e+00 1.0000e+00 2.5572e+02 2.5572e+02 1.3061e+01 1.3061e+01 1.4977e-05 1.4977e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0580e+00 1.2484e+06 5.8315e+02 2.6431e+02 8.2129e-07 0.0000e+00 1.0000e+00 2.6431e+02 2.6431e+02 1.3500e+01 1.3500e+01 1.4985e-05 1.4985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7291e+02 7.9661e-07 0.0000e+00 1.0000e+00 2.7291e+02 2.7291e+02 1.3939e+01 1.3939e+01 1.4993e-05 1.4993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0620e+00 1.3276e+06 5.8315e+02 2.8152e+02 7.7341e-07 0.0000e+00 1.0000e+00 2.8152e+02 2.8152e+02 1.4379e+01 1.4379e+01 1.5002e-05 1.5002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0640e+00 1.3672e+06 5.8315e+02 2.9015e+02 7.5154e-07 0.0000e+00 1.0000e+00 2.9015e+02 2.9015e+02 1.4820e+01 1.4820e+01 1.5011e-05 1.5011e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0660e+00 1.4068e+06 5.8315e+02 2.9879e+02 7.3090e-07 0.0000e+00 1.0000e+00 2.9879e+02 2.9879e+02 1.5262e+01 1.5262e+01 1.5019e-05 1.5019e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0680e+00 1.4464e+06 5.8315e+02 3.0745e+02 7.1139e-07 0.0000e+00 1.0000e+00 3.0745e+02 3.0745e+02 1.5704e+01 1.5704e+01 1.5028e-05 1.5028e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0700e+00 1.4860e+06 5.8315e+02 3.1612e+02 6.9292e-07 0.0000e+00 1.0000e+00 3.1612e+02 3.1612e+02 1.6146e+01 1.6146e+01 1.5037e-05 1.5037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0720e+00 1.5256e+06 5.8315e+02 3.2480e+02 6.7540e-07 0.0000e+00 1.0000e+00 3.2480e+02 3.2480e+02 1.6590e+01 1.6590e+01 1.5046e-05 1.5046e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0740e+00 1.5652e+06 5.8315e+02 3.3349e+02 6.5876e-07 0.0000e+00 1.0000e+00 3.3349e+02 3.3349e+02 1.7034e+01 1.7034e+01 1.5055e-05 1.5055e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0760e+00 1.6048e+06 5.8315e+02 3.4220e+02 6.4295e-07 0.0000e+00 1.0000e+00 3.4220e+02 3.4220e+02 1.7478e+01 1.7478e+01 1.5064e-05 1.5064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0780e+00 1.6444e+06 5.8315e+02 3.5092e+02 6.2789e-07 0.0000e+00 1.0000e+00 3.5092e+02 3.5092e+02 1.7924e+01 1.7924e+01 1.5074e-05 1.5074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5965e+02 6.1354e-07 0.0000e+00 1.0000e+00 3.5965e+02 3.5965e+02 1.8370e+01 1.8370e+01 1.5083e-05 1.5083e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0820e+00 1.7236e+06 5.8315e+02 3.6839e+02 5.9984e-07 0.0000e+00 1.0000e+00 3.6839e+02 3.6839e+02 1.8816e+01 1.8816e+01 1.5092e-05 1.5092e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0840e+00 1.7632e+06 5.8315e+02 3.7715e+02 5.8676e-07 0.0000e+00 1.0000e+00 3.7715e+02 3.7715e+02 1.9264e+01 1.9264e+01 1.5102e-05 1.5102e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0860e+00 1.8028e+06 5.8315e+02 3.8592e+02 5.7425e-07 0.0000e+00 1.0000e+00 3.8592e+02 3.8592e+02 1.9712e+01 1.9712e+01 1.5111e-05 1.5111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0880e+00 1.8424e+06 5.8315e+02 3.9470e+02 5.6227e-07 0.0000e+00 1.0000e+00 3.9470e+02 3.9470e+02 2.0160e+01 2.0160e+01 1.5121e-05 1.5121e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0900e+00 1.8820e+06 5.8315e+02 4.0349e+02 5.5079e-07 0.0000e+00 1.0000e+00 4.0349e+02 4.0349e+02 2.0609e+01 2.0609e+01 1.5131e-05 1.5131e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0920e+00 1.9216e+06 5.8315e+02 4.1230e+02 5.3979e-07 0.0000e+00 1.0000e+00 4.1230e+02 4.1230e+02 2.1059e+01 2.1059e+01 1.5141e-05 1.5141e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0940e+00 1.9612e+06 5.8315e+02 4.2112e+02 5.2923e-07 0.0000e+00 1.0000e+00 4.2112e+02 4.2112e+02 2.1510e+01 2.1510e+01 1.5151e-05 1.5151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0960e+00 2.0008e+06 5.8315e+02 4.2995e+02 5.1908e-07 0.0000e+00 1.0000e+00 4.2995e+02 4.2995e+02 2.1961e+01 2.1961e+01 1.5161e-05 1.5161e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0980e+00 2.0404e+06 5.8315e+02 4.3880e+02 5.0932e-07 0.0000e+00 1.0000e+00 4.3880e+02 4.3880e+02 2.2413e+01 2.2413e+01 1.5171e-05 1.5171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4765e+02 4.9994e-07 0.0000e+00 1.0000e+00 4.4765e+02 4.4765e+02 2.2865e+01 2.2865e+01 1.5181e-05 1.5181e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1020e+00 2.1196e+06 5.8315e+02 4.5652e+02 4.9090e-07 0.0000e+00 1.0000e+00 4.5652e+02 4.5652e+02 2.3318e+01 2.3318e+01 1.5192e-05 1.5192e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1040e+00 2.1592e+06 5.8315e+02 4.6540e+02 4.8219e-07 0.0000e+00 1.0000e+00 4.6540e+02 4.6540e+02 2.3771e+01 2.3771e+01 1.5202e-05 1.5202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1060e+00 2.1988e+06 5.8315e+02 4.7429e+02 4.7379e-07 0.0000e+00 1.0000e+00 4.7429e+02 4.7429e+02 2.4226e+01 2.4226e+01 1.5212e-05 1.5212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1080e+00 2.2384e+06 5.8315e+02 4.8320e+02 4.6569e-07 0.0000e+00 1.0000e+00 4.8320e+02 4.8320e+02 2.4681e+01 2.4681e+01 1.5223e-05 1.5223e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1100e+00 2.2780e+06 5.8315e+02 4.9212e+02 4.5786e-07 0.0000e+00 1.0000e+00 4.9212e+02 4.9212e+02 2.5136e+01 2.5136e+01 1.5234e-05 1.5234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1120e+00 2.3176e+06 5.8315e+02 5.0104e+02 4.5030e-07 0.0000e+00 1.0000e+00 5.0104e+02 5.0104e+02 2.5592e+01 2.5592e+01 1.5244e-05 1.5244e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1140e+00 2.3572e+06 5.8315e+02 5.0999e+02 4.4300e-07 0.0000e+00 1.0000e+00 5.0999e+02 5.0999e+02 2.6049e+01 2.6049e+01 1.5255e-05 1.5255e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1160e+00 2.3968e+06 5.8315e+02 5.1894e+02 4.3593e-07 0.0000e+00 1.0000e+00 5.1894e+02 5.1894e+02 2.6506e+01 2.6506e+01 1.5266e-05 1.5266e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1180e+00 2.4364e+06 5.8315e+02 5.2790e+02 4.2909e-07 0.0000e+00 1.0000e+00 5.2790e+02 5.2790e+02 2.6964e+01 2.6964e+01 1.5277e-05 1.5277e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.3688e+02 4.2246e-07 0.0000e+00 1.0000e+00 5.3688e+02 5.3688e+02 2.7422e+01 2.7422e+01 1.5289e-05 1.5289e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1220e+00 2.5156e+06 5.8315e+02 5.4587e+02 4.1604e-07 0.0000e+00 1.0000e+00 5.4587e+02 5.4587e+02 2.7881e+01 2.7881e+01 1.5300e-05 1.5300e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1240e+00 2.5552e+06 5.8315e+02 5.5486e+02 4.0982e-07 0.0000e+00 1.0000e+00 5.5486e+02 5.5486e+02 2.8341e+01 2.8341e+01 1.5311e-05 1.5311e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1260e+00 2.5948e+06 5.8315e+02 5.6388e+02 4.0379e-07 0.0000e+00 1.0000e+00 5.6388e+02 5.6388e+02 2.8801e+01 2.8801e+01 1.5323e-05 1.5323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1280e+00 2.6344e+06 5.8315e+02 5.7290e+02 3.9794e-07 0.0000e+00 1.0000e+00 5.7290e+02 5.7290e+02 2.9262e+01 2.9262e+01 1.5334e-05 1.5334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1300e+00 2.6740e+06 5.8315e+02 5.8193e+02 3.9225e-07 0.0000e+00 1.0000e+00 5.8193e+02 5.8193e+02 2.9723e+01 2.9723e+01 1.5346e-05 1.5346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1320e+00 2.7136e+06 5.8315e+02 5.9098e+02 3.8673e-07 0.0000e+00 1.0000e+00 5.9098e+02 5.9098e+02 3.0185e+01 3.0185e+01 1.5357e-05 1.5357e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1340e+00 2.7532e+06 5.8315e+02 6.0003e+02 3.8137e-07 0.0000e+00 1.0000e+00 6.0003e+02 6.0003e+02 3.0648e+01 3.0648e+01 1.5369e-05 1.5369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1360e+00 2.7928e+06 5.8315e+02 6.0910e+02 3.7616e-07 0.0000e+00 1.0000e+00 6.0910e+02 6.0910e+02 3.1111e+01 3.1111e+01 1.5381e-05 1.5381e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1380e+00 2.8324e+06 5.8315e+02 6.1818e+02 3.7109e-07 0.0000e+00 1.0000e+00 6.1818e+02 6.1818e+02 3.1575e+01 3.1575e+01 1.5393e-05 1.5393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.2727e+02 3.6616e-07 0.0000e+00 1.0000e+00 6.2727e+02 6.2727e+02 3.2039e+01 3.2039e+01 1.5405e-05 1.5405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1420e+00 2.9116e+06 5.8315e+02 6.3637e+02 3.6136e-07 0.0000e+00 1.0000e+00 6.3637e+02 6.3637e+02 3.2504e+01 3.2504e+01 1.5418e-05 1.5418e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1440e+00 2.9512e+06 5.8315e+02 6.4548e+02 3.5668e-07 0.0000e+00 1.0000e+00 6.4548e+02 6.4548e+02 3.2969e+01 3.2969e+01 1.5430e-05 1.5430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1460e+00 2.9908e+06 5.8315e+02 6.5460e+02 3.5213e-07 0.0000e+00 1.0000e+00 6.5460e+02 6.5460e+02 3.3435e+01 3.3435e+01 1.5442e-05 1.5442e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1480e+00 3.0304e+06 5.8315e+02 6.6374e+02 3.4770e-07 0.0000e+00 1.0000e+00 6.6374e+02 6.6374e+02 3.3902e+01 3.3902e+01 1.5455e-05 1.5455e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1500e+00 3.0700e+06 5.8315e+02 6.7288e+02 3.4337e-07 0.0000e+00 1.0000e+00 6.7288e+02 6.7288e+02 3.4369e+01 3.4369e+01 1.5467e-05 1.5467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1520e+00 3.1096e+06 5.8315e+02 6.8204e+02 3.3916e-07 0.0000e+00 1.0000e+00 6.8204e+02 6.8204e+02 3.4837e+01 3.4837e+01 1.5480e-05 1.5480e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1540e+00 3.1492e+06 5.8315e+02 6.9120e+02 3.3505e-07 0.0000e+00 1.0000e+00 6.9120e+02 6.9120e+02 3.5305e+01 3.5305e+01 1.5493e-05 1.5493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1560e+00 3.1888e+06 5.8315e+02 7.0038e+02 3.3104e-07 0.0000e+00 1.0000e+00 7.0038e+02 7.0038e+02 3.5773e+01 3.5773e+01 1.5506e-05 1.5506e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1580e+00 3.2284e+06 5.8315e+02 7.0956e+02 3.2713e-07 0.0000e+00 1.0000e+00 7.0956e+02 7.0956e+02 3.6243e+01 3.6243e+01 1.5519e-05 1.5519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.1876e+02 3.2331e-07 0.0000e+00 1.0000e+00 7.1876e+02 7.1876e+02 3.6712e+01 3.6712e+01 1.5532e-05 1.5532e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1620e+00 3.3076e+06 5.8315e+02 7.2797e+02 3.1957e-07 0.0000e+00 1.0000e+00 7.2797e+02 7.2797e+02 3.7183e+01 3.7183e+01 1.5545e-05 1.5545e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1640e+00 3.3472e+06 5.8315e+02 7.3719e+02 3.1593e-07 0.0000e+00 1.0000e+00 7.3719e+02 7.3719e+02 3.7653e+01 3.7653e+01 1.5558e-05 1.5558e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1660e+00 3.3868e+06 5.8315e+02 7.4641e+02 3.1237e-07 0.0000e+00 1.0000e+00 7.4641e+02 7.4641e+02 3.8125e+01 3.8125e+01 1.5572e-05 1.5572e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1680e+00 3.4264e+06 5.8315e+02 7.5565e+02 3.0889e-07 0.0000e+00 1.0000e+00 7.5565e+02 7.5565e+02 3.8597e+01 3.8597e+01 1.5585e-05 1.5585e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1700e+00 3.4660e+06 5.8315e+02 7.6490e+02 3.0548e-07 0.0000e+00 1.0000e+00 7.6490e+02 7.6490e+02 3.9069e+01 3.9069e+01 1.5599e-05 1.5599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1720e+00 3.5056e+06 5.8315e+02 7.7416e+02 3.0215e-07 0.0000e+00 1.0000e+00 7.7416e+02 7.7416e+02 3.9542e+01 3.9542e+01 1.5613e-05 1.5613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1740e+00 3.5452e+06 5.8315e+02 7.8343e+02 2.9890e-07 0.0000e+00 1.0000e+00 7.8343e+02 7.8343e+02 4.0015e+01 4.0015e+01 1.5626e-05 1.5626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1760e+00 3.5848e+06 5.8315e+02 7.9270e+02 2.9571e-07 0.0000e+00 1.0000e+00 7.9270e+02 7.9270e+02 4.0489e+01 4.0489e+01 1.5640e-05 1.5640e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1780e+00 3.6244e+06 5.8315e+02 8.0199e+02 2.9259e-07 0.0000e+00 1.0000e+00 8.0199e+02 8.0199e+02 4.0964e+01 4.0964e+01 1.5654e-05 1.5654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 8.1129e+02 2.8954e-07 0.0000e+00 1.0000e+00 8.1129e+02 8.1129e+02 4.1438e+01 4.1438e+01 1.5668e-05 1.5668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1820e+00 3.7036e+06 5.8315e+02 8.2060e+02 2.8655e-07 0.0000e+00 1.0000e+00 8.2060e+02 8.2060e+02 4.1914e+01 4.1914e+01 1.5683e-05 1.5683e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1840e+00 3.7432e+06 5.8315e+02 8.2991e+02 2.8362e-07 0.0000e+00 1.0000e+00 8.2991e+02 8.2991e+02 4.2390e+01 4.2390e+01 1.5697e-05 1.5697e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1860e+00 3.7828e+06 5.8315e+02 8.3924e+02 2.8075e-07 0.0000e+00 1.0000e+00 8.3924e+02 8.3924e+02 4.2866e+01 4.2866e+01 1.5711e-05 1.5711e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1880e+00 3.8224e+06 5.8315e+02 8.4857e+02 2.7794e-07 0.0000e+00 1.0000e+00 8.4857e+02 8.4857e+02 4.3343e+01 4.3343e+01 1.5726e-05 1.5726e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1900e+00 3.8620e+06 5.8315e+02 8.5792e+02 2.7519e-07 0.0000e+00 1.0000e+00 8.5792e+02 8.5792e+02 4.3820e+01 4.3820e+01 1.5741e-05 1.5741e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1920e+00 3.9016e+06 5.8315e+02 8.6727e+02 2.7249e-07 0.0000e+00 1.0000e+00 8.6727e+02 8.6727e+02 4.4298e+01 4.4298e+01 1.5755e-05 1.5755e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1940e+00 3.9412e+06 5.8315e+02 8.7663e+02 2.6984e-07 0.0000e+00 1.0000e+00 8.7663e+02 8.7663e+02 4.4776e+01 4.4776e+01 1.5770e-05 1.5770e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1960e+00 3.9808e+06 5.8315e+02 8.8601e+02 2.6724e-07 0.0000e+00 1.0000e+00 8.8601e+02 8.8601e+02 4.5255e+01 4.5255e+01 1.5785e-05 1.5785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1980e+00 4.0204e+06 5.8315e+02 8.9539e+02 2.6469e-07 0.0000e+00 1.0000e+00 8.9539e+02 8.9539e+02 4.5734e+01 4.5734e+01 1.5800e-05 1.5800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 9.0478e+02 2.6219e-07 0.0000e+00 1.0000e+00 9.0478e+02 9.0478e+02 4.6214e+01 4.6214e+01 1.5816e-05 1.5816e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2020e+00 4.0996e+06 5.8315e+02 9.1417e+02 2.5974e-07 0.0000e+00 1.0000e+00 9.1417e+02 9.1417e+02 4.6694e+01 4.6694e+01 1.5831e-05 1.5831e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2040e+00 4.1392e+06 5.8315e+02 9.2358e+02 2.5733e-07 0.0000e+00 1.0000e+00 9.2358e+02 9.2358e+02 4.7174e+01 4.7174e+01 1.5846e-05 1.5846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2060e+00 4.1788e+06 5.8315e+02 9.3300e+02 2.5496e-07 0.0000e+00 1.0000e+00 9.3300e+02 9.3300e+02 4.7655e+01 4.7655e+01 1.5862e-05 1.5862e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2080e+00 4.2184e+06 5.8315e+02 9.4242e+02 2.5264e-07 0.0000e+00 1.0000e+00 9.4242e+02 9.4242e+02 4.8136e+01 4.8136e+01 1.5877e-05 1.5877e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2100e+00 4.2580e+06 5.8315e+02 9.5185e+02 2.5036e-07 0.0000e+00 1.0000e+00 9.5185e+02 9.5185e+02 4.8618e+01 4.8618e+01 1.5893e-05 1.5893e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2120e+00 4.2976e+06 5.8315e+02 9.6130e+02 2.4812e-07 0.0000e+00 1.0000e+00 9.6130e+02 9.6130e+02 4.9100e+01 4.9100e+01 1.5909e-05 1.5909e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2140e+00 4.3372e+06 5.8315e+02 9.7074e+02 2.4592e-07 0.0000e+00 1.0000e+00 9.7074e+02 9.7074e+02 4.9583e+01 4.9583e+01 1.5925e-05 1.5925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2160e+00 4.3768e+06 5.8315e+02 9.8020e+02 2.4376e-07 0.0000e+00 1.0000e+00 9.8020e+02 9.8020e+02 5.0066e+01 5.0066e+01 1.5941e-05 1.5941e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2180e+00 4.4164e+06 5.8315e+02 9.8967e+02 2.4163e-07 0.0000e+00 1.0000e+00 9.8967e+02 9.8967e+02 5.0550e+01 5.0550e+01 1.5957e-05 1.5957e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.9914e+02 2.3954e-07 0.0000e+00 1.0000e+00 9.9914e+02 9.9914e+02 5.1033e+01 5.1033e+01 1.5973e-05 1.5973e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2220e+00 4.4956e+06 5.8315e+02 1.0086e+03 2.3749e-07 0.0000e+00 1.0000e+00 1.0086e+03 1.0086e+03 5.1518e+01 5.1518e+01 1.5990e-05 1.5990e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2240e+00 4.5352e+06 5.8315e+02 1.0181e+03 2.3546e-07 0.0000e+00 1.0000e+00 1.0181e+03 1.0181e+03 5.2002e+01 5.2002e+01 1.6006e-05 1.6006e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2260e+00 4.5748e+06 5.8315e+02 1.0276e+03 2.3348e-07 0.0000e+00 1.0000e+00 1.0276e+03 1.0276e+03 5.2488e+01 5.2488e+01 1.6023e-05 1.6023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2280e+00 4.6144e+06 5.8315e+02 1.0371e+03 2.3152e-07 0.0000e+00 1.0000e+00 1.0371e+03 1.0371e+03 5.2973e+01 5.2973e+01 1.6039e-05 1.6039e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2300e+00 4.6540e+06 5.8315e+02 1.0466e+03 2.2960e-07 0.0000e+00 1.0000e+00 1.0466e+03 1.0466e+03 5.3459e+01 5.3459e+01 1.6056e-05 1.6056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2320e+00 4.6936e+06 5.8315e+02 1.0561e+03 2.2771e-07 0.0000e+00 1.0000e+00 1.0561e+03 1.0561e+03 5.3945e+01 5.3945e+01 1.6073e-05 1.6073e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2340e+00 4.7332e+06 5.8315e+02 1.0657e+03 2.2584e-07 0.0000e+00 1.0000e+00 1.0657e+03 1.0657e+03 5.4432e+01 5.4432e+01 1.6090e-05 1.6090e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2360e+00 4.7728e+06 5.8315e+02 1.0752e+03 2.2401e-07 0.0000e+00 1.0000e+00 1.0752e+03 1.0752e+03 5.4919e+01 5.4919e+01 1.6107e-05 1.6107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2380e+00 4.8124e+06 5.8315e+02 1.0847e+03 2.2221e-07 0.0000e+00 1.0000e+00 1.0847e+03 1.0847e+03 5.5406e+01 5.5406e+01 1.6125e-05 1.6125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0943e+03 2.2043e-07 0.0000e+00 1.0000e+00 1.0943e+03 1.0943e+03 5.5894e+01 5.5894e+01 1.6142e-05 1.6142e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2420e+00 4.8916e+06 5.8315e+02 1.1039e+03 2.1868e-07 0.0000e+00 1.0000e+00 1.1039e+03 1.1039e+03 5.6382e+01 5.6382e+01 1.6159e-05 1.6159e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2440e+00 4.9312e+06 5.8315e+02 1.1134e+03 2.1696e-07 0.0000e+00 1.0000e+00 1.1134e+03 1.1134e+03 5.6870e+01 5.6870e+01 1.6177e-05 1.6177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2460e+00 4.9708e+06 5.8315e+02 1.1230e+03 2.1526e-07 0.0000e+00 1.0000e+00 1.1230e+03 1.1230e+03 5.7359e+01 5.7359e+01 1.6195e-05 1.6195e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2480e+00 5.0104e+06 5.8315e+02 1.1326e+03 2.1359e-07 0.0000e+00 1.0000e+00 1.1326e+03 1.1326e+03 5.7848e+01 5.7848e+01 1.6212e-05 1.6212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2500e+00 5.0500e+06 5.8315e+02 1.1421e+03 2.1194e-07 0.0000e+00 1.0000e+00 1.1421e+03 1.1421e+03 5.8338e+01 5.8338e+01 1.6230e-05 1.6230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2520e+00 5.0896e+06 5.8315e+02 1.1517e+03 2.1032e-07 0.0000e+00 1.0000e+00 1.1517e+03 1.1517e+03 5.8827e+01 5.8827e+01 1.6248e-05 1.6248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2540e+00 5.1292e+06 5.8315e+02 1.1613e+03 2.0872e-07 0.0000e+00 1.0000e+00 1.1613e+03 1.1613e+03 5.9318e+01 5.9318e+01 1.6267e-05 1.6267e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2560e+00 5.1688e+06 5.8315e+02 1.1709e+03 2.0714e-07 0.0000e+00 1.0000e+00 1.1709e+03 1.1709e+03 5.9808e+01 5.9808e+01 1.6285e-05 1.6285e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2580e+00 5.2084e+06 5.8315e+02 1.1805e+03 2.0559e-07 0.0000e+00 1.0000e+00 1.1805e+03 1.1805e+03 6.0299e+01 6.0299e+01 1.6303e-05 1.6303e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1902e+03 2.0406e-07 0.0000e+00 1.0000e+00 1.1902e+03 1.1902e+03 6.0790e+01 6.0790e+01 1.6322e-05 1.6322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2620e+00 5.2876e+06 5.8315e+02 1.1998e+03 2.0255e-07 0.0000e+00 1.0000e+00 1.1998e+03 1.1998e+03 6.1281e+01 6.1281e+01 1.6340e-05 1.6340e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2640e+00 5.3272e+06 5.8315e+02 1.2094e+03 2.0106e-07 0.0000e+00 1.0000e+00 1.2094e+03 1.2094e+03 6.1773e+01 6.1773e+01 1.6359e-05 1.6359e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2660e+00 5.3668e+06 5.8315e+02 1.2190e+03 1.9959e-07 0.0000e+00 1.0000e+00 1.2190e+03 1.2190e+03 6.2265e+01 6.2265e+01 1.6378e-05 1.6378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2680e+00 5.4064e+06 5.8315e+02 1.2287e+03 1.9814e-07 0.0000e+00 1.0000e+00 1.2287e+03 1.2287e+03 6.2757e+01 6.2757e+01 1.6397e-05 1.6397e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2700e+00 5.4460e+06 5.8315e+02 1.2383e+03 1.9671e-07 0.0000e+00 1.0000e+00 1.2383e+03 1.2383e+03 6.3250e+01 6.3250e+01 1.6416e-05 1.6416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2720e+00 5.4856e+06 5.8315e+02 1.2480e+03 1.9530e-07 0.0000e+00 1.0000e+00 1.2480e+03 1.2480e+03 6.3743e+01 6.3743e+01 1.6435e-05 1.6435e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2740e+00 5.5252e+06 5.8315e+02 1.2576e+03 1.9391e-07 0.0000e+00 1.0000e+00 1.2576e+03 1.2576e+03 6.4236e+01 6.4236e+01 1.6454e-05 1.6454e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2760e+00 5.5648e+06 5.8315e+02 1.2673e+03 1.9253e-07 0.0000e+00 1.0000e+00 1.2673e+03 1.2673e+03 6.4729e+01 6.4729e+01 1.6474e-05 1.6474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2780e+00 5.6044e+06 5.8315e+02 1.2769e+03 1.9118e-07 0.0000e+00 1.0000e+00 1.2769e+03 1.2769e+03 6.5223e+01 6.5223e+01 1.6493e-05 1.6493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2866e+03 1.8984e-07 0.0000e+00 1.0000e+00 1.2866e+03 1.2866e+03 6.5717e+01 6.5717e+01 1.6513e-05 1.6513e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2820e+00 5.6836e+06 5.8315e+02 1.2963e+03 1.8852e-07 0.0000e+00 1.0000e+00 1.2963e+03 1.2963e+03 6.6211e+01 6.6211e+01 1.6533e-05 1.6533e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2840e+00 5.7232e+06 5.8315e+02 1.3060e+03 1.8721e-07 0.0000e+00 1.0000e+00 1.3060e+03 1.3060e+03 6.6705e+01 6.6705e+01 1.6553e-05 1.6553e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2860e+00 5.7628e+06 5.8315e+02 1.3156e+03 1.8593e-07 0.0000e+00 1.0000e+00 1.3156e+03 1.3156e+03 6.7200e+01 6.7200e+01 1.6572e-05 1.6572e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2880e+00 5.8024e+06 5.8315e+02 1.3253e+03 1.8466e-07 0.0000e+00 1.0000e+00 1.3253e+03 1.3253e+03 6.7695e+01 6.7695e+01 1.6593e-05 1.6593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2900e+00 5.8420e+06 5.8315e+02 1.3350e+03 1.8340e-07 0.0000e+00 1.0000e+00 1.3350e+03 1.3350e+03 6.8190e+01 6.8190e+01 1.6613e-05 1.6613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2920e+00 5.8816e+06 5.8315e+02 1.3447e+03 1.8216e-07 0.0000e+00 1.0000e+00 1.3447e+03 1.3447e+03 6.8685e+01 6.8685e+01 1.6633e-05 1.6633e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2940e+00 5.9212e+06 5.8315e+02 1.3544e+03 1.8094e-07 0.0000e+00 1.0000e+00 1.3544e+03 1.3544e+03 6.9181e+01 6.9181e+01 1.6654e-05 1.6654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2960e+00 5.9608e+06 5.8315e+02 1.3641e+03 1.7973e-07 0.0000e+00 1.0000e+00 1.3641e+03 1.3641e+03 6.9677e+01 6.9677e+01 1.6674e-05 1.6674e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2980e+00 6.0004e+06 5.8315e+02 1.3738e+03 1.7853e-07 0.0000e+00 1.0000e+00 1.3738e+03 1.3738e+03 7.0173e+01 7.0173e+01 1.6695e-05 1.6695e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3836e+03 1.7735e-07 0.0000e+00 1.0000e+00 1.3836e+03 1.3836e+03 7.0669e+01 7.0669e+01 1.6716e-05 1.6716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3020e+00 6.0796e+06 5.8315e+02 1.3933e+03 1.7619e-07 0.0000e+00 1.0000e+00 1.3933e+03 1.3933e+03 7.1165e+01 7.1165e+01 1.6736e-05 1.6736e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3040e+00 6.1192e+06 5.8315e+02 1.4030e+03 1.7503e-07 0.0000e+00 1.0000e+00 1.4030e+03 1.4030e+03 7.1662e+01 7.1662e+01 1.6757e-05 1.6757e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3060e+00 6.1588e+06 5.8315e+02 1.4127e+03 1.7389e-07 0.0000e+00 1.0000e+00 1.4127e+03 1.4127e+03 7.2159e+01 7.2159e+01 1.6779e-05 1.6779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3080e+00 6.1984e+06 5.8315e+02 1.4225e+03 1.7277e-07 0.0000e+00 1.0000e+00 1.4225e+03 1.4225e+03 7.2656e+01 7.2656e+01 1.6800e-05 1.6800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3100e+00 6.2380e+06 5.8315e+02 1.4322e+03 1.7165e-07 0.0000e+00 1.0000e+00 1.4322e+03 1.4322e+03 7.3153e+01 7.3153e+01 1.6821e-05 1.6821e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3120e+00 6.2776e+06 5.8315e+02 1.4419e+03 1.7055e-07 0.0000e+00 1.0000e+00 1.4419e+03 1.4419e+03 7.3650e+01 7.3650e+01 1.6843e-05 1.6843e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3140e+00 6.3172e+06 5.8315e+02 1.4517e+03 1.6947e-07 0.0000e+00 1.0000e+00 1.4517e+03 1.4517e+03 7.4148e+01 7.4148e+01 1.6864e-05 1.6864e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3160e+00 6.3568e+06 5.8315e+02 1.4614e+03 1.6839e-07 0.0000e+00 1.0000e+00 1.4614e+03 1.4614e+03 7.4645e+01 7.4645e+01 1.6886e-05 1.6886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3180e+00 6.3964e+06 5.8315e+02 1.4712e+03 1.6733e-07 0.0000e+00 1.0000e+00 1.4712e+03 1.4712e+03 7.5143e+01 7.5143e+01 1.6908e-05 1.6908e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4809e+03 1.6627e-07 0.0000e+00 1.0000e+00 1.4809e+03 1.4809e+03 7.5641e+01 7.5641e+01 1.6930e-05 1.6930e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3220e+00 6.4756e+06 5.8315e+02 1.4907e+03 1.6523e-07 0.0000e+00 1.0000e+00 1.4907e+03 1.4907e+03 7.6139e+01 7.6139e+01 1.6952e-05 1.6952e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3240e+00 6.5152e+06 5.8315e+02 1.5004e+03 1.6421e-07 0.0000e+00 1.0000e+00 1.5004e+03 1.5004e+03 7.6637e+01 7.6637e+01 1.6974e-05 1.6974e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3260e+00 6.5548e+06 5.8315e+02 1.5102e+03 1.6319e-07 0.0000e+00 1.0000e+00 1.5102e+03 1.5102e+03 7.7136e+01 7.7136e+01 1.6996e-05 1.6996e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3280e+00 6.5944e+06 5.8315e+02 1.5199e+03 1.6218e-07 0.0000e+00 1.0000e+00 1.5199e+03 1.5199e+03 7.7634e+01 7.7634e+01 1.7019e-05 1.7019e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3300e+00 6.6340e+06 5.8315e+02 1.5297e+03 1.6119e-07 0.0000e+00 1.0000e+00 1.5297e+03 1.5297e+03 7.8133e+01 7.8133e+01 1.7041e-05 1.7041e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3320e+00 6.6736e+06 5.8315e+02 1.5395e+03 1.6020e-07 0.0000e+00 1.0000e+00 1.5395e+03 1.5395e+03 7.8632e+01 7.8632e+01 1.7064e-05 1.7064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3340e+00 6.7132e+06 5.8315e+02 1.5492e+03 1.5923e-07 0.0000e+00 1.0000e+00 1.5492e+03 1.5492e+03 7.9131e+01 7.9131e+01 1.7087e-05 1.7087e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3360e+00 6.7528e+06 5.8315e+02 1.5590e+03 1.5826e-07 0.0000e+00 1.0000e+00 1.5590e+03 1.5590e+03 7.9630e+01 7.9630e+01 1.7110e-05 1.7110e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3380e+00 6.7924e+06 5.8315e+02 1.5688e+03 1.5731e-07 0.0000e+00 1.0000e+00 1.5688e+03 1.5688e+03 8.0129e+01 8.0129e+01 1.7133e-05 1.7133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5785e+03 1.5636e-07 0.0000e+00 1.0000e+00 1.5785e+03 1.5785e+03 8.0628e+01 8.0628e+01 1.7156e-05 1.7156e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3420e+00 6.8716e+06 5.8315e+02 1.5883e+03 1.5543e-07 0.0000e+00 1.0000e+00 1.5883e+03 1.5883e+03 8.1127e+01 8.1127e+01 1.7179e-05 1.7179e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3440e+00 6.9112e+06 5.8315e+02 1.5981e+03 1.5450e-07 0.0000e+00 1.0000e+00 1.5981e+03 1.5981e+03 8.1627e+01 8.1627e+01 1.7202e-05 1.7202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3460e+00 6.9508e+06 5.8315e+02 1.6079e+03 1.5359e-07 0.0000e+00 1.0000e+00 1.6079e+03 1.6079e+03 8.2126e+01 8.2126e+01 1.7226e-05 1.7226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3480e+00 6.9904e+06 5.8315e+02 1.6177e+03 1.5268e-07 0.0000e+00 1.0000e+00 1.6177e+03 1.6177e+03 8.2626e+01 8.2626e+01 1.7249e-05 1.7249e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3500e+00 7.0300e+06 5.8315e+02 1.6274e+03 1.5178e-07 0.0000e+00 1.0000e+00 1.6274e+03 1.6274e+03 8.3125e+01 8.3125e+01 1.7273e-05 1.7273e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3520e+00 7.0696e+06 5.8315e+02 1.6372e+03 1.5089e-07 0.0000e+00 1.0000e+00 1.6372e+03 1.6372e+03 8.3625e+01 8.3625e+01 1.7297e-05 1.7297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3540e+00 7.1092e+06 5.8315e+02 1.6470e+03 1.5001e-07 0.0000e+00 1.0000e+00 1.6470e+03 1.6470e+03 8.4125e+01 8.4125e+01 1.7321e-05 1.7321e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3560e+00 7.1488e+06 5.8315e+02 1.6568e+03 1.4914e-07 0.0000e+00 1.0000e+00 1.6568e+03 1.6568e+03 8.4624e+01 8.4624e+01 1.7345e-05 1.7345e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3580e+00 7.1884e+06 5.8315e+02 1.6666e+03 1.4828e-07 0.0000e+00 1.0000e+00 1.6666e+03 1.6666e+03 8.5124e+01 8.5124e+01 1.7369e-05 1.7369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6764e+03 1.4743e-07 0.0000e+00 1.0000e+00 1.6764e+03 1.6764e+03 8.5624e+01 8.5624e+01 1.7393e-05 1.7393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3620e+00 7.2676e+06 5.8315e+02 1.6862e+03 1.4658e-07 0.0000e+00 1.0000e+00 1.6862e+03 1.6862e+03 8.6124e+01 8.6124e+01 1.7417e-05 1.7417e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3640e+00 7.3072e+06 5.8315e+02 1.6959e+03 1.4574e-07 0.0000e+00 1.0000e+00 1.6959e+03 1.6959e+03 8.6624e+01 8.6624e+01 1.7442e-05 1.7442e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3660e+00 7.3468e+06 5.8315e+02 1.7057e+03 1.4491e-07 0.0000e+00 1.0000e+00 1.7057e+03 1.7057e+03 8.7124e+01 8.7124e+01 1.7467e-05 1.7467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3680e+00 7.3864e+06 5.8315e+02 1.7155e+03 1.4409e-07 0.0000e+00 1.0000e+00 1.7155e+03 1.7155e+03 8.7624e+01 8.7624e+01 1.7491e-05 1.7491e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3700e+00 7.4260e+06 5.8315e+02 1.7253e+03 1.4328e-07 0.0000e+00 1.0000e+00 1.7253e+03 1.7253e+03 8.8124e+01 8.8124e+01 1.7516e-05 1.7516e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3720e+00 7.4656e+06 5.8315e+02 1.7351e+03 1.4247e-07 0.0000e+00 1.0000e+00 1.7351e+03 1.7351e+03 8.8624e+01 8.8624e+01 1.7541e-05 1.7541e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3740e+00 7.5052e+06 5.8315e+02 1.7449e+03 1.4167e-07 0.0000e+00 1.0000e+00 1.7449e+03 1.7449e+03 8.9124e+01 8.9124e+01 1.7566e-05 1.7566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3760e+00 7.5448e+06 5.8315e+02 1.7547e+03 1.4088e-07 0.0000e+00 1.0000e+00 1.7547e+03 1.7547e+03 8.9624e+01 8.9624e+01 1.7591e-05 1.7591e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3780e+00 7.5844e+06 5.8315e+02 1.7645e+03 1.4009e-07 0.0000e+00 1.0000e+00 1.7645e+03 1.7645e+03 9.0124e+01 9.0124e+01 1.7617e-05 1.7617e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7742e+03 1.3931e-07 0.0000e+00 1.0000e+00 1.7742e+03 1.7742e+03 9.0624e+01 9.0624e+01 1.7642e-05 1.7642e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3820e+00 7.6636e+06 5.8315e+02 1.7840e+03 1.3854e-07 0.0000e+00 1.0000e+00 1.7840e+03 1.7840e+03 9.1124e+01 9.1124e+01 1.7668e-05 1.7668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3840e+00 7.7032e+06 5.8315e+02 1.7938e+03 1.3778e-07 0.0000e+00 1.0000e+00 1.7938e+03 1.7938e+03 9.1624e+01 9.1624e+01 1.7693e-05 1.7693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3860e+00 7.7428e+06 5.8315e+02 1.8036e+03 1.3702e-07 0.0000e+00 1.0000e+00 1.8036e+03 1.8036e+03 9.2124e+01 9.2124e+01 1.7719e-05 1.7719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3880e+00 7.7824e+06 5.8315e+02 1.8134e+03 1.3627e-07 0.0000e+00 1.0000e+00 1.8134e+03 1.8134e+03 9.2623e+01 9.2623e+01 1.7745e-05 1.7745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3900e+00 7.8220e+06 5.8315e+02 1.8232e+03 1.3553e-07 0.0000e+00 1.0000e+00 1.8232e+03 1.8232e+03 9.3123e+01 9.3123e+01 1.7771e-05 1.7771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3920e+00 7.8616e+06 5.8315e+02 1.8330e+03 1.3479e-07 0.0000e+00 1.0000e+00 1.8330e+03 1.8330e+03 9.3623e+01 9.3623e+01 1.7797e-05 1.7797e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3940e+00 7.9012e+06 5.8315e+02 1.8427e+03 1.3406e-07 0.0000e+00 1.0000e+00 1.8427e+03 1.8427e+03 9.4123e+01 9.4123e+01 1.7823e-05 1.7823e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3960e+00 7.9408e+06 5.8315e+02 1.8525e+03 1.3334e-07 0.0000e+00 1.0000e+00 1.8525e+03 1.8525e+03 9.4622e+01 9.4622e+01 1.7850e-05 1.7850e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3980e+00 7.9804e+06 5.8315e+02 1.8623e+03 1.3262e-07 0.0000e+00 1.0000e+00 1.8623e+03 1.8623e+03 9.5122e+01 9.5122e+01 1.7876e-05 1.7876e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8721e+03 1.3191e-07 0.0000e+00 1.0000e+00 1.8721e+03 1.8721e+03 9.5621e+01 9.5621e+01 1.7902e-05 1.7902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4020e+00 8.0596e+06 5.8315e+02 1.8819e+03 1.3120e-07 0.0000e+00 1.0000e+00 1.8819e+03 1.8819e+03 9.6121e+01 9.6121e+01 1.7929e-05 1.7929e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4040e+00 8.0992e+06 5.8315e+02 1.8916e+03 1.3050e-07 0.0000e+00 1.0000e+00 1.8916e+03 1.8916e+03 9.6620e+01 9.6620e+01 1.7956e-05 1.7956e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4060e+00 8.1388e+06 5.8315e+02 1.9014e+03 1.2981e-07 0.0000e+00 1.0000e+00 1.9014e+03 1.9014e+03 9.7120e+01 9.7120e+01 1.7983e-05 1.7983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4080e+00 8.1784e+06 5.8315e+02 1.9112e+03 1.2912e-07 0.0000e+00 1.0000e+00 1.9112e+03 1.9112e+03 9.7619e+01 9.7619e+01 1.8010e-05 1.8010e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4100e+00 8.2180e+06 5.8315e+02 1.9210e+03 1.2844e-07 0.0000e+00 1.0000e+00 1.9210e+03 1.9210e+03 9.8118e+01 9.8118e+01 1.8037e-05 1.8037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4120e+00 8.2576e+06 5.8315e+02 1.9307e+03 1.2776e-07 0.0000e+00 1.0000e+00 1.9307e+03 1.9307e+03 9.8617e+01 9.8617e+01 1.8064e-05 1.8064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4140e+00 8.2972e+06 5.8315e+02 1.9405e+03 1.2709e-07 0.0000e+00 1.0000e+00 1.9405e+03 1.9405e+03 9.9116e+01 9.9116e+01 1.8091e-05 1.8091e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4160e+00 8.3368e+06 5.8315e+02 1.9503e+03 1.2643e-07 0.0000e+00 1.0000e+00 1.9503e+03 1.9503e+03 9.9615e+01 9.9615e+01 1.8119e-05 1.8119e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4180e+00 8.3764e+06 5.8315e+02 1.9600e+03 1.2577e-07 0.0000e+00 1.0000e+00 1.9600e+03 1.9600e+03 1.0011e+02 1.0011e+02 1.8146e-05 1.8146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9698e+03 1.2511e-07 0.0000e+00 1.0000e+00 1.9698e+03 1.9698e+03 1.0061e+02 1.0061e+02 1.8174e-05 1.8174e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4220e+00 8.4556e+06 5.8315e+02 1.9795e+03 1.2446e-07 0.0000e+00 1.0000e+00 1.9795e+03 1.9795e+03 1.0111e+02 1.0111e+02 1.8202e-05 1.8202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4240e+00 8.4952e+06 5.8315e+02 1.9893e+03 1.2382e-07 0.0000e+00 1.0000e+00 1.9893e+03 1.9893e+03 1.0161e+02 1.0161e+02 1.8230e-05 1.8230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4260e+00 8.5348e+06 5.8315e+02 1.9991e+03 1.2318e-07 0.0000e+00 1.0000e+00 1.9991e+03 1.9991e+03 1.0211e+02 1.0211e+02 1.8258e-05 1.8258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4280e+00 8.5744e+06 5.8315e+02 2.0088e+03 1.2255e-07 0.0000e+00 1.0000e+00 2.0088e+03 2.0088e+03 1.0260e+02 1.0260e+02 1.8286e-05 1.8286e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4300e+00 8.6140e+06 5.8315e+02 2.0186e+03 1.2192e-07 0.0000e+00 1.0000e+00 2.0186e+03 2.0186e+03 1.0310e+02 1.0310e+02 1.8314e-05 1.8314e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4320e+00 8.6536e+06 5.8315e+02 2.0283e+03 1.2129e-07 0.0000e+00 1.0000e+00 2.0283e+03 2.0283e+03 1.0360e+02 1.0360e+02 1.8342e-05 1.8342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4340e+00 8.6932e+06 5.8315e+02 2.0380e+03 1.2067e-07 0.0000e+00 1.0000e+00 2.0380e+03 2.0380e+03 1.0410e+02 1.0410e+02 1.8371e-05 1.8371e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4360e+00 8.7328e+06 5.8315e+02 2.0478e+03 1.2006e-07 0.0000e+00 1.0000e+00 2.0478e+03 2.0478e+03 1.0459e+02 1.0459e+02 1.8399e-05 1.8399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4380e+00 8.7724e+06 5.8315e+02 2.0575e+03 1.1945e-07 0.0000e+00 1.0000e+00 2.0575e+03 2.0575e+03 1.0509e+02 1.0509e+02 1.8428e-05 1.8428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0672e+03 1.1885e-07 0.0000e+00 1.0000e+00 2.0672e+03 2.0672e+03 1.0559e+02 1.0559e+02 1.8457e-05 1.8457e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4420e+00 8.8516e+06 5.8315e+02 2.0770e+03 1.1825e-07 0.0000e+00 1.0000e+00 2.0770e+03 2.0770e+03 1.0609e+02 1.0609e+02 1.8486e-05 1.8486e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4440e+00 8.8912e+06 5.8315e+02 2.0867e+03 1.1765e-07 0.0000e+00 1.0000e+00 2.0867e+03 2.0867e+03 1.0658e+02 1.0658e+02 1.8514e-05 1.8514e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4460e+00 8.9308e+06 5.8315e+02 2.0964e+03 1.1706e-07 0.0000e+00 1.0000e+00 2.0964e+03 2.0964e+03 1.0708e+02 1.0708e+02 1.8544e-05 1.8544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4480e+00 8.9704e+06 5.8315e+02 2.1061e+03 1.1647e-07 0.0000e+00 1.0000e+00 2.1061e+03 2.1061e+03 1.0758e+02 1.0758e+02 1.8573e-05 1.8573e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4500e+00 9.0100e+06 5.8315e+02 2.1158e+03 1.1589e-07 0.0000e+00 1.0000e+00 2.1158e+03 2.1158e+03 1.0807e+02 1.0807e+02 1.8602e-05 1.8602e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4520e+00 9.0496e+06 5.8315e+02 2.1255e+03 1.1531e-07 0.0000e+00 1.0000e+00 2.1255e+03 2.1255e+03 1.0857e+02 1.0857e+02 1.8631e-05 1.8631e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4540e+00 9.0892e+06 5.8315e+02 2.1353e+03 1.1474e-07 0.0000e+00 1.0000e+00 2.1353e+03 2.1353e+03 1.0906e+02 1.0906e+02 1.8661e-05 1.8661e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4560e+00 9.1288e+06 5.8315e+02 2.1450e+03 1.1417e-07 0.0000e+00 1.0000e+00 2.1450e+03 2.1450e+03 1.0956e+02 1.0956e+02 1.8690e-05 1.8690e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4580e+00 9.1684e+06 5.8315e+02 2.1546e+03 1.1361e-07 0.0000e+00 1.0000e+00 2.1546e+03 2.1546e+03 1.1005e+02 1.1005e+02 1.8720e-05 1.8720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1643e+03 1.1305e-07 0.0000e+00 1.0000e+00 2.1643e+03 2.1643e+03 1.1055e+02 1.1055e+02 1.8750e-05 1.8750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4620e+00 9.2476e+06 5.8315e+02 2.1740e+03 1.1249e-07 0.0000e+00 1.0000e+00 2.1740e+03 2.1740e+03 1.1104e+02 1.1104e+02 1.8780e-05 1.8780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4640e+00 9.2872e+06 5.8315e+02 2.1837e+03 1.1194e-07 0.0000e+00 1.0000e+00 2.1837e+03 2.1837e+03 1.1154e+02 1.1154e+02 1.8810e-05 1.8810e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4660e+00 9.3268e+06 5.8315e+02 2.1934e+03 1.1139e-07 0.0000e+00 1.0000e+00 2.1934e+03 2.1934e+03 1.1203e+02 1.1203e+02 1.8840e-05 1.8840e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4680e+00 9.3664e+06 5.8315e+02 2.2031e+03 1.1085e-07 0.0000e+00 1.0000e+00 2.2031e+03 2.2031e+03 1.1253e+02 1.1253e+02 1.8870e-05 1.8870e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4700e+00 9.4060e+06 5.8315e+02 2.2127e+03 1.1031e-07 0.0000e+00 1.0000e+00 2.2127e+03 2.2127e+03 1.1302e+02 1.1302e+02 1.8900e-05 1.8900e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4720e+00 9.4456e+06 5.8315e+02 2.2224e+03 1.0977e-07 0.0000e+00 1.0000e+00 2.2224e+03 2.2224e+03 1.1351e+02 1.1351e+02 1.8931e-05 1.8931e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4740e+00 9.4852e+06 5.8315e+02 2.2320e+03 1.0924e-07 0.0000e+00 1.0000e+00 2.2320e+03 2.2320e+03 1.1401e+02 1.1401e+02 1.8961e-05 1.8961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4760e+00 9.5248e+06 5.8315e+02 2.2417e+03 1.0871e-07 0.0000e+00 1.0000e+00 2.2417e+03 2.2417e+03 1.1450e+02 1.1450e+02 1.8992e-05 1.8992e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4780e+00 9.5644e+06 5.8315e+02 2.2513e+03 1.0818e-07 0.0000e+00 1.0000e+00 2.2513e+03 2.2513e+03 1.1499e+02 1.1499e+02 1.9023e-05 1.9023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.2610e+03 1.0766e-07 0.0000e+00 1.0000e+00 2.2610e+03 2.2610e+03 1.1549e+02 1.1549e+02 1.9053e-05 1.9053e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4820e+00 9.6436e+06 5.8315e+02 2.2706e+03 1.0714e-07 0.0000e+00 1.0000e+00 2.2706e+03 2.2706e+03 1.1598e+02 1.1598e+02 1.9084e-05 1.9084e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4840e+00 9.6832e+06 5.8315e+02 2.2803e+03 1.0663e-07 0.0000e+00 1.0000e+00 2.2803e+03 2.2803e+03 1.1647e+02 1.1647e+02 1.9115e-05 1.9115e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4860e+00 9.7228e+06 5.8315e+02 2.2899e+03 1.0612e-07 0.0000e+00 1.0000e+00 2.2899e+03 2.2899e+03 1.1696e+02 1.1696e+02 1.9147e-05 1.9147e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4880e+00 9.7624e+06 5.8315e+02 2.2995e+03 1.0561e-07 0.0000e+00 1.0000e+00 2.2995e+03 2.2995e+03 1.1745e+02 1.1745e+02 1.9178e-05 1.9178e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4900e+00 9.8020e+06 5.8315e+02 2.3091e+03 1.0511e-07 0.0000e+00 1.0000e+00 2.3091e+03 2.3091e+03 1.1794e+02 1.1794e+02 1.9209e-05 1.9209e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4920e+00 9.8416e+06 5.8315e+02 2.3187e+03 1.0461e-07 0.0000e+00 1.0000e+00 2.3187e+03 2.3187e+03 1.1843e+02 1.1843e+02 1.9240e-05 1.9240e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4940e+00 9.8812e+06 5.8315e+02 2.3283e+03 1.0411e-07 0.0000e+00 1.0000e+00 2.3283e+03 2.3283e+03 1.1892e+02 1.1892e+02 1.9272e-05 1.9272e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4960e+00 9.9208e+06 5.8315e+02 2.3379e+03 1.0362e-07 0.0000e+00 1.0000e+00 2.3379e+03 2.3379e+03 1.1941e+02 1.1941e+02 1.9304e-05 1.9304e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4980e+00 9.9604e+06 5.8315e+02 2.3475e+03 1.0313e-07 0.0000e+00 1.0000e+00 2.3475e+03 2.3475e+03 1.1990e+02 1.1990e+02 1.9335e-05 1.9335e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.3571e+03 1.0264e-07 0.0000e+00 1.0000e+00 2.3571e+03 2.3571e+03 1.2039e+02 1.2039e+02 1.9367e-05 1.9367e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5020e+00 1.0100e+07 5.8315e+02 2.3813e+03 1.0143e-07 0.0000e+00 1.0000e+00 2.3813e+03 2.3813e+03 1.2163e+02 1.2163e+02 1.9448e-05 1.9448e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5040e+00 1.0200e+07 5.8315e+02 2.4054e+03 1.0024e-07 0.0000e+00 1.0000e+00 2.4054e+03 2.4054e+03 1.2286e+02 1.2286e+02 1.9529e-05 1.9529e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5060e+00 1.0300e+07 5.8315e+02 2.4295e+03 9.9067e-08 0.0000e+00 1.0000e+00 2.4295e+03 2.4295e+03 1.2409e+02 1.2409e+02 1.9611e-05 1.9611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5080e+00 1.0400e+07 5.8315e+02 2.4535e+03 9.7914e-08 0.0000e+00 1.0000e+00 2.4535e+03 2.4535e+03 1.2532e+02 1.2532e+02 1.9693e-05 1.9693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5100e+00 1.0500e+07 5.8315e+02 2.4775e+03 9.6780e-08 0.0000e+00 1.0000e+00 2.4775e+03 2.4775e+03 1.2655e+02 1.2655e+02 1.9776e-05 1.9776e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5120e+00 1.0600e+07 5.8315e+02 2.5015e+03 9.5665e-08 0.0000e+00 1.0000e+00 2.5015e+03 2.5015e+03 1.2777e+02 1.2777e+02 1.9860e-05 1.9860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5140e+00 1.0700e+07 5.8315e+02 2.5254e+03 9.4567e-08 0.0000e+00 1.0000e+00 2.5254e+03 2.5254e+03 1.2899e+02 1.2899e+02 1.9944e-05 1.9944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5160e+00 1.0800e+07 5.8315e+02 2.5493e+03 9.3488e-08 0.0000e+00 1.0000e+00 2.5493e+03 2.5493e+03 1.3021e+02 1.3021e+02 2.0029e-05 2.0029e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5180e+00 1.0900e+07 5.8315e+02 2.5731e+03 9.2426e-08 0.0000e+00 1.0000e+00 2.5731e+03 2.5731e+03 1.3143e+02 1.3143e+02 2.0114e-05 2.0114e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5968e+03 9.1381e-08 0.0000e+00 1.0000e+00 2.5968e+03 2.5968e+03 1.3264e+02 1.3264e+02 2.0200e-05 2.0200e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5220e+00 1.1100e+07 5.8315e+02 2.6205e+03 9.0352e-08 0.0000e+00 1.0000e+00 2.6205e+03 2.6205e+03 1.3385e+02 1.3385e+02 2.0286e-05 2.0286e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5240e+00 1.1200e+07 5.8315e+02 2.6442e+03 8.9340e-08 0.0000e+00 1.0000e+00 2.6442e+03 2.6442e+03 1.3506e+02 1.3506e+02 2.0373e-05 2.0373e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5260e+00 1.1300e+07 5.8315e+02 2.6678e+03 8.8343e-08 0.0000e+00 1.0000e+00 2.6678e+03 2.6678e+03 1.3626e+02 1.3626e+02 2.0460e-05 2.0460e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5280e+00 1.1400e+07 5.8315e+02 2.6913e+03 8.7362e-08 0.0000e+00 1.0000e+00 2.6913e+03 2.6913e+03 1.3747e+02 1.3747e+02 2.0548e-05 2.0548e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5300e+00 1.1500e+07 5.8315e+02 2.7148e+03 8.6396e-08 0.0000e+00 1.0000e+00 2.7148e+03 2.7148e+03 1.3866e+02 1.3866e+02 2.0636e-05 2.0636e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5320e+00 1.1600e+07 5.8315e+02 2.7382e+03 8.5444e-08 0.0000e+00 1.0000e+00 2.7382e+03 2.7382e+03 1.3986e+02 1.3986e+02 2.0725e-05 2.0725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5340e+00 1.1700e+07 5.8315e+02 2.7616e+03 8.4507e-08 0.0000e+00 1.0000e+00 2.7616e+03 2.7616e+03 1.4105e+02 1.4105e+02 2.0814e-05 2.0814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5360e+00 1.1800e+07 5.8315e+02 2.7849e+03 8.3585e-08 0.0000e+00 1.0000e+00 2.7849e+03 2.7849e+03 1.4225e+02 1.4225e+02 2.0904e-05 2.0904e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5380e+00 1.1900e+07 5.8315e+02 2.8081e+03 8.2676e-08 0.0000e+00 1.0000e+00 2.8081e+03 2.8081e+03 1.4343e+02 1.4343e+02 2.0994e-05 2.0994e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.8313e+03 8.1781e-08 0.0000e+00 1.0000e+00 2.8313e+03 2.8313e+03 1.4462e+02 1.4462e+02 2.1085e-05 2.1085e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5420e+00 1.2100e+07 5.8315e+02 2.8545e+03 8.0899e-08 0.0000e+00 1.0000e+00 2.8545e+03 2.8545e+03 1.4580e+02 1.4580e+02 2.1176e-05 2.1176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5440e+00 1.2200e+07 5.8315e+02 2.8775e+03 8.0030e-08 0.0000e+00 1.0000e+00 2.8775e+03 2.8775e+03 1.4698e+02 1.4698e+02 2.1267e-05 2.1267e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5460e+00 1.2300e+07 5.8315e+02 2.9005e+03 7.9174e-08 0.0000e+00 1.0000e+00 2.9005e+03 2.9005e+03 1.4815e+02 1.4815e+02 2.1359e-05 2.1359e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5480e+00 1.2400e+07 5.8315e+02 2.9234e+03 7.8331e-08 0.0000e+00 1.0000e+00 2.9234e+03 2.9234e+03 1.4932e+02 1.4932e+02 2.1452e-05 2.1452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5500e+00 1.2500e+07 5.8315e+02 2.9463e+03 7.7500e-08 0.0000e+00 1.0000e+00 2.9463e+03 2.9463e+03 1.5049e+02 1.5049e+02 2.1544e-05 2.1544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5520e+00 1.2600e+07 5.8315e+02 2.9691e+03 7.6681e-08 0.0000e+00 1.0000e+00 2.9691e+03 2.9691e+03 1.5165e+02 1.5165e+02 2.1637e-05 2.1637e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5540e+00 1.2700e+07 5.8315e+02 2.9918e+03 7.5874e-08 0.0000e+00 1.0000e+00 2.9918e+03 2.9918e+03 1.5282e+02 1.5282e+02 2.1731e-05 2.1731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5560e+00 1.2800e+07 5.8315e+02 3.0145e+03 7.5078e-08 0.0000e+00 1.0000e+00 3.0145e+03 3.0145e+03 1.5397e+02 1.5397e+02 2.1825e-05 2.1825e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5580e+00 1.2900e+07 5.8315e+02 3.0371e+03 7.4294e-08 0.0000e+00 1.0000e+00 3.0371e+03 3.0371e+03 1.5513e+02 1.5513e+02 2.1919e-05 2.1919e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 3.0596e+03 7.3522e-08 0.0000e+00 1.0000e+00 3.0596e+03 3.0596e+03 1.5628e+02 1.5628e+02 2.2013e-05 2.2013e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5620e+00 1.3100e+07 5.8315e+02 3.0821e+03 7.2760e-08 0.0000e+00 1.0000e+00 3.0821e+03 3.0821e+03 1.5743e+02 1.5743e+02 2.2108e-05 2.2108e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5640e+00 1.3200e+07 5.8315e+02 3.1045e+03 7.2009e-08 0.0000e+00 1.0000e+00 3.1045e+03 3.1045e+03 1.5857e+02 1.5857e+02 2.2204e-05 2.2204e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5660e+00 1.3300e+07 5.8315e+02 3.1268e+03 7.1268e-08 0.0000e+00 1.0000e+00 3.1268e+03 3.1268e+03 1.5971e+02 1.5971e+02 2.2299e-05 2.2299e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5680e+00 1.3400e+07 5.8315e+02 3.1491e+03 7.0538e-08 0.0000e+00 1.0000e+00 3.1491e+03 3.1491e+03 1.6085e+02 1.6085e+02 2.2395e-05 2.2395e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5700e+00 1.3500e+07 5.8315e+02 3.1712e+03 6.9819e-08 0.0000e+00 1.0000e+00 3.1712e+03 3.1712e+03 1.6198e+02 1.6198e+02 2.2491e-05 2.2491e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5720e+00 1.3600e+07 5.8315e+02 3.1933e+03 6.9109e-08 0.0000e+00 1.0000e+00 3.1933e+03 3.1933e+03 1.6311e+02 1.6311e+02 2.2588e-05 2.2588e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5740e+00 1.3700e+07 5.8315e+02 3.2154e+03 6.8409e-08 0.0000e+00 1.0000e+00 3.2154e+03 3.2154e+03 1.6423e+02 1.6423e+02 2.2684e-05 2.2684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5760e+00 1.3800e+07 5.8315e+02 3.2373e+03 6.7719e-08 0.0000e+00 1.0000e+00 3.2373e+03 3.2373e+03 1.6535e+02 1.6535e+02 2.2781e-05 2.2781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5780e+00 1.3900e+07 5.8315e+02 3.2592e+03 6.7038e-08 0.0000e+00 1.0000e+00 3.2592e+03 3.2592e+03 1.6647e+02 1.6647e+02 2.2879e-05 2.2879e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.2810e+03 6.6367e-08 0.0000e+00 1.0000e+00 3.2810e+03 3.2810e+03 1.6759e+02 1.6759e+02 2.2976e-05 2.2976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5820e+00 1.4100e+07 5.8315e+02 3.3028e+03 6.5705e-08 0.0000e+00 1.0000e+00 3.3028e+03 3.3028e+03 1.6870e+02 1.6870e+02 2.3074e-05 2.3074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5840e+00 1.4200e+07 5.8315e+02 3.3244e+03 6.5052e-08 0.0000e+00 1.0000e+00 3.3244e+03 3.3244e+03 1.6980e+02 1.6980e+02 2.3172e-05 2.3172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5860e+00 1.4300e+07 5.8315e+02 3.3460e+03 6.4408e-08 0.0000e+00 1.0000e+00 3.3460e+03 3.3460e+03 1.7091e+02 1.7091e+02 2.3271e-05 2.3271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5880e+00 1.4400e+07 5.8315e+02 3.3675e+03 6.3773e-08 0.0000e+00 1.0000e+00 3.3675e+03 3.3675e+03 1.7200e+02 1.7200e+02 2.3369e-05 2.3369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5900e+00 1.4500e+07 5.8315e+02 3.3890e+03 6.3147e-08 0.0000e+00 1.0000e+00 3.3890e+03 3.3890e+03 1.7310e+02 1.7310e+02 2.3468e-05 2.3468e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5920e+00 1.4600e+07 5.8315e+02 3.4103e+03 6.2528e-08 0.0000e+00 1.0000e+00 3.4103e+03 3.4103e+03 1.7419e+02 1.7419e+02 2.3567e-05 2.3567e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5940e+00 1.4700e+07 5.8315e+02 3.4316e+03 6.1919e-08 0.0000e+00 1.0000e+00 3.4316e+03 3.4316e+03 1.7528e+02 1.7528e+02 2.3666e-05 2.3666e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5960e+00 1.4800e+07 5.8315e+02 3.4528e+03 6.1317e-08 0.0000e+00 1.0000e+00 3.4528e+03 3.4528e+03 1.7636e+02 1.7636e+02 2.3765e-05 2.3765e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5980e+00 1.4900e+07 5.8315e+02 3.4740e+03 6.0724e-08 0.0000e+00 1.0000e+00 3.4740e+03 3.4740e+03 1.7744e+02 1.7744e+02 2.3865e-05 2.3865e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.4950e+03 6.0138e-08 0.0000e+00 1.0000e+00 3.4950e+03 3.4950e+03 1.7852e+02 1.7852e+02 2.3964e-05 2.3964e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6020e+00 1.5100e+07 5.8315e+02 3.5160e+03 5.9560e-08 0.0000e+00 1.0000e+00 3.5160e+03 3.5160e+03 1.7959e+02 1.7959e+02 2.4064e-05 2.4064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6040e+00 1.5200e+07 5.8315e+02 3.5369e+03 5.8990e-08 0.0000e+00 1.0000e+00 3.5369e+03 3.5369e+03 1.8066e+02 1.8066e+02 2.4164e-05 2.4164e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6060e+00 1.5300e+07 5.8315e+02 3.5577e+03 5.8428e-08 0.0000e+00 1.0000e+00 3.5577e+03 3.5577e+03 1.8172e+02 1.8172e+02 2.4265e-05 2.4265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6080e+00 1.5400e+07 5.8315e+02 3.5785e+03 5.7872e-08 0.0000e+00 1.0000e+00 3.5785e+03 3.5785e+03 1.8278e+02 1.8278e+02 2.4365e-05 2.4365e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6100e+00 1.5500e+07 5.8315e+02 3.5991e+03 5.7325e-08 0.0000e+00 1.0000e+00 3.5991e+03 3.5991e+03 1.8383e+02 1.8383e+02 2.4465e-05 2.4465e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6120e+00 1.5600e+07 5.8315e+02 3.6197e+03 5.6784e-08 0.0000e+00 1.0000e+00 3.6197e+03 3.6197e+03 1.8489e+02 1.8489e+02 2.4566e-05 2.4566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6140e+00 1.5700e+07 5.8315e+02 3.6403e+03 5.6251e-08 0.0000e+00 1.0000e+00 3.6403e+03 3.6403e+03 1.8593e+02 1.8593e+02 2.4667e-05 2.4667e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6160e+00 1.5800e+07 5.8315e+02 3.6607e+03 5.5724e-08 0.0000e+00 1.0000e+00 3.6607e+03 3.6607e+03 1.8698e+02 1.8698e+02 2.4768e-05 2.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6180e+00 1.5900e+07 5.8315e+02 3.6811e+03 5.5204e-08 0.0000e+00 1.0000e+00 3.6811e+03 3.6811e+03 1.8802e+02 1.8802e+02 2.4869e-05 2.4869e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.7013e+03 5.4692e-08 0.0000e+00 1.0000e+00 3.7013e+03 3.7013e+03 1.8905e+02 1.8905e+02 2.4970e-05 2.4970e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6220e+00 1.6100e+07 5.8315e+02 3.7215e+03 5.4185e-08 0.0000e+00 1.0000e+00 3.7215e+03 3.7215e+03 1.9009e+02 1.9009e+02 2.5071e-05 2.5071e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6240e+00 1.6200e+07 5.8315e+02 3.7417e+03 5.3686e-08 0.0000e+00 1.0000e+00 3.7417e+03 3.7417e+03 1.9111e+02 1.9111e+02 2.5172e-05 2.5172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6260e+00 1.6300e+07 5.8315e+02 3.7617e+03 5.3192e-08 0.0000e+00 1.0000e+00 3.7617e+03 3.7617e+03 1.9214e+02 1.9214e+02 2.5273e-05 2.5273e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6280e+00 1.6400e+07 5.8315e+02 3.7817e+03 5.2706e-08 0.0000e+00 1.0000e+00 3.7817e+03 3.7817e+03 1.9316e+02 1.9316e+02 2.5375e-05 2.5375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6300e+00 1.6500e+07 5.8315e+02 3.8016e+03 5.2225e-08 0.0000e+00 1.0000e+00 3.8016e+03 3.8016e+03 1.9417e+02 1.9417e+02 2.5476e-05 2.5476e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6320e+00 1.6600e+07 5.8315e+02 3.8214e+03 5.1751e-08 0.0000e+00 1.0000e+00 3.8214e+03 3.8214e+03 1.9519e+02 1.9519e+02 2.5578e-05 2.5578e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6340e+00 1.6700e+07 5.8315e+02 3.8411e+03 5.1282e-08 0.0000e+00 1.0000e+00 3.8411e+03 3.8411e+03 1.9619e+02 1.9619e+02 2.5679e-05 2.5679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6360e+00 1.6800e+07 5.8315e+02 3.8608e+03 5.0820e-08 0.0000e+00 1.0000e+00 3.8608e+03 3.8608e+03 1.9720e+02 1.9720e+02 2.5781e-05 2.5781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6380e+00 1.6900e+07 5.8315e+02 3.8804e+03 5.0363e-08 0.0000e+00 1.0000e+00 3.8804e+03 3.8804e+03 1.9820e+02 1.9820e+02 2.5882e-05 2.5882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.8999e+03 4.9912e-08 0.0000e+00 1.0000e+00 3.8999e+03 3.8999e+03 1.9920e+02 1.9920e+02 2.5984e-05 2.5984e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6420e+00 1.7100e+07 5.8315e+02 3.9193e+03 4.9467e-08 0.0000e+00 1.0000e+00 3.9193e+03 3.9193e+03 2.0019e+02 2.0019e+02 2.6086e-05 2.6086e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6440e+00 1.7200e+07 5.8315e+02 3.9386e+03 4.9028e-08 0.0000e+00 1.0000e+00 3.9386e+03 3.9386e+03 2.0118e+02 2.0118e+02 2.6187e-05 2.6187e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6460e+00 1.7300e+07 5.8315e+02 3.9579e+03 4.8594e-08 0.0000e+00 1.0000e+00 3.9579e+03 3.9579e+03 2.0216e+02 2.0216e+02 2.6289e-05 2.6289e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6480e+00 1.7400e+07 5.8315e+02 3.9771e+03 4.8166e-08 0.0000e+00 1.0000e+00 3.9771e+03 3.9771e+03 2.0314e+02 2.0314e+02 2.6391e-05 2.6391e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6500e+00 1.7500e+07 5.8315e+02 3.9962e+03 4.7743e-08 0.0000e+00 1.0000e+00 3.9962e+03 3.9962e+03 2.0412e+02 2.0412e+02 2.6493e-05 2.6493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6520e+00 1.7600e+07 5.8315e+02 4.0153e+03 4.7325e-08 0.0000e+00 1.0000e+00 4.0153e+03 4.0153e+03 2.0509e+02 2.0509e+02 2.6595e-05 2.6595e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6540e+00 1.7700e+07 5.8315e+02 4.0342e+03 4.6912e-08 0.0000e+00 1.0000e+00 4.0342e+03 4.0342e+03 2.0606e+02 2.0606e+02 2.6696e-05 2.6696e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6560e+00 1.7800e+07 5.8315e+02 4.0531e+03 4.6505e-08 0.0000e+00 1.0000e+00 4.0531e+03 4.0531e+03 2.0702e+02 2.0702e+02 2.6798e-05 2.6798e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6580e+00 1.7900e+07 5.8315e+02 4.0719e+03 4.6102e-08 0.0000e+00 1.0000e+00 4.0719e+03 4.0719e+03 2.0798e+02 2.0798e+02 2.6900e-05 2.6900e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 4.0907e+03 4.5705e-08 0.0000e+00 1.0000e+00 4.0907e+03 4.0907e+03 2.0894e+02 2.0894e+02 2.7002e-05 2.7002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6620e+00 1.8100e+07 5.8315e+02 4.1093e+03 4.5312e-08 0.0000e+00 1.0000e+00 4.1093e+03 4.1093e+03 2.0989e+02 2.0989e+02 2.7103e-05 2.7103e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6640e+00 1.8200e+07 5.8315e+02 4.1279e+03 4.4925e-08 0.0000e+00 1.0000e+00 4.1279e+03 4.1279e+03 2.1084e+02 2.1084e+02 2.7205e-05 2.7205e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6660e+00 1.8300e+07 5.8315e+02 4.1464e+03 4.4542e-08 0.0000e+00 1.0000e+00 4.1464e+03 4.1464e+03 2.1179e+02 2.1179e+02 2.7307e-05 2.7307e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6680e+00 1.8400e+07 5.8315e+02 4.1648e+03 4.4164e-08 0.0000e+00 1.0000e+00 4.1648e+03 4.1648e+03 2.1273e+02 2.1273e+02 2.7408e-05 2.7408e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6700e+00 1.8500e+07 5.8315e+02 4.1832e+03 4.3790e-08 0.0000e+00 1.0000e+00 4.1832e+03 4.1832e+03 2.1367e+02 2.1367e+02 2.7510e-05 2.7510e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6720e+00 1.8600e+07 5.8315e+02 4.2015e+03 4.3421e-08 0.0000e+00 1.0000e+00 4.2015e+03 4.2015e+03 2.1460e+02 2.1460e+02 2.7611e-05 2.7611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6740e+00 1.8700e+07 5.8315e+02 4.2197e+03 4.3056e-08 0.0000e+00 1.0000e+00 4.2197e+03 4.2197e+03 2.1553e+02 2.1553e+02 2.7713e-05 2.7713e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6760e+00 1.8800e+07 5.8315e+02 4.2378e+03 4.2696e-08 0.0000e+00 1.0000e+00 4.2378e+03 4.2378e+03 2.1646e+02 2.1646e+02 2.7814e-05 2.7814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6780e+00 1.8900e+07 5.8315e+02 4.2559e+03 4.2340e-08 0.0000e+00 1.0000e+00 4.2559e+03 4.2559e+03 2.1738e+02 2.1738e+02 2.7915e-05 2.7915e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.2739e+03 4.1989e-08 0.0000e+00 1.0000e+00 4.2739e+03 4.2739e+03 2.1830e+02 2.1830e+02 2.8017e-05 2.8017e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6820e+00 1.9100e+07 5.8315e+02 4.2918e+03 4.1642e-08 0.0000e+00 1.0000e+00 4.2918e+03 4.2918e+03 2.1921e+02 2.1921e+02 2.8118e-05 2.8118e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6840e+00 1.9200e+07 5.8315e+02 4.3096e+03 4.1299e-08 0.0000e+00 1.0000e+00 4.3096e+03 4.3096e+03 2.2012e+02 2.2012e+02 2.8219e-05 2.8219e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6860e+00 1.9300e+07 5.8315e+02 4.3274e+03 4.0960e-08 0.0000e+00 1.0000e+00 4.3274e+03 4.3274e+03 2.2103e+02 2.2103e+02 2.8320e-05 2.8320e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6880e+00 1.9400e+07 5.8315e+02 4.3451e+03 4.0625e-08 0.0000e+00 1.0000e+00 4.3451e+03 4.3451e+03 2.2193e+02 2.2193e+02 2.8421e-05 2.8421e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6900e+00 1.9500e+07 5.8315e+02 4.3627e+03 4.0294e-08 0.0000e+00 1.0000e+00 4.3627e+03 4.3627e+03 2.2283e+02 2.2283e+02 2.8522e-05 2.8522e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6920e+00 1.9600e+07 5.8315e+02 4.3802e+03 3.9967e-08 0.0000e+00 1.0000e+00 4.3802e+03 4.3802e+03 2.2373e+02 2.2373e+02 2.8623e-05 2.8623e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6940e+00 1.9700e+07 5.8315e+02 4.3977e+03 3.9643e-08 0.0000e+00 1.0000e+00 4.3977e+03 4.3977e+03 2.2462e+02 2.2462e+02 2.8723e-05 2.8723e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6960e+00 1.9800e+07 5.8315e+02 4.4151e+03 3.9324e-08 0.0000e+00 1.0000e+00 4.4151e+03 4.4151e+03 2.2551e+02 2.2551e+02 2.8824e-05 2.8824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6980e+00 1.9900e+07 5.8315e+02 4.4324e+03 3.9008e-08 0.0000e+00 1.0000e+00 4.4324e+03 4.4324e+03 2.2640e+02 2.2640e+02 2.8925e-05 2.8925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.4497e+03 3.8697e-08 0.0000e+00 1.0000e+00 4.4497e+03 4.4497e+03 2.2728e+02 2.2728e+02 2.9025e-05 2.9025e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7020e+00 2.0100e+07 5.8315e+02 4.4668e+03 3.8388e-08 0.0000e+00 1.0000e+00 4.4668e+03 4.4668e+03 2.2815e+02 2.2815e+02 2.9125e-05 2.9125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7040e+00 2.0200e+07 5.8315e+02 4.4840e+03 3.8084e-08 0.0000e+00 1.0000e+00 4.4840e+03 4.4840e+03 2.2903e+02 2.2903e+02 2.9226e-05 2.9226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7060e+00 2.0300e+07 5.8315e+02 4.5010e+03 3.7783e-08 0.0000e+00 1.0000e+00 4.5010e+03 4.5010e+03 2.2990e+02 2.2990e+02 2.9326e-05 2.9326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7080e+00 2.0400e+07 5.8315e+02 4.5180e+03 3.7485e-08 0.0000e+00 1.0000e+00 4.5180e+03 4.5180e+03 2.3077e+02 2.3077e+02 2.9426e-05 2.9426e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7100e+00 2.0500e+07 5.8315e+02 4.5349e+03 3.7191e-08 0.0000e+00 1.0000e+00 4.5349e+03 4.5349e+03 2.3163e+02 2.3163e+02 2.9526e-05 2.9526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7120e+00 2.0600e+07 5.8315e+02 4.5517e+03 3.6900e-08 0.0000e+00 1.0000e+00 4.5517e+03 4.5517e+03 2.3249e+02 2.3249e+02 2.9625e-05 2.9625e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7140e+00 2.0700e+07 5.8315e+02 4.5685e+03 3.6613e-08 0.0000e+00 1.0000e+00 4.5685e+03 4.5685e+03 2.3334e+02 2.3334e+02 2.9725e-05 2.9725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7160e+00 2.0800e+07 5.8315e+02 4.5852e+03 3.6329e-08 0.0000e+00 1.0000e+00 4.5852e+03 4.5852e+03 2.3420e+02 2.3420e+02 2.9824e-05 2.9824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7180e+00 2.0900e+07 5.8315e+02 4.6018e+03 3.6048e-08 0.0000e+00 1.0000e+00 4.6018e+03 4.6018e+03 2.3505e+02 2.3505e+02 2.9924e-05 2.9924e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.6183e+03 3.5771e-08 0.0000e+00 1.0000e+00 4.6183e+03 4.6183e+03 2.3589e+02 2.3589e+02 3.0023e-05 3.0023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7220e+00 2.1100e+07 5.8315e+02 4.6348e+03 3.5496e-08 0.0000e+00 1.0000e+00 4.6348e+03 4.6348e+03 2.3673e+02 2.3673e+02 3.0122e-05 3.0122e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7240e+00 2.1200e+07 5.8315e+02 4.6512e+03 3.5225e-08 0.0000e+00 1.0000e+00 4.6512e+03 4.6512e+03 2.3757e+02 2.3757e+02 3.0221e-05 3.0221e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7260e+00 2.1300e+07 5.8315e+02 4.6676e+03 3.4957e-08 0.0000e+00 1.0000e+00 4.6676e+03 4.6676e+03 2.3841e+02 2.3841e+02 3.0320e-05 3.0320e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7280e+00 2.1400e+07 5.8315e+02 4.6839e+03 3.4691e-08 0.0000e+00 1.0000e+00 4.6839e+03 4.6839e+03 2.3924e+02 2.3924e+02 3.0419e-05 3.0419e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7300e+00 2.1500e+07 5.8315e+02 4.7001e+03 3.4429e-08 0.0000e+00 1.0000e+00 4.7001e+03 4.7001e+03 2.4007e+02 2.4007e+02 3.0518e-05 3.0518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7320e+00 2.1600e+07 5.8315e+02 4.7162e+03 3.4170e-08 0.0000e+00 1.0000e+00 4.7162e+03 4.7162e+03 2.4089e+02 2.4089e+02 3.0616e-05 3.0616e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7340e+00 2.1700e+07 5.8315e+02 4.7323e+03 3.3914e-08 0.0000e+00 1.0000e+00 4.7323e+03 4.7323e+03 2.4171e+02 2.4171e+02 3.0714e-05 3.0714e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7360e+00 2.1800e+07 5.8315e+02 4.7483e+03 3.3660e-08 0.0000e+00 1.0000e+00 4.7483e+03 4.7483e+03 2.4253e+02 2.4253e+02 3.0813e-05 3.0813e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7380e+00 2.1900e+07 5.8315e+02 4.7643e+03 3.3410e-08 0.0000e+00 1.0000e+00 4.7643e+03 4.7643e+03 2.4335e+02 2.4335e+02 3.0911e-05 3.0911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.7802e+03 3.3162e-08 0.0000e+00 1.0000e+00 4.7802e+03 4.7802e+03 2.4416e+02 2.4416e+02 3.1009e-05 3.1009e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7420e+00 2.2100e+07 5.8315e+02 4.7960e+03 3.2917e-08 0.0000e+00 1.0000e+00 4.7960e+03 4.7960e+03 2.4497e+02 2.4497e+02 3.1106e-05 3.1106e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7440e+00 2.2200e+07 5.8315e+02 4.8117e+03 3.2674e-08 0.0000e+00 1.0000e+00 4.8117e+03 4.8117e+03 2.4577e+02 2.4577e+02 3.1204e-05 3.1204e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7460e+00 2.2300e+07 5.8315e+02 4.8274e+03 3.2435e-08 0.0000e+00 1.0000e+00 4.8274e+03 4.8274e+03 2.4657e+02 2.4657e+02 3.1301e-05 3.1301e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7480e+00 2.2400e+07 5.8315e+02 4.8431e+03 3.2198e-08 0.0000e+00 1.0000e+00 4.8431e+03 4.8431e+03 2.4737e+02 2.4737e+02 3.1399e-05 3.1399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7500e+00 2.2500e+07 5.8315e+02 4.8586e+03 3.1963e-08 0.0000e+00 1.0000e+00 4.8586e+03 4.8586e+03 2.4816e+02 2.4816e+02 3.1496e-05 3.1496e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7520e+00 2.2600e+07 5.8315e+02 4.8741e+03 3.1731e-08 0.0000e+00 1.0000e+00 4.8741e+03 4.8741e+03 2.4896e+02 2.4896e+02 3.1593e-05 3.1593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7540e+00 2.2700e+07 5.8315e+02 4.8895e+03 3.1502e-08 0.0000e+00 1.0000e+00 4.8895e+03 4.8895e+03 2.4974e+02 2.4974e+02 3.1690e-05 3.1690e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7560e+00 2.2800e+07 5.8315e+02 4.9049e+03 3.1275e-08 0.0000e+00 1.0000e+00 4.9049e+03 4.9049e+03 2.5053e+02 2.5053e+02 3.1786e-05 3.1786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7580e+00 2.2900e+07 5.8315e+02 4.9202e+03 3.1051e-08 0.0000e+00 1.0000e+00 4.9202e+03 4.9202e+03 2.5131e+02 2.5131e+02 3.1883e-05 3.1883e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.9355e+03 3.0829e-08 0.0000e+00 1.0000e+00 4.9355e+03 4.9355e+03 2.5209e+02 2.5209e+02 3.1979e-05 3.1979e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7620e+00 2.3100e+07 5.8315e+02 4.9507e+03 3.0609e-08 0.0000e+00 1.0000e+00 4.9507e+03 4.9507e+03 2.5287e+02 2.5287e+02 3.2076e-05 3.2076e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7640e+00 2.3200e+07 5.8315e+02 4.9658e+03 3.0392e-08 0.0000e+00 1.0000e+00 4.9658e+03 4.9658e+03 2.5364e+02 2.5364e+02 3.2172e-05 3.2172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7660e+00 2.3300e+07 5.8315e+02 4.9808e+03 3.0177e-08 0.0000e+00 1.0000e+00 4.9808e+03 4.9808e+03 2.5441e+02 2.5441e+02 3.2268e-05 3.2268e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7680e+00 2.3400e+07 5.8315e+02 4.9958e+03 2.9965e-08 0.0000e+00 1.0000e+00 4.9958e+03 4.9958e+03 2.5517e+02 2.5517e+02 3.2363e-05 3.2363e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7700e+00 2.3500e+07 5.8315e+02 5.0108e+03 2.9754e-08 0.0000e+00 1.0000e+00 5.0108e+03 5.0108e+03 2.5594e+02 2.5594e+02 3.2459e-05 3.2459e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7720e+00 2.3600e+07 5.8315e+02 5.0257e+03 2.9546e-08 0.0000e+00 1.0000e+00 5.0257e+03 5.0257e+03 2.5670e+02 2.5670e+02 3.2554e-05 3.2554e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7740e+00 2.3700e+07 5.8315e+02 5.0405e+03 2.9340e-08 0.0000e+00 1.0000e+00 5.0405e+03 5.0405e+03 2.5745e+02 2.5745e+02 3.2650e-05 3.2650e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7760e+00 2.3800e+07 5.8315e+02 5.0552e+03 2.9137e-08 0.0000e+00 1.0000e+00 5.0552e+03 5.0552e+03 2.5821e+02 2.5821e+02 3.2745e-05 3.2745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7780e+00 2.3900e+07 5.8315e+02 5.0699e+03 2.8935e-08 0.0000e+00 1.0000e+00 5.0699e+03 5.0699e+03 2.5896e+02 2.5896e+02 3.2840e-05 3.2840e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 5.0846e+03 2.8736e-08 0.0000e+00 1.0000e+00 5.0846e+03 5.0846e+03 2.5971e+02 2.5971e+02 3.2934e-05 3.2934e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7820e+00 2.4100e+07 5.8315e+02 5.0992e+03 2.8539e-08 0.0000e+00 1.0000e+00 5.0992e+03 5.0992e+03 2.6045e+02 2.6045e+02 3.3029e-05 3.3029e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7840e+00 2.4200e+07 5.8315e+02 5.1137e+03 2.8343e-08 0.0000e+00 1.0000e+00 5.1137e+03 5.1137e+03 2.6119e+02 2.6119e+02 3.3123e-05 3.3123e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7860e+00 2.4300e+07 5.8315e+02 5.1281e+03 2.8150e-08 0.0000e+00 1.0000e+00 5.1281e+03 5.1281e+03 2.6193e+02 2.6193e+02 3.3218e-05 3.3218e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7880e+00 2.4400e+07 5.8315e+02 5.1426e+03 2.7959e-08 0.0000e+00 1.0000e+00 5.1426e+03 5.1426e+03 2.6267e+02 2.6267e+02 3.3312e-05 3.3312e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7900e+00 2.4500e+07 5.8315e+02 5.1569e+03 2.7770e-08 0.0000e+00 1.0000e+00 5.1569e+03 5.1569e+03 2.6340e+02 2.6340e+02 3.3406e-05 3.3406e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7920e+00 2.4600e+07 5.8315e+02 5.1712e+03 2.7583e-08 0.0000e+00 1.0000e+00 5.1712e+03 5.1712e+03 2.6413e+02 2.6413e+02 3.3499e-05 3.3499e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7940e+00 2.4700e+07 5.8315e+02 5.1854e+03 2.7397e-08 0.0000e+00 1.0000e+00 5.1854e+03 5.1854e+03 2.6486e+02 2.6486e+02 3.3593e-05 3.3593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7960e+00 2.4800e+07 5.8315e+02 5.1996e+03 2.7214e-08 0.0000e+00 1.0000e+00 5.1996e+03 5.1996e+03 2.6558e+02 2.6558e+02 3.3686e-05 3.3686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7980e+00 2.4900e+07 5.8315e+02 5.2137e+03 2.7032e-08 0.0000e+00 1.0000e+00 5.2137e+03 5.2137e+03 2.6630e+02 2.6630e+02 3.3780e-05 3.3780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 5.2278e+03 2.6853e-08 0.0000e+00 1.0000e+00 5.2278e+03 5.2278e+03 2.6702e+02 2.6702e+02 3.3873e-05 3.3873e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8020e+00 2.5100e+07 5.8315e+02 5.2418e+03 2.6675e-08 0.0000e+00 1.0000e+00 5.2418e+03 5.2418e+03 2.6774e+02 2.6774e+02 3.3966e-05 3.3966e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8040e+00 2.5200e+07 5.8315e+02 5.2558e+03 2.6499e-08 0.0000e+00 1.0000e+00 5.2558e+03 5.2558e+03 2.6845e+02 2.6845e+02 3.4058e-05 3.4058e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8060e+00 2.5300e+07 5.8315e+02 5.2697e+03 2.6325e-08 0.0000e+00 1.0000e+00 5.2697e+03 5.2697e+03 2.6916e+02 2.6916e+02 3.4151e-05 3.4151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8080e+00 2.5400e+07 5.8315e+02 5.2835e+03 2.6152e-08 0.0000e+00 1.0000e+00 5.2835e+03 5.2835e+03 2.6987e+02 2.6987e+02 3.4243e-05 3.4243e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8100e+00 2.5500e+07 5.8315e+02 5.2973e+03 2.5981e-08 0.0000e+00 1.0000e+00 5.2973e+03 5.2973e+03 2.7057e+02 2.7057e+02 3.4336e-05 3.4336e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8120e+00 2.5600e+07 5.8315e+02 5.3110e+03 2.5812e-08 0.0000e+00 1.0000e+00 5.3110e+03 5.3110e+03 2.7127e+02 2.7127e+02 3.4428e-05 3.4428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8140e+00 2.5700e+07 5.8315e+02 5.3247e+03 2.5645e-08 0.0000e+00 1.0000e+00 5.3247e+03 5.3247e+03 2.7197e+02 2.7197e+02 3.4520e-05 3.4520e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8160e+00 2.5800e+07 5.8315e+02 5.3383e+03 2.5479e-08 0.0000e+00 1.0000e+00 5.3383e+03 5.3383e+03 2.7267e+02 2.7267e+02 3.4611e-05 3.4611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8180e+00 2.5900e+07 5.8315e+02 5.3519e+03 2.5315e-08 0.0000e+00 1.0000e+00 5.3519e+03 5.3519e+03 2.7336e+02 2.7336e+02 3.4703e-05 3.4703e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.3654e+03 2.5153e-08 0.0000e+00 1.0000e+00 5.3654e+03 5.3654e+03 2.7405e+02 2.7405e+02 3.4794e-05 3.4794e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8220e+00 2.6100e+07 5.8315e+02 5.3789e+03 2.4992e-08 0.0000e+00 1.0000e+00 5.3789e+03 5.3789e+03 2.7474e+02 2.7474e+02 3.4885e-05 3.4885e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8240e+00 2.6200e+07 5.8315e+02 5.3923e+03 2.4833e-08 0.0000e+00 1.0000e+00 5.3923e+03 5.3923e+03 2.7543e+02 2.7543e+02 3.4976e-05 3.4976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8260e+00 2.6300e+07 5.8315e+02 5.4057e+03 2.4675e-08 0.0000e+00 1.0000e+00 5.4057e+03 5.4057e+03 2.7611e+02 2.7611e+02 3.5067e-05 3.5067e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8280e+00 2.6400e+07 5.8315e+02 5.4190e+03 2.4519e-08 0.0000e+00 1.0000e+00 5.4190e+03 5.4190e+03 2.7679e+02 2.7679e+02 3.5158e-05 3.5158e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8300e+00 2.6500e+07 5.8315e+02 5.4323e+03 2.4365e-08 0.0000e+00 1.0000e+00 5.4323e+03 5.4323e+03 2.7747e+02 2.7747e+02 3.5248e-05 3.5248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8320e+00 2.6600e+07 5.8315e+02 5.4455e+03 2.4212e-08 0.0000e+00 1.0000e+00 5.4455e+03 5.4455e+03 2.7814e+02 2.7814e+02 3.5339e-05 3.5339e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8340e+00 2.6700e+07 5.8315e+02 5.4586e+03 2.4060e-08 0.0000e+00 1.0000e+00 5.4586e+03 5.4586e+03 2.7881e+02 2.7881e+02 3.5429e-05 3.5429e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8360e+00 2.6800e+07 5.8315e+02 5.4717e+03 2.3910e-08 0.0000e+00 1.0000e+00 5.4717e+03 5.4717e+03 2.7948e+02 2.7948e+02 3.5519e-05 3.5519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8380e+00 2.6900e+07 5.8315e+02 5.4848e+03 2.3762e-08 0.0000e+00 1.0000e+00 5.4848e+03 5.4848e+03 2.8015e+02 2.8015e+02 3.5609e-05 3.5609e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.4978e+03 2.3615e-08 0.0000e+00 1.0000e+00 5.4978e+03 5.4978e+03 2.8081e+02 2.8081e+02 3.5699e-05 3.5699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8420e+00 2.7100e+07 5.8315e+02 5.5108e+03 2.3469e-08 0.0000e+00 1.0000e+00 5.5108e+03 5.5108e+03 2.8148e+02 2.8148e+02 3.5788e-05 3.5788e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8440e+00 2.7200e+07 5.8315e+02 5.5237e+03 2.3324e-08 0.0000e+00 1.0000e+00 5.5237e+03 5.5237e+03 2.8213e+02 2.8213e+02 3.5877e-05 3.5877e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8460e+00 2.7300e+07 5.8315e+02 5.5365e+03 2.3181e-08 0.0000e+00 1.0000e+00 5.5365e+03 5.5365e+03 2.8279e+02 2.8279e+02 3.5967e-05 3.5967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8480e+00 2.7400e+07 5.8315e+02 5.5493e+03 2.3040e-08 0.0000e+00 1.0000e+00 5.5493e+03 5.5493e+03 2.8345e+02 2.8345e+02 3.6056e-05 3.6056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8500e+00 2.7500e+07 5.8315e+02 5.5621e+03 2.2900e-08 0.0000e+00 1.0000e+00 5.5621e+03 5.5621e+03 2.8410e+02 2.8410e+02 3.6144e-05 3.6144e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8520e+00 2.7600e+07 5.8315e+02 5.5748e+03 2.2761e-08 0.0000e+00 1.0000e+00 5.5748e+03 5.5748e+03 2.8475e+02 2.8475e+02 3.6233e-05 3.6233e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8540e+00 2.7700e+07 5.8315e+02 5.5875e+03 2.2623e-08 0.0000e+00 1.0000e+00 5.5875e+03 5.5875e+03 2.8539e+02 2.8539e+02 3.6322e-05 3.6322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8560e+00 2.7800e+07 5.8315e+02 5.6001e+03 2.2487e-08 0.0000e+00 1.0000e+00 5.6001e+03 5.6001e+03 2.8604e+02 2.8604e+02 3.6410e-05 3.6410e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8580e+00 2.7900e+07 5.8315e+02 5.6127e+03 2.2352e-08 0.0000e+00 1.0000e+00 5.6127e+03 5.6127e+03 2.8668e+02 2.8668e+02 3.6498e-05 3.6498e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.6252e+03 2.2218e-08 0.0000e+00 1.0000e+00 5.6252e+03 5.6252e+03 2.8732e+02 2.8732e+02 3.6586e-05 3.6586e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8620e+00 2.8100e+07 5.8315e+02 5.6377e+03 2.2085e-08 0.0000e+00 1.0000e+00 5.6377e+03 5.6377e+03 2.8796e+02 2.8796e+02 3.6674e-05 3.6674e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8640e+00 2.8200e+07 5.8315e+02 5.6501e+03 2.1954e-08 0.0000e+00 1.0000e+00 5.6501e+03 5.6501e+03 2.8859e+02 2.8859e+02 3.6762e-05 3.6762e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8660e+00 2.8300e+07 5.8315e+02 5.6625e+03 2.1824e-08 0.0000e+00 1.0000e+00 5.6625e+03 5.6625e+03 2.8922e+02 2.8922e+02 3.6849e-05 3.6849e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8680e+00 2.8400e+07 5.8315e+02 5.6748e+03 2.1695e-08 0.0000e+00 1.0000e+00 5.6748e+03 5.6748e+03 2.8985e+02 2.8985e+02 3.6937e-05 3.6937e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8700e+00 2.8500e+07 5.8315e+02 5.6871e+03 2.1568e-08 0.0000e+00 1.0000e+00 5.6871e+03 5.6871e+03 2.9048e+02 2.9048e+02 3.7024e-05 3.7024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8720e+00 2.8600e+07 5.8315e+02 5.6993e+03 2.1441e-08 0.0000e+00 1.0000e+00 5.6993e+03 5.6993e+03 2.9111e+02 2.9111e+02 3.7111e-05 3.7111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8740e+00 2.8700e+07 5.8315e+02 5.7115e+03 2.1316e-08 0.0000e+00 1.0000e+00 5.7115e+03 5.7115e+03 2.9173e+02 2.9173e+02 3.7198e-05 3.7198e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8760e+00 2.8800e+07 5.8315e+02 5.7237e+03 2.1192e-08 0.0000e+00 1.0000e+00 5.7237e+03 5.7237e+03 2.9235e+02 2.9235e+02 3.7284e-05 3.7284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8780e+00 2.8900e+07 5.8315e+02 5.7358e+03 2.1069e-08 0.0000e+00 1.0000e+00 5.7358e+03 5.7358e+03 2.9297e+02 2.9297e+02 3.7371e-05 3.7371e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.7479e+03 2.0947e-08 0.0000e+00 1.0000e+00 5.7479e+03 5.7479e+03 2.9359e+02 2.9359e+02 3.7457e-05 3.7457e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8820e+00 2.9100e+07 5.8315e+02 5.7599e+03 2.0826e-08 0.0000e+00 1.0000e+00 5.7599e+03 5.7599e+03 2.9420e+02 2.9420e+02 3.7544e-05 3.7544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8840e+00 2.9200e+07 5.8315e+02 5.7718e+03 2.0706e-08 0.0000e+00 1.0000e+00 5.7718e+03 5.7718e+03 2.9481e+02 2.9481e+02 3.7630e-05 3.7630e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8860e+00 2.9300e+07 5.8315e+02 5.7838e+03 2.0588e-08 0.0000e+00 1.0000e+00 5.7838e+03 5.7838e+03 2.9542e+02 2.9542e+02 3.7716e-05 3.7716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8880e+00 2.9400e+07 5.8315e+02 5.7957e+03 2.0470e-08 0.0000e+00 1.0000e+00 5.7957e+03 5.7957e+03 2.9603e+02 2.9603e+02 3.7801e-05 3.7801e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8900e+00 2.9500e+07 5.8315e+02 5.8075e+03 2.0354e-08 0.0000e+00 1.0000e+00 5.8075e+03 5.8075e+03 2.9663e+02 2.9663e+02 3.7887e-05 3.7887e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8920e+00 2.9600e+07 5.8315e+02 5.8193e+03 2.0238e-08 0.0000e+00 1.0000e+00 5.8193e+03 5.8193e+03 2.9723e+02 2.9723e+02 3.7972e-05 3.7972e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8940e+00 2.9700e+07 5.8315e+02 5.8311e+03 2.0124e-08 0.0000e+00 1.0000e+00 5.8311e+03 5.8311e+03 2.9784e+02 2.9784e+02 3.8058e-05 3.8058e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8960e+00 2.9800e+07 5.8315e+02 5.8428e+03 2.0010e-08 0.0000e+00 1.0000e+00 5.8428e+03 5.8428e+03 2.9843e+02 2.9843e+02 3.8143e-05 3.8143e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8980e+00 2.9900e+07 5.8315e+02 5.8544e+03 1.9898e-08 0.0000e+00 1.0000e+00 5.8544e+03 5.8544e+03 2.9903e+02 2.9903e+02 3.8228e-05 3.8228e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.8661e+03 1.9787e-08 0.0000e+00 1.0000e+00 5.8661e+03 5.8661e+03 2.9962e+02 2.9962e+02 3.8313e-05 3.8313e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9020e+00 3.0100e+07 5.8315e+02 5.8777e+03 1.9676e-08 0.0000e+00 1.0000e+00 5.8777e+03 5.8777e+03 3.0022e+02 3.0022e+02 3.8397e-05 3.8397e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9040e+00 3.0200e+07 5.8315e+02 5.8892e+03 1.9567e-08 0.0000e+00 1.0000e+00 5.8892e+03 5.8892e+03 3.0080e+02 3.0080e+02 3.8482e-05 3.8482e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9060e+00 3.0300e+07 5.8315e+02 5.9007e+03 1.9458e-08 0.0000e+00 1.0000e+00 5.9007e+03 5.9007e+03 3.0139e+02 3.0139e+02 3.8566e-05 3.8566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9080e+00 3.0400e+07 5.8315e+02 5.9122e+03 1.9351e-08 0.0000e+00 1.0000e+00 5.9122e+03 5.9122e+03 3.0198e+02 3.0198e+02 3.8651e-05 3.8651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9100e+00 3.0500e+07 5.8315e+02 5.9236e+03 1.9244e-08 0.0000e+00 1.0000e+00 5.9236e+03 5.9236e+03 3.0256e+02 3.0256e+02 3.8735e-05 3.8735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9120e+00 3.0600e+07 5.8315e+02 5.9350e+03 1.9138e-08 0.0000e+00 1.0000e+00 5.9350e+03 5.9350e+03 3.0314e+02 3.0314e+02 3.8819e-05 3.8819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9140e+00 3.0700e+07 5.8315e+02 5.9463e+03 1.9034e-08 0.0000e+00 1.0000e+00 5.9463e+03 5.9463e+03 3.0372e+02 3.0372e+02 3.8902e-05 3.8902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9160e+00 3.0800e+07 5.8315e+02 5.9576e+03 1.8930e-08 0.0000e+00 1.0000e+00 5.9576e+03 5.9576e+03 3.0430e+02 3.0430e+02 3.8986e-05 3.8986e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9180e+00 3.0900e+07 5.8315e+02 5.9689e+03 1.8827e-08 0.0000e+00 1.0000e+00 5.9689e+03 5.9689e+03 3.0487e+02 3.0487e+02 3.9069e-05 3.9069e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.9801e+03 1.8725e-08 0.0000e+00 1.0000e+00 5.9801e+03 5.9801e+03 3.0545e+02 3.0545e+02 3.9153e-05 3.9153e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9220e+00 3.1100e+07 5.8315e+02 5.9913e+03 1.8624e-08 0.0000e+00 1.0000e+00 5.9913e+03 5.9913e+03 3.0602e+02 3.0602e+02 3.9236e-05 3.9236e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9240e+00 3.1200e+07 5.8315e+02 6.0024e+03 1.8523e-08 0.0000e+00 1.0000e+00 6.0024e+03 6.0024e+03 3.0659e+02 3.0659e+02 3.9319e-05 3.9319e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9260e+00 3.1300e+07 5.8315e+02 6.0135e+03 1.8424e-08 0.0000e+00 1.0000e+00 6.0135e+03 6.0135e+03 3.0715e+02 3.0715e+02 3.9402e-05 3.9402e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9280e+00 3.1400e+07 5.8315e+02 6.0246e+03 1.8325e-08 0.0000e+00 1.0000e+00 6.0246e+03 6.0246e+03 3.0772e+02 3.0772e+02 3.9485e-05 3.9485e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9300e+00 3.1500e+07 5.8315e+02 6.0356e+03 1.8228e-08 0.0000e+00 1.0000e+00 6.0356e+03 6.0356e+03 3.0828e+02 3.0828e+02 3.9567e-05 3.9567e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9320e+00 3.1600e+07 5.8315e+02 6.0466e+03 1.8131e-08 0.0000e+00 1.0000e+00 6.0466e+03 6.0466e+03 3.0884e+02 3.0884e+02 3.9650e-05 3.9650e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9340e+00 3.1700e+07 5.8315e+02 6.0575e+03 1.8035e-08 0.0000e+00 1.0000e+00 6.0575e+03 6.0575e+03 3.0940e+02 3.0940e+02 3.9732e-05 3.9732e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9360e+00 3.1800e+07 5.8315e+02 6.0684e+03 1.7939e-08 0.0000e+00 1.0000e+00 6.0684e+03 6.0684e+03 3.0996e+02 3.0996e+02 3.9814e-05 3.9814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9380e+00 3.1900e+07 5.8315e+02 6.0793e+03 1.7845e-08 0.0000e+00 1.0000e+00 6.0793e+03 6.0793e+03 3.1051e+02 3.1051e+02 3.9896e-05 3.9896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 6.0901e+03 1.7751e-08 0.0000e+00 1.0000e+00 6.0901e+03 6.0901e+03 3.1107e+02 3.1107e+02 3.9978e-05 3.9978e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9420e+00 3.2100e+07 5.8315e+02 6.1009e+03 1.7658e-08 0.0000e+00 1.0000e+00 6.1009e+03 6.1009e+03 3.1162e+02 3.1162e+02 4.0060e-05 4.0060e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9440e+00 3.2200e+07 5.8315e+02 6.1116e+03 1.7566e-08 0.0000e+00 1.0000e+00 6.1116e+03 6.1116e+03 3.1217e+02 3.1217e+02 4.0142e-05 4.0142e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9460e+00 3.2300e+07 5.8315e+02 6.1224e+03 1.7475e-08 0.0000e+00 1.0000e+00 6.1224e+03 6.1224e+03 3.1271e+02 3.1271e+02 4.0223e-05 4.0223e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9480e+00 3.2400e+07 5.8315e+02 6.1330e+03 1.7384e-08 0.0000e+00 1.0000e+00 6.1330e+03 6.1330e+03 3.1326e+02 3.1326e+02 4.0305e-05 4.0305e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9500e+00 3.2500e+07 5.8315e+02 6.1437e+03 1.7294e-08 0.0000e+00 1.0000e+00 6.1437e+03 6.1437e+03 3.1380e+02 3.1380e+02 4.0386e-05 4.0386e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9520e+00 3.2600e+07 5.8315e+02 6.1543e+03 1.7205e-08 0.0000e+00 1.0000e+00 6.1543e+03 6.1543e+03 3.1434e+02 3.1434e+02 4.0467e-05 4.0467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9540e+00 3.2700e+07 5.8315e+02 6.1649e+03 1.7117e-08 0.0000e+00 1.0000e+00 6.1649e+03 6.1649e+03 3.1488e+02 3.1488e+02 4.0548e-05 4.0548e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9560e+00 3.2800e+07 5.8315e+02 6.1754e+03 1.7029e-08 0.0000e+00 1.0000e+00 6.1754e+03 6.1754e+03 3.1542e+02 3.1542e+02 4.0629e-05 4.0629e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9580e+00 3.2900e+07 5.8315e+02 6.1859e+03 1.6942e-08 0.0000e+00 1.0000e+00 6.1859e+03 6.1859e+03 3.1596e+02 3.1596e+02 4.0709e-05 4.0709e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 6.1964e+03 1.6856e-08 0.0000e+00 1.0000e+00 6.1964e+03 6.1964e+03 3.1649e+02 3.1649e+02 4.0790e-05 4.0790e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9620e+00 3.3100e+07 5.8315e+02 6.2068e+03 1.6770e-08 0.0000e+00 1.0000e+00 6.2068e+03 6.2068e+03 3.1703e+02 3.1703e+02 4.0871e-05 4.0871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9640e+00 3.3200e+07 5.8315e+02 6.2172e+03 1.6685e-08 0.0000e+00 1.0000e+00 6.2172e+03 6.2172e+03 3.1756e+02 3.1756e+02 4.0951e-05 4.0951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9660e+00 3.3300e+07 5.8315e+02 6.2275e+03 1.6601e-08 0.0000e+00 1.0000e+00 6.2275e+03 6.2275e+03 3.1809e+02 3.1809e+02 4.1031e-05 4.1031e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9680e+00 3.3400e+07 5.8315e+02 6.2379e+03 1.6517e-08 0.0000e+00 1.0000e+00 6.2379e+03 6.2379e+03 3.1861e+02 3.1861e+02 4.1111e-05 4.1111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9700e+00 3.3500e+07 5.8315e+02 6.2481e+03 1.6435e-08 0.0000e+00 1.0000e+00 6.2481e+03 6.2481e+03 3.1914e+02 3.1914e+02 4.1191e-05 4.1191e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9720e+00 3.3600e+07 5.8315e+02 6.2584e+03 1.6352e-08 0.0000e+00 1.0000e+00 6.2584e+03 6.2584e+03 3.1966e+02 3.1966e+02 4.1271e-05 4.1271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9740e+00 3.3700e+07 5.8315e+02 6.2686e+03 1.6271e-08 0.0000e+00 1.0000e+00 6.2686e+03 6.2686e+03 3.2018e+02 3.2018e+02 4.1350e-05 4.1350e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9760e+00 3.3800e+07 5.8315e+02 6.2788e+03 1.6190e-08 0.0000e+00 1.0000e+00 6.2788e+03 6.2788e+03 3.2070e+02 3.2070e+02 4.1430e-05 4.1430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9780e+00 3.3900e+07 5.8315e+02 6.2889e+03 1.6110e-08 0.0000e+00 1.0000e+00 6.2889e+03 6.2889e+03 3.2122e+02 3.2122e+02 4.1509e-05 4.1509e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 6.2991e+03 1.6030e-08 0.0000e+00 1.0000e+00 6.2991e+03 6.2991e+03 3.2174e+02 3.2174e+02 4.1589e-05 4.1589e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9820e+00 3.4100e+07 5.8315e+02 6.3091e+03 1.5951e-08 0.0000e+00 1.0000e+00 6.3091e+03 6.3091e+03 3.2225e+02 3.2225e+02 4.1668e-05 4.1668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9840e+00 3.4200e+07 5.8315e+02 6.3192e+03 1.5873e-08 0.0000e+00 1.0000e+00 6.3192e+03 6.3192e+03 3.2277e+02 3.2277e+02 4.1747e-05 4.1747e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9860e+00 3.4300e+07 5.8315e+02 6.3292e+03 1.5795e-08 0.0000e+00 1.0000e+00 6.3292e+03 6.3292e+03 3.2328e+02 3.2328e+02 4.1826e-05 4.1826e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9880e+00 3.4400e+07 5.8315e+02 6.3392e+03 1.5718e-08 0.0000e+00 1.0000e+00 6.3392e+03 6.3392e+03 3.2379e+02 3.2379e+02 4.1905e-05 4.1905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9900e+00 3.4500e+07 5.8315e+02 6.3491e+03 1.5642e-08 0.0000e+00 1.0000e+00 6.3491e+03 6.3491e+03 3.2430e+02 3.2430e+02 4.1983e-05 4.1983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9920e+00 3.4600e+07 5.8315e+02 6.3590e+03 1.5566e-08 0.0000e+00 1.0000e+00 6.3590e+03 6.3590e+03 3.2480e+02 3.2480e+02 4.2062e-05 4.2062e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9940e+00 3.4700e+07 5.8315e+02 6.3689e+03 1.5490e-08 0.0000e+00 1.0000e+00 6.3689e+03 6.3689e+03 3.2531e+02 3.2531e+02 4.2141e-05 4.2141e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9960e+00 3.4800e+07 5.8315e+02 6.3788e+03 1.5416e-08 0.0000e+00 1.0000e+00 6.3788e+03 6.3788e+03 3.2581e+02 3.2581e+02 4.2219e-05 4.2219e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9980e+00 3.4900e+07 5.8315e+02 6.3886e+03 1.5342e-08 0.0000e+00 1.0000e+00 6.3886e+03 6.3886e+03 3.2631e+02 3.2631e+02 4.2297e-05 4.2297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 6.3984e+03 1.5268e-08 0.0000e+00 1.0000e+00 6.3984e+03 6.3984e+03 3.2681e+02 3.2681e+02 4.2375e-05 4.2375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt new file mode 100644 index 00000000000..b2034f4c56a --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt @@ -0,0 +1,112 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.3045e+03 1.3265e-08 1.0000e+00 0.0000e+00 6.3045e+03 6.3045e+03 3.2202e+02 3.2202e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.2193e+03 1.3936e-08 1.0000e+00 0.0000e+00 6.2193e+03 6.2193e+03 3.1767e+02 3.1767e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.1311e+03 1.4665e-08 1.0000e+00 0.0000e+00 6.1311e+03 6.1311e+03 3.1316e+02 3.1316e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.0394e+03 1.5459e-08 1.0000e+00 0.0000e+00 6.0394e+03 6.0394e+03 3.0848e+02 3.0848e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 5.9442e+03 1.6327e-08 1.0000e+00 0.0000e+00 5.9442e+03 5.9442e+03 3.0362e+02 3.0362e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-01 3.0000e+07 5.5315e+02 5.8453e+03 1.7277e-08 1.0000e+00 0.0000e+00 5.8453e+03 5.8453e+03 2.9856e+02 2.9856e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-01 2.9000e+07 5.5315e+02 5.7422e+03 1.8321e-08 1.0000e+00 0.0000e+00 5.7422e+03 5.7422e+03 2.9330e+02 2.9330e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-01 2.8000e+07 5.5315e+02 5.6347e+03 1.9473e-08 1.0000e+00 0.0000e+00 5.6347e+03 5.6347e+03 2.8781e+02 2.8781e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-01 2.7000e+07 5.5315e+02 5.5226e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.5226e+03 5.5226e+03 2.8208e+02 2.8208e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.4055e+03 2.2159e-08 0.0000e+00 1.0000e+00 5.4055e+03 5.4055e+03 2.7610e+02 2.7610e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.2829e+03 2.3733e-08 0.0000e+00 1.0000e+00 5.2829e+03 5.2829e+03 2.6984e+02 2.6984e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.1546e+03 2.5493e-08 0.0000e+00 1.0000e+00 5.1546e+03 5.1546e+03 2.6328e+02 2.6328e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.0200e+03 2.7469e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 4.8786e+03 2.9694e-08 0.0000e+00 1.0000e+00 4.8786e+03 4.8786e+03 2.4919e+02 2.4919e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 4.7301e+03 3.2211e-08 0.0000e+00 1.0000e+00 4.7301e+03 4.7301e+03 2.4160e+02 2.4160e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.5737e+03 3.5068e-08 0.0000e+00 1.0000e+00 4.5737e+03 4.5737e+03 2.3361e+02 2.3361e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.4091e+03 3.8325e-08 0.0000e+00 1.0000e+00 4.4091e+03 4.4091e+03 2.2520e+02 2.2520e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.2347e+03 4.1795e-08 2.3675e-01 7.6325e-01 4.4993e+03 4.1589e+03 3.0206e+02 1.9775e+02 1.0000e-03 1.0000e-03 7.9266e-03 2.3296e-03 4.4197e-01 1.0420e-01 8.5138e-02 4.6987e-02 2.2860e-02 1.7555e-02 2.7104e-01 9.2358e-03 3.1473e-03 5.5507e-01 1.1688e-01 8.8507e-02 4.5295e-02 2.0469e-02 1.4561e-02 1.4683e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.0560e+03 4.4524e-08 3.0609e-01 6.9391e-01 4.4207e+03 3.9136e+03 3.2372e+02 1.7636e+02 1.0000e-03 1.0000e-03 7.5002e-03 2.0982e-03 4.0806e-01 9.9831e-02 8.3535e-02 4.7156e-02 2.3431e-02 1.8367e-02 3.1002e-01 9.4071e-03 3.2448e-03 5.6908e-01 1.1861e-01 8.9085e-02 4.5177e-02 2.0213e-02 1.4213e-02 1.3097e-01 +3.8000e-01 1.6000e+07 5.5315e+02 3.8734e+03 4.7696e-08 3.3422e-01 6.6578e-01 4.3320e+03 3.6779e+03 3.4060e+02 1.5976e+02 1.0000e-03 1.0000e-03 7.1117e-03 1.9066e-03 3.7885e-01 9.5701e-02 8.1761e-02 4.7069e-02 2.3818e-02 1.9001e-02 3.4479e-01 9.5237e-03 3.3032e-03 5.7792e-01 1.1984e-01 8.9603e-02 4.5193e-02 2.0091e-02 1.4018e-02 1.2050e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.6863e+03 5.1419e-08 3.4849e-01 6.5151e-01 4.2392e+03 3.4459e+03 3.5504e+02 1.4562e+02 1.0000e-03 1.0000e-03 6.7341e-03 1.7363e-03 3.5186e-01 9.1554e-02 7.9750e-02 4.6759e-02 2.4068e-02 1.9517e-02 3.7803e-01 9.6116e-03 3.3411e-03 5.8405e-01 1.2082e-01 9.0100e-02 4.5287e-02 2.0045e-02 1.3908e-02 1.1284e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.4940e+03 5.5834e-08 3.5574e-01 6.4426e-01 4.1447e+03 3.2153e+03 3.6794e+02 1.3304e+02 1.0000e-03 1.0000e-03 6.3570e-03 1.5798e-03 3.2615e-01 8.7288e-02 7.7465e-02 4.6228e-02 2.4191e-02 1.9928e-02 4.1082e-01 9.6802e-03 3.3655e-03 5.8837e-01 1.2163e-01 9.0586e-02 4.5438e-02 2.0053e-02 1.3857e-02 1.0702e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.2958e+03 6.1133e-08 3.5852e-01 6.4148e-01 4.0495e+03 2.9853e+03 3.7978e+02 1.2155e+02 1.0000e-03 1.0000e-03 5.9751e-03 1.4335e-03 3.0124e-01 8.2844e-02 7.4873e-02 4.5463e-02 2.4183e-02 2.0235e-02 4.4376e-01 9.7340e-03 3.3801e-03 5.9135e-01 1.2231e-01 9.1061e-02 4.5633e-02 2.0103e-02 1.3854e-02 1.0258e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.0907e+03 6.7578e-08 3.5790e-01 6.4210e-01 3.9540e+03 2.7554e+03 3.9082e+02 1.1087e+02 1.0000e-03 1.0000e-03 5.5849e-03 1.2951e-03 2.7684e-01 7.8182e-02 7.1946e-02 4.4447e-02 2.4033e-02 2.0429e-02 4.7724e-01 9.7750e-03 3.3869e-03 5.9321e-01 1.2286e-01 9.1520e-02 4.5862e-02 2.0189e-02 1.3891e-02 9.9300e-02 +4.8000e-01 1.1000e+07 5.5315e+02 2.8777e+03 7.5541e-08 3.5429e-01 6.4571e-01 3.8587e+03 2.5254e+03 4.0126e+02 1.0084e+02 1.0000e-03 1.0000e-03 5.1842e-03 1.1631e-03 2.5279e-01 7.3272e-02 6.8649e-02 4.3152e-02 2.3725e-02 2.0495e-02 5.1157e-01 9.8039e-03 3.3870e-03 5.9409e-01 1.2331e-01 9.1956e-02 4.6116e-02 2.0305e-02 1.3963e-02 9.7067e-02 +5.0000e-01 1.0000e+07 5.5315e+02 2.6555e+03 8.5560e-08 3.4770e-01 6.5230e-01 3.7636e+03 2.2953e+03 4.1122e+02 9.1318e+01 1.0000e-03 1.0000e-03 4.7715e-03 1.0365e-03 2.2895e-01 6.8089e-02 6.4950e-02 4.1548e-02 2.3236e-02 2.0409e-02 5.4701e-01 9.8207e-03 3.3811e-03 5.9404e-01 1.2363e-01 9.2354e-02 4.6386e-02 2.0447e-02 1.4070e-02 9.5871e-02 +5.2000e-01 9.6040e+06 5.5315e+02 2.5647e+03 9.0263e-08 3.4420e-01 6.5580e-01 3.7261e+03 2.2041e+03 4.1505e+02 8.7668e+01 1.0000e-03 1.0000e-03 4.6044e-03 9.8766e-04 2.1955e-01 6.5955e-02 6.3366e-02 4.0820e-02 2.2986e-02 2.0327e-02 5.6140e-01 9.8238e-03 3.3771e-03 5.9376e-01 1.2372e-01 9.2498e-02 4.6496e-02 2.0509e-02 1.4120e-02 9.5699e-02 +5.4000e-01 9.2080e+06 5.5315e+02 2.4722e+03 9.5476e-08 3.4014e-01 6.5986e-01 3.6887e+03 2.1130e+03 4.1883e+02 8.4080e+01 1.0000e-03 1.0000e-03 4.4352e-03 9.3955e-04 2.1017e-01 6.3774e-02 6.1711e-02 4.0036e-02 2.2702e-02 2.0215e-02 5.7602e-01 9.8246e-03 3.3722e-03 5.9333e-01 1.2378e-01 9.2631e-02 4.6605e-02 2.0574e-02 1.4176e-02 9.5709e-02 +5.6000e-01 8.8120e+06 5.5315e+02 2.3778e+03 1.0128e-07 3.3548e-01 6.6452e-01 3.6513e+03 2.0218e+03 4.2256e+02 8.0548e+01 1.0000e-03 1.0000e-03 4.2638e-03 8.9211e-04 2.0080e-01 6.1544e-02 5.9982e-02 3.9192e-02 2.2381e-02 2.0070e-02 5.9088e-01 9.8232e-03 3.3663e-03 5.9273e-01 1.2382e-01 9.2752e-02 4.6714e-02 2.0643e-02 1.4236e-02 9.5913e-02 +5.8000e-01 8.4160e+06 5.5315e+02 2.2814e+03 1.0777e-07 3.3016e-01 6.6984e-01 3.6140e+03 1.9305e+03 4.2624e+02 7.7071e+01 1.0000e-03 1.0000e-03 4.0901e-03 8.4530e-04 1.9144e-01 5.9264e-02 5.8178e-02 3.8287e-02 2.2021e-02 1.9889e-02 6.0599e-01 9.8192e-03 3.3595e-03 5.9197e-01 1.2383e-01 9.2859e-02 4.6820e-02 2.0713e-02 1.4301e-02 9.6328e-02 +6.0000e-01 8.0200e+06 5.5315e+02 2.1830e+03 1.1506e-07 3.2409e-01 6.7591e-01 3.5767e+03 1.8393e+03 4.2988e+02 7.3643e+01 1.0000e-03 1.0000e-03 3.9141e-03 7.9910e-04 1.8209e-01 5.6933e-02 5.6295e-02 3.7317e-02 2.1620e-02 1.9671e-02 6.2137e-01 9.8124e-03 3.3516e-03 5.9102e-01 1.2381e-01 9.2948e-02 4.6923e-02 2.0785e-02 1.4370e-02 9.6973e-02 +6.2000e-01 7.6240e+06 5.5315e+02 2.0824e+03 1.2330e-07 3.1719e-01 6.8281e-01 3.5396e+03 1.7481e+03 4.3348e+02 7.0262e+01 1.0000e-03 1.0000e-03 3.7357e-03 7.5349e-04 1.7274e-01 5.4549e-02 5.4330e-02 3.6279e-02 2.1174e-02 1.9410e-02 6.3703e-01 9.8026e-03 3.3425e-03 5.8989e-01 1.2376e-01 9.3018e-02 4.7021e-02 2.0858e-02 1.4443e-02 9.7873e-02 +6.4000e-01 7.2280e+06 5.5315e+02 1.9796e+03 1.3267e-07 3.0934e-01 6.9066e-01 3.5025e+03 1.6569e+03 4.3704e+02 6.6926e+01 1.0000e-03 1.0000e-03 3.5550e-03 7.0844e-04 1.6339e-01 5.2111e-02 5.2282e-02 3.5169e-02 2.0681e-02 1.9105e-02 6.5300e-01 9.7894e-03 3.3322e-03 5.8853e-01 1.2366e-01 9.3064e-02 4.7112e-02 2.0932e-02 1.4519e-02 9.9057e-02 +6.6000e-01 6.8320e+06 5.5315e+02 1.8744e+03 1.4339e-07 3.0037e-01 6.9963e-01 3.4655e+03 1.5657e+03 4.4057e+02 6.3631e+01 1.0000e-03 1.0000e-03 3.3719e-03 6.6393e-04 1.5405e-01 4.9619e-02 5.0148e-02 3.3986e-02 2.0138e-02 1.8751e-02 6.6928e-01 9.7724e-03 3.3206e-03 5.8694e-01 1.2352e-01 9.3081e-02 4.7194e-02 2.1005e-02 1.4599e-02 1.0057e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.7667e+03 1.5574e-07 2.9011e-01 7.0989e-01 3.4286e+03 1.4746e+03 4.4406e+02 6.0375e+01 1.0000e-03 1.0000e-03 3.1863e-03 6.1996e-04 1.4470e-01 4.7071e-02 4.7924e-02 3.2724e-02 1.9542e-02 1.8343e-02 6.8589e-01 9.7511e-03 3.3075e-03 5.8508e-01 1.2332e-01 9.3064e-02 4.7263e-02 2.1075e-02 1.4681e-02 1.0245e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6564e+03 1.7008e-07 2.7830e-01 7.2170e-01 3.3917e+03 1.3835e+03 4.4753e+02 5.7157e+01 1.0000e-03 1.0000e-03 2.9982e-03 5.7649e-04 1.3535e-01 4.4467e-02 4.5609e-02 3.1380e-02 1.8888e-02 1.7878e-02 7.0285e-01 9.7246e-03 3.2926e-03 5.8291e-01 1.2307e-01 9.3006e-02 4.7317e-02 2.1143e-02 1.4765e-02 1.0477e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5435e+03 1.8691e-07 2.6461e-01 7.3539e-01 3.3549e+03 1.2924e+03 4.5098e+02 5.3973e+01 1.0000e-03 1.0000e-03 2.8076e-03 5.3353e-04 1.2600e-01 4.1804e-02 4.3198e-02 2.9950e-02 1.8174e-02 1.7349e-02 7.2018e-01 9.6922e-03 3.2757e-03 5.8039e-01 1.2274e-01 9.2897e-02 4.7349e-02 2.1205e-02 1.4849e-02 1.0761e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4279e+03 2.0685e-07 2.4862e-01 7.5138e-01 3.3182e+03 1.2015e+03 4.5440e+02 5.0823e+01 1.0000e-03 1.0000e-03 2.6145e-03 4.9105e-04 1.1665e-01 3.9083e-02 4.0689e-02 2.8430e-02 1.7394e-02 1.6752e-02 7.3790e-01 9.6527e-03 3.2564e-03 5.7743e-01 1.2232e-01 9.2726e-02 4.7355e-02 2.1258e-02 1.4931e-02 1.1107e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3096e+03 2.3076e-07 2.2976e-01 7.7024e-01 3.2816e+03 1.1106e+03 4.5780e+02 4.7704e+01 1.0000e-03 1.0000e-03 2.4189e-03 4.4905e-04 1.0729e-01 3.6303e-02 3.8078e-02 2.6816e-02 1.6545e-02 1.6080e-02 7.5602e-01 9.6045e-03 3.2343e-03 5.7396e-01 1.2179e-01 9.2476e-02 4.7325e-02 2.1300e-02 1.5010e-02 1.1530e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.1886e+03 2.5984e-07 2.0720e-01 7.9280e-01 3.2450e+03 1.0197e+03 4.6118e+02 4.4615e+01 1.0000e-03 1.0000e-03 2.2207e-03 4.0751e-04 9.7930e-02 3.3461e-02 3.5364e-02 2.5103e-02 1.5621e-02 1.5325e-02 7.7457e-01 9.5455e-03 3.2086e-03 5.6984e-01 1.2113e-01 9.2127e-02 4.7249e-02 2.1325e-02 1.5082e-02 1.2049e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0651e+03 2.9580e-07 1.7982e-01 8.2018e-01 3.2085e+03 9.2899e+02 4.6454e+02 4.1554e+01 1.0000e-03 1.0000e-03 2.0200e-03 3.6643e-04 8.8564e-02 3.0559e-02 3.2542e-02 2.3287e-02 1.4618e-02 1.4480e-02 7.9356e-01 9.4728e-03 3.1784e-03 5.6492e-01 1.2029e-01 9.1650e-02 4.7111e-02 2.1326e-02 1.5142e-02 1.2691e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.3920e+02 3.4116e-07 1.4592e-01 8.5408e-01 3.1720e+03 8.3838e+02 4.6788e+02 3.8520e+01 1.0000e-03 1.0000e-03 1.8167e-03 3.2579e-04 7.9193e-02 2.7594e-02 2.9610e-02 2.1362e-02 1.3529e-02 1.3537e-02 8.1303e-01 9.3823e-03 3.1423e-03 5.5894e-01 1.1923e-01 9.1002e-02 4.6890e-02 2.1292e-02 1.5183e-02 1.3494e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1147e+02 3.9978e-07 1.0291e-01 8.9709e-01 3.1356e+03 7.4788e+02 4.7122e+02 3.5511e+01 1.0000e-03 1.0000e-03 1.6109e-03 2.8560e-04 6.9819e-02 2.4566e-02 2.6564e-02 1.9322e-02 1.2350e-02 1.2486e-02 8.3300e-01 9.2678e-03 3.0984e-03 5.5155e-01 1.1786e-01 9.0123e-02 4.6552e-02 2.1210e-02 1.5195e-02 1.4514e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8256e+02 4.7788e-07 4.6565e-02 9.5343e-01 3.0992e+03 6.5752e+02 4.7454e+02 3.2526e+01 1.0000e-03 1.0000e-03 1.4025e-03 2.4585e-04 6.0440e-02 2.1475e-02 2.3401e-02 1.7164e-02 1.1073e-02 1.1316e-02 8.5348e-01 9.1199e-03 3.0435e-03 5.4218e-01 1.1607e-01 8.8918e-02 4.6049e-02 2.1055e-02 1.5160e-02 1.5840e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.6562e+02 4.2278e-07 0.0000e+00 1.0000e+00 5.6562e+02 5.6562e+02 2.8890e+01 2.8890e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7157e+02 5.0008e-07 0.0000e+00 1.0000e+00 4.7157e+02 4.7157e+02 2.4087e+01 2.4087e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.7886e+02 6.1350e-07 0.0000e+00 1.0000e+00 3.7886e+02 3.7886e+02 1.9351e+01 1.9351e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8750e+02 7.9638e-07 0.0000e+00 1.0000e+00 2.8750e+02 2.8750e+02 1.4685e+01 1.4685e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9753e+02 1.1413e-06 0.0000e+00 1.0000e+00 1.9753e+02 1.9753e+02 1.0089e+01 1.0089e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0895e+02 2.0366e-06 0.0000e+00 1.0000e+00 1.0895e+02 1.0895e+02 5.5650e+00 5.5650e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1788e+01 1.0021e-05 0.0000e+00 1.0000e+00 2.1788e+01 2.1788e+01 1.1129e+00 1.1129e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0310e+02 2.0316e-06 0.0000e+00 1.0000e+00 1.0310e+02 1.0310e+02 5.2658e+00 5.2658e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8653e+02 1.1362e-06 0.0000e+00 1.0000e+00 1.8653e+02 1.8653e+02 9.5276e+00 9.5276e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7095e+02 7.9121e-07 0.0000e+00 1.0000e+00 2.7095e+02 2.7095e+02 1.3839e+01 1.3839e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5631e+02 6.0826e-07 0.0000e+00 1.0000e+00 3.5631e+02 3.5631e+02 1.8199e+01 1.8199e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4259e+02 4.9480e-07 0.0000e+00 1.0000e+00 4.4259e+02 4.4259e+02 2.2606e+01 2.2606e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.2974e+02 4.1747e-07 0.0000e+00 1.0000e+00 5.2974e+02 5.2974e+02 2.7058e+01 2.7058e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.1772e+02 3.6131e-07 0.0000e+00 1.0000e+00 6.1772e+02 6.1772e+02 3.1552e+01 3.1552e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.0649e+02 3.1862e-07 0.0000e+00 1.0000e+00 7.0649e+02 7.0649e+02 3.6085e+01 3.6085e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 7.9598e+02 2.8501e-07 0.0000e+00 1.0000e+00 7.9598e+02 7.9598e+02 4.0656e+01 4.0656e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 8.8614e+02 2.5781e-07 0.0000e+00 1.0000e+00 8.8614e+02 8.8614e+02 4.5262e+01 4.5262e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.7690e+02 2.3532e-07 0.0000e+00 1.0000e+00 9.7690e+02 9.7690e+02 4.9897e+01 4.9897e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0682e+03 2.1637e-07 0.0000e+00 1.0000e+00 1.0682e+03 1.0682e+03 5.4560e+01 5.4560e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1599e+03 2.0016e-07 0.0000e+00 1.0000e+00 1.1599e+03 1.1599e+03 5.9246e+01 5.9246e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2520e+03 1.8609e-07 0.0000e+00 1.0000e+00 1.2520e+03 1.2520e+03 6.3950e+01 6.3950e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3444e+03 1.7376e-07 0.0000e+00 1.0000e+00 1.3444e+03 1.3444e+03 6.8670e+01 6.8670e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4370e+03 1.6283e-07 0.0000e+00 1.0000e+00 1.4370e+03 1.4370e+03 7.3399e+01 7.3399e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5350e+03 1.6531e-07 9.9906e-03 9.9001e-01 3.1587e+03 1.5271e+03 3.9889e+02 7.7535e+01 1.0000e-03 1.0000e-03 3.4224e-03 7.4676e-04 1.6566e-01 4.9631e-02 4.8032e-02 3.1356e-02 1.8029e-02 1.6397e-02 6.6673e-01 9.0226e-03 3.0091e-03 5.3620e-01 1.1486e-01 8.8062e-02 4.5658e-02 2.0912e-02 1.5095e-02 1.6718e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6347e+03 1.5254e-07 2.3264e-02 9.7674e-01 3.1909e+03 1.6159e+03 3.9472e+02 8.1397e+01 1.0000e-03 1.0000e-03 3.6195e-03 7.9902e-04 1.7618e-01 5.2282e-02 5.0247e-02 3.2572e-02 1.8594e-02 1.6785e-02 6.4892e-01 9.0522e-03 3.0213e-03 5.3818e-01 1.1520e-01 8.8265e-02 4.5726e-02 2.0922e-02 1.5084e-02 1.6455e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7325e+03 1.4139e-07 3.3973e-02 9.6603e-01 3.2230e+03 1.7048e+03 3.9047e+02 8.5341e+01 1.0000e-03 1.0000e-03 3.8148e-03 8.5209e-04 1.8674e-01 5.4885e-02 5.2382e-02 3.3719e-02 1.9113e-02 1.7127e-02 6.3137e-01 9.0753e-03 3.0312e-03 5.3976e-01 1.1547e-01 8.8416e-02 4.5773e-02 2.0926e-02 1.5071e-02 1.6248e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8287e+03 1.3160e-07 4.2388e-02 9.5761e-01 3.2551e+03 1.7939e+03 3.8614e+02 8.9374e+01 1.0000e-03 1.0000e-03 4.0084e-03 9.0604e-04 1.9734e-01 5.7441e-02 5.4439e-02 3.4800e-02 1.9586e-02 1.7425e-02 6.1405e-01 9.0928e-03 3.0389e-03 5.4097e-01 1.1566e-01 8.8522e-02 4.5801e-02 2.0924e-02 1.5057e-02 1.6093e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9231e+03 1.2294e-07 4.8699e-02 9.5130e-01 3.2871e+03 1.8831e+03 3.8171e+02 9.3504e+01 1.0000e-03 1.0000e-03 4.2003e-03 9.6092e-04 2.0799e-01 5.9953e-02 5.6423e-02 3.5817e-02 2.0018e-02 1.7682e-02 5.9696e-01 9.1051e-03 3.0446e-03 5.4185e-01 1.1580e-01 8.8589e-02 4.5814e-02 2.0919e-02 1.5043e-02 1.5984e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0159e+03 1.1524e-07 5.3029e-02 9.4697e-01 3.3191e+03 1.9726e+03 3.7719e+02 9.7741e+01 1.0000e-03 1.0000e-03 4.3908e-03 1.0168e-03 2.1870e-01 6.2421e-02 5.8334e-02 3.6772e-02 2.0409e-02 1.7900e-02 5.8006e-01 9.1125e-03 3.0484e-03 5.4242e-01 1.1587e-01 8.8622e-02 4.5816e-02 2.0912e-02 1.5032e-02 1.5917e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1072e+03 1.0837e-07 5.5445e-02 9.4456e-01 3.3510e+03 2.0622e+03 3.7256e+02 1.0209e+02 1.0000e-03 1.0000e-03 4.5799e-03 1.0738e-03 2.2947e-01 6.4848e-02 6.0176e-02 3.7670e-02 2.0762e-02 1.8083e-02 5.6333e-01 9.1155e-03 3.0503e-03 5.4268e-01 1.1590e-01 8.8625e-02 4.5807e-02 2.0904e-02 1.5022e-02 1.5890e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.1968e+03 1.0221e-07 5.5953e-02 9.4405e-01 3.3827e+03 2.1521e+03 3.6780e+02 1.0657e+02 1.0000e-03 1.0000e-03 4.7678e-03 1.1319e-03 2.4033e-01 6.7236e-02 6.1951e-02 3.8510e-02 2.1079e-02 1.8232e-02 5.4676e-01 9.1142e-03 3.0504e-03 5.4265e-01 1.1588e-01 8.8600e-02 4.5791e-02 2.0895e-02 1.5015e-02 1.5901e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.2850e+03 9.6662e-08 5.4503e-02 9.4550e-01 3.4142e+03 2.2423e+03 3.6290e+02 1.1120e+02 1.0000e-03 1.0000e-03 4.9547e-03 1.1914e-03 2.5129e-01 6.9588e-02 6.3661e-02 3.9297e-02 2.1361e-02 1.8349e-02 5.3031e-01 9.1088e-03 3.0486e-03 5.4232e-01 1.1581e-01 8.8552e-02 4.5770e-02 2.0888e-02 1.5013e-02 1.5949e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5015e+03 8.4869e-08 4.1127e-02 9.5887e-01 3.4926e+03 2.4714e+03 3.4980e+02 1.2364e+02 1.0000e-03 1.0000e-03 5.4241e-03 1.3483e-03 2.7951e-01 7.5387e-02 6.7713e-02 4.1056e-02 2.1929e-02 1.8512e-02 4.8912e-01 9.0766e-03 3.0354e-03 5.4017e-01 1.1544e-01 8.8332e-02 4.5697e-02 2.0878e-02 1.5027e-02 1.6235e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.7099e+03 7.5536e-08 9.4342e-03 9.9057e-01 3.5683e+03 2.7037e+03 3.3530e+02 1.3750e+02 1.0000e-03 1.0000e-03 5.8943e-03 1.5176e-03 3.0890e-01 8.1041e-02 7.1421e-02 4.2512e-02 2.2304e-02 1.8499e-02 4.4791e-01 9.0160e-03 3.0076e-03 5.3586e-01 1.1477e-01 8.7985e-02 4.5616e-02 2.0893e-02 1.5082e-02 1.6776e-01 +1.5600e+00 1.3000e+07 5.8315e+02 2.9203e+03 7.1624e-08 0.0000e+00 1.0000e+00 2.9203e+03 2.9203e+03 1.4916e+02 1.4916e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.1258e+03 6.4571e-08 0.0000e+00 1.0000e+00 3.1258e+03 3.1258e+03 1.5966e+02 1.5966e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.3239e+03 5.8427e-08 0.0000e+00 1.0000e+00 3.3239e+03 3.3239e+03 1.6977e+02 1.6977e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.5142e+03 5.3055e-08 0.0000e+00 1.0000e+00 3.5142e+03 3.5142e+03 1.7950e+02 1.7950e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.6968e+03 4.8343e-08 0.0000e+00 1.0000e+00 3.6968e+03 3.6968e+03 1.8882e+02 1.8882e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 3.8717e+03 4.4199e-08 0.0000e+00 1.0000e+00 3.8717e+03 3.8717e+03 1.9776e+02 1.9776e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.0391e+03 4.0543e-08 0.0000e+00 1.0000e+00 4.0391e+03 4.0391e+03 2.0631e+02 2.0631e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.1993e+03 3.7310e-08 0.0000e+00 1.0000e+00 4.1993e+03 4.1993e+03 2.1449e+02 2.1449e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.3526e+03 3.4441e-08 0.0000e+00 1.0000e+00 4.3526e+03 4.3526e+03 2.2232e+02 2.2232e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.4992e+03 3.1889e-08 0.0000e+00 1.0000e+00 4.4992e+03 4.4992e+03 2.2981e+02 2.2981e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.6396e+03 2.9611e-08 0.0000e+00 1.0000e+00 4.6396e+03 4.6396e+03 2.3698e+02 2.3698e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 4.7741e+03 2.7572e-08 0.0000e+00 1.0000e+00 4.7741e+03 4.7741e+03 2.4385e+02 2.4385e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 4.9030e+03 2.5740e-08 0.0000e+00 1.0000e+00 4.9030e+03 4.9030e+03 2.5043e+02 2.5043e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.0266e+03 2.4091e-08 0.0000e+00 1.0000e+00 5.0266e+03 5.0266e+03 2.5675e+02 2.5675e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.1453e+03 2.2601e-08 0.0000e+00 1.0000e+00 5.1453e+03 5.1453e+03 2.6281e+02 2.6281e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.2593e+03 2.1251e-08 0.0000e+00 1.0000e+00 5.2593e+03 5.2593e+03 2.6863e+02 2.6863e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.3689e+03 2.0024e-08 0.0000e+00 1.0000e+00 5.3689e+03 5.3689e+03 2.7423e+02 2.7423e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.4744e+03 1.8906e-08 0.0000e+00 1.0000e+00 5.4744e+03 5.4744e+03 2.7962e+02 2.7962e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.5760e+03 1.7885e-08 0.0000e+00 1.0000e+00 5.5760e+03 5.5760e+03 2.8481e+02 2.8481e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 5.6739e+03 1.6949e-08 0.0000e+00 1.0000e+00 5.6739e+03 5.6739e+03 2.8981e+02 2.8981e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 5.7684e+03 1.6090e-08 0.0000e+00 1.0000e+00 5.7684e+03 5.7684e+03 2.9463e+02 2.9463e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 5.8596e+03 1.5299e-08 0.0000e+00 1.0000e+00 5.8596e+03 5.8596e+03 2.9929e+02 2.9929e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 5.9477e+03 1.4569e-08 0.0000e+00 1.0000e+00 5.9477e+03 5.9477e+03 3.0379e+02 3.0379e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt new file mode 100644 index 00000000000..aad47b3119c --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt @@ -0,0 +1,1012 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.3045e+03 1.3265e-08 1.0000e+00 0.0000e+00 6.3045e+03 6.3045e+03 3.2202e+02 3.2202e+02 4.1026e-05 4.1026e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-03 3.4900e+07 5.5315e+02 6.2961e+03 1.3330e-08 1.0000e+00 0.0000e+00 6.2961e+03 6.2961e+03 3.2159e+02 3.2159e+02 4.0960e-05 4.0960e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-03 3.4800e+07 5.5315e+02 6.2877e+03 1.3395e-08 1.0000e+00 0.0000e+00 6.2877e+03 6.2877e+03 3.2116e+02 3.2116e+02 4.0894e-05 4.0894e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-03 3.4700e+07 5.5315e+02 6.2792e+03 1.3461e-08 1.0000e+00 0.0000e+00 6.2792e+03 6.2792e+03 3.2073e+02 3.2073e+02 4.0828e-05 4.0828e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-03 3.4600e+07 5.5315e+02 6.2708e+03 1.3527e-08 1.0000e+00 0.0000e+00 6.2708e+03 6.2708e+03 3.2029e+02 3.2029e+02 4.0762e-05 4.0762e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-02 3.4500e+07 5.5315e+02 6.2623e+03 1.3594e-08 1.0000e+00 0.0000e+00 6.2623e+03 6.2623e+03 3.1986e+02 3.1986e+02 4.0696e-05 4.0696e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-02 3.4400e+07 5.5315e+02 6.2537e+03 1.3661e-08 1.0000e+00 0.0000e+00 6.2537e+03 6.2537e+03 3.1942e+02 3.1942e+02 4.0629e-05 4.0629e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-02 3.4300e+07 5.5315e+02 6.2452e+03 1.3729e-08 1.0000e+00 0.0000e+00 6.2452e+03 6.2452e+03 3.1899e+02 3.1899e+02 4.0563e-05 4.0563e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-02 3.4200e+07 5.5315e+02 6.2366e+03 1.3797e-08 1.0000e+00 0.0000e+00 6.2366e+03 6.2366e+03 3.1855e+02 3.1855e+02 4.0496e-05 4.0496e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.8000e-02 3.4100e+07 5.5315e+02 6.2280e+03 1.3866e-08 1.0000e+00 0.0000e+00 6.2280e+03 6.2280e+03 3.1811e+02 3.1811e+02 4.0429e-05 4.0429e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.2193e+03 1.3936e-08 1.0000e+00 0.0000e+00 6.2193e+03 6.2193e+03 3.1767e+02 3.1767e+02 4.0362e-05 4.0362e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.2000e-02 3.3900e+07 5.5315e+02 6.2106e+03 1.4006e-08 1.0000e+00 0.0000e+00 6.2106e+03 6.2106e+03 3.1722e+02 3.1722e+02 4.0295e-05 4.0295e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.4000e-02 3.3800e+07 5.5315e+02 6.2019e+03 1.4077e-08 1.0000e+00 0.0000e+00 6.2019e+03 6.2019e+03 3.1678e+02 3.1678e+02 4.0228e-05 4.0228e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.6000e-02 3.3700e+07 5.5315e+02 6.1932e+03 1.4148e-08 1.0000e+00 0.0000e+00 6.1932e+03 6.1932e+03 3.1633e+02 3.1633e+02 4.0160e-05 4.0160e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.8000e-02 3.3600e+07 5.5315e+02 6.1844e+03 1.4220e-08 1.0000e+00 0.0000e+00 6.1844e+03 6.1844e+03 3.1588e+02 3.1588e+02 4.0093e-05 4.0093e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.0000e-02 3.3500e+07 5.5315e+02 6.1756e+03 1.4293e-08 1.0000e+00 0.0000e+00 6.1756e+03 6.1756e+03 3.1543e+02 3.1543e+02 4.0025e-05 4.0025e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.2000e-02 3.3400e+07 5.5315e+02 6.1668e+03 1.4366e-08 1.0000e+00 0.0000e+00 6.1668e+03 6.1668e+03 3.1498e+02 3.1498e+02 3.9957e-05 3.9957e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.4000e-02 3.3300e+07 5.5315e+02 6.1579e+03 1.4440e-08 1.0000e+00 0.0000e+00 6.1579e+03 6.1579e+03 3.1453e+02 3.1453e+02 3.9889e-05 3.9889e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.6000e-02 3.3200e+07 5.5315e+02 6.1490e+03 1.4514e-08 1.0000e+00 0.0000e+00 6.1490e+03 6.1490e+03 3.1407e+02 3.1407e+02 3.9821e-05 3.9821e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.8000e-02 3.3100e+07 5.5315e+02 6.1400e+03 1.4589e-08 1.0000e+00 0.0000e+00 6.1400e+03 6.1400e+03 3.1362e+02 3.1362e+02 3.9753e-05 3.9753e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.1311e+03 1.4665e-08 1.0000e+00 0.0000e+00 6.1311e+03 6.1311e+03 3.1316e+02 3.1316e+02 3.9684e-05 3.9684e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.2000e-02 3.2900e+07 5.5315e+02 6.1220e+03 1.4741e-08 1.0000e+00 0.0000e+00 6.1220e+03 6.1220e+03 3.1270e+02 3.1270e+02 3.9616e-05 3.9616e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.4000e-02 3.2800e+07 5.5315e+02 6.1130e+03 1.4818e-08 1.0000e+00 0.0000e+00 6.1130e+03 6.1130e+03 3.1224e+02 3.1224e+02 3.9547e-05 3.9547e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.6000e-02 3.2700e+07 5.5315e+02 6.1039e+03 1.4896e-08 1.0000e+00 0.0000e+00 6.1039e+03 6.1039e+03 3.1177e+02 3.1177e+02 3.9478e-05 3.9478e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.8000e-02 3.2600e+07 5.5315e+02 6.0948e+03 1.4974e-08 1.0000e+00 0.0000e+00 6.0948e+03 6.0948e+03 3.1131e+02 3.1131e+02 3.9409e-05 3.9409e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.0000e-02 3.2500e+07 5.5315e+02 6.0857e+03 1.5053e-08 1.0000e+00 0.0000e+00 6.0857e+03 6.0857e+03 3.1084e+02 3.1084e+02 3.9340e-05 3.9340e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.2000e-02 3.2400e+07 5.5315e+02 6.0765e+03 1.5133e-08 1.0000e+00 0.0000e+00 6.0765e+03 6.0765e+03 3.1037e+02 3.1037e+02 3.9270e-05 3.9270e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.4000e-02 3.2300e+07 5.5315e+02 6.0673e+03 1.5213e-08 1.0000e+00 0.0000e+00 6.0673e+03 6.0673e+03 3.0990e+02 3.0990e+02 3.9201e-05 3.9201e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.6000e-02 3.2200e+07 5.5315e+02 6.0580e+03 1.5295e-08 1.0000e+00 0.0000e+00 6.0580e+03 6.0580e+03 3.0943e+02 3.0943e+02 3.9131e-05 3.9131e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.8000e-02 3.2100e+07 5.5315e+02 6.0488e+03 1.5376e-08 1.0000e+00 0.0000e+00 6.0488e+03 6.0488e+03 3.0895e+02 3.0895e+02 3.9061e-05 3.9061e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.0394e+03 1.5459e-08 1.0000e+00 0.0000e+00 6.0394e+03 6.0394e+03 3.0848e+02 3.0848e+02 3.8991e-05 3.8991e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.2000e-02 3.1900e+07 5.5315e+02 6.0301e+03 1.5542e-08 1.0000e+00 0.0000e+00 6.0301e+03 6.0301e+03 3.0800e+02 3.0800e+02 3.8921e-05 3.8921e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.4000e-02 3.1800e+07 5.5315e+02 6.0207e+03 1.5626e-08 1.0000e+00 0.0000e+00 6.0207e+03 6.0207e+03 3.0752e+02 3.0752e+02 3.8851e-05 3.8851e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.6000e-02 3.1700e+07 5.5315e+02 6.0113e+03 1.5711e-08 1.0000e+00 0.0000e+00 6.0113e+03 6.0113e+03 3.0704e+02 3.0704e+02 3.8780e-05 3.8780e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.8000e-02 3.1600e+07 5.5315e+02 6.0018e+03 1.5797e-08 1.0000e+00 0.0000e+00 6.0018e+03 6.0018e+03 3.0656e+02 3.0656e+02 3.8709e-05 3.8709e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.0000e-02 3.1500e+07 5.5315e+02 5.9923e+03 1.5883e-08 1.0000e+00 0.0000e+00 5.9923e+03 5.9923e+03 3.0607e+02 3.0607e+02 3.8639e-05 3.8639e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.2000e-02 3.1400e+07 5.5315e+02 5.9828e+03 1.5970e-08 1.0000e+00 0.0000e+00 5.9828e+03 5.9828e+03 3.0558e+02 3.0558e+02 3.8568e-05 3.8568e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.4000e-02 3.1300e+07 5.5315e+02 5.9732e+03 1.6058e-08 1.0000e+00 0.0000e+00 5.9732e+03 5.9732e+03 3.0509e+02 3.0509e+02 3.8496e-05 3.8496e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.6000e-02 3.1200e+07 5.5315e+02 5.9636e+03 1.6147e-08 1.0000e+00 0.0000e+00 5.9636e+03 5.9636e+03 3.0460e+02 3.0460e+02 3.8425e-05 3.8425e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.8000e-02 3.1100e+07 5.5315e+02 5.9539e+03 1.6236e-08 1.0000e+00 0.0000e+00 5.9539e+03 5.9539e+03 3.0411e+02 3.0411e+02 3.8354e-05 3.8354e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 5.9442e+03 1.6327e-08 1.0000e+00 0.0000e+00 5.9442e+03 5.9442e+03 3.0362e+02 3.0362e+02 3.8282e-05 3.8282e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.2000e-02 3.0900e+07 5.5315e+02 5.9345e+03 1.6418e-08 1.0000e+00 0.0000e+00 5.9345e+03 5.9345e+03 3.0312e+02 3.0312e+02 3.8210e-05 3.8210e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.4000e-02 3.0800e+07 5.5315e+02 5.9248e+03 1.6510e-08 1.0000e+00 0.0000e+00 5.9248e+03 5.9248e+03 3.0262e+02 3.0262e+02 3.8138e-05 3.8138e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.6000e-02 3.0700e+07 5.5315e+02 5.9150e+03 1.6602e-08 1.0000e+00 0.0000e+00 5.9150e+03 5.9150e+03 3.0212e+02 3.0212e+02 3.8066e-05 3.8066e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.8000e-02 3.0600e+07 5.5315e+02 5.9051e+03 1.6696e-08 1.0000e+00 0.0000e+00 5.9051e+03 5.9051e+03 3.0162e+02 3.0162e+02 3.7993e-05 3.7993e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.0000e-02 3.0500e+07 5.5315e+02 5.8952e+03 1.6791e-08 1.0000e+00 0.0000e+00 5.8952e+03 5.8952e+03 3.0111e+02 3.0111e+02 3.7921e-05 3.7921e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.2000e-02 3.0400e+07 5.5315e+02 5.8853e+03 1.6886e-08 1.0000e+00 0.0000e+00 5.8853e+03 5.8853e+03 3.0061e+02 3.0061e+02 3.7848e-05 3.7848e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.4000e-02 3.0300e+07 5.5315e+02 5.8754e+03 1.6982e-08 1.0000e+00 0.0000e+00 5.8754e+03 5.8754e+03 3.0010e+02 3.0010e+02 3.7775e-05 3.7775e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.6000e-02 3.0200e+07 5.5315e+02 5.8654e+03 1.7080e-08 1.0000e+00 0.0000e+00 5.8654e+03 5.8654e+03 2.9959e+02 2.9959e+02 3.7702e-05 3.7702e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.8000e-02 3.0100e+07 5.5315e+02 5.8553e+03 1.7178e-08 1.0000e+00 0.0000e+00 5.8553e+03 5.8553e+03 2.9907e+02 2.9907e+02 3.7629e-05 3.7629e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-01 3.0000e+07 5.5315e+02 5.8453e+03 1.7277e-08 1.0000e+00 0.0000e+00 5.8453e+03 5.8453e+03 2.9856e+02 2.9856e+02 3.7556e-05 3.7556e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0200e-01 2.9900e+07 5.5315e+02 5.8351e+03 1.7377e-08 1.0000e+00 0.0000e+00 5.8351e+03 5.8351e+03 2.9804e+02 2.9804e+02 3.7482e-05 3.7482e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0400e-01 2.9800e+07 5.5315e+02 5.8250e+03 1.7478e-08 1.0000e+00 0.0000e+00 5.8250e+03 5.8250e+03 2.9752e+02 2.9752e+02 3.7408e-05 3.7408e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0600e-01 2.9700e+07 5.5315e+02 5.8148e+03 1.7580e-08 1.0000e+00 0.0000e+00 5.8148e+03 5.8148e+03 2.9700e+02 2.9700e+02 3.7334e-05 3.7334e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0800e-01 2.9600e+07 5.5315e+02 5.8045e+03 1.7683e-08 1.0000e+00 0.0000e+00 5.8045e+03 5.8045e+03 2.9648e+02 2.9648e+02 3.7260e-05 3.7260e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1000e-01 2.9500e+07 5.5315e+02 5.7942e+03 1.7787e-08 1.0000e+00 0.0000e+00 5.7942e+03 5.7942e+03 2.9595e+02 2.9595e+02 3.7186e-05 3.7186e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1200e-01 2.9400e+07 5.5315e+02 5.7839e+03 1.7891e-08 1.0000e+00 0.0000e+00 5.7839e+03 5.7839e+03 2.9543e+02 2.9543e+02 3.7111e-05 3.7111e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1400e-01 2.9300e+07 5.5315e+02 5.7735e+03 1.7997e-08 1.0000e+00 0.0000e+00 5.7735e+03 5.7735e+03 2.9490e+02 2.9490e+02 3.7037e-05 3.7037e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1600e-01 2.9200e+07 5.5315e+02 5.7631e+03 1.8104e-08 1.0000e+00 0.0000e+00 5.7631e+03 5.7631e+03 2.9437e+02 2.9437e+02 3.6962e-05 3.6962e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1800e-01 2.9100e+07 5.5315e+02 5.7527e+03 1.8212e-08 1.0000e+00 0.0000e+00 5.7527e+03 5.7527e+03 2.9383e+02 2.9383e+02 3.6887e-05 3.6887e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-01 2.9000e+07 5.5315e+02 5.7422e+03 1.8321e-08 1.0000e+00 0.0000e+00 5.7422e+03 5.7422e+03 2.9330e+02 2.9330e+02 3.6811e-05 3.6811e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2200e-01 2.8900e+07 5.5315e+02 5.7316e+03 1.8431e-08 1.0000e+00 0.0000e+00 5.7316e+03 5.7316e+03 2.9276e+02 2.9276e+02 3.6736e-05 3.6736e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2400e-01 2.8800e+07 5.5315e+02 5.7211e+03 1.8543e-08 1.0000e+00 0.0000e+00 5.7211e+03 5.7211e+03 2.9222e+02 2.9222e+02 3.6660e-05 3.6660e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2600e-01 2.8700e+07 5.5315e+02 5.7104e+03 1.8655e-08 1.0000e+00 0.0000e+00 5.7104e+03 5.7104e+03 2.9167e+02 2.9167e+02 3.6584e-05 3.6584e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2800e-01 2.8600e+07 5.5315e+02 5.6997e+03 1.8768e-08 1.0000e+00 0.0000e+00 5.6997e+03 5.6997e+03 2.9113e+02 2.9113e+02 3.6508e-05 3.6508e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3000e-01 2.8500e+07 5.5315e+02 5.6890e+03 1.8883e-08 1.0000e+00 0.0000e+00 5.6890e+03 5.6890e+03 2.9058e+02 2.9058e+02 3.6432e-05 3.6432e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3200e-01 2.8400e+07 5.5315e+02 5.6783e+03 1.8998e-08 1.0000e+00 0.0000e+00 5.6783e+03 5.6783e+03 2.9003e+02 2.9003e+02 3.6356e-05 3.6356e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3400e-01 2.8300e+07 5.5315e+02 5.6675e+03 1.9115e-08 1.0000e+00 0.0000e+00 5.6675e+03 5.6675e+03 2.8948e+02 2.8948e+02 3.6279e-05 3.6279e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3600e-01 2.8200e+07 5.5315e+02 5.6566e+03 1.9233e-08 1.0000e+00 0.0000e+00 5.6566e+03 5.6566e+03 2.8892e+02 2.8892e+02 3.6202e-05 3.6202e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3800e-01 2.8100e+07 5.5315e+02 5.6457e+03 1.9352e-08 1.0000e+00 0.0000e+00 5.6457e+03 5.6457e+03 2.8837e+02 2.8837e+02 3.6125e-05 3.6125e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-01 2.8000e+07 5.5315e+02 5.6347e+03 1.9473e-08 1.0000e+00 0.0000e+00 5.6347e+03 5.6347e+03 2.8781e+02 2.8781e+02 3.6048e-05 3.6048e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4200e-01 2.7900e+07 5.5315e+02 5.6237e+03 1.9594e-08 1.0000e+00 0.0000e+00 5.6237e+03 5.6237e+03 2.8725e+02 2.8725e+02 3.5971e-05 3.5971e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4400e-01 2.7800e+07 5.5315e+02 5.6127e+03 1.9717e-08 1.0000e+00 0.0000e+00 5.6127e+03 5.6127e+03 2.8668e+02 2.8668e+02 3.5893e-05 3.5893e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4600e-01 2.7700e+07 5.5315e+02 5.6016e+03 1.9841e-08 1.0000e+00 0.0000e+00 5.6016e+03 5.6016e+03 2.8612e+02 2.8612e+02 3.5815e-05 3.5815e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4800e-01 2.7600e+07 5.5315e+02 5.5905e+03 1.9966e-08 1.0000e+00 0.0000e+00 5.5905e+03 5.5905e+03 2.8555e+02 2.8555e+02 3.5737e-05 3.5737e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.5000e-01 2.7500e+07 5.5315e+02 5.5793e+03 2.0093e-08 0.0000e+00 1.0000e+00 5.5793e+03 5.5793e+03 2.8498e+02 2.8498e+02 3.5659e-05 3.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e-01 2.7400e+07 5.5315e+02 5.5681e+03 2.0221e-08 0.0000e+00 1.0000e+00 5.5681e+03 5.5681e+03 2.8440e+02 2.8440e+02 3.5581e-05 3.5581e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e-01 2.7300e+07 5.5315e+02 5.5568e+03 2.0350e-08 0.0000e+00 1.0000e+00 5.5568e+03 5.5568e+03 2.8383e+02 2.8383e+02 3.5502e-05 3.5502e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e-01 2.7200e+07 5.5315e+02 5.5454e+03 2.0481e-08 0.0000e+00 1.0000e+00 5.5454e+03 5.5454e+03 2.8325e+02 2.8325e+02 3.5423e-05 3.5423e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e-01 2.7100e+07 5.5315e+02 5.5341e+03 2.0613e-08 0.0000e+00 1.0000e+00 5.5341e+03 5.5341e+03 2.8266e+02 2.8266e+02 3.5344e-05 3.5344e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.5226e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.5226e+03 5.5226e+03 2.8208e+02 2.8208e+02 3.5265e-05 3.5265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e-01 2.6900e+07 5.5315e+02 5.5111e+03 2.0881e-08 0.0000e+00 1.0000e+00 5.5111e+03 5.5111e+03 2.8149e+02 2.8149e+02 3.5185e-05 3.5185e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e-01 2.6800e+07 5.5315e+02 5.4996e+03 2.1017e-08 0.0000e+00 1.0000e+00 5.4996e+03 5.4996e+03 2.8091e+02 2.8091e+02 3.5106e-05 3.5106e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e-01 2.6700e+07 5.5315e+02 5.4880e+03 2.1154e-08 0.0000e+00 1.0000e+00 5.4880e+03 5.4880e+03 2.8031e+02 2.8031e+02 3.5026e-05 3.5026e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e-01 2.6600e+07 5.5315e+02 5.4764e+03 2.1293e-08 0.0000e+00 1.0000e+00 5.4764e+03 5.4764e+03 2.7972e+02 2.7972e+02 3.4946e-05 3.4946e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e-01 2.6500e+07 5.5315e+02 5.4647e+03 2.1434e-08 0.0000e+00 1.0000e+00 5.4647e+03 5.4647e+03 2.7912e+02 2.7912e+02 3.4865e-05 3.4865e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e-01 2.6400e+07 5.5315e+02 5.4530e+03 2.1576e-08 0.0000e+00 1.0000e+00 5.4530e+03 5.4530e+03 2.7852e+02 2.7852e+02 3.4785e-05 3.4785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e-01 2.6300e+07 5.5315e+02 5.4412e+03 2.1719e-08 0.0000e+00 1.0000e+00 5.4412e+03 5.4412e+03 2.7792e+02 2.7792e+02 3.4704e-05 3.4704e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e-01 2.6200e+07 5.5315e+02 5.4293e+03 2.1864e-08 0.0000e+00 1.0000e+00 5.4293e+03 5.4293e+03 2.7732e+02 2.7732e+02 3.4623e-05 3.4623e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e-01 2.6100e+07 5.5315e+02 5.4174e+03 2.2011e-08 0.0000e+00 1.0000e+00 5.4174e+03 5.4174e+03 2.7671e+02 2.7671e+02 3.4542e-05 3.4542e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.4055e+03 2.2159e-08 0.0000e+00 1.0000e+00 5.4055e+03 5.4055e+03 2.7610e+02 2.7610e+02 3.4461e-05 3.4461e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e-01 2.5900e+07 5.5315e+02 5.3935e+03 2.2309e-08 0.0000e+00 1.0000e+00 5.3935e+03 5.3935e+03 2.7548e+02 2.7548e+02 3.4379e-05 3.4379e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e-01 2.5800e+07 5.5315e+02 5.3814e+03 2.2460e-08 0.0000e+00 1.0000e+00 5.3814e+03 5.3814e+03 2.7487e+02 2.7487e+02 3.4297e-05 3.4297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e-01 2.5700e+07 5.5315e+02 5.3693e+03 2.2613e-08 0.0000e+00 1.0000e+00 5.3693e+03 5.3693e+03 2.7425e+02 2.7425e+02 3.4215e-05 3.4215e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e-01 2.5600e+07 5.5315e+02 5.3571e+03 2.2768e-08 0.0000e+00 1.0000e+00 5.3571e+03 5.3571e+03 2.7363e+02 2.7363e+02 3.4133e-05 3.4133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e-01 2.5500e+07 5.5315e+02 5.3449e+03 2.2925e-08 0.0000e+00 1.0000e+00 5.3449e+03 5.3449e+03 2.7300e+02 2.7300e+02 3.4050e-05 3.4050e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e-01 2.5400e+07 5.5315e+02 5.3326e+03 2.3083e-08 0.0000e+00 1.0000e+00 5.3326e+03 5.3326e+03 2.7238e+02 2.7238e+02 3.3967e-05 3.3967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e-01 2.5300e+07 5.5315e+02 5.3203e+03 2.3243e-08 0.0000e+00 1.0000e+00 5.3203e+03 5.3203e+03 2.7175e+02 2.7175e+02 3.3884e-05 3.3884e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e-01 2.5200e+07 5.5315e+02 5.3079e+03 2.3405e-08 0.0000e+00 1.0000e+00 5.3079e+03 5.3079e+03 2.7111e+02 2.7111e+02 3.3801e-05 3.3801e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e-01 2.5100e+07 5.5315e+02 5.2954e+03 2.3568e-08 0.0000e+00 1.0000e+00 5.2954e+03 5.2954e+03 2.7048e+02 2.7048e+02 3.3718e-05 3.3718e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.2829e+03 2.3733e-08 0.0000e+00 1.0000e+00 5.2829e+03 5.2829e+03 2.6984e+02 2.6984e+02 3.3634e-05 3.3634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0200e-01 2.4900e+07 5.5315e+02 5.2704e+03 2.3901e-08 0.0000e+00 1.0000e+00 5.2704e+03 5.2704e+03 2.6920e+02 2.6920e+02 3.3550e-05 3.3550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0400e-01 2.4800e+07 5.5315e+02 5.2577e+03 2.4070e-08 0.0000e+00 1.0000e+00 5.2577e+03 5.2577e+03 2.6855e+02 2.6855e+02 3.3466e-05 3.3466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0600e-01 2.4700e+07 5.5315e+02 5.2451e+03 2.4241e-08 0.0000e+00 1.0000e+00 5.2451e+03 5.2451e+03 2.6790e+02 2.6790e+02 3.3382e-05 3.3382e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0800e-01 2.4600e+07 5.5315e+02 5.2323e+03 2.4414e-08 0.0000e+00 1.0000e+00 5.2323e+03 5.2323e+03 2.6725e+02 2.6725e+02 3.3297e-05 3.3297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1000e-01 2.4500e+07 5.5315e+02 5.2195e+03 2.4588e-08 0.0000e+00 1.0000e+00 5.2195e+03 5.2195e+03 2.6660e+02 2.6660e+02 3.3213e-05 3.3213e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1200e-01 2.4400e+07 5.5315e+02 5.2066e+03 2.4765e-08 0.0000e+00 1.0000e+00 5.2066e+03 5.2066e+03 2.6594e+02 2.6594e+02 3.3128e-05 3.3128e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1400e-01 2.4300e+07 5.5315e+02 5.1937e+03 2.4944e-08 0.0000e+00 1.0000e+00 5.1937e+03 5.1937e+03 2.6528e+02 2.6528e+02 3.3042e-05 3.3042e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1600e-01 2.4200e+07 5.5315e+02 5.1807e+03 2.5125e-08 0.0000e+00 1.0000e+00 5.1807e+03 5.1807e+03 2.6462e+02 2.6462e+02 3.2957e-05 3.2957e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1800e-01 2.4100e+07 5.5315e+02 5.1677e+03 2.5308e-08 0.0000e+00 1.0000e+00 5.1677e+03 5.1677e+03 2.6395e+02 2.6395e+02 3.2871e-05 3.2871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.1546e+03 2.5493e-08 0.0000e+00 1.0000e+00 5.1546e+03 5.1546e+03 2.6328e+02 2.6328e+02 3.2785e-05 3.2785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2200e-01 2.3900e+07 5.5315e+02 5.1414e+03 2.5681e-08 0.0000e+00 1.0000e+00 5.1414e+03 5.1414e+03 2.6261e+02 2.6261e+02 3.2699e-05 3.2699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2400e-01 2.3800e+07 5.5315e+02 5.1282e+03 2.5870e-08 0.0000e+00 1.0000e+00 5.1282e+03 5.1282e+03 2.6193e+02 2.6193e+02 3.2613e-05 3.2613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2600e-01 2.3700e+07 5.5315e+02 5.1149e+03 2.6062e-08 0.0000e+00 1.0000e+00 5.1149e+03 5.1149e+03 2.6125e+02 2.6125e+02 3.2526e-05 3.2526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2800e-01 2.3600e+07 5.5315e+02 5.1015e+03 2.6256e-08 0.0000e+00 1.0000e+00 5.1015e+03 5.1015e+03 2.6057e+02 2.6057e+02 3.2439e-05 3.2439e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3000e-01 2.3500e+07 5.5315e+02 5.0881e+03 2.6452e-08 0.0000e+00 1.0000e+00 5.0881e+03 5.0881e+03 2.5989e+02 2.5989e+02 3.2352e-05 3.2352e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3200e-01 2.3400e+07 5.5315e+02 5.0746e+03 2.6651e-08 0.0000e+00 1.0000e+00 5.0746e+03 5.0746e+03 2.5920e+02 2.5920e+02 3.2264e-05 3.2264e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3400e-01 2.3300e+07 5.5315e+02 5.0610e+03 2.6851e-08 0.0000e+00 1.0000e+00 5.0610e+03 5.0610e+03 2.5850e+02 2.5850e+02 3.2177e-05 3.2177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3600e-01 2.3200e+07 5.5315e+02 5.0474e+03 2.7055e-08 0.0000e+00 1.0000e+00 5.0474e+03 5.0474e+03 2.5781e+02 2.5781e+02 3.2089e-05 3.2089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3800e-01 2.3100e+07 5.5315e+02 5.0337e+03 2.7260e-08 0.0000e+00 1.0000e+00 5.0337e+03 5.0337e+03 2.5711e+02 2.5711e+02 3.2001e-05 3.2001e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.0200e+03 2.7469e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 3.1913e-05 3.1913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4200e-01 2.2900e+07 5.5315e+02 5.0061e+03 2.7679e-08 0.0000e+00 1.0000e+00 5.0061e+03 5.0061e+03 2.5570e+02 2.5570e+02 3.1824e-05 3.1824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4400e-01 2.2800e+07 5.5315e+02 4.9923e+03 2.7892e-08 0.0000e+00 1.0000e+00 4.9923e+03 4.9923e+03 2.5499e+02 2.5499e+02 3.1735e-05 3.1735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4600e-01 2.2700e+07 5.5315e+02 4.9783e+03 2.8108e-08 0.0000e+00 1.0000e+00 4.9783e+03 4.9783e+03 2.5428e+02 2.5428e+02 3.1646e-05 3.1646e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4800e-01 2.2600e+07 5.5315e+02 4.9643e+03 2.8326e-08 0.0000e+00 1.0000e+00 4.9643e+03 4.9643e+03 2.5356e+02 2.5356e+02 3.1557e-05 3.1557e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5000e-01 2.2500e+07 5.5315e+02 4.9502e+03 2.8547e-08 0.0000e+00 1.0000e+00 4.9502e+03 4.9502e+03 2.5284e+02 2.5284e+02 3.1467e-05 3.1467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5200e-01 2.2400e+07 5.5315e+02 4.9360e+03 2.8771e-08 0.0000e+00 1.0000e+00 4.9360e+03 4.9360e+03 2.5212e+02 2.5212e+02 3.1377e-05 3.1377e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5400e-01 2.2300e+07 5.5315e+02 4.9218e+03 2.8998e-08 0.0000e+00 1.0000e+00 4.9218e+03 4.9218e+03 2.5139e+02 2.5139e+02 3.1287e-05 3.1287e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5600e-01 2.2200e+07 5.5315e+02 4.9075e+03 2.9227e-08 0.0000e+00 1.0000e+00 4.9075e+03 4.9075e+03 2.5066e+02 2.5066e+02 3.1197e-05 3.1197e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5800e-01 2.2100e+07 5.5315e+02 4.8931e+03 2.9459e-08 0.0000e+00 1.0000e+00 4.8931e+03 4.8931e+03 2.4993e+02 2.4993e+02 3.1107e-05 3.1107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 4.8786e+03 2.9694e-08 0.0000e+00 1.0000e+00 4.8786e+03 4.8786e+03 2.4919e+02 2.4919e+02 3.1016e-05 3.1016e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6200e-01 2.1900e+07 5.5315e+02 4.8641e+03 2.9932e-08 0.0000e+00 1.0000e+00 4.8641e+03 4.8641e+03 2.4845e+02 2.4845e+02 3.0925e-05 3.0925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6400e-01 2.1800e+07 5.5315e+02 4.8495e+03 3.0172e-08 0.0000e+00 1.0000e+00 4.8495e+03 4.8495e+03 2.4770e+02 2.4770e+02 3.0834e-05 3.0834e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6600e-01 2.1700e+07 5.5315e+02 4.8348e+03 3.0416e-08 0.0000e+00 1.0000e+00 4.8348e+03 4.8348e+03 2.4695e+02 2.4695e+02 3.0742e-05 3.0742e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6800e-01 2.1600e+07 5.5315e+02 4.8201e+03 3.0663e-08 0.0000e+00 1.0000e+00 4.8201e+03 4.8201e+03 2.4620e+02 2.4620e+02 3.0651e-05 3.0651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7000e-01 2.1500e+07 5.5315e+02 4.8053e+03 3.0913e-08 0.0000e+00 1.0000e+00 4.8053e+03 4.8053e+03 2.4544e+02 2.4544e+02 3.0559e-05 3.0559e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7200e-01 2.1400e+07 5.5315e+02 4.7904e+03 3.1166e-08 0.0000e+00 1.0000e+00 4.7904e+03 4.7904e+03 2.4468e+02 2.4468e+02 3.0466e-05 3.0466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7400e-01 2.1300e+07 5.5315e+02 4.7754e+03 3.1422e-08 0.0000e+00 1.0000e+00 4.7754e+03 4.7754e+03 2.4392e+02 2.4392e+02 3.0374e-05 3.0374e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7600e-01 2.1200e+07 5.5315e+02 4.7604e+03 3.1682e-08 0.0000e+00 1.0000e+00 4.7604e+03 4.7604e+03 2.4315e+02 2.4315e+02 3.0281e-05 3.0281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7800e-01 2.1100e+07 5.5315e+02 4.7453e+03 3.1945e-08 0.0000e+00 1.0000e+00 4.7453e+03 4.7453e+03 2.4238e+02 2.4238e+02 3.0189e-05 3.0189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 4.7301e+03 3.2211e-08 0.0000e+00 1.0000e+00 4.7301e+03 4.7301e+03 2.4160e+02 2.4160e+02 3.0095e-05 3.0095e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8200e-01 2.0900e+07 5.5315e+02 4.7148e+03 3.2480e-08 0.0000e+00 1.0000e+00 4.7148e+03 4.7148e+03 2.4082e+02 2.4082e+02 3.0002e-05 3.0002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8400e-01 2.0800e+07 5.5315e+02 4.6994e+03 3.2753e-08 0.0000e+00 1.0000e+00 4.6994e+03 4.6994e+03 2.4003e+02 2.4003e+02 2.9908e-05 2.9908e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8600e-01 2.0700e+07 5.5315e+02 4.6840e+03 3.3030e-08 0.0000e+00 1.0000e+00 4.6840e+03 4.6840e+03 2.3925e+02 2.3925e+02 2.9815e-05 2.9815e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8800e-01 2.0600e+07 5.5315e+02 4.6685e+03 3.3310e-08 0.0000e+00 1.0000e+00 4.6685e+03 4.6685e+03 2.3845e+02 2.3845e+02 2.9720e-05 2.9720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9000e-01 2.0500e+07 5.5315e+02 4.6529e+03 3.3593e-08 0.0000e+00 1.0000e+00 4.6529e+03 4.6529e+03 2.3766e+02 2.3766e+02 2.9626e-05 2.9626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9200e-01 2.0400e+07 5.5315e+02 4.6372e+03 3.3881e-08 0.0000e+00 1.0000e+00 4.6372e+03 4.6372e+03 2.3686e+02 2.3686e+02 2.9532e-05 2.9532e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9400e-01 2.0300e+07 5.5315e+02 4.6215e+03 3.4172e-08 0.0000e+00 1.0000e+00 4.6215e+03 4.6215e+03 2.3605e+02 2.3605e+02 2.9437e-05 2.9437e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9600e-01 2.0200e+07 5.5315e+02 4.6056e+03 3.4467e-08 0.0000e+00 1.0000e+00 4.6056e+03 4.6056e+03 2.3524e+02 2.3524e+02 2.9342e-05 2.9342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9800e-01 2.0100e+07 5.5315e+02 4.5897e+03 3.4766e-08 0.0000e+00 1.0000e+00 4.5897e+03 4.5897e+03 2.3443e+02 2.3443e+02 2.9247e-05 2.9247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.5737e+03 3.5068e-08 0.0000e+00 1.0000e+00 4.5737e+03 4.5737e+03 2.3361e+02 2.3361e+02 2.9151e-05 2.9151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0200e-01 1.9900e+07 5.5315e+02 4.5577e+03 3.5375e-08 0.0000e+00 1.0000e+00 4.5577e+03 4.5577e+03 2.3279e+02 2.3279e+02 2.9055e-05 2.9055e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0400e-01 1.9800e+07 5.5315e+02 4.5415e+03 3.5686e-08 0.0000e+00 1.0000e+00 4.5415e+03 4.5415e+03 2.3197e+02 2.3197e+02 2.8959e-05 2.8959e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0600e-01 1.9700e+07 5.5315e+02 4.5252e+03 3.6000e-08 0.0000e+00 1.0000e+00 4.5252e+03 4.5252e+03 2.3114e+02 2.3114e+02 2.8863e-05 2.8863e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0800e-01 1.9600e+07 5.5315e+02 4.5089e+03 3.6319e-08 0.0000e+00 1.0000e+00 4.5089e+03 4.5089e+03 2.3030e+02 2.3030e+02 2.8767e-05 2.8767e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1000e-01 1.9500e+07 5.5315e+02 4.4925e+03 3.6643e-08 0.0000e+00 1.0000e+00 4.4925e+03 4.4925e+03 2.2946e+02 2.2946e+02 2.8670e-05 2.8670e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1200e-01 1.9400e+07 5.5315e+02 4.4760e+03 3.6970e-08 0.0000e+00 1.0000e+00 4.4760e+03 4.4760e+03 2.2862e+02 2.2862e+02 2.8573e-05 2.8573e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1400e-01 1.9300e+07 5.5315e+02 4.4594e+03 3.7302e-08 0.0000e+00 1.0000e+00 4.4594e+03 4.4594e+03 2.2777e+02 2.2777e+02 2.8476e-05 2.8476e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1600e-01 1.9200e+07 5.5315e+02 4.4427e+03 3.7639e-08 0.0000e+00 1.0000e+00 4.4427e+03 4.4427e+03 2.2692e+02 2.2692e+02 2.8379e-05 2.8379e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1800e-01 1.9100e+07 5.5315e+02 4.4259e+03 3.7979e-08 0.0000e+00 1.0000e+00 4.4259e+03 4.4259e+03 2.2607e+02 2.2607e+02 2.8282e-05 2.8282e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.4091e+03 3.8325e-08 0.0000e+00 1.0000e+00 4.4091e+03 4.4091e+03 2.2520e+02 2.2520e+02 2.8184e-05 2.8184e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2200e-01 1.8900e+07 5.5315e+02 4.3922e+03 3.8675e-08 0.0000e+00 1.0000e+00 4.3922e+03 4.3922e+03 2.2434e+02 2.2434e+02 2.8086e-05 2.8086e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2400e-01 1.8800e+07 5.5315e+02 4.3751e+03 3.9030e-08 0.0000e+00 1.0000e+00 4.3751e+03 4.3751e+03 2.2347e+02 2.2347e+02 2.7988e-05 2.7988e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2600e-01 1.8700e+07 5.5315e+02 4.3578e+03 4.0105e-08 3.9013e-02 9.6099e-01 4.5336e+03 4.3510e+03 2.7893e+02 2.2072e+02 3.4075e-05 2.7707e-05 8.3083e-03 2.5562e-03 4.7396e-01 1.0798e-01 8.6281e-02 4.6615e-02 2.2228e-02 1.6734e-02 2.3534e-01 9.0232e-03 3.0149e-03 5.3673e-01 1.1482e-01 8.7954e-02 4.5566e-02 2.0856e-02 1.5045e-02 1.6699e-01 +3.2800e-01 1.8600e+07 5.5315e+02 4.3403e+03 4.0336e-08 9.6700e-02 9.0330e-01 4.5314e+03 4.3208e+03 2.8320e+02 2.1646e+02 3.4587e-05 2.7288e-05 8.2428e-03 2.5161e-03 4.6836e-01 1.0734e-01 8.6103e-02 4.6692e-02 2.2344e-02 1.6880e-02 2.4152e-01 9.0650e-03 3.0415e-03 5.4039e-01 1.1522e-01 8.8054e-02 4.5506e-02 2.0776e-02 1.4947e-02 1.6299e-01 +3.3000e-01 1.8500e+07 5.5315e+02 4.3228e+03 4.0571e-08 1.3663e-01 8.6337e-01 4.5279e+03 4.2921e+03 2.8700e+02 2.1269e+02 3.5046e-05 2.6921e-05 8.1828e-03 2.4798e-03 4.6328e-01 1.0675e-01 8.5933e-02 4.6758e-02 2.2447e-02 1.7013e-02 2.4716e-01 9.1011e-03 3.0644e-03 5.4354e-01 1.1557e-01 8.8143e-02 4.5457e-02 2.0709e-02 1.4863e-02 1.5955e-01 +3.3200e-01 1.8400e+07 5.5315e+02 4.3053e+03 4.0809e-08 1.6633e-01 8.3367e-01 4.5234e+03 4.2643e+03 2.9045e+02 2.0927e+02 3.5467e-05 2.6592e-05 8.1268e-03 2.4462e-03 4.5856e-01 1.0620e-01 8.5769e-02 4.6816e-02 2.2542e-02 1.7134e-02 2.5241e-01 9.1331e-03 3.0844e-03 5.4631e-01 1.1588e-01 8.8225e-02 4.5415e-02 2.0650e-02 1.4790e-02 1.5651e-01 +3.3400e-01 1.8300e+07 5.5315e+02 4.2877e+03 4.1050e-08 1.8949e-01 8.1051e-01 4.5181e+03 4.2372e+03 2.9363e+02 2.0611e+02 3.5859e-05 2.6293e-05 8.0737e-03 2.4148e-03 4.5412e-01 1.0567e-01 8.5609e-02 4.6867e-02 2.2629e-02 1.7248e-02 2.5737e-01 9.1621e-03 3.1024e-03 5.4880e-01 1.1616e-01 8.8301e-02 4.5378e-02 2.0597e-02 1.4724e-02 1.5377e-01 +3.3600e-01 1.8200e+07 5.5315e+02 4.2701e+03 4.1295e-08 2.0819e-01 7.9181e-01 4.5123e+03 4.2106e+03 2.9661e+02 2.0316e+02 3.6228e-05 2.6016e-05 8.0230e-03 2.3851e-03 4.4990e-01 1.0517e-01 8.5451e-02 4.6912e-02 2.2710e-02 1.7356e-02 2.6210e-01 9.1886e-03 3.1187e-03 5.5107e-01 1.1642e-01 8.8373e-02 4.5347e-02 2.0551e-02 1.4665e-02 1.5127e-01 +3.3800e-01 1.8100e+07 5.5315e+02 4.2524e+03 4.1543e-08 2.2367e-01 7.7633e-01 4.5060e+03 4.1846e+03 2.9941e+02 2.0038e+02 3.6578e-05 2.5759e-05 7.9740e-03 2.3568e-03 4.4586e-01 1.0468e-01 8.5294e-02 4.6951e-02 2.2787e-02 1.7458e-02 2.6665e-01 9.2130e-03 3.1336e-03 5.5315e-01 1.1666e-01 8.8441e-02 4.5319e-02 2.0508e-02 1.4610e-02 1.4897e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.2347e+03 4.1795e-08 2.3675e-01 7.6325e-01 4.4993e+03 4.1589e+03 3.0206e+02 1.9775e+02 3.6912e-05 2.5519e-05 7.9266e-03 2.3296e-03 4.4197e-01 1.0420e-01 8.5138e-02 4.6987e-02 2.2860e-02 1.7555e-02 2.7104e-01 9.2358e-03 3.1473e-03 5.5507e-01 1.1688e-01 8.8507e-02 4.5295e-02 2.0469e-02 1.4561e-02 1.4683e-01 +3.4200e-01 1.7900e+07 5.5315e+02 4.2170e+03 4.2051e-08 2.4797e-01 7.5203e-01 4.4923e+03 4.1335e+03 3.0459e+02 1.9525e+02 3.7232e-05 2.5291e-05 7.8805e-03 2.3035e-03 4.3820e-01 1.0374e-01 8.4981e-02 4.7018e-02 2.2929e-02 1.7648e-02 2.7530e-01 9.2572e-03 3.1600e-03 5.5687e-01 1.1710e-01 8.8570e-02 4.5274e-02 2.0434e-02 1.4515e-02 1.4483e-01 +3.4400e-01 1.7800e+07 5.5315e+02 4.1993e+03 4.2310e-08 2.5772e-01 7.4228e-01 4.4851e+03 4.1084e+03 3.0702e+02 1.9285e+02 3.7541e-05 2.5076e-05 7.8355e-03 2.2782e-03 4.3455e-01 1.0328e-01 8.4825e-02 4.7046e-02 2.2994e-02 1.7738e-02 2.7945e-01 9.2773e-03 3.1718e-03 5.5854e-01 1.1729e-01 8.8632e-02 4.5256e-02 2.0401e-02 1.4472e-02 1.4295e-01 +3.4600e-01 1.7700e+07 5.5315e+02 4.1815e+03 4.2572e-08 2.6629e-01 7.3371e-01 4.4776e+03 4.0835e+03 3.0935e+02 1.9054e+02 3.7839e-05 2.4872e-05 7.7914e-03 2.2537e-03 4.3100e-01 1.0283e-01 8.4668e-02 4.7070e-02 2.3057e-02 1.7825e-02 2.8350e-01 9.2963e-03 3.1829e-03 5.6012e-01 1.1748e-01 8.8692e-02 4.5240e-02 2.0371e-02 1.4432e-02 1.4118e-01 +3.4800e-01 1.7600e+07 5.5315e+02 4.1637e+03 4.2839e-08 2.7389e-01 7.2611e-01 4.4699e+03 4.0588e+03 3.1159e+02 1.8833e+02 3.8128e-05 2.4676e-05 7.7481e-03 2.2299e-03 4.2753e-01 1.0239e-01 8.4510e-02 4.7091e-02 2.3117e-02 1.7909e-02 2.8747e-01 9.3143e-03 3.1933e-03 5.6161e-01 1.1766e-01 8.8751e-02 4.5226e-02 2.0343e-02 1.4395e-02 1.3951e-01 +3.5000e-01 1.7500e+07 5.5315e+02 4.1458e+03 4.3110e-08 2.8067e-01 7.1933e-01 4.4621e+03 4.0342e+03 3.1376e+02 1.8618e+02 3.8409e-05 2.4490e-05 7.7054e-03 2.2067e-03 4.2413e-01 1.0196e-01 8.4351e-02 4.7109e-02 2.3175e-02 1.7991e-02 2.9137e-01 9.3315e-03 3.2031e-03 5.6301e-01 1.1784e-01 8.8809e-02 4.5214e-02 2.0317e-02 1.4360e-02 1.3791e-01 +3.5200e-01 1.7400e+07 5.5315e+02 4.1279e+03 4.3384e-08 2.8678e-01 7.1322e-01 4.4540e+03 4.0099e+03 3.1587e+02 1.8410e+02 3.8682e-05 2.4310e-05 7.6634e-03 2.1841e-03 4.2081e-01 1.0152e-01 8.4191e-02 4.7124e-02 2.3230e-02 1.8070e-02 2.9521e-01 9.3479e-03 3.2124e-03 5.6435e-01 1.1800e-01 8.8866e-02 4.5203e-02 2.0293e-02 1.4327e-02 1.3640e-01 +3.5400e-01 1.7300e+07 5.5315e+02 4.1100e+03 4.3663e-08 2.9230e-01 7.0770e-01 4.4459e+03 3.9856e+03 3.1791e+02 1.8209e+02 3.8949e-05 2.4138e-05 7.6220e-03 2.1619e-03 4.1754e-01 1.0110e-01 8.4029e-02 4.7136e-02 2.3283e-02 1.8147e-02 2.9898e-01 9.3636e-03 3.2212e-03 5.6562e-01 1.1816e-01 8.8921e-02 4.5195e-02 2.0271e-02 1.4296e-02 1.3495e-01 +3.5600e-01 1.7200e+07 5.5315e+02 4.0920e+03 4.3945e-08 2.9732e-01 7.0268e-01 4.4376e+03 3.9615e+03 3.1989e+02 1.8013e+02 3.9210e-05 2.3972e-05 7.5810e-03 2.1403e-03 4.1433e-01 1.0067e-01 8.3866e-02 4.7145e-02 2.3334e-02 1.8223e-02 3.0270e-01 9.3787e-03 3.2294e-03 5.6682e-01 1.1832e-01 8.8977e-02 4.5188e-02 2.0250e-02 1.4267e-02 1.3357e-01 +3.5800e-01 1.7100e+07 5.5315e+02 4.0740e+03 4.4232e-08 3.0190e-01 6.9810e-01 4.4292e+03 3.9375e+03 3.2183e+02 1.7822e+02 3.9465e-05 2.3812e-05 7.5404e-03 2.1190e-03 4.1118e-01 1.0025e-01 8.3702e-02 4.7152e-02 2.3384e-02 1.8296e-02 3.0638e-01 9.3932e-03 3.2373e-03 5.6798e-01 1.1847e-01 8.9031e-02 4.5182e-02 2.0231e-02 1.4239e-02 1.3224e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.0560e+03 4.4524e-08 3.0609e-01 6.9391e-01 4.4207e+03 3.9136e+03 3.2372e+02 1.7636e+02 3.9714e-05 2.3657e-05 7.5002e-03 2.0982e-03 4.0806e-01 9.9831e-02 8.3535e-02 4.7156e-02 2.3431e-02 1.8367e-02 3.1002e-01 9.4071e-03 3.2448e-03 5.6908e-01 1.1861e-01 8.9085e-02 4.5177e-02 2.0213e-02 1.4213e-02 1.3097e-01 +3.6200e-01 1.6900e+07 5.5315e+02 4.0379e+03 4.4819e-08 3.0995e-01 6.9005e-01 4.4121e+03 3.8897e+03 3.2556e+02 1.7455e+02 3.9959e-05 2.3507e-05 7.4603e-03 2.0777e-03 4.0499e-01 9.9414e-02 8.3367e-02 4.7158e-02 2.3477e-02 1.8437e-02 3.1361e-01 9.4206e-03 3.2519e-03 5.7013e-01 1.1875e-01 8.9138e-02 4.5174e-02 2.0196e-02 1.4188e-02 1.2975e-01 +3.6400e-01 1.6800e+07 5.5315e+02 4.0198e+03 4.5120e-08 3.1351e-01 6.8649e-01 4.4035e+03 3.8660e+03 3.2736e+02 1.7277e+02 4.0200e-05 2.3362e-05 7.4208e-03 2.0576e-03 4.0196e-01 9.8998e-02 8.3197e-02 4.7158e-02 2.3521e-02 1.8505e-02 3.1718e-01 9.4336e-03 3.2587e-03 5.7114e-01 1.1888e-01 8.9191e-02 4.5172e-02 2.0180e-02 1.4165e-02 1.2857e-01 +3.6600e-01 1.6700e+07 5.5315e+02 4.0016e+03 4.5425e-08 3.1681e-01 6.8319e-01 4.3947e+03 3.8423e+03 3.2913e+02 1.7103e+02 4.0437e-05 2.3221e-05 7.3815e-03 2.0378e-03 3.9897e-01 9.8584e-02 8.3025e-02 4.7155e-02 2.3563e-02 1.8572e-02 3.2071e-01 9.4461e-03 3.2652e-03 5.7211e-01 1.1901e-01 8.9244e-02 4.5172e-02 2.0166e-02 1.4143e-02 1.2744e-01 +3.6800e-01 1.6600e+07 5.5315e+02 3.9834e+03 4.5734e-08 3.1986e-01 6.8014e-01 4.3859e+03 3.8186e+03 3.3086e+02 1.6933e+02 4.0669e-05 2.3084e-05 7.3424e-03 2.0183e-03 3.9601e-01 9.8170e-02 8.2851e-02 4.7149e-02 2.3604e-02 1.8637e-02 3.2422e-01 9.4582e-03 3.2714e-03 5.7304e-01 1.1914e-01 8.9296e-02 4.5172e-02 2.0152e-02 1.4122e-02 1.2635e-01 +3.7000e-01 1.6500e+07 5.5315e+02 3.9652e+03 4.6048e-08 3.2269e-01 6.7731e-01 4.3771e+03 3.7951e+03 3.3255e+02 1.6766e+02 4.0898e-05 2.2950e-05 7.3035e-03 1.9991e-03 3.9308e-01 9.7758e-02 8.2675e-02 4.7141e-02 2.3643e-02 1.8701e-02 3.2770e-01 9.4700e-03 3.2773e-03 5.7393e-01 1.1927e-01 8.9348e-02 4.5173e-02 2.0140e-02 1.4102e-02 1.2529e-01 +3.7200e-01 1.6400e+07 5.5315e+02 3.9469e+03 4.6368e-08 3.2533e-01 6.7467e-01 4.3681e+03 3.7716e+03 3.3422e+02 1.6603e+02 4.1124e-05 2.2821e-05 7.2649e-03 1.9801e-03 3.9018e-01 9.7346e-02 8.2497e-02 4.7131e-02 2.3681e-02 1.8764e-02 3.3115e-01 9.4814e-03 3.2830e-03 5.7479e-01 1.1939e-01 8.9399e-02 4.5175e-02 2.0128e-02 1.4084e-02 1.2427e-01 +3.7400e-01 1.6300e+07 5.5315e+02 3.9286e+03 4.6692e-08 3.2778e-01 6.7222e-01 4.3592e+03 3.7481e+03 3.3585e+02 1.6442e+02 4.1346e-05 2.2695e-05 7.2264e-03 1.9614e-03 3.8731e-01 9.6934e-02 8.2316e-02 4.7119e-02 2.3718e-02 1.8825e-02 3.3459e-01 9.4924e-03 3.2884e-03 5.7562e-01 1.1950e-01 8.9450e-02 4.5178e-02 2.0118e-02 1.4066e-02 1.2328e-01 +3.7600e-01 1.6200e+07 5.5315e+02 3.9102e+03 4.7021e-08 3.3008e-01 6.6992e-01 4.3501e+03 3.7247e+03 3.3746e+02 1.6284e+02 4.1565e-05 2.2572e-05 7.1880e-03 1.9429e-03 3.8447e-01 9.6523e-02 8.2133e-02 4.7105e-02 2.3752e-02 1.8885e-02 3.3800e-01 9.5032e-03 3.2935e-03 5.7642e-01 1.1962e-01 8.9501e-02 4.5182e-02 2.0108e-02 1.4049e-02 1.2233e-01 +3.7800e-01 1.6100e+07 5.5315e+02 3.8918e+03 4.7356e-08 3.3222e-01 6.6778e-01 4.3411e+03 3.7013e+03 3.3904e+02 1.6129e+02 4.1782e-05 2.2451e-05 7.1498e-03 1.9247e-03 3.8164e-01 9.6112e-02 8.1948e-02 4.7088e-02 2.3786e-02 1.8944e-02 3.4140e-01 9.5136e-03 3.2985e-03 5.7718e-01 1.1973e-01 8.9552e-02 4.5187e-02 2.0099e-02 1.4033e-02 1.2140e-01 +3.8000e-01 1.6000e+07 5.5315e+02 3.8734e+03 4.7696e-08 3.3422e-01 6.6578e-01 4.3320e+03 3.6779e+03 3.4060e+02 1.5976e+02 4.1995e-05 2.2334e-05 7.1117e-03 1.9066e-03 3.7885e-01 9.5701e-02 8.1761e-02 4.7069e-02 2.3818e-02 1.9001e-02 3.4479e-01 9.5237e-03 3.3032e-03 5.7792e-01 1.1984e-01 8.9603e-02 4.5193e-02 2.0091e-02 1.4018e-02 1.2050e-01 +3.8200e-01 1.5900e+07 5.5315e+02 3.8549e+03 4.8042e-08 3.3610e-01 6.6390e-01 4.3228e+03 3.6546e+03 3.4213e+02 1.5825e+02 4.2207e-05 2.2220e-05 7.0737e-03 1.8888e-03 3.7607e-01 9.5289e-02 8.1571e-02 4.7048e-02 2.3849e-02 1.9058e-02 3.4815e-01 9.5336e-03 3.3078e-03 5.7864e-01 1.1995e-01 8.9653e-02 4.5199e-02 2.0083e-02 1.4004e-02 1.1963e-01 +3.8400e-01 1.5800e+07 5.5315e+02 3.8363e+03 4.8393e-08 3.3786e-01 6.6214e-01 4.3136e+03 3.6313e+03 3.4364e+02 1.5677e+02 4.2415e-05 2.2108e-05 7.0357e-03 1.8712e-03 3.7331e-01 9.4877e-02 8.1379e-02 4.7024e-02 2.3879e-02 1.9113e-02 3.5151e-01 9.5432e-03 3.3121e-03 5.7933e-01 1.2005e-01 8.9703e-02 4.5206e-02 2.0076e-02 1.3990e-02 1.1879e-01 +3.8600e-01 1.5700e+07 5.5315e+02 3.8177e+03 4.8749e-08 3.3950e-01 6.6050e-01 4.3044e+03 3.6081e+03 3.4513e+02 1.5531e+02 4.2622e-05 2.1999e-05 6.9979e-03 1.8537e-03 3.7057e-01 9.4464e-02 8.1184e-02 4.6999e-02 2.3907e-02 1.9167e-02 3.5485e-01 9.5525e-03 3.3163e-03 5.7999e-01 1.2016e-01 8.9753e-02 4.5214e-02 2.0070e-02 1.3978e-02 1.1797e-01 +3.8800e-01 1.5600e+07 5.5315e+02 3.7991e+03 4.9112e-08 3.4105e-01 6.5895e-01 4.2952e+03 3.5848e+03 3.4660e+02 1.5387e+02 4.2826e-05 2.1892e-05 6.9601e-03 1.8365e-03 3.6785e-01 9.4051e-02 8.0987e-02 4.6971e-02 2.3934e-02 1.9220e-02 3.5819e-01 9.5616e-03 3.3203e-03 5.8063e-01 1.2026e-01 8.9803e-02 4.5223e-02 2.0065e-02 1.3966e-02 1.1717e-01 +3.9000e-01 1.5500e+07 5.5315e+02 3.7804e+03 4.9481e-08 3.4250e-01 6.5750e-01 4.2859e+03 3.5616e+03 3.4805e+02 1.5245e+02 4.3028e-05 2.1787e-05 6.9223e-03 1.8194e-03 3.6515e-01 9.3638e-02 8.0788e-02 4.6941e-02 2.3959e-02 1.9272e-02 3.6151e-01 9.5705e-03 3.3242e-03 5.8125e-01 1.2036e-01 8.9853e-02 4.5232e-02 2.0060e-02 1.3954e-02 1.1640e-01 +3.9200e-01 1.5400e+07 5.5315e+02 3.7617e+03 4.9856e-08 3.4385e-01 6.5615e-01 4.2766e+03 3.5384e+03 3.4948e+02 1.5105e+02 4.3228e-05 2.1684e-05 6.8846e-03 1.8025e-03 3.6246e-01 9.3223e-02 8.0585e-02 4.6909e-02 2.3984e-02 1.9323e-02 3.6483e-01 9.5791e-03 3.3278e-03 5.8185e-01 1.2045e-01 8.9902e-02 4.5242e-02 2.0056e-02 1.3944e-02 1.1565e-01 +3.9400e-01 1.5300e+07 5.5315e+02 3.7429e+03 5.0237e-08 3.4513e-01 6.5487e-01 4.2673e+03 3.5153e+03 3.5090e+02 1.4967e+02 4.3426e-05 2.1584e-05 6.8470e-03 1.7857e-03 3.5979e-01 9.2807e-02 8.0380e-02 4.6875e-02 2.4007e-02 1.9373e-02 3.6814e-01 9.5875e-03 3.3314e-03 5.8243e-01 1.2055e-01 8.9952e-02 4.5252e-02 2.0052e-02 1.3934e-02 1.1491e-01 +3.9600e-01 1.5200e+07 5.5315e+02 3.7241e+03 5.0624e-08 3.4632e-01 6.5368e-01 4.2580e+03 3.4921e+03 3.5229e+02 1.4830e+02 4.3622e-05 2.1486e-05 6.8093e-03 1.7691e-03 3.5713e-01 9.2391e-02 8.0173e-02 4.6839e-02 2.4028e-02 1.9422e-02 3.7144e-01 9.5957e-03 3.3347e-03 5.8299e-01 1.2064e-01 9.0001e-02 4.5263e-02 2.0049e-02 1.3925e-02 1.1420e-01 +3.9800e-01 1.5100e+07 5.5315e+02 3.7052e+03 5.1018e-08 3.4744e-01 6.5256e-01 4.2486e+03 3.4690e+03 3.5367e+02 1.4695e+02 4.3816e-05 2.1389e-05 6.7717e-03 1.7526e-03 3.5449e-01 9.1973e-02 7.9963e-02 4.6800e-02 2.4049e-02 1.9470e-02 3.7473e-01 9.6037e-03 3.3380e-03 5.8353e-01 1.2073e-01 9.0051e-02 4.5275e-02 2.0047e-02 1.3916e-02 1.1351e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.6863e+03 5.1419e-08 3.4849e-01 6.5151e-01 4.2392e+03 3.4459e+03 3.5504e+02 1.4562e+02 4.4009e-05 2.1294e-05 6.7341e-03 1.7363e-03 3.5186e-01 9.1554e-02 7.9750e-02 4.6759e-02 2.4068e-02 1.9517e-02 3.7803e-01 9.6116e-03 3.3411e-03 5.8405e-01 1.2082e-01 9.0100e-02 4.5287e-02 2.0045e-02 1.3908e-02 1.1284e-01 +4.0200e-01 1.4900e+07 5.5315e+02 3.6673e+03 5.1827e-08 3.4947e-01 6.5053e-01 4.2298e+03 3.4228e+03 3.5639e+02 1.4430e+02 4.4200e-05 2.1201e-05 6.6965e-03 1.7201e-03 3.4924e-01 9.1134e-02 7.9534e-02 4.6716e-02 2.4086e-02 1.9562e-02 3.8131e-01 9.6192e-03 3.3440e-03 5.8455e-01 1.2091e-01 9.0149e-02 4.5300e-02 2.0044e-02 1.3900e-02 1.1218e-01 +4.0400e-01 1.4800e+07 5.5315e+02 3.6483e+03 5.2241e-08 3.5039e-01 6.4961e-01 4.2204e+03 3.3997e+03 3.5772e+02 1.4300e+02 4.4389e-05 2.1110e-05 6.6589e-03 1.7040e-03 3.4663e-01 9.0713e-02 7.9316e-02 4.6671e-02 2.4103e-02 1.9607e-02 3.8460e-01 9.6266e-03 3.3469e-03 5.8504e-01 1.2099e-01 9.0198e-02 4.5313e-02 2.0043e-02 1.3894e-02 1.1155e-01 +4.0600e-01 1.4700e+07 5.5315e+02 3.6292e+03 5.2663e-08 3.5124e-01 6.4876e-01 4.2110e+03 3.3766e+03 3.5904e+02 1.4171e+02 4.4577e-05 2.1021e-05 6.6212e-03 1.6881e-03 3.4404e-01 9.0290e-02 7.9095e-02 4.6623e-02 2.4118e-02 1.9651e-02 3.8788e-01 9.6339e-03 3.3496e-03 5.8551e-01 1.2108e-01 9.0247e-02 4.5327e-02 2.0042e-02 1.3887e-02 1.1093e-01 +4.0800e-01 1.4600e+07 5.5315e+02 3.6100e+03 5.3093e-08 3.5204e-01 6.4796e-01 4.2016e+03 3.3535e+03 3.6035e+02 1.4043e+02 4.4763e-05 2.0933e-05 6.5836e-03 1.6723e-03 3.4145e-01 8.9866e-02 7.8871e-02 4.6574e-02 2.4132e-02 1.9693e-02 3.9116e-01 9.6410e-03 3.3522e-03 5.8596e-01 1.2116e-01 9.0295e-02 4.5342e-02 2.0043e-02 1.3881e-02 1.1032e-01 +4.1000e-01 1.4500e+07 5.5315e+02 3.5909e+03 5.3530e-08 3.5279e-01 6.4721e-01 4.1921e+03 3.3305e+03 3.6165e+02 1.3917e+02 4.4948e-05 2.0846e-05 6.5459e-03 1.6566e-03 3.3888e-01 8.9441e-02 7.8644e-02 4.6522e-02 2.4145e-02 1.9735e-02 3.9443e-01 9.6479e-03 3.3547e-03 5.8640e-01 1.2124e-01 9.0344e-02 4.5357e-02 2.0043e-02 1.3876e-02 1.0973e-01 +4.1200e-01 1.4400e+07 5.5315e+02 3.5716e+03 5.3974e-08 3.5347e-01 6.4653e-01 4.1827e+03 3.3074e+03 3.6293e+02 1.3792e+02 4.5132e-05 2.0761e-05 6.5082e-03 1.6410e-03 3.3631e-01 8.9013e-02 7.8414e-02 4.6467e-02 2.4157e-02 1.9776e-02 3.9771e-01 9.6547e-03 3.3571e-03 5.8682e-01 1.2132e-01 9.0392e-02 4.5372e-02 2.0044e-02 1.3871e-02 1.0916e-01 +4.1400e-01 1.4300e+07 5.5315e+02 3.5523e+03 5.4427e-08 3.5411e-01 6.4589e-01 4.1732e+03 3.2844e+03 3.6420e+02 1.3668e+02 4.5314e-05 2.0678e-05 6.4705e-03 1.6256e-03 3.3376e-01 8.8585e-02 7.8181e-02 4.6411e-02 2.4167e-02 1.9815e-02 4.0099e-01 9.6613e-03 3.3593e-03 5.8723e-01 1.2140e-01 9.0441e-02 4.5388e-02 2.0046e-02 1.3867e-02 1.0860e-01 +4.1600e-01 1.4200e+07 5.5315e+02 3.5329e+03 5.4887e-08 3.5470e-01 6.4530e-01 4.1637e+03 3.2614e+03 3.6546e+02 1.3545e+02 4.5495e-05 2.0596e-05 6.4327e-03 1.6102e-03 3.3121e-01 8.8154e-02 7.7945e-02 4.6352e-02 2.4177e-02 1.9854e-02 4.0426e-01 9.6678e-03 3.3615e-03 5.8763e-01 1.2148e-01 9.0489e-02 4.5404e-02 2.0048e-02 1.3864e-02 1.0806e-01 +4.1800e-01 1.4100e+07 5.5315e+02 3.5135e+03 5.5357e-08 3.5525e-01 6.4475e-01 4.1542e+03 3.2383e+03 3.6671e+02 1.3424e+02 4.5674e-05 2.0515e-05 6.3949e-03 1.5950e-03 3.2867e-01 8.7722e-02 7.7706e-02 4.6291e-02 2.4184e-02 1.9891e-02 4.0754e-01 9.6740e-03 3.3635e-03 5.8801e-01 1.2155e-01 9.0538e-02 4.5421e-02 2.0050e-02 1.3860e-02 1.0753e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.4940e+03 5.5834e-08 3.5574e-01 6.4426e-01 4.1447e+03 3.2153e+03 3.6794e+02 1.3304e+02 4.5853e-05 2.0436e-05 6.3570e-03 1.5798e-03 3.2615e-01 8.7288e-02 7.7465e-02 4.6228e-02 2.4191e-02 1.9928e-02 4.1082e-01 9.6802e-03 3.3655e-03 5.8837e-01 1.2163e-01 9.0586e-02 4.5438e-02 2.0053e-02 1.3857e-02 1.0702e-01 +4.2200e-01 1.3900e+07 5.5315e+02 3.4745e+03 5.6321e-08 3.5620e-01 6.4380e-01 4.1352e+03 3.1923e+03 3.6917e+02 1.3184e+02 4.6030e-05 2.0358e-05 6.3191e-03 1.5648e-03 3.2362e-01 8.6853e-02 7.7220e-02 4.6162e-02 2.4196e-02 1.9964e-02 4.1410e-01 9.6862e-03 3.3674e-03 5.8873e-01 1.2170e-01 9.0634e-02 4.5456e-02 2.0056e-02 1.3855e-02 1.0652e-01 +4.2400e-01 1.3800e+07 5.5315e+02 3.4549e+03 5.6816e-08 3.5661e-01 6.4339e-01 4.1257e+03 3.1693e+03 3.7038e+02 1.3066e+02 4.6206e-05 2.0281e-05 6.2812e-03 1.5498e-03 3.2111e-01 8.6415e-02 7.6972e-02 4.6094e-02 2.4200e-02 1.9998e-02 4.1738e-01 9.6920e-03 3.3691e-03 5.8907e-01 1.2177e-01 9.0682e-02 4.5474e-02 2.0060e-02 1.3853e-02 1.0603e-01 +4.2600e-01 1.3700e+07 5.5315e+02 3.4352e+03 5.7321e-08 3.5698e-01 6.4302e-01 4.1162e+03 3.1463e+03 3.7159e+02 1.2949e+02 4.6381e-05 2.0205e-05 6.2432e-03 1.5350e-03 3.1860e-01 8.5976e-02 7.6721e-02 4.6024e-02 2.4203e-02 2.0031e-02 4.2066e-01 9.6978e-03 3.3708e-03 5.8939e-01 1.2184e-01 9.0729e-02 4.5493e-02 2.0064e-02 1.3852e-02 1.0555e-01 +4.2800e-01 1.3600e+07 5.5315e+02 3.4155e+03 5.7835e-08 3.5731e-01 6.4269e-01 4.1067e+03 3.1233e+03 3.7279e+02 1.2833e+02 4.6554e-05 2.0131e-05 6.2051e-03 1.5202e-03 3.1610e-01 8.5535e-02 7.6467e-02 4.5951e-02 2.4204e-02 2.0064e-02 4.2395e-01 9.7033e-03 3.3724e-03 5.8971e-01 1.2191e-01 9.0777e-02 4.5512e-02 2.0069e-02 1.3851e-02 1.0509e-01 +4.3000e-01 1.3500e+07 5.5315e+02 3.3957e+03 5.8359e-08 3.5761e-01 6.4239e-01 4.0971e+03 3.1003e+03 3.7397e+02 1.2717e+02 4.6727e-05 2.0057e-05 6.1669e-03 1.5056e-03 3.1361e-01 8.5091e-02 7.6209e-02 4.5876e-02 2.4204e-02 2.0095e-02 4.2724e-01 9.7088e-03 3.3739e-03 5.9001e-01 1.2198e-01 9.0825e-02 4.5531e-02 2.0073e-02 1.3850e-02 1.0464e-01 +4.3200e-01 1.3400e+07 5.5315e+02 3.3759e+03 5.8892e-08 3.5786e-01 6.4214e-01 4.0876e+03 3.0773e+03 3.7515e+02 1.2603e+02 4.6899e-05 1.9985e-05 6.1287e-03 1.4910e-03 3.1112e-01 8.4646e-02 7.5949e-02 4.5798e-02 2.4202e-02 2.0125e-02 4.3054e-01 9.7141e-03 3.3753e-03 5.9030e-01 1.2205e-01 9.0872e-02 4.5551e-02 2.0079e-02 1.3850e-02 1.0421e-01 +4.3400e-01 1.3300e+07 5.5315e+02 3.3560e+03 5.9436e-08 3.5808e-01 6.4192e-01 4.0781e+03 3.0543e+03 3.7632e+02 1.2490e+02 4.7069e-05 1.9914e-05 6.0904e-03 1.4765e-03 3.0864e-01 8.4199e-02 7.5685e-02 4.5718e-02 2.4200e-02 2.0154e-02 4.3383e-01 9.7192e-03 3.3766e-03 5.9058e-01 1.2212e-01 9.0920e-02 4.5571e-02 2.0084e-02 1.3851e-02 1.0378e-01 +4.3600e-01 1.3200e+07 5.5315e+02 3.3360e+03 5.9991e-08 3.5826e-01 6.4174e-01 4.0685e+03 3.0313e+03 3.7748e+02 1.2377e+02 4.7239e-05 1.9844e-05 6.0520e-03 1.4621e-03 3.0617e-01 8.3749e-02 7.5418e-02 4.5636e-02 2.4195e-02 2.0182e-02 4.3714e-01 9.7243e-03 3.3778e-03 5.9085e-01 1.2218e-01 9.0967e-02 4.5591e-02 2.0090e-02 1.3851e-02 1.0337e-01 +4.3800e-01 1.3100e+07 5.5315e+02 3.3159e+03 6.0556e-08 3.5841e-01 6.4159e-01 4.0590e+03 3.0083e+03 3.7863e+02 1.2266e+02 4.7408e-05 1.9774e-05 6.0136e-03 1.4477e-03 3.0370e-01 8.3298e-02 7.5147e-02 4.5551e-02 2.4190e-02 2.0209e-02 4.4044e-01 9.7292e-03 3.3790e-03 5.9110e-01 1.2224e-01 9.1014e-02 4.5612e-02 2.0097e-02 1.3852e-02 1.0297e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.2958e+03 6.1133e-08 3.5852e-01 6.4148e-01 4.0495e+03 2.9853e+03 3.7978e+02 1.2155e+02 4.7576e-05 1.9706e-05 5.9751e-03 1.4335e-03 3.0124e-01 8.2844e-02 7.4873e-02 4.5463e-02 2.4183e-02 2.0235e-02 4.4376e-01 9.7340e-03 3.3801e-03 5.9135e-01 1.2231e-01 9.1061e-02 4.5633e-02 2.0103e-02 1.3854e-02 1.0258e-01 +4.4200e-01 1.2900e+07 5.5315e+02 3.2756e+03 6.1720e-08 3.5860e-01 6.4140e-01 4.0399e+03 2.9623e+03 3.8091e+02 1.2045e+02 4.7742e-05 1.9639e-05 5.9365e-03 1.4193e-03 2.9878e-01 8.2388e-02 7.4596e-02 4.5373e-02 2.4175e-02 2.0260e-02 4.4707e-01 9.7386e-03 3.3811e-03 5.9158e-01 1.2237e-01 9.1107e-02 4.5655e-02 2.0111e-02 1.3856e-02 1.0220e-01 +4.4400e-01 1.2800e+07 5.5315e+02 3.2554e+03 6.2320e-08 3.5865e-01 6.4135e-01 4.0304e+03 2.9393e+03 3.8204e+02 1.1935e+02 4.7908e-05 1.9573e-05 5.8978e-03 1.4052e-03 2.9632e-01 8.1930e-02 7.4316e-02 4.5281e-02 2.4165e-02 2.0284e-02 4.5040e-01 9.7431e-03 3.3820e-03 5.9180e-01 1.2243e-01 9.1154e-02 4.5676e-02 2.0118e-02 1.3858e-02 1.0184e-01 +4.4600e-01 1.2700e+07 5.5315e+02 3.2351e+03 6.2931e-08 3.5867e-01 6.4133e-01 4.0208e+03 2.9163e+03 3.8316e+02 1.1827e+02 4.8073e-05 1.9507e-05 5.8590e-03 1.3912e-03 2.9387e-01 8.1470e-02 7.4032e-02 4.5186e-02 2.4153e-02 2.0306e-02 4.5373e-01 9.7475e-03 3.3829e-03 5.9202e-01 1.2248e-01 9.1201e-02 4.5699e-02 2.0126e-02 1.3861e-02 1.0148e-01 +4.4800e-01 1.2600e+07 5.5315e+02 3.2147e+03 6.3555e-08 3.5865e-01 6.4135e-01 4.0113e+03 2.8934e+03 3.8428e+02 1.1719e+02 4.8238e-05 1.9443e-05 5.8201e-03 1.3773e-03 2.9143e-01 8.1008e-02 7.3744e-02 4.5088e-02 2.4141e-02 2.0327e-02 4.5707e-01 9.7518e-03 3.3837e-03 5.9222e-01 1.2254e-01 9.1247e-02 4.5721e-02 2.0134e-02 1.3864e-02 1.0114e-01 +4.5000e-01 1.2500e+07 5.5315e+02 3.1942e+03 6.4192e-08 3.5860e-01 6.4140e-01 4.0017e+03 2.8704e+03 3.8539e+02 1.1612e+02 4.8401e-05 1.9379e-05 5.7812e-03 1.3634e-03 2.8899e-01 8.0543e-02 7.3454e-02 4.4988e-02 2.4127e-02 2.0347e-02 4.6041e-01 9.7560e-03 3.3844e-03 5.9241e-01 1.2260e-01 9.1293e-02 4.5744e-02 2.0142e-02 1.3868e-02 1.0081e-01 +4.5200e-01 1.2400e+07 5.5315e+02 3.1737e+03 6.4841e-08 3.5852e-01 6.4148e-01 3.9922e+03 2.8474e+03 3.8649e+02 1.1506e+02 4.8564e-05 1.9317e-05 5.7421e-03 1.3496e-03 2.8655e-01 8.0075e-02 7.3159e-02 4.4885e-02 2.4111e-02 2.0366e-02 4.6376e-01 9.7600e-03 3.3850e-03 5.9259e-01 1.2265e-01 9.1339e-02 4.5767e-02 2.0151e-02 1.3871e-02 1.0048e-01 +4.5400e-01 1.2300e+07 5.5315e+02 3.1531e+03 6.5504e-08 3.5841e-01 6.4159e-01 3.9826e+03 2.8244e+03 3.8758e+02 1.1400e+02 4.8725e-05 1.9255e-05 5.7030e-03 1.3359e-03 2.8412e-01 7.9606e-02 7.2861e-02 4.4780e-02 2.4094e-02 2.0384e-02 4.6712e-01 9.7639e-03 3.3856e-03 5.9276e-01 1.2271e-01 9.1385e-02 4.5790e-02 2.0160e-02 1.3876e-02 1.0017e-01 +4.5600e-01 1.2200e+07 5.5315e+02 3.1324e+03 6.6181e-08 3.5827e-01 6.4173e-01 3.9731e+03 2.8014e+03 3.8867e+02 1.1295e+02 4.8886e-05 1.9194e-05 5.6637e-03 1.3222e-03 2.8169e-01 7.9134e-02 7.2560e-02 4.4671e-02 2.4075e-02 2.0400e-02 4.7048e-01 9.7677e-03 3.3861e-03 5.9292e-01 1.2276e-01 9.1430e-02 4.5814e-02 2.0169e-02 1.3880e-02 9.9871e-02 +4.5800e-01 1.2100e+07 5.5315e+02 3.1116e+03 6.6872e-08 3.5810e-01 6.4190e-01 3.9635e+03 2.7784e+03 3.8975e+02 1.1191e+02 4.9046e-05 1.9133e-05 5.6243e-03 1.3086e-03 2.7926e-01 7.8659e-02 7.2254e-02 4.4560e-02 2.4055e-02 2.0416e-02 4.7386e-01 9.7714e-03 3.3865e-03 5.9307e-01 1.2281e-01 9.1475e-02 4.5838e-02 2.0179e-02 1.3885e-02 9.9580e-02 +4.6000e-01 1.2000e+07 5.5315e+02 3.0907e+03 6.7578e-08 3.5790e-01 6.4210e-01 3.9540e+03 2.7554e+03 3.9082e+02 1.1087e+02 4.9206e-05 1.9074e-05 5.5849e-03 1.2951e-03 2.7684e-01 7.8182e-02 7.1946e-02 4.4447e-02 2.4033e-02 2.0429e-02 4.7724e-01 9.7750e-03 3.3869e-03 5.9321e-01 1.2286e-01 9.1520e-02 4.5862e-02 2.0189e-02 1.3891e-02 9.9300e-02 +4.6200e-01 1.1900e+07 5.5315e+02 3.0698e+03 6.8298e-08 3.5768e-01 6.4232e-01 3.9445e+03 2.7324e+03 3.9189e+02 1.0984e+02 4.9364e-05 1.9015e-05 5.5453e-03 1.2816e-03 2.7442e-01 7.7703e-02 7.1633e-02 4.4330e-02 2.4010e-02 2.0442e-02 4.8063e-01 9.7784e-03 3.3872e-03 5.9334e-01 1.2291e-01 9.1565e-02 4.5886e-02 2.0199e-02 1.3896e-02 9.9031e-02 +4.6400e-01 1.1800e+07 5.5315e+02 3.0488e+03 6.9034e-08 3.5742e-01 6.4258e-01 3.9349e+03 2.7094e+03 3.9295e+02 1.0882e+02 4.9522e-05 1.8957e-05 5.5056e-03 1.2682e-03 2.7201e-01 7.7221e-02 7.1317e-02 4.4211e-02 2.3985e-02 2.0453e-02 4.8403e-01 9.7817e-03 3.3874e-03 5.9346e-01 1.2296e-01 9.1610e-02 4.5911e-02 2.0210e-02 1.3902e-02 9.8771e-02 +4.6600e-01 1.1700e+07 5.5315e+02 3.0277e+03 6.9787e-08 3.5713e-01 6.4287e-01 3.9254e+03 2.6864e+03 3.9401e+02 1.0780e+02 4.9679e-05 1.8899e-05 5.4659e-03 1.2548e-03 2.6960e-01 7.6737e-02 7.0997e-02 4.4089e-02 2.3958e-02 2.0463e-02 4.8744e-01 9.7849e-03 3.3876e-03 5.9358e-01 1.2301e-01 9.1654e-02 4.5936e-02 2.0221e-02 1.3909e-02 9.8522e-02 +4.6800e-01 1.1600e+07 5.5315e+02 3.0066e+03 7.0555e-08 3.5681e-01 6.4319e-01 3.9158e+03 2.6634e+03 3.9506e+02 1.0679e+02 4.9835e-05 1.8843e-05 5.4260e-03 1.2416e-03 2.6719e-01 7.6250e-02 7.0673e-02 4.3964e-02 2.3930e-02 2.0472e-02 4.9086e-01 9.7880e-03 3.3877e-03 5.9368e-01 1.2306e-01 9.1698e-02 4.5961e-02 2.0232e-02 1.3916e-02 9.8284e-02 +4.7000e-01 1.1500e+07 5.5315e+02 2.9853e+03 7.1341e-08 3.5647e-01 6.4353e-01 3.9063e+03 2.6405e+03 3.9611e+02 1.0579e+02 4.9991e-05 1.8787e-05 5.3860e-03 1.2283e-03 2.6478e-01 7.5760e-02 7.0345e-02 4.3836e-02 2.3900e-02 2.0479e-02 4.9428e-01 9.7909e-03 3.3877e-03 5.9377e-01 1.2310e-01 9.1742e-02 4.5986e-02 2.0243e-02 1.3923e-02 9.8055e-02 +4.7200e-01 1.1400e+07 5.5315e+02 2.9640e+03 7.2143e-08 3.5609e-01 6.4391e-01 3.8968e+03 2.6175e+03 3.9715e+02 1.0479e+02 5.0146e-05 1.8731e-05 5.3458e-03 1.2152e-03 2.6238e-01 7.5268e-02 7.0014e-02 4.3705e-02 2.3868e-02 2.0485e-02 4.9772e-01 9.7938e-03 3.3877e-03 5.9386e-01 1.2314e-01 9.1785e-02 4.6012e-02 2.0255e-02 1.3930e-02 9.7837e-02 +4.7400e-01 1.1300e+07 5.5315e+02 2.9425e+03 7.2964e-08 3.5568e-01 6.4432e-01 3.8872e+03 2.5945e+03 3.9818e+02 1.0379e+02 5.0300e-05 1.8677e-05 5.3056e-03 1.2020e-03 2.5998e-01 7.4773e-02 6.9679e-02 4.3571e-02 2.3835e-02 2.0490e-02 5.0117e-01 9.7965e-03 3.3876e-03 5.9393e-01 1.2319e-01 9.1828e-02 4.6037e-02 2.0267e-02 1.3938e-02 9.7629e-02 +4.7600e-01 1.1200e+07 5.5315e+02 2.9210e+03 7.3804e-08 3.5525e-01 6.4475e-01 3.8777e+03 2.5715e+03 3.9921e+02 1.0280e+02 5.0454e-05 1.8622e-05 5.2653e-03 1.1890e-03 2.5758e-01 7.4275e-02 6.9339e-02 4.3434e-02 2.3800e-02 2.0493e-02 5.0462e-01 9.7991e-03 3.3875e-03 5.9399e-01 1.2323e-01 9.1871e-02 4.6063e-02 2.0279e-02 1.3946e-02 9.7432e-02 +4.7800e-01 1.1100e+07 5.5315e+02 2.8994e+03 7.4662e-08 3.5479e-01 6.4521e-01 3.8682e+03 2.5485e+03 4.0024e+02 1.0182e+02 5.0607e-05 1.8569e-05 5.2248e-03 1.1760e-03 2.5518e-01 7.3775e-02 6.8996e-02 4.3295e-02 2.3763e-02 2.0495e-02 5.0809e-01 9.8016e-03 3.3873e-03 5.9405e-01 1.2327e-01 9.1914e-02 4.6089e-02 2.0292e-02 1.3955e-02 9.7244e-02 +4.8000e-01 1.1000e+07 5.5315e+02 2.8777e+03 7.5541e-08 3.5429e-01 6.4571e-01 3.8587e+03 2.5254e+03 4.0126e+02 1.0084e+02 5.0759e-05 1.8516e-05 5.1842e-03 1.1631e-03 2.5279e-01 7.3272e-02 6.8649e-02 4.3152e-02 2.3725e-02 2.0495e-02 5.1157e-01 9.8039e-03 3.3870e-03 5.9409e-01 1.2331e-01 9.1956e-02 4.6116e-02 2.0305e-02 1.3963e-02 9.7067e-02 +4.8200e-01 1.0900e+07 5.5315e+02 2.8559e+03 7.6439e-08 3.5377e-01 6.4623e-01 3.8491e+03 2.5024e+03 4.0228e+02 9.9866e+01 5.0911e-05 1.8464e-05 5.1435e-03 1.1502e-03 2.5040e-01 7.2767e-02 6.8298e-02 4.3006e-02 2.3684e-02 2.0493e-02 5.1506e-01 9.8062e-03 3.3867e-03 5.9413e-01 1.2334e-01 9.1998e-02 4.6142e-02 2.0318e-02 1.3973e-02 9.6900e-02 +4.8400e-01 1.0800e+07 5.5315e+02 2.8341e+03 7.7359e-08 3.5322e-01 6.4678e-01 3.8396e+03 2.4794e+03 4.0329e+02 9.8898e+01 5.1061e-05 1.8412e-05 5.1027e-03 1.1373e-03 2.4801e-01 7.2258e-02 6.7942e-02 4.2857e-02 2.3642e-02 2.0491e-02 5.1856e-01 9.8083e-03 3.3863e-03 5.9416e-01 1.2338e-01 9.2039e-02 4.6169e-02 2.0331e-02 1.3982e-02 9.6744e-02 +4.8600e-01 1.0700e+07 5.5315e+02 2.8121e+03 7.8300e-08 3.5264e-01 6.4736e-01 3.8301e+03 2.4564e+03 4.0429e+02 9.7934e+01 5.1212e-05 1.8361e-05 5.0617e-03 1.1245e-03 2.4562e-01 7.1747e-02 6.7583e-02 4.2705e-02 2.3598e-02 2.0486e-02 5.2208e-01 9.8103e-03 3.3859e-03 5.9418e-01 1.2342e-01 9.2080e-02 4.6196e-02 2.0345e-02 1.3992e-02 9.6598e-02 +4.8800e-01 1.0600e+07 5.5315e+02 2.7900e+03 7.9264e-08 3.5203e-01 6.4797e-01 3.8206e+03 2.4334e+03 4.0530e+02 9.6975e+01 5.1361e-05 1.8311e-05 5.0206e-03 1.1118e-03 2.4323e-01 7.1233e-02 6.7220e-02 4.2549e-02 2.3552e-02 2.0480e-02 5.2560e-01 9.8122e-03 3.3854e-03 5.9419e-01 1.2345e-01 9.2121e-02 4.6223e-02 2.0359e-02 1.4002e-02 9.6462e-02 +4.9000e-01 1.0500e+07 5.5315e+02 2.7679e+03 8.0251e-08 3.5138e-01 6.4862e-01 3.8111e+03 2.4104e+03 4.0629e+02 9.6021e+01 5.1510e-05 1.8261e-05 4.9794e-03 1.0991e-03 2.4085e-01 7.0716e-02 6.6852e-02 4.2391e-02 2.3504e-02 2.0472e-02 5.2914e-01 9.8139e-03 3.3848e-03 5.9419e-01 1.2348e-01 9.2161e-02 4.6250e-02 2.0373e-02 1.4012e-02 9.6337e-02 +4.9200e-01 1.0400e+07 5.5315e+02 2.7456e+03 8.1262e-08 3.5071e-01 6.4929e-01 3.8016e+03 2.3874e+03 4.0729e+02 9.5072e+01 5.1658e-05 1.8211e-05 4.9381e-03 1.0865e-03 2.3847e-01 7.0196e-02 6.6480e-02 4.2229e-02 2.3455e-02 2.0463e-02 5.3269e-01 9.8155e-03 3.3842e-03 5.9418e-01 1.2351e-01 9.2201e-02 4.6277e-02 2.0387e-02 1.4023e-02 9.6222e-02 +4.9400e-01 1.0300e+07 5.5315e+02 2.7232e+03 8.2297e-08 3.5000e-01 6.5000e-01 3.7921e+03 2.3644e+03 4.0828e+02 9.4127e+01 5.1806e-05 1.8162e-05 4.8966e-03 1.0739e-03 2.3609e-01 6.9674e-02 6.6104e-02 4.2064e-02 2.3403e-02 2.0452e-02 5.3625e-01 9.8170e-03 3.3835e-03 5.9416e-01 1.2355e-01 9.2240e-02 4.6304e-02 2.0402e-02 1.4034e-02 9.6118e-02 +4.9600e-01 1.0200e+07 5.5315e+02 2.7008e+03 8.3358e-08 3.4927e-01 6.5073e-01 3.7826e+03 2.3414e+03 4.0926e+02 9.3186e+01 5.1953e-05 1.8113e-05 4.8550e-03 1.0614e-03 2.3371e-01 6.9148e-02 6.5723e-02 4.1895e-02 2.3349e-02 2.0440e-02 5.3982e-01 9.8184e-03 3.3828e-03 5.9413e-01 1.2357e-01 9.2278e-02 4.6331e-02 2.0416e-02 1.4046e-02 9.6025e-02 +4.9800e-01 1.0100e+07 5.5315e+02 2.6782e+03 8.4446e-08 3.4850e-01 6.5150e-01 3.7731e+03 2.3183e+03 4.1024e+02 9.2250e+01 5.2100e-05 1.8065e-05 4.8133e-03 1.0489e-03 2.3133e-01 6.8620e-02 6.5339e-02 4.1724e-02 2.3293e-02 2.0425e-02 5.4341e-01 9.8196e-03 3.3820e-03 5.9409e-01 1.2360e-01 9.2317e-02 4.6359e-02 2.0431e-02 1.4057e-02 9.5943e-02 +5.0000e-01 1.0000e+07 5.5315e+02 2.6555e+03 8.5560e-08 3.4770e-01 6.5230e-01 3.7636e+03 2.2953e+03 4.1122e+02 9.1318e+01 5.2245e-05 1.8018e-05 4.7715e-03 1.0365e-03 2.2895e-01 6.8089e-02 6.4950e-02 4.1548e-02 2.3236e-02 2.0409e-02 5.4701e-01 9.8207e-03 3.3811e-03 5.9404e-01 1.2363e-01 9.2354e-02 4.6386e-02 2.0447e-02 1.4070e-02 9.5871e-02 +5.0200e-01 9.9604e+06 5.5315e+02 2.6465e+03 8.6010e-08 3.4737e-01 6.5263e-01 3.7599e+03 2.2862e+03 4.1161e+02 9.0950e+01 5.2303e-05 1.7999e-05 4.7549e-03 1.0315e-03 2.2801e-01 6.7877e-02 6.4794e-02 4.1478e-02 2.3212e-02 2.0402e-02 5.4844e-01 9.8211e-03 3.3807e-03 5.9402e-01 1.2364e-01 9.2369e-02 4.6397e-02 2.0453e-02 1.4074e-02 9.5846e-02 +5.0400e-01 9.9208e+06 5.5315e+02 2.6375e+03 8.6463e-08 3.4704e-01 6.5296e-01 3.7561e+03 2.2771e+03 4.1199e+02 9.0583e+01 5.2360e-05 1.7981e-05 4.7382e-03 1.0266e-03 2.2707e-01 6.7666e-02 6.4639e-02 4.1407e-02 2.3188e-02 2.0395e-02 5.4987e-01 9.8215e-03 3.3804e-03 5.9400e-01 1.2365e-01 9.2384e-02 4.6408e-02 2.0459e-02 1.4079e-02 9.5823e-02 +5.0600e-01 9.8812e+06 5.5315e+02 2.6285e+03 8.6922e-08 3.4670e-01 6.5330e-01 3.7524e+03 2.2680e+03 4.1238e+02 9.0216e+01 5.2418e-05 1.7962e-05 4.7216e-03 1.0217e-03 2.2613e-01 6.7454e-02 6.4482e-02 4.1336e-02 2.3164e-02 2.0388e-02 5.5130e-01 9.8219e-03 3.3800e-03 5.9397e-01 1.2366e-01 9.2398e-02 4.6419e-02 2.0465e-02 1.4084e-02 9.5801e-02 +5.0800e-01 9.8416e+06 5.5315e+02 2.6194e+03 8.7385e-08 3.4636e-01 6.5364e-01 3.7486e+03 2.2589e+03 4.1276e+02 8.9850e+01 5.2475e-05 1.7944e-05 4.7049e-03 1.0169e-03 2.2519e-01 6.7241e-02 6.4325e-02 4.1264e-02 2.3140e-02 2.0380e-02 5.5274e-01 9.8222e-03 3.3796e-03 5.9395e-01 1.2367e-01 9.2413e-02 4.6430e-02 2.0471e-02 1.4089e-02 9.5781e-02 +5.1000e-01 9.8020e+06 5.5315e+02 2.6103e+03 8.7852e-08 3.4601e-01 6.5399e-01 3.7449e+03 2.2497e+03 4.1314e+02 8.9485e+01 5.2532e-05 1.7925e-05 4.6882e-03 1.0120e-03 2.2425e-01 6.7028e-02 6.4166e-02 4.1191e-02 2.3115e-02 2.0372e-02 5.5418e-01 9.8225e-03 3.3792e-03 5.9392e-01 1.2367e-01 9.2427e-02 4.6441e-02 2.0477e-02 1.4094e-02 9.5763e-02 +5.1200e-01 9.7624e+06 5.5315e+02 2.6013e+03 8.8325e-08 3.4566e-01 6.5434e-01 3.7411e+03 2.2406e+03 4.1353e+02 8.9121e+01 5.2589e-05 1.7907e-05 4.6715e-03 1.0071e-03 2.2331e-01 6.6814e-02 6.4008e-02 4.1118e-02 2.3090e-02 2.0363e-02 5.5562e-01 9.8228e-03 3.3788e-03 5.9389e-01 1.2368e-01 9.2442e-02 4.6452e-02 2.0484e-02 1.4099e-02 9.5746e-02 +5.1400e-01 9.7228e+06 5.5315e+02 2.5921e+03 8.8802e-08 3.4530e-01 6.5470e-01 3.7374e+03 2.2315e+03 4.1391e+02 8.8756e+01 5.2646e-05 1.7888e-05 4.6547e-03 1.0022e-03 2.2237e-01 6.6600e-02 6.3848e-02 4.1045e-02 2.3064e-02 2.0355e-02 5.5706e-01 9.8231e-03 3.3784e-03 5.9386e-01 1.2369e-01 9.2456e-02 4.6463e-02 2.0490e-02 1.4105e-02 9.5732e-02 +5.1600e-01 9.6832e+06 5.5315e+02 2.5830e+03 8.9284e-08 3.4494e-01 6.5506e-01 3.7336e+03 2.2224e+03 4.1429e+02 8.8393e+01 5.2703e-05 1.7870e-05 4.6380e-03 9.9736e-04 2.2143e-01 6.6386e-02 6.3688e-02 4.0971e-02 2.3039e-02 2.0346e-02 5.5851e-01 9.8233e-03 3.3780e-03 5.9383e-01 1.2370e-01 9.2470e-02 4.6474e-02 2.0496e-02 1.4110e-02 9.5719e-02 +5.1800e-01 9.6436e+06 5.5315e+02 2.5739e+03 8.9771e-08 3.4457e-01 6.5543e-01 3.7299e+03 2.2133e+03 4.1467e+02 8.8030e+01 5.2760e-05 1.7852e-05 4.6212e-03 9.9251e-04 2.2049e-01 6.6171e-02 6.3527e-02 4.0896e-02 2.3013e-02 2.0337e-02 5.5995e-01 9.8236e-03 3.3776e-03 5.9380e-01 1.2371e-01 9.2484e-02 4.6485e-02 2.0503e-02 1.4115e-02 9.5708e-02 +5.2000e-01 9.6040e+06 5.5315e+02 2.5647e+03 9.0263e-08 3.4420e-01 6.5580e-01 3.7261e+03 2.2041e+03 4.1505e+02 8.7668e+01 5.2817e-05 1.7834e-05 4.6044e-03 9.8766e-04 2.1955e-01 6.5955e-02 6.3366e-02 4.0820e-02 2.2986e-02 2.0327e-02 5.6140e-01 9.8238e-03 3.3771e-03 5.9376e-01 1.2372e-01 9.2498e-02 4.6496e-02 2.0509e-02 1.4120e-02 9.5699e-02 +5.2200e-01 9.5644e+06 5.5315e+02 2.5555e+03 9.0760e-08 3.4382e-01 6.5618e-01 3.7224e+03 2.1950e+03 4.1543e+02 8.7307e+01 5.2873e-05 1.7816e-05 4.5876e-03 9.8282e-04 2.1861e-01 6.5739e-02 6.3203e-02 4.0745e-02 2.2959e-02 2.0317e-02 5.6285e-01 9.8240e-03 3.3767e-03 5.9372e-01 1.2372e-01 9.2512e-02 4.6507e-02 2.0515e-02 1.4126e-02 9.5691e-02 +5.2400e-01 9.5248e+06 5.5315e+02 2.5464e+03 9.1262e-08 3.4343e-01 6.5657e-01 3.7186e+03 2.1859e+03 4.1581e+02 8.6946e+01 5.2930e-05 1.7798e-05 4.5707e-03 9.7798e-04 2.1767e-01 6.5523e-02 6.3041e-02 4.0668e-02 2.2932e-02 2.0307e-02 5.6431e-01 9.8241e-03 3.3762e-03 5.9369e-01 1.2373e-01 9.2525e-02 4.6518e-02 2.0522e-02 1.4131e-02 9.5686e-02 +5.2600e-01 9.4852e+06 5.5315e+02 2.5371e+03 9.1770e-08 3.4304e-01 6.5696e-01 3.7149e+03 2.1768e+03 4.1619e+02 8.6585e+01 5.2986e-05 1.7780e-05 4.5539e-03 9.7315e-04 2.1674e-01 6.5306e-02 6.2877e-02 4.0591e-02 2.2905e-02 2.0297e-02 5.6576e-01 9.8243e-03 3.3758e-03 5.9365e-01 1.2374e-01 9.2539e-02 4.6529e-02 2.0528e-02 1.4137e-02 9.5682e-02 +5.2800e-01 9.4456e+06 5.5315e+02 2.5279e+03 9.2283e-08 3.4264e-01 6.5736e-01 3.7111e+03 2.1677e+03 4.1657e+02 8.6226e+01 5.3042e-05 1.7762e-05 4.5370e-03 9.6833e-04 2.1580e-01 6.5089e-02 6.2712e-02 4.0514e-02 2.2877e-02 2.0286e-02 5.6722e-01 9.8244e-03 3.3753e-03 5.9361e-01 1.2375e-01 9.2553e-02 4.6540e-02 2.0535e-02 1.4142e-02 9.5680e-02 +5.3000e-01 9.4060e+06 5.5315e+02 2.5187e+03 9.2801e-08 3.4224e-01 6.5776e-01 3.7074e+03 2.1586e+03 4.1695e+02 8.5867e+01 5.3099e-05 1.7745e-05 4.5201e-03 9.6352e-04 2.1486e-01 6.4871e-02 6.2547e-02 4.0435e-02 2.2848e-02 2.0275e-02 5.6868e-01 9.8245e-03 3.3748e-03 5.9356e-01 1.2375e-01 9.2566e-02 4.6550e-02 2.0541e-02 1.4148e-02 9.5680e-02 +5.3200e-01 9.3664e+06 5.5315e+02 2.5094e+03 9.3325e-08 3.4183e-01 6.5817e-01 3.7036e+03 2.1494e+03 4.1733e+02 8.5508e+01 5.3155e-05 1.7727e-05 4.5031e-03 9.5871e-04 2.1392e-01 6.4653e-02 6.2381e-02 4.0357e-02 2.2820e-02 2.0264e-02 5.7014e-01 9.8246e-03 3.3743e-03 5.9352e-01 1.2376e-01 9.2579e-02 4.6561e-02 2.0548e-02 1.4153e-02 9.5682e-02 +5.3400e-01 9.3268e+06 5.5315e+02 2.5001e+03 9.3854e-08 3.4142e-01 6.5858e-01 3.6999e+03 2.1403e+03 4.1770e+02 8.5150e+01 5.3211e-05 1.7709e-05 4.4862e-03 9.5391e-04 2.1298e-01 6.4434e-02 6.2215e-02 4.0277e-02 2.2791e-02 2.0252e-02 5.7161e-01 9.8246e-03 3.3738e-03 5.9347e-01 1.2376e-01 9.2592e-02 4.6572e-02 2.0555e-02 1.4159e-02 9.5686e-02 +5.3600e-01 9.2872e+06 5.5315e+02 2.4908e+03 9.4389e-08 3.4100e-01 6.5900e-01 3.6961e+03 2.1312e+03 4.1808e+02 8.4793e+01 5.3267e-05 1.7692e-05 4.4692e-03 9.4912e-04 2.1204e-01 6.4214e-02 6.2047e-02 4.0198e-02 2.2762e-02 2.0240e-02 5.7308e-01 9.8246e-03 3.3733e-03 5.9343e-01 1.2377e-01 9.2605e-02 4.6583e-02 2.0561e-02 1.4164e-02 9.5691e-02 +5.3800e-01 9.2476e+06 5.5315e+02 2.4815e+03 9.4930e-08 3.4057e-01 6.5943e-01 3.6924e+03 2.1221e+03 4.1846e+02 8.4436e+01 5.3323e-05 1.7674e-05 4.4522e-03 9.4433e-04 2.1111e-01 6.3995e-02 6.1879e-02 4.0117e-02 2.2732e-02 2.0228e-02 5.7455e-01 9.8246e-03 3.3728e-03 5.9338e-01 1.2378e-01 9.2618e-02 4.6594e-02 2.0568e-02 1.4170e-02 9.5699e-02 +5.4000e-01 9.2080e+06 5.5315e+02 2.4722e+03 9.5476e-08 3.4014e-01 6.5986e-01 3.6887e+03 2.1130e+03 4.1883e+02 8.4080e+01 5.3378e-05 1.7657e-05 4.4352e-03 9.3955e-04 2.1017e-01 6.3774e-02 6.1711e-02 4.0036e-02 2.2702e-02 2.0215e-02 5.7602e-01 9.8246e-03 3.3722e-03 5.9333e-01 1.2378e-01 9.2631e-02 4.6605e-02 2.0574e-02 1.4176e-02 9.5709e-02 +5.4200e-01 9.1684e+06 5.5315e+02 2.4628e+03 9.6028e-08 3.3970e-01 6.6030e-01 3.6849e+03 2.1038e+03 4.1921e+02 8.3724e+01 5.3434e-05 1.7639e-05 4.4181e-03 9.3478e-04 2.0923e-01 6.3554e-02 6.1541e-02 3.9954e-02 2.2671e-02 2.0202e-02 5.7749e-01 9.8246e-03 3.3717e-03 5.9327e-01 1.2379e-01 9.2644e-02 4.6616e-02 2.0581e-02 1.4182e-02 9.5720e-02 +5.4400e-01 9.1288e+06 5.5315e+02 2.4534e+03 9.6587e-08 3.3926e-01 6.6074e-01 3.6812e+03 2.0947e+03 4.1958e+02 8.3369e+01 5.3489e-05 1.7622e-05 4.4011e-03 9.3001e-04 2.0829e-01 6.3332e-02 6.1371e-02 3.9872e-02 2.2641e-02 2.0189e-02 5.7897e-01 9.8245e-03 3.3711e-03 5.9322e-01 1.2379e-01 9.2656e-02 4.6627e-02 2.0588e-02 1.4188e-02 9.5733e-02 +5.4600e-01 9.0892e+06 5.5315e+02 2.4440e+03 9.7151e-08 3.3881e-01 6.6119e-01 3.6774e+03 2.0856e+03 4.1995e+02 8.3014e+01 5.3545e-05 1.7605e-05 4.3840e-03 9.2525e-04 2.0736e-01 6.3111e-02 6.1200e-02 3.9789e-02 2.2610e-02 2.0175e-02 5.8045e-01 9.8244e-03 3.3706e-03 5.9317e-01 1.2380e-01 9.2669e-02 4.6638e-02 2.0595e-02 1.4194e-02 9.5749e-02 +5.4800e-01 9.0496e+06 5.5315e+02 2.4346e+03 9.7722e-08 3.3835e-01 6.6165e-01 3.6737e+03 2.0765e+03 4.2033e+02 8.2660e+01 5.3600e-05 1.7587e-05 4.3669e-03 9.2050e-04 2.0642e-01 6.2888e-02 6.1028e-02 3.9706e-02 2.2578e-02 2.0161e-02 5.8193e-01 9.8243e-03 3.3700e-03 5.9311e-01 1.2380e-01 9.2681e-02 4.6649e-02 2.0601e-02 1.4200e-02 9.5766e-02 +5.5000e-01 9.0100e+06 5.5315e+02 2.4252e+03 9.8299e-08 3.3789e-01 6.6211e-01 3.6700e+03 2.0674e+03 4.2070e+02 8.2307e+01 5.3656e-05 1.7570e-05 4.3497e-03 9.1575e-04 2.0548e-01 6.2666e-02 6.0856e-02 3.9622e-02 2.2546e-02 2.0147e-02 5.8342e-01 9.8242e-03 3.3694e-03 5.9305e-01 1.2380e-01 9.2693e-02 4.6660e-02 2.0608e-02 1.4206e-02 9.5786e-02 +5.5200e-01 8.9704e+06 5.5315e+02 2.4157e+03 9.8882e-08 3.3742e-01 6.6258e-01 3.6662e+03 2.0582e+03 4.2107e+02 8.1954e+01 5.3711e-05 1.7553e-05 4.3326e-03 9.1101e-04 2.0455e-01 6.2442e-02 6.0683e-02 3.9537e-02 2.2514e-02 2.0132e-02 5.8490e-01 9.8240e-03 3.3688e-03 5.9299e-01 1.2381e-01 9.2705e-02 4.6670e-02 2.0615e-02 1.4212e-02 9.5807e-02 +5.5400e-01 8.9308e+06 5.5315e+02 2.4063e+03 9.9471e-08 3.3695e-01 6.6305e-01 3.6625e+03 2.0491e+03 4.2145e+02 8.1602e+01 5.3766e-05 1.7536e-05 4.3154e-03 9.0627e-04 2.0361e-01 6.2219e-02 6.0509e-02 3.9452e-02 2.2481e-02 2.0117e-02 5.8639e-01 9.8239e-03 3.3682e-03 5.9293e-01 1.2381e-01 9.2717e-02 4.6681e-02 2.0622e-02 1.4218e-02 9.5831e-02 +5.5600e-01 8.8912e+06 5.5315e+02 2.3968e+03 1.0007e-07 3.3646e-01 6.6354e-01 3.6587e+03 2.0400e+03 4.2182e+02 8.1250e+01 5.3821e-05 1.7519e-05 4.2982e-03 9.0155e-04 2.0267e-01 6.1994e-02 6.0334e-02 3.9366e-02 2.2448e-02 2.0102e-02 5.8788e-01 9.8236e-03 3.3676e-03 5.9286e-01 1.2382e-01 9.2729e-02 4.6692e-02 2.0629e-02 1.4224e-02 9.5856e-02 +5.5800e-01 8.8516e+06 5.5315e+02 2.3873e+03 1.0067e-07 3.3598e-01 6.6402e-01 3.6550e+03 2.0309e+03 4.2219e+02 8.0899e+01 5.3876e-05 1.7502e-05 4.2810e-03 8.9682e-04 2.0174e-01 6.1770e-02 6.0158e-02 3.9280e-02 2.2415e-02 2.0086e-02 5.8938e-01 9.8234e-03 3.3670e-03 5.9280e-01 1.2382e-01 9.2741e-02 4.6703e-02 2.0636e-02 1.4230e-02 9.5884e-02 +5.6000e-01 8.8120e+06 5.5315e+02 2.3778e+03 1.0128e-07 3.3548e-01 6.6452e-01 3.6513e+03 2.0218e+03 4.2256e+02 8.0548e+01 5.3930e-05 1.7485e-05 4.2638e-03 8.9211e-04 2.0080e-01 6.1544e-02 5.9982e-02 3.9192e-02 2.2381e-02 2.0070e-02 5.9088e-01 9.8232e-03 3.3663e-03 5.9273e-01 1.2382e-01 9.2752e-02 4.6714e-02 2.0643e-02 1.4236e-02 9.5913e-02 +5.6200e-01 8.7724e+06 5.5315e+02 2.3682e+03 1.0190e-07 3.3498e-01 6.6502e-01 3.6475e+03 2.0126e+03 4.2293e+02 8.0198e+01 5.3985e-05 1.7468e-05 4.2465e-03 8.8740e-04 1.9986e-01 6.1319e-02 5.9805e-02 3.9105e-02 2.2347e-02 2.0053e-02 5.9237e-01 9.8229e-03 3.3657e-03 5.9266e-01 1.2382e-01 9.2763e-02 4.6724e-02 2.0650e-02 1.4243e-02 9.5945e-02 +5.6400e-01 8.7328e+06 5.5315e+02 2.3586e+03 1.0252e-07 3.3447e-01 6.6553e-01 3.6438e+03 2.0035e+03 4.2330e+02 7.9849e+01 5.4040e-05 1.7451e-05 4.2292e-03 8.8270e-04 1.9893e-01 6.1092e-02 5.9627e-02 3.9016e-02 2.2312e-02 2.0037e-02 5.9388e-01 9.8226e-03 3.3651e-03 5.9259e-01 1.2383e-01 9.2775e-02 4.6735e-02 2.0657e-02 1.4249e-02 9.5979e-02 +5.6600e-01 8.6932e+06 5.5315e+02 2.3491e+03 1.0315e-07 3.3396e-01 6.6604e-01 3.6401e+03 1.9944e+03 4.2367e+02 7.9500e+01 5.4094e-05 1.7435e-05 4.2119e-03 8.7800e-04 1.9799e-01 6.0866e-02 5.9449e-02 3.8927e-02 2.2277e-02 2.0020e-02 5.9538e-01 9.8222e-03 3.3644e-03 5.9252e-01 1.2383e-01 9.2786e-02 4.6746e-02 2.0663e-02 1.4255e-02 9.6015e-02 +5.6800e-01 8.6536e+06 5.5315e+02 2.3394e+03 1.0379e-07 3.3344e-01 6.6656e-01 3.6363e+03 1.9853e+03 4.2404e+02 7.9151e+01 5.4149e-05 1.7418e-05 4.1946e-03 8.7331e-04 1.9705e-01 6.0638e-02 5.9270e-02 3.8838e-02 2.2242e-02 2.0002e-02 5.9689e-01 9.8219e-03 3.3637e-03 5.9245e-01 1.2383e-01 9.2797e-02 4.6757e-02 2.0671e-02 1.4262e-02 9.6053e-02 +5.7000e-01 8.6140e+06 5.5315e+02 2.3298e+03 1.0443e-07 3.3291e-01 6.6709e-01 3.6326e+03 1.9761e+03 4.2440e+02 7.8803e+01 5.4203e-05 1.7401e-05 4.1772e-03 8.6863e-04 1.9612e-01 6.0411e-02 5.9089e-02 3.8748e-02 2.2206e-02 1.9984e-02 5.9840e-01 9.8215e-03 3.3630e-03 5.9237e-01 1.2383e-01 9.2807e-02 4.6767e-02 2.0678e-02 1.4268e-02 9.6093e-02 +5.7200e-01 8.5744e+06 5.5315e+02 2.3202e+03 1.0508e-07 3.3237e-01 6.6763e-01 3.6289e+03 1.9670e+03 4.2477e+02 7.8455e+01 5.4257e-05 1.7385e-05 4.1598e-03 8.6395e-04 1.9518e-01 6.0182e-02 5.8909e-02 3.8657e-02 2.2170e-02 1.9966e-02 5.9991e-01 9.8211e-03 3.3624e-03 5.9229e-01 1.2383e-01 9.2818e-02 4.6778e-02 2.0685e-02 1.4275e-02 9.6136e-02 +5.7400e-01 8.5348e+06 5.5315e+02 2.3105e+03 1.0574e-07 3.3183e-01 6.6817e-01 3.6251e+03 1.9579e+03 4.2514e+02 7.8108e+01 5.4311e-05 1.7368e-05 4.1424e-03 8.5928e-04 1.9425e-01 5.9954e-02 5.8727e-02 3.8565e-02 2.2133e-02 1.9947e-02 6.0143e-01 9.8206e-03 3.3616e-03 5.9222e-01 1.2383e-01 9.2828e-02 4.6788e-02 2.0692e-02 1.4281e-02 9.6181e-02 +5.7600e-01 8.4952e+06 5.5315e+02 2.3008e+03 1.0641e-07 3.3128e-01 6.6872e-01 3.6214e+03 1.9488e+03 4.2551e+02 7.7762e+01 5.4365e-05 1.7352e-05 4.1250e-03 8.5461e-04 1.9331e-01 5.9724e-02 5.8545e-02 3.8473e-02 2.2096e-02 1.9928e-02 6.0294e-01 9.8202e-03 3.3609e-03 5.9213e-01 1.2383e-01 9.2839e-02 4.6799e-02 2.0699e-02 1.4288e-02 9.6228e-02 +5.7800e-01 8.4556e+06 5.5315e+02 2.2911e+03 1.0709e-07 3.3072e-01 6.6928e-01 3.6177e+03 1.9397e+03 4.2587e+02 7.7416e+01 5.4419e-05 1.7335e-05 4.1075e-03 8.4995e-04 1.9237e-01 5.9495e-02 5.8362e-02 3.8380e-02 2.2059e-02 1.9909e-02 6.0446e-01 9.8197e-03 3.3602e-03 5.9205e-01 1.2383e-01 9.2849e-02 4.6810e-02 2.0706e-02 1.4294e-02 9.6277e-02 +5.8000e-01 8.4160e+06 5.5315e+02 2.2814e+03 1.0777e-07 3.3016e-01 6.6984e-01 3.6140e+03 1.9305e+03 4.2624e+02 7.7071e+01 5.4473e-05 1.7319e-05 4.0901e-03 8.4530e-04 1.9144e-01 5.9264e-02 5.8178e-02 3.8287e-02 2.2021e-02 1.9889e-02 6.0599e-01 9.8192e-03 3.3595e-03 5.9197e-01 1.2383e-01 9.2859e-02 4.6820e-02 2.0713e-02 1.4301e-02 9.6328e-02 +5.8200e-01 8.3764e+06 5.5315e+02 2.2717e+03 1.0846e-07 3.2959e-01 6.7041e-01 3.6102e+03 1.9214e+03 4.2661e+02 7.6726e+01 5.4527e-05 1.7302e-05 4.0726e-03 8.4065e-04 1.9050e-01 5.9033e-02 5.7993e-02 3.8193e-02 2.1983e-02 1.9869e-02 6.0751e-01 9.8186e-03 3.3587e-03 5.9188e-01 1.2383e-01 9.2869e-02 4.6831e-02 2.0720e-02 1.4308e-02 9.6382e-02 +5.8400e-01 8.3368e+06 5.5315e+02 2.2619e+03 1.0916e-07 3.2901e-01 6.7099e-01 3.6065e+03 1.9123e+03 4.2697e+02 7.6381e+01 5.4580e-05 1.7286e-05 4.0551e-03 8.3601e-04 1.8957e-01 5.8802e-02 5.7807e-02 3.8098e-02 2.1944e-02 1.9849e-02 6.0904e-01 9.8180e-03 3.3580e-03 5.9179e-01 1.2383e-01 9.2878e-02 4.6841e-02 2.0727e-02 1.4314e-02 9.6438e-02 +5.8600e-01 8.2972e+06 5.5315e+02 2.2521e+03 1.0987e-07 3.2842e-01 6.7158e-01 3.6028e+03 1.9032e+03 4.2734e+02 7.6037e+01 5.4634e-05 1.7270e-05 4.0375e-03 8.3138e-04 1.8863e-01 5.8570e-02 5.7621e-02 3.8003e-02 2.1905e-02 1.9828e-02 6.1057e-01 9.8174e-03 3.3572e-03 5.9170e-01 1.2383e-01 9.2888e-02 4.6851e-02 2.0734e-02 1.4321e-02 9.6497e-02 +5.8800e-01 8.2576e+06 5.5315e+02 2.2423e+03 1.1058e-07 3.2783e-01 6.7217e-01 3.5991e+03 1.8941e+03 4.2770e+02 7.5694e+01 5.4687e-05 1.7253e-05 4.0199e-03 8.2675e-04 1.8770e-01 5.8338e-02 5.7434e-02 3.7907e-02 2.1866e-02 1.9807e-02 6.1211e-01 9.8168e-03 3.3564e-03 5.9161e-01 1.2383e-01 9.2897e-02 4.6862e-02 2.0742e-02 1.4328e-02 9.6557e-02 +5.9000e-01 8.2180e+06 5.5315e+02 2.2325e+03 1.1131e-07 3.2722e-01 6.7278e-01 3.5953e+03 1.8849e+03 4.2806e+02 7.5351e+01 5.4741e-05 1.7237e-05 4.0024e-03 8.2213e-04 1.8676e-01 5.8105e-02 5.7246e-02 3.7810e-02 2.1826e-02 1.9785e-02 6.1364e-01 9.8161e-03 3.3557e-03 5.9152e-01 1.2383e-01 9.2906e-02 4.6872e-02 2.0749e-02 1.4335e-02 9.6621e-02 +5.9200e-01 8.1784e+06 5.5315e+02 2.2226e+03 1.1204e-07 3.2661e-01 6.7339e-01 3.5916e+03 1.8758e+03 4.2843e+02 7.5008e+01 5.4794e-05 1.7221e-05 3.9847e-03 8.1751e-04 1.8583e-01 5.7872e-02 5.7057e-02 3.7713e-02 2.1785e-02 1.9763e-02 6.1518e-01 9.8154e-03 3.3549e-03 5.9142e-01 1.2382e-01 9.2915e-02 4.6882e-02 2.0756e-02 1.4342e-02 9.6686e-02 +5.9400e-01 8.1388e+06 5.5315e+02 2.2127e+03 1.1278e-07 3.2600e-01 6.7400e-01 3.5879e+03 1.8667e+03 4.2879e+02 7.4666e+01 5.4847e-05 1.7205e-05 3.9671e-03 8.1290e-04 1.8489e-01 5.7638e-02 5.6868e-02 3.7615e-02 2.1745e-02 1.9740e-02 6.1672e-01 9.8147e-03 3.3541e-03 5.9133e-01 1.2382e-01 9.2924e-02 4.6893e-02 2.0763e-02 1.4349e-02 9.6754e-02 +5.9600e-01 8.0992e+06 5.5315e+02 2.2028e+03 1.1353e-07 3.2537e-01 6.7463e-01 3.5842e+03 1.8576e+03 4.2915e+02 7.4325e+01 5.4900e-05 1.7189e-05 3.9495e-03 8.0829e-04 1.8396e-01 5.7403e-02 5.6678e-02 3.7516e-02 2.1703e-02 1.9718e-02 6.1827e-01 9.8140e-03 3.3532e-03 5.9123e-01 1.2382e-01 9.2932e-02 4.6903e-02 2.0771e-02 1.4356e-02 9.6825e-02 +5.9800e-01 8.0596e+06 5.5315e+02 2.1929e+03 1.1429e-07 3.2474e-01 6.7526e-01 3.5804e+03 1.8484e+03 4.2952e+02 7.3983e+01 5.4953e-05 1.7173e-05 3.9318e-03 8.0370e-04 1.8302e-01 5.7168e-02 5.6486e-02 3.7417e-02 2.1662e-02 1.9694e-02 6.1982e-01 9.8132e-03 3.3524e-03 5.9113e-01 1.2382e-01 9.2940e-02 4.6913e-02 2.0778e-02 1.4363e-02 9.6898e-02 +6.0000e-01 8.0200e+06 5.5315e+02 2.1830e+03 1.1506e-07 3.2409e-01 6.7591e-01 3.5767e+03 1.8393e+03 4.2988e+02 7.3643e+01 5.5006e-05 1.7157e-05 3.9141e-03 7.9910e-04 1.8209e-01 5.6933e-02 5.6295e-02 3.7317e-02 2.1620e-02 1.9671e-02 6.2137e-01 9.8124e-03 3.3516e-03 5.9102e-01 1.2381e-01 9.2948e-02 4.6923e-02 2.0785e-02 1.4370e-02 9.6973e-02 +6.0200e-01 7.9804e+06 5.5315e+02 2.1730e+03 1.1584e-07 3.2344e-01 6.7656e-01 3.5730e+03 1.8302e+03 4.3024e+02 7.3303e+01 5.5059e-05 1.7141e-05 3.8963e-03 7.9452e-04 1.8115e-01 5.6697e-02 5.6102e-02 3.7216e-02 2.1577e-02 1.9646e-02 6.2292e-01 9.8116e-03 3.3507e-03 5.9092e-01 1.2381e-01 9.2956e-02 4.6933e-02 2.0792e-02 1.4377e-02 9.7051e-02 +6.0400e-01 7.9408e+06 5.5315e+02 2.1631e+03 1.1663e-07 3.2278e-01 6.7722e-01 3.5693e+03 1.8211e+03 4.3060e+02 7.2963e+01 5.5111e-05 1.7125e-05 3.8786e-03 7.8993e-04 1.8022e-01 5.6460e-02 5.5908e-02 3.7115e-02 2.1534e-02 1.9622e-02 6.2448e-01 9.8107e-03 3.3498e-03 5.9081e-01 1.2380e-01 9.2964e-02 4.6943e-02 2.0800e-02 1.4384e-02 9.7132e-02 +6.0600e-01 7.9012e+06 5.5315e+02 2.1531e+03 1.1743e-07 3.2212e-01 6.7788e-01 3.5656e+03 1.8120e+03 4.3096e+02 7.2624e+01 5.5164e-05 1.7109e-05 3.8608e-03 7.8536e-04 1.7928e-01 5.6223e-02 5.5714e-02 3.7013e-02 2.1491e-02 1.9597e-02 6.2604e-01 9.8098e-03 3.3490e-03 5.9070e-01 1.2380e-01 9.2972e-02 4.6953e-02 2.0807e-02 1.4391e-02 9.7215e-02 +6.0800e-01 7.8616e+06 5.5315e+02 2.1430e+03 1.1824e-07 3.2144e-01 6.7856e-01 3.5619e+03 1.8028e+03 4.3132e+02 7.2285e+01 5.5216e-05 1.7093e-05 3.8430e-03 7.8079e-04 1.7835e-01 5.5986e-02 5.5519e-02 3.6910e-02 2.1447e-02 1.9572e-02 6.2760e-01 9.8089e-03 3.3481e-03 5.9059e-01 1.2379e-01 9.2979e-02 4.6963e-02 2.0814e-02 1.4399e-02 9.7301e-02 +6.1000e-01 7.8220e+06 5.5315e+02 2.1330e+03 1.1906e-07 3.2076e-01 6.7924e-01 3.5581e+03 1.7937e+03 4.3168e+02 7.1947e+01 5.5268e-05 1.7077e-05 3.8252e-03 7.7622e-04 1.7741e-01 5.5748e-02 5.5323e-02 3.6806e-02 2.1402e-02 1.9546e-02 6.2916e-01 9.8079e-03 3.3472e-03 5.9048e-01 1.2379e-01 9.2986e-02 4.6973e-02 2.0822e-02 1.4406e-02 9.7389e-02 +6.1200e-01 7.7824e+06 5.5315e+02 2.1229e+03 1.1988e-07 3.2006e-01 6.7994e-01 3.5544e+03 1.7846e+03 4.3204e+02 7.1609e+01 5.5321e-05 1.7061e-05 3.8074e-03 7.7167e-04 1.7648e-01 5.5509e-02 5.5126e-02 3.6702e-02 2.1358e-02 1.9520e-02 6.3073e-01 9.8069e-03 3.3463e-03 5.9037e-01 1.2378e-01 9.2993e-02 4.6983e-02 2.0829e-02 1.4413e-02 9.7480e-02 +6.1400e-01 7.7428e+06 5.5315e+02 2.1128e+03 1.2072e-07 3.1936e-01 6.8064e-01 3.5507e+03 1.7755e+03 4.3240e+02 7.1272e+01 5.5373e-05 1.7046e-05 3.7895e-03 7.6711e-04 1.7554e-01 5.5270e-02 5.4928e-02 3.6597e-02 2.1312e-02 1.9493e-02 6.3230e-01 9.8059e-03 3.3453e-03 5.9025e-01 1.2378e-01 9.3000e-02 4.6992e-02 2.0836e-02 1.4421e-02 9.7574e-02 +6.1600e-01 7.7032e+06 5.5315e+02 2.1027e+03 1.2157e-07 3.1865e-01 6.8135e-01 3.5470e+03 1.7664e+03 4.3276e+02 7.0935e+01 5.5425e-05 1.7030e-05 3.7716e-03 7.6257e-04 1.7461e-01 5.5030e-02 5.4730e-02 3.6492e-02 2.1267e-02 1.9466e-02 6.3388e-01 9.8048e-03 3.3444e-03 5.9013e-01 1.2377e-01 9.3006e-02 4.7002e-02 2.0844e-02 1.4428e-02 9.7671e-02 +6.1800e-01 7.6636e+06 5.5315e+02 2.0926e+03 1.2243e-07 3.1793e-01 6.8207e-01 3.5433e+03 1.7572e+03 4.3312e+02 7.0598e+01 5.5477e-05 1.7014e-05 3.7537e-03 7.5802e-04 1.7367e-01 5.4790e-02 5.4531e-02 3.6386e-02 2.1221e-02 1.9438e-02 6.3545e-01 9.8037e-03 3.3435e-03 5.9001e-01 1.2376e-01 9.3012e-02 4.7012e-02 2.0851e-02 1.4435e-02 9.7770e-02 +6.2000e-01 7.6240e+06 5.5315e+02 2.0824e+03 1.2330e-07 3.1719e-01 6.8281e-01 3.5396e+03 1.7481e+03 4.3348e+02 7.0262e+01 5.5529e-05 1.6998e-05 3.7357e-03 7.5349e-04 1.7274e-01 5.4549e-02 5.4330e-02 3.6279e-02 2.1174e-02 1.9410e-02 6.3703e-01 9.8026e-03 3.3425e-03 5.8989e-01 1.2376e-01 9.3018e-02 4.7021e-02 2.0858e-02 1.4443e-02 9.7873e-02 +6.2200e-01 7.5844e+06 5.5315e+02 2.0722e+03 1.2419e-07 3.1645e-01 6.8355e-01 3.5359e+03 1.7390e+03 4.3383e+02 6.9927e+01 5.5580e-05 1.6983e-05 3.7178e-03 7.4896e-04 1.7180e-01 5.4308e-02 5.4129e-02 3.6171e-02 2.1127e-02 1.9382e-02 6.3861e-01 9.8015e-03 3.3415e-03 5.8976e-01 1.2375e-01 9.3024e-02 4.7031e-02 2.0866e-02 1.4450e-02 9.7978e-02 +6.2400e-01 7.5448e+06 5.5315e+02 2.0620e+03 1.2508e-07 3.1570e-01 6.8430e-01 3.5321e+03 1.7299e+03 4.3419e+02 6.9591e+01 5.5632e-05 1.6967e-05 3.6998e-03 7.4443e-04 1.7087e-01 5.4066e-02 5.3928e-02 3.6063e-02 2.1079e-02 1.9353e-02 6.4020e-01 9.8003e-03 3.3406e-03 5.8963e-01 1.2374e-01 9.3029e-02 4.7040e-02 2.0873e-02 1.4458e-02 9.8086e-02 +6.2600e-01 7.5052e+06 5.5315e+02 2.0518e+03 1.2599e-07 3.1494e-01 6.8506e-01 3.5284e+03 1.7208e+03 4.3455e+02 6.9257e+01 5.5684e-05 1.6951e-05 3.6818e-03 7.3992e-04 1.6993e-01 5.3823e-02 5.3725e-02 3.5953e-02 2.1031e-02 1.9324e-02 6.4179e-01 9.7990e-03 3.3396e-03 5.8950e-01 1.2373e-01 9.3035e-02 4.7049e-02 2.0880e-02 1.4465e-02 9.8196e-02 +6.2800e-01 7.4656e+06 5.5315e+02 2.0416e+03 1.2691e-07 3.1417e-01 6.8583e-01 3.5247e+03 1.7116e+03 4.3490e+02 6.8922e+01 5.5735e-05 1.6936e-05 3.6637e-03 7.3540e-04 1.6900e-01 5.3580e-02 5.3521e-02 3.5844e-02 2.0983e-02 1.9294e-02 6.4338e-01 9.7978e-03 3.3386e-03 5.8937e-01 1.2372e-01 9.3040e-02 4.7059e-02 2.0888e-02 1.4473e-02 9.8310e-02 +6.3000e-01 7.4260e+06 5.5315e+02 2.0313e+03 1.2783e-07 3.1339e-01 6.8661e-01 3.5210e+03 1.7025e+03 4.3526e+02 6.8589e+01 5.5786e-05 1.6920e-05 3.6457e-03 7.3089e-04 1.6806e-01 5.3337e-02 5.3317e-02 3.5733e-02 2.0934e-02 1.9263e-02 6.4498e-01 9.7965e-03 3.3375e-03 5.8924e-01 1.2371e-01 9.3044e-02 4.7068e-02 2.0895e-02 1.4481e-02 9.8427e-02 +6.3200e-01 7.3864e+06 5.5315e+02 2.0210e+03 1.2878e-07 3.1260e-01 6.8740e-01 3.5173e+03 1.6934e+03 4.3562e+02 6.8255e+01 5.5838e-05 1.6905e-05 3.6276e-03 7.2639e-04 1.6713e-01 5.3093e-02 5.3112e-02 3.5622e-02 2.0884e-02 1.9233e-02 6.4657e-01 9.7951e-03 3.3365e-03 5.8910e-01 1.2370e-01 9.3049e-02 4.7077e-02 2.0902e-02 1.4488e-02 9.8547e-02 +6.3400e-01 7.3468e+06 5.5315e+02 2.0107e+03 1.2973e-07 3.1180e-01 6.8820e-01 3.5136e+03 1.6843e+03 4.3597e+02 6.7922e+01 5.5889e-05 1.6889e-05 3.6095e-03 7.2190e-04 1.6619e-01 5.2848e-02 5.2906e-02 3.5510e-02 2.0834e-02 1.9201e-02 6.4817e-01 9.7938e-03 3.3355e-03 5.8896e-01 1.2369e-01 9.3053e-02 4.7086e-02 2.0910e-02 1.4496e-02 9.8670e-02 +6.3600e-01 7.3072e+06 5.5315e+02 2.0003e+03 1.3070e-07 3.1099e-01 6.8901e-01 3.5099e+03 1.6752e+03 4.3633e+02 6.7590e+01 5.5940e-05 1.6874e-05 3.5913e-03 7.1740e-04 1.6526e-01 5.2603e-02 5.2699e-02 3.5397e-02 2.0784e-02 1.9170e-02 6.4978e-01 9.7924e-03 3.3344e-03 5.8882e-01 1.2368e-01 9.3057e-02 4.7095e-02 2.0917e-02 1.4504e-02 9.8796e-02 +6.3800e-01 7.2676e+06 5.5315e+02 1.9900e+03 1.3168e-07 3.1017e-01 6.8983e-01 3.5062e+03 1.6660e+03 4.3668e+02 6.7258e+01 5.5991e-05 1.6858e-05 3.5732e-03 7.1292e-04 1.6432e-01 5.2358e-02 5.2491e-02 3.5284e-02 2.0733e-02 1.9138e-02 6.5139e-01 9.7909e-03 3.3333e-03 5.8868e-01 1.2367e-01 9.3061e-02 4.7104e-02 2.0924e-02 1.4512e-02 9.8925e-02 +6.4000e-01 7.2280e+06 5.5315e+02 1.9796e+03 1.3267e-07 3.0934e-01 6.9066e-01 3.5025e+03 1.6569e+03 4.3704e+02 6.6926e+01 5.6041e-05 1.6843e-05 3.5550e-03 7.0844e-04 1.6339e-01 5.2111e-02 5.2282e-02 3.5169e-02 2.0681e-02 1.9105e-02 6.5300e-01 9.7894e-03 3.3322e-03 5.8853e-01 1.2366e-01 9.3064e-02 4.7112e-02 2.0932e-02 1.4519e-02 9.9057e-02 +6.4200e-01 7.1884e+06 5.5315e+02 1.9692e+03 1.3368e-07 3.0849e-01 6.9151e-01 3.4988e+03 1.6478e+03 4.3739e+02 6.6594e+01 5.6092e-05 1.6828e-05 3.5368e-03 7.0396e-04 1.6246e-01 5.1865e-02 5.2073e-02 3.5054e-02 2.0629e-02 1.9072e-02 6.5461e-01 9.7879e-03 3.3311e-03 5.8839e-01 1.2365e-01 9.3067e-02 4.7121e-02 2.0939e-02 1.4527e-02 9.9193e-02 +6.4400e-01 7.1488e+06 5.5315e+02 1.9587e+03 1.3470e-07 3.0764e-01 6.9236e-01 3.4951e+03 1.6387e+03 4.3775e+02 6.6264e+01 5.6143e-05 1.6812e-05 3.5186e-03 6.9950e-04 1.6152e-01 5.1617e-02 5.1863e-02 3.4939e-02 2.0577e-02 1.9038e-02 6.5623e-01 9.7864e-03 3.3300e-03 5.8824e-01 1.2364e-01 9.3070e-02 4.7129e-02 2.0946e-02 1.4535e-02 9.9332e-02 +6.4600e-01 7.1092e+06 5.5315e+02 1.9483e+03 1.3573e-07 3.0677e-01 6.9323e-01 3.4914e+03 1.6296e+03 4.3810e+02 6.5933e+01 5.6193e-05 1.6797e-05 3.5003e-03 6.9503e-04 1.6059e-01 5.1370e-02 5.1651e-02 3.4822e-02 2.0524e-02 1.9004e-02 6.5785e-01 9.7848e-03 3.3289e-03 5.8808e-01 1.2362e-01 9.3072e-02 4.7138e-02 2.0954e-02 1.4543e-02 9.9474e-02 +6.4800e-01 7.0696e+06 5.5315e+02 1.9378e+03 1.3678e-07 3.0590e-01 6.9410e-01 3.4877e+03 1.6204e+03 4.3845e+02 6.5603e+01 5.6244e-05 1.6781e-05 3.4820e-03 6.9057e-04 1.5965e-01 5.1121e-02 5.1439e-02 3.4705e-02 2.0470e-02 1.8969e-02 6.5947e-01 9.7831e-03 3.3278e-03 5.8793e-01 1.2361e-01 9.3075e-02 4.7146e-02 2.0961e-02 1.4551e-02 9.9620e-02 +6.5000e-01 7.0300e+06 5.5315e+02 1.9273e+03 1.3784e-07 3.0501e-01 6.9499e-01 3.4840e+03 1.6113e+03 4.3881e+02 6.5273e+01 5.6294e-05 1.6766e-05 3.4637e-03 6.8612e-04 1.5872e-01 5.0872e-02 5.1226e-02 3.4587e-02 2.0416e-02 1.8934e-02 6.6110e-01 9.7814e-03 3.3266e-03 5.8777e-01 1.2360e-01 9.3077e-02 4.7154e-02 2.0968e-02 1.4559e-02 9.9769e-02 +6.5200e-01 6.9904e+06 5.5315e+02 1.9168e+03 1.3892e-07 3.0410e-01 6.9590e-01 3.4803e+03 1.6022e+03 4.3916e+02 6.4944e+01 5.6344e-05 1.6751e-05 3.4454e-03 6.8167e-04 1.5778e-01 5.0623e-02 5.1012e-02 3.4468e-02 2.0362e-02 1.8899e-02 6.6273e-01 9.7797e-03 3.3254e-03 5.8761e-01 1.2358e-01 9.3078e-02 4.7163e-02 2.0976e-02 1.4567e-02 9.9921e-02 +6.5400e-01 6.9508e+06 5.5315e+02 1.9062e+03 1.4002e-07 3.0319e-01 6.9681e-01 3.4766e+03 1.5931e+03 4.3951e+02 6.4615e+01 5.6394e-05 1.6735e-05 3.4271e-03 6.7723e-04 1.5685e-01 5.0373e-02 5.0798e-02 3.4349e-02 2.0307e-02 1.8862e-02 6.6436e-01 9.7780e-03 3.3243e-03 5.8745e-01 1.2357e-01 9.3079e-02 4.7171e-02 2.0983e-02 1.4575e-02 1.0008e-01 +6.5600e-01 6.9112e+06 5.5315e+02 1.8956e+03 1.4112e-07 3.0226e-01 6.9774e-01 3.4729e+03 1.5840e+03 4.3986e+02 6.4287e+01 5.6444e-05 1.6720e-05 3.4087e-03 6.7279e-04 1.5591e-01 5.0122e-02 5.0582e-02 3.4228e-02 2.0251e-02 1.8826e-02 6.6599e-01 9.7762e-03 3.3231e-03 5.8728e-01 1.2355e-01 9.3080e-02 4.7179e-02 2.0990e-02 1.4583e-02 1.0024e-01 +6.5800e-01 6.8716e+06 5.5315e+02 1.8850e+03 1.4225e-07 3.0133e-01 6.9867e-01 3.4692e+03 1.5749e+03 4.4021e+02 6.3959e+01 5.6494e-05 1.6705e-05 3.3903e-03 6.6836e-04 1.5498e-01 4.9871e-02 5.0366e-02 3.4107e-02 2.0195e-02 1.8788e-02 6.6763e-01 9.7743e-03 3.3218e-03 5.8711e-01 1.2353e-01 9.3081e-02 4.7186e-02 2.0997e-02 1.4591e-02 1.0040e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.8744e+03 1.4339e-07 3.0037e-01 6.9963e-01 3.4655e+03 1.5657e+03 4.4057e+02 6.3631e+01 5.6544e-05 1.6690e-05 3.3719e-03 6.6393e-04 1.5405e-01 4.9619e-02 5.0148e-02 3.3986e-02 2.0138e-02 1.8751e-02 6.6928e-01 9.7724e-03 3.3206e-03 5.8694e-01 1.2352e-01 9.3081e-02 4.7194e-02 2.1005e-02 1.4599e-02 1.0057e-01 +6.6200e-01 6.7924e+06 5.5315e+02 1.8637e+03 1.4454e-07 2.9941e-01 7.0059e-01 3.4618e+03 1.5566e+03 4.4092e+02 6.3304e+01 5.6593e-05 1.6674e-05 3.3534e-03 6.5951e-04 1.5311e-01 4.9367e-02 4.9930e-02 3.3863e-02 2.0081e-02 1.8712e-02 6.7092e-01 9.7705e-03 3.3194e-03 5.8677e-01 1.2350e-01 9.3081e-02 4.7202e-02 2.1012e-02 1.4607e-02 1.0074e-01 +6.6400e-01 6.7528e+06 5.5315e+02 1.8530e+03 1.4572e-07 2.9843e-01 7.0157e-01 3.4581e+03 1.5475e+03 4.4127e+02 6.2977e+01 5.6643e-05 1.6659e-05 3.3349e-03 6.5510e-04 1.5218e-01 4.9114e-02 4.9711e-02 3.3740e-02 2.0023e-02 1.8674e-02 6.7257e-01 9.7685e-03 3.3181e-03 5.8659e-01 1.2348e-01 9.3081e-02 4.7209e-02 2.1019e-02 1.4615e-02 1.0091e-01 +6.6600e-01 6.7132e+06 5.5315e+02 1.8423e+03 1.4691e-07 2.9744e-01 7.0256e-01 3.4544e+03 1.5384e+03 4.4162e+02 6.2650e+01 5.6692e-05 1.6644e-05 3.3164e-03 6.5069e-04 1.5124e-01 4.8861e-02 4.9490e-02 3.3615e-02 1.9965e-02 1.8634e-02 6.7423e-01 9.7665e-03 3.3168e-03 5.8642e-01 1.2347e-01 9.3080e-02 4.7216e-02 2.1026e-02 1.4623e-02 1.0109e-01 +6.6800e-01 6.6736e+06 5.5315e+02 1.8316e+03 1.4811e-07 2.9644e-01 7.0356e-01 3.4507e+03 1.5293e+03 4.4197e+02 6.2324e+01 5.6742e-05 1.6629e-05 3.2979e-03 6.4628e-04 1.5031e-01 4.8607e-02 4.9269e-02 3.3490e-02 1.9906e-02 1.8594e-02 6.7588e-01 9.7644e-03 3.3156e-03 5.8623e-01 1.2345e-01 9.3079e-02 4.7223e-02 2.1033e-02 1.4632e-02 1.0127e-01 +6.7000e-01 6.6340e+06 5.5315e+02 1.8209e+03 1.4934e-07 2.9542e-01 7.0458e-01 3.4470e+03 1.5202e+03 4.4232e+02 6.1998e+01 5.6791e-05 1.6614e-05 3.2794e-03 6.4188e-04 1.4937e-01 4.8352e-02 4.9048e-02 3.3365e-02 1.9847e-02 1.8554e-02 6.7754e-01 9.7623e-03 3.3142e-03 5.8605e-01 1.2343e-01 9.3078e-02 4.7230e-02 2.1040e-02 1.4640e-02 1.0146e-01 +6.7200e-01 6.5944e+06 5.5315e+02 1.8101e+03 1.5058e-07 2.9439e-01 7.0561e-01 3.4433e+03 1.5111e+03 4.4267e+02 6.1673e+01 5.6840e-05 1.6598e-05 3.2608e-03 6.3749e-04 1.4844e-01 4.8097e-02 4.8825e-02 3.3238e-02 1.9787e-02 1.8513e-02 6.7920e-01 9.7602e-03 3.3129e-03 5.8586e-01 1.2341e-01 9.3076e-02 4.7237e-02 2.1047e-02 1.4648e-02 1.0165e-01 +6.7400e-01 6.5548e+06 5.5315e+02 1.7993e+03 1.5184e-07 2.9334e-01 7.0666e-01 3.4396e+03 1.5019e+03 4.4302e+02 6.1348e+01 5.6889e-05 1.6583e-05 3.2422e-03 6.3310e-04 1.4750e-01 4.7842e-02 4.8601e-02 3.3111e-02 1.9727e-02 1.8471e-02 6.8087e-01 9.7580e-03 3.3116e-03 5.8567e-01 1.2339e-01 9.3073e-02 4.7244e-02 2.1054e-02 1.4656e-02 1.0184e-01 +6.7600e-01 6.5152e+06 5.5315e+02 1.7884e+03 1.5312e-07 2.9228e-01 7.0772e-01 3.4359e+03 1.4928e+03 4.4337e+02 6.1024e+01 5.6938e-05 1.6568e-05 3.2236e-03 6.2871e-04 1.4657e-01 4.7585e-02 4.8376e-02 3.2982e-02 1.9666e-02 1.8429e-02 6.8254e-01 9.7557e-03 3.3102e-03 5.8548e-01 1.2337e-01 9.3071e-02 4.7251e-02 2.1062e-02 1.4664e-02 1.0204e-01 +6.7800e-01 6.4756e+06 5.5315e+02 1.7776e+03 1.5442e-07 2.9120e-01 7.0880e-01 3.4322e+03 1.4837e+03 4.4372e+02 6.0699e+01 5.6986e-05 1.6553e-05 3.2049e-03 6.2433e-04 1.4563e-01 4.7329e-02 4.8151e-02 3.2853e-02 1.9604e-02 1.8386e-02 6.8421e-01 9.7534e-03 3.3089e-03 5.8528e-01 1.2335e-01 9.3068e-02 4.7257e-02 2.1069e-02 1.4673e-02 1.0224e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.7667e+03 1.5574e-07 2.9011e-01 7.0989e-01 3.4286e+03 1.4746e+03 4.4406e+02 6.0375e+01 5.7035e-05 1.6538e-05 3.1863e-03 6.1996e-04 1.4470e-01 4.7071e-02 4.7924e-02 3.2724e-02 1.9542e-02 1.8343e-02 6.8589e-01 9.7511e-03 3.3075e-03 5.8508e-01 1.2332e-01 9.3064e-02 4.7263e-02 2.1075e-02 1.4681e-02 1.0245e-01 +6.8200e-01 6.3964e+06 5.5315e+02 1.7558e+03 1.5707e-07 2.8900e-01 7.1100e-01 3.4249e+03 1.4655e+03 4.4441e+02 6.0052e+01 5.7084e-05 1.6522e-05 3.1676e-03 6.1559e-04 1.4377e-01 4.6813e-02 4.7697e-02 3.2593e-02 1.9479e-02 1.8299e-02 6.8757e-01 9.7487e-03 3.3061e-03 5.8488e-01 1.2330e-01 9.3061e-02 4.7270e-02 2.1082e-02 1.4689e-02 1.0266e-01 +6.8400e-01 6.3568e+06 5.5315e+02 1.7449e+03 1.5843e-07 2.8788e-01 7.1212e-01 3.4212e+03 1.4564e+03 4.4476e+02 5.9729e+01 5.7132e-05 1.6507e-05 3.1488e-03 6.1123e-04 1.4283e-01 4.6555e-02 4.7469e-02 3.2462e-02 1.9416e-02 1.8255e-02 6.8925e-01 9.7462e-03 3.3046e-03 5.8468e-01 1.2328e-01 9.3056e-02 4.7276e-02 2.1089e-02 1.4698e-02 1.0288e-01 +6.8600e-01 6.3172e+06 5.5315e+02 1.7339e+03 1.5981e-07 2.8674e-01 7.1326e-01 3.4175e+03 1.4473e+03 4.4511e+02 5.9406e+01 5.7180e-05 1.6492e-05 3.1301e-03 6.0687e-04 1.4190e-01 4.6296e-02 4.7239e-02 3.2329e-02 1.9352e-02 1.8210e-02 6.9094e-01 9.7437e-03 3.3032e-03 5.8447e-01 1.2325e-01 9.3052e-02 4.7281e-02 2.1096e-02 1.4706e-02 1.0310e-01 +6.8800e-01 6.2776e+06 5.5315e+02 1.7229e+03 1.6121e-07 2.8559e-01 7.1441e-01 3.4138e+03 1.4382e+03 4.4545e+02 5.9084e+01 5.7228e-05 1.6477e-05 3.1113e-03 6.0251e-04 1.4096e-01 4.6036e-02 4.7009e-02 3.2196e-02 1.9287e-02 1.8164e-02 6.9263e-01 9.7411e-03 3.3017e-03 5.8426e-01 1.2323e-01 9.3046e-02 4.7287e-02 2.1103e-02 1.4714e-02 1.0332e-01 +6.9000e-01 6.2380e+06 5.5315e+02 1.7119e+03 1.6263e-07 2.8441e-01 7.1559e-01 3.4101e+03 1.4290e+03 4.4580e+02 5.8762e+01 5.7277e-05 1.6462e-05 3.0925e-03 5.9816e-04 1.4003e-01 4.5776e-02 4.6778e-02 3.2062e-02 1.9222e-02 1.8118e-02 6.9433e-01 9.7385e-03 3.3003e-03 5.8404e-01 1.2320e-01 9.3041e-02 4.7292e-02 2.1110e-02 1.4723e-02 1.0355e-01 +6.9200e-01 6.1984e+06 5.5315e+02 1.7009e+03 1.6408e-07 2.8323e-01 7.1677e-01 3.4064e+03 1.4199e+03 4.4615e+02 5.8440e+01 5.7324e-05 1.6446e-05 3.0737e-03 5.9382e-04 1.3909e-01 4.5515e-02 4.6546e-02 3.1927e-02 1.9157e-02 1.8071e-02 6.9602e-01 9.7359e-03 3.2988e-03 5.8382e-01 1.2318e-01 9.3035e-02 4.7298e-02 2.1116e-02 1.4731e-02 1.0378e-01 +6.9400e-01 6.1588e+06 5.5315e+02 1.6898e+03 1.6554e-07 2.8202e-01 7.1798e-01 3.4028e+03 1.4108e+03 4.4650e+02 5.8119e+01 5.7372e-05 1.6431e-05 3.0549e-03 5.8948e-04 1.3816e-01 4.5254e-02 4.6313e-02 3.1792e-02 1.9090e-02 1.8024e-02 6.9773e-01 9.7331e-03 3.2973e-03 5.8360e-01 1.2315e-01 9.3028e-02 4.7303e-02 2.1123e-02 1.4739e-02 1.0402e-01 +6.9600e-01 6.1192e+06 5.5315e+02 1.6787e+03 1.6703e-07 2.8080e-01 7.1920e-01 3.3991e+03 1.4017e+03 4.4684e+02 5.7798e+01 5.7420e-05 1.6416e-05 3.0360e-03 5.8515e-04 1.3722e-01 4.4992e-02 4.6079e-02 3.1655e-02 1.9024e-02 1.7976e-02 6.9943e-01 9.7304e-03 3.2957e-03 5.8338e-01 1.2312e-01 9.3021e-02 4.7308e-02 2.1130e-02 1.4748e-02 1.0427e-01 +6.9800e-01 6.0796e+06 5.5315e+02 1.6676e+03 1.6855e-07 2.7955e-01 7.2045e-01 3.3954e+03 1.3926e+03 4.4719e+02 5.7477e+01 5.7468e-05 1.6401e-05 3.0171e-03 5.8082e-04 1.3629e-01 4.4730e-02 4.5844e-02 3.1518e-02 1.8956e-02 1.7927e-02 7.0114e-01 9.7275e-03 3.2942e-03 5.8315e-01 1.2310e-01 9.3014e-02 4.7312e-02 2.1136e-02 1.4756e-02 1.0452e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6564e+03 1.7008e-07 2.7830e-01 7.2170e-01 3.3917e+03 1.3835e+03 4.4753e+02 5.7157e+01 5.7515e-05 1.6386e-05 2.9982e-03 5.7649e-04 1.3535e-01 4.4467e-02 4.5609e-02 3.1380e-02 1.8888e-02 1.7878e-02 7.0285e-01 9.7246e-03 3.2926e-03 5.8291e-01 1.2307e-01 9.3006e-02 4.7317e-02 2.1143e-02 1.4765e-02 1.0477e-01 +7.0200e-01 6.0004e+06 5.5315e+02 1.6453e+03 1.7165e-07 2.7702e-01 7.2298e-01 3.3880e+03 1.3744e+03 4.4788e+02 5.6837e+01 5.7562e-05 1.6370e-05 2.9792e-03 5.7218e-04 1.3442e-01 4.4203e-02 4.5372e-02 3.1241e-02 1.8819e-02 1.7828e-02 7.0457e-01 9.7217e-03 3.2910e-03 5.8268e-01 1.2304e-01 9.2998e-02 4.7321e-02 2.1149e-02 1.4773e-02 1.0503e-01 +7.0400e-01 5.9608e+06 5.5315e+02 1.6341e+03 1.7323e-07 2.7572e-01 7.2428e-01 3.3843e+03 1.3653e+03 4.4822e+02 5.6518e+01 5.7610e-05 1.6355e-05 2.9603e-03 5.6786e-04 1.3348e-01 4.3939e-02 4.5134e-02 3.1101e-02 1.8750e-02 1.7777e-02 7.0629e-01 9.7187e-03 3.2894e-03 5.8244e-01 1.2301e-01 9.2989e-02 4.7325e-02 2.1156e-02 1.4781e-02 1.0529e-01 +7.0600e-01 5.9212e+06 5.5315e+02 1.6229e+03 1.7485e-07 2.7440e-01 7.2560e-01 3.3807e+03 1.3562e+03 4.4857e+02 5.6198e+01 5.7657e-05 1.6340e-05 2.9413e-03 5.6355e-04 1.3255e-01 4.3674e-02 4.4895e-02 3.0960e-02 1.8680e-02 1.7726e-02 7.0801e-01 9.7156e-03 3.2878e-03 5.8220e-01 1.2298e-01 9.2979e-02 4.7329e-02 2.1162e-02 1.4790e-02 1.0556e-01 +7.0800e-01 5.8816e+06 5.5315e+02 1.6116e+03 1.7649e-07 2.7307e-01 7.2693e-01 3.3770e+03 1.3471e+03 4.4891e+02 5.5879e+01 5.7704e-05 1.6325e-05 2.9223e-03 5.5925e-04 1.3161e-01 4.3409e-02 4.4656e-02 3.0818e-02 1.8610e-02 1.7674e-02 7.0974e-01 9.7124e-03 3.2861e-03 5.8195e-01 1.2295e-01 9.2969e-02 4.7333e-02 2.1168e-02 1.4798e-02 1.0584e-01 +7.1000e-01 5.8420e+06 5.5315e+02 1.6003e+03 1.7815e-07 2.7171e-01 7.2829e-01 3.3733e+03 1.3380e+03 4.4926e+02 5.5561e+01 5.7750e-05 1.6309e-05 2.9032e-03 5.5495e-04 1.3068e-01 4.3143e-02 4.4415e-02 3.0676e-02 1.8539e-02 1.7622e-02 7.1147e-01 9.7092e-03 3.2844e-03 5.8170e-01 1.2291e-01 9.2959e-02 4.7336e-02 2.1175e-02 1.4807e-02 1.0612e-01 +7.1200e-01 5.8024e+06 5.5315e+02 1.5890e+03 1.7985e-07 2.7033e-01 7.2967e-01 3.3696e+03 1.3289e+03 4.4960e+02 5.5243e+01 5.7797e-05 1.6294e-05 2.8841e-03 5.5066e-04 1.2974e-01 4.2876e-02 4.4174e-02 3.0533e-02 1.8467e-02 1.7569e-02 7.1320e-01 9.7060e-03 3.2827e-03 5.8144e-01 1.2288e-01 9.2947e-02 4.7339e-02 2.1181e-02 1.4815e-02 1.0640e-01 +7.1400e-01 5.7628e+06 5.5315e+02 1.5777e+03 1.8157e-07 2.6893e-01 7.3107e-01 3.3659e+03 1.3198e+03 4.4995e+02 5.4925e+01 5.7844e-05 1.6279e-05 2.8650e-03 5.4637e-04 1.2881e-01 4.2609e-02 4.3931e-02 3.0388e-02 1.8395e-02 1.7515e-02 7.1494e-01 9.7026e-03 3.2810e-03 5.8119e-01 1.2285e-01 9.2936e-02 4.7342e-02 2.1187e-02 1.4823e-02 1.0670e-01 +7.1600e-01 5.7232e+06 5.5315e+02 1.5663e+03 1.8332e-07 2.6752e-01 7.3248e-01 3.3623e+03 1.3107e+03 4.5029e+02 5.4607e+01 5.7890e-05 1.6263e-05 2.8459e-03 5.4208e-04 1.2787e-01 4.2342e-02 4.3688e-02 3.0243e-02 1.8322e-02 1.7460e-02 7.1669e-01 9.6992e-03 3.2793e-03 5.8092e-01 1.2281e-01 9.2923e-02 4.7345e-02 2.1193e-02 1.4832e-02 1.0699e-01 +7.1800e-01 5.6836e+06 5.5315e+02 1.5550e+03 1.8510e-07 2.6607e-01 7.3393e-01 3.3586e+03 1.3016e+03 4.5063e+02 5.4290e+01 5.7937e-05 1.6248e-05 2.8268e-03 5.3780e-04 1.2694e-01 4.2073e-02 4.3443e-02 3.0097e-02 1.8248e-02 1.7405e-02 7.1843e-01 9.6958e-03 3.2775e-03 5.8066e-01 1.2277e-01 9.2911e-02 4.7347e-02 2.1199e-02 1.4840e-02 1.0730e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5435e+03 1.8691e-07 2.6461e-01 7.3539e-01 3.3549e+03 1.2924e+03 4.5098e+02 5.3973e+01 5.7983e-05 1.6233e-05 2.8076e-03 5.3353e-04 1.2600e-01 4.1804e-02 4.3198e-02 2.9950e-02 1.8174e-02 1.7349e-02 7.2018e-01 9.6922e-03 3.2757e-03 5.8039e-01 1.2274e-01 9.2897e-02 4.7349e-02 2.1205e-02 1.4849e-02 1.0761e-01 +7.2200e-01 5.6044e+06 5.5315e+02 1.5321e+03 1.8875e-07 2.6312e-01 7.3688e-01 3.3512e+03 1.2833e+03 4.5132e+02 5.3657e+01 5.8029e-05 1.6217e-05 2.7884e-03 5.2926e-04 1.2507e-01 4.1535e-02 4.2951e-02 2.9802e-02 1.8099e-02 1.7293e-02 7.2194e-01 9.6886e-03 3.2739e-03 5.8011e-01 1.2270e-01 9.2883e-02 4.7351e-02 2.1211e-02 1.4857e-02 1.0792e-01 +7.2400e-01 5.5648e+06 5.5315e+02 1.5206e+03 1.9062e-07 2.6161e-01 7.3839e-01 3.3476e+03 1.2742e+03 4.5166e+02 5.3341e+01 5.8075e-05 1.6202e-05 2.7692e-03 5.2500e-04 1.2413e-01 4.1265e-02 4.2704e-02 2.9654e-02 1.8023e-02 1.7236e-02 7.2369e-01 9.6849e-03 3.2721e-03 5.7983e-01 1.2266e-01 9.2868e-02 4.7353e-02 2.1216e-02 1.4865e-02 1.0825e-01 +7.2600e-01 5.5252e+06 5.5315e+02 1.5091e+03 1.9253e-07 2.6008e-01 7.3992e-01 3.3439e+03 1.2651e+03 4.5200e+02 5.3025e+01 5.8121e-05 1.6186e-05 2.7499e-03 5.2074e-04 1.2320e-01 4.0994e-02 4.2455e-02 2.9504e-02 1.7947e-02 1.7178e-02 7.2545e-01 9.6812e-03 3.2702e-03 5.7955e-01 1.2262e-01 9.2853e-02 4.7354e-02 2.1222e-02 1.4874e-02 1.0858e-01 +7.2800e-01 5.4856e+06 5.5315e+02 1.4976e+03 1.9447e-07 2.5852e-01 7.4148e-01 3.3402e+03 1.2560e+03 4.5235e+02 5.2709e+01 5.8166e-05 1.6171e-05 2.7307e-03 5.1648e-04 1.2226e-01 4.0723e-02 4.2206e-02 2.9353e-02 1.7870e-02 1.7119e-02 7.2722e-01 9.6773e-03 3.2683e-03 5.7926e-01 1.2258e-01 9.2837e-02 4.7355e-02 2.1227e-02 1.4882e-02 1.0891e-01 +7.3000e-01 5.4460e+06 5.5315e+02 1.4861e+03 1.9644e-07 2.5694e-01 7.4306e-01 3.3366e+03 1.2469e+03 4.5269e+02 5.2394e+01 5.8212e-05 1.6155e-05 2.7114e-03 5.1223e-04 1.2133e-01 4.0451e-02 4.1956e-02 2.9202e-02 1.7792e-02 1.7060e-02 7.2899e-01 9.6734e-03 3.2664e-03 5.7897e-01 1.2254e-01 9.2820e-02 4.7356e-02 2.1233e-02 1.4890e-02 1.0925e-01 +7.3200e-01 5.4064e+06 5.5315e+02 1.4745e+03 1.9845e-07 2.5533e-01 7.4467e-01 3.3329e+03 1.2378e+03 4.5303e+02 5.2079e+01 5.8258e-05 1.6140e-05 2.6921e-03 5.0798e-04 1.2039e-01 4.0179e-02 4.1704e-02 2.9049e-02 1.7714e-02 1.7000e-02 7.3076e-01 9.6694e-03 3.2645e-03 5.7867e-01 1.2250e-01 9.2803e-02 4.7356e-02 2.1238e-02 1.4898e-02 1.0960e-01 +7.3400e-01 5.3668e+06 5.5315e+02 1.4629e+03 2.0049e-07 2.5369e-01 7.4631e-01 3.3292e+03 1.2288e+03 4.5337e+02 5.1765e+01 5.8303e-05 1.6124e-05 2.6727e-03 5.0374e-04 1.1946e-01 3.9906e-02 4.1452e-02 2.8896e-02 1.7635e-02 1.6939e-02 7.3254e-01 9.6654e-03 3.2625e-03 5.7837e-01 1.2245e-01 9.2784e-02 4.7357e-02 2.1243e-02 1.4907e-02 1.0996e-01 +7.3600e-01 5.3272e+06 5.5315e+02 1.4513e+03 2.0257e-07 2.5203e-01 7.4797e-01 3.3255e+03 1.2197e+03 4.5371e+02 5.1451e+01 5.8348e-05 1.6108e-05 2.6533e-03 4.9951e-04 1.1852e-01 3.9632e-02 4.1198e-02 2.8742e-02 1.7555e-02 1.6877e-02 7.3432e-01 9.6612e-03 3.2605e-03 5.7806e-01 1.2241e-01 9.2766e-02 4.7356e-02 2.1248e-02 1.4915e-02 1.1032e-01 +7.3800e-01 5.2876e+06 5.5315e+02 1.4396e+03 2.0469e-07 2.5034e-01 7.4966e-01 3.3219e+03 1.2106e+03 4.5406e+02 5.1137e+01 5.8393e-05 1.6093e-05 2.6339e-03 4.9528e-04 1.1758e-01 3.9358e-02 4.0944e-02 2.8587e-02 1.7475e-02 1.6815e-02 7.3611e-01 9.6570e-03 3.2585e-03 5.7775e-01 1.2237e-01 9.2746e-02 4.7356e-02 2.1253e-02 1.4923e-02 1.1069e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4279e+03 2.0685e-07 2.4862e-01 7.5138e-01 3.3182e+03 1.2015e+03 4.5440e+02 5.0823e+01 5.8438e-05 1.6077e-05 2.6145e-03 4.9105e-04 1.1665e-01 3.9083e-02 4.0689e-02 2.8430e-02 1.7394e-02 1.6752e-02 7.3790e-01 9.6527e-03 3.2564e-03 5.7743e-01 1.2232e-01 9.2726e-02 4.7355e-02 2.1258e-02 1.4931e-02 1.1107e-01 +7.4200e-01 5.2084e+06 5.5315e+02 1.4162e+03 2.0904e-07 2.4688e-01 7.5312e-01 3.3145e+03 1.1924e+03 4.5474e+02 5.0510e+01 5.8483e-05 1.6061e-05 2.5951e-03 4.8683e-04 1.1571e-01 3.8808e-02 4.0432e-02 2.8273e-02 1.7312e-02 1.6688e-02 7.3969e-01 9.6483e-03 3.2544e-03 5.7711e-01 1.2227e-01 9.2704e-02 4.7354e-02 2.1263e-02 1.4939e-02 1.1146e-01 +7.4400e-01 5.1688e+06 5.5315e+02 1.4045e+03 2.1128e-07 2.4510e-01 7.5490e-01 3.3109e+03 1.1833e+03 4.5508e+02 5.0197e+01 5.8527e-05 1.6045e-05 2.5756e-03 4.8261e-04 1.1478e-01 3.8532e-02 4.0175e-02 2.8115e-02 1.7230e-02 1.6624e-02 7.4149e-01 9.6438e-03 3.2523e-03 5.7678e-01 1.2222e-01 9.2683e-02 4.7352e-02 2.1268e-02 1.4947e-02 1.1185e-01 +7.4600e-01 5.1292e+06 5.5315e+02 1.3927e+03 2.1356e-07 2.4330e-01 7.5670e-01 3.3072e+03 1.1742e+03 4.5542e+02 4.9884e+01 5.8572e-05 1.6030e-05 2.5561e-03 4.7840e-04 1.1384e-01 3.8255e-02 3.9916e-02 2.7956e-02 1.7147e-02 1.6558e-02 7.4329e-01 9.6392e-03 3.2501e-03 5.7645e-01 1.2217e-01 9.2660e-02 4.7350e-02 2.1272e-02 1.4955e-02 1.1225e-01 +7.4800e-01 5.0896e+06 5.5315e+02 1.3809e+03 2.1588e-07 2.4146e-01 7.5854e-01 3.3035e+03 1.1651e+03 4.5576e+02 4.9572e+01 5.8616e-05 1.6014e-05 2.5366e-03 4.7419e-04 1.1291e-01 3.7978e-02 3.9657e-02 2.7796e-02 1.7063e-02 1.6492e-02 7.4510e-01 9.6345e-03 3.2480e-03 5.7611e-01 1.2212e-01 9.2636e-02 4.7348e-02 2.1277e-02 1.4963e-02 1.1266e-01 +7.5000e-01 5.0500e+06 5.5315e+02 1.3691e+03 2.1824e-07 2.3959e-01 7.6041e-01 3.2999e+03 1.1560e+03 4.5610e+02 4.9260e+01 5.8661e-05 1.5998e-05 2.5170e-03 4.6999e-04 1.1197e-01 3.7700e-02 3.9396e-02 2.7635e-02 1.6978e-02 1.6426e-02 7.4691e-01 9.6298e-03 3.2458e-03 5.7576e-01 1.2207e-01 9.2612e-02 4.7345e-02 2.1281e-02 1.4971e-02 1.1308e-01 +7.5200e-01 5.0104e+06 5.5315e+02 1.3573e+03 2.2065e-07 2.3769e-01 7.6231e-01 3.2962e+03 1.1469e+03 4.5644e+02 4.8948e+01 5.8705e-05 1.5982e-05 2.4974e-03 4.6579e-04 1.1103e-01 3.7422e-02 3.9135e-02 2.7474e-02 1.6893e-02 1.6358e-02 7.4872e-01 9.6249e-03 3.2435e-03 5.7541e-01 1.2202e-01 9.2586e-02 4.7342e-02 2.1285e-02 1.4979e-02 1.1351e-01 +7.5400e-01 4.9708e+06 5.5315e+02 1.3454e+03 2.2310e-07 2.3576e-01 7.6424e-01 3.2926e+03 1.1378e+03 4.5678e+02 4.8637e+01 5.8749e-05 1.5966e-05 2.4778e-03 4.6160e-04 1.1010e-01 3.7143e-02 3.8872e-02 2.7311e-02 1.6807e-02 1.6290e-02 7.5054e-01 9.6199e-03 3.2413e-03 5.7506e-01 1.2196e-01 9.2560e-02 4.7338e-02 2.1289e-02 1.4987e-02 1.1394e-01 +7.5600e-01 4.9312e+06 5.5315e+02 1.3335e+03 2.2561e-07 2.3379e-01 7.6621e-01 3.2889e+03 1.1287e+03 4.5712e+02 4.8326e+01 5.8792e-05 1.5949e-05 2.4582e-03 4.5741e-04 1.0916e-01 3.6864e-02 3.8609e-02 2.7147e-02 1.6720e-02 1.6220e-02 7.5236e-01 9.6149e-03 3.2390e-03 5.7470e-01 1.2191e-01 9.2533e-02 4.7334e-02 2.1293e-02 1.4995e-02 1.1439e-01 +7.5800e-01 4.8916e+06 5.5315e+02 1.3216e+03 2.2816e-07 2.3179e-01 7.6821e-01 3.2852e+03 1.1196e+03 4.5746e+02 4.8015e+01 5.8836e-05 1.5933e-05 2.4386e-03 4.5323e-04 1.0823e-01 3.6583e-02 3.8344e-02 2.6982e-02 1.6633e-02 1.6150e-02 7.5419e-01 9.6097e-03 3.2367e-03 5.7433e-01 1.2185e-01 9.2505e-02 4.7330e-02 2.1297e-02 1.5002e-02 1.1484e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3096e+03 2.3076e-07 2.2976e-01 7.7024e-01 3.2816e+03 1.1106e+03 4.5780e+02 4.7704e+01 5.8880e-05 1.5917e-05 2.4189e-03 4.4905e-04 1.0729e-01 3.6303e-02 3.8078e-02 2.6816e-02 1.6545e-02 1.6080e-02 7.5602e-01 9.6045e-03 3.2343e-03 5.7396e-01 1.2179e-01 9.2476e-02 4.7325e-02 2.1300e-02 1.5010e-02 1.1530e-01 +7.6200e-01 4.8124e+06 5.5315e+02 1.2976e+03 2.3341e-07 2.2768e-01 7.7232e-01 3.2779e+03 1.1015e+03 4.5813e+02 4.7394e+01 5.8923e-05 1.5901e-05 2.3992e-03 4.4487e-04 1.0636e-01 3.6021e-02 3.7812e-02 2.6650e-02 1.6456e-02 1.6008e-02 7.5785e-01 9.5991e-03 3.2319e-03 5.7358e-01 1.2173e-01 9.2446e-02 4.7320e-02 2.1303e-02 1.5018e-02 1.1577e-01 +7.6400e-01 4.7728e+06 5.5315e+02 1.2856e+03 2.3611e-07 2.2557e-01 7.7443e-01 3.2742e+03 1.0924e+03 4.5847e+02 4.7084e+01 5.8966e-05 1.5884e-05 2.3795e-03 4.4070e-04 1.0542e-01 3.5739e-02 3.7544e-02 2.6482e-02 1.6366e-02 1.5935e-02 7.5969e-01 9.5936e-03 3.2295e-03 5.7319e-01 1.2167e-01 9.2415e-02 4.7314e-02 2.1307e-02 1.5025e-02 1.1626e-01 +7.6600e-01 4.7332e+06 5.5315e+02 1.2736e+03 2.3887e-07 2.2342e-01 7.7658e-01 3.2706e+03 1.0833e+03 4.5881e+02 4.6774e+01 5.9009e-05 1.5868e-05 2.3597e-03 4.3654e-04 1.0448e-01 3.5457e-02 3.7275e-02 2.6313e-02 1.6275e-02 1.5862e-02 7.6154e-01 9.5880e-03 3.2270e-03 5.7280e-01 1.2161e-01 9.2383e-02 4.7308e-02 2.1310e-02 1.5033e-02 1.1675e-01 +7.6800e-01 4.6936e+06 5.5315e+02 1.2615e+03 2.4169e-07 2.2123e-01 7.7877e-01 3.2669e+03 1.0742e+03 4.5915e+02 4.6465e+01 5.9052e-05 1.5851e-05 2.3399e-03 4.3238e-04 1.0355e-01 3.5173e-02 3.7005e-02 2.6143e-02 1.6184e-02 1.5788e-02 7.6339e-01 9.5823e-03 3.2245e-03 5.7240e-01 1.2154e-01 9.2350e-02 4.7301e-02 2.1312e-02 1.5040e-02 1.1725e-01 +7.7000e-01 4.6540e+06 5.5315e+02 1.2494e+03 2.4456e-07 2.1900e-01 7.8100e-01 3.2633e+03 1.0651e+03 4.5949e+02 4.6156e+01 5.9095e-05 1.5835e-05 2.3201e-03 4.2822e-04 1.0261e-01 3.4890e-02 3.6735e-02 2.5973e-02 1.6092e-02 1.5713e-02 7.6524e-01 9.5765e-03 3.2219e-03 5.7199e-01 1.2148e-01 9.2316e-02 4.7294e-02 2.1315e-02 1.5047e-02 1.1776e-01 +7.7200e-01 4.6144e+06 5.5315e+02 1.2373e+03 2.4749e-07 2.1673e-01 7.8327e-01 3.2596e+03 1.0560e+03 4.5983e+02 4.5847e+01 5.9138e-05 1.5818e-05 2.3003e-03 4.2407e-04 1.0168e-01 3.4605e-02 3.6463e-02 2.5801e-02 1.6000e-02 1.5637e-02 7.6710e-01 9.5705e-03 3.2194e-03 5.7157e-01 1.2141e-01 9.2280e-02 4.7286e-02 2.1317e-02 1.5054e-02 1.1829e-01 +7.7400e-01 4.5748e+06 5.5315e+02 1.2252e+03 2.5048e-07 2.1442e-01 7.8558e-01 3.2560e+03 1.0470e+03 4.6016e+02 4.5539e+01 5.9180e-05 1.5801e-05 2.2804e-03 4.1992e-04 1.0074e-01 3.4320e-02 3.6190e-02 2.5628e-02 1.5906e-02 1.5560e-02 7.6896e-01 9.5644e-03 3.2167e-03 5.7115e-01 1.2134e-01 9.2244e-02 4.7278e-02 2.1319e-02 1.5061e-02 1.1882e-01 +7.7600e-01 4.5352e+06 5.5315e+02 1.2130e+03 2.5354e-07 2.1206e-01 7.8794e-01 3.2523e+03 1.0379e+03 4.6050e+02 4.5230e+01 5.9223e-05 1.5784e-05 2.2606e-03 4.1578e-04 9.9803e-02 3.4035e-02 3.5915e-02 2.5454e-02 1.5812e-02 1.5483e-02 7.7082e-01 9.5583e-03 3.2141e-03 5.7072e-01 1.2127e-01 9.2206e-02 4.7269e-02 2.1321e-02 1.5068e-02 1.1937e-01 +7.7800e-01 4.4956e+06 5.5315e+02 1.2008e+03 2.5666e-07 2.0966e-01 7.9034e-01 3.2486e+03 1.0288e+03 4.6084e+02 4.4923e+01 5.9265e-05 1.5767e-05 2.2407e-03 4.1164e-04 9.8866e-02 3.3748e-02 3.5640e-02 2.5279e-02 1.5717e-02 1.5404e-02 7.7269e-01 9.5519e-03 3.2113e-03 5.7029e-01 1.2120e-01 9.2167e-02 4.7259e-02 2.1323e-02 1.5075e-02 1.1992e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.1886e+03 2.5984e-07 2.0720e-01 7.9280e-01 3.2450e+03 1.0197e+03 4.6118e+02 4.4615e+01 5.9307e-05 1.5750e-05 2.2207e-03 4.0751e-04 9.7930e-02 3.3461e-02 3.5364e-02 2.5103e-02 1.5621e-02 1.5325e-02 7.7457e-01 9.5455e-03 3.2086e-03 5.6984e-01 1.2113e-01 9.2127e-02 4.7249e-02 2.1325e-02 1.5082e-02 1.2049e-01 +7.8200e-01 4.4164e+06 5.5315e+02 1.1764e+03 2.6309e-07 2.0471e-01 7.9529e-01 3.2413e+03 1.0106e+03 4.6151e+02 4.4308e+01 5.9349e-05 1.5733e-05 2.2008e-03 4.0338e-04 9.6993e-02 3.3174e-02 3.5087e-02 2.4927e-02 1.5524e-02 1.5245e-02 7.7645e-01 9.5389e-03 3.2058e-03 5.6939e-01 1.2105e-01 9.2086e-02 4.7238e-02 2.1326e-02 1.5089e-02 1.2107e-01 +7.8400e-01 4.3768e+06 5.5315e+02 1.1641e+03 2.6642e-07 2.0216e-01 7.9784e-01 3.2377e+03 1.0016e+03 4.6185e+02 4.4001e+01 5.9390e-05 1.5716e-05 2.1808e-03 3.9926e-04 9.6057e-02 3.2886e-02 3.4808e-02 2.4749e-02 1.5427e-02 1.5163e-02 7.7833e-01 9.5321e-03 3.2029e-03 5.6893e-01 1.2098e-01 9.2043e-02 4.7227e-02 2.1327e-02 1.5095e-02 1.2167e-01 +7.8600e-01 4.3372e+06 5.5315e+02 1.1518e+03 2.6981e-07 1.9956e-01 8.0044e-01 3.2340e+03 9.9249e+02 4.6219e+02 4.3694e+01 5.9432e-05 1.5699e-05 2.1608e-03 3.9514e-04 9.5120e-02 3.2597e-02 3.4529e-02 2.4570e-02 1.5328e-02 1.5081e-02 7.8022e-01 9.5253e-03 3.2001e-03 5.6846e-01 1.2090e-01 9.1999e-02 4.7215e-02 2.1328e-02 1.5101e-02 1.2227e-01 +7.8800e-01 4.2976e+06 5.5315e+02 1.1395e+03 2.7328e-07 1.9691e-01 8.0309e-01 3.2304e+03 9.8342e+02 4.6252e+02 4.3387e+01 5.9473e-05 1.5681e-05 2.1407e-03 3.9102e-04 9.4184e-02 3.2308e-02 3.4249e-02 2.4390e-02 1.5229e-02 1.4998e-02 7.8211e-01 9.5182e-03 3.1971e-03 5.6798e-01 1.2082e-01 9.1954e-02 4.7203e-02 2.1328e-02 1.5108e-02 1.2289e-01 +7.9000e-01 4.2580e+06 5.5315e+02 1.1271e+03 2.7683e-07 1.9421e-01 8.0579e-01 3.2267e+03 9.7435e+02 4.6286e+02 4.3081e+01 5.9515e-05 1.5663e-05 2.1207e-03 3.8691e-04 9.3247e-02 3.2018e-02 3.3967e-02 2.4208e-02 1.5129e-02 1.4914e-02 7.8401e-01 9.5111e-03 3.1941e-03 5.6750e-01 1.2074e-01 9.1907e-02 4.7189e-02 2.1329e-02 1.5114e-02 1.2353e-01 +7.9200e-01 4.2184e+06 5.5315e+02 1.1148e+03 2.8045e-07 1.9145e-01 8.0855e-01 3.2231e+03 9.6527e+02 4.6319e+02 4.2775e+01 5.9556e-05 1.5646e-05 2.1006e-03 3.8281e-04 9.2311e-02 3.1727e-02 3.3684e-02 2.4026e-02 1.5029e-02 1.4829e-02 7.8591e-01 9.5037e-03 3.1911e-03 5.6700e-01 1.2065e-01 9.1858e-02 4.7175e-02 2.1329e-02 1.5120e-02 1.2417e-01 +7.9400e-01 4.1788e+06 5.5315e+02 1.1024e+03 2.8416e-07 1.8863e-01 8.1137e-01 3.2194e+03 9.5620e+02 4.6353e+02 4.2469e+01 5.9597e-05 1.5628e-05 2.0805e-03 3.7870e-04 9.1374e-02 3.1436e-02 3.3400e-02 2.3843e-02 1.4927e-02 1.4744e-02 7.8782e-01 9.4962e-03 3.1880e-03 5.6649e-01 1.2056e-01 9.1809e-02 4.7160e-02 2.1328e-02 1.5126e-02 1.2483e-01 +7.9600e-01 4.1392e+06 5.5315e+02 1.0900e+03 2.8795e-07 1.8576e-01 8.1424e-01 3.2158e+03 9.4713e+02 4.6387e+02 4.2164e+01 5.9637e-05 1.5610e-05 2.0603e-03 3.7461e-04 9.0437e-02 3.1144e-02 3.3116e-02 2.3659e-02 1.4825e-02 1.4657e-02 7.8973e-01 9.4886e-03 3.1848e-03 5.6598e-01 1.2048e-01 9.1757e-02 4.7145e-02 2.1328e-02 1.5131e-02 1.2551e-01 +7.9800e-01 4.0996e+06 5.5315e+02 1.0775e+03 2.9183e-07 1.8282e-01 8.1718e-01 3.2121e+03 9.3806e+02 4.6420e+02 4.1859e+01 5.9678e-05 1.5592e-05 2.0402e-03 3.7051e-04 8.9501e-02 3.0852e-02 3.2830e-02 2.3473e-02 1.4722e-02 1.4569e-02 7.9164e-01 9.4808e-03 3.1816e-03 5.6545e-01 1.2039e-01 9.1704e-02 4.7129e-02 2.1327e-02 1.5137e-02 1.2620e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0651e+03 2.9580e-07 1.7982e-01 8.2018e-01 3.2085e+03 9.2899e+02 4.6454e+02 4.1554e+01 5.9718e-05 1.5574e-05 2.0200e-03 3.6643e-04 8.8564e-02 3.0559e-02 3.2542e-02 2.3287e-02 1.4618e-02 1.4480e-02 7.9356e-01 9.4728e-03 3.1784e-03 5.6492e-01 1.2029e-01 9.1650e-02 4.7111e-02 2.1326e-02 1.5142e-02 1.2691e-01 +8.0200e-01 4.0204e+06 5.5315e+02 1.0526e+03 2.9987e-07 1.7676e-01 8.2324e-01 3.2048e+03 9.1993e+02 4.6487e+02 4.1249e+01 5.9759e-05 1.5556e-05 1.9998e-03 3.6234e-04 8.7627e-02 3.0265e-02 3.2254e-02 2.3099e-02 1.4513e-02 1.4391e-02 7.9549e-01 9.4646e-03 3.1751e-03 5.6437e-01 1.2020e-01 9.1593e-02 4.7093e-02 2.1324e-02 1.5147e-02 1.2763e-01 +8.0400e-01 3.9808e+06 5.5315e+02 1.0401e+03 3.0402e-07 1.7363e-01 8.2637e-01 3.2012e+03 9.1086e+02 4.6521e+02 4.0945e+01 5.9799e-05 1.5537e-05 1.9795e-03 3.5826e-04 8.6690e-02 2.9971e-02 3.1965e-02 2.2911e-02 1.4407e-02 1.4300e-02 7.9742e-01 9.4563e-03 3.1717e-03 5.6382e-01 1.2010e-01 9.1535e-02 4.7075e-02 2.1322e-02 1.5152e-02 1.2837e-01 +8.0600e-01 3.9412e+06 5.5315e+02 1.0275e+03 3.0828e-07 1.7043e-01 8.2957e-01 3.1975e+03 9.0180e+02 4.6554e+02 4.0641e+01 5.9839e-05 1.5518e-05 1.9593e-03 3.5419e-04 8.5753e-02 2.9676e-02 3.1675e-02 2.2721e-02 1.4300e-02 1.4208e-02 7.9935e-01 9.4477e-03 3.1683e-03 5.6325e-01 1.2000e-01 9.1476e-02 4.7055e-02 2.1320e-02 1.5157e-02 1.2913e-01 +8.0800e-01 3.9016e+06 5.5315e+02 1.0150e+03 3.1264e-07 1.6717e-01 8.3283e-01 3.1939e+03 8.9273e+02 4.6588e+02 4.0337e+01 5.9879e-05 1.5500e-05 1.9390e-03 3.5012e-04 8.4816e-02 2.9380e-02 3.1383e-02 2.2530e-02 1.4193e-02 1.4115e-02 8.0129e-01 9.4390e-03 3.1648e-03 5.6267e-01 1.1990e-01 9.1414e-02 4.7034e-02 2.1317e-02 1.5161e-02 1.2990e-01 +8.1000e-01 3.8620e+06 5.5315e+02 1.0024e+03 3.1711e-07 1.6382e-01 8.3618e-01 3.1902e+03 8.8367e+02 4.6621e+02 4.0033e+01 5.9918e-05 1.5481e-05 1.9187e-03 3.4605e-04 8.3879e-02 2.9084e-02 3.1090e-02 2.2338e-02 1.4084e-02 1.4022e-02 8.0324e-01 9.4301e-03 3.1612e-03 5.6208e-01 1.1979e-01 9.1350e-02 4.7013e-02 2.1314e-02 1.5165e-02 1.3069e-01 +8.1200e-01 3.8224e+06 5.5315e+02 9.8980e+02 3.2168e-07 1.6041e-01 8.3959e-01 3.1866e+03 8.7461e+02 4.6655e+02 3.9730e+01 5.9958e-05 1.5462e-05 1.8983e-03 3.4199e-04 8.2942e-02 2.8787e-02 3.0797e-02 2.2145e-02 1.3975e-02 1.3927e-02 8.0519e-01 9.4210e-03 3.1576e-03 5.6148e-01 1.1969e-01 9.1285e-02 4.6990e-02 2.1310e-02 1.5170e-02 1.3150e-01 +8.1400e-01 3.7828e+06 5.5315e+02 9.7718e+02 3.2637e-07 1.5691e-01 8.4309e-01 3.1829e+03 8.6555e+02 4.6688e+02 3.9427e+01 5.9997e-05 1.5442e-05 1.8780e-03 3.3794e-04 8.2005e-02 2.8490e-02 3.0502e-02 2.1951e-02 1.3865e-02 1.3831e-02 8.0714e-01 9.4116e-03 3.1539e-03 5.6086e-01 1.1958e-01 9.1217e-02 4.6967e-02 2.1307e-02 1.5173e-02 1.3233e-01 +8.1600e-01 3.7432e+06 5.5315e+02 9.6454e+02 3.3118e-07 1.5333e-01 8.4667e-01 3.1793e+03 8.5649e+02 4.6722e+02 3.9124e+01 6.0036e-05 1.5423e-05 1.8576e-03 3.3388e-04 8.1068e-02 2.8192e-02 3.0206e-02 2.1756e-02 1.3754e-02 1.3734e-02 8.0910e-01 9.4021e-03 3.1501e-03 5.6024e-01 1.1946e-01 9.1148e-02 4.6942e-02 2.1302e-02 1.5177e-02 1.3318e-01 +8.1800e-01 3.7036e+06 5.5315e+02 9.5188e+02 3.3611e-07 1.4967e-01 8.5033e-01 3.1757e+03 8.4743e+02 4.6755e+02 3.8822e+01 6.0075e-05 1.5403e-05 1.8372e-03 3.2984e-04 8.0130e-02 2.7893e-02 2.9909e-02 2.1559e-02 1.3642e-02 1.3636e-02 8.1106e-01 9.3923e-03 3.1462e-03 5.5960e-01 1.1935e-01 9.1076e-02 4.6917e-02 2.1298e-02 1.5180e-02 1.3405e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.3920e+02 3.4116e-07 1.4592e-01 8.5408e-01 3.1720e+03 8.3838e+02 4.6788e+02 3.8520e+01 6.0114e-05 1.5384e-05 1.8167e-03 3.2579e-04 7.9193e-02 2.7594e-02 2.9610e-02 2.1362e-02 1.3529e-02 1.3537e-02 8.1303e-01 9.3823e-03 3.1423e-03 5.5894e-01 1.1923e-01 9.1002e-02 4.6890e-02 2.1292e-02 1.5183e-02 1.3494e-01 +8.2200e-01 3.6244e+06 5.5315e+02 9.2651e+02 3.4635e-07 1.4209e-01 8.5791e-01 3.1684e+03 8.2932e+02 4.6822e+02 3.8218e+01 6.0152e-05 1.5364e-05 1.7962e-03 3.2175e-04 7.8256e-02 2.7294e-02 2.9311e-02 2.1163e-02 1.3415e-02 1.3437e-02 8.1501e-01 9.3720e-03 3.1383e-03 5.5827e-01 1.1911e-01 9.0926e-02 4.6862e-02 2.1287e-02 1.5186e-02 1.3585e-01 +8.2400e-01 3.5848e+06 5.5315e+02 9.1379e+02 3.5167e-07 1.3816e-01 8.6184e-01 3.1647e+03 8.2027e+02 4.6855e+02 3.7916e+01 6.0190e-05 1.5343e-05 1.7758e-03 3.1772e-04 7.7319e-02 2.6994e-02 2.9010e-02 2.0963e-02 1.3301e-02 1.3336e-02 8.1698e-01 9.3616e-03 3.1342e-03 5.5759e-01 1.1898e-01 9.0847e-02 4.6833e-02 2.1280e-02 1.5188e-02 1.3678e-01 +8.2600e-01 3.5452e+06 5.5315e+02 9.0106e+02 3.5713e-07 1.3413e-01 8.6587e-01 3.1611e+03 8.1121e+02 4.6889e+02 3.7614e+01 6.0229e-05 1.5323e-05 1.7552e-03 3.1369e-04 7.6381e-02 2.6692e-02 2.8709e-02 2.0762e-02 1.3185e-02 1.3234e-02 8.1897e-01 9.3508e-03 3.1301e-03 5.5689e-01 1.1886e-01 9.0766e-02 4.6803e-02 2.1274e-02 1.5190e-02 1.3774e-01 +8.2800e-01 3.5056e+06 5.5315e+02 8.8830e+02 3.6274e-07 1.3000e-01 8.7000e-01 3.1574e+03 8.0216e+02 4.6922e+02 3.7313e+01 6.0267e-05 1.5302e-05 1.7347e-03 3.0966e-04 7.5444e-02 2.6391e-02 2.8406e-02 2.0560e-02 1.3069e-02 1.3130e-02 8.2096e-01 9.3398e-03 3.1258e-03 5.5618e-01 1.1873e-01 9.0683e-02 4.6771e-02 2.1266e-02 1.5192e-02 1.3872e-01 +8.3000e-01 3.4660e+06 5.5315e+02 8.7554e+02 3.6850e-07 1.2577e-01 8.7423e-01 3.1538e+03 7.9311e+02 4.6955e+02 3.7012e+01 6.0304e-05 1.5282e-05 1.7141e-03 3.0564e-04 7.4506e-02 2.6088e-02 2.8102e-02 2.0357e-02 1.2951e-02 1.3026e-02 8.2295e-01 9.3285e-03 3.1215e-03 5.5545e-01 1.1859e-01 9.0596e-02 4.6738e-02 2.1258e-02 1.5194e-02 1.3972e-01 +8.3200e-01 3.4264e+06 5.5315e+02 8.6275e+02 3.7442e-07 1.2143e-01 8.7857e-01 3.1502e+03 7.8406e+02 4.6989e+02 3.6711e+01 6.0342e-05 1.5261e-05 1.6935e-03 3.0163e-04 7.3569e-02 2.5785e-02 2.7796e-02 2.0152e-02 1.2833e-02 1.2920e-02 8.2495e-01 9.3170e-03 3.1171e-03 5.5471e-01 1.1845e-01 9.0508e-02 4.6704e-02 2.1250e-02 1.5195e-02 1.4075e-01 +8.3400e-01 3.3868e+06 5.5315e+02 8.4995e+02 3.8050e-07 1.1698e-01 8.8302e-01 3.1465e+03 7.7501e+02 4.7022e+02 3.6411e+01 6.0380e-05 1.5239e-05 1.6729e-03 2.9761e-04 7.2631e-02 2.5481e-02 2.7490e-02 1.9946e-02 1.2714e-02 1.2813e-02 8.2695e-01 9.3052e-03 3.1125e-03 5.5394e-01 1.1831e-01 9.0416e-02 4.6668e-02 2.1241e-02 1.5195e-02 1.4181e-01 +8.3600e-01 3.3472e+06 5.5315e+02 8.3714e+02 3.8675e-07 1.1241e-01 8.8759e-01 3.1429e+03 7.6597e+02 4.7055e+02 3.6110e+01 6.0417e-05 1.5218e-05 1.6522e-03 2.9361e-04 7.1694e-02 2.5177e-02 2.7183e-02 1.9740e-02 1.2593e-02 1.2705e-02 8.2896e-01 9.2930e-03 3.1079e-03 5.5316e-01 1.1817e-01 9.0321e-02 4.6631e-02 2.1231e-02 1.5195e-02 1.4289e-01 +8.3800e-01 3.3076e+06 5.5315e+02 8.2431e+02 3.9317e-07 1.0772e-01 8.9228e-01 3.1392e+03 7.5692e+02 4.7089e+02 3.5810e+01 6.0454e-05 1.5196e-05 1.6316e-03 2.8960e-04 7.0756e-02 2.4872e-02 2.6874e-02 1.9532e-02 1.2472e-02 1.2596e-02 8.3098e-01 9.2806e-03 3.1032e-03 5.5237e-01 1.1802e-01 9.0224e-02 4.6593e-02 2.1221e-02 1.5195e-02 1.4400e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1147e+02 3.9978e-07 1.0291e-01 8.9709e-01 3.1356e+03 7.4788e+02 4.7122e+02 3.5511e+01 6.0491e-05 1.5174e-05 1.6109e-03 2.8560e-04 6.9819e-02 2.4566e-02 2.6564e-02 1.9322e-02 1.2350e-02 1.2486e-02 8.3300e-01 9.2678e-03 3.0984e-03 5.5155e-01 1.1786e-01 9.0123e-02 4.6552e-02 2.1210e-02 1.5195e-02 1.4514e-01 +8.4200e-01 3.2284e+06 5.5315e+02 7.9862e+02 4.0658e-07 9.7964e-02 9.0204e-01 3.1320e+03 7.3884e+02 4.7155e+02 3.5211e+01 6.0527e-05 1.5152e-05 1.5902e-03 2.8161e-04 6.8881e-02 2.4260e-02 2.6253e-02 1.9112e-02 1.2227e-02 1.2375e-02 8.3502e-01 9.2547e-03 3.0934e-03 5.5071e-01 1.1771e-01 9.0019e-02 4.6511e-02 2.1198e-02 1.5194e-02 1.4631e-01 +8.4400e-01 3.1888e+06 5.5315e+02 7.8575e+02 4.1359e-07 9.2883e-02 9.0712e-01 3.1283e+03 7.2980e+02 4.7188e+02 3.4912e+01 6.0564e-05 1.5129e-05 1.5694e-03 2.7762e-04 6.7943e-02 2.3953e-02 2.5941e-02 1.8900e-02 1.2102e-02 1.2262e-02 8.3705e-01 9.2413e-03 3.0884e-03 5.4986e-01 1.1754e-01 8.9912e-02 4.6467e-02 2.1186e-02 1.5192e-02 1.4751e-01 +8.4600e-01 3.1492e+06 5.5315e+02 7.7288e+02 4.2079e-07 8.7659e-02 9.1234e-01 3.1247e+03 7.2076e+02 4.7222e+02 3.4613e+01 6.0600e-05 1.5106e-05 1.5486e-03 2.7363e-04 6.7005e-02 2.3646e-02 2.5628e-02 1.8688e-02 1.1977e-02 1.2148e-02 8.3909e-01 9.2275e-03 3.0832e-03 5.4898e-01 1.1738e-01 8.9801e-02 4.6422e-02 2.1172e-02 1.5190e-02 1.4875e-01 +8.4800e-01 3.1096e+06 5.5315e+02 7.6000e+02 4.2822e-07 8.2288e-02 9.1771e-01 3.1211e+03 7.1172e+02 4.7255e+02 3.4314e+01 6.0636e-05 1.5083e-05 1.5278e-03 2.6965e-04 6.6068e-02 2.3338e-02 2.5313e-02 1.8474e-02 1.1851e-02 1.2033e-02 8.4113e-01 9.2133e-03 3.0780e-03 5.4808e-01 1.1721e-01 8.9687e-02 4.6375e-02 2.1158e-02 1.5188e-02 1.5001e-01 +8.5000e-01 3.0700e+06 5.5315e+02 7.4710e+02 4.3587e-07 7.6762e-02 9.2324e-01 3.1174e+03 7.0268e+02 4.7288e+02 3.4015e+01 6.0672e-05 1.5059e-05 1.5070e-03 2.6567e-04 6.5130e-02 2.3029e-02 2.4998e-02 1.8258e-02 1.1724e-02 1.1917e-02 8.4317e-01 9.1988e-03 3.0726e-03 5.4716e-01 1.1703e-01 8.9569e-02 4.6325e-02 2.1143e-02 1.5184e-02 1.5132e-01 +8.5200e-01 3.0304e+06 5.5315e+02 7.3421e+02 4.4376e-07 7.1074e-02 9.2893e-01 3.1138e+03 6.9365e+02 4.7321e+02 3.3717e+01 6.0708e-05 1.5035e-05 1.4861e-03 2.6170e-04 6.4192e-02 2.2719e-02 2.4681e-02 1.8042e-02 1.1596e-02 1.1799e-02 8.4522e-01 9.1839e-03 3.0670e-03 5.4621e-01 1.1685e-01 8.9447e-02 4.6274e-02 2.1128e-02 1.5181e-02 1.5266e-01 +8.5400e-01 2.9908e+06 5.5315e+02 7.2130e+02 4.5189e-07 6.5219e-02 9.3478e-01 3.1101e+03 6.8461e+02 4.7355e+02 3.3419e+01 6.0743e-05 1.5011e-05 1.4653e-03 2.5773e-04 6.3254e-02 2.2409e-02 2.4363e-02 1.7824e-02 1.1467e-02 1.1680e-02 8.4728e-01 9.1685e-03 3.0613e-03 5.4525e-01 1.1666e-01 8.9321e-02 4.6221e-02 2.1111e-02 1.5176e-02 1.5403e-01 +8.5600e-01 2.9512e+06 5.5315e+02 7.0839e+02 4.6028e-07 5.9188e-02 9.4081e-01 3.1065e+03 6.7558e+02 4.7388e+02 3.3121e+01 6.0779e-05 1.4987e-05 1.4444e-03 2.5376e-04 6.2316e-02 2.2098e-02 2.4043e-02 1.7605e-02 1.1336e-02 1.1560e-02 8.4934e-01 9.1528e-03 3.0555e-03 5.4425e-01 1.1647e-01 8.9191e-02 4.6166e-02 2.1093e-02 1.5172e-02 1.5545e-01 +8.5800e-01 2.9116e+06 5.5315e+02 6.9548e+02 4.6894e-07 5.2973e-02 9.4703e-01 3.1029e+03 6.6655e+02 4.7421e+02 3.2823e+01 6.0814e-05 1.4962e-05 1.4234e-03 2.4980e-04 6.1378e-02 2.1787e-02 2.3723e-02 1.7385e-02 1.1205e-02 1.1439e-02 8.5141e-01 9.1366e-03 3.0496e-03 5.4323e-01 1.1627e-01 8.9057e-02 4.6109e-02 2.1075e-02 1.5166e-02 1.5690e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8256e+02 4.7788e-07 4.6565e-02 9.5343e-01 3.0992e+03 6.5752e+02 4.7454e+02 3.2526e+01 6.0849e-05 1.4936e-05 1.4025e-03 2.4585e-04 6.0440e-02 2.1475e-02 2.3401e-02 1.7164e-02 1.1073e-02 1.1316e-02 8.5348e-01 9.1199e-03 3.0435e-03 5.4218e-01 1.1607e-01 8.8918e-02 4.6049e-02 2.1055e-02 1.5160e-02 1.5840e-01 +8.6200e-01 2.8324e+06 5.5315e+02 6.6964e+02 4.8711e-07 3.9957e-02 9.6004e-01 3.0956e+03 6.4849e+02 4.7487e+02 3.2229e+01 6.0883e-05 1.4911e-05 1.3815e-03 2.4190e-04 5.9502e-02 2.1162e-02 2.3078e-02 1.6941e-02 1.0940e-02 1.1192e-02 8.5556e-01 9.1027e-03 3.0372e-03 5.4111e-01 1.1586e-01 8.8774e-02 4.5986e-02 2.1034e-02 1.5153e-02 1.5995e-01 +8.6400e-01 2.7928e+06 5.5315e+02 6.5673e+02 4.9665e-07 3.3136e-02 9.6686e-01 3.0920e+03 6.3947e+02 4.7520e+02 3.1932e+01 6.0918e-05 1.4885e-05 1.3605e-03 2.3795e-04 5.8564e-02 2.0849e-02 2.2754e-02 1.6717e-02 1.0805e-02 1.1067e-02 8.5764e-01 9.0851e-03 3.0308e-03 5.4000e-01 1.1564e-01 8.8625e-02 4.5922e-02 2.1012e-02 1.5145e-02 1.6153e-01 +8.6600e-01 2.7532e+06 5.5315e+02 6.4381e+02 5.0652e-07 2.6095e-02 9.7391e-01 3.0883e+03 6.3044e+02 4.7554e+02 3.1635e+01 6.0952e-05 1.4858e-05 1.3395e-03 2.3401e-04 5.7626e-02 2.0535e-02 2.2429e-02 1.6492e-02 1.0670e-02 1.0940e-02 8.5973e-01 9.0669e-03 3.0242e-03 5.3887e-01 1.1542e-01 8.8472e-02 4.5854e-02 2.0989e-02 1.5136e-02 1.6317e-01 +8.6800e-01 2.7136e+06 5.5315e+02 6.3090e+02 5.1672e-07 1.8821e-02 9.8118e-01 3.0847e+03 6.2142e+02 4.7587e+02 3.1338e+01 6.0986e-05 1.4831e-05 1.3184e-03 2.3007e-04 5.6688e-02 2.0221e-02 2.2102e-02 1.6266e-02 1.0533e-02 1.0812e-02 8.6183e-01 9.0482e-03 3.0174e-03 5.3770e-01 1.1519e-01 8.8313e-02 4.5784e-02 2.0965e-02 1.5127e-02 1.6486e-01 +8.7000e-01 2.6740e+06 5.5315e+02 6.1799e+02 5.2728e-07 1.1303e-02 9.8870e-01 3.0811e+03 6.1240e+02 4.7620e+02 3.1042e+01 6.1020e-05 1.4804e-05 1.2973e-03 2.2613e-04 5.5750e-02 1.9905e-02 2.1775e-02 1.6038e-02 1.0396e-02 1.0683e-02 8.6393e-01 9.0289e-03 3.0104e-03 5.3650e-01 1.1496e-01 8.8148e-02 4.5711e-02 2.0939e-02 1.5117e-02 1.6660e-01 +8.7200e-01 2.6344e+06 5.5315e+02 6.0509e+02 5.3822e-07 3.5289e-03 9.9647e-01 3.0774e+03 6.0338e+02 4.7653e+02 3.0746e+01 6.1053e-05 1.4776e-05 1.2762e-03 2.2220e-04 5.4811e-02 1.9589e-02 2.1446e-02 1.5809e-02 1.0257e-02 1.0552e-02 8.6604e-01 9.0090e-03 3.0032e-03 5.3526e-01 1.1471e-01 8.7977e-02 4.5635e-02 2.0912e-02 1.5105e-02 1.6839e-01 +8.7400e-01 2.5948e+06 5.5315e+02 5.9408e+02 4.0416e-07 0.0000e+00 1.0000e+00 5.9408e+02 5.9408e+02 3.0344e+01 3.0344e+01 1.4756e-05 1.4756e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7600e-01 2.5552e+06 5.5315e+02 5.8458e+02 4.1018e-07 0.0000e+00 1.0000e+00 5.8458e+02 5.8458e+02 2.9859e+01 2.9859e+01 1.4744e-05 1.4744e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7800e-01 2.5156e+06 5.5315e+02 5.7509e+02 4.1638e-07 0.0000e+00 1.0000e+00 5.7509e+02 5.7509e+02 2.9374e+01 2.9374e+01 1.4732e-05 1.4732e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.6562e+02 4.2278e-07 0.0000e+00 1.0000e+00 5.6562e+02 5.6562e+02 2.8890e+01 2.8890e+01 1.4719e-05 1.4719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8200e-01 2.4364e+06 5.5315e+02 5.5615e+02 4.2939e-07 0.0000e+00 1.0000e+00 5.5615e+02 5.5615e+02 2.8407e+01 2.8407e+01 1.4707e-05 1.4707e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8400e-01 2.3968e+06 5.5315e+02 5.4670e+02 4.3622e-07 0.0000e+00 1.0000e+00 5.4670e+02 5.4670e+02 2.7924e+01 2.7924e+01 1.4696e-05 1.4696e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8600e-01 2.3572e+06 5.5315e+02 5.3727e+02 4.4327e-07 0.0000e+00 1.0000e+00 5.3727e+02 5.3727e+02 2.7442e+01 2.7442e+01 1.4684e-05 1.4684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8800e-01 2.3176e+06 5.5315e+02 5.2784e+02 4.5056e-07 0.0000e+00 1.0000e+00 5.2784e+02 5.2784e+02 2.6961e+01 2.6961e+01 1.4672e-05 1.4672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9000e-01 2.2780e+06 5.5315e+02 5.1843e+02 4.5810e-07 0.0000e+00 1.0000e+00 5.1843e+02 5.1843e+02 2.6480e+01 2.6480e+01 1.4660e-05 1.4660e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9200e-01 2.2384e+06 5.5315e+02 5.0903e+02 4.6590e-07 0.0000e+00 1.0000e+00 5.0903e+02 5.0903e+02 2.6000e+01 2.6000e+01 1.4649e-05 1.4649e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9400e-01 2.1988e+06 5.5315e+02 4.9965e+02 4.7399e-07 0.0000e+00 1.0000e+00 4.9965e+02 4.9965e+02 2.5521e+01 2.5521e+01 1.4638e-05 1.4638e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9600e-01 2.1592e+06 5.5315e+02 4.9028e+02 4.8237e-07 0.0000e+00 1.0000e+00 4.9028e+02 4.9028e+02 2.5042e+01 2.5042e+01 1.4626e-05 1.4626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9800e-01 2.1196e+06 5.5315e+02 4.8092e+02 4.9106e-07 0.0000e+00 1.0000e+00 4.8092e+02 4.8092e+02 2.4564e+01 2.4564e+01 1.4615e-05 1.4615e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7157e+02 5.0008e-07 0.0000e+00 1.0000e+00 4.7157e+02 4.7157e+02 2.4087e+01 2.4087e+01 1.4604e-05 1.4604e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0200e-01 2.0404e+06 5.5315e+02 4.6224e+02 5.0945e-07 0.0000e+00 1.0000e+00 4.6224e+02 4.6224e+02 2.3610e+01 2.3610e+01 1.4593e-05 1.4593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0400e-01 2.0008e+06 5.5315e+02 4.5292e+02 5.1919e-07 0.0000e+00 1.0000e+00 4.5292e+02 4.5292e+02 2.3134e+01 2.3134e+01 1.4582e-05 1.4582e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0600e-01 1.9612e+06 5.5315e+02 4.4362e+02 5.2932e-07 0.0000e+00 1.0000e+00 4.4362e+02 4.4362e+02 2.2659e+01 2.2659e+01 1.4571e-05 1.4571e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0800e-01 1.9216e+06 5.5315e+02 4.3432e+02 5.3986e-07 0.0000e+00 1.0000e+00 4.3432e+02 4.3432e+02 2.2184e+01 2.2184e+01 1.4561e-05 1.4561e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1000e-01 1.8820e+06 5.5315e+02 4.2505e+02 5.5085e-07 0.0000e+00 1.0000e+00 4.2505e+02 4.2505e+02 2.1710e+01 2.1710e+01 1.4550e-05 1.4550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1200e-01 1.8424e+06 5.5315e+02 4.1578e+02 5.6230e-07 0.0000e+00 1.0000e+00 4.1578e+02 4.1578e+02 2.1237e+01 2.1237e+01 1.4539e-05 1.4539e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1400e-01 1.8028e+06 5.5315e+02 4.0653e+02 5.7426e-07 0.0000e+00 1.0000e+00 4.0653e+02 4.0653e+02 2.0764e+01 2.0764e+01 1.4529e-05 1.4529e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1600e-01 1.7632e+06 5.5315e+02 3.9729e+02 5.8675e-07 0.0000e+00 1.0000e+00 3.9729e+02 3.9729e+02 2.0293e+01 2.0293e+01 1.4519e-05 1.4519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1800e-01 1.7236e+06 5.5315e+02 3.8807e+02 5.9982e-07 0.0000e+00 1.0000e+00 3.8807e+02 3.8807e+02 1.9821e+01 1.9821e+01 1.4509e-05 1.4509e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.7886e+02 6.1350e-07 0.0000e+00 1.0000e+00 3.7886e+02 3.7886e+02 1.9351e+01 1.9351e+01 1.4498e-05 1.4498e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2200e-01 1.6444e+06 5.5315e+02 3.6966e+02 6.2783e-07 0.0000e+00 1.0000e+00 3.6966e+02 3.6966e+02 1.8881e+01 1.8881e+01 1.4488e-05 1.4488e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2400e-01 1.6048e+06 5.5315e+02 3.6047e+02 6.4287e-07 0.0000e+00 1.0000e+00 3.6047e+02 3.6047e+02 1.8412e+01 1.8412e+01 1.4479e-05 1.4479e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2600e-01 1.5652e+06 5.5315e+02 3.5130e+02 6.5867e-07 0.0000e+00 1.0000e+00 3.5130e+02 3.5130e+02 1.7944e+01 1.7944e+01 1.4469e-05 1.4469e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2800e-01 1.5256e+06 5.5315e+02 3.4215e+02 6.7528e-07 0.0000e+00 1.0000e+00 3.4215e+02 3.4215e+02 1.7476e+01 1.7476e+01 1.4459e-05 1.4459e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3000e-01 1.4860e+06 5.5315e+02 3.3301e+02 6.9278e-07 0.0000e+00 1.0000e+00 3.3301e+02 3.3301e+02 1.7009e+01 1.7009e+01 1.4449e-05 1.4449e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3200e-01 1.4464e+06 5.5315e+02 3.2388e+02 7.1123e-07 0.0000e+00 1.0000e+00 3.2388e+02 3.2388e+02 1.6543e+01 1.6543e+01 1.4440e-05 1.4440e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3400e-01 1.4068e+06 5.5315e+02 3.1476e+02 7.3073e-07 0.0000e+00 1.0000e+00 3.1476e+02 3.1476e+02 1.6077e+01 1.6077e+01 1.4430e-05 1.4430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3600e-01 1.3672e+06 5.5315e+02 3.0566e+02 7.5135e-07 0.0000e+00 1.0000e+00 3.0566e+02 3.0566e+02 1.5612e+01 1.5612e+01 1.4421e-05 1.4421e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3800e-01 1.3276e+06 5.5315e+02 2.9657e+02 7.7319e-07 0.0000e+00 1.0000e+00 2.9657e+02 2.9657e+02 1.5148e+01 1.5148e+01 1.4412e-05 1.4412e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8750e+02 7.9638e-07 0.0000e+00 1.0000e+00 2.8750e+02 2.8750e+02 1.4685e+01 1.4685e+01 1.4403e-05 1.4403e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4200e-01 1.2484e+06 5.5315e+02 2.7844e+02 8.2104e-07 0.0000e+00 1.0000e+00 2.7844e+02 2.7844e+02 1.4222e+01 1.4222e+01 1.4394e-05 1.4394e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4400e-01 1.2088e+06 5.5315e+02 2.6939e+02 8.4731e-07 0.0000e+00 1.0000e+00 2.6939e+02 2.6939e+02 1.3760e+01 1.3760e+01 1.4385e-05 1.4385e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4600e-01 1.1692e+06 5.5315e+02 2.6036e+02 8.7535e-07 0.0000e+00 1.0000e+00 2.6036e+02 2.6036e+02 1.3299e+01 1.3299e+01 1.4376e-05 1.4376e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4800e-01 1.1296e+06 5.5315e+02 2.5134e+02 9.0536e-07 0.0000e+00 1.0000e+00 2.5134e+02 2.5134e+02 1.2838e+01 1.2838e+01 1.4367e-05 1.4367e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5000e-01 1.0900e+06 5.5315e+02 2.4234e+02 9.3755e-07 0.0000e+00 1.0000e+00 2.4234e+02 2.4234e+02 1.2378e+01 1.2378e+01 1.4358e-05 1.4358e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5200e-01 1.0504e+06 5.5315e+02 2.3335e+02 9.7216e-07 0.0000e+00 1.0000e+00 2.3335e+02 2.3335e+02 1.1919e+01 1.1919e+01 1.4350e-05 1.4350e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5400e-01 1.0108e+06 5.5315e+02 2.2437e+02 1.0095e-06 0.0000e+00 1.0000e+00 2.2437e+02 2.2437e+02 1.1460e+01 1.1460e+01 1.4341e-05 1.4341e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5600e-01 9.7120e+05 5.5315e+02 2.1541e+02 1.0499e-06 0.0000e+00 1.0000e+00 2.1541e+02 2.1541e+02 1.1003e+01 1.1003e+01 1.4333e-05 1.4333e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5800e-01 9.3160e+05 5.5315e+02 2.0646e+02 1.0936e-06 0.0000e+00 1.0000e+00 2.0646e+02 2.0646e+02 1.0545e+01 1.0545e+01 1.4324e-05 1.4324e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9753e+02 1.1413e-06 0.0000e+00 1.0000e+00 1.9753e+02 1.9753e+02 1.0089e+01 1.0089e+01 1.4316e-05 1.4316e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6200e-01 8.5240e+05 5.5315e+02 1.8861e+02 1.1934e-06 0.0000e+00 1.0000e+00 1.8861e+02 1.8861e+02 9.6335e+00 9.6335e+00 1.4308e-05 1.4308e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6400e-01 8.1280e+05 5.5315e+02 1.7970e+02 1.2506e-06 0.0000e+00 1.0000e+00 1.7970e+02 1.7970e+02 9.1786e+00 9.1786e+00 1.4300e-05 1.4300e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6600e-01 7.7320e+05 5.5315e+02 1.7081e+02 1.3136e-06 0.0000e+00 1.0000e+00 1.7081e+02 1.7081e+02 8.7244e+00 8.7244e+00 1.4292e-05 1.4292e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6800e-01 7.3360e+05 5.5315e+02 1.6193e+02 1.3835e-06 0.0000e+00 1.0000e+00 1.6193e+02 1.6193e+02 8.2709e+00 8.2709e+00 1.4284e-05 1.4284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7000e-01 6.9400e+05 5.5315e+02 1.5306e+02 1.4613e-06 0.0000e+00 1.0000e+00 1.5306e+02 1.5306e+02 7.8181e+00 7.8181e+00 1.4276e-05 1.4276e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7200e-01 6.5440e+05 5.5315e+02 1.4421e+02 1.5485e-06 0.0000e+00 1.0000e+00 1.4421e+02 1.4421e+02 7.3661e+00 7.3661e+00 1.4269e-05 1.4269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7400e-01 6.1480e+05 5.5315e+02 1.3538e+02 1.6470e-06 0.0000e+00 1.0000e+00 1.3538e+02 1.3538e+02 6.9147e+00 6.9147e+00 1.4261e-05 1.4261e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7600e-01 5.7520e+05 5.5315e+02 1.2656e+02 1.7590e-06 0.0000e+00 1.0000e+00 1.2656e+02 1.2656e+02 6.4641e+00 6.4641e+00 1.4253e-05 1.4253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7800e-01 5.3560e+05 5.5315e+02 1.1775e+02 1.8875e-06 0.0000e+00 1.0000e+00 1.1775e+02 1.1775e+02 6.0142e+00 6.0142e+00 1.4246e-05 1.4246e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0895e+02 2.0366e-06 0.0000e+00 1.0000e+00 1.0895e+02 1.0895e+02 5.5650e+00 5.5650e+00 1.4239e-05 1.4239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8200e-01 4.5640e+05 5.5315e+02 1.0017e+02 2.2116e-06 0.0000e+00 1.0000e+00 1.0017e+02 1.0017e+02 5.1166e+00 5.1166e+00 1.4231e-05 1.4231e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8400e-01 4.1680e+05 5.5315e+02 9.1407e+01 2.4197e-06 0.0000e+00 1.0000e+00 9.1407e+01 9.1407e+01 4.6688e+00 4.6688e+00 1.4224e-05 1.4224e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8600e-01 3.7720e+05 5.5315e+02 8.2656e+01 2.6716e-06 0.0000e+00 1.0000e+00 8.2656e+01 8.2656e+01 4.2218e+00 4.2218e+00 1.4217e-05 1.4217e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8800e-01 3.3760e+05 5.5315e+02 7.3918e+01 2.9826e-06 0.0000e+00 1.0000e+00 7.3918e+01 7.3918e+01 3.7755e+00 3.7755e+00 1.4210e-05 1.4210e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9000e-01 2.9800e+05 5.5315e+02 6.5194e+01 3.3763e-06 0.0000e+00 1.0000e+00 6.5194e+01 6.5194e+01 3.3300e+00 3.3300e+00 1.4203e-05 1.4203e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9200e-01 2.5840e+05 5.5315e+02 5.6485e+01 3.8906e-06 0.0000e+00 1.0000e+00 5.6485e+01 5.6485e+01 2.8851e+00 2.8851e+00 1.4196e-05 1.4196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9400e-01 2.1880e+05 5.5315e+02 4.7790e+01 4.5910e-06 0.0000e+00 1.0000e+00 4.7790e+01 4.7790e+01 2.4410e+00 2.4410e+00 1.4189e-05 1.4189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9600e-01 1.7920e+05 5.5315e+02 3.9108e+01 5.6010e-06 0.0000e+00 1.0000e+00 3.9108e+01 3.9108e+01 1.9975e+00 1.9975e+00 1.4183e-05 1.4183e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9800e-01 1.3960e+05 5.5315e+02 3.0441e+01 7.1840e-06 0.0000e+00 1.0000e+00 3.0441e+01 3.0441e+01 1.5549e+00 1.5549e+00 1.4176e-05 1.4176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1788e+01 1.0021e-05 0.0000e+00 1.0000e+00 2.1788e+01 2.1788e+01 1.1129e+00 1.1129e+00 1.4170e-05 1.4170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0020e+00 1.3960e+05 5.8315e+02 2.8855e+01 7.1791e-06 0.0000e+00 1.0000e+00 2.8855e+01 2.8855e+01 1.4739e+00 1.4739e+00 1.4780e-05 1.4780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0040e+00 1.7920e+05 5.8315e+02 3.7064e+01 5.5961e-06 0.0000e+00 1.0000e+00 3.7064e+01 3.7064e+01 1.8931e+00 1.8931e+00 1.4786e-05 1.4786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0060e+00 2.1880e+05 5.8315e+02 4.5282e+01 4.5861e-06 0.0000e+00 1.0000e+00 4.5282e+01 4.5282e+01 2.3129e+00 2.3129e+00 1.4793e-05 1.4793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0080e+00 2.5840e+05 5.8315e+02 5.3511e+01 3.8856e-06 0.0000e+00 1.0000e+00 5.3511e+01 5.3511e+01 2.7332e+00 2.7332e+00 1.4799e-05 1.4799e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0100e+00 2.9800e+05 5.8315e+02 6.1750e+01 3.3713e-06 0.0000e+00 1.0000e+00 6.1750e+01 6.1750e+01 3.1540e+00 3.1540e+00 1.4806e-05 1.4806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0120e+00 3.3760e+05 5.8315e+02 6.9999e+01 2.9777e-06 0.0000e+00 1.0000e+00 6.9999e+01 6.9999e+01 3.5754e+00 3.5754e+00 1.4812e-05 1.4812e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0140e+00 3.7720e+05 5.8315e+02 7.8258e+01 2.6667e-06 0.0000e+00 1.0000e+00 7.8258e+01 7.8258e+01 3.9972e+00 3.9972e+00 1.4819e-05 1.4819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0160e+00 4.1680e+05 5.8315e+02 8.6527e+01 2.4148e-06 0.0000e+00 1.0000e+00 8.6527e+01 8.6527e+01 4.4196e+00 4.4196e+00 1.4825e-05 1.4825e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0180e+00 4.5640e+05 5.8315e+02 9.4806e+01 2.2066e-06 0.0000e+00 1.0000e+00 9.4806e+01 9.4806e+01 4.8424e+00 4.8424e+00 1.4832e-05 1.4832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0310e+02 2.0316e-06 0.0000e+00 1.0000e+00 1.0310e+02 1.0310e+02 5.2658e+00 5.2658e+00 1.4839e-05 1.4839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0220e+00 5.3560e+05 5.8315e+02 1.1139e+02 1.8825e-06 0.0000e+00 1.0000e+00 1.1139e+02 1.1139e+02 5.6897e+00 5.6897e+00 1.4846e-05 1.4846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0240e+00 5.7520e+05 5.8315e+02 1.1970e+02 1.7539e-06 0.0000e+00 1.0000e+00 1.1970e+02 1.1970e+02 6.1141e+00 6.1141e+00 1.4853e-05 1.4853e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0260e+00 6.1480e+05 5.8315e+02 1.2802e+02 1.6419e-06 0.0000e+00 1.0000e+00 1.2802e+02 1.2802e+02 6.5391e+00 6.5391e+00 1.4860e-05 1.4860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0280e+00 6.5440e+05 5.8315e+02 1.3635e+02 1.5435e-06 0.0000e+00 1.0000e+00 1.3635e+02 1.3635e+02 6.9645e+00 6.9645e+00 1.4867e-05 1.4867e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0300e+00 6.9400e+05 5.8315e+02 1.4469e+02 1.4562e-06 0.0000e+00 1.0000e+00 1.4469e+02 1.4469e+02 7.3904e+00 7.3904e+00 1.4874e-05 1.4874e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0320e+00 7.3360e+05 5.8315e+02 1.5304e+02 1.3784e-06 0.0000e+00 1.0000e+00 1.5304e+02 1.5304e+02 7.8168e+00 7.8168e+00 1.4882e-05 1.4882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0340e+00 7.7320e+05 5.8315e+02 1.6140e+02 1.3086e-06 0.0000e+00 1.0000e+00 1.6140e+02 1.6140e+02 8.2438e+00 8.2438e+00 1.4889e-05 1.4889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0360e+00 8.1280e+05 5.8315e+02 1.6977e+02 1.2455e-06 0.0000e+00 1.0000e+00 1.6977e+02 1.6977e+02 8.6712e+00 8.6712e+00 1.4896e-05 1.4896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0380e+00 8.5240e+05 5.8315e+02 1.7814e+02 1.1883e-06 0.0000e+00 1.0000e+00 1.7814e+02 1.7814e+02 9.0992e+00 9.0992e+00 1.4904e-05 1.4904e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8653e+02 1.1362e-06 0.0000e+00 1.0000e+00 1.8653e+02 1.8653e+02 9.5276e+00 9.5276e+00 1.4911e-05 1.4911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0420e+00 9.3160e+05 5.8315e+02 1.9493e+02 1.0885e-06 0.0000e+00 1.0000e+00 1.9493e+02 1.9493e+02 9.9566e+00 9.9566e+00 1.4919e-05 1.4919e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0440e+00 9.7120e+05 5.8315e+02 2.0334e+02 1.0447e-06 0.0000e+00 1.0000e+00 2.0334e+02 2.0334e+02 1.0386e+01 1.0386e+01 1.4927e-05 1.4927e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0460e+00 1.0108e+06 5.8315e+02 2.1176e+02 1.0044e-06 0.0000e+00 1.0000e+00 2.1176e+02 2.1176e+02 1.0816e+01 1.0816e+01 1.4935e-05 1.4935e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0480e+00 1.0504e+06 5.8315e+02 2.2018e+02 9.6704e-07 0.0000e+00 1.0000e+00 2.2018e+02 2.2018e+02 1.1246e+01 1.1246e+01 1.4943e-05 1.4943e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0500e+00 1.0900e+06 5.8315e+02 2.2862e+02 9.3242e-07 0.0000e+00 1.0000e+00 2.2862e+02 2.2862e+02 1.1677e+01 1.1677e+01 1.4951e-05 1.4951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0520e+00 1.1296e+06 5.8315e+02 2.3707e+02 9.0022e-07 0.0000e+00 1.0000e+00 2.3707e+02 2.3707e+02 1.2109e+01 1.2109e+01 1.4959e-05 1.4959e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0540e+00 1.1692e+06 5.8315e+02 2.4552e+02 8.7021e-07 0.0000e+00 1.0000e+00 2.4552e+02 2.4552e+02 1.2541e+01 1.2541e+01 1.4967e-05 1.4967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0560e+00 1.2088e+06 5.8315e+02 2.5399e+02 8.4215e-07 0.0000e+00 1.0000e+00 2.5399e+02 2.5399e+02 1.2973e+01 1.2973e+01 1.4975e-05 1.4975e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0580e+00 1.2484e+06 5.8315e+02 2.6246e+02 8.1588e-07 0.0000e+00 1.0000e+00 2.6246e+02 2.6246e+02 1.3406e+01 1.3406e+01 1.4983e-05 1.4983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7095e+02 7.9121e-07 0.0000e+00 1.0000e+00 2.7095e+02 2.7095e+02 1.3839e+01 1.3839e+01 1.4991e-05 1.4991e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0620e+00 1.3276e+06 5.8315e+02 2.7944e+02 7.6802e-07 0.0000e+00 1.0000e+00 2.7944e+02 2.7944e+02 1.4273e+01 1.4273e+01 1.5000e-05 1.5000e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0640e+00 1.3672e+06 5.8315e+02 2.8794e+02 7.4616e-07 0.0000e+00 1.0000e+00 2.8794e+02 2.8794e+02 1.4707e+01 1.4707e+01 1.5008e-05 1.5008e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0660e+00 1.4068e+06 5.8315e+02 2.9646e+02 7.2554e-07 0.0000e+00 1.0000e+00 2.9646e+02 2.9646e+02 1.5142e+01 1.5142e+01 1.5017e-05 1.5017e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0680e+00 1.4464e+06 5.8315e+02 3.0498e+02 7.0604e-07 0.0000e+00 1.0000e+00 3.0498e+02 3.0498e+02 1.5578e+01 1.5578e+01 1.5026e-05 1.5026e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0700e+00 1.4860e+06 5.8315e+02 3.1351e+02 6.8758e-07 0.0000e+00 1.0000e+00 3.1351e+02 3.1351e+02 1.6013e+01 1.6013e+01 1.5034e-05 1.5034e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0720e+00 1.5256e+06 5.8315e+02 3.2205e+02 6.7007e-07 0.0000e+00 1.0000e+00 3.2205e+02 3.2205e+02 1.6450e+01 1.6450e+01 1.5043e-05 1.5043e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0740e+00 1.5652e+06 5.8315e+02 3.3060e+02 6.5345e-07 0.0000e+00 1.0000e+00 3.3060e+02 3.3060e+02 1.6886e+01 1.6886e+01 1.5052e-05 1.5052e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0760e+00 1.6048e+06 5.8315e+02 3.3916e+02 6.3765e-07 0.0000e+00 1.0000e+00 3.3916e+02 3.3916e+02 1.7324e+01 1.7324e+01 1.5061e-05 1.5061e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0780e+00 1.6444e+06 5.8315e+02 3.4773e+02 6.2260e-07 0.0000e+00 1.0000e+00 3.4773e+02 3.4773e+02 1.7761e+01 1.7761e+01 1.5070e-05 1.5070e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5631e+02 6.0826e-07 0.0000e+00 1.0000e+00 3.5631e+02 3.5631e+02 1.8199e+01 1.8199e+01 1.5079e-05 1.5079e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0820e+00 1.7236e+06 5.8315e+02 3.6490e+02 5.9458e-07 0.0000e+00 1.0000e+00 3.6490e+02 3.6490e+02 1.8638e+01 1.8638e+01 1.5089e-05 1.5089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0840e+00 1.7632e+06 5.8315e+02 3.7349e+02 5.8151e-07 0.0000e+00 1.0000e+00 3.7349e+02 3.7349e+02 1.9077e+01 1.9077e+01 1.5098e-05 1.5098e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0860e+00 1.8028e+06 5.8315e+02 3.8210e+02 5.6901e-07 0.0000e+00 1.0000e+00 3.8210e+02 3.8210e+02 1.9517e+01 1.9517e+01 1.5107e-05 1.5107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0880e+00 1.8424e+06 5.8315e+02 3.9071e+02 5.5705e-07 0.0000e+00 1.0000e+00 3.9071e+02 3.9071e+02 1.9957e+01 1.9957e+01 1.5117e-05 1.5117e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0900e+00 1.8820e+06 5.8315e+02 3.9934e+02 5.4559e-07 0.0000e+00 1.0000e+00 3.9934e+02 3.9934e+02 2.0397e+01 2.0397e+01 1.5126e-05 1.5126e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0920e+00 1.9216e+06 5.8315e+02 4.0797e+02 5.3460e-07 0.0000e+00 1.0000e+00 4.0797e+02 4.0797e+02 2.0838e+01 2.0838e+01 1.5136e-05 1.5136e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0940e+00 1.9612e+06 5.8315e+02 4.1661e+02 5.2405e-07 0.0000e+00 1.0000e+00 4.1661e+02 4.1661e+02 2.1279e+01 2.1279e+01 1.5146e-05 1.5146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0960e+00 2.0008e+06 5.8315e+02 4.2526e+02 5.1392e-07 0.0000e+00 1.0000e+00 4.2526e+02 4.2526e+02 2.1721e+01 2.1721e+01 1.5155e-05 1.5155e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0980e+00 2.0404e+06 5.8315e+02 4.3392e+02 5.0418e-07 0.0000e+00 1.0000e+00 4.3392e+02 4.3392e+02 2.2163e+01 2.2163e+01 1.5165e-05 1.5165e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4259e+02 4.9480e-07 0.0000e+00 1.0000e+00 4.4259e+02 4.4259e+02 2.2606e+01 2.2606e+01 1.5175e-05 1.5175e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1020e+00 2.1196e+06 5.8315e+02 4.5126e+02 4.8578e-07 0.0000e+00 1.0000e+00 4.5126e+02 4.5126e+02 2.3049e+01 2.3049e+01 1.5185e-05 1.5185e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1040e+00 2.1592e+06 5.8315e+02 4.5995e+02 4.7708e-07 0.0000e+00 1.0000e+00 4.5995e+02 4.5995e+02 2.3493e+01 2.3493e+01 1.5196e-05 1.5196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1060e+00 2.1988e+06 5.8315e+02 4.6864e+02 4.6870e-07 0.0000e+00 1.0000e+00 4.6864e+02 4.6864e+02 2.3937e+01 2.3937e+01 1.5206e-05 1.5206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1080e+00 2.2384e+06 5.8315e+02 4.7734e+02 4.6061e-07 0.0000e+00 1.0000e+00 4.7734e+02 4.7734e+02 2.4381e+01 2.4381e+01 1.5216e-05 1.5216e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1100e+00 2.2780e+06 5.8315e+02 4.8605e+02 4.5280e-07 0.0000e+00 1.0000e+00 4.8605e+02 4.8605e+02 2.4826e+01 2.4826e+01 1.5226e-05 1.5226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1120e+00 2.3176e+06 5.8315e+02 4.9477e+02 4.4526e-07 0.0000e+00 1.0000e+00 4.9477e+02 4.9477e+02 2.5272e+01 2.5272e+01 1.5237e-05 1.5237e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1140e+00 2.3572e+06 5.8315e+02 5.0350e+02 4.3796e-07 0.0000e+00 1.0000e+00 5.0350e+02 5.0350e+02 2.5718e+01 2.5718e+01 1.5247e-05 1.5247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1160e+00 2.3968e+06 5.8315e+02 5.1224e+02 4.3091e-07 0.0000e+00 1.0000e+00 5.1224e+02 5.1224e+02 2.6164e+01 2.6164e+01 1.5258e-05 1.5258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1180e+00 2.4364e+06 5.8315e+02 5.2098e+02 4.2408e-07 0.0000e+00 1.0000e+00 5.2098e+02 5.2098e+02 2.6610e+01 2.6610e+01 1.5269e-05 1.5269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.2974e+02 4.1747e-07 0.0000e+00 1.0000e+00 5.2974e+02 5.2974e+02 2.7058e+01 2.7058e+01 1.5280e-05 1.5280e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1220e+00 2.5156e+06 5.8315e+02 5.3850e+02 4.1107e-07 0.0000e+00 1.0000e+00 5.3850e+02 5.3850e+02 2.7505e+01 2.7505e+01 1.5291e-05 1.5291e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1240e+00 2.5552e+06 5.8315e+02 5.4727e+02 4.0486e-07 0.0000e+00 1.0000e+00 5.4727e+02 5.4727e+02 2.7953e+01 2.7953e+01 1.5302e-05 1.5302e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1260e+00 2.5948e+06 5.8315e+02 5.5605e+02 3.9884e-07 0.0000e+00 1.0000e+00 5.5605e+02 5.5605e+02 2.8401e+01 2.8401e+01 1.5313e-05 1.5313e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1280e+00 2.6344e+06 5.8315e+02 5.6483e+02 3.9300e-07 0.0000e+00 1.0000e+00 5.6483e+02 5.6483e+02 2.8850e+01 2.8850e+01 1.5324e-05 1.5324e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1300e+00 2.6740e+06 5.8315e+02 5.7363e+02 3.8733e-07 0.0000e+00 1.0000e+00 5.7363e+02 5.7363e+02 2.9299e+01 2.9299e+01 1.5335e-05 1.5335e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1320e+00 2.7136e+06 5.8315e+02 5.8243e+02 3.8183e-07 0.0000e+00 1.0000e+00 5.8243e+02 5.8243e+02 2.9749e+01 2.9749e+01 1.5346e-05 1.5346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1340e+00 2.7532e+06 5.8315e+02 5.9124e+02 3.7648e-07 0.0000e+00 1.0000e+00 5.9124e+02 5.9124e+02 3.0199e+01 3.0199e+01 1.5358e-05 1.5358e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1360e+00 2.7928e+06 5.8315e+02 6.0006e+02 3.7128e-07 0.0000e+00 1.0000e+00 6.0006e+02 6.0006e+02 3.0649e+01 3.0649e+01 1.5369e-05 1.5369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1380e+00 2.8324e+06 5.8315e+02 6.0889e+02 3.6623e-07 0.0000e+00 1.0000e+00 6.0889e+02 6.0889e+02 3.1100e+01 3.1100e+01 1.5381e-05 1.5381e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.1772e+02 3.6131e-07 0.0000e+00 1.0000e+00 6.1772e+02 6.1772e+02 3.1552e+01 3.1552e+01 1.5393e-05 1.5393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1420e+00 2.9116e+06 5.8315e+02 6.2656e+02 3.5653e-07 0.0000e+00 1.0000e+00 6.2656e+02 6.2656e+02 3.2003e+01 3.2003e+01 1.5404e-05 1.5404e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1440e+00 2.9512e+06 5.8315e+02 6.3541e+02 3.5187e-07 0.0000e+00 1.0000e+00 6.3541e+02 6.3541e+02 3.2455e+01 3.2455e+01 1.5416e-05 1.5416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1460e+00 2.9908e+06 5.8315e+02 6.4427e+02 3.4733e-07 0.0000e+00 1.0000e+00 6.4427e+02 6.4427e+02 3.2908e+01 3.2908e+01 1.5428e-05 1.5428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1480e+00 3.0304e+06 5.8315e+02 6.5314e+02 3.4291e-07 0.0000e+00 1.0000e+00 6.5314e+02 6.5314e+02 3.3360e+01 3.3360e+01 1.5440e-05 1.5440e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1500e+00 3.0700e+06 5.8315e+02 6.6201e+02 3.3861e-07 0.0000e+00 1.0000e+00 6.6201e+02 6.6201e+02 3.3814e+01 3.3814e+01 1.5452e-05 1.5452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1520e+00 3.1096e+06 5.8315e+02 6.7089e+02 3.3441e-07 0.0000e+00 1.0000e+00 6.7089e+02 6.7089e+02 3.4267e+01 3.4267e+01 1.5465e-05 1.5465e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1540e+00 3.1492e+06 5.8315e+02 6.7978e+02 3.3031e-07 0.0000e+00 1.0000e+00 6.7978e+02 6.7978e+02 3.4721e+01 3.4721e+01 1.5477e-05 1.5477e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1560e+00 3.1888e+06 5.8315e+02 6.8867e+02 3.2632e-07 0.0000e+00 1.0000e+00 6.8867e+02 6.8867e+02 3.5176e+01 3.5176e+01 1.5489e-05 1.5489e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1580e+00 3.2284e+06 5.8315e+02 6.9758e+02 3.2242e-07 0.0000e+00 1.0000e+00 6.9758e+02 6.9758e+02 3.5630e+01 3.5630e+01 1.5502e-05 1.5502e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.0649e+02 3.1862e-07 0.0000e+00 1.0000e+00 7.0649e+02 7.0649e+02 3.6085e+01 3.6085e+01 1.5514e-05 1.5514e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1620e+00 3.3076e+06 5.8315e+02 7.1540e+02 3.1490e-07 0.0000e+00 1.0000e+00 7.1540e+02 7.1540e+02 3.6541e+01 3.6541e+01 1.5527e-05 1.5527e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1640e+00 3.3472e+06 5.8315e+02 7.2433e+02 3.1127e-07 0.0000e+00 1.0000e+00 7.2433e+02 7.2433e+02 3.6997e+01 3.6997e+01 1.5540e-05 1.5540e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1660e+00 3.3868e+06 5.8315e+02 7.3326e+02 3.0772e-07 0.0000e+00 1.0000e+00 7.3326e+02 7.3326e+02 3.7453e+01 3.7453e+01 1.5553e-05 1.5553e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1680e+00 3.4264e+06 5.8315e+02 7.4220e+02 3.0426e-07 0.0000e+00 1.0000e+00 7.4220e+02 7.4220e+02 3.7910e+01 3.7910e+01 1.5566e-05 1.5566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1700e+00 3.4660e+06 5.8315e+02 7.5115e+02 3.0087e-07 0.0000e+00 1.0000e+00 7.5115e+02 7.5115e+02 3.8367e+01 3.8367e+01 1.5579e-05 1.5579e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1720e+00 3.5056e+06 5.8315e+02 7.6010e+02 2.9756e-07 0.0000e+00 1.0000e+00 7.6010e+02 7.6010e+02 3.8824e+01 3.8824e+01 1.5592e-05 1.5592e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1740e+00 3.5452e+06 5.8315e+02 7.6906e+02 2.9432e-07 0.0000e+00 1.0000e+00 7.6906e+02 7.6906e+02 3.9281e+01 3.9281e+01 1.5605e-05 1.5605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1760e+00 3.5848e+06 5.8315e+02 7.7803e+02 2.9115e-07 0.0000e+00 1.0000e+00 7.7803e+02 7.7803e+02 3.9739e+01 3.9739e+01 1.5618e-05 1.5618e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1780e+00 3.6244e+06 5.8315e+02 7.8700e+02 2.8804e-07 0.0000e+00 1.0000e+00 7.8700e+02 7.8700e+02 4.0198e+01 4.0198e+01 1.5632e-05 1.5632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 7.9598e+02 2.8501e-07 0.0000e+00 1.0000e+00 7.9598e+02 7.9598e+02 4.0656e+01 4.0656e+01 1.5645e-05 1.5645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1820e+00 3.7036e+06 5.8315e+02 8.0497e+02 2.8203e-07 0.0000e+00 1.0000e+00 8.0497e+02 8.0497e+02 4.1116e+01 4.1116e+01 1.5659e-05 1.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1840e+00 3.7432e+06 5.8315e+02 8.1396e+02 2.7912e-07 0.0000e+00 1.0000e+00 8.1396e+02 8.1396e+02 4.1575e+01 4.1575e+01 1.5673e-05 1.5673e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1860e+00 3.7828e+06 5.8315e+02 8.2296e+02 2.7627e-07 0.0000e+00 1.0000e+00 8.2296e+02 8.2296e+02 4.2035e+01 4.2035e+01 1.5686e-05 1.5686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1880e+00 3.8224e+06 5.8315e+02 8.3197e+02 2.7347e-07 0.0000e+00 1.0000e+00 8.3197e+02 8.3197e+02 4.2495e+01 4.2495e+01 1.5700e-05 1.5700e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1900e+00 3.8620e+06 5.8315e+02 8.4098e+02 2.7073e-07 0.0000e+00 1.0000e+00 8.4098e+02 8.4098e+02 4.2955e+01 4.2955e+01 1.5714e-05 1.5714e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1920e+00 3.9016e+06 5.8315e+02 8.5000e+02 2.6805e-07 0.0000e+00 1.0000e+00 8.5000e+02 8.5000e+02 4.3416e+01 4.3416e+01 1.5728e-05 1.5728e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1940e+00 3.9412e+06 5.8315e+02 8.5902e+02 2.6541e-07 0.0000e+00 1.0000e+00 8.5902e+02 8.5902e+02 4.3877e+01 4.3877e+01 1.5742e-05 1.5742e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1960e+00 3.9808e+06 5.8315e+02 8.6806e+02 2.6283e-07 0.0000e+00 1.0000e+00 8.6806e+02 8.6806e+02 4.4338e+01 4.4338e+01 1.5757e-05 1.5757e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1980e+00 4.0204e+06 5.8315e+02 8.7709e+02 2.6030e-07 0.0000e+00 1.0000e+00 8.7709e+02 8.7709e+02 4.4800e+01 4.4800e+01 1.5771e-05 1.5771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 8.8614e+02 2.5781e-07 0.0000e+00 1.0000e+00 8.8614e+02 8.8614e+02 4.5262e+01 4.5262e+01 1.5785e-05 1.5785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2020e+00 4.0996e+06 5.8315e+02 8.9519e+02 2.5538e-07 0.0000e+00 1.0000e+00 8.9519e+02 8.9519e+02 4.5724e+01 4.5724e+01 1.5800e-05 1.5800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2040e+00 4.1392e+06 5.8315e+02 9.0424e+02 2.5298e-07 0.0000e+00 1.0000e+00 9.0424e+02 9.0424e+02 4.6186e+01 4.6186e+01 1.5815e-05 1.5815e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2060e+00 4.1788e+06 5.8315e+02 9.1330e+02 2.5063e-07 0.0000e+00 1.0000e+00 9.1330e+02 9.1330e+02 4.6649e+01 4.6649e+01 1.5829e-05 1.5829e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2080e+00 4.2184e+06 5.8315e+02 9.2237e+02 2.4833e-07 0.0000e+00 1.0000e+00 9.2237e+02 9.2237e+02 4.7112e+01 4.7112e+01 1.5844e-05 1.5844e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2100e+00 4.2580e+06 5.8315e+02 9.3145e+02 2.4606e-07 0.0000e+00 1.0000e+00 9.3145e+02 9.3145e+02 4.7576e+01 4.7576e+01 1.5859e-05 1.5859e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2120e+00 4.2976e+06 5.8315e+02 9.4052e+02 2.4384e-07 0.0000e+00 1.0000e+00 9.4052e+02 9.4052e+02 4.8039e+01 4.8039e+01 1.5874e-05 1.5874e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2140e+00 4.3372e+06 5.8315e+02 9.4961e+02 2.4165e-07 0.0000e+00 1.0000e+00 9.4961e+02 9.4961e+02 4.8503e+01 4.8503e+01 1.5889e-05 1.5889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2160e+00 4.3768e+06 5.8315e+02 9.5870e+02 2.3951e-07 0.0000e+00 1.0000e+00 9.5870e+02 9.5870e+02 4.8968e+01 4.8968e+01 1.5905e-05 1.5905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2180e+00 4.4164e+06 5.8315e+02 9.6779e+02 2.3740e-07 0.0000e+00 1.0000e+00 9.6779e+02 9.6779e+02 4.9432e+01 4.9432e+01 1.5920e-05 1.5920e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.7690e+02 2.3532e-07 0.0000e+00 1.0000e+00 9.7690e+02 9.7690e+02 4.9897e+01 4.9897e+01 1.5935e-05 1.5935e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2220e+00 4.4956e+06 5.8315e+02 9.8600e+02 2.3328e-07 0.0000e+00 1.0000e+00 9.8600e+02 9.8600e+02 5.0362e+01 5.0362e+01 1.5951e-05 1.5951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2240e+00 4.5352e+06 5.8315e+02 9.9511e+02 2.3128e-07 0.0000e+00 1.0000e+00 9.9511e+02 9.9511e+02 5.0828e+01 5.0828e+01 1.5966e-05 1.5966e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2260e+00 4.5748e+06 5.8315e+02 1.0042e+03 2.2931e-07 0.0000e+00 1.0000e+00 1.0042e+03 1.0042e+03 5.1293e+01 5.1293e+01 1.5982e-05 1.5982e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2280e+00 4.6144e+06 5.8315e+02 1.0134e+03 2.2737e-07 0.0000e+00 1.0000e+00 1.0134e+03 1.0134e+03 5.1759e+01 5.1759e+01 1.5998e-05 1.5998e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2300e+00 4.6540e+06 5.8315e+02 1.0225e+03 2.2546e-07 0.0000e+00 1.0000e+00 1.0225e+03 1.0225e+03 5.2225e+01 5.2225e+01 1.6014e-05 1.6014e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2320e+00 4.6936e+06 5.8315e+02 1.0316e+03 2.2358e-07 0.0000e+00 1.0000e+00 1.0316e+03 1.0316e+03 5.2692e+01 5.2692e+01 1.6030e-05 1.6030e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2340e+00 4.7332e+06 5.8315e+02 1.0407e+03 2.2174e-07 0.0000e+00 1.0000e+00 1.0407e+03 1.0407e+03 5.3158e+01 5.3158e+01 1.6046e-05 1.6046e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2360e+00 4.7728e+06 5.8315e+02 1.0499e+03 2.1992e-07 0.0000e+00 1.0000e+00 1.0499e+03 1.0499e+03 5.3625e+01 5.3625e+01 1.6062e-05 1.6062e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2380e+00 4.8124e+06 5.8315e+02 1.0590e+03 2.1813e-07 0.0000e+00 1.0000e+00 1.0590e+03 1.0590e+03 5.4092e+01 5.4092e+01 1.6078e-05 1.6078e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0682e+03 2.1637e-07 0.0000e+00 1.0000e+00 1.0682e+03 1.0682e+03 5.4560e+01 5.4560e+01 1.6095e-05 1.6095e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2420e+00 4.8916e+06 5.8315e+02 1.0773e+03 2.1464e-07 0.0000e+00 1.0000e+00 1.0773e+03 1.0773e+03 5.5027e+01 5.5027e+01 1.6111e-05 1.6111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2440e+00 4.9312e+06 5.8315e+02 1.0865e+03 2.1293e-07 0.0000e+00 1.0000e+00 1.0865e+03 1.0865e+03 5.5495e+01 5.5495e+01 1.6128e-05 1.6128e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2460e+00 4.9708e+06 5.8315e+02 1.0957e+03 2.1125e-07 0.0000e+00 1.0000e+00 1.0957e+03 1.0957e+03 5.5963e+01 5.5963e+01 1.6144e-05 1.6144e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2480e+00 5.0104e+06 5.8315e+02 1.1048e+03 2.0959e-07 0.0000e+00 1.0000e+00 1.1048e+03 1.1048e+03 5.6432e+01 5.6432e+01 1.6161e-05 1.6161e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2500e+00 5.0500e+06 5.8315e+02 1.1140e+03 2.0796e-07 0.0000e+00 1.0000e+00 1.1140e+03 1.1140e+03 5.6900e+01 5.6900e+01 1.6178e-05 1.6178e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2520e+00 5.0896e+06 5.8315e+02 1.1232e+03 2.0636e-07 0.0000e+00 1.0000e+00 1.1232e+03 1.1232e+03 5.7369e+01 5.7369e+01 1.6195e-05 1.6195e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2540e+00 5.1292e+06 5.8315e+02 1.1324e+03 2.0477e-07 0.0000e+00 1.0000e+00 1.1324e+03 1.1324e+03 5.7838e+01 5.7838e+01 1.6212e-05 1.6212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2560e+00 5.1688e+06 5.8315e+02 1.1415e+03 2.0321e-07 0.0000e+00 1.0000e+00 1.1415e+03 1.1415e+03 5.8307e+01 5.8307e+01 1.6229e-05 1.6229e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2580e+00 5.2084e+06 5.8315e+02 1.1507e+03 2.0167e-07 0.0000e+00 1.0000e+00 1.1507e+03 1.1507e+03 5.8776e+01 5.8776e+01 1.6247e-05 1.6247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1599e+03 2.0016e-07 0.0000e+00 1.0000e+00 1.1599e+03 1.1599e+03 5.9246e+01 5.9246e+01 1.6264e-05 1.6264e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2620e+00 5.2876e+06 5.8315e+02 1.1691e+03 1.9866e-07 0.0000e+00 1.0000e+00 1.1691e+03 1.1691e+03 5.9715e+01 5.9715e+01 1.6281e-05 1.6281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2640e+00 5.3272e+06 5.8315e+02 1.1783e+03 1.9719e-07 0.0000e+00 1.0000e+00 1.1783e+03 1.1783e+03 6.0185e+01 6.0185e+01 1.6299e-05 1.6299e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2660e+00 5.3668e+06 5.8315e+02 1.1875e+03 1.9573e-07 0.0000e+00 1.0000e+00 1.1875e+03 1.1875e+03 6.0655e+01 6.0655e+01 1.6317e-05 1.6317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2680e+00 5.4064e+06 5.8315e+02 1.1967e+03 1.9430e-07 0.0000e+00 1.0000e+00 1.1967e+03 1.1967e+03 6.1125e+01 6.1125e+01 1.6334e-05 1.6334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2700e+00 5.4460e+06 5.8315e+02 1.2059e+03 1.9289e-07 0.0000e+00 1.0000e+00 1.2059e+03 1.2059e+03 6.1596e+01 6.1596e+01 1.6352e-05 1.6352e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2720e+00 5.4856e+06 5.8315e+02 1.2151e+03 1.9149e-07 0.0000e+00 1.0000e+00 1.2151e+03 1.2151e+03 6.2066e+01 6.2066e+01 1.6370e-05 1.6370e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2740e+00 5.5252e+06 5.8315e+02 1.2244e+03 1.9011e-07 0.0000e+00 1.0000e+00 1.2244e+03 1.2244e+03 6.2537e+01 6.2537e+01 1.6388e-05 1.6388e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2760e+00 5.5648e+06 5.8315e+02 1.2336e+03 1.8876e-07 0.0000e+00 1.0000e+00 1.2336e+03 1.2336e+03 6.3008e+01 6.3008e+01 1.6407e-05 1.6407e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2780e+00 5.6044e+06 5.8315e+02 1.2428e+03 1.8742e-07 0.0000e+00 1.0000e+00 1.2428e+03 1.2428e+03 6.3479e+01 6.3479e+01 1.6425e-05 1.6425e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2520e+03 1.8609e-07 0.0000e+00 1.0000e+00 1.2520e+03 1.2520e+03 6.3950e+01 6.3950e+01 1.6443e-05 1.6443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2820e+00 5.6836e+06 5.8315e+02 1.2613e+03 1.8479e-07 0.0000e+00 1.0000e+00 1.2613e+03 1.2613e+03 6.4422e+01 6.4422e+01 1.6462e-05 1.6462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2840e+00 5.7232e+06 5.8315e+02 1.2705e+03 1.8350e-07 0.0000e+00 1.0000e+00 1.2705e+03 1.2705e+03 6.4893e+01 6.4893e+01 1.6480e-05 1.6480e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2860e+00 5.7628e+06 5.8315e+02 1.2797e+03 1.8223e-07 0.0000e+00 1.0000e+00 1.2797e+03 1.2797e+03 6.5365e+01 6.5365e+01 1.6499e-05 1.6499e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2880e+00 5.8024e+06 5.8315e+02 1.2890e+03 1.8097e-07 0.0000e+00 1.0000e+00 1.2890e+03 1.2890e+03 6.5836e+01 6.5836e+01 1.6518e-05 1.6518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2900e+00 5.8420e+06 5.8315e+02 1.2982e+03 1.7973e-07 0.0000e+00 1.0000e+00 1.2982e+03 1.2982e+03 6.6308e+01 6.6308e+01 1.6537e-05 1.6537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2920e+00 5.8816e+06 5.8315e+02 1.3074e+03 1.7851e-07 0.0000e+00 1.0000e+00 1.3074e+03 1.3074e+03 6.6780e+01 6.6780e+01 1.6556e-05 1.6556e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2940e+00 5.9212e+06 5.8315e+02 1.3167e+03 1.7730e-07 0.0000e+00 1.0000e+00 1.3167e+03 1.3167e+03 6.7252e+01 6.7252e+01 1.6575e-05 1.6575e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2960e+00 5.9608e+06 5.8315e+02 1.3259e+03 1.7611e-07 0.0000e+00 1.0000e+00 1.3259e+03 1.3259e+03 6.7725e+01 6.7725e+01 1.6594e-05 1.6594e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2980e+00 6.0004e+06 5.8315e+02 1.3352e+03 1.7493e-07 0.0000e+00 1.0000e+00 1.3352e+03 1.3352e+03 6.8197e+01 6.8197e+01 1.6613e-05 1.6613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3444e+03 1.7376e-07 0.0000e+00 1.0000e+00 1.3444e+03 1.3444e+03 6.8670e+01 6.8670e+01 1.6632e-05 1.6632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3020e+00 6.0796e+06 5.8315e+02 1.3537e+03 1.7261e-07 0.0000e+00 1.0000e+00 1.3537e+03 1.3537e+03 6.9142e+01 6.9142e+01 1.6652e-05 1.6652e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3040e+00 6.1192e+06 5.8315e+02 1.3629e+03 1.7147e-07 0.0000e+00 1.0000e+00 1.3629e+03 1.3629e+03 6.9615e+01 6.9615e+01 1.6672e-05 1.6672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3060e+00 6.1588e+06 5.8315e+02 1.3722e+03 1.7035e-07 0.0000e+00 1.0000e+00 1.3722e+03 1.3722e+03 7.0088e+01 7.0088e+01 1.6691e-05 1.6691e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3080e+00 6.1984e+06 5.8315e+02 1.3814e+03 1.6924e-07 0.0000e+00 1.0000e+00 1.3814e+03 1.3814e+03 7.0560e+01 7.0560e+01 1.6711e-05 1.6711e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3100e+00 6.2380e+06 5.8315e+02 1.3907e+03 1.6814e-07 0.0000e+00 1.0000e+00 1.3907e+03 1.3907e+03 7.1033e+01 7.1033e+01 1.6731e-05 1.6731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3120e+00 6.2776e+06 5.8315e+02 1.4000e+03 1.6705e-07 0.0000e+00 1.0000e+00 1.4000e+03 1.4000e+03 7.1506e+01 7.1506e+01 1.6751e-05 1.6751e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3140e+00 6.3172e+06 5.8315e+02 1.4092e+03 1.6598e-07 0.0000e+00 1.0000e+00 1.4092e+03 1.4092e+03 7.1979e+01 7.1979e+01 1.6771e-05 1.6771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3160e+00 6.3568e+06 5.8315e+02 1.4185e+03 1.6492e-07 0.0000e+00 1.0000e+00 1.4185e+03 1.4185e+03 7.2452e+01 7.2452e+01 1.6791e-05 1.6791e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3180e+00 6.3964e+06 5.8315e+02 1.4278e+03 1.6387e-07 0.0000e+00 1.0000e+00 1.4278e+03 1.4278e+03 7.2926e+01 7.2926e+01 1.6811e-05 1.6811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4370e+03 1.6283e-07 0.0000e+00 1.0000e+00 1.4370e+03 1.4370e+03 7.3399e+01 7.3399e+01 1.6832e-05 1.6832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3220e+00 6.4756e+06 5.8315e+02 1.4463e+03 1.6181e-07 0.0000e+00 1.0000e+00 1.4463e+03 1.4463e+03 7.3872e+01 7.3872e+01 1.6852e-05 1.6852e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3240e+00 6.5152e+06 5.8315e+02 1.4556e+03 1.6079e-07 0.0000e+00 1.0000e+00 1.4556e+03 1.4556e+03 7.4346e+01 7.4346e+01 1.6873e-05 1.6873e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3260e+00 6.5548e+06 5.8315e+02 1.4648e+03 1.5979e-07 0.0000e+00 1.0000e+00 1.4648e+03 1.4648e+03 7.4819e+01 7.4819e+01 1.6894e-05 1.6894e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3280e+00 6.5944e+06 5.8315e+02 1.4744e+03 1.7389e-07 6.4830e-04 9.9935e-01 3.1394e+03 1.4739e+03 4.0136e+02 7.5255e+01 4.8988e-05 1.6914e-05 3.3032e-03 7.1578e-04 1.5935e-01 4.8016e-02 4.6664e-02 3.0592e-02 1.7667e-02 1.6140e-02 6.7755e-01 9.0015e-03 3.0006e-03 5.3480e-01 1.1462e-01 8.7911e-02 4.5604e-02 2.0901e-02 1.5100e-02 1.6907e-01 +1.3300e+00 6.6340e+06 5.8315e+02 1.4846e+03 1.7240e-07 2.2825e-03 9.9772e-01 3.1426e+03 1.4828e+03 4.0095e+02 7.5633e+01 4.8940e-05 1.6935e-05 3.3231e-03 7.2092e-04 1.6040e-01 4.8286e-02 4.6894e-02 3.0721e-02 1.7728e-02 1.6184e-02 6.7574e-01 9.0052e-03 3.0021e-03 5.3504e-01 1.1466e-01 8.7938e-02 4.5614e-02 2.0903e-02 1.5099e-02 1.6874e-01 +1.3320e+00 6.6736e+06 5.8315e+02 1.4947e+03 1.7094e-07 3.8852e-03 9.9611e-01 3.1458e+03 1.4917e+03 4.0054e+02 7.6012e+01 4.8891e-05 1.6955e-05 3.3430e-03 7.2607e-04 1.6145e-01 4.8556e-02 4.7123e-02 3.0849e-02 1.7790e-02 1.6228e-02 6.7393e-01 9.0088e-03 3.0035e-03 5.3528e-01 1.1470e-01 8.7964e-02 4.5623e-02 2.0905e-02 1.5098e-02 1.6841e-01 +1.3340e+00 6.7132e+06 5.8315e+02 1.5048e+03 1.6950e-07 5.4569e-03 9.9454e-01 3.1490e+03 1.5005e+03 4.0013e+02 7.6392e+01 4.8843e-05 1.6976e-05 3.3628e-03 7.3123e-04 1.6250e-01 4.8825e-02 4.7351e-02 3.0977e-02 1.7850e-02 1.6271e-02 6.7213e-01 9.0124e-03 3.0050e-03 5.3552e-01 1.1474e-01 8.7989e-02 4.5632e-02 2.0907e-02 1.5097e-02 1.6809e-01 +1.3360e+00 6.7528e+06 5.8315e+02 1.5149e+03 1.6809e-07 6.9981e-03 9.9300e-01 3.1523e+03 1.5094e+03 3.9972e+02 7.6772e+01 4.8794e-05 1.6997e-05 3.3827e-03 7.3640e-04 1.6355e-01 4.9094e-02 4.7579e-02 3.1104e-02 1.7911e-02 1.6313e-02 6.7033e-01 9.0159e-03 3.0064e-03 5.3575e-01 1.1479e-01 8.8014e-02 4.5641e-02 2.0908e-02 1.5097e-02 1.6778e-01 +1.3380e+00 6.7924e+06 5.8315e+02 1.5250e+03 1.6669e-07 8.5092e-03 9.9149e-01 3.1555e+03 1.5183e+03 3.9931e+02 7.7153e+01 4.8746e-05 1.7017e-05 3.4025e-03 7.4158e-04 1.6460e-01 4.9363e-02 4.7806e-02 3.1230e-02 1.7970e-02 1.6355e-02 6.6853e-01 9.0193e-03 3.0078e-03 5.3598e-01 1.1482e-01 8.8038e-02 4.5650e-02 2.0910e-02 1.5096e-02 1.6748e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5350e+03 1.6531e-07 9.9906e-03 9.9001e-01 3.1587e+03 1.5271e+03 3.9889e+02 7.7535e+01 4.8697e-05 1.7038e-05 3.4224e-03 7.4676e-04 1.6566e-01 4.9631e-02 4.8032e-02 3.1356e-02 1.8029e-02 1.6397e-02 6.6673e-01 9.0226e-03 3.0091e-03 5.3620e-01 1.1486e-01 8.8062e-02 4.5658e-02 2.0912e-02 1.5095e-02 1.6718e-01 +1.3420e+00 6.8716e+06 5.8315e+02 1.5451e+03 1.6395e-07 1.1443e-02 9.8856e-01 3.1619e+03 1.5360e+03 3.9848e+02 7.7918e+01 4.8648e-05 1.7059e-05 3.4422e-03 7.5195e-04 1.6671e-01 4.9898e-02 4.8257e-02 3.1481e-02 1.8088e-02 1.6438e-02 6.6494e-01 9.0259e-03 3.0105e-03 5.3641e-01 1.1490e-01 8.8085e-02 4.5666e-02 2.0913e-02 1.5094e-02 1.6689e-01 +1.3440e+00 6.9112e+06 5.8315e+02 1.5551e+03 1.6261e-07 1.2866e-02 9.8713e-01 3.1651e+03 1.5449e+03 3.9806e+02 7.8301e+01 4.8599e-05 1.7079e-05 3.4619e-03 7.5715e-04 1.6776e-01 5.0165e-02 4.8481e-02 3.1605e-02 1.8146e-02 1.6478e-02 6.6315e-01 9.0291e-03 3.0118e-03 5.3663e-01 1.1494e-01 8.8107e-02 4.5674e-02 2.0914e-02 1.5093e-02 1.6661e-01 +1.3460e+00 6.9508e+06 5.8315e+02 1.5651e+03 1.6129e-07 1.4261e-02 9.8574e-01 3.1683e+03 1.5537e+03 3.9765e+02 7.8685e+01 4.8549e-05 1.7100e-05 3.4817e-03 7.6235e-04 1.6881e-01 5.0431e-02 4.8705e-02 3.1728e-02 1.8204e-02 1.6519e-02 6.6136e-01 9.0322e-03 3.0131e-03 5.3684e-01 1.1497e-01 8.8129e-02 4.5681e-02 2.0916e-02 1.5092e-02 1.6633e-01 +1.3480e+00 6.9904e+06 5.8315e+02 1.5751e+03 1.5999e-07 1.5628e-02 9.8437e-01 3.1716e+03 1.5626e+03 3.9723e+02 7.9070e+01 4.8500e-05 1.7121e-05 3.5014e-03 7.6757e-04 1.6986e-01 5.0697e-02 4.8927e-02 3.1851e-02 1.8261e-02 1.6558e-02 6.5957e-01 9.0353e-03 3.0143e-03 5.3704e-01 1.1501e-01 8.8150e-02 4.5688e-02 2.0917e-02 1.5091e-02 1.6605e-01 +1.3500e+00 7.0300e+06 5.8315e+02 1.5851e+03 1.5870e-07 1.6968e-02 9.8303e-01 3.1748e+03 1.5715e+03 3.9682e+02 7.9456e+01 4.8450e-05 1.7142e-05 3.5212e-03 7.7279e-04 1.7091e-01 5.0963e-02 4.9149e-02 3.1973e-02 1.8318e-02 1.6597e-02 6.5779e-01 9.0383e-03 3.0156e-03 5.3724e-01 1.1504e-01 8.8171e-02 4.5695e-02 2.0918e-02 1.5090e-02 1.6579e-01 +1.3520e+00 7.0696e+06 5.8315e+02 1.5950e+03 1.5744e-07 1.8280e-02 9.8172e-01 3.1780e+03 1.5804e+03 3.9640e+02 7.9843e+01 4.8400e-05 1.7162e-05 3.5409e-03 7.7802e-04 1.7197e-01 5.1227e-02 4.9370e-02 3.2094e-02 1.8374e-02 1.6636e-02 6.5601e-01 9.0412e-03 3.0168e-03 5.3744e-01 1.1508e-01 8.8191e-02 4.5702e-02 2.0919e-02 1.5088e-02 1.6553e-01 +1.3540e+00 7.1092e+06 5.8315e+02 1.6050e+03 1.5619e-07 1.9565e-02 9.8043e-01 3.1812e+03 1.5892e+03 3.9598e+02 8.0230e+01 4.8350e-05 1.7183e-05 3.5606e-03 7.8326e-04 1.7302e-01 5.1492e-02 4.9591e-02 3.2215e-02 1.8430e-02 1.6674e-02 6.5423e-01 9.0440e-03 3.0179e-03 5.3763e-01 1.1511e-01 8.8210e-02 4.5708e-02 2.0920e-02 1.5087e-02 1.6527e-01 +1.3560e+00 7.1488e+06 5.8315e+02 1.6149e+03 1.5496e-07 2.0824e-02 9.7918e-01 3.1844e+03 1.5981e+03 3.9556e+02 8.0618e+01 4.8300e-05 1.7204e-05 3.5802e-03 7.8850e-04 1.7407e-01 5.1756e-02 4.9810e-02 3.2334e-02 1.8485e-02 1.6711e-02 6.5246e-01 9.0468e-03 3.0191e-03 5.3781e-01 1.1514e-01 8.8229e-02 4.5715e-02 2.0921e-02 1.5086e-02 1.6503e-01 +1.3580e+00 7.1884e+06 5.8315e+02 1.6248e+03 1.5374e-07 2.2057e-02 9.7794e-01 3.1876e+03 1.6070e+03 3.9514e+02 8.1007e+01 4.8249e-05 1.7225e-05 3.5999e-03 7.9375e-04 1.7513e-01 5.2019e-02 5.0029e-02 3.2454e-02 1.8540e-02 1.6749e-02 6.5069e-01 9.0495e-03 3.0202e-03 5.3800e-01 1.1517e-01 8.8247e-02 4.5721e-02 2.0922e-02 1.5085e-02 1.6478e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6347e+03 1.5254e-07 2.3264e-02 9.7674e-01 3.1909e+03 1.6159e+03 3.9472e+02 8.1397e+01 4.8199e-05 1.7246e-05 3.6195e-03 7.9902e-04 1.7618e-01 5.2282e-02 5.0247e-02 3.2572e-02 1.8594e-02 1.6785e-02 6.4892e-01 9.0522e-03 3.0213e-03 5.3818e-01 1.1520e-01 8.8265e-02 4.5726e-02 2.0922e-02 1.5084e-02 1.6455e-01 +1.3620e+00 7.2676e+06 5.8315e+02 1.6445e+03 1.5136e-07 2.4445e-02 9.7556e-01 3.1941e+03 1.6248e+03 3.9430e+02 8.1788e+01 4.8148e-05 1.7267e-05 3.6391e-03 8.0429e-04 1.7724e-01 5.2545e-02 5.0464e-02 3.2690e-02 1.8648e-02 1.6821e-02 6.4715e-01 9.0548e-03 3.0224e-03 5.3835e-01 1.1523e-01 8.8283e-02 4.5732e-02 2.0923e-02 1.5082e-02 1.6432e-01 +1.3640e+00 7.3072e+06 5.8315e+02 1.6544e+03 1.5019e-07 2.5601e-02 9.7440e-01 3.1973e+03 1.6337e+03 3.9388e+02 8.2179e+01 4.8097e-05 1.7288e-05 3.6587e-03 8.0956e-04 1.7829e-01 5.2807e-02 5.0680e-02 3.2807e-02 1.8702e-02 1.6857e-02 6.4539e-01 9.0573e-03 3.0235e-03 5.3852e-01 1.1526e-01 8.8299e-02 4.5737e-02 2.0924e-02 1.5081e-02 1.6409e-01 +1.3660e+00 7.3468e+06 5.8315e+02 1.6642e+03 1.4904e-07 2.6732e-02 9.7327e-01 3.2005e+03 1.6425e+03 3.9345e+02 8.2571e+01 4.8046e-05 1.7309e-05 3.6783e-03 8.1485e-04 1.7935e-01 5.3068e-02 5.0895e-02 3.2923e-02 1.8755e-02 1.6892e-02 6.4363e-01 9.0598e-03 3.0245e-03 5.3869e-01 1.1529e-01 8.8316e-02 4.5742e-02 2.0924e-02 1.5080e-02 1.6387e-01 +1.3680e+00 7.3864e+06 5.8315e+02 1.6740e+03 1.4790e-07 2.7838e-02 9.7216e-01 3.2037e+03 1.6514e+03 3.9303e+02 8.2964e+01 4.7995e-05 1.7331e-05 3.6978e-03 8.2015e-04 1.8040e-01 5.3329e-02 5.1110e-02 3.3039e-02 1.8807e-02 1.6927e-02 6.4187e-01 9.0622e-03 3.0256e-03 5.3885e-01 1.1532e-01 8.8331e-02 4.5747e-02 2.0925e-02 1.5079e-02 1.6366e-01 +1.3700e+00 7.4260e+06 5.8315e+02 1.6838e+03 1.4678e-07 2.8920e-02 9.7108e-01 3.2069e+03 1.6603e+03 3.9261e+02 8.3358e+01 4.7943e-05 1.7352e-05 3.7174e-03 8.2545e-04 1.8146e-01 5.3590e-02 5.1324e-02 3.3154e-02 1.8859e-02 1.6962e-02 6.4011e-01 9.0645e-03 3.0266e-03 5.3901e-01 1.1535e-01 8.8347e-02 4.5752e-02 2.0925e-02 1.5077e-02 1.6345e-01 +1.3720e+00 7.4656e+06 5.8315e+02 1.6936e+03 1.4568e-07 2.9978e-02 9.7002e-01 3.2101e+03 1.6692e+03 3.9218e+02 8.3753e+01 4.7892e-05 1.7373e-05 3.7369e-03 8.3076e-04 1.8251e-01 5.3850e-02 5.1537e-02 3.3268e-02 1.8911e-02 1.6996e-02 6.3836e-01 9.0668e-03 3.0275e-03 5.3917e-01 1.1537e-01 8.8362e-02 4.5757e-02 2.0925e-02 1.5076e-02 1.6325e-01 +1.3740e+00 7.5052e+06 5.8315e+02 1.7034e+03 1.4459e-07 3.1012e-02 9.6899e-01 3.2134e+03 1.6781e+03 3.9175e+02 8.4149e+01 4.7840e-05 1.7394e-05 3.7564e-03 8.3608e-04 1.8357e-01 5.4109e-02 5.1749e-02 3.3382e-02 1.8962e-02 1.7029e-02 6.3661e-01 9.0690e-03 3.0285e-03 5.3932e-01 1.1540e-01 8.8376e-02 4.5761e-02 2.0926e-02 1.5075e-02 1.6305e-01 +1.3760e+00 7.5448e+06 5.8315e+02 1.7131e+03 1.4351e-07 3.2022e-02 9.6798e-01 3.2166e+03 1.6870e+03 3.9133e+02 8.4545e+01 4.7788e-05 1.7416e-05 3.7759e-03 8.4141e-04 1.8463e-01 5.4368e-02 5.1961e-02 3.3495e-02 1.9013e-02 1.7062e-02 6.3486e-01 9.0712e-03 3.0294e-03 5.3947e-01 1.1542e-01 8.8390e-02 4.5765e-02 2.0926e-02 1.5073e-02 1.6285e-01 +1.3780e+00 7.5844e+06 5.8315e+02 1.7228e+03 1.4244e-07 3.3009e-02 9.6699e-01 3.2198e+03 1.6959e+03 3.9090e+02 8.4943e+01 4.7736e-05 1.7437e-05 3.7954e-03 8.4675e-04 1.8568e-01 5.4627e-02 5.2172e-02 3.3607e-02 1.9063e-02 1.7095e-02 6.3311e-01 9.0733e-03 3.0303e-03 5.3962e-01 1.1544e-01 8.8403e-02 4.5769e-02 2.0926e-02 1.5072e-02 1.6267e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7325e+03 1.4139e-07 3.3973e-02 9.6603e-01 3.2230e+03 1.7048e+03 3.9047e+02 8.5341e+01 4.7684e-05 1.7459e-05 3.8148e-03 8.5209e-04 1.8674e-01 5.4885e-02 5.2382e-02 3.3719e-02 1.9113e-02 1.7127e-02 6.3137e-01 9.0753e-03 3.0312e-03 5.3976e-01 1.1547e-01 8.8416e-02 4.5773e-02 2.0926e-02 1.5071e-02 1.6248e-01 +1.3820e+00 7.6636e+06 5.8315e+02 1.7422e+03 1.4036e-07 3.4914e-02 9.6509e-01 3.2262e+03 1.7137e+03 3.9004e+02 8.5740e+01 4.7631e-05 1.7480e-05 3.8343e-03 8.5745e-04 1.8780e-01 5.5143e-02 5.2591e-02 3.3830e-02 1.9162e-02 1.7158e-02 6.2962e-01 9.0773e-03 3.0321e-03 5.3989e-01 1.1549e-01 8.8429e-02 4.5776e-02 2.0926e-02 1.5069e-02 1.6231e-01 +1.3840e+00 7.7032e+06 5.8315e+02 1.7519e+03 1.3933e-07 3.5833e-02 9.6417e-01 3.2294e+03 1.7226e+03 3.8961e+02 8.6140e+01 4.7579e-05 1.7502e-05 3.8537e-03 8.6281e-04 1.8886e-01 5.5400e-02 5.2799e-02 3.3940e-02 1.9211e-02 1.7190e-02 6.2789e-01 9.0793e-03 3.0329e-03 5.4003e-01 1.1551e-01 8.8441e-02 4.5780e-02 2.0926e-02 1.5068e-02 1.6213e-01 +1.3860e+00 7.7428e+06 5.8315e+02 1.7616e+03 1.3832e-07 3.6728e-02 9.6327e-01 3.2326e+03 1.7315e+03 3.8918e+02 8.6541e+01 4.7526e-05 1.7523e-05 3.8731e-03 8.6818e-04 1.8992e-01 5.5657e-02 5.3007e-02 3.4050e-02 1.9259e-02 1.7221e-02 6.2615e-01 9.0812e-03 3.0337e-03 5.4016e-01 1.1553e-01 8.8452e-02 4.5783e-02 2.0926e-02 1.5066e-02 1.6197e-01 +1.3880e+00 7.7824e+06 5.8315e+02 1.7712e+03 1.3733e-07 3.7602e-02 9.6240e-01 3.2358e+03 1.7404e+03 3.8875e+02 8.6943e+01 4.7473e-05 1.7545e-05 3.8925e-03 8.7356e-04 1.9098e-01 5.5913e-02 5.3214e-02 3.4159e-02 1.9307e-02 1.7251e-02 6.2441e-01 9.0830e-03 3.0345e-03 5.4028e-01 1.1555e-01 8.8464e-02 4.5786e-02 2.0926e-02 1.5065e-02 1.6180e-01 +1.3900e+00 7.8220e+06 5.8315e+02 1.7808e+03 1.3634e-07 3.8454e-02 9.6155e-01 3.2391e+03 1.7493e+03 3.8832e+02 8.7346e+01 4.7420e-05 1.7567e-05 3.9118e-03 8.7895e-04 1.9204e-01 5.6169e-02 5.3420e-02 3.4267e-02 1.9355e-02 1.7281e-02 6.2268e-01 9.0847e-03 3.0353e-03 5.4041e-01 1.1557e-01 8.8474e-02 4.5789e-02 2.0926e-02 1.5064e-02 1.6165e-01 +1.3920e+00 7.8616e+06 5.8315e+02 1.7904e+03 1.3537e-07 3.9284e-02 9.6072e-01 3.2423e+03 1.7582e+03 3.8788e+02 8.7750e+01 4.7367e-05 1.7589e-05 3.9312e-03 8.8435e-04 1.9310e-01 5.6424e-02 5.3625e-02 3.4375e-02 1.9402e-02 1.7311e-02 6.2095e-01 9.0865e-03 3.0361e-03 5.4053e-01 1.1559e-01 8.8485e-02 4.5791e-02 2.0926e-02 1.5062e-02 1.6149e-01 +1.3940e+00 7.9012e+06 5.8315e+02 1.8000e+03 1.3441e-07 4.0092e-02 9.5991e-01 3.2455e+03 1.7671e+03 3.8745e+02 8.8154e+01 4.7313e-05 1.7611e-05 3.9505e-03 8.8976e-04 1.9416e-01 5.6679e-02 5.3830e-02 3.4482e-02 1.9449e-02 1.7340e-02 6.1922e-01 9.0881e-03 3.0368e-03 5.4064e-01 1.1561e-01 8.8495e-02 4.5794e-02 2.0925e-02 1.5061e-02 1.6135e-01 +1.3960e+00 7.9408e+06 5.8315e+02 1.8096e+03 1.3346e-07 4.0878e-02 9.5912e-01 3.2487e+03 1.7761e+03 3.8701e+02 8.8560e+01 4.7260e-05 1.7633e-05 3.9698e-03 8.9518e-04 1.9522e-01 5.6934e-02 5.4034e-02 3.4589e-02 1.9495e-02 1.7368e-02 6.1750e-01 9.0897e-03 3.0375e-03 5.4076e-01 1.1563e-01 8.8504e-02 4.5796e-02 2.0925e-02 1.5060e-02 1.6120e-01 +1.3980e+00 7.9804e+06 5.8315e+02 1.8191e+03 1.3252e-07 4.1644e-02 9.5836e-01 3.2519e+03 1.7850e+03 3.8658e+02 8.8967e+01 4.7206e-05 1.7655e-05 3.9891e-03 9.0060e-04 1.9628e-01 5.7188e-02 5.4237e-02 3.4694e-02 1.9541e-02 1.7397e-02 6.1577e-01 9.0913e-03 3.0382e-03 5.4087e-01 1.1565e-01 8.8513e-02 4.5799e-02 2.0925e-02 1.5058e-02 1.6106e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8287e+03 1.3160e-07 4.2388e-02 9.5761e-01 3.2551e+03 1.7939e+03 3.8614e+02 8.9374e+01 4.7152e-05 1.7677e-05 4.0084e-03 9.0604e-04 1.9734e-01 5.7441e-02 5.4439e-02 3.4800e-02 1.9586e-02 1.7425e-02 6.1405e-01 9.0928e-03 3.0389e-03 5.4097e-01 1.1566e-01 8.8522e-02 4.5801e-02 2.0924e-02 1.5057e-02 1.6093e-01 +1.4020e+00 8.0596e+06 5.8315e+02 1.8382e+03 1.3068e-07 4.3111e-02 9.5689e-01 3.2583e+03 1.8028e+03 3.8570e+02 8.9783e+01 4.7098e-05 1.7699e-05 4.0277e-03 9.1148e-04 1.9840e-01 5.7695e-02 5.4641e-02 3.4904e-02 1.9631e-02 1.7452e-02 6.1233e-01 9.0942e-03 3.0396e-03 5.4107e-01 1.1568e-01 8.8530e-02 4.5803e-02 2.0924e-02 1.5055e-02 1.6080e-01 +1.4040e+00 8.0992e+06 5.8315e+02 1.8477e+03 1.2978e-07 4.3814e-02 9.5619e-01 3.2615e+03 1.8117e+03 3.8526e+02 9.0192e+01 4.7043e-05 1.7721e-05 4.0469e-03 9.1694e-04 1.9947e-01 5.7947e-02 5.4842e-02 3.5008e-02 1.9676e-02 1.7479e-02 6.1062e-01 9.0957e-03 3.0402e-03 5.4117e-01 1.1569e-01 8.8538e-02 4.5805e-02 2.0924e-02 1.5054e-02 1.6068e-01 +1.4060e+00 8.1388e+06 5.8315e+02 1.8572e+03 1.2889e-07 4.4495e-02 9.5550e-01 3.2647e+03 1.8206e+03 3.8482e+02 9.0603e+01 4.6989e-05 1.7744e-05 4.0661e-03 9.2240e-04 2.0053e-01 5.8199e-02 5.5042e-02 3.5111e-02 1.9720e-02 1.7506e-02 6.0890e-01 9.0970e-03 3.0408e-03 5.4127e-01 1.1571e-01 8.8546e-02 4.5806e-02 2.0923e-02 1.5053e-02 1.6056e-01 +1.4080e+00 8.1784e+06 5.8315e+02 1.8667e+03 1.2801e-07 4.5157e-02 9.5484e-01 3.2679e+03 1.8296e+03 3.8438e+02 9.1014e+01 4.6934e-05 1.7766e-05 4.0854e-03 9.2788e-04 2.0160e-01 5.8451e-02 5.5242e-02 3.5214e-02 1.9764e-02 1.7532e-02 6.0719e-01 9.0983e-03 3.0414e-03 5.4136e-01 1.1572e-01 8.8553e-02 4.5808e-02 2.0923e-02 1.5051e-02 1.6044e-01 +1.4100e+00 8.2180e+06 5.8315e+02 1.8761e+03 1.2714e-07 4.5797e-02 9.5420e-01 3.2711e+03 1.8385e+03 3.8394e+02 9.1427e+01 4.6879e-05 1.7789e-05 4.1046e-03 9.3336e-04 2.0266e-01 5.8703e-02 5.5440e-02 3.5316e-02 1.9807e-02 1.7558e-02 6.0548e-01 9.0995e-03 3.0420e-03 5.4145e-01 1.1574e-01 8.8560e-02 4.5809e-02 2.0922e-02 1.5050e-02 1.6033e-01 +1.4120e+00 8.2576e+06 5.8315e+02 1.8856e+03 1.2628e-07 4.6418e-02 9.5358e-01 3.2743e+03 1.8474e+03 3.8350e+02 9.1840e+01 4.6824e-05 1.7811e-05 4.1238e-03 9.3885e-04 2.0373e-01 5.8953e-02 5.5638e-02 3.5417e-02 1.9850e-02 1.7584e-02 6.0377e-01 9.1007e-03 3.0426e-03 5.4154e-01 1.1575e-01 8.8567e-02 4.5810e-02 2.0922e-02 1.5049e-02 1.6022e-01 +1.4140e+00 8.2972e+06 5.8315e+02 1.8950e+03 1.2543e-07 4.7018e-02 9.5298e-01 3.2775e+03 1.8563e+03 3.8305e+02 9.2255e+01 4.6769e-05 1.7834e-05 4.1429e-03 9.4435e-04 2.0479e-01 5.9204e-02 5.5835e-02 3.5518e-02 1.9892e-02 1.7609e-02 6.0206e-01 9.1019e-03 3.0431e-03 5.4162e-01 1.1576e-01 8.8573e-02 4.5812e-02 2.0921e-02 1.5047e-02 1.6012e-01 +1.4160e+00 8.3368e+06 5.8315e+02 1.9044e+03 1.2459e-07 4.7598e-02 9.5240e-01 3.2807e+03 1.8653e+03 3.8261e+02 9.2670e+01 4.6714e-05 1.7856e-05 4.1621e-03 9.4987e-04 2.0586e-01 5.9454e-02 5.6032e-02 3.5618e-02 1.9935e-02 1.7633e-02 6.0036e-01 9.1030e-03 3.0436e-03 5.4170e-01 1.1577e-01 8.8578e-02 4.5813e-02 2.0921e-02 1.5046e-02 1.6002e-01 +1.4180e+00 8.3764e+06 5.8315e+02 1.9138e+03 1.2376e-07 4.8158e-02 9.5184e-01 3.2839e+03 1.8742e+03 3.8216e+02 9.3087e+01 4.6658e-05 1.7879e-05 4.1812e-03 9.5539e-04 2.0692e-01 5.9703e-02 5.6228e-02 3.5718e-02 1.9976e-02 1.7658e-02 5.9866e-01 9.1041e-03 3.0442e-03 5.4178e-01 1.1579e-01 8.8584e-02 4.5813e-02 2.0920e-02 1.5045e-02 1.5993e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9231e+03 1.2294e-07 4.8699e-02 9.5130e-01 3.2871e+03 1.8831e+03 3.8171e+02 9.3504e+01 4.6603e-05 1.7902e-05 4.2003e-03 9.6092e-04 2.0799e-01 5.9953e-02 5.6423e-02 3.5817e-02 2.0018e-02 1.7682e-02 5.9696e-01 9.1051e-03 3.0446e-03 5.4185e-01 1.1580e-01 8.8589e-02 4.5814e-02 2.0919e-02 1.5043e-02 1.5984e-01 +1.4220e+00 8.4556e+06 5.8315e+02 1.9325e+03 1.2213e-07 4.9219e-02 9.5078e-01 3.2903e+03 1.8921e+03 3.8127e+02 9.3923e+01 4.6547e-05 1.7925e-05 4.2195e-03 9.6646e-04 2.0906e-01 6.0201e-02 5.6617e-02 3.5915e-02 2.0059e-02 1.7705e-02 5.9526e-01 9.1060e-03 3.0451e-03 5.4192e-01 1.1581e-01 8.8594e-02 4.5815e-02 2.0919e-02 1.5042e-02 1.5975e-01 +1.4240e+00 8.4952e+06 5.8315e+02 1.9418e+03 1.2133e-07 4.9720e-02 9.5028e-01 3.2935e+03 1.9010e+03 3.8082e+02 9.4343e+01 4.6491e-05 1.7948e-05 4.2385e-03 9.7201e-04 2.1013e-01 6.0450e-02 5.6811e-02 3.6013e-02 2.0099e-02 1.7728e-02 5.9356e-01 9.1069e-03 3.0455e-03 5.4199e-01 1.1582e-01 8.8598e-02 4.5815e-02 2.0918e-02 1.5041e-02 1.5967e-01 +1.4260e+00 8.5348e+06 5.8315e+02 1.9512e+03 1.2054e-07 5.0202e-02 9.4980e-01 3.2967e+03 1.9099e+03 3.8037e+02 9.4764e+01 4.6434e-05 1.7971e-05 4.2576e-03 9.7758e-04 2.1120e-01 6.0697e-02 5.7004e-02 3.6110e-02 2.0139e-02 1.7751e-02 5.9187e-01 9.1078e-03 3.0460e-03 5.4205e-01 1.1583e-01 8.8602e-02 4.5816e-02 2.0917e-02 1.5040e-02 1.5959e-01 +1.4280e+00 8.5744e+06 5.8315e+02 1.9605e+03 1.1975e-07 5.0664e-02 9.4934e-01 3.2999e+03 1.9189e+03 3.7992e+02 9.5186e+01 4.6378e-05 1.7995e-05 4.2767e-03 9.8315e-04 2.1227e-01 6.0945e-02 5.7196e-02 3.6206e-02 2.0179e-02 1.7774e-02 5.9017e-01 9.1086e-03 3.0464e-03 5.4211e-01 1.1583e-01 8.8606e-02 4.5816e-02 2.0917e-02 1.5039e-02 1.5952e-01 +1.4300e+00 8.6140e+06 5.8315e+02 1.9697e+03 1.1898e-07 5.1106e-02 9.4889e-01 3.3031e+03 1.9278e+03 3.7947e+02 9.5609e+01 4.6322e-05 1.8018e-05 4.2957e-03 9.8873e-04 2.1334e-01 6.1192e-02 5.7387e-02 3.6302e-02 2.0218e-02 1.7796e-02 5.8848e-01 9.1094e-03 3.0468e-03 5.4217e-01 1.1584e-01 8.8609e-02 4.5816e-02 2.0916e-02 1.5037e-02 1.5945e-01 +1.4320e+00 8.6536e+06 5.8315e+02 1.9790e+03 1.1822e-07 5.1529e-02 9.4847e-01 3.3063e+03 1.9368e+03 3.7901e+02 9.6033e+01 4.6265e-05 1.8041e-05 4.3148e-03 9.9433e-04 2.1441e-01 6.1438e-02 5.7578e-02 3.6397e-02 2.0257e-02 1.7817e-02 5.8679e-01 9.1101e-03 3.0471e-03 5.4223e-01 1.1585e-01 8.8613e-02 4.5816e-02 2.0915e-02 1.5036e-02 1.5939e-01 +1.4340e+00 8.6932e+06 5.8315e+02 1.9883e+03 1.1746e-07 5.1933e-02 9.4807e-01 3.3095e+03 1.9457e+03 3.7856e+02 9.6458e+01 4.6208e-05 1.8065e-05 4.3338e-03 9.9993e-04 2.1548e-01 6.1685e-02 5.7768e-02 3.6492e-02 2.0296e-02 1.7839e-02 5.8511e-01 9.1108e-03 3.0475e-03 5.4228e-01 1.1586e-01 8.8615e-02 4.5816e-02 2.0914e-02 1.5035e-02 1.5933e-01 +1.4360e+00 8.7328e+06 5.8315e+02 1.9975e+03 1.1671e-07 5.2318e-02 9.4768e-01 3.3127e+03 1.9547e+03 3.7810e+02 9.6884e+01 4.6151e-05 1.8089e-05 4.3528e-03 1.0055e-03 2.1655e-01 6.1930e-02 5.7957e-02 3.6586e-02 2.0334e-02 1.7860e-02 5.8342e-01 9.1114e-03 3.0478e-03 5.4233e-01 1.1586e-01 8.8618e-02 4.5816e-02 2.0914e-02 1.5034e-02 1.5927e-01 +1.4380e+00 8.7724e+06 5.8315e+02 2.0067e+03 1.1597e-07 5.2683e-02 9.4732e-01 3.3159e+03 1.9636e+03 3.7765e+02 9.7312e+01 4.6093e-05 1.8112e-05 4.3718e-03 1.0112e-03 2.1763e-01 6.2176e-02 5.8146e-02 3.6680e-02 2.0372e-02 1.7880e-02 5.8174e-01 9.1120e-03 3.0481e-03 5.4237e-01 1.1587e-01 8.8620e-02 4.5816e-02 2.0913e-02 1.5033e-02 1.5922e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0159e+03 1.1524e-07 5.3029e-02 9.4697e-01 3.3191e+03 1.9726e+03 3.7719e+02 9.7741e+01 4.6036e-05 1.8136e-05 4.3908e-03 1.0168e-03 2.1870e-01 6.2421e-02 5.8334e-02 3.6772e-02 2.0409e-02 1.7900e-02 5.8006e-01 9.1125e-03 3.0484e-03 5.4242e-01 1.1587e-01 8.8622e-02 4.5816e-02 2.0912e-02 1.5032e-02 1.5917e-01 +1.4420e+00 8.8516e+06 5.8315e+02 2.0251e+03 1.1452e-07 5.3356e-02 9.4664e-01 3.3223e+03 1.9815e+03 3.7673e+02 9.8171e+01 4.5978e-05 1.8160e-05 4.4098e-03 1.0225e-03 2.1977e-01 6.2665e-02 5.8521e-02 3.6865e-02 2.0446e-02 1.7920e-02 5.7838e-01 9.1130e-03 3.0487e-03 5.4246e-01 1.1588e-01 8.8623e-02 4.5815e-02 2.0911e-02 1.5031e-02 1.5912e-01 +1.4440e+00 8.8912e+06 5.8315e+02 2.0343e+03 1.1381e-07 5.3665e-02 9.4634e-01 3.3255e+03 1.9905e+03 3.7627e+02 9.8602e+01 4.5920e-05 1.8184e-05 4.4287e-03 1.0281e-03 2.2085e-01 6.2909e-02 5.8708e-02 3.6956e-02 2.0483e-02 1.7940e-02 5.7670e-01 9.1135e-03 3.0490e-03 5.4249e-01 1.1588e-01 8.8625e-02 4.5815e-02 2.0910e-02 1.5029e-02 1.5908e-01 +1.4460e+00 8.9308e+06 5.8315e+02 2.0435e+03 1.1310e-07 5.3954e-02 9.4605e-01 3.3287e+03 1.9995e+03 3.7581e+02 9.9034e+01 4.5862e-05 1.8208e-05 4.4477e-03 1.0338e-03 2.2192e-01 6.3153e-02 5.8894e-02 3.7048e-02 2.0519e-02 1.7959e-02 5.7502e-01 9.1139e-03 3.0492e-03 5.4253e-01 1.1589e-01 8.8626e-02 4.5814e-02 2.0910e-02 1.5028e-02 1.5905e-01 +1.4480e+00 8.9704e+06 5.8315e+02 2.0526e+03 1.1240e-07 5.4224e-02 9.4578e-01 3.3319e+03 2.0084e+03 3.7535e+02 9.9467e+01 4.5804e-05 1.8232e-05 4.4666e-03 1.0395e-03 2.2300e-01 6.3396e-02 5.9079e-02 3.7138e-02 2.0555e-02 1.7978e-02 5.7335e-01 9.1143e-03 3.0494e-03 5.4256e-01 1.1589e-01 8.8626e-02 4.5813e-02 2.0909e-02 1.5027e-02 1.5901e-01 +1.4500e+00 9.0100e+06 5.8315e+02 2.0618e+03 1.1171e-07 5.4475e-02 9.4553e-01 3.3350e+03 2.0174e+03 3.7489e+02 9.9902e+01 4.5746e-05 1.8257e-05 4.4855e-03 1.0452e-03 2.2408e-01 6.3639e-02 5.9263e-02 3.7228e-02 2.0590e-02 1.7996e-02 5.7167e-01 9.1146e-03 3.0496e-03 5.4258e-01 1.1589e-01 8.8627e-02 4.5812e-02 2.0908e-02 1.5026e-02 1.5898e-01 +1.4520e+00 9.0496e+06 5.8315e+02 2.0709e+03 1.1103e-07 5.4707e-02 9.4529e-01 3.3382e+03 2.0263e+03 3.7442e+02 1.0034e+02 4.5687e-05 1.8281e-05 4.5044e-03 1.0509e-03 2.2516e-01 6.3882e-02 5.9447e-02 3.7318e-02 2.0625e-02 1.8014e-02 5.7000e-01 9.1149e-03 3.0498e-03 5.4261e-01 1.1590e-01 8.8627e-02 4.5812e-02 2.0907e-02 1.5026e-02 1.5896e-01 +1.4540e+00 9.0892e+06 5.8315e+02 2.0800e+03 1.1036e-07 5.4920e-02 9.4508e-01 3.3414e+03 2.0353e+03 3.7396e+02 1.0077e+02 4.5628e-05 1.8306e-05 4.5233e-03 1.0566e-03 2.2623e-01 6.4124e-02 5.9630e-02 3.7406e-02 2.0660e-02 1.8032e-02 5.6833e-01 9.1151e-03 3.0500e-03 5.4263e-01 1.1590e-01 8.8627e-02 4.5811e-02 2.0906e-02 1.5025e-02 1.5894e-01 +1.4560e+00 9.1288e+06 5.8315e+02 2.0890e+03 1.0969e-07 5.5114e-02 9.4489e-01 3.3446e+03 2.0443e+03 3.7349e+02 1.0121e+02 4.5569e-05 1.8331e-05 4.5422e-03 1.0623e-03 2.2731e-01 6.4365e-02 5.9813e-02 3.7495e-02 2.0694e-02 1.8049e-02 5.6667e-01 9.1153e-03 3.0501e-03 5.4265e-01 1.1590e-01 8.8626e-02 4.5810e-02 2.0905e-02 1.5024e-02 1.5892e-01 +1.4580e+00 9.1684e+06 5.8315e+02 2.0981e+03 1.0903e-07 5.5289e-02 9.4471e-01 3.3478e+03 2.0533e+03 3.7302e+02 1.0165e+02 4.5510e-05 1.8355e-05 4.5610e-03 1.0680e-03 2.2839e-01 6.4607e-02 5.9995e-02 3.7582e-02 2.0728e-02 1.8066e-02 5.6500e-01 9.1154e-03 3.0502e-03 5.4267e-01 1.1590e-01 8.8626e-02 4.5808e-02 2.0904e-02 1.5023e-02 1.5891e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1072e+03 1.0837e-07 5.5445e-02 9.4456e-01 3.3510e+03 2.0622e+03 3.7256e+02 1.0209e+02 4.5451e-05 1.8380e-05 4.5799e-03 1.0738e-03 2.2947e-01 6.4848e-02 6.0176e-02 3.7670e-02 2.0762e-02 1.8083e-02 5.6333e-01 9.1155e-03 3.0503e-03 5.4268e-01 1.1590e-01 8.8625e-02 4.5807e-02 2.0904e-02 1.5022e-02 1.5890e-01 +1.4620e+00 9.2476e+06 5.8315e+02 2.1162e+03 1.0773e-07 5.5582e-02 9.4442e-01 3.3541e+03 2.0712e+03 3.7209e+02 1.0254e+02 4.5391e-05 1.8405e-05 4.5987e-03 1.0795e-03 2.3056e-01 6.5088e-02 6.0356e-02 3.7756e-02 2.0795e-02 1.8100e-02 5.6167e-01 9.1156e-03 3.0504e-03 5.4269e-01 1.1590e-01 8.8623e-02 4.5806e-02 2.0903e-02 1.5021e-02 1.5889e-01 +1.4640e+00 9.2872e+06 5.8315e+02 2.1252e+03 1.0709e-07 5.5700e-02 9.4430e-01 3.3573e+03 2.0802e+03 3.7161e+02 1.0298e+02 4.5332e-05 1.8430e-05 4.6176e-03 1.0853e-03 2.3164e-01 6.5328e-02 6.0536e-02 3.7842e-02 2.0828e-02 1.8116e-02 5.6001e-01 9.1156e-03 3.0505e-03 5.4269e-01 1.1590e-01 8.8622e-02 4.5805e-02 2.0902e-02 1.5020e-02 1.5889e-01 +1.4660e+00 9.3268e+06 5.8315e+02 2.1342e+03 1.0646e-07 5.5798e-02 9.4420e-01 3.3605e+03 2.0892e+03 3.7114e+02 1.0342e+02 4.5272e-05 1.8456e-05 4.6364e-03 1.0911e-03 2.3272e-01 6.5568e-02 6.0715e-02 3.7928e-02 2.0861e-02 1.8131e-02 5.5835e-01 9.1156e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8620e-02 4.5803e-02 2.0901e-02 1.5020e-02 1.5889e-01 +1.4680e+00 9.3664e+06 5.8315e+02 2.1432e+03 1.0583e-07 5.5878e-02 9.4412e-01 3.3637e+03 2.0982e+03 3.7067e+02 1.0387e+02 4.5212e-05 1.8481e-05 4.6552e-03 1.0969e-03 2.3381e-01 6.5807e-02 6.0894e-02 3.8013e-02 2.0893e-02 1.8147e-02 5.5669e-01 9.1155e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8618e-02 4.5802e-02 2.0900e-02 1.5019e-02 1.5890e-01 +1.4700e+00 9.4060e+06 5.8315e+02 2.1522e+03 1.0521e-07 5.5939e-02 9.4406e-01 3.3668e+03 2.1071e+03 3.7019e+02 1.0432e+02 4.5151e-05 1.8507e-05 4.6740e-03 1.1027e-03 2.3489e-01 6.6046e-02 6.1071e-02 3.8097e-02 2.0925e-02 1.8162e-02 5.5503e-01 9.1154e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8616e-02 4.5800e-02 2.0899e-02 1.5018e-02 1.5891e-01 +1.4720e+00 9.4456e+06 5.8315e+02 2.1611e+03 1.0460e-07 5.5980e-02 9.4402e-01 3.3700e+03 2.1161e+03 3.6972e+02 1.0477e+02 4.5091e-05 1.8532e-05 4.6928e-03 1.1085e-03 2.3598e-01 6.6285e-02 6.1249e-02 3.8181e-02 2.0957e-02 1.8176e-02 5.5337e-01 9.1153e-03 3.0506e-03 5.4269e-01 1.1589e-01 8.8613e-02 4.5799e-02 2.0898e-02 1.5018e-02 1.5892e-01 +1.4740e+00 9.4852e+06 5.8315e+02 2.1701e+03 1.0399e-07 5.6002e-02 9.4400e-01 3.3732e+03 2.1251e+03 3.6924e+02 1.0522e+02 4.5030e-05 1.8558e-05 4.7115e-03 1.1144e-03 2.3707e-01 6.6523e-02 6.1425e-02 3.8264e-02 2.0988e-02 1.8191e-02 5.5172e-01 9.1151e-03 3.0506e-03 5.4269e-01 1.1589e-01 8.8610e-02 4.5797e-02 2.0898e-02 1.5017e-02 1.5894e-01 +1.4760e+00 9.5248e+06 5.8315e+02 2.1790e+03 1.0339e-07 5.6005e-02 9.4399e-01 3.3763e+03 2.1341e+03 3.6876e+02 1.0567e+02 4.4969e-05 1.8584e-05 4.7303e-03 1.1202e-03 2.3815e-01 6.6761e-02 6.1601e-02 3.8347e-02 2.1019e-02 1.8205e-02 5.5006e-01 9.1148e-03 3.0506e-03 5.4268e-01 1.1589e-01 8.8607e-02 4.5795e-02 2.0897e-02 1.5016e-02 1.5896e-01 +1.4780e+00 9.5644e+06 5.8315e+02 2.1879e+03 1.0280e-07 5.5989e-02 9.4401e-01 3.3795e+03 2.1431e+03 3.6828e+02 1.0612e+02 4.4908e-05 1.8610e-05 4.7491e-03 1.1261e-03 2.3924e-01 6.6999e-02 6.1776e-02 3.8429e-02 2.1049e-02 1.8219e-02 5.4841e-01 9.1146e-03 3.0505e-03 5.4266e-01 1.1588e-01 8.8604e-02 4.5793e-02 2.0896e-02 1.5016e-02 1.5898e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.1968e+03 1.0221e-07 5.5953e-02 9.4405e-01 3.3827e+03 2.1521e+03 3.6780e+02 1.0657e+02 4.4847e-05 1.8636e-05 4.7678e-03 1.1319e-03 2.4033e-01 6.7236e-02 6.1951e-02 3.8510e-02 2.1079e-02 1.8232e-02 5.4676e-01 9.1142e-03 3.0504e-03 5.4265e-01 1.1588e-01 8.8600e-02 4.5791e-02 2.0895e-02 1.5015e-02 1.5901e-01 +1.4820e+00 9.6436e+06 5.8315e+02 2.2057e+03 1.0163e-07 5.5897e-02 9.4410e-01 3.3858e+03 2.1611e+03 3.6731e+02 1.0703e+02 4.4785e-05 1.8663e-05 4.7865e-03 1.1378e-03 2.4142e-01 6.7473e-02 6.2125e-02 3.8591e-02 2.1109e-02 1.8245e-02 5.4511e-01 9.1139e-03 3.0503e-03 5.4263e-01 1.1587e-01 8.8597e-02 4.5789e-02 2.0894e-02 1.5015e-02 1.5904e-01 +1.4840e+00 9.6832e+06 5.8315e+02 2.2146e+03 1.0106e-07 5.5822e-02 9.4418e-01 3.3890e+03 2.1701e+03 3.6683e+02 1.0749e+02 4.4724e-05 1.8689e-05 4.8053e-03 1.1437e-03 2.4251e-01 6.7709e-02 6.2298e-02 3.8672e-02 2.1138e-02 1.8258e-02 5.4346e-01 9.1135e-03 3.0502e-03 5.4260e-01 1.1587e-01 8.8593e-02 4.5787e-02 2.0894e-02 1.5015e-02 1.5907e-01 +1.4860e+00 9.7228e+06 5.8315e+02 2.2234e+03 1.0049e-07 5.5727e-02 9.4427e-01 3.3921e+03 2.1791e+03 3.6634e+02 1.0795e+02 4.4662e-05 1.8716e-05 4.8240e-03 1.1496e-03 2.4361e-01 6.7945e-02 6.2470e-02 3.8752e-02 2.1167e-02 1.8270e-02 5.4181e-01 9.1130e-03 3.0501e-03 5.4258e-01 1.1586e-01 8.8588e-02 4.5785e-02 2.0893e-02 1.5014e-02 1.5911e-01 +1.4880e+00 9.7624e+06 5.8315e+02 2.2323e+03 9.9923e-08 5.5613e-02 9.4439e-01 3.3953e+03 2.1881e+03 3.6586e+02 1.0841e+02 4.4600e-05 1.8742e-05 4.8427e-03 1.1556e-03 2.4470e-01 6.8181e-02 6.2642e-02 3.8831e-02 2.1196e-02 1.8283e-02 5.4017e-01 9.1126e-03 3.0499e-03 5.4255e-01 1.1586e-01 8.8584e-02 4.5783e-02 2.0892e-02 1.5014e-02 1.5916e-01 +1.4900e+00 9.8020e+06 5.8315e+02 2.2411e+03 9.9365e-08 5.5478e-02 9.4452e-01 3.3984e+03 2.1972e+03 3.6537e+02 1.0887e+02 4.4538e-05 1.8769e-05 4.8614e-03 1.1615e-03 2.4580e-01 6.8416e-02 6.2814e-02 3.8910e-02 2.1224e-02 1.8294e-02 5.3852e-01 9.1120e-03 3.0498e-03 5.4252e-01 1.1585e-01 8.8579e-02 4.5781e-02 2.0891e-02 1.5014e-02 1.5920e-01 +1.4920e+00 9.8416e+06 5.8315e+02 2.2499e+03 9.8813e-08 5.5324e-02 9.4468e-01 3.4016e+03 2.2062e+03 3.6488e+02 1.0933e+02 4.4475e-05 1.8796e-05 4.8801e-03 1.1674e-03 2.4689e-01 6.8651e-02 6.2985e-02 3.8989e-02 2.1252e-02 1.8306e-02 5.3688e-01 9.1115e-03 3.0496e-03 5.4249e-01 1.1584e-01 8.8574e-02 4.5779e-02 2.0890e-02 1.5013e-02 1.5925e-01 +1.4940e+00 9.8812e+06 5.8315e+02 2.2587e+03 9.8267e-08 5.5149e-02 9.4485e-01 3.4047e+03 2.2152e+03 3.6439e+02 1.0980e+02 4.4412e-05 1.8823e-05 4.8987e-03 1.1734e-03 2.4799e-01 6.8886e-02 6.3155e-02 3.9067e-02 2.1280e-02 1.8317e-02 5.3524e-01 9.1109e-03 3.0494e-03 5.4245e-01 1.1584e-01 8.8569e-02 4.5777e-02 2.0890e-02 1.5013e-02 1.5931e-01 +1.4960e+00 9.9208e+06 5.8315e+02 2.2675e+03 9.7727e-08 5.4954e-02 9.4505e-01 3.4079e+03 2.2242e+03 3.6389e+02 1.1026e+02 4.4349e-05 1.8851e-05 4.9174e-03 1.1794e-03 2.4909e-01 6.9120e-02 6.3324e-02 3.9144e-02 2.1308e-02 1.8328e-02 5.3359e-01 9.1102e-03 3.0492e-03 5.4241e-01 1.1583e-01 8.8563e-02 4.5774e-02 2.0889e-02 1.5013e-02 1.5936e-01 +1.4980e+00 9.9604e+06 5.8315e+02 2.2763e+03 9.7191e-08 5.4739e-02 9.4526e-01 3.4110e+03 2.2332e+03 3.6340e+02 1.1073e+02 4.4286e-05 1.8878e-05 4.9361e-03 1.1854e-03 2.5019e-01 6.9354e-02 6.3493e-02 3.9221e-02 2.1335e-02 1.8339e-02 5.3195e-01 9.1095e-03 3.0489e-03 5.4237e-01 1.1582e-01 8.8558e-02 4.5772e-02 2.0888e-02 1.5013e-02 1.5942e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.2850e+03 9.6662e-08 5.4503e-02 9.4550e-01 3.4142e+03 2.2423e+03 3.6290e+02 1.1120e+02 4.4223e-05 1.8906e-05 4.9547e-03 1.1914e-03 2.5129e-01 6.9588e-02 6.3661e-02 3.9297e-02 2.1361e-02 1.8349e-02 5.3031e-01 9.1088e-03 3.0486e-03 5.4232e-01 1.1581e-01 8.8552e-02 4.5770e-02 2.0888e-02 1.5013e-02 1.5949e-01 +1.5020e+00 1.0100e+07 5.8315e+02 2.3071e+03 9.5347e-08 5.3815e-02 9.4618e-01 3.4221e+03 2.2651e+03 3.6164e+02 1.1239e+02 4.4062e-05 1.8976e-05 5.0018e-03 1.2066e-03 2.5407e-01 7.0176e-02 6.4083e-02 3.9487e-02 2.1427e-02 1.8374e-02 5.2617e-01 9.1068e-03 3.0479e-03 5.4219e-01 1.1579e-01 8.8536e-02 4.5763e-02 2.0886e-02 1.5013e-02 1.5967e-01 +1.5040e+00 1.0200e+07 5.8315e+02 2.3290e+03 9.4066e-08 5.2993e-02 9.4701e-01 3.4300e+03 2.2879e+03 3.6037e+02 1.1359e+02 4.3900e-05 1.9048e-05 5.0488e-03 1.2220e-03 2.5686e-01 7.0763e-02 6.4502e-02 3.9674e-02 2.1491e-02 1.8396e-02 5.2204e-01 9.1045e-03 3.0470e-03 5.4205e-01 1.1576e-01 8.8519e-02 4.5757e-02 2.0884e-02 1.5013e-02 1.5987e-01 +1.5060e+00 1.0300e+07 5.8315e+02 2.3509e+03 9.2816e-08 5.2033e-02 9.4797e-01 3.4379e+03 2.3108e+03 3.5909e+02 1.1481e+02 4.3736e-05 1.9121e-05 5.0958e-03 1.2374e-03 2.5966e-01 7.1347e-02 6.4916e-02 3.9858e-02 2.1553e-02 1.8417e-02 5.1792e-01 9.1019e-03 3.0460e-03 5.4188e-01 1.1573e-01 8.8500e-02 4.5750e-02 2.0883e-02 1.5013e-02 1.6010e-01 +1.5080e+00 1.0400e+07 5.8315e+02 2.3727e+03 9.1596e-08 5.0932e-02 9.4907e-01 3.4458e+03 2.3336e+03 3.5780e+02 1.1603e+02 4.3571e-05 1.9194e-05 5.1428e-03 1.2529e-03 2.6247e-01 7.1930e-02 6.5327e-02 4.0039e-02 2.1613e-02 1.8436e-02 5.1379e-01 9.0991e-03 3.0449e-03 5.4170e-01 1.1570e-01 8.8480e-02 4.5743e-02 2.0882e-02 1.5014e-02 1.6034e-01 +1.5100e+00 1.0500e+07 5.8315e+02 2.3943e+03 9.0407e-08 4.9686e-02 9.5031e-01 3.4536e+03 2.3565e+03 3.5650e+02 1.1727e+02 4.3404e-05 1.9269e-05 5.1897e-03 1.2685e-03 2.6528e-01 7.2511e-02 6.5734e-02 4.0216e-02 2.1670e-02 1.8453e-02 5.0968e-01 9.0960e-03 3.0436e-03 5.4149e-01 1.1566e-01 8.8459e-02 4.5736e-02 2.0881e-02 1.5015e-02 1.6062e-01 +1.5120e+00 1.0600e+07 5.8315e+02 2.4159e+03 8.9245e-08 4.8292e-02 9.5171e-01 3.4615e+03 2.3795e+03 3.5518e+02 1.1852e+02 4.3236e-05 1.9345e-05 5.2366e-03 1.2843e-03 2.6811e-01 7.3089e-02 6.6137e-02 4.0390e-02 2.1726e-02 1.8468e-02 5.0556e-01 9.0927e-03 3.0423e-03 5.4127e-01 1.1562e-01 8.8436e-02 4.5728e-02 2.0880e-02 1.5017e-02 1.6092e-01 +1.5140e+00 1.0700e+07 5.8315e+02 2.4375e+03 8.8112e-08 4.6744e-02 9.5326e-01 3.4693e+03 2.4024e+03 3.5386e+02 1.1978e+02 4.3066e-05 1.9423e-05 5.2835e-03 1.3001e-03 2.7094e-01 7.3666e-02 6.6536e-02 4.0561e-02 2.1780e-02 1.8482e-02 5.0145e-01 9.0891e-03 3.0407e-03 5.4102e-01 1.1558e-01 8.8412e-02 4.5721e-02 2.0879e-02 1.5019e-02 1.6124e-01 +1.5160e+00 1.0800e+07 5.8315e+02 2.4589e+03 8.7005e-08 4.5038e-02 9.5496e-01 3.4771e+03 2.4254e+03 3.5252e+02 1.2105e+02 4.2895e-05 1.9502e-05 5.3304e-03 1.3160e-03 2.7379e-01 7.4242e-02 6.6932e-02 4.0729e-02 2.1832e-02 1.8494e-02 4.9734e-01 9.0852e-03 3.0391e-03 5.4076e-01 1.1554e-01 8.8387e-02 4.5713e-02 2.0878e-02 1.5021e-02 1.6158e-01 +1.5180e+00 1.0900e+07 5.8315e+02 2.4803e+03 8.5925e-08 4.3168e-02 9.5683e-01 3.4849e+03 2.4484e+03 3.5116e+02 1.2234e+02 4.2722e-05 1.9582e-05 5.3772e-03 1.3321e-03 2.7664e-01 7.4815e-02 6.7325e-02 4.0894e-02 2.1881e-02 1.8504e-02 4.9323e-01 9.0810e-03 3.0373e-03 5.4047e-01 1.1549e-01 8.8360e-02 4.5705e-02 2.0878e-02 1.5024e-02 1.6195e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5015e+03 8.4869e-08 4.1127e-02 9.5887e-01 3.4926e+03 2.4714e+03 3.4980e+02 1.2364e+02 4.2547e-05 1.9663e-05 5.4241e-03 1.3483e-03 2.7951e-01 7.5387e-02 6.7713e-02 4.1056e-02 2.1929e-02 1.8512e-02 4.8912e-01 9.0766e-03 3.0354e-03 5.4017e-01 1.1544e-01 8.8332e-02 4.5697e-02 2.0878e-02 1.5027e-02 1.6235e-01 +1.5220e+00 1.1100e+07 5.8315e+02 2.5227e+03 8.3838e-08 3.8910e-02 9.6109e-01 3.5003e+03 2.4945e+03 3.4842e+02 1.2495e+02 4.2371e-05 1.9746e-05 5.4710e-03 1.3646e-03 2.8238e-01 7.5958e-02 6.8099e-02 4.1215e-02 2.1975e-02 1.8518e-02 4.8502e-01 9.0719e-03 3.0333e-03 5.3984e-01 1.1539e-01 8.8303e-02 4.5689e-02 2.0878e-02 1.5030e-02 1.6277e-01 +1.5240e+00 1.1200e+07 5.8315e+02 2.5438e+03 8.2830e-08 3.6507e-02 9.6349e-01 3.5080e+03 2.5176e+03 3.4703e+02 1.2628e+02 4.2193e-05 1.9830e-05 5.5179e-03 1.3810e-03 2.8527e-01 7.6527e-02 6.8481e-02 4.1370e-02 2.2019e-02 1.8523e-02 4.8091e-01 9.0669e-03 3.0311e-03 5.3949e-01 1.1533e-01 8.8273e-02 4.5681e-02 2.0878e-02 1.5034e-02 1.6321e-01 +1.5260e+00 1.1300e+07 5.8315e+02 2.5649e+03 8.1845e-08 3.3912e-02 9.6609e-01 3.5157e+03 2.5407e+03 3.4562e+02 1.2762e+02 4.2013e-05 1.9916e-05 5.5647e-03 1.3976e-03 2.8817e-01 7.7095e-02 6.8859e-02 4.1523e-02 2.2061e-02 1.8526e-02 4.7680e-01 9.0616e-03 3.0287e-03 5.3912e-01 1.1527e-01 8.8241e-02 4.5673e-02 2.0879e-02 1.5039e-02 1.6368e-01 +1.5280e+00 1.1400e+07 5.8315e+02 2.5858e+03 8.0883e-08 3.1114e-02 9.6889e-01 3.5233e+03 2.5639e+03 3.4420e+02 1.2898e+02 4.1831e-05 2.0004e-05 5.6117e-03 1.4143e-03 2.9109e-01 7.7662e-02 6.9235e-02 4.1673e-02 2.2102e-02 1.8527e-02 4.7269e-01 9.0560e-03 3.0262e-03 5.3873e-01 1.1521e-01 8.8209e-02 4.5665e-02 2.0880e-02 1.5043e-02 1.6418e-01 +1.5300e+00 1.1500e+07 5.8315e+02 2.6067e+03 7.9942e-08 2.8104e-02 9.7190e-01 3.5309e+03 2.5871e+03 3.4276e+02 1.3036e+02 4.1647e-05 2.0093e-05 5.6586e-03 1.4311e-03 2.9402e-01 7.8227e-02 6.9607e-02 4.1820e-02 2.2140e-02 1.8526e-02 4.6857e-01 9.0502e-03 3.0235e-03 5.3831e-01 1.1515e-01 8.8175e-02 4.5657e-02 2.0881e-02 1.5049e-02 1.6471e-01 +1.5320e+00 1.1600e+07 5.8315e+02 2.6275e+03 7.9021e-08 2.4871e-02 9.7513e-01 3.5385e+03 2.6103e+03 3.4130e+02 1.3175e+02 4.1461e-05 2.0184e-05 5.7056e-03 1.4481e-03 2.9696e-01 7.8791e-02 6.9976e-02 4.1964e-02 2.2177e-02 1.8524e-02 4.6445e-01 9.0440e-03 3.0207e-03 5.3787e-01 1.1508e-01 8.8139e-02 4.5649e-02 2.0883e-02 1.5054e-02 1.6526e-01 +1.5340e+00 1.1700e+07 5.8315e+02 2.6482e+03 7.8121e-08 2.1402e-02 9.7860e-01 3.5460e+03 2.6336e+03 3.3983e+02 1.3316e+02 4.1273e-05 2.0277e-05 5.7527e-03 1.4652e-03 2.9992e-01 7.9355e-02 7.0341e-02 4.2105e-02 2.2211e-02 1.8520e-02 4.6033e-01 9.0375e-03 3.0177e-03 5.3741e-01 1.1501e-01 8.8103e-02 4.5640e-02 2.0885e-02 1.5061e-02 1.6584e-01 +1.5360e+00 1.1800e+07 5.8315e+02 2.6689e+03 7.7241e-08 1.7683e-02 9.8232e-01 3.5535e+03 2.6570e+03 3.3834e+02 1.3459e+02 4.1083e-05 2.0372e-05 5.7998e-03 1.4825e-03 3.0290e-01 7.9917e-02 7.0704e-02 4.2244e-02 2.2244e-02 1.8515e-02 4.5620e-01 9.0306e-03 3.0145e-03 5.3692e-01 1.1493e-01 8.8065e-02 4.5632e-02 2.0887e-02 1.5067e-02 1.6645e-01 +1.5380e+00 1.1900e+07 5.8315e+02 2.6894e+03 7.6379e-08 1.3699e-02 9.8630e-01 3.5609e+03 2.6803e+03 3.3683e+02 1.3603e+02 4.0891e-05 2.0469e-05 5.8470e-03 1.5000e-03 3.0589e-01 8.0479e-02 7.1064e-02 4.2379e-02 2.2275e-02 1.8508e-02 4.5206e-01 9.0235e-03 3.0112e-03 5.3641e-01 1.1485e-01 8.8025e-02 4.5624e-02 2.0890e-02 1.5075e-02 1.6709e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.7099e+03 7.5536e-08 9.4342e-03 9.9057e-01 3.5683e+03 2.7037e+03 3.3530e+02 1.3750e+02 4.0696e-05 2.0568e-05 5.8943e-03 1.5176e-03 3.0890e-01 8.1041e-02 7.1421e-02 4.2512e-02 2.2304e-02 1.8499e-02 4.4791e-01 9.0160e-03 3.0076e-03 5.3586e-01 1.1477e-01 8.7985e-02 4.5616e-02 2.0893e-02 1.5082e-02 1.6776e-01 +1.5420e+00 1.2100e+07 5.8315e+02 2.7304e+03 7.4711e-08 4.8688e-03 9.9513e-01 3.5756e+03 2.7272e+03 3.3375e+02 1.3899e+02 4.0500e-05 2.0669e-05 5.9417e-03 1.5354e-03 3.1193e-01 8.1601e-02 7.1775e-02 4.2642e-02 2.2332e-02 1.8488e-02 4.4376e-01 9.0082e-03 3.0039e-03 5.3530e-01 1.1469e-01 8.7943e-02 4.5608e-02 2.0896e-02 1.5091e-02 1.6847e-01 +1.5440e+00 1.2200e+07 5.8315e+02 2.7507e+03 7.8035e-08 0.0000e+00 1.0000e+00 2.7507e+03 2.7507e+03 1.4050e+02 1.4050e+02 2.0773e-05 2.0773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5460e+00 1.2300e+07 5.8315e+02 2.7722e+03 7.7192e-08 0.0000e+00 1.0000e+00 2.7722e+03 2.7722e+03 1.4160e+02 1.4160e+02 2.0855e-05 2.0855e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5480e+00 1.2400e+07 5.8315e+02 2.7935e+03 7.6362e-08 0.0000e+00 1.0000e+00 2.7935e+03 2.7935e+03 1.4269e+02 1.4269e+02 2.0938e-05 2.0938e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5500e+00 1.2500e+07 5.8315e+02 2.8148e+03 7.5543e-08 0.0000e+00 1.0000e+00 2.8148e+03 2.8148e+03 1.4377e+02 1.4377e+02 2.1020e-05 2.1020e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5520e+00 1.2600e+07 5.8315e+02 2.8361e+03 7.4737e-08 0.0000e+00 1.0000e+00 2.8361e+03 2.8361e+03 1.4486e+02 1.4486e+02 2.1104e-05 2.1104e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5540e+00 1.2700e+07 5.8315e+02 2.8572e+03 7.3942e-08 0.0000e+00 1.0000e+00 2.8572e+03 2.8572e+03 1.4594e+02 1.4594e+02 2.1187e-05 2.1187e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5560e+00 1.2800e+07 5.8315e+02 2.8783e+03 7.3158e-08 0.0000e+00 1.0000e+00 2.8783e+03 2.8783e+03 1.4702e+02 1.4702e+02 2.1271e-05 2.1271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5580e+00 1.2900e+07 5.8315e+02 2.8993e+03 7.2386e-08 0.0000e+00 1.0000e+00 2.8993e+03 2.8993e+03 1.4809e+02 1.4809e+02 2.1355e-05 2.1355e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 2.9203e+03 7.1624e-08 0.0000e+00 1.0000e+00 2.9203e+03 2.9203e+03 1.4916e+02 1.4916e+02 2.1439e-05 2.1439e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5620e+00 1.3100e+07 5.8315e+02 2.9412e+03 7.0873e-08 0.0000e+00 1.0000e+00 2.9412e+03 2.9412e+03 1.5023e+02 1.5023e+02 2.1523e-05 2.1523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5640e+00 1.3200e+07 5.8315e+02 2.9620e+03 7.0133e-08 0.0000e+00 1.0000e+00 2.9620e+03 2.9620e+03 1.5129e+02 1.5129e+02 2.1608e-05 2.1608e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5660e+00 1.3300e+07 5.8315e+02 2.9827e+03 6.9403e-08 0.0000e+00 1.0000e+00 2.9827e+03 2.9827e+03 1.5235e+02 1.5235e+02 2.1693e-05 2.1693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5680e+00 1.3400e+07 5.8315e+02 3.0034e+03 6.8684e-08 0.0000e+00 1.0000e+00 3.0034e+03 3.0034e+03 1.5341e+02 1.5341e+02 2.1779e-05 2.1779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5700e+00 1.3500e+07 5.8315e+02 3.0240e+03 6.7974e-08 0.0000e+00 1.0000e+00 3.0240e+03 3.0240e+03 1.5446e+02 1.5446e+02 2.1864e-05 2.1864e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5720e+00 1.3600e+07 5.8315e+02 3.0445e+03 6.7275e-08 0.0000e+00 1.0000e+00 3.0445e+03 3.0445e+03 1.5551e+02 1.5551e+02 2.1950e-05 2.1950e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5740e+00 1.3700e+07 5.8315e+02 3.0649e+03 6.6585e-08 0.0000e+00 1.0000e+00 3.0649e+03 3.0649e+03 1.5655e+02 1.5655e+02 2.2036e-05 2.2036e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5760e+00 1.3800e+07 5.8315e+02 3.0853e+03 6.5904e-08 0.0000e+00 1.0000e+00 3.0853e+03 3.0853e+03 1.5759e+02 1.5759e+02 2.2122e-05 2.2122e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5780e+00 1.3900e+07 5.8315e+02 3.1056e+03 6.5233e-08 0.0000e+00 1.0000e+00 3.1056e+03 3.1056e+03 1.5863e+02 1.5863e+02 2.2208e-05 2.2208e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.1258e+03 6.4571e-08 0.0000e+00 1.0000e+00 3.1258e+03 3.1258e+03 1.5966e+02 1.5966e+02 2.2295e-05 2.2295e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5820e+00 1.4100e+07 5.8315e+02 3.1460e+03 6.3919e-08 0.0000e+00 1.0000e+00 3.1460e+03 3.1460e+03 1.6069e+02 1.6069e+02 2.2382e-05 2.2382e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5840e+00 1.4200e+07 5.8315e+02 3.1661e+03 6.3275e-08 0.0000e+00 1.0000e+00 3.1661e+03 3.1661e+03 1.6171e+02 1.6171e+02 2.2469e-05 2.2469e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5860e+00 1.4300e+07 5.8315e+02 3.1860e+03 6.2639e-08 0.0000e+00 1.0000e+00 3.1860e+03 3.1860e+03 1.6273e+02 1.6273e+02 2.2556e-05 2.2556e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5880e+00 1.4400e+07 5.8315e+02 3.2060e+03 6.2013e-08 0.0000e+00 1.0000e+00 3.2060e+03 3.2060e+03 1.6375e+02 1.6375e+02 2.2643e-05 2.2643e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5900e+00 1.4500e+07 5.8315e+02 3.2258e+03 6.1395e-08 0.0000e+00 1.0000e+00 3.2258e+03 3.2258e+03 1.6477e+02 1.6477e+02 2.2731e-05 2.2731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5920e+00 1.4600e+07 5.8315e+02 3.2456e+03 6.0785e-08 0.0000e+00 1.0000e+00 3.2456e+03 3.2456e+03 1.6578e+02 1.6578e+02 2.2818e-05 2.2818e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5940e+00 1.4700e+07 5.8315e+02 3.2653e+03 6.0184e-08 0.0000e+00 1.0000e+00 3.2653e+03 3.2653e+03 1.6678e+02 1.6678e+02 2.2906e-05 2.2906e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5960e+00 1.4800e+07 5.8315e+02 3.2849e+03 5.9590e-08 0.0000e+00 1.0000e+00 3.2849e+03 3.2849e+03 1.6778e+02 1.6778e+02 2.2994e-05 2.2994e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5980e+00 1.4900e+07 5.8315e+02 3.3044e+03 5.9005e-08 0.0000e+00 1.0000e+00 3.3044e+03 3.3044e+03 1.6878e+02 1.6878e+02 2.3082e-05 2.3082e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.3239e+03 5.8427e-08 0.0000e+00 1.0000e+00 3.3239e+03 3.3239e+03 1.6977e+02 1.6977e+02 2.3170e-05 2.3170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6020e+00 1.5100e+07 5.8315e+02 3.3433e+03 5.7857e-08 0.0000e+00 1.0000e+00 3.3433e+03 3.3433e+03 1.7076e+02 1.7076e+02 2.3258e-05 2.3258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6040e+00 1.5200e+07 5.8315e+02 3.3626e+03 5.7295e-08 0.0000e+00 1.0000e+00 3.3626e+03 3.3626e+03 1.7175e+02 1.7175e+02 2.3346e-05 2.3346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6060e+00 1.5300e+07 5.8315e+02 3.3818e+03 5.6740e-08 0.0000e+00 1.0000e+00 3.3818e+03 3.3818e+03 1.7273e+02 1.7273e+02 2.3435e-05 2.3435e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6080e+00 1.5400e+07 5.8315e+02 3.4009e+03 5.6192e-08 0.0000e+00 1.0000e+00 3.4009e+03 3.4009e+03 1.7371e+02 1.7371e+02 2.3523e-05 2.3523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6100e+00 1.5500e+07 5.8315e+02 3.4200e+03 5.5652e-08 0.0000e+00 1.0000e+00 3.4200e+03 3.4200e+03 1.7468e+02 1.7468e+02 2.3612e-05 2.3612e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6120e+00 1.5600e+07 5.8315e+02 3.4390e+03 5.5119e-08 0.0000e+00 1.0000e+00 3.4390e+03 3.4390e+03 1.7566e+02 1.7566e+02 2.3700e-05 2.3700e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6140e+00 1.5700e+07 5.8315e+02 3.4579e+03 5.4593e-08 0.0000e+00 1.0000e+00 3.4579e+03 3.4579e+03 1.7662e+02 1.7662e+02 2.3789e-05 2.3789e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6160e+00 1.5800e+07 5.8315e+02 3.4768e+03 5.4073e-08 0.0000e+00 1.0000e+00 3.4768e+03 3.4768e+03 1.7758e+02 1.7758e+02 2.3878e-05 2.3878e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6180e+00 1.5900e+07 5.8315e+02 3.4955e+03 5.3561e-08 0.0000e+00 1.0000e+00 3.4955e+03 3.4955e+03 1.7854e+02 1.7854e+02 2.3967e-05 2.3967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.5142e+03 5.3055e-08 0.0000e+00 1.0000e+00 3.5142e+03 3.5142e+03 1.7950e+02 1.7950e+02 2.4056e-05 2.4056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6220e+00 1.6100e+07 5.8315e+02 3.5328e+03 5.2556e-08 0.0000e+00 1.0000e+00 3.5328e+03 3.5328e+03 1.8045e+02 1.8045e+02 2.4145e-05 2.4145e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6240e+00 1.6200e+07 5.8315e+02 3.5513e+03 5.2063e-08 0.0000e+00 1.0000e+00 3.5513e+03 3.5513e+03 1.8139e+02 1.8139e+02 2.4234e-05 2.4234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6260e+00 1.6300e+07 5.8315e+02 3.5698e+03 5.1577e-08 0.0000e+00 1.0000e+00 3.5698e+03 3.5698e+03 1.8234e+02 1.8234e+02 2.4323e-05 2.4323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6280e+00 1.6400e+07 5.8315e+02 3.5882e+03 5.1097e-08 0.0000e+00 1.0000e+00 3.5882e+03 3.5882e+03 1.8327e+02 1.8327e+02 2.4412e-05 2.4412e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6300e+00 1.6500e+07 5.8315e+02 3.6065e+03 5.0623e-08 0.0000e+00 1.0000e+00 3.6065e+03 3.6065e+03 1.8421e+02 1.8421e+02 2.4501e-05 2.4501e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6320e+00 1.6600e+07 5.8315e+02 3.6247e+03 5.0155e-08 0.0000e+00 1.0000e+00 3.6247e+03 3.6247e+03 1.8514e+02 1.8514e+02 2.4590e-05 2.4590e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6340e+00 1.6700e+07 5.8315e+02 3.6428e+03 4.9693e-08 0.0000e+00 1.0000e+00 3.6428e+03 3.6428e+03 1.8607e+02 1.8607e+02 2.4679e-05 2.4679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6360e+00 1.6800e+07 5.8315e+02 3.6609e+03 4.9237e-08 0.0000e+00 1.0000e+00 3.6609e+03 3.6609e+03 1.8699e+02 1.8699e+02 2.4768e-05 2.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6380e+00 1.6900e+07 5.8315e+02 3.6789e+03 4.8787e-08 0.0000e+00 1.0000e+00 3.6789e+03 3.6789e+03 1.8791e+02 1.8791e+02 2.4858e-05 2.4858e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.6968e+03 4.8343e-08 0.0000e+00 1.0000e+00 3.6968e+03 3.6968e+03 1.8882e+02 1.8882e+02 2.4947e-05 2.4947e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6420e+00 1.7100e+07 5.8315e+02 3.7146e+03 4.7905e-08 0.0000e+00 1.0000e+00 3.7146e+03 3.7146e+03 1.8973e+02 1.8973e+02 2.5036e-05 2.5036e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6440e+00 1.7200e+07 5.8315e+02 3.7324e+03 4.7472e-08 0.0000e+00 1.0000e+00 3.7324e+03 3.7324e+03 1.9064e+02 1.9064e+02 2.5125e-05 2.5125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6460e+00 1.7300e+07 5.8315e+02 3.7500e+03 4.7044e-08 0.0000e+00 1.0000e+00 3.7500e+03 3.7500e+03 1.9154e+02 1.9154e+02 2.5214e-05 2.5214e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6480e+00 1.7400e+07 5.8315e+02 3.7676e+03 4.6622e-08 0.0000e+00 1.0000e+00 3.7676e+03 3.7676e+03 1.9244e+02 1.9244e+02 2.5303e-05 2.5303e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6500e+00 1.7500e+07 5.8315e+02 3.7852e+03 4.6205e-08 0.0000e+00 1.0000e+00 3.7852e+03 3.7852e+03 1.9334e+02 1.9334e+02 2.5392e-05 2.5392e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6520e+00 1.7600e+07 5.8315e+02 3.8026e+03 4.5794e-08 0.0000e+00 1.0000e+00 3.8026e+03 3.8026e+03 1.9423e+02 1.9423e+02 2.5481e-05 2.5481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6540e+00 1.7700e+07 5.8315e+02 3.8200e+03 4.5387e-08 0.0000e+00 1.0000e+00 3.8200e+03 3.8200e+03 1.9512e+02 1.9512e+02 2.5570e-05 2.5570e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6560e+00 1.7800e+07 5.8315e+02 3.8373e+03 4.4986e-08 0.0000e+00 1.0000e+00 3.8373e+03 3.8373e+03 1.9600e+02 1.9600e+02 2.5659e-05 2.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6580e+00 1.7900e+07 5.8315e+02 3.8545e+03 4.4590e-08 0.0000e+00 1.0000e+00 3.8545e+03 3.8545e+03 1.9688e+02 1.9688e+02 2.5748e-05 2.5748e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 3.8717e+03 4.4199e-08 0.0000e+00 1.0000e+00 3.8717e+03 3.8717e+03 1.9776e+02 1.9776e+02 2.5837e-05 2.5837e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6620e+00 1.8100e+07 5.8315e+02 3.8888e+03 4.3812e-08 0.0000e+00 1.0000e+00 3.8888e+03 3.8888e+03 1.9863e+02 1.9863e+02 2.5926e-05 2.5926e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6640e+00 1.8200e+07 5.8315e+02 3.9058e+03 4.3431e-08 0.0000e+00 1.0000e+00 3.9058e+03 3.9058e+03 1.9950e+02 1.9950e+02 2.6015e-05 2.6015e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6660e+00 1.8300e+07 5.8315e+02 3.9227e+03 4.3054e-08 0.0000e+00 1.0000e+00 3.9227e+03 3.9227e+03 2.0036e+02 2.0036e+02 2.6104e-05 2.6104e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6680e+00 1.8400e+07 5.8315e+02 3.9395e+03 4.2682e-08 0.0000e+00 1.0000e+00 3.9395e+03 3.9395e+03 2.0122e+02 2.0122e+02 2.6192e-05 2.6192e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6700e+00 1.8500e+07 5.8315e+02 3.9563e+03 4.2314e-08 0.0000e+00 1.0000e+00 3.9563e+03 3.9563e+03 2.0208e+02 2.0208e+02 2.6281e-05 2.6281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6720e+00 1.8600e+07 5.8315e+02 3.9730e+03 4.1951e-08 0.0000e+00 1.0000e+00 3.9730e+03 3.9730e+03 2.0293e+02 2.0293e+02 2.6369e-05 2.6369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6740e+00 1.8700e+07 5.8315e+02 3.9896e+03 4.1593e-08 0.0000e+00 1.0000e+00 3.9896e+03 3.9896e+03 2.0378e+02 2.0378e+02 2.6458e-05 2.6458e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6760e+00 1.8800e+07 5.8315e+02 4.0062e+03 4.1239e-08 0.0000e+00 1.0000e+00 4.0062e+03 4.0062e+03 2.0463e+02 2.0463e+02 2.6546e-05 2.6546e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6780e+00 1.8900e+07 5.8315e+02 4.0227e+03 4.0889e-08 0.0000e+00 1.0000e+00 4.0227e+03 4.0227e+03 2.0547e+02 2.0547e+02 2.6634e-05 2.6634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.0391e+03 4.0543e-08 0.0000e+00 1.0000e+00 4.0391e+03 4.0391e+03 2.0631e+02 2.0631e+02 2.6722e-05 2.6722e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6820e+00 1.9100e+07 5.8315e+02 4.0554e+03 4.0202e-08 0.0000e+00 1.0000e+00 4.0554e+03 4.0554e+03 2.0714e+02 2.0714e+02 2.6811e-05 2.6811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6840e+00 1.9200e+07 5.8315e+02 4.0717e+03 3.9865e-08 0.0000e+00 1.0000e+00 4.0717e+03 4.0717e+03 2.0797e+02 2.0797e+02 2.6899e-05 2.6899e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6860e+00 1.9300e+07 5.8315e+02 4.0879e+03 3.9532e-08 0.0000e+00 1.0000e+00 4.0879e+03 4.0879e+03 2.0880e+02 2.0880e+02 2.6986e-05 2.6986e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6880e+00 1.9400e+07 5.8315e+02 4.1040e+03 3.9203e-08 0.0000e+00 1.0000e+00 4.1040e+03 4.1040e+03 2.0962e+02 2.0962e+02 2.7074e-05 2.7074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6900e+00 1.9500e+07 5.8315e+02 4.1201e+03 3.8878e-08 0.0000e+00 1.0000e+00 4.1201e+03 4.1201e+03 2.1044e+02 2.1044e+02 2.7162e-05 2.7162e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6920e+00 1.9600e+07 5.8315e+02 4.1361e+03 3.8556e-08 0.0000e+00 1.0000e+00 4.1361e+03 4.1361e+03 2.1126e+02 2.1126e+02 2.7250e-05 2.7250e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6940e+00 1.9700e+07 5.8315e+02 4.1520e+03 3.8239e-08 0.0000e+00 1.0000e+00 4.1520e+03 4.1520e+03 2.1207e+02 2.1207e+02 2.7337e-05 2.7337e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6960e+00 1.9800e+07 5.8315e+02 4.1678e+03 3.7926e-08 0.0000e+00 1.0000e+00 4.1678e+03 4.1678e+03 2.1288e+02 2.1288e+02 2.7425e-05 2.7425e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6980e+00 1.9900e+07 5.8315e+02 4.1836e+03 3.7616e-08 0.0000e+00 1.0000e+00 4.1836e+03 4.1836e+03 2.1369e+02 2.1369e+02 2.7512e-05 2.7512e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.1993e+03 3.7310e-08 0.0000e+00 1.0000e+00 4.1993e+03 4.1993e+03 2.1449e+02 2.1449e+02 2.7599e-05 2.7599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7020e+00 2.0100e+07 5.8315e+02 4.2149e+03 3.7007e-08 0.0000e+00 1.0000e+00 4.2149e+03 4.2149e+03 2.1529e+02 2.1529e+02 2.7686e-05 2.7686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7040e+00 2.0200e+07 5.8315e+02 4.2305e+03 3.6709e-08 0.0000e+00 1.0000e+00 4.2305e+03 4.2305e+03 2.1608e+02 2.1608e+02 2.7773e-05 2.7773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7060e+00 2.0300e+07 5.8315e+02 4.2460e+03 3.6413e-08 0.0000e+00 1.0000e+00 4.2460e+03 4.2460e+03 2.1687e+02 2.1687e+02 2.7860e-05 2.7860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7080e+00 2.0400e+07 5.8315e+02 4.2614e+03 3.6121e-08 0.0000e+00 1.0000e+00 4.2614e+03 4.2614e+03 2.1766e+02 2.1766e+02 2.7946e-05 2.7946e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7100e+00 2.0500e+07 5.8315e+02 4.2768e+03 3.5833e-08 0.0000e+00 1.0000e+00 4.2768e+03 4.2768e+03 2.1845e+02 2.1845e+02 2.8033e-05 2.8033e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7120e+00 2.0600e+07 5.8315e+02 4.2921e+03 3.5548e-08 0.0000e+00 1.0000e+00 4.2921e+03 4.2921e+03 2.1923e+02 2.1923e+02 2.8119e-05 2.8119e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7140e+00 2.0700e+07 5.8315e+02 4.3073e+03 3.5267e-08 0.0000e+00 1.0000e+00 4.3073e+03 4.3073e+03 2.2000e+02 2.2000e+02 2.8206e-05 2.8206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7160e+00 2.0800e+07 5.8315e+02 4.3224e+03 3.4988e-08 0.0000e+00 1.0000e+00 4.3224e+03 4.3224e+03 2.2078e+02 2.2078e+02 2.8292e-05 2.8292e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7180e+00 2.0900e+07 5.8315e+02 4.3375e+03 3.4713e-08 0.0000e+00 1.0000e+00 4.3375e+03 4.3375e+03 2.2155e+02 2.2155e+02 2.8378e-05 2.8378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.3526e+03 3.4441e-08 0.0000e+00 1.0000e+00 4.3526e+03 4.3526e+03 2.2232e+02 2.2232e+02 2.8464e-05 2.8464e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7220e+00 2.1100e+07 5.8315e+02 4.3675e+03 3.4172e-08 0.0000e+00 1.0000e+00 4.3675e+03 4.3675e+03 2.2308e+02 2.2308e+02 2.8550e-05 2.8550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7240e+00 2.1200e+07 5.8315e+02 4.3824e+03 3.3907e-08 0.0000e+00 1.0000e+00 4.3824e+03 4.3824e+03 2.2384e+02 2.2384e+02 2.8635e-05 2.8635e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7260e+00 2.1300e+07 5.8315e+02 4.3972e+03 3.3644e-08 0.0000e+00 1.0000e+00 4.3972e+03 4.3972e+03 2.2460e+02 2.2460e+02 2.8721e-05 2.8721e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7280e+00 2.1400e+07 5.8315e+02 4.4120e+03 3.3385e-08 0.0000e+00 1.0000e+00 4.4120e+03 4.4120e+03 2.2535e+02 2.2535e+02 2.8806e-05 2.8806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7300e+00 2.1500e+07 5.8315e+02 4.4267e+03 3.3128e-08 0.0000e+00 1.0000e+00 4.4267e+03 4.4267e+03 2.2610e+02 2.2610e+02 2.8891e-05 2.8891e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7320e+00 2.1600e+07 5.8315e+02 4.4413e+03 3.2875e-08 0.0000e+00 1.0000e+00 4.4413e+03 4.4413e+03 2.2685e+02 2.2685e+02 2.8976e-05 2.8976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7340e+00 2.1700e+07 5.8315e+02 4.4559e+03 3.2624e-08 0.0000e+00 1.0000e+00 4.4559e+03 4.4559e+03 2.2759e+02 2.2759e+02 2.9061e-05 2.9061e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7360e+00 2.1800e+07 5.8315e+02 4.4704e+03 3.2376e-08 0.0000e+00 1.0000e+00 4.4704e+03 4.4704e+03 2.2834e+02 2.2834e+02 2.9146e-05 2.9146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7380e+00 2.1900e+07 5.8315e+02 4.4848e+03 3.2131e-08 0.0000e+00 1.0000e+00 4.4848e+03 4.4848e+03 2.2907e+02 2.2907e+02 2.9231e-05 2.9231e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.4992e+03 3.1889e-08 0.0000e+00 1.0000e+00 4.4992e+03 4.4992e+03 2.2981e+02 2.2981e+02 2.9315e-05 2.9315e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7420e+00 2.2100e+07 5.8315e+02 4.5135e+03 3.1649e-08 0.0000e+00 1.0000e+00 4.5135e+03 4.5135e+03 2.3054e+02 2.3054e+02 2.9399e-05 2.9399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7440e+00 2.2200e+07 5.8315e+02 4.5278e+03 3.1413e-08 0.0000e+00 1.0000e+00 4.5278e+03 4.5278e+03 2.3127e+02 2.3127e+02 2.9484e-05 2.9484e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7460e+00 2.2300e+07 5.8315e+02 4.5420e+03 3.1178e-08 0.0000e+00 1.0000e+00 4.5420e+03 4.5420e+03 2.3199e+02 2.3199e+02 2.9568e-05 2.9568e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7480e+00 2.2400e+07 5.8315e+02 4.5561e+03 3.0947e-08 0.0000e+00 1.0000e+00 4.5561e+03 4.5561e+03 2.3271e+02 2.3271e+02 2.9651e-05 2.9651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7500e+00 2.2500e+07 5.8315e+02 4.5702e+03 3.0718e-08 0.0000e+00 1.0000e+00 4.5702e+03 4.5702e+03 2.3343e+02 2.3343e+02 2.9735e-05 2.9735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7520e+00 2.2600e+07 5.8315e+02 4.5842e+03 3.0492e-08 0.0000e+00 1.0000e+00 4.5842e+03 4.5842e+03 2.3415e+02 2.3415e+02 2.9819e-05 2.9819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7540e+00 2.2700e+07 5.8315e+02 4.5981e+03 3.0268e-08 0.0000e+00 1.0000e+00 4.5981e+03 4.5981e+03 2.3486e+02 2.3486e+02 2.9902e-05 2.9902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7560e+00 2.2800e+07 5.8315e+02 4.6120e+03 3.0046e-08 0.0000e+00 1.0000e+00 4.6120e+03 4.6120e+03 2.3557e+02 2.3557e+02 2.9985e-05 2.9985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7580e+00 2.2900e+07 5.8315e+02 4.6258e+03 2.9827e-08 0.0000e+00 1.0000e+00 4.6258e+03 4.6258e+03 2.3628e+02 2.3628e+02 3.0068e-05 3.0068e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.6396e+03 2.9611e-08 0.0000e+00 1.0000e+00 4.6396e+03 4.6396e+03 2.3698e+02 2.3698e+02 3.0151e-05 3.0151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7620e+00 2.3100e+07 5.8315e+02 4.6533e+03 2.9397e-08 0.0000e+00 1.0000e+00 4.6533e+03 4.6533e+03 2.3768e+02 2.3768e+02 3.0234e-05 3.0234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7640e+00 2.3200e+07 5.8315e+02 4.6670e+03 2.9185e-08 0.0000e+00 1.0000e+00 4.6670e+03 4.6670e+03 2.3838e+02 2.3838e+02 3.0317e-05 3.0317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7660e+00 2.3300e+07 5.8315e+02 4.6806e+03 2.8976e-08 0.0000e+00 1.0000e+00 4.6806e+03 4.6806e+03 2.3907e+02 2.3907e+02 3.0399e-05 3.0399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7680e+00 2.3400e+07 5.8315e+02 4.6941e+03 2.8768e-08 0.0000e+00 1.0000e+00 4.6941e+03 4.6941e+03 2.3976e+02 2.3976e+02 3.0481e-05 3.0481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7700e+00 2.3500e+07 5.8315e+02 4.7076e+03 2.8563e-08 0.0000e+00 1.0000e+00 4.7076e+03 4.7076e+03 2.4045e+02 2.4045e+02 3.0563e-05 3.0563e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7720e+00 2.3600e+07 5.8315e+02 4.7210e+03 2.8361e-08 0.0000e+00 1.0000e+00 4.7210e+03 4.7210e+03 2.4114e+02 2.4114e+02 3.0645e-05 3.0645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7740e+00 2.3700e+07 5.8315e+02 4.7344e+03 2.8160e-08 0.0000e+00 1.0000e+00 4.7344e+03 4.7344e+03 2.4182e+02 2.4182e+02 3.0727e-05 3.0727e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7760e+00 2.3800e+07 5.8315e+02 4.7477e+03 2.7962e-08 0.0000e+00 1.0000e+00 4.7477e+03 4.7477e+03 2.4250e+02 2.4250e+02 3.0809e-05 3.0809e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7780e+00 2.3900e+07 5.8315e+02 4.7609e+03 2.7766e-08 0.0000e+00 1.0000e+00 4.7609e+03 4.7609e+03 2.4317e+02 2.4317e+02 3.0890e-05 3.0890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 4.7741e+03 2.7572e-08 0.0000e+00 1.0000e+00 4.7741e+03 4.7741e+03 2.4385e+02 2.4385e+02 3.0971e-05 3.0971e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7820e+00 2.4100e+07 5.8315e+02 4.7872e+03 2.7380e-08 0.0000e+00 1.0000e+00 4.7872e+03 4.7872e+03 2.4452e+02 2.4452e+02 3.1052e-05 3.1052e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7840e+00 2.4200e+07 5.8315e+02 4.8003e+03 2.7190e-08 0.0000e+00 1.0000e+00 4.8003e+03 4.8003e+03 2.4519e+02 2.4519e+02 3.1133e-05 3.1133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7860e+00 2.4300e+07 5.8315e+02 4.8133e+03 2.7002e-08 0.0000e+00 1.0000e+00 4.8133e+03 4.8133e+03 2.4585e+02 2.4585e+02 3.1214e-05 3.1214e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7880e+00 2.4400e+07 5.8315e+02 4.8263e+03 2.6816e-08 0.0000e+00 1.0000e+00 4.8263e+03 4.8263e+03 2.4651e+02 2.4651e+02 3.1294e-05 3.1294e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7900e+00 2.4500e+07 5.8315e+02 4.8392e+03 2.6632e-08 0.0000e+00 1.0000e+00 4.8392e+03 4.8392e+03 2.4717e+02 2.4717e+02 3.1375e-05 3.1375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7920e+00 2.4600e+07 5.8315e+02 4.8521e+03 2.6450e-08 0.0000e+00 1.0000e+00 4.8521e+03 4.8521e+03 2.4783e+02 2.4783e+02 3.1455e-05 3.1455e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7940e+00 2.4700e+07 5.8315e+02 4.8649e+03 2.6270e-08 0.0000e+00 1.0000e+00 4.8649e+03 4.8649e+03 2.4849e+02 2.4849e+02 3.1535e-05 3.1535e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7960e+00 2.4800e+07 5.8315e+02 4.8776e+03 2.6091e-08 0.0000e+00 1.0000e+00 4.8776e+03 4.8776e+03 2.4914e+02 2.4914e+02 3.1615e-05 3.1615e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7980e+00 2.4900e+07 5.8315e+02 4.8903e+03 2.5915e-08 0.0000e+00 1.0000e+00 4.8903e+03 4.8903e+03 2.4979e+02 2.4979e+02 3.1695e-05 3.1695e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 4.9030e+03 2.5740e-08 0.0000e+00 1.0000e+00 4.9030e+03 4.9030e+03 2.5043e+02 2.5043e+02 3.1774e-05 3.1774e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8020e+00 2.5100e+07 5.8315e+02 4.9156e+03 2.5568e-08 0.0000e+00 1.0000e+00 4.9156e+03 4.9156e+03 2.5107e+02 2.5107e+02 3.1854e-05 3.1854e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8040e+00 2.5200e+07 5.8315e+02 4.9281e+03 2.5397e-08 0.0000e+00 1.0000e+00 4.9281e+03 4.9281e+03 2.5172e+02 2.5172e+02 3.1933e-05 3.1933e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8060e+00 2.5300e+07 5.8315e+02 4.9406e+03 2.5228e-08 0.0000e+00 1.0000e+00 4.9406e+03 4.9406e+03 2.5235e+02 2.5235e+02 3.2012e-05 3.2012e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8080e+00 2.5400e+07 5.8315e+02 4.9530e+03 2.5060e-08 0.0000e+00 1.0000e+00 4.9530e+03 4.9530e+03 2.5299e+02 2.5299e+02 3.2091e-05 3.2091e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8100e+00 2.5500e+07 5.8315e+02 4.9654e+03 2.4894e-08 0.0000e+00 1.0000e+00 4.9654e+03 4.9654e+03 2.5362e+02 2.5362e+02 3.2170e-05 3.2170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8120e+00 2.5600e+07 5.8315e+02 4.9778e+03 2.4730e-08 0.0000e+00 1.0000e+00 4.9778e+03 4.9778e+03 2.5425e+02 2.5425e+02 3.2248e-05 3.2248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8140e+00 2.5700e+07 5.8315e+02 4.9901e+03 2.4568e-08 0.0000e+00 1.0000e+00 4.9901e+03 4.9901e+03 2.5488e+02 2.5488e+02 3.2326e-05 3.2326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8160e+00 2.5800e+07 5.8315e+02 5.0023e+03 2.4407e-08 0.0000e+00 1.0000e+00 5.0023e+03 5.0023e+03 2.5550e+02 2.5550e+02 3.2405e-05 3.2405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8180e+00 2.5900e+07 5.8315e+02 5.0145e+03 2.4248e-08 0.0000e+00 1.0000e+00 5.0145e+03 5.0145e+03 2.5613e+02 2.5613e+02 3.2483e-05 3.2483e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.0266e+03 2.4091e-08 0.0000e+00 1.0000e+00 5.0266e+03 5.0266e+03 2.5675e+02 2.5675e+02 3.2560e-05 3.2560e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8220e+00 2.6100e+07 5.8315e+02 5.0387e+03 2.3935e-08 0.0000e+00 1.0000e+00 5.0387e+03 5.0387e+03 2.5736e+02 2.5736e+02 3.2638e-05 3.2638e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8240e+00 2.6200e+07 5.8315e+02 5.0507e+03 2.3781e-08 0.0000e+00 1.0000e+00 5.0507e+03 5.0507e+03 2.5798e+02 2.5798e+02 3.2716e-05 3.2716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8260e+00 2.6300e+07 5.8315e+02 5.0627e+03 2.3628e-08 0.0000e+00 1.0000e+00 5.0627e+03 5.0627e+03 2.5859e+02 2.5859e+02 3.2793e-05 3.2793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8280e+00 2.6400e+07 5.8315e+02 5.0747e+03 2.3477e-08 0.0000e+00 1.0000e+00 5.0747e+03 5.0747e+03 2.5920e+02 2.5920e+02 3.2870e-05 3.2870e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8300e+00 2.6500e+07 5.8315e+02 5.0865e+03 2.3327e-08 0.0000e+00 1.0000e+00 5.0865e+03 5.0865e+03 2.5981e+02 2.5981e+02 3.2947e-05 3.2947e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8320e+00 2.6600e+07 5.8315e+02 5.0984e+03 2.3179e-08 0.0000e+00 1.0000e+00 5.0984e+03 5.0984e+03 2.6041e+02 2.6041e+02 3.3024e-05 3.3024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8340e+00 2.6700e+07 5.8315e+02 5.1102e+03 2.3032e-08 0.0000e+00 1.0000e+00 5.1102e+03 5.1102e+03 2.6101e+02 2.6101e+02 3.3101e-05 3.3101e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8360e+00 2.6800e+07 5.8315e+02 5.1219e+03 2.2887e-08 0.0000e+00 1.0000e+00 5.1219e+03 5.1219e+03 2.6161e+02 2.6161e+02 3.3177e-05 3.3177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8380e+00 2.6900e+07 5.8315e+02 5.1336e+03 2.2743e-08 0.0000e+00 1.0000e+00 5.1336e+03 5.1336e+03 2.6221e+02 2.6221e+02 3.3253e-05 3.3253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.1453e+03 2.2601e-08 0.0000e+00 1.0000e+00 5.1453e+03 5.1453e+03 2.6281e+02 2.6281e+02 3.3330e-05 3.3330e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8420e+00 2.7100e+07 5.8315e+02 5.1569e+03 2.2460e-08 0.0000e+00 1.0000e+00 5.1569e+03 5.1569e+03 2.6340e+02 2.6340e+02 3.3406e-05 3.3406e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8440e+00 2.7200e+07 5.8315e+02 5.1684e+03 2.2320e-08 0.0000e+00 1.0000e+00 5.1684e+03 5.1684e+03 2.6399e+02 2.6399e+02 3.3481e-05 3.3481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8460e+00 2.7300e+07 5.8315e+02 5.1800e+03 2.2182e-08 0.0000e+00 1.0000e+00 5.1800e+03 5.1800e+03 2.6458e+02 2.6458e+02 3.3557e-05 3.3557e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8480e+00 2.7400e+07 5.8315e+02 5.1914e+03 2.2045e-08 0.0000e+00 1.0000e+00 5.1914e+03 5.1914e+03 2.6516e+02 2.6516e+02 3.3632e-05 3.3632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8500e+00 2.7500e+07 5.8315e+02 5.2028e+03 2.1909e-08 0.0000e+00 1.0000e+00 5.2028e+03 5.2028e+03 2.6575e+02 2.6575e+02 3.3708e-05 3.3708e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8520e+00 2.7600e+07 5.8315e+02 5.2142e+03 2.1775e-08 0.0000e+00 1.0000e+00 5.2142e+03 5.2142e+03 2.6633e+02 2.6633e+02 3.3783e-05 3.3783e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8540e+00 2.7700e+07 5.8315e+02 5.2256e+03 2.1642e-08 0.0000e+00 1.0000e+00 5.2256e+03 5.2256e+03 2.6691e+02 2.6691e+02 3.3858e-05 3.3858e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8560e+00 2.7800e+07 5.8315e+02 5.2368e+03 2.1510e-08 0.0000e+00 1.0000e+00 5.2368e+03 5.2368e+03 2.6748e+02 2.6748e+02 3.3933e-05 3.3933e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8580e+00 2.7900e+07 5.8315e+02 5.2481e+03 2.1380e-08 0.0000e+00 1.0000e+00 5.2481e+03 5.2481e+03 2.6806e+02 2.6806e+02 3.4007e-05 3.4007e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.2593e+03 2.1251e-08 0.0000e+00 1.0000e+00 5.2593e+03 5.2593e+03 2.6863e+02 2.6863e+02 3.4082e-05 3.4082e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8620e+00 2.8100e+07 5.8315e+02 5.2704e+03 2.1123e-08 0.0000e+00 1.0000e+00 5.2704e+03 5.2704e+03 2.6920e+02 2.6920e+02 3.4156e-05 3.4156e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8640e+00 2.8200e+07 5.8315e+02 5.2815e+03 2.0996e-08 0.0000e+00 1.0000e+00 5.2815e+03 5.2815e+03 2.6977e+02 2.6977e+02 3.4230e-05 3.4230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8660e+00 2.8300e+07 5.8315e+02 5.2926e+03 2.0870e-08 0.0000e+00 1.0000e+00 5.2926e+03 5.2926e+03 2.7033e+02 2.7033e+02 3.4304e-05 3.4304e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8680e+00 2.8400e+07 5.8315e+02 5.3036e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.3036e+03 5.3036e+03 2.7090e+02 2.7090e+02 3.4378e-05 3.4378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8700e+00 2.8500e+07 5.8315e+02 5.3146e+03 2.0623e-08 0.0000e+00 1.0000e+00 5.3146e+03 5.3146e+03 2.7146e+02 2.7146e+02 3.4452e-05 3.4452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8720e+00 2.8600e+07 5.8315e+02 5.3256e+03 2.0501e-08 0.0000e+00 1.0000e+00 5.3256e+03 5.3256e+03 2.7202e+02 2.7202e+02 3.4525e-05 3.4525e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8740e+00 2.8700e+07 5.8315e+02 5.3365e+03 2.0380e-08 0.0000e+00 1.0000e+00 5.3365e+03 5.3365e+03 2.7257e+02 2.7257e+02 3.4599e-05 3.4599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8760e+00 2.8800e+07 5.8315e+02 5.3473e+03 2.0260e-08 0.0000e+00 1.0000e+00 5.3473e+03 5.3473e+03 2.7313e+02 2.7313e+02 3.4672e-05 3.4672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8780e+00 2.8900e+07 5.8315e+02 5.3581e+03 2.0141e-08 0.0000e+00 1.0000e+00 5.3581e+03 5.3581e+03 2.7368e+02 2.7368e+02 3.4745e-05 3.4745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.3689e+03 2.0024e-08 0.0000e+00 1.0000e+00 5.3689e+03 5.3689e+03 2.7423e+02 2.7423e+02 3.4818e-05 3.4818e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8820e+00 2.9100e+07 5.8315e+02 5.3796e+03 1.9907e-08 0.0000e+00 1.0000e+00 5.3796e+03 5.3796e+03 2.7478e+02 2.7478e+02 3.4890e-05 3.4890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8840e+00 2.9200e+07 5.8315e+02 5.3903e+03 1.9792e-08 0.0000e+00 1.0000e+00 5.3903e+03 5.3903e+03 2.7532e+02 2.7532e+02 3.4963e-05 3.4963e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8860e+00 2.9300e+07 5.8315e+02 5.4010e+03 1.9678e-08 0.0000e+00 1.0000e+00 5.4010e+03 5.4010e+03 2.7587e+02 2.7587e+02 3.5035e-05 3.5035e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8880e+00 2.9400e+07 5.8315e+02 5.4116e+03 1.9564e-08 0.0000e+00 1.0000e+00 5.4116e+03 5.4116e+03 2.7641e+02 2.7641e+02 3.5107e-05 3.5107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8900e+00 2.9500e+07 5.8315e+02 5.4221e+03 1.9452e-08 0.0000e+00 1.0000e+00 5.4221e+03 5.4221e+03 2.7695e+02 2.7695e+02 3.5179e-05 3.5179e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8920e+00 2.9600e+07 5.8315e+02 5.4327e+03 1.9341e-08 0.0000e+00 1.0000e+00 5.4327e+03 5.4327e+03 2.7749e+02 2.7749e+02 3.5251e-05 3.5251e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8940e+00 2.9700e+07 5.8315e+02 5.4431e+03 1.9231e-08 0.0000e+00 1.0000e+00 5.4431e+03 5.4431e+03 2.7802e+02 2.7802e+02 3.5323e-05 3.5323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8960e+00 2.9800e+07 5.8315e+02 5.4536e+03 1.9121e-08 0.0000e+00 1.0000e+00 5.4536e+03 5.4536e+03 2.7856e+02 2.7856e+02 3.5394e-05 3.5394e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8980e+00 2.9900e+07 5.8315e+02 5.4640e+03 1.9013e-08 0.0000e+00 1.0000e+00 5.4640e+03 5.4640e+03 2.7909e+02 2.7909e+02 3.5466e-05 3.5466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.4744e+03 1.8906e-08 0.0000e+00 1.0000e+00 5.4744e+03 5.4744e+03 2.7962e+02 2.7962e+02 3.5537e-05 3.5537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9020e+00 3.0100e+07 5.8315e+02 5.4847e+03 1.8800e-08 0.0000e+00 1.0000e+00 5.4847e+03 5.4847e+03 2.8014e+02 2.8014e+02 3.5608e-05 3.5608e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9040e+00 3.0200e+07 5.8315e+02 5.4950e+03 1.8694e-08 0.0000e+00 1.0000e+00 5.4950e+03 5.4950e+03 2.8067e+02 2.8067e+02 3.5679e-05 3.5679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9060e+00 3.0300e+07 5.8315e+02 5.5053e+03 1.8590e-08 0.0000e+00 1.0000e+00 5.5053e+03 5.5053e+03 2.8119e+02 2.8119e+02 3.5750e-05 3.5750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9080e+00 3.0400e+07 5.8315e+02 5.5155e+03 1.8486e-08 0.0000e+00 1.0000e+00 5.5155e+03 5.5155e+03 2.8172e+02 2.8172e+02 3.5821e-05 3.5821e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9100e+00 3.0500e+07 5.8315e+02 5.5256e+03 1.8384e-08 0.0000e+00 1.0000e+00 5.5256e+03 5.5256e+03 2.8224e+02 2.8224e+02 3.5891e-05 3.5891e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9120e+00 3.0600e+07 5.8315e+02 5.5358e+03 1.8282e-08 0.0000e+00 1.0000e+00 5.5358e+03 5.5358e+03 2.8275e+02 2.8275e+02 3.5961e-05 3.5961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9140e+00 3.0700e+07 5.8315e+02 5.5459e+03 1.8182e-08 0.0000e+00 1.0000e+00 5.5459e+03 5.5459e+03 2.8327e+02 2.8327e+02 3.6032e-05 3.6032e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9160e+00 3.0800e+07 5.8315e+02 5.5559e+03 1.8082e-08 0.0000e+00 1.0000e+00 5.5559e+03 5.5559e+03 2.8378e+02 2.8378e+02 3.6102e-05 3.6102e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9180e+00 3.0900e+07 5.8315e+02 5.5660e+03 1.7983e-08 0.0000e+00 1.0000e+00 5.5660e+03 5.5660e+03 2.8430e+02 2.8430e+02 3.6171e-05 3.6171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.5760e+03 1.7885e-08 0.0000e+00 1.0000e+00 5.5760e+03 5.5760e+03 2.8481e+02 2.8481e+02 3.6241e-05 3.6241e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9220e+00 3.1100e+07 5.8315e+02 5.5859e+03 1.7787e-08 0.0000e+00 1.0000e+00 5.5859e+03 5.5859e+03 2.8531e+02 2.8531e+02 3.6311e-05 3.6311e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9240e+00 3.1200e+07 5.8315e+02 5.5958e+03 1.7691e-08 0.0000e+00 1.0000e+00 5.5958e+03 5.5958e+03 2.8582e+02 2.8582e+02 3.6380e-05 3.6380e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9260e+00 3.1300e+07 5.8315e+02 5.6057e+03 1.7595e-08 0.0000e+00 1.0000e+00 5.6057e+03 5.6057e+03 2.8633e+02 2.8633e+02 3.6449e-05 3.6449e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9280e+00 3.1400e+07 5.8315e+02 5.6156e+03 1.7501e-08 0.0000e+00 1.0000e+00 5.6156e+03 5.6156e+03 2.8683e+02 2.8683e+02 3.6518e-05 3.6518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9300e+00 3.1500e+07 5.8315e+02 5.6254e+03 1.7407e-08 0.0000e+00 1.0000e+00 5.6254e+03 5.6254e+03 2.8733e+02 2.8733e+02 3.6587e-05 3.6587e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9320e+00 3.1600e+07 5.8315e+02 5.6352e+03 1.7314e-08 0.0000e+00 1.0000e+00 5.6352e+03 5.6352e+03 2.8783e+02 2.8783e+02 3.6656e-05 3.6656e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9340e+00 3.1700e+07 5.8315e+02 5.6449e+03 1.7221e-08 0.0000e+00 1.0000e+00 5.6449e+03 5.6449e+03 2.8833e+02 2.8833e+02 3.6725e-05 3.6725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9360e+00 3.1800e+07 5.8315e+02 5.6546e+03 1.7130e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 3.6793e-05 3.6793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9380e+00 3.1900e+07 5.8315e+02 5.6643e+03 1.7039e-08 0.0000e+00 1.0000e+00 5.6643e+03 5.6643e+03 2.8932e+02 2.8932e+02 3.6862e-05 3.6862e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 5.6739e+03 1.6949e-08 0.0000e+00 1.0000e+00 5.6739e+03 5.6739e+03 2.8981e+02 2.8981e+02 3.6930e-05 3.6930e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9420e+00 3.2100e+07 5.8315e+02 5.6835e+03 1.6860e-08 0.0000e+00 1.0000e+00 5.6835e+03 5.6835e+03 2.9030e+02 2.9030e+02 3.6998e-05 3.6998e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9440e+00 3.2200e+07 5.8315e+02 5.6931e+03 1.6771e-08 0.0000e+00 1.0000e+00 5.6931e+03 5.6931e+03 2.9079e+02 2.9079e+02 3.7066e-05 3.7066e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9460e+00 3.2300e+07 5.8315e+02 5.7026e+03 1.6684e-08 0.0000e+00 1.0000e+00 5.7026e+03 5.7026e+03 2.9127e+02 2.9127e+02 3.7134e-05 3.7134e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9480e+00 3.2400e+07 5.8315e+02 5.7121e+03 1.6597e-08 0.0000e+00 1.0000e+00 5.7121e+03 5.7121e+03 2.9176e+02 2.9176e+02 3.7202e-05 3.7202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9500e+00 3.2500e+07 5.8315e+02 5.7216e+03 1.6510e-08 0.0000e+00 1.0000e+00 5.7216e+03 5.7216e+03 2.9224e+02 2.9224e+02 3.7269e-05 3.7269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9520e+00 3.2600e+07 5.8315e+02 5.7310e+03 1.6425e-08 0.0000e+00 1.0000e+00 5.7310e+03 5.7310e+03 2.9272e+02 2.9272e+02 3.7337e-05 3.7337e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9540e+00 3.2700e+07 5.8315e+02 5.7404e+03 1.6340e-08 0.0000e+00 1.0000e+00 5.7404e+03 5.7404e+03 2.9320e+02 2.9320e+02 3.7404e-05 3.7404e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9560e+00 3.2800e+07 5.8315e+02 5.7497e+03 1.6256e-08 0.0000e+00 1.0000e+00 5.7497e+03 5.7497e+03 2.9368e+02 2.9368e+02 3.7471e-05 3.7471e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9580e+00 3.2900e+07 5.8315e+02 5.7591e+03 1.6173e-08 0.0000e+00 1.0000e+00 5.7591e+03 5.7591e+03 2.9416e+02 2.9416e+02 3.7538e-05 3.7538e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 5.7684e+03 1.6090e-08 0.0000e+00 1.0000e+00 5.7684e+03 5.7684e+03 2.9463e+02 2.9463e+02 3.7605e-05 3.7605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9620e+00 3.3100e+07 5.8315e+02 5.7776e+03 1.6008e-08 0.0000e+00 1.0000e+00 5.7776e+03 5.7776e+03 2.9511e+02 2.9511e+02 3.7671e-05 3.7671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9640e+00 3.3200e+07 5.8315e+02 5.7869e+03 1.5927e-08 0.0000e+00 1.0000e+00 5.7869e+03 5.7869e+03 2.9558e+02 2.9558e+02 3.7738e-05 3.7738e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9660e+00 3.3300e+07 5.8315e+02 5.7961e+03 1.5846e-08 0.0000e+00 1.0000e+00 5.7961e+03 5.7961e+03 2.9605e+02 2.9605e+02 3.7804e-05 3.7804e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9680e+00 3.3400e+07 5.8315e+02 5.8052e+03 1.5766e-08 0.0000e+00 1.0000e+00 5.8052e+03 5.8052e+03 2.9652e+02 2.9652e+02 3.7871e-05 3.7871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9700e+00 3.3500e+07 5.8315e+02 5.8144e+03 1.5686e-08 0.0000e+00 1.0000e+00 5.8144e+03 5.8144e+03 2.9698e+02 2.9698e+02 3.7937e-05 3.7937e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9720e+00 3.3600e+07 5.8315e+02 5.8235e+03 1.5608e-08 0.0000e+00 1.0000e+00 5.8235e+03 5.8235e+03 2.9745e+02 2.9745e+02 3.8003e-05 3.8003e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9740e+00 3.3700e+07 5.8315e+02 5.8326e+03 1.5530e-08 0.0000e+00 1.0000e+00 5.8326e+03 5.8326e+03 2.9791e+02 2.9791e+02 3.8069e-05 3.8069e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9760e+00 3.3800e+07 5.8315e+02 5.8416e+03 1.5452e-08 0.0000e+00 1.0000e+00 5.8416e+03 5.8416e+03 2.9837e+02 2.9837e+02 3.8134e-05 3.8134e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9780e+00 3.3900e+07 5.8315e+02 5.8506e+03 1.5375e-08 0.0000e+00 1.0000e+00 5.8506e+03 5.8506e+03 2.9883e+02 2.9883e+02 3.8200e-05 3.8200e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 5.8596e+03 1.5299e-08 0.0000e+00 1.0000e+00 5.8596e+03 5.8596e+03 2.9929e+02 2.9929e+02 3.8265e-05 3.8265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9820e+00 3.4100e+07 5.8315e+02 5.8685e+03 1.5223e-08 0.0000e+00 1.0000e+00 5.8685e+03 5.8685e+03 2.9975e+02 2.9975e+02 3.8331e-05 3.8331e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9840e+00 3.4200e+07 5.8315e+02 5.8775e+03 1.5148e-08 0.0000e+00 1.0000e+00 5.8775e+03 5.8775e+03 3.0020e+02 3.0020e+02 3.8396e-05 3.8396e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9860e+00 3.4300e+07 5.8315e+02 5.8863e+03 1.5074e-08 0.0000e+00 1.0000e+00 5.8863e+03 5.8863e+03 3.0066e+02 3.0066e+02 3.8461e-05 3.8461e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9880e+00 3.4400e+07 5.8315e+02 5.8952e+03 1.5000e-08 0.0000e+00 1.0000e+00 5.8952e+03 5.8952e+03 3.0111e+02 3.0111e+02 3.8526e-05 3.8526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9900e+00 3.4500e+07 5.8315e+02 5.9040e+03 1.4927e-08 0.0000e+00 1.0000e+00 5.9040e+03 5.9040e+03 3.0156e+02 3.0156e+02 3.8591e-05 3.8591e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9920e+00 3.4600e+07 5.8315e+02 5.9128e+03 1.4854e-08 0.0000e+00 1.0000e+00 5.9128e+03 5.9128e+03 3.0201e+02 3.0201e+02 3.8655e-05 3.8655e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9940e+00 3.4700e+07 5.8315e+02 5.9216e+03 1.4782e-08 0.0000e+00 1.0000e+00 5.9216e+03 5.9216e+03 3.0246e+02 3.0246e+02 3.8720e-05 3.8720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9960e+00 3.4800e+07 5.8315e+02 5.9303e+03 1.4711e-08 0.0000e+00 1.0000e+00 5.9303e+03 5.9303e+03 3.0291e+02 3.0291e+02 3.8784e-05 3.8784e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9980e+00 3.4900e+07 5.8315e+02 5.9390e+03 1.4640e-08 0.0000e+00 1.0000e+00 5.9390e+03 5.9390e+03 3.0335e+02 3.0335e+02 3.8849e-05 3.8849e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 5.9477e+03 1.4569e-08 0.0000e+00 1.0000e+00 5.9477e+03 5.9477e+03 3.0379e+02 3.0379e+02 3.8913e-05 3.8913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 7abc6ca2de1..2abdc8e16cf 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -1,10 +1,9 @@ # Specify list of tests - -set(gtest_geosx_tests - testSinglePhaseBaseKernels.cpp - testThermalCompMultiphaseFlow.cpp - testThermalSinglePhaseFlow.cpp - ) +set( gtest_geosx_tests + testSinglePhaseBaseKernels.cpp + testThermalCompMultiphaseFlow.cpp + testThermalSinglePhaseFlow.cpp + testFlowStatistics.cpp ) set( dependencyList ${parallelDeps} gtest ) @@ -14,6 +13,7 @@ else() list( APPEND dependencyList ${geosx_core_libs} ) endif() +set( dependencyList testingUtilities ) if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 5b336a0481a..07447f822cd 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -24,6 +24,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "testFlowUtils.hpp" namespace geos { @@ -34,136 +35,6 @@ namespace testing using namespace geos::constitutive; using namespace geos::constitutive::multifluid; -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var ) -{ - real64 const numDeriv = (valueEps - value) / eps; - checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); -} - -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } - -template< int USD1, int USD2, int USD3 > -void checkDerivative( arraySlice1d< real64 const, USD1 > const & valueEps, - arraySlice1d< real64 const, USD2 > const & value, - arraySlice1d< real64 const, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels ) -{ - localIndex const size = labels.size( 0 ); - - for( localIndex i = 0; i < size; ++i ) - { - checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, - name + "[" + labels[i] + "]", var ); - } -} - -template< int DIM, int USD1, int USD2, int USD3, typename ... Args > -void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, - ArraySlice< real64 const, DIM, USD2 > const & value, - ArraySlice< real64 const, DIM, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels, - Args ... label_lists ) -{ - localIndex const size = labels.size( 0 ); - - for( localIndex i = 0; i < size; ++i ) - { - checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, - name + "[" + labels[i] + "]", var, label_lists ... ); - } -} - -template< int DIM, int USD1, int USD2, int USD3, typename ... Args > -void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, - ArraySlice< real64 const, DIM, USD2 > const & value, - ArraySlice< real64 const, DIM, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels, - Args ... label_lists ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var, labels, label_lists ... ); } - -// invert compositional derivative array layout to move innermost slice on the top -// (this is needed so we can use checkDerivative() to check derivative w.r.t. for each compositional var) -template< int USD > -array1d< real64 > invertLayout( arraySlice1d< real64 const, USD > const & input, - localIndex N ) -{ - array1d< real64 > output( N ); - for( int i = 0; i < N; ++i ) - { - output[i] = input[i]; - } - - return output; -} - -template< int USD > -array2d< real64 > invertLayout( arraySlice2d< real64 const, USD > const & input, - localIndex N1, - localIndex N2 ) -{ - array2d< real64 > output( N2, N1 ); - - for( localIndex i = 0; i < N1; ++i ) - { - for( localIndex j = 0; j < N2; ++j ) - { - output( j, i ) = input( i, j ); - } - } - - return output; -} - -template< int USD > -array3d< real64 > invertLayout( arraySlice3d< real64 const, USD > const & input, - localIndex N1, - localIndex N2, - localIndex N3 ) -{ - array3d< real64 > output( N3, N1, N2 ); - - for( localIndex i = 0; i < N1; ++i ) - { - for( localIndex j = 0; j < N2; ++j ) - { - for( localIndex k = 0; k < N3; ++k ) - { - output( k, i, j ) = input( i, j, k ); - } - } - } - - return output; -} - void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp new file mode 100644 index 00000000000..12de6b8f655 --- /dev/null +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -0,0 +1,1146 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" +#include "unitTests/testingUtilities/TestingTasks.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/GeosxState.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp" + +#include + + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + + +//////////////////////////////// Test base utilities //////////////////////////////// + + +/** + * @brief this struct is used to provide the input data of each flow tests + */ +struct TestInputs +{ + string xmlInput; + std::map< string, string > tableFiles; + + string sourceFluxName; + string sinkFluxName; + string timeStepCheckerPath; + string timeStepFluxStatsPath; + string wholeSimFluxStatsPath; + string flowSolverPath; + + // rates for each timesteps, for each phases + array2d< real64 > sourceRates; + array2d< real64 > sinkRates; + + // parameters for precomputing results + real64 dt; + real64 sourceRateFactor; + real64 sinkRateFactor; + integer sourceElementsCount; + integer sinkElementsCount; + + /// In order to be sure that sub-timestepping is supported, requires the test to have at least one sub-timestep. + /// At least one simulation should test the timestep cuts ! + integer requiredSubTimeStep = 0; +}; + +/** + * @brief this struct computes from the test inputs the values to expect from the simulation. + */ +struct TestSet +{ + TestInputs const inputs; + + integer timestepCount; + integer totalElementsCount; + integer phaseCount; + + // stats for each timesteps, for each phases + array2d< real64 > sourceRates; + array2d< real64 > sinkRates; + array2d< real64 > sourceMassProd; + array2d< real64 > sinkMassProd; + array2d< real64 > massDeltas; + + // overall simulation stats for each phases + array1d< real64 > sourceMeanRate; + array1d< real64 > sinkMeanRate; + array1d< real64 > totalSourceMassProd; + array1d< real64 > totalSinkMassProd; + array1d< real64 > totalMassProd; + array1d< real64 > totalMeanRate; + + /** + * @brief Compute the expected statistics set for the tested simulation. + * @param inputParams the test simulation input parameters + */ + TestSet( TestInputs const & inputParams ): + inputs( inputParams ) + { + // tables must provide the same timestep & phase rates + EXPECT_EQ( inputs.sourceRates.size( 0 ), inputs.sinkRates.size( 0 )); + EXPECT_EQ( inputs.sourceRates.size( 1 ), inputs.sinkRates.size( 1 )); + + timestepCount = inputs.sourceRates.size( 0 ); + phaseCount = inputs.sourceRates.size( 1 ); + totalElementsCount = inputs.sourceElementsCount + inputs.sinkElementsCount; + + sourceRates.resize( timestepCount, phaseCount ); + sinkRates.resize( timestepCount, phaseCount ); + sourceMassProd.resize( timestepCount, phaseCount ); + sinkMassProd.resize( timestepCount, phaseCount ); + massDeltas.resize( timestepCount, phaseCount ); + sourceMeanRate.resize( phaseCount ); + sinkMeanRate.resize( phaseCount ); + totalSourceMassProd.resize( phaseCount ); + totalSinkMassProd.resize( phaseCount ); + totalMassProd.resize( phaseCount ); + totalMeanRate.resize( phaseCount ); + + for( integer ip = 0; ip < phaseCount; ++ip ) + { + for( integer timestepId = 0; timestepId < timestepCount; ++timestepId ) + { + // mass production / injection calculation + sourceRates[timestepId][ip] = inputs.sourceRates[timestepId][ip] * inputs.sourceRateFactor; + sourceMassProd[timestepId][ip] = inputs.sourceRates[timestepId][ip] * inputs.dt * inputs.sourceRateFactor; + totalSourceMassProd[ip] += sourceMassProd[timestepId][ip]; + sinkRates[timestepId][ip] = inputs.sinkRates[timestepId][ip] * inputs.sinkRateFactor; + sinkMassProd[timestepId][ip] = inputs.sinkRates[timestepId][ip] * inputs.dt * inputs.sinkRateFactor; + massDeltas[timestepId][ip] = -( sourceMassProd[timestepId][ip] + sinkMassProd[timestepId][ip] ); + totalSinkMassProd[ip] += sinkMassProd[timestepId][ip]; + // rates accumulations + sourceMeanRate[ip] += inputs.sourceRates[timestepId][ip] * inputs.sourceRateFactor; + sinkMeanRate[ip] += inputs.sinkRates[timestepId][ip] * inputs.sinkRateFactor; + } + // mean rates calculation + real64 const ratesMeanDivisor = 1.0 / double( timestepCount - 1 ); + sourceMeanRate[ip] *= ratesMeanDivisor; + sinkMeanRate[ip] *= ratesMeanDivisor; + // totals + totalMassProd[ip] = totalSinkMassProd[ip] + totalSourceMassProd[ip]; + totalMeanRate[ip] = sinkMeanRate[ip] + sourceMeanRate[ip]; + } + } +}; + + +class FlowStatisticsTest : public ::testing::Test +{ +public: + + void writeTableFiles( std::map< string, string > const & files ) + { + for( auto const & [fileName, content] : files ) + { + std::ofstream os( fileName ); + ASSERT_TRUE( os.is_open() ); + os << content; + os.close(); + + m_tableFileNames.push_back( fileName ); + } + } + + void TearDown() override + { + // removing temp table files + for( string const & fileName : m_tableFileNames ) + { + ASSERT_TRUE( std::remove( fileName.c_str() ) == 0 ); + } + m_tableFileNames.clear(); + } + +private: + std::vector< string > m_tableFileNames; +}; + + +void setRateTable( array2d< real64 > & rateTable, std::initializer_list< std::initializer_list< real64 > > timestepPhaseValues ) +{ + rateTable.resize( timestepPhaseValues.size(), timestepPhaseValues.begin()->size() ); + integer timestepId = 0; + for( auto const & phaseValues : timestepPhaseValues ) + { + integer ip = 0; + for( auto const & phaseValue : phaseValues ) + { + rateTable[timestepId][ip++] = phaseValue; + } + ++timestepId; + } +} + +real64 getTotalFluidMass( ProblemManager & problem, string_view flowSolverPath ) +{ + real64 totalMass = 0.0; + SolverBase const & solver = problem.getGroupByPath< SolverBase >( string( flowSolverPath ) ); + solver.forDiscretizationOnMeshTargets( problem.getDomainPartition().getMeshBodies(), + [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + mesh.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + SinglePhaseStatistics::RegionStatistics & regionStats = region.getReference< SinglePhaseStatistics::RegionStatistics >( + SinglePhaseStatistics::viewKeyStruct::regionStatisticsString() ); + + totalMass += regionStats.totalMass; + } ); + } ); + return totalMass; +} + + +/** + * @brief Verification that the source flux statistics are correct for the current timestep + * @param expectedMasses the expected mass values per phase + * @param expectedRates the expected rate values per phase + * @param expectedElementCount the number of expected targeted elements + * @param stats the timestep stats + * @param context a context string to provide in any error message. + */ +void checkFluxStats( arraySlice1d< real64 > const & expectedMasses, + arraySlice1d< real64 > const & expectedRates, + integer const expectedElementCount, + SourceFluxStatsAggregator::WrappedStats const & stats, + string_view context ) +{ + for( int ip = 0; ip < stats.stats().getPhaseCount(); ++ip ) + { + EXPECT_DOUBLE_EQ( stats.stats().m_producedMass[ip], expectedMasses[ip] ) << GEOS_FMT( "The flux named '{}' did not produce the expected mass ({}, phase = {}).", + stats.getFluxName(), context, ip ); + EXPECT_DOUBLE_EQ( stats.stats().m_productionRate[ip], expectedRates[ip] ) << GEOS_FMT( "The flux named '{}' did not produce at the expected rate ({}, phase = {}).", + stats.getFluxName(), context, ip ); + } + EXPECT_DOUBLE_EQ( stats.stats().m_elementCount, expectedElementCount ) << GEOS_FMT( "The flux named '{}' did not produce in the expected elements ({}).", + stats.getFluxName(), context ); +} + +/** + * @brief Verification that the source flux statistics are correct over the whole simulation + * @param problem the simulation ProblemManager + * @param testSet the simulation TestSet + */ +void checkWholeSimFluxStats( ProblemManager & problem, TestSet const & testSet ) +{ + DomainPartition & domain = problem.getDomainPartition(); + SourceFluxStatsAggregator & wholeSimStats = + problem.getGroupByPath< SourceFluxStatsAggregator >( testSet.inputs.wholeSimFluxStatsPath ); + + wholeSimStats.forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, + SourceFluxStatsAggregator::WrappedStats & meshLevelStats ) + { + wholeSimStats.forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, + SourceFluxStatsAggregator::WrappedStats & fluxStats ) + { + if( fluxStats.getFluxName() == testSet.inputs.sourceFluxName ) + { + checkFluxStats( testSet.totalSourceMassProd, + testSet.sourceMeanRate, + testSet.inputs.sourceElementsCount, + fluxStats, "over whole simulation" ); + } + else if( fluxStats.getFluxName() == testSet.inputs.sinkFluxName ) + { + checkFluxStats( testSet.totalSinkMassProd, + testSet.sinkMeanRate, + testSet.inputs.sinkElementsCount, + fluxStats, "over whole simulation" ); + } + else + { + FAIL() << "Unexpected SourceFlux found!"; + } + } ); + + for( int ip = 0; ip < meshLevelStats.stats().getPhaseCount(); ++ip ) + { + EXPECT_DOUBLE_EQ( meshLevelStats.stats().m_producedMass[ip], testSet.totalMassProd[ip] ) << "The fluxes did not produce the expected total mass (over whole simulation, phase = " << ip << ")."; + EXPECT_DOUBLE_EQ( meshLevelStats.stats().m_productionRate[ip], testSet.totalMeanRate[ip] ) << "The fluxes did not produce at the expected rate (over whole simulation, phase = " << ip << ")."; + } + } ); +} + +/** + * @brief Verification that the source flux statistics are correct for a given timestep + * @param problem the simulation ProblemManager + * @param testSet the simulation TestSet + * @param time_n the current timestep start + * @param timestepId the current timestep id (= cycle) + */ +void checkTimeStepFluxStats( ProblemManager & problem, TestSet const & testSet, + real64 const time_n, integer const timestepId ) +{ + DomainPartition & domain = problem.getDomainPartition(); + SourceFluxStatsAggregator & timestepStats = + problem.getGroupByPath< SourceFluxStatsAggregator >( testSet.inputs.timeStepFluxStatsPath ); + + timestepStats.forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, + SourceFluxStatsAggregator::WrappedStats & ) + { + timestepStats.forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, + SourceFluxStatsAggregator::WrappedStats & fluxStats ) + { + if( fluxStats.getFluxName() == testSet.inputs.sourceFluxName ) + { + checkFluxStats( testSet.sourceMassProd[timestepId], + testSet.sourceRates[timestepId], + testSet.inputs.sourceElementsCount, + fluxStats, GEOS_FMT( "for timestep at t = {} s", time_n ) ); + } + else if( fluxStats.getFluxName() == testSet.inputs.sinkFluxName ) + { + checkFluxStats( testSet.sinkMassProd[timestepId], + testSet.sinkRates[timestepId], + testSet.inputs.sinkElementsCount, + fluxStats, GEOS_FMT( "for timestep at t = {} s", time_n ) ); + } + else + { + FAIL() << "Unexpected SourceFlux found!"; + } + } ); + } ); +} + +void checkTimeStepStats( TestSet const & testSet, + real64 const time_n, + integer const timestepId ) +{ + EXPECT_LT( timestepId, testSet.timestepCount ) << GEOS_FMT( "The tested time-step count were higher than expected (t = {} s).", + time_n ); +} + +void checkWholeSimTimeStepStats( ProblemManager & problem, + TestSet const & testSet, + TimeStepChecker const & timeStepChecker ) +{ + EXPECT_EQ( timeStepChecker.getTestedTimeStepCount(), testSet.timestepCount ) << "The tested time-step were different than expected."; + + SolverBase const & solver = problem.getGroupByPath< SolverBase >( testSet.inputs.flowSolverPath ); + SolverStatistics const & solverStats = solver.getSolverStatistics(); + EXPECT_GE( solverStats.getNumTimeStepCuts(), testSet.inputs.requiredSubTimeStep ) << "The test did not encountered any timestep cut, but were expected to. " + "Consider adapting the simulation so a timestep cut occurs to check they work as expected."; +} + + +//////////////////////////////// SinglePhase Flux Statistics Test //////////////////////////////// +namespace SinglePhaseFluxStatisticsTest +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 2; + testInputs.sinkElementsCount = 5; + + // FluxRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000 }, + { 0.000 }, + { 0.767 }, + { 0.894 }, + { 0.561 }, + { 0.234 }, + { 0.194 }, + { 0.178 }, + { 0.162 }, + { 0.059 }, + { 0.000 } } ); + testInputs.sinkRates=testInputs.sourceRates; + + // sink is 3x source production + testInputs.sourceRateFactor = -1.0; + testInputs.sinkRateFactor = 3.0; + + return TestSet( testInputs ); +} + +TEST_F( FlowStatisticsTest, checkSinglePhaseFluxStatistics ) +{ + TestSet const testSet = getTestSet(); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + real64 firstMass; + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + + static bool passedFirstTimeStep = false; + if( !passedFirstTimeStep ) + { + passedFirstTimeStep = true; + firstMass = getTotalFluidMass( problem, testSet.inputs.flowSolverPath ); + } + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); + + // check singlephasestatistics results + real64 const lastMass = getTotalFluidMass( problem, testSet.inputs.flowSolverPath ); + real64 const massDiffTol = 1e-7; + EXPECT_NEAR( lastMass - firstMass, + -testSet.totalMassProd[0], + massDiffTol * std::abs( testSet.totalMassProd[0] ) ) << GEOS_FMT( "{} total mass difference from start to end is not consistent with fluxes production.", + SinglePhaseStatistics::catalogName() ); +} + + +} /* namespace SinglePhaseFluxStatisticsTest */ + + +//////////////////////////////// Multiphase Flux Statistics Test //////////////////////////////// +namespace MultiPhaseFluxStatisticsTestMass +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + testInputs.tableFiles["pvtgas.txt"] = "DensityFun SpanWagnerCO2Density 1.5e7 2.5e7 1e5 370.15 400.15 2\n" + "ViscosityFun FenghourCO2Viscosity 1.5e7 2.5e7 1e5 370.15 400.15 2\n"; + + testInputs.tableFiles["pvtliquid.txt"] = "DensityFun EzrokhiBrineDensity 0.1033 -2.2991e-5 -2.3658e-6\n" + "ViscosityFun EzrokhiBrineViscosity 0 0 0\n"; + + testInputs.tableFiles["co2flash.txt"] = "FlashModel CO2Solubility 1.5e7 2.5e7 1e5 370.15 400.15 2 0\n"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 1; + testInputs.sinkElementsCount = 1; + + // FluxInjectionRate & FluxProductionRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.267, 0.0 }, + { 0.561, 0.0 }, + { 0.194, 0.0 }, + { 0.102, 0.0 }, + { 0.059, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 } } ); + setRateTable( testInputs.sinkRates, + { { 0.0, 0.000 }, + { 0.0, 0.000 }, + { 0.0, 0.003 }, + { 0.0, 0.062 }, + { 0.0, 0.121 }, + { 0.0, 0.427 }, + { 0.0, 0.502 }, + { 0.0, 0.199 }, + { 0.0, 0.083 }, + { 0.0, 0.027 }, + { 0.0, 0.000 } } ); + + testInputs.sourceRateFactor = -44e-3; + testInputs.sinkRateFactor = 18e-3; + + return TestSet( testInputs ); +} + + +TEST_F( FlowStatisticsTest, checkMultiPhaseFluxStatisticsMass ) +{ + TestSet const testSet = getTestSet(); + writeTableFiles( testSet.inputs.tableFiles ); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); +} + + +} /* namespace MultiPhaseFluxStatisticsTest */ + + +//////////////////////////////// Multiphase Flux Statistics Test //////////////////////////////// +namespace MultiPhaseFluxStatisticsTestMol +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + testInputs.tableFiles["pvtgas.txt"] = "DensityFun SpanWagnerCO2Density 1.5e7 2.5e7 1e5 370.15 400.15 2\n" + "ViscosityFun FenghourCO2Viscosity 1.5e7 2.5e7 1e5 370.15 400.15 2\n"; + + testInputs.tableFiles["pvtliquid.txt"] = "DensityFun EzrokhiBrineDensity 0.1033 -2.2991e-5 -2.3658e-6\n" + "ViscosityFun EzrokhiBrineViscosity 0 0 0\n"; + + testInputs.tableFiles["co2flash.txt"] = "FlashModel CO2Solubility 1.5e7 2.5e7 1e5 370.15 400.15 2 0\n"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 1; + testInputs.sinkElementsCount = 1; + + // FluxInjectionRate & FluxProductionRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.267, 0.0 }, + { 0.561, 0.0 }, + { 0.194, 0.0 }, + { 0.102, 0.0 }, + { 0.059, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 } } ); + setRateTable( testInputs.sinkRates, + { { 0.0, 0.000 }, + { 0.0, 0.000 }, + { 0.0, 0.003 }, + { 0.0, 0.062 }, + { 0.0, 0.121 }, + { 0.0, 0.427 }, + { 0.0, 0.502 }, + { 0.0, 0.199 }, + { 0.0, 0.083 }, + { 0.0, 0.027 }, + { 0.0, 0.000 } } ); + + // scale is set to high values to make the solver generate timestep cuts + testInputs.sourceRateFactor = -8.0; + testInputs.sinkRateFactor = 8.0; + + // this simulation is set-up to have at least one timestep cut. + testInputs.requiredSubTimeStep = 2; + + return TestSet( testInputs ); +} + + +TEST_F( FlowStatisticsTest, checkMultiPhaseFluxStatisticsMol ) +{ + TestSet const testSet = getTestSet(); + writeTableFiles( testSet.inputs.tableFiles ); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); +} + + +} /* namespace MultiPhaseFluxStatisticsTest */ + + +//////////////////////////////// Main //////////////////////////////// + + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp new file mode 100644 index 00000000000..6dd42bda36d --- /dev/null +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp @@ -0,0 +1,160 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP +#define GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP + +#include "codingUtilities/UnitTestUtilities.hpp" + +namespace geos +{ + +namespace testing +{ + +void checkDerivative( real64 const valueEps, + real64 const value, + real64 const deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var ) +{ + real64 const numDeriv = (valueEps - value) / eps; + checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); +} + +void checkDerivative( real64 const valueEps, + real64 const value, + real64 const deriv, + real64 const eps, + real64 const relTol, + string const & name, + string const & var ) +{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } + +template< int USD1, int USD2, int USD3 > +void checkDerivative( arraySlice1d< real64 const, USD1 > const & valueEps, + arraySlice1d< real64 const, USD2 > const & value, + arraySlice1d< real64 const, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels ) +{ + localIndex const size = labels.size( 0 ); + + for( localIndex i = 0; i < size; ++i ) + { + checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, + name + "[" + labels[i] + "]", var ); + } +} + +template< int DIM, int USD1, int USD2, int USD3, typename ... Args > +void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, + ArraySlice< real64 const, DIM, USD2 > const & value, + ArraySlice< real64 const, DIM, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels, + Args ... label_lists ) +{ + localIndex const size = labels.size( 0 ); + + for( localIndex i = 0; i < size; ++i ) + { + checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, + name + "[" + labels[i] + "]", var, label_lists ... ); + } +} + +template< int DIM, int USD1, int USD2, int USD3, typename ... Args > +void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, + ArraySlice< real64 const, DIM, USD2 > const & value, + ArraySlice< real64 const, DIM, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels, + Args ... label_lists ) +{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var, labels, label_lists ... ); } + +// invert compositional derivative array layout to move innermost slice on the top +// (this is needed so we can use checkDerivative() to check derivative w.r.t. for each compositional var) +template< int USD > +array1d< real64 > invertLayout( arraySlice1d< real64 const, USD > const & input, + localIndex N ) +{ + array1d< real64 > output( N ); + for( int i = 0; i < N; ++i ) + { + output[i] = input[i]; + } + + return output; +} + +template< int USD > +array2d< real64 > invertLayout( arraySlice2d< real64 const, USD > const & input, + localIndex N1, + localIndex N2 ) +{ + array2d< real64 > output( N2, N1 ); + + for( localIndex i = 0; i < N1; ++i ) + { + for( localIndex j = 0; j < N2; ++j ) + { + output( j, i ) = input( i, j ); + } + } + + return output; +} + +template< int USD > +array3d< real64 > invertLayout( arraySlice3d< real64 const, USD > const & input, + localIndex N1, + localIndex N2, + localIndex N3 ) +{ + array3d< real64 > output( N3, N1, N2 ); + + for( localIndex i = 0; i < N1; ++i ) + { + for( localIndex j = 0; j < N2; ++j ) + { + for( localIndex k = 0; k < N3; ++k ) + { + output( k, i, j ) = input( i, j, k ); + } + } + } + + return output; +} + +} // namespace testing + +} // namespace geos + +#endif //GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index 2d9a1ee6ea1..beffe24f94d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -24,6 +24,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "testFlowUtils.hpp" namespace geos { @@ -33,29 +34,6 @@ namespace testing using namespace geos::constitutive; -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var ) -{ - real64 const numDeriv = (valueEps - value) / eps; - checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); -} - -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } - - void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, @@ -111,7 +89,7 @@ void setupProblemFromXML( ProblemManager & problemManager, char const * const xm problemManager.applyInitialConditions(); } -void testMobilityNumericalDerivatives( SinglePhaseFVM< SinglePhaseBase > & solver, +void testMobilityNumericalDerivatives( SinglePhaseFVM<> & solver, DomainPartition & domain, bool const isThermal, real64 const perturbParameter, diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index dc8a342ff69..58549f21be8 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -109,7 +109,7 @@ char const * xmlInput = referencePressure="0.0" compressibility="1.0e-9" /> -void testNumericalJacobian( SinglePhaseFVM< SinglePhaseBase > & solver, +void testNumericalJacobian( SinglePhaseFVM<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -211,7 +211,7 @@ class ThermalSinglePhaseFlowTest : public ::testing::Test { setupProblemFromXML( state.getProblemManager(), xmlInput ); - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseFVM< SinglePhaseBase > >( "singleflow" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseFVM<> >( "singleflow" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -229,7 +229,7 @@ class ThermalSinglePhaseFlowTest : public ::testing::Test static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); GeosxState state; - SinglePhaseFVM< SinglePhaseBase > * solver; + SinglePhaseFVM<> * solver; }; real64 constexpr ThermalSinglePhaseFlowTest::time; diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index a2529c16406..e2891e9eb96 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -43,11 +43,11 @@ constexpr double dx = maxCoordInX / numElemsInX; constexpr double dy = maxCoordInY / numElemsInY; constexpr double dz = maxCoordInZ / numElemsInZ; -constexpr localIndex node_dI = numNodesInY * numNodesInZ; -constexpr localIndex node_dJ = numNodesInZ; +constexpr localIndex node_dJ = numNodesInX; +constexpr localIndex node_dK = numNodesInX * numNodesInY; -constexpr localIndex elem_dI = numElemsInY * numElemsInZ; -constexpr localIndex elem_dJ = numElemsInZ; +constexpr localIndex elem_dJ = numElemsInX; +constexpr localIndex elem_dK = numElemsInX * numElemsInY; constexpr localIndex minOrder = 1; constexpr localIndex maxOrder = 5; @@ -151,11 +151,11 @@ TEST_F( MeshGenerationTest, nodePositions ) arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & X = m_nodeManager->referencePosition(); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { EXPECT_DOUBLE_EQ( X( nodeIndex, 0 ), i * dx ); EXPECT_DOUBLE_EQ( X( nodeIndex, 1 ), j * dy ); @@ -174,11 +174,11 @@ TEST_F( MeshGenerationTest, elementCentersAndVolumes ) constexpr double VOLUME = dx * dy * dz; localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { EXPECT_DOUBLE_EQ( centers[ elemID ][ 0 ], i * dx + dx / 2.0 ); EXPECT_DOUBLE_EQ( centers[ elemID ][ 1 ], j * dy + dy / 2.0 ); @@ -196,23 +196,23 @@ TEST_F( MeshGenerationTest, elemToNodeMap ) GEOS_ERROR_IF_NE( nodeMap.size( 1 ), 8 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { - localIndex const firstNodeID = i * node_dI + j * node_dJ + k; + localIndex const firstNodeID = i + j * node_dJ + k * node_dK; EXPECT_EQ( firstNodeID, nodeMap( elemID, 0 ) ); - EXPECT_EQ( firstNodeID + node_dI, nodeMap( elemID, 1 ) ); - EXPECT_EQ( firstNodeID + node_dI + node_dJ, nodeMap( elemID, 3 ) ); + EXPECT_EQ( firstNodeID + 1, nodeMap( elemID, 1 ) ); + EXPECT_EQ( firstNodeID + 1 + node_dJ, nodeMap( elemID, 3 ) ); EXPECT_EQ( firstNodeID + node_dJ, nodeMap( elemID, 2 ) ); - EXPECT_EQ( firstNodeID + 1, nodeMap( elemID, 4 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dI, nodeMap( elemID, 5 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dI + node_dJ, nodeMap( elemID, 7 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dJ, nodeMap( elemID, 6 ) ); + EXPECT_EQ( firstNodeID + node_dK, nodeMap( elemID, 4 ) ); + EXPECT_EQ( firstNodeID + node_dK + 1, nodeMap( elemID, 5 ) ); + EXPECT_EQ( firstNodeID + node_dK + 1 + node_dJ, nodeMap( elemID, 7 ) ); + EXPECT_EQ( firstNodeID + node_dK + node_dJ, nodeMap( elemID, 6 ) ); ++elemID; } } @@ -224,13 +224,13 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) ArrayOfArraysView< localIndex const > const & nodeToElemMap = m_nodeManager->elementList().toViewConst(); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { - localIndex const elemID = i * elem_dI + j * elem_dJ + k; + localIndex const elemID = i + j * elem_dJ + k * elem_dK; std::vector< localIndex > expectedElems; if( k < numElemsInZ ) @@ -238,9 +238,9 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) if( i < numElemsInX && j < numElemsInY ) expectedElems.push_back( elemID ); if( i > 0 && j < numElemsInY ) - expectedElems.push_back( elemID - elem_dI ); + expectedElems.push_back( elemID - 1 ); if( i > 0 && j > 0 ) - expectedElems.push_back( elemID - elem_dI - elem_dJ ); + expectedElems.push_back( elemID - 1 - elem_dJ ); if( i < numElemsInX && j > 0 ) expectedElems.push_back( elemID - elem_dJ ); } @@ -248,13 +248,13 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) if( k > 0 ) { if( i < numElemsInX && j < numElemsInY ) - expectedElems.push_back( elemID - 1 ); + expectedElems.push_back( elemID - elem_dK ); if( i > 0 && j < numElemsInY ) - expectedElems.push_back( elemID - elem_dI - 1 ); + expectedElems.push_back( elemID - elem_dK - 1 ); if( i > 0 && j > 0 ) - expectedElems.push_back( elemID - elem_dI - elem_dJ - 1 ); + expectedElems.push_back( elemID - 1 - elem_dJ - elem_dK ); if( i < numElemsInX && j > 0 ) - expectedElems.push_back( elemID - elem_dJ - 1 ); + expectedElems.push_back( elemID - elem_dJ - elem_dK ); } localIndex const numElems = expectedElems.size(); @@ -290,11 +290,11 @@ TEST_F( MeshGenerationTest, faceNodeMaps ) array1d< localIndex > faceNodesFromFace( 4 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { @@ -340,14 +340,14 @@ TEST_F( MeshGenerationTest, faceElementMaps ) GEOS_ERROR_IF_NE( elementToFaceMap.size( 1 ), 6 ); - localIndex const elemIDOffset[6] = { -elem_dJ, -1, -elem_dI, elem_dI, elem_dJ, 1 }; + localIndex const elemIDOffset[6] = { -elem_dJ, -elem_dK, -1, 1, elem_dJ, elem_dK }; localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { @@ -421,21 +421,21 @@ TEST_F( MeshGenerationTest, edgeNodeMaps ) GEOS_ERROR_IF_NE( edgeToNodeMap.size( 1 ), 2 ); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { localIndex numEdges = 0; if( i != 0 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - node_dI, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( i != numNodesInX - 1 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + node_dI, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( j != 0 ) @@ -450,12 +450,12 @@ TEST_F( MeshGenerationTest, edgeNodeMaps ) } if( k != 0 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - node_dK, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( k != numNodesInZ - 1 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + node_dK, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } @@ -477,11 +477,11 @@ TEST_F( MeshGenerationTest, edgeFaceMaps ) GEOS_ERROR_IF_NE( elementToFaceMap.size( 1 ), 6 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { diff --git a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt new file mode 100644 index 00000000000..f6d8d8632b0 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt @@ -0,0 +1,33 @@ +# +# Specify all headers +# +set( testingUtilities_headers + TestingTasks.hpp + ) + +# +# Specify all sources +# +set( testingUtilities_sources + TestingTasks.cpp + ) + +# +# Specify all dependencies +# +set( dependencyList ${parallelDeps} gtest ) + +if ( GEOSX_BUILD_SHARED_LIBS ) + list( APPEND dependencyList geosx_core ) +else() + list( APPEND dependencyList ${geosx_core_libs} ) +endif() + +blt_add_library( NAME testingUtilities + SOURCES ${testingUtilities_sources} + HEADERS ${testingUtilities_headers} + DEPENDS_ON ${dependencyList} + OBJECT ${GEOSX_BUILD_OBJ_LIBS} + ) + +target_include_directories( testingUtilities PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp new file mode 100644 index 00000000000..b948a406071 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp @@ -0,0 +1,50 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TestingTasks.cpp + */ + +#include "TestingTasks.hpp" + +namespace geos +{ +namespace testing +{ + + +TimeStepChecker::TimeStepChecker( string const & name, Group * const parent ): + TaskBase( name, parent ) +{} + +bool TimeStepChecker::execute( real64 const time_n, + real64 const GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +{ + EXPECT_TRUE( m_checkTimeStepFunction ); + m_checkTimeStepFunction( time_n ); + + ++m_timestepId; + return false; +} + +REGISTER_CATALOG_ENTRY( TaskBase, TimeStepChecker, string const &, geos::dataRepository::Group * const ) + + +} // namespace testing + +} // namespace geos diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp new file mode 100644 index 00000000000..f52a9e54834 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp @@ -0,0 +1,80 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * @file TestingTasks.hpp + */ + +#ifndef GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ +#define GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ + +#include "events/tasks/TaskBase.hpp" +#include "codingUtilities/UnitTestUtilities.hpp" + +namespace geos +{ +namespace testing +{ + + +/** + * @brief This Task allows to do checks each timestep during the simulation by calling a provided functor. + * To be executed, it must be - as every task - declared in the provided xmlInput within the Tasks node and called by an even. + * As this Group is designed for developpers and not user oriented, it should not appear in the documentation nor in the xsd. + * Question: could this task be used in the integratedTests ? + */ +class TimeStepChecker : public TaskBase +{ +public: + /** + * @brief Construct a new TimeStepChecker Task + * @param name name in xsd + * @param parent parent group in hierarchy + */ + TimeStepChecker( string const & name, Group * const parent ); + + /** + * @brief Set the functor that must be called each time this Task is executed. + * @param func the functor to execute + */ + void setTimeStepCheckingFunction( std::function< void(real64) > func ) + { m_checkTimeStepFunction = std::function< void(real64) >( func ); } + + /** + * @return Get the tested time-step count + */ + integer getTestedTimeStepCount() const + { return m_timestepId; } + + /** + * @brief Catalog name interface + * @return This type's catalog name + */ + static string catalogName() { return "TimeStepChecker"; } + + virtual bool execute( real64 time_n, real64 dt, integer cycleNumber, + integer eventCounter, real64 eventProgress, + DomainPartition & domain ); + +private: + std::function< void(real64) > m_checkTimeStepFunction; + int m_timestepId = 0; +}; + + +} // namespace testing + +} // namespace geos + +#endif //GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index a555936aeaf..c2e2f79bdc1 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -1,8 +1,11 @@ # Specify list of tests set( gtest_geosx_tests testWavePropagation.cpp + testWavePropagationQ2.cpp testWavePropagationElasticFirstOrder.cpp testWavePropagationDAS.cpp + testWavePropagationElasticVTI.cpp + testWavePropagationAttenuation.cpp testWavePropagationAcousticFirstOrder.cpp ) set( dependencyList ${parallelDeps} gtest ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index 4edd9e63d6f..493dc54a71f 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index 2da611b46e7..0b37a9d382e 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp new file mode 100644 index 00000000000..009480c9a3a --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp @@ -0,0 +1,240 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class ElasticWaveEquationSEMTest : public ::testing::Test +{ +public: + + ElasticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e-1; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + ElasticWaveEquationSEM * propagator; +}; + +real64 constexpr ElasticWaveEquationSEMTest::time; +real64 constexpr ElasticWaveEquationSEMTest::dt; +real64 constexpr ElasticWaveEquationSEMTest::eps; + +TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< ElasticWaveEquationSEM >( "elasticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const dasReceivers = propagator->getReference< array2d< real32 > >( ElasticWaveEquationSEM::viewKeyStruct::dasSignalNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + dasReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( dasReceivers.size( 1 ), 10 ); + ASSERT_EQ( dasReceivers.size( 0 ), 11 ); + + // check das content. The signal values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( dasReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += dasReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( dasReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index 2ea5aa70170..c5c6243d013 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index f34f65d7a92..b36915027a9 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp new file mode 100644 index 00000000000..e6bbf81ce86 --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp @@ -0,0 +1,248 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class ElasticWaveEquationSEMTest : public ::testing::Test +{ +public: + + ElasticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e-1; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + ElasticWaveEquationSEM * propagator; +}; + +real64 constexpr ElasticWaveEquationSEMTest::time; +real64 constexpr ElasticWaveEquationSEMTest::dt; +real64 constexpr ElasticWaveEquationSEMTest::eps; + +TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< ElasticWaveEquationSEM >( "elasticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const dasReceivers = propagator->getReference< array2d< real32 > >( ElasticWaveEquationSEM::viewKeyStruct::dasSignalNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + dasReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( dasReceivers.size( 1 ), 10 ); + ASSERT_EQ( dasReceivers.size( 0 ), 11 ); + + // check das content. The signal values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( dasReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += dasReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( dasReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp new file mode 100644 index 00000000000..3f74d76d860 --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -0,0 +1,242 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class AcousticWaveEquationSEMTest : public ::testing::Test +{ +public: + + AcousticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 5e-4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + AcousticWaveEquationSEM * propagator; +}; + +real64 constexpr AcousticWaveEquationSEMTest::time; +real64 constexpr AcousticWaveEquationSEMTest::dt; +real64 constexpr AcousticWaveEquationSEMTest::eps; + +TEST_F( AcousticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< AcousticWaveEquationSEM >( "acousticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const pReceivers = propagator->getReference< array2d< real32 > >( AcousticWaveEquationSEM::viewKeyStruct::pressureNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + pReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( pReceivers.size( 1 ), 10 ); + ASSERT_EQ( pReceivers.size( 0 ), 11 ); + + // check seismo content. The pressure values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( pReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += pReceivers[i][r]; + } + avg /= 8.0; + std::cout << "p= "<< pReceivers[i][8] << std::endl; + std::cout << "avg= "<explicitStepBackward( time_n, dt, i, domain, false ); + time_n += dt; + } + // check again the seismo content. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( pReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += pReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( pReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index ecda9cd636d..7154c749706 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -196,7 +196,7 @@ char const * xmlInput = )xml"; template< typename LAMBDA > -void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -471,7 +471,7 @@ class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test void SetUp() override { setupProblemFromXML( state.getProblemManager(), xmlInput ); - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells<> >( "reservoirSystem" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -489,7 +489,7 @@ class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); GeosxState state; - CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; + CompositionalMultiphaseReservoirAndWells<> * solver; }; real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 2948d71f72c..78e3ab3997d 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -136,7 +136,7 @@ char const * PostXmlInput = )xml"; template< typename LAMBDA > -void testNumericalJacobian( SinglePhaseReservoirAndWells< SinglePhaseBase > & solver, +void testNumericalJacobian( SinglePhaseReservoirAndWells<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -345,7 +345,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test void SetUp() override { - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseReservoirAndWells< SinglePhaseBase > >( "reservoirSystem" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseReservoirAndWells<> >( "reservoirSystem" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -423,7 +423,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test static real64 constexpr EPS = std::numeric_limits< real64 >::epsilon(); GeosxState state; - SinglePhaseReservoirAndWells< SinglePhaseBase > * solver; + SinglePhaseReservoirAndWells<> * solver; }; real64 constexpr SinglePhaseReservoirSolverTest::TIME; diff --git a/src/docs/doxygen/GeosxConfig.hpp b/src/docs/doxygen/GeosxConfig.hpp index 4ad4fd61164..e458794d05d 100644 --- a/src/docs/doxygen/GeosxConfig.hpp +++ b/src/docs/doxygen/GeosxConfig.hpp @@ -30,7 +30,7 @@ #define GEOSX_USE_MPI /// Enables use of OpenMP (CMake option ENABLE_OPENMP) -#define GEOSX_USE_OPENMP +/* #undef GEOSX_USE_OPENMP */ /// Enables use of CUDA (CMake option ENABLE_CUDA) /* #undef GEOS_USE_CUDA */ @@ -126,10 +126,10 @@ #define Conduit_VERSION 0.8.2 /// Version information for RAJA -#define RAJA_VERSION 2023.6.1 +#define RAJA_VERSION 2022.10.5 /// Version information for umpire -#define umpire_VERSION 2023.6.0 +#define umpire_VERSION 2022.10.0 /// Version information for chai /* #undef chai_VERSION */ @@ -138,7 +138,7 @@ #define adiak_VERSION .. /// Version information for caliper -#define caliper_VERSION 2.10.0 +#define caliper_VERSION 2.8.0 /// Version information for Metis #define metis_VERSION 5.1.0 @@ -147,7 +147,7 @@ #define parmetis_VERSION 4.0.0 /// Version information for scotch -#define scotch_VERSION 7.0.3 +#define scotch_VERSION 6.0.9 /// Version information for superlu_dist #define superlu_dist_VERSION 6.3.0 diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 73517d48697..d15f17166bd 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -227,18 +227,32 @@ Element: CompositionalMultiphaseWell .. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell.rst -.. _XML_CompositonalTwoPhaseFluidPengRobinson: +.. _XML_CompositionalTwoPhaseFluidPengRobinson: -Element: CompositonalTwoPhaseFluidPengRobinson -============================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst +Element: CompositionalTwoPhaseFluidPengRobinson +=============================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst -.. _XML_CompositonalTwoPhaseFluidSoaveRedlichKwong: +.. _XML_CompositionalTwoPhaseFluidPengRobinsonLBC: + +Element: CompositionalTwoPhaseFluidPengRobinsonLBC +================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst + + +.. _XML_CompositionalTwoPhaseFluidSoaveRedlichKwong: + +Element: CompositionalTwoPhaseFluidSoaveRedlichKwong +==================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst -Element: CompositonalTwoPhaseFluidSoaveRedlichKwong -=================================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst + +.. _XML_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC: + +Element: CompositionalTwoPhaseFluidSoaveRedlichKwongLBC +======================================================= +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst .. _XML_CompressibleSinglePhaseFluid: @@ -276,6 +290,13 @@ Element: CompressibleSolidParallelPlatesPermeability .. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst +.. _XML_CompressibleSolidPressurePermeability: + +Element: CompressibleSolidPressurePermeability +============================================== +.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst + + .. _XML_CompressibleSolidSlipDependentPermeability: Element: CompressibleSolidSlipDependentPermeability @@ -556,6 +577,13 @@ Element: Hydrofracture .. include:: ../../coreComponents/schema/docs/Hydrofracture.rst +.. _XML_HydrofractureInitialization: + +Element: HydrofractureInitialization +==================================== +.. include:: ../../coreComponents/schema/docs/HydrofractureInitialization.rst + + .. _XML_HydrostaticEquilibrium: Element: HydrostaticEquilibrium @@ -794,13 +822,6 @@ Element: PeriodicEvent .. include:: ../../coreComponents/schema/docs/PeriodicEvent.rst -.. _XML_PermeabilityBase: - -Element: PermeabilityBase -========================= -.. include:: ../../coreComponents/schema/docs/PermeabilityBase.rst - - .. _XML_PhaseFieldDamageFEM: Element: PhaseFieldDamageFEM @@ -906,6 +927,13 @@ Element: PorousViscoModifiedCamClay .. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay.rst +.. _XML_PressurePermeability: + +Element: PressurePermeability +============================= +.. include:: ../../coreComponents/schema/docs/PressurePermeability.rst + + .. _XML_PressurePorosity: Element: PressurePorosity @@ -1018,6 +1046,13 @@ Element: Run .. include:: ../../coreComponents/schema/docs/Run.rst +.. _XML_SeismicityRate: + +Element: SeismicityRate +======================= +.. include:: ../../coreComponents/schema/docs/SeismicityRate.rst + + .. _XML_Silo: Element: Silo @@ -1207,6 +1242,13 @@ Element: SourceFlux .. include:: ../../coreComponents/schema/docs/SourceFlux.rst +.. _XML_SourceFluxStatistics: + +Element: SourceFluxStatistics +============================= +.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics.rst + + .. _XML_SurfaceElementRegion: Element: SurfaceElementRegion @@ -1631,18 +1673,32 @@ Datastructure: CompositionalMultiphaseWell .. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst -.. _DATASTRUCTURE_CompositonalTwoPhaseFluidPengRobinson: +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinson: -Datastructure: CompositonalTwoPhaseFluidPengRobinson -==================================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst +Datastructure: CompositionalTwoPhaseFluidPengRobinson +===================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst -.. _DATASTRUCTURE_CompositonalTwoPhaseFluidSoaveRedlichKwong: +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinsonLBC: + +Datastructure: CompositionalTwoPhaseFluidPengRobinsonLBC +======================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst + + +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwong: + +Datastructure: CompositionalTwoPhaseFluidSoaveRedlichKwong +========================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst -Datastructure: CompositonalTwoPhaseFluidSoaveRedlichKwong -========================================================= -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst + +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC: + +Datastructure: CompositionalTwoPhaseFluidSoaveRedlichKwongLBC +============================================================= +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst .. _DATASTRUCTURE_CompressibleSinglePhaseFluid: @@ -1680,6 +1736,13 @@ Datastructure: CompressibleSolidParallelPlatesPermeability .. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst +.. _DATASTRUCTURE_CompressibleSolidPressurePermeability: + +Datastructure: CompressibleSolidPressurePermeability +==================================================== +.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst + + .. _DATASTRUCTURE_CompressibleSolidSlipDependentPermeability: Datastructure: CompressibleSolidSlipDependentPermeability @@ -1967,6 +2030,13 @@ Datastructure: Hydrofracture .. include:: ../../coreComponents/schema/docs/Hydrofracture_other.rst +.. _DATASTRUCTURE_HydrofractureInitialization: + +Datastructure: HydrofractureInitialization +========================================== +.. include:: ../../coreComponents/schema/docs/HydrofractureInitialization_other.rst + + .. _DATASTRUCTURE_HydrostaticEquilibrium: Datastructure: HydrostaticEquilibrium @@ -2219,13 +2289,6 @@ Datastructure: PeriodicEvent .. include:: ../../coreComponents/schema/docs/PeriodicEvent_other.rst -.. _DATASTRUCTURE_PermeabilityBase: - -Datastructure: PermeabilityBase -=============================== -.. include:: ../../coreComponents/schema/docs/PermeabilityBase_other.rst - - .. _DATASTRUCTURE_PhaseFieldDamageFEM: Datastructure: PhaseFieldDamageFEM @@ -2331,6 +2394,13 @@ Datastructure: PorousViscoModifiedCamClay .. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst +.. _DATASTRUCTURE_PressurePermeability: + +Datastructure: PressurePermeability +=================================== +.. include:: ../../coreComponents/schema/docs/PressurePermeability_other.rst + + .. _DATASTRUCTURE_PressurePorosity: Datastructure: PressurePorosity @@ -2443,6 +2513,13 @@ Datastructure: Run .. include:: ../../coreComponents/schema/docs/Run_other.rst +.. _DATASTRUCTURE_SeismicityRate: + +Datastructure: SeismicityRate +============================= +.. include:: ../../coreComponents/schema/docs/SeismicityRate_other.rst + + .. _DATASTRUCTURE_Silo: Datastructure: Silo @@ -2639,6 +2716,13 @@ Datastructure: SourceFlux .. include:: ../../coreComponents/schema/docs/SourceFlux_other.rst +.. _DATASTRUCTURE_SourceFluxStatistics: + +Datastructure: SourceFluxStatistics +=================================== +.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics_other.rst + + .. _DATASTRUCTURE_SurfaceElementRegion: Datastructure: SurfaceElementRegion diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/Index.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/Index.rst index 50db465e790..795a58cc733 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/Index.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/Index.rst @@ -35,5 +35,7 @@ Wellbore Problems casedContactThermoElasticWellbore/Example + nonLinearThermalDiffusion/Example + diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst new file mode 100644 index 00000000000..9c728e39f33 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst @@ -0,0 +1,62 @@ +.. _AdvancedExampleNonLinearThermalDiffusionWellbore: + + +#################################################### +Non-Linear Thermal Diffusion Around a Wellbore +#################################################### + +------------------------------------------------------------------ +Problem description +------------------------------------------------------------------ + +This example is an extension of the linear thermal diffusion problem presented in :ref:`AdvancedExamplePureThermalDiffusionWellbore`. It uses the thermal single-phase flow solver to model a non-linear thermal diffusion problem around a wellbore where the volumetric heat capacity of the solid rock depends linearly on the temperature. + + +**Input file** + +This benchmark example uses no external input file and everything required is +contained within two GEOS xml files that are located at: + +.. code-block:: console + + inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml + +and + +.. code-block:: console + + inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml + + +In this example, we focus on the ``Constitutive`` tag. + +----------------------------------------------------------- +Constitutive +----------------------------------------------------------- + +The reference value of the volumetric heat capacity of the medium around the wellbore and its derivative with respect to temperature are defined in the ``SolidInternalEnergy`` XML block: + +.. literalinclude:: ../../../../../../../inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml + :language: xml + :start-after: + :end-before: + + +--------------------------------- +Results and benchmark +--------------------------------- + +A good agreement between the results obtained using GEOS and the analytical results is shown in the figure below: + + +.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py + + +------------------------------------------------------------------ +To go further +------------------------------------------------------------------ + +**Feedback on this example** + +This concludes the example of a non-linear thermal diffusion problem around a wellbore. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv new file mode 100644 index 00000000000..9ccebfe447a --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10299,0.0010111,0.05,87.738 +10000,0.10299,0.0010111,0.05,87.738 +10000,0.10499,0.0010308,0.05,80.054 +10000,0.10499,0.0010308,0.05,80.054 +10000,0.10734,0.0010538,0.05,71.614 +10000,0.10734,0.0010538,0.05,71.614 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11544,0.0011334,0.05,48.633 +10000,0.11544,0.0011334,0.05,48.633 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12354,0.0012129,0.05,33.555 +10000,0.12354,0.0012129,0.05,33.555 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.1343,0.0013185,0.05,21.382 +10000,0.1343,0.0013185,0.05,21.382 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13965,0.001371,0.05,17.394 +10000,0.13965,0.001371,0.05,17.394 +10000,0.13965,0.001371,0.05,17.394 +10000,0.1424,0.0013981,0.05,15.705 +10000,0.1424,0.0013981,0.05,15.705 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.151,0.0014824,0.05,11.603 +10000,0.151,0.0014824,0.05,11.603 +10000,0.151,0.0014824,0.05,11.603 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv new file mode 100644 index 00000000000..6bd17f57f37 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10299,0.0010111,0.05,95.492 +1e+05,0.10299,0.0010111,0.05,95.492 +1e+05,0.10499,0.0010308,0.05,92.573 +1e+05,0.10499,0.0010308,0.05,92.573 +1e+05,0.10734,0.0010538,0.05,89.221 +1e+05,0.10734,0.0010538,0.05,89.221 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11544,0.0011334,0.05,78.431 +1e+05,0.11544,0.0011334,0.05,78.431 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12354,0.0012129,0.05,68.816 +1e+05,0.12354,0.0012129,0.05,68.816 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.1343,0.0013185,0.05,57.811 +1e+05,0.1343,0.0013185,0.05,57.811 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.1424,0.0013981,0.05,50.753 +1e+05,0.1424,0.0013981,0.05,50.753 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv new file mode 100644 index 00000000000..245f1b2f8cf --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10299,0.0010111,0.05,91.135 +20000,0.10299,0.0010111,0.05,91.135 +20000,0.10499,0.0010308,0.05,85.471 +20000,0.10499,0.0010308,0.05,85.471 +20000,0.10734,0.0010538,0.05,79.09 +20000,0.10734,0.0010538,0.05,79.09 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11544,0.0011334,0.05,60.092 +20000,0.11544,0.0011334,0.05,60.092 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12354,0.0012129,0.05,45.627 +20000,0.12354,0.0012129,0.05,45.627 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.1343,0.0013185,0.05,32.111 +20000,0.1343,0.0013185,0.05,32.111 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13965,0.001371,0.05,27.195 +20000,0.13965,0.001371,0.05,27.195 +20000,0.13965,0.001371,0.05,27.195 +20000,0.1424,0.0013981,0.05,25.024 +20000,0.1424,0.0013981,0.05,25.024 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.151,0.0014824,0.05,19.498 +20000,0.151,0.0014824,0.05,19.498 +20000,0.151,0.0014824,0.05,19.498 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv new file mode 100644 index 00000000000..29117bbb056 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10299,0.0010111,0.05,94.045 +50000,0.10299,0.0010111,0.05,94.045 +50000,0.10499,0.0010308,0.05,90.2 +50000,0.10499,0.0010308,0.05,90.2 +50000,0.10734,0.0010538,0.05,85.805 +50000,0.10734,0.0010538,0.05,85.805 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11544,0.0011334,0.05,71.941 +50000,0.11544,0.0011334,0.05,71.941 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12354,0.0012129,0.05,60.112 +50000,0.12354,0.0012129,0.05,60.112 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.1343,0.0013185,0.05,47.397 +50000,0.1343,0.0013185,0.05,47.397 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13965,0.001371,0.05,42.199 +50000,0.13965,0.001371,0.05,42.199 +50000,0.13965,0.001371,0.05,42.199 +50000,0.1424,0.0013981,0.05,39.778 +50000,0.1424,0.0013981,0.05,39.778 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.151,0.0014824,0.05,33.205 +50000,0.151,0.0014824,0.05,33.205 +50000,0.151,0.0014824,0.05,33.205 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py new file mode 100644 index 00000000000..39a4c1e8a00 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py @@ -0,0 +1,190 @@ +import os +import sys + +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import scipy.linalg +from scipy import special + +from scipy.sparse import diags +from scipy.sparse.linalg import spsolve + +from xml.etree import ElementTree + +# Analytical results for linear thermal behavior +def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + +def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + +def computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tin * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + +def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): + return thermalConductivity / volumetricHeatCapacity + +# Finite difference results for non-linear thermal behavior +def temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference): + return lambda0 + lambda_gradient*(T-Treference) + +def temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference): + return c0 + c_gradient*(T-Treference) + +def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): + # Coefficients for the matrix + A = np.zeros((N+1, N+1)) + + for i in range(1,N): + dr = r[i] - r[i-1] + r_i = r[i] + A[i, i-1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) - dt/(2 * r_i * dr)) \ + + (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + A[i, i] = 1 + 2 * thermalConductivity[i]/volumetricHeatCapacity[i] * dt / (dr**2) + A[i, i+1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) + dt/(2 * r_i * dr)) \ + - (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + + # Boundary conditions + # No-flux at r=0 approximated by setting the flux between the first two cells to zero + A[0, 0] = 1 + A[N, N] = 1 + return A + +def solve_radial_diffusion(r, tmax, dt, Tin, lambda0, lambda_gradient, c0, c_gradient, Treference): + N = len(r)-1 + # Time setup + n_steps = int(tmax / dt) + + # Time-stepping + T = np.zeros(N+1) # initial condition u(r, 0) + T[0] = Tin + for step in range(n_steps): + thermalConductivity = temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference) + volumetricHeatCapacity = temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference) + A = coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N) + T = spsolve(A, T) + + return T + + +def extractDataFromXMLList(paramList): + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') + +def getWellboreGeometryFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) + + Rin = float(radii[0]) + Rout = float(radii[-1]) + + return [Rin, Rout] + +def getLoadingFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) + + thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) + + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_nonLinear": + referenceVolumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + dVolumetricHeatCapacity_dTemperature = float( tree_SolidInternalEnergy.get('dVolumetricHeatCapacity_dTemperature') ) + referenceTemperature = float( tree_SolidInternalEnergy.get('referenceTemperature') ) + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + + return [Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + + +def main(): + + xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_nonLinear_2d_benchmark.xml") + + Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) + + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + data.dropna(inplace=True) + data.drop_duplicates(inplace=True) + data.reset_index(drop=True, inplace=True) + + radialCoordinate = data['elementCenter:0'] + temperature = data['temperature'] + #pressure = data['pressure'] + diffusionTime = data['Time'][0] + + # Analytical results for linear thermal behavior, for comparison + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, referenceVolumetricHeatCapacity) + + T_transient_linear = computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) + + # Finite different results for non-linear thermal behavior + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate, diffusionTime, diffusionTime/100, Tin, thermalConductivity, 0, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) + plt.plot( radialCoordinate, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) + + if chart_idx==1: + plt.legend() + + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') + + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') + + plt.ylim(-10,100) + plt.xlim(0,1.0) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() + + plt.show() + + +if __name__ == "__main__": + main() + diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py index 684854d3b06..7e45aa17ab7 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py @@ -57,7 +57,12 @@ def getLoadingFromXML(xmlFilePath): thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) - volumetricHeatCapacity = float( tree.find('Constitutive/SolidInternalEnergy').get('volumetricHeatCapacity') ) + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('volumetricHeatCapacity') ) + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) diff --git a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst index 0c1d7be2a45..1afb1185816 100644 --- a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst +++ b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst @@ -119,48 +119,71 @@ Mesh definition and well geometry In the presence of wells, the **Mesh** block of the XML input file includes two parts: - a sub-block **VTKMesh** defining the reservoir mesh (see :ref:`TutorialSinglePhaseFlowExternalMesh` for more on this), - - a collection of sub-blocks **InternalWell** defining the geometry of the wells. + - a collection of sub-blocks defining the geometry of the wells. The reservoir mesh is imported from a ``.vtu`` file that contains the mesh geometry and also includes the permeability values in the x, y, and z directions. These quantities must be specified using the metric unit system, i.e., in meters for the well geometry and square meters for the permeability field. -We note that the mesh file only contains the active cells, so there is no keyword -needed in the XML file to define them. +We note that the mesh file only contains active cells, so there is no keyword +needed in the XML file to define them. + +.. image:: egg_model.png + :width: 400px + :align: center + +.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_benchmark.xml + :language: xml + :start-after: + :end-before: + + +.. _Events_tag_dead_oil_egg_model: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**InternalWell** sub-blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each well is defined internally (i.e., not imported from a file) in a separate **InternalWell** -XML sub-block. An **InternalWell** sub-block must point to the reservoir mesh that the well perforates -using the attribute ``meshName``, to the region corresponding to this well using the attribute +XML sub-block. An **InternalWell** sub-block must point to the region corresponding to this well using the attribute ``wellRegionName``, and to the control of this well using the attribute ``wellControl``. -Each block **InternalWell** must point to the reservoir mesh -(using the attribute ``meshName``), the corresponding well region (using -the attribute ``wellRegionName``), and the corresponding well control -(using the attribute ``wellControlName``). Each well is defined using a vertical polyline going through the seven layers of the -mesh, with a perforation in each layer. +mesh with a perforation in each layer. The well placement implemented here follows the pattern of the original test case. The well geometry must be specified in meters. The location of the perforations is found internally using the linear distance along the wellbore -from the top of the well, specified by the attribute ``distanceFromHead``. +from the top of the well specified by the attribute ``distanceFromHead``. It is the responsibility of the user to make sure that there is a perforation in the bottom cell of the well mesh otherwise an error will be thrown and the simulation will terminate. For each perforation, the well transmissibility factors employed to compute the perforation rates are calculated internally using the Peaceman formulation. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**VTKWell** sub-blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. image:: egg_model.png - :width: 400px - :align: center +Each well is loaded from a file in a separate **VTKWell** +XML sub-block. A **VTKWell** sub-block must point to the region corresponding to this well using the attribute +``wellRegionName``, and to the control of this well using the attribute ``wellControl``. -.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_benchmark.xml - :language: xml - :start-after: - :end-before: +Each well is defined using a vertical VTK polyline going through the seven layers of the +mesh with a perforation in each layer. +The well placement implemented here follows the pattern of the original test case. +The well geometry must be specified in meters. +The location of perforations is found internally using the linear distance along the wellbore +from the top of the well specified by the attribute ``distanceFromHead``. +It is the responsibility of the user to make sure that there is a perforation in the bottom cell +of the well mesh otherwise an error will be thrown and the simulation will terminate. +For each perforation, the well transmissibility factors employed to compute the perforation rates are calculated +internally using the Peaceman formulation. -.. _Events_tag_dead_oil_egg_model: +.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml + :language: xml + :start-after: + :end-before: ------------------------ Events @@ -181,11 +204,11 @@ by the attribute ``timeFrequency``. Here, we choose to output the results using the VTK format (see :ref:`TutorialSinglePhaseFlowExternalMesh` for a example that uses the Silo output file format). The ``target`` attribute must point to the **VTK** sub-block of the **Outputs** -block (defined at the end of the XML file) by name (here, ``vtkOutput``). +block defined at the end of the XML file by its user-specified name (here, ``vtkOutput``). -We define the events involved in the collection and output of the well production rates following the procedure defined in :ref:`TasksManager`. -The time history collection events trigger the collection of the well rates at the desired frequency, while the time history output events trigger the output of the HDF5 files containing the time series. -These events point by name to the corresponding blocks of the **Tasks** and **Outputs** XML blocks, respectively. Here, these names are ``wellRateCollection1`` and ``timeHistoryOutput1``. +We define the events involved in the collection and output of well production rates following the procedure defined in :ref:`TasksManager`. +The time-history collection events trigger the collection of well rates at the desired frequency, while the time-history output events trigger the output of HDF5 files containing the time series. +These events point by name to the corresponding blocks of the **Tasks** and **Outputs** XML blocks. Here, these names are ``wellRateCollection1`` and ``timeHistoryOutput1``. .. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml :language: xml @@ -199,7 +222,7 @@ These events point by name to the corresponding blocks of the **Tasks** and **Ou Numerical methods ---------------------------------- -In the ``NumericalMethods`` XML block, we instruct GEOS to use a TPFA finite-volume +In the ``NumericalMethods`` XML block, we instruct GEOS to use a TPFA (Two-Point Flux Approximation) finite-volume numerical scheme. This part is similar to the corresponding section of :ref:`TutorialDeadOilBottomLayersSPE10`, and has been adapted to match the specifications of the Egg model. @@ -215,7 +238,7 @@ This part is similar to the corresponding section of :ref:`TutorialDeadOilBottom Reservoir and well regions ----------------------------------- -In this section of the input file, we follow the procedure already described in +In this section of the input file, we follow the procedure described in :ref:`TutorialDeadOilBottomLayersSPE10` for the definition of the reservoir region with multiphase constitutive models. We associate a **CellElementRegion** named ``reservoir`` to the reservoir mesh. @@ -421,7 +444,7 @@ We can load this file into Paraview directly and visualize results: :width: 45% We have instructed GEOS to output the time series of rates for each producer. -The data contained in the corresponding hdf5 files can be extracted and plotted +The data contained in the corresponding HDF5 files can be extracted and plotted as shown below. .. plot:: docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py diff --git a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example index 15e46a7cf90..edf71ed717f 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example +++ b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example @@ -53,6 +53,14 @@ RUN touch /root/.ssh/environment &&\ # to your environment. This will prevent you from adding the `--allow-run-as-root` option # when you run mpi. Of course, weigh the benefits and risks and make your own decision. +# In case you want to use `sccache` (https://github.com/mozilla/sccache) to make your builds faster, +# you may configure the `sccache` config file at your convenience. +# Meanwhile, we provide here a simple local configuration. +RUN mkdir -p ${HOME}/.config/sccache +RUN printf '[cache.disk]\n\ +dir = "/tmp/.cache/sccache"\n\ +size = 3221225472 # 3GB\n' > ${HOME}/.config/sccache/config + # Default ssh port 22 is exposed. For _development_ purposes, # it can be useful to expose other ports for remote tools. EXPOSE 22 11111 64010-64020 diff --git a/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst b/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst index 6fa4b1d6d55..0b9275a9584 100644 --- a/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst +++ b/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst @@ -1,6 +1,6 @@ .. _InstallWin: -[Unsupported] Installing GEOS on Windows machines using Docker +[Best effort] Installing GEOS on Windows machines using Docker ================================================================= In this section, we will install GEOS on a Windows machine using a ``Docker`` container with a precompiled version of diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index f2e355372c2..3b5c325ce13 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -6,57 +6,112 @@ Integrated Tests About ================================= -*integratedTests* is a submodule of *GEOS* residing at the top level of the directory structure. -It defines a set of tests that will run *GEOS* with various *.xml* files and partitioning schemes using the `Automated Test System `_ (ATS). -For each scenario, test performance is evaluated by comparing output files to baselines recorded in this repository. +The GEOS integrated test system leverages the `Automated Test System `_ (ATS) and `GEOS ATS `_ packages to run various combinations of input files and machine configurations. +The output of these runs are then compared to baseline files and/or analytic solutions to guarantee the accuracy of the code. Structure ================================= -The *integratedTests* repository includes a python package (*integratedTests/scripts/geos_ats_package*) and a directory containing test definitions (*integratedTests/tests/allTests*). -A typical test directory will include an *.ats* file, which defines the behavior of tests or points to child test directories, symbolic links to any required *.xml* files, and a directory containing baseline files. +GEOS integrated tests are defined in the *GEOS/inputFiles* directory, and are organized into folders based on the physical processes being tested. +A test folder can contain any number of *.ats* configuration files, *.xml* input files, and supporting inputs (tables files, meshes, etc.). .. code-block:: sh - - integratedTests/ - - scripts/ - - geos_ats_package - - tests/ - - allTests/ - - main.ats/ - - sedov/ - - baselines/ - - sedov_XX/ - - - - sedov.ats - - sedov.xml + - inputFiles/ + - main.ats/ + - solidMechanics/ + - sedov.ats + - sedov.xml + - etc. + - .integrated_tests.yaml -High level integrated test results are recorded in the GEOS build directory: */path/to/GEOS/build-xyz/integratedTests/TestsResults*. -These include *.log* and *.err* files for each test and a *test_results.html* summary file, which can be inspected in your browser. +Test baselines are stored as *.tar.gz* archive and share the same directory structure as *GEOS/inputFiles*. +During test execution, the *geos_ats* package will fetch and unpack any necessary baselines described in the top-level *.integrated_tests.yaml* configuration file. + + + +How to Run the Tests +================================= + +GEOS CI Pipeline +--------------------------------- + +In most cases, developers will be able to rely on the integrated tests that are run as part of the GEOS CI Pipeline. +These can be triggered if the **ci: run integrated tests** label is selected for a pull request (this can be added from the right-hand panel on PR page). + +To inspect the results of CI tests, select the *Checks* tab from the top of the pull request and then select *run_integrated_tests/build_test_deploy* from the left-hand panel. + + +.. image:: integrated_test_location_pr_a.png + :width: 400px + + +.. image:: integrated_test_location_pr_b.png + :width: 400px + + +This page will show the full output of GEOS build process and the integrated test suite. +At the bottom of this page, the logs will contain a summary of the test results and a list of any ignored/failed tests. + + +.. code-block:: sh + + ======================= + Integrated test results + ======================= + expected: 0 + created: 0 + batched: 0 + filtered: 104 + skipped: 0 + running: 0 + passed: 215 + timedout: 0 (3 ignored) + halted: 0 + lsferror: 0 + failed: 0 + ======================= + Ignored tests + ======================= + pennyShapedToughnessDominated_smoke_01 + pennyShapedViscosityDominated_smoke_01 + pknViscosityDominated_smoke_01 + ======================= + Overall status: PASSED + ======================= + + +The log will provide instructions on where to download the test results and a baseline ID that can be assigned in the *.integrated_tests.yaml* file. + + + +. code-block:: sh + + Download the bundle at https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3044-4400-e6359ca.tar.gz + New baseline ID: baseline_integratedTests-pr3044-4400-e6359ca + .. note:: - Baseline files are stored using the git LFS (large file storage) plugin. - If you followed the suggested commands in the quickstart guide, then your environment is likely already setup. + Integrated tests within GEOS CI pipeline are run on a shared machine, and may take up to 30 minutes to complete. It may take some time for the tests to begin if the machine is in use by other developers. - However, if lfs is not yet activated, then the contents of baseline files may look something like this: - 0to100_restart_000000100/rank_0000003.hdf5 - version https://git-lfs.github.com/spec/v1 - oid sha256:09bbe1e92968852cb915b971af35b0bba519fae7cf5934f3abc7b709ea76308c - size 1761208 +Manual Test Runs +--------------------------------- - If this is the case, try running the following commands: ``git lfs install`` and ``git lfs pull``. +Before running the integrated tests manually, we recommend that you define the following variables in your machine's host configuration file: +* `ATS_WORKING_DIR` : The location where tests should be run (default=*GEOS/[build-dir]/integratedTests/workingDir*) +* `ATS_BASELINE_DIR` : The location where test baselines should be stored (default=*GEOS/integratedTests*) +.. note:: + The `ATS_WORKING_DIR` should be located on a file system that is amenable to parallel file IO. -How to Run the Tests -================================= -In most cases, integrated tests processes can be triggered in the GEOS build directory with the following commands: +After building GEOS, the integrated tests can be triggered in the GEOS build directory with the following commands: * `make ats_environment` : Setup the testing environment (Note: this step is run by default for the other make targets). This process will install packages required for testing into the python environment defined in your current host config file. Depending on how you have built GEOS, you may be prompted to manually run the `make pygeosx` command and then re-run this step. * `make ats_run` : Run all of the available tests (see the below note on testing resources). @@ -66,7 +121,7 @@ In most cases, integrated tests processes can be triggered in the GEOS build dir .. note:: - The `make_ats_environment` step will attempt to collect python packages github and pypi, so it should be run from a machine with internet access. + The `make_ats_environment` and `ats_run` steps may require internet access to collect python packages and baseline files. .. note:: @@ -176,7 +231,7 @@ Otherwise, you will need to track down and potentially fix the issue that trigge Test Output -------------------------------- -Output files from the tests will be stored in the TestResults directory (*/path/to/GEOS/build-xyz/integratedTests/TestsResults*) or in a subdirectory next to their corresponding *.xml* file (*integratedTests/tests/allTests/testGroup/testName_xx*). +Output files from the tests will be stored in the specified working directory (linked here: */path/to/GEOS/build-xyz/integratedTests/TestsResults*). Using the serial beam bending test as an example, key output files include: * *beamBending_01.data* : Contains the standard output for all test steps. @@ -395,10 +450,10 @@ They use a Python 3.x syntax, and have a set of ATS-related methods loaded into The root configuration file (*integratedTests/tests/allTests/main.ats*) finds and includes any test definitions in its subdirectories. The remaining configuration files typically add one or more tests with varying partitioning and input xml files to ATS. -The *integratedTests/tests/allTests/sedov/sedov.ats* file shows how to add three groups of tests. +The *inputFiles/solidMechanics/sedov.ats* file shows how to add three groups of tests. This file begins by defining a set of common parameters, which are used later: -.. literalinclude:: ../../../../../integratedTests/tests/allTests/sedov/sedov.ats +.. literalinclude:: ../../../../../inputFiles/solidMechanics/sedov.ats :language: python :start-after: # Integrated Test Docs Begin Parameters :end-before: # Integrated Test Docs End Parameters @@ -406,216 +461,65 @@ This file begins by defining a set of common parameters, which are used later: It then enters over the requested partitioning schemes: -.. literalinclude:: ../../../../../integratedTests/tests/allTests/sedov/sedov.ats +.. literalinclude:: ../../../../../inputFiles/solidMechanics/sedov.ats :language: python :start-after: # Integrated Test Docs Begin Test Loop :end-before: # Integrated Test Docs End Test Loop -and registers a unique test case with the `TestCase` method, which accepts the following arguments: - -* name : The name of the test. The expected convention for this variable is 'testName_N' (N = number of ranks) or 'testName_X_Y_Z' (X, Y, and Z ranks per dimension) -* desc : A brief description of the test -* label : The test label (typically 'auto') -* owner : The point(s) of contact for the test -* independent : A flag indicating whether the test is dependent on another test (typically True) -* steps: A tuple containing the test steps (minimum length = 1) - - -Test steps are run sequentially, and are created with the `geos` method. -If a given test step fails, then it will produce an error and any subsequent steps will be canceled. -This method accepts the following keyword arguments: +and registers a unique test case with the `TestDeck` method, which accepts the following arguments: -* deck : The name of the input xml file. -* np : The number of parallel processes required to run the step. -* ngpu : The number of GPU devices required to run the step. Note: this argument is typically ignored for geos builds/machines that are not configured to use GPU's. In addition, we typically expect that np=ngpu. -* x_partitions : The number of partitions to use along the x-dimension -* y_partitions : The number of partitions to use along the y-dimension -* z_partitions : The number of partitions to use along the z-dimension -* name : The header to use for output file names -* restartcheck_params : (optional) If this value is defined, run a restart check with these parameters (specified as a dictionary). -* curvecheck_params : (optional) If this value is defined, run a curve check with these parameters (specified as a dictionary). -* restart_file : (optional) The name of a restart file to resume from. To use this option, there must be a previous step that produces the selected restart file. -* baseline_pattern : (optional) The regex for the baseline files to use (required if the name of the step differs from the baseline) -* allow_rebaseline : A flag that indicates whether this step can be rebaselined. This is typically only true for the first step in a test case. +* name : The name of the test +* description : A brief description of the test +* partitions : A list of partition schemes to be tested +* restart_step : The cycle number where GEOS should test its restart capability +* check_step : The cycle number where GEOS should evaluate output files +* restartcheck_params : Parameters to forward to the restart check (tolerance, etc.) +* curvecheck_params: Parameters to forward to the curve check (tolerance, etc.) -Note that a given *.ats* file can create any number of tests and link to any number of input xml files. -For any given test step, we expect that at least one restart or curve check be defined. +.. note:: + An *.ats* file can create any number of tests and link to any number of input xml files. + For any given test step, we expect that at least one restart or curve check be defined. Creating a New Test Directory ------------------------------- -To add a new set of tests, create a new folder in the `integratedTests/tests/allTests*` directory. +To add a new set of tests, create a new folder under the `GEOS/inputFiles` directory. This folder needs to include at least one *.ats* file to be included in the integrated tests. Using the sedov example, after creating *sedov.ats* the directory should look like .. code-block:: sh - - integratedTests/tests/allTests/sedov/ - - sedov.ats - - sedov.xml (this file should be a symbolic link to a GEOS input file located somewhere within */path/to/GEOS/inputFiles*) - -At this point you should run the integrated tests (in the build directory run: `make ats_run`). -Assuming that the new *geos* step for your test case was successful, the subsequent *restartcheck* step will fail because the baselines have not yet been created. -At this point the directory should look like this: - -.. code-block:: sh - - - integratedTests/tests/allTests/sedov/ - - sedov/ - - ... - - ... + - inputFiles/solidMechanics - sedov.ats - sedov.xml - - ... -You can then follow the steps in the next section to record the initial baseline files. +These changes will be reflected in the new baselines after triggering the manual rebaseline step. .. _rebaselining-tests: Rebaselining Tests ----------------------------- +===================== Occasionally you may need to add or update baseline files in the repository (possibly due to feature changes in the code). This process is called rebaselining. We suggest the following workflow: -Step 1 -^^^^^^^^^ - -In the GEOS repository, create or checkout a branch with your modifications: - -.. code-block:: sh - - cd /path/to/GEOS - git checkout -b user/feature/newFeature - - -Add your changes, confirm that they produce the expected results, and get approval for a pull request. -If your branch needs to be rebaselined, make sure to indicate this in your pull request with the appropriate Label. - - -Step 2 -^^^^^^^^^ - -Go to the integratedTests submodule, checkout and pull develop, and create a branch with the same name as the one in the main GEOS repository: - -.. code-block:: sh - - cd /path/to/GEOS/integratedTests - git checkout develop - git pull - git checkout -b user/feature/newFeature - - -Step 3 -^^^^^^^^^ - -Go back to your GEOS build directory and run the integrated tests: - -.. code-block:: sh - - # Note: on shared machines, run these commands in an allocation - cd /path/to/GEOS/build-dir/ - make ats_run - - -Inspect the test results that fail and determine which need to be **legitimately** rebaselined. -Arbitrarily changing baselines defeats the purpose of the integrated tests. -In your PR discussion, please identify which tests will change and any unusual behavior. - - -Step 4 -^^^^^^^^^ - -We can then rebaseline the tests. -In most cases, you will want to rebaseline all of the tests marked as **FAILED**. -To do this you can run this command in the build directory: - -.. code-block:: sh - - make ats_rebaseline_failed - - -Otherwise, you can run the following command, and select whether tests should be rebaselined one at a time via a ``[y/n]`` prompt. - -.. code-block:: sh - - make ats_rebaseline_failed - - -Make sure to only answer ``y`` to the tests that you actually want to rebaseline, otherwise correct baselines for already passing tests will still be updated and bloat your pull request and repository size. - - -Step 5 -^^^^^^^^^ - -Confirm that the new baselines are working as expected. -You can do this by cleaning the test directories and re-running the tests: - -.. code-block:: sh - - # Note: on shared machines, run these commands in an allocation - cd /path/to/GEOS/build-dir/ - make ats_clean - make ats_run - - -At this point you should pass all the integratedTests. - - -Step 6 -^^^^^^^^^ - -Clean out unnecessary files and add new ones to the branch: - -.. code-block:: sh - - cd /path/to/GEOS/build-dir/ - make ats_clean - - # Check for new or modified files - cd /path/to/GEOS/integratedTests - git status - - # Add new or modified files - git add file_a file_b ... - git commit -m "Updating baselines" - git push origin user/feature/newFeature - - -Step 6 -^^^^^^^^^ - -If you haven't already done so, create a merge request for your integratedTests branch. -Once you have received approval for your PR and are ready to continue, you can click merge the branch by clicking the button on github. - -You should then checkout the develop branch of integratedTests and pull the new changes. - -.. code-block:: sh - - cd /path/to/GEOS/integratedTests - git checkout develop - git pull - - -You then need to update the integratedTests 'hash' in your associated GEOS branch. - -.. code-block:: sh - - cd /path/to/GEOS/ - git add integratedTests - git commit -m "Updating the integratedTests hash" - git push origin user/feature/newFeature - +#. Open a pull request for your branch on github and select the **ci: run integrated tests** label +#. Wait for the tests to finish +#. Download and unpack the new baselines from the link provided at the bottom of the test logs +#. Inspect the test results using the *test_results.html* file +#. Verify that the changes in the baseline files are desired +#. Update the baseline ID in the *GEOS/.integrated_tests.yaml* file +#. Add a justification for the baseline changes to the *GEOS/BASELINE_NOTES.md* file +#. Commit your changes and push the code +#. Wait for the CI tests to re-run and verify that the integrated tests step passed -At this point, you will need to wait for the CI/CD tests to run on github. -After they succeed, you can merge your branch into develop using the button on github. diff --git a/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst b/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst index 46bbf885b50..5600e7fef3f 100644 --- a/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst +++ b/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst @@ -1,6 +1,6 @@ .. _UsingDocker: -[Unsupported] Developing inside Docker with precompiled TPL binaries +[Best effort] Developing inside Docker with precompiled TPL binaries ==================================================================== For development purposes, you may want to use the publicly available docker images instead of compiling them yourself. diff --git a/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst new file mode 100644 index 00000000000..5a15121d48c --- /dev/null +++ b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst @@ -0,0 +1,97 @@ + +.. _WorkingInteractivelyOnCI: + +******************************************** +How to work interactively on the CI Machines +******************************************** + +When developing with GEOS, developers may sometimes face compilation errors or test failures that only manifest in specific Continuous Integration (CI) builds. +To effectively troubleshoot these issues, it's advisable to debug directly in the target environment. The preferred method involves using Docker to locally replicate the problematic image. +However, for those without Docker access on their machines, (or for cases inherently related to the CI configuration), an alternative is to establish a connection to the CI machines. Here are the steps to do so: + +Step 1: Adding a GHA to establish a connection +============================================== + +First, as much as you can, try to reduce the number of jobs you're triggering by commenting out the configurations you do not require for your debugging. +Then in your branch, add the following GHA step to the `.github/build_and_test.yml` (see full documentation of the action `here _`). + +.. code-block:: console + - name: ssh + uses: lhotari/action-upterm@v1 + with: + ## limits ssh access and adds the ssh public key for the user which triggered the workflow + limit-access-to-actor: true + ## limits ssh access and adds the ssh public keys of the listed GitHub users + limit-access-to-users: GitHubLogin + +The action should be added after whichever step triggers an error. In case of a build failure it is best to add the action after the `build, test and deploy` step. +It is also important to prevent the job to exit upon failure. For instance, it is suggested to comment the following lines in the `build, test and deploy` step. + +.. code-block:: console + set -e + +.. code-block:: console + exit ${EXIT_STATUS} + + +You can now commit the changes and push them to your remote branch. + +Step 2: Inspect the CI and grab server address +============================================== + +.. code-block:: console + Run lhotari/action-upterm@v1 + upterm + + Auto-generating ~/.ssh/known_hosts by attempting connection to uptermd.upterm.dev + Pseudo-terminal will not be allocated because stdin is not a terminal. + + Warning: Permanently added 'uptermd.upterm.dev' (ED25519) to the list of known hosts. + + runner@uptermd.upterm.dev: Permission denied (publickey). + + Adding actor "GitHubLogin" to allowed users. + Fetching SSH keys registered with GitHub profiles: GitHubLogin + Fetched 2 ssh public keys + Creating a new session. Connecting to upterm server ssh://uptermd.upterm.dev:22 + Created new session successfully + Entering main loop + === Q16OBOFBLODJVA3TRXPL + Command: tmux new -s upterm -x 132 -y 43 + Force Command: tmux attach -t upterm + + Host: ssh://uptermd.upterm.dev:22 + SSH Session: ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + + +Step 3: Connect to the machine via ssh +====================================== + +You can now open a terminal in your own machine and sshe to the upterm server, e.g., + + +.. code-block:: console + ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + + +Step 4: Run the docker container interactively +============================================== +Once you are connected to the machine it is convenient to follow these steps to interactively run the docker container: + +.. code-block:: console + docker ps -a + + +The id of the existing docker container will be displayed and you can use it to commit the container. + +.. code-block:: console + docker commit debug_image + +and then run it interactively, e.g. + +.. code-block:: console + docker run -it --volume=/home/runner/work/GEOS/GEOS:/tmp/geos -e ENABLE_HYPRE=ON -e ENABLE_HYPRE_DEVICE=CUDA -e ENABLE_TRILINOS=OFF --cap-add=SYS_PTRACE --entrypoint /bin/bash debug_image + +Step 5: Cancel the workflow +============================================== +Once you are done, do not forget to cancel the workflow! \ No newline at end of file diff --git a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst index b1649780e84..dd03fc486a3 100644 --- a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst +++ b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst @@ -26,3 +26,5 @@ Contributing UsingDocker.rst InstallWin.rst + + WorkingInteractivelyOnCI.rst diff --git a/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png b/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png new file mode 100644 index 00000000000..410939056bd Binary files /dev/null and b/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png differ diff --git a/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_b.png b/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_b.png new file mode 100644 index 00000000000..2d676c12017 Binary files /dev/null and b/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_b.png differ diff --git a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst index d8cb998df21..00bf5cd0a90 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst @@ -359,6 +359,6 @@ After assembling both declarations and implementations for our new solver, the f - add declarations to parent CMakeLists.txt (here add to ``physicsSolvers_headers`` ); - add implementations to parent CMakeLists.txt (here add to ``physicsSolvers_sources``); - check that Doxygen comments are properly set in our solver class; - - uncrustify it to match the code style; + - uncrustify it to match the code style by going to the build folder and running the command: make uncrustify_style; - write unit tests for each new features in the solver class; - write an integratedTests for the solver class.