diff --git a/.github/workflows/pr-1-ci.yml b/.github/workflows/pr-1-ci.yml new file mode 100644 index 00000000..9d6676bf --- /dev/null +++ b/.github/workflows/pr-1-ci.yml @@ -0,0 +1,153 @@ +name: PR Checks +on: + pull_request: + branches: + - 'release-*' + - 'dev-*' + paths-ignore: + # These are ignored because they don't have anything to do with the model itself + - .github/** + - tools/** + - doc/** + - .* + - metadata.yaml + - README.md +jobs: + commit-check: + name: Commit Check + # We run this job to check if the current commit was done during a workflow run. + # Such as when 'github-actions' bumps the metadata.yaml file or updates the checksums + # in the `testing` directory. + # This is so we don't recursively commit and check infinitely during this workflow. + runs-on: ubuntu-latest + outputs: + authorship: ${{ steps.head-commit.outputs.authorship }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: HEAD Commit Authorship + id: head-commit + run: echo "authorship=$(git log -1 --pretty=format:'%an')" >> $GITHUB_OUTPUT + + repro-ci: + # run the given config on the deployment GitHub Environment (`environment-name`) and + # upload the checksums and test details + needs: + - commit-check + if: needs.commit-check.outputs.authorship != 'github-actions' + uses: access-nri/reproducibility/.github/workflows/checks.yml@main + with: + model-name: access-om2 + environment-name: Gadi + config-tag: ${{ github.head_ref }} + test-markers: checksum + secrets: inherit + permissions: + contents: write + + check-checksum: + # Parse the test report and return pass/fail result + name: Check and Update Checksum + needs: + - repro-ci + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + checks: write + env: + TESTING_LOCAL_LOCATION: /opt/testing + outputs: + # URL for the parsed test results + check-run-url: ${{ steps.results.outputs.check-url }} + # Overall result of the checksum repro CI - `pass` (if reproducible), `fail` otherwise + result: ${{ steps.results.outputs.result }} + # Version of the checksum compared against the newly generated one + compared-checksum-version: ${{ steps.results.outputs.compared-checksum-version }} + steps: + - name: Download Newly Created Checksum + uses: actions/download-artifact@v3 + with: + name: ${{ needs.repro-ci.outputs.artifact-name }} + path: ${{ env.TESTING_LOCAL_LOCATION }} + + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + fetch-tags: true + + - name: Parse Test Report + id: tests + uses: EnricoMi/publish-unit-test-result-action/composite@e780361cd1fc1b1a170624547b3ffda64787d365 #v2.12.0 + with: + files: ${{ env.TESTING_LOCAL_LOCATION }}/checksum/test_report.xml + comment_mode: off + check_run: true + compare_to_earlier_commit: false + report_individual_runs: true + report_suite_logs: any + + - name: Checksum Tests Results + id: results + run: | + echo "check-url=${{ fromJson(steps.tests.outputs.json).check_url }}" >> $GITHUB_OUTPUT + echo "compared-checksum-version=$(git describe --tags --abbrev=0)" >> $GITHUB_OUTPUT + if [ "${{ fromJson(steps.tests.outputs.json).stats.tests_fail }}" > 0 ]; then + echo "result=fail" >> $GITHUB_OUTPUT + else + echo "result=pass" >> $GITHUB_OUTPUT + fi + + result: + name: Repro Result Notifier + # Notify the PR of the result of the Repro check + needs: + - repro-ci + - check-checksum + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + permissions: + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Successful Release Comment + if: needs.check-checksum.outputs.result == 'pass' && startsWith(github.base_ref, 'release-') + env: + BODY: | + :white_check_mark: The Bitwise Reproducibility check succeeded when comparing against `${{ needs.check-checksum.outputs.compared-checksum-version }}` for this `Release` config. :white_check_mark: + For further information, the experiment can be found on Gadi at ${{ needs.repro-ci.outputs.experiment-location }}, and the test results at ${{ needs.check-checksum.outputs.check-run-url }}. + Consider bumping the minor version of `access-om2-configs` - to bump the version, comment `!bump minor`. The meaning of these version bumps is explained in the README.md, under `Config Tags`. + run: gh pr comment --body '${{ env.BODY }}' + + - name: Successful Dev Comment + if: needs.check-checksum.outputs.result == 'pass' && startsWith(github.base_ref, 'dev-') + env: + BODY: | + :white_check_mark: The Bitwise Reproducibility check succeeded when comparing against `${{ needs.check-checksum.outputs.compared-checksum-version }}` for this `Dev` config. :white_check_mark: + For further information, the experiment can be found on Gadi at ${{ needs.repro-ci.outputs.experiment-location }}, and the test results at ${{ needs.check-checksum.outputs.check-run-url }}. + run: gh pr comment --body '${{ env.BODY }}' + + - name: Failed Release Comment + if: needs.check-checksum.outputs.result == 'fail' && startsWith(github.base_ref, 'release-') + env: + BODY: | + :x: The Bitwise Reproducibility check failed when comparing against `${{ needs.check-checksum.outputs.compared-checksum-version }}` for this `Release` config. :x: + For further information, the experiment can be found on Gadi at ${{ needs.repro-ci.outputs.experiment-location }}, and the test results at ${{ needs.check-checksum.outputs.check-run-url }}. + You must bump the major version of `access-om2-configs` before this PR is merged to account for this - to bump the version, comment `!bump major`. The meaning of these version bumps is explained in the README.md, under `Config Tags`. + run: gh pr comment --body '${{ env.BODY }}' + + - name: Failed Dev Comment + if: needs.check-checksum.outputs.result == 'fail' && startsWith(github.base_ref, 'dev-') + env: + BODY: | + :warning: The Bitwise Reproducibility check failed when comparing against `${{ needs.check-checksum.outputs.compared-checksum-version }}` for this `Dev` config. :warning: + For further information, the experiment can be found on Gadi at ${{ needs.repro-ci.outputs.experiment-location }}, and the test results at ${{ needs.check-checksum.outputs.check-run-url }}. + run: gh pr comment --body '${{ env.BODY }}' diff --git a/.github/workflows/pr-2-confirm.yml b/.github/workflows/pr-2-confirm.yml new file mode 100644 index 00000000..adbcb472 --- /dev/null +++ b/.github/workflows/pr-2-confirm.yml @@ -0,0 +1,160 @@ +# This workflow is used to do a major/minor version bump to the `metadata.yaml` file, +# through a comment on the PR. It also commits and pushes the checksum file, +# as this is the last stage before merging. +# This is not done automatically because users may want to modify their config +# based on the result of the reproducibility check. +name: Confirm +on: + issue_comment: + types: + - created + - edited +env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} +jobs: + bump-version: + name: Bump metadata.yaml + # Bump the `metadata.yaml` file if the comment is made on a PR and starts with '!bump' + if: github.event.issue.pull_request && startsWith(github.event.comment.body, '!bump') + runs-on: ubuntu-latest + outputs: + # metadata.yaml version before being bumped + before: ${{ steps.bump.outputs.before }} + # metadata.yaml version after being bumped + after: ${{ steps.bump.outputs.after }} + # The type of bump - 'major' or 'minor' + type: ${{ steps.type.outputs.bump }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_COMMIT_CHECK_TOKEN }} + + - name: Checkout Associated PR ${{ github.event.issue.number }} + # Since the trigger for this workflow was on.issue_comment, we need + # to do a bit more wrangling to checkout the pull request + id: pr + run: gh pr checkout ${{ github.event.issue.number }} + + - name: Get Type of Bump + id: type + run: | + if [[ "${{ contains(github.event.comment.body, 'minor') }}" == "true" ]]; then + echo "bump=minor" >> $GITHUB_OUTPUT + elif [[ ${{ contains(github.event.comment.body, 'major') }} == "true" ]]; then + echo "bump=major" >> $GITHUB_OUTPUT + else + echo "::error::Comment was not of the form: '!bump [major|minor]'" + exit 1 + fi + + - name: Bump + # Regarding the regex in the script: `([0-9]+)\.([0-9]+)` is broken down into: + # `([0-9]+)`: Major version (eg. `12`) + # `\.`: Version separator (eg. `.`) + # `([0-9]+)`: Minor version (eg. `1`) + # which would give `12.1` + id: bump + run: | + version=$(yq '.version' metadata.yaml) + regex="([0-9]+)\.([0-9]+)" + if [[ $version =~ $regex ]]; then + major_version="${BASH_REMATCH[1]}" + minor_version="${BASH_REMATCH[2]}" + else + echo "::error::Invalid version format in metadata.yaml file!" + exit 1 + fi + + if [[ "${{ steps.type.outputs.bump }}" == "minor" ]]; then + minor_version=$((minor_version + 1)) + elif [[ "${{ steps.type.outputs.bump }}" == "major" ]]; then + major_version=$((major_version + 1)) + minor_version=0 + fi + new_version="${major_version}.${minor_version}" + echo "before=$version" >> $GITHUB_OUTPUT + echo "after=$new_version" >> $GITHUB_OUTPUT + + commit: + name: Commit metadata.yaml and Checksum + needs: + - bump-version + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + env: + GH_TOKEN: ${{ secrets.GH_COMMIT_CHECK_TOKEN }} + ARTIFACT_LOCAL_LOCATION: /opt/artifact + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_COMMIT_CHECK_TOKEN }} + + - name: Checkout Associated PR ${{ github.event.issue.number }} + # Since the trigger for this workflow was on.issue_comment, we need + # to do a bit more wrangling to checkout the pull request and get the branch name + id: pr + run: | + gh pr checkout ${{ github.event.issue.number }} + echo "branch=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_OUTPUT + + - name: Download Newly Created Checksum + # Given the PR branch, we need to find the latest associated workflow run + # on this branch we can then download the associated artifact + run: | + associated_run=$(gh run list \ + --json='databaseId,headBranch,updatedAt,status' \ + --jq='[.[] | select(.headBranch == "${{ steps.pr.outputs.branch }}" and .status == "completed")] | sort_by(.updatedAt) | last | .databaseId') + gh run download $associated_run -D ${{ env.ARTIFACT_LOCAL_LOCATION }} + + - name: Update metadata.yaml and Checksum files + run: | + yq -i '.version = "${{ needs.bump-version.outputs.after }}"' metadata.yaml + cp --recursive --verbose ${{ env.ARTIFACT_LOCAL_LOCATION }}/*/* testing + + - name: Commit and Push Updates + run: | + git config user.name github-actions + git config user.email github-actions@github.com + + if [[ "${{ needs.bump-version.outputs.type }}" == "minor" ]]; then + git commit -am "Bumped version to ${{ needs.bump-version.outputs.after }} as part of ${{ env.RUN_URL }}" + elif [[ "${{ needs.bump-version.outputs.type }}" == "major" ]]; then + git commit -am "Updated checksums and bumped version to ${{ needs.bump-version.outputs.after }} as part of ${{ env.RUN_URL }}" + fi + git push + + - name: Comment Success + env: + BODY: | + :white_check_mark: Version bumped from `${{ needs.bump-version.outputs.before }}` to `${{ needs.bump-version.outputs.after }}` :white_check_mark: + run: gh pr comment --body '${{ env.BODY }}' + + failure-notifier: + name: Failure Notifier + if: failure() + needs: + - commit + runs-on: ubuntu-latest + permissions: + pull-requests: write + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Checkout Associated PR ${{ github.event.issue.number }} + run: gh pr checkout ${{ github.event.issue.number }} + + - name: Comment Failure + env: + BODY: | + :x: Failed to bump VERSION or commit changes, see ${{ env.RUN_URL }} :x: + run: gh pr comment --body '${{ env.BODY }}' diff --git a/.github/workflows/pr-3-bump-tag.yml b/.github/workflows/pr-3-bump-tag.yml new file mode 100644 index 00000000..aa76613c --- /dev/null +++ b/.github/workflows/pr-3-bump-tag.yml @@ -0,0 +1,41 @@ +# This workflow is used to convert the `.version` in the `metadata.yaml` file into a valid `git tag` on push to `main`. +# We use the `.version` field in that file to denote the version of the config once a PR is merged. +name: Bump Tag +on: + push: + branches: + - 'release-*' + paths: + - 'metadata.yaml' +jobs: + tag-update: + name: Check and Update Tag + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + fetch-tags: true + + - name: Existing Tag Check + # Check if the tag already exists, if it does, we don't want to move it. + id: tag + run: | + VERSION_TAG=${{ github.ref_name }}-$(yq '.version' metadata.yaml) + VERSION_TAG_ON_GIT=$(git tag -l $VERSION_TAG) + if [ -n "$VERSION_TAG_ON_GIT" ]; then + echo "::warning::Tag $VERSION_TAG already exists. Skipping." + echo "exists=true" >> $GITHUB_OUTPUT + else + echo "exists=false" >> $GITHUB_OUTPUT + echo "version=$VERSION_TAG" >> $GITHUB_OUTPUT + fi + + - name: Update Tag + if: steps.tag.outputs.exists == 'false' + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git tag ${{ steps.tag.outputs.version }} + git push --tags diff --git a/.github/workflows/schedule-1-ci.yml b/.github/workflows/schedule-1-ci.yml new file mode 100644 index 00000000..9a055f42 --- /dev/null +++ b/.github/workflows/schedule-1-ci.yml @@ -0,0 +1,36 @@ +name: Scheduled Checks +on: + workflow_dispatch: + schedule: + - cron: '0 0 1 * *' # once a month +jobs: + setup: + name: Setup Tasks + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.get-released-config.outputs.tags }} + steps: + - uses: actions/checkout@v4 + with: + ref: main + + - name: Get all released configs + id: get-released-config + run: echo "tags=$(jq --compact-output --raw-output '.tags' config/released-configs.json)" >> $GITHUB_OUTPUT + + repro-ci: + # We use this reusable workflow with a matrix strategy rather than calling repro-ci.yml, as + # we may want to do config-branch-specific tasks after the matrixed repro-ci.yml has completed. + needs: + - setup + strategy: + fail-fast: false + matrix: + config-tag: ${{ fromJson(needs.setup.outputs.tags) }} + uses: ./.github/workflows/schedule-2-start.yml + with: + config-tag: ${{ matrix.config-tag }} + secrets: inherit + permissions: + contents: write + issues: write diff --git a/.github/workflows/schedule-2-start.yml b/.github/workflows/schedule-2-start.yml new file mode 100644 index 00000000..b42fb3d3 --- /dev/null +++ b/.github/workflows/schedule-2-start.yml @@ -0,0 +1,103 @@ +name: Scheduled Checks - Branch Specific +on: + workflow_call: + inputs: + config-tag: + type: string + required: true + description: Tag associated with a config branch that is used in the reproducibility run +jobs: + repro-ci: + # Run the given config on the deployment Github Environment (`environment-name`) and upload + # the test results and checksum. + uses: access-nri/reproducibility/.github/workflows/checks.yml@main + with: + model-name: access-om2 + environment-name: Gadi + config-tag: ${{ inputs.config-tag }} + test-markers: checksum + secrets: inherit + permissions: + contents: write + + check-checksum: + name: Check Repro Results + # Parse the test results + needs: + - repro-ci + runs-on: ubuntu-latest + env: + TESTING_LOCAL_LOCATION: /opt/testing + outputs: + # URL for the parsed test results + check-run-url: ${{ steps.results.outputs.check-url }} + # Overall result of the checksum repro CI - `pass` (if reproducible), `fail` otherwise + result: ${{ steps.results.outputs.result }} + # Version of the checksum compared against the newly generated one + compared-checksum-version: ${{ steps.results.outputs.compared-checksum-version }} + steps: + - name: Download Newly Created Checksum + uses: actions/download-artifact@v3 + with: + name: ${{ needs.repro-ci.outputs.artifact-name }} + path: ${{ env.TESTING_LOCAL_LOCATION }} + + - name: Parse Test Report + id: tests + uses: EnricoMi/publish-unit-test-result-action/composite@e780361cd1fc1b1a170624547b3ffda64787d365 #v2.12.0 + with: + files: ${{ env.TESTING_LOCAL_LOCATION }}/checksum/test_report.xml + comment_mode: off + check_run: true + compare_to_earlier_commit: false + report_individual_runs: true + report_suite_logs: any + + - name: Checksum Tests Results + id: results + run: | + echo "check-url=${{ fromJson(steps.tests.outputs.json).check_url }}" >> $GITHUB_OUTPUT + echo "compared-checksum-version=${{ inputs.config-tag }}" >> $GITHUB_OUTPUT + if [ "${{ fromJson(steps.tests.outputs.json).stats.tests_fail }}" > 0 ]; then + echo "result=fail" >> $GITHUB_OUTPUT + else + echo "result=pass" >> $GITHUB_OUTPUT + fi + + failed-repro: + name: Failed Reproduction Notifier + needs: + - repro-ci + - check-checksum + if: failure() || needs.check-checksum.outputs.result == 'fail' + runs-on: ubuntu-latest + permissions: + issues: write + env: + MODEL: access-om2 + MODEL_URL: https://github.com/ACCESS-NRI/access-om2 + CONFIG: access-om2-configs + CONFIG_URL: https://github.com/ACCESS-NRI/access-om2-configs + TAG_URL: https://github.com/ACCESS-NRI/access-om2-configs/tags/${{ needs.check-checksum.outputs.compared-checksum-version }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + steps: + - name: Create issue + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + BODY: | + There was a failure of a monthly reproducibility check on ${{ github.repository }}. + Logs, checksums and other artifacts can be found at the Failed Run Log link below. + + Model: ${{ env.MODEL }}, found here: ${{ env.MODEL_URL }} + Config Repo: ${{ env.CONFIG }}, found here: ${{ env.CONFIG_URL }} + Config Tag Tested for Reproducibility: ${{ needs.check-checksum.outputs.compared-checksum-version }}, found here: ${{ env.TAG_URL }} + Failed Run Log: ${{ env.RUN_URL }} + Experiment Location (Gadi): ${{ needs.repro-ci.outputs.experiment-location }} + + Tagging @ACCESS-NRI/model-release + run: | + gh issue create \ + --title "Scheduled Repro Check Failed for Config ${{ needs.check-checksum.outputs.compared-checksum-version }}" \ + --label "type:repro-fail,priority:blocker" \ + --body "${{ env.BODY }}" diff --git a/.github/workflows/validate-json.yml b/.github/workflows/validate-json.yml new file mode 100644 index 00000000..a23beac2 --- /dev/null +++ b/.github/workflows/validate-json.yml @@ -0,0 +1,13 @@ +name: Validate JSON files +on: + pull_request: + branches: + - main + paths: + - '**.json' +jobs: + validate: + name: Validate + uses: access-nri/actions/.github/workflows/validate-json.yml@main + with: + src: "config" diff --git a/.gitignore b/.gitignore index a8658446..2e377d7e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ access-om2.out *.[eo][0-9]* .DS_Store ._* +.vscode \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..efe01b85 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing + +## Pull Request Process + +### Changes to ACCESS-OM2 Configs + +1. Make your changes, test them, and open a PR to either the `release-*` or `dev-*` branch of a particular configuration. +2. Checks will run to note whether your changes break reproducibility with the current major version config tag on the target branch. For example, if you are opening a PR on the `release-1deg_jra55_iaf` branch, and the last tagged version on this branch is `release-1deg_jra55_iaf-1.2`, the checksums between the config in your PR and the checksum in the config tag are compared. +3. A comment will be posted on the PR when this is completed, notifying you whether the checksums match (meaning a minor bump to `*-1.3`), or are different (meaning a major bump to `*-3.0`). +4. Optionally, you can now modify your PR and get more reproducibility checks. +5. Finally, bump the version using the `!bump [major|minor]` command depending on the result of the reproducibility check. Additionally, if the checksums are different, the updated checksum will be automatically committed to the PR. This is a requirement before the PR will be mergable. + +### Changes to the CI Infrastructure + +Changes to the CI Infrastructure are made to the `main` branch in this repository. Since the logic in the CI infrastructure is quite involved, it would be a good idea to read the [README-DEV.md](./README-DEV.md). diff --git a/README-DEV.md b/README-DEV.md new file mode 100644 index 00000000..a4d9d1cc --- /dev/null +++ b/README-DEV.md @@ -0,0 +1,109 @@ +# README for Developers + +## CI Infrastructure + +### Overview + +The overall goal for this CI is to compare checksums generated by the `ACCESS-OM2` model using a particular config branch/tag against a 'ground truth' checksum. + +The Reproducibility CI is comprised of two main triggers: on Pull Request and Scheduled Checks. Both make use of reusable workflows and custom actions in the [ACCESS-NRI/reproducibility](https://github.com/ACCESS-NRI/reproducibility) repository. + +### Triggered On Pull Request + +This pipeline uses the `pr-1-ci.yml` workflow for the majority of the PR lifecycle. + +It also uses `pr-2-confirm.yml`, and `pr-3-bump-tag.yml` to control supplementary actions like bumping the `.version` field in the `metadata.yaml` file correctly and committing the checksums, and updating the config tag on merge. + +The overall pipeline looks like this: + +PR: `pr-1-ci.yml` -> `pr-2-confirm.yml`, then +Merge: `pr-3-bump-tag.yml` + +#### The PR CI Lifecycle: `pr-1-ci.yml` + +This file does the bulk of the handling of the PR. + +##### `commit-check` + +The first job, `commit-check`, is used to short-circuit execution of this workflow in the case where the latest commit was authored by `github-actions`, so there isn't a recursive cycle of checking and adding to the PR. + +`github-actions` authors commit to the `testing` directory and `metadata.yaml` files in the PR. + +##### `repro-ci` + +This job uses a reusable workflow that runs a given model on Gadi using a particular config tag (in this case, it'll be the source PR branch), and uploads the checksum as an artifact named `-`, for example, `access-om2-release-config-fix`. + +Note that the `environment-name` refers to the [GitHub Actions Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment) that is defined in _this repository_, not the repository that houses the reusable workflow. + +##### `check-repro` + +This job compares the checksum in the given `-` artifact against the checksum in the 'ground truth' config tag, which is often the most recent config tag in the PR target branch. + +In the case where the checksums do not match, the CI pushes a commit to the PR with the updated checksum, and prevents merging until there is an appropriate version bump in the `metadata.yaml`. See the [section on the `pr-2-confirm.yml` workflow](#confirming-changes-pr-2-confirmyml). + +##### `result` + +In this final stage, we add a comment to the Pull Request advising the creator of the result of the Repro check, as well as informing them of any actions that they need to take before the PR can be merged - most likely a required bump to the version in the `metadata.yaml` file, as is explained below. + +#### Confirming Changes: `pr-2-confirm.yml` + +The `.version` field in the `metadata.yaml` file is used to source the new config tag when the PR is eventually merged. + +This workflow is triggered on the creation of a comment on the pull request, where the comment matches `!bump [major|minor]`. Overall, it bumps the `.version` field in the `metadata.yaml` file to the version that will be tagged on the merge commit, and pushes the updated checksums and `metadata.yaml` file. Its jobs are explained below. + +##### `bump-version` + +This job checks out the PR, gets the version inside the `metadata.yaml` file, and determines the appropriate bumped version, depending on the command in the PR: + +- `!bump major`: changes the version from `X.Y` ->`(X+1).0`. For example, `11.2` -> `12.0`. +- `!bump minor`: changes the version from `X.Y` -> `X.(Y+1)`. For example, `11.2` -> `11.3`. + +##### `commit` + +This job updates and commits the bumped `metadata.yaml` file, as well as modified checksums. These are then pushed onto the PR and the creator is notified that the version was successfully bumped. The PR is now mergable, unless... + +##### `failure-notifier` + +If there is an issue with the commit process, or the bumping of the `metadata.yaml` file, the creator will be notified on the PR. + +#### The Last Step: `pr-3-bump-tag.yml` + +This workflow runs once the PR has been merged, taking the updated version in the `metadata.yaml` file, and tagging the merge commit with this version. + +### Triggered as a Scheduled Check + +This pipeline uses the `schedule-1-ci.yml` and `schedule-2-start.yml` workflows. + +The overall pipeline, which makes use of matrices, looks like this: + +```txt +schedule-1-ci ---- schedule-2-start [release-1deg_jra55_iaf-1.1] + |-- schedule-2-start [release-1deg_jra55_iaf-2.0] + `- schedule-2-start [] +``` + +#### Matrix Creation: `schedule-1-ci.yml` + +This workflow is responsible for getting all the config tags that require monthly checks (defined in `config/released-configs.json`) and spawning a matrix job for each of those. + +As an aside, the reason that we call the reusable workflow `schedule-2-start.yml` with a matrix strategy is that matrix strategies only work at the `job` level. So, if you need a matrix to work across multiple jobs (for example, one job does a task with a particular matrix value, and one reports the result of that task), you need a job that calls a reusable workflow, which in turn contains multiple jobs. + +#### Config Tag Specific Checks: `schedule-2-start.yml` + +##### `repro-ci` + +Exactly the same as the [`pr-1-ci.yml` counterpart](#repro-ci) - run the config associated with the given config tag and upload the checksum. + +##### `check-repro` + +Similar to the [`pr-1-ci.yml` counterpart](#check-repro), this job checks the recently generated checksum against the existing config tag - essentially a self-test. + +##### `failed-repro` + +If the reproduction check fails during a scheduled check, something is wrong. This job creates an issue in this repository, and tags the Release team for investigation. + +### Supplementary Workflows + +#### Config Validation: `validate-json.yml` + +This workflow is used to check that modifications to `*.json` files are in line with the associated `*.schema.json`. diff --git a/README.md b/README.md index 18028628..ef92e4de 100644 --- a/README.md +++ b/README.md @@ -3,25 +3,27 @@ ## About -This repo contains standard global configurations for +This repo contains standard global configurations for [ACCESS-OM2](https://github.com/ACCESS-NRI/ACCESS-OM2), the ACCESS Ocean-Sea Ice model. All confgurations were developed by [COSIMA](https://cosima.org) and adapted by ACCESS-NRI. -This is an "omnibus repository": it contains multiple related configurations, and each -configuration is stored in a separate branch. +This is an "omnibus repository": it contains multiple related configurations, and each +configuration is stored in a separate branch. Branches utilise a naming scheme of specifiers separated by underscores (`_`): -``` + +```txt {resolution}_{atmosforcing}_{forcingmode}[_{option}] ``` -Where `resolution` is a representative "nominal resolution" because resolution typically -varies across a global domain; `atmosforcing` is the atmospheric forcing product being -used; `forcingmode` is how the forcing is applied over time; and `option` is additional -options that are necessary to uniquely identify a configuration. +Where `resolution` is a representative "nominal resolution" because resolution typically +varies across a global domain; `atmosforcing` is the atmospheric forcing product being +used; `forcingmode` is how the forcing is applied over time; and `option` is additional +options that are necessary to uniquely identify a configuration. Some examples of possible values of the specifiers: + - **`resolution`**: `1deg` (1°), `025deg` (0.25°), `01deg` (0.1°), `005deg` (0.05°) - **`atmosforcing`**: `jra55`, `era5` - **`forcingmode`**: `iaf` (interannual forcing), `ryf` (repeat year forcing), `rdf` (repeat decadal forcing) @@ -29,16 +31,14 @@ Some examples of possible values of the specifiers: ## Supported configurations -All available configurations are browsable under the list of branches - -https://github.com/ACCESS-NRI/accessom2-configs/branches +All available configurations are browsable under [the list of branches](https://github.com/ACCESS-NRI/accessom2-configs/branches). and should also be listed below: | Branch | Configuration Description | ----|---| -[`1deg_jra55_ryf`](https://github.com/ACCESS-NRI/access-om2-configs/tree/1deg_jra55_ryf) | Global 1° model forced with JRA55-do atmospheric reanalysis in repeat-year forcing mode| -[`1deg_jra55_iaf`](https://github.com/ACCESS-NRI/access-om2-configs/tree/1deg_jra55_iaf)| Global 1° model forced with JRA55-do atmospheric reanalysis in interannual forcing mode| +| ------ | ------------------------- | +| [`release-1deg_jra55_ryf`](https://github.com/ACCESS-NRI/access-om2-configs/tree/release-1deg_jra55_ryf) | Global 1° model forced with JRA55-do atmospheric reanalysis in repeat-year forcing mode| +| [`release-1deg_jra55_iaf`](https://github.com/ACCESS-NRI/access-om2-configs/tree/release-1deg_jra55_iaf)| Global 1° model forced with JRA55-do atmospheric reanalysis in interannual forcing mode| There are more detailed notes contained in the respective branches for each configuration. @@ -46,23 +46,63 @@ More supported configurations will be added over time. ## How to use this repository to run a model -All configurations use [payu](https://github.com/payu-org/payu) to run the model. +All configurations use [payu](https://github.com/payu-org/payu) to run the model. -This repository contains many related experimental configurations to make support -and discovery easier. As a user it does not necessarily make sense to clone all the +This repository contains many related experimental configurations to make support +and discovery easier. As a user it does not necessarily make sense to clone all the configurations at once. -In most cases only a single experiment is required. If that is the case choose which experiment and then run -``` +In most cases only a single experiment is required. If that is the case choose which experiment and then run + +```sh git clone -b https://github.com/ACCESS-NRI/accessom2-configs/ ``` -and replace `` with the branch name of the experiment you wish to run. + +and replace `` with the branch name or tag of the experiment you wish to run. [ACCESS-Hive](https://access-hive.org.au/) contains [detailed instructions for how to configure and run ACCESS-OM2 with `payu`](https://access-hive.org.au/models/run-a-model/run-access-om/). +## CI and Reproducibility Checks + +This repository makes use of GitHub Actions to perform reproducibility checks on `ACCESS-OM2` config branches. + +### Config Branches + +Config branches are branches that store model configurations of the form: `release-` or `dev-`, for example: `release-1deg_jra55_iaf`. + +### Config Tags + +Config tags are specific tags on config branches, whose `MAJOR.MINOR` version compares the reproducibility of the configurations. Major version changes denote that a particular config tag breaks reproducibility with tags before it, and a minor version change does not. These have the form: `release--`, such as `release-1deg_jra55_iaf-1.2`. + +So for example, say we have the following config tags: + +- `release-1deg_jra55_iaf-1.0` +- `release-1deg_jra55_iaf-1.1` +- `release-1deg_jra55_iaf-2.0` +- `release-1deg_jra55_iaf-3.0` + +This means that `*-1.0` and `*-1.1` are configurations for that particular experiment type that are reproducible with each other, but not any others (namely, `*-2.0` or `*-3.0`). + +`*-2.0` is not reproducible with `*-1.0`, `*.1.1` or `*-3.0` configurations. + +Similarly, `*-3.0` is not reproducible with `*-1.0`, `*-1.1` or `*-2.0`. + +### Checks + +These checks are in the context of: + +- PR checks: In which a PR creator can modify a config branch, create a pull request, and have their config run and checked for reproducibility against a 'ground truth' version of the config. +- Scheduled checks: In which config branches and config tags that are deemed especially important are self-tested monthly against their own checksums. + +More information on submitting a Pull Request and on the specifics of this pipeline can be found in the [CONTRIBUTING.md](./.github/CONTRIBUTING.md) and [README-DEV.md](./README-DEV.md) respectively. + +For more information on the manually running the pytests that are run as part of the reproducibility CI checks, see +[test/README.md](./test/README.md). + ## Conditions of use COSIMA request that users of this or other ACCESS-OM2 model code: + 1. consider citing Kiss et al. (2020) ([http://doi.org/10.5194/gmd-13-401-2020](http://doi.org/10.5194/gmd-13-401-2020)) 2. include an acknowledgement such as the following: *The authors thank the Consortium for Ocean-Sea Ice Modelling in Australia (COSIMA; [http://www.cosima.org.au](http://www.cosima.org.au)) for making the ACCESS-OM2 suite of models available at [https://github.com/COSIMA/access-om2](https://github.com/COSIMA/access-om2).* diff --git a/config/released-configs.json b/config/released-configs.json new file mode 100644 index 00000000..b819778a --- /dev/null +++ b/config/released-configs.json @@ -0,0 +1,6 @@ +{ + "$schema": "./released-configs.schema.json", + "tags": [ + "release-1deg_jra55_ryf-1.0.0" + ] +} \ No newline at end of file diff --git a/config/released-configs.schema.json b/config/released-configs.schema.json new file mode 100644 index 00000000..528b0d25 --- /dev/null +++ b/config/released-configs.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Deployment Environments", + "description": "A list of deployment targets that are supported", + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["tags"], + "additionalProperties": false +} \ No newline at end of file diff --git a/test/README.md b/test/README.md new file mode 100644 index 00000000..a06ecae4 --- /dev/null +++ b/test/README.md @@ -0,0 +1,56 @@ +## Reproducibility Pytests + +These pytests are used for reproducibility CI checks in the [ACCESS-NRI/reproducibility](https://github.com/ACCESS-NRI/reproducibility) repository. Code from these tests is adapted from COSIMAS's ACCESS-OM2's [ +bit reproducibility tests](https://github.com/COSIMA/access-om2/blob/master/test/test_bit_reproducibility.py). + +### How to run tests manually + +1. First clone the pytest code which is on the `main` branch of `access-om2-configs` repository into a separate directory. +```sh +git clone https://github.com/ACCESS-NRI/access-om2-configs/ test-code +``` + +2. Checkout an experiment +```sh +git clone https://github.com/ACCESS-NRI/accessom2-configs/ +cd +git checkout +``` + +3. Setup payu +```sh +module use /g/data/vk83/modules +module load payu/1.1 +``` + +4. Run the pytests +```sh +pytest /test +``` + +### Pytest Options + +The output directory for pytests defaults to `/scratch/$PROJECT/$USER/test-model-repro` and contains the following sub-directories: +- `control` - contains copies of the model configuration used for each experiment run in the tests. +- `lab` - contains `payu` model output directories containing `work` and `archive` sub-directories. + +This output directory also contains files generated by pytests, including the `CHECKSUM` file which is used as part of reproducibility CI workflows. + +To specify a different folder for pytest outputs, use `--output-path` command flag, for example: + +```sh +pytest /test --output-path /some/other/path/for/output +``` + +By default, the control directory, e.g. the model configuration to test, is the current working directory. This can be set similarly to above by using the +`--control-path` command flag. + +The path containing the checksum file to check against can also be set using +`--checksum-path` command flag. The default is the `testing/checksum/CHECKSUM` +file which is stored in the control directory. + +To run only CI reproducibility checksum tests, use `-m checksum`, e.g. + +```sh +pytest /test -m checksum +``` diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000..58d163de --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,65 @@ +import os +import pytest +from pathlib import Path + + +@pytest.fixture(scope="session") +def output_path(request): + """Set the output path: This contains control and lab directories for each + test and test output files - e.g. CHECKSUMS + """ + path = request.config.getoption('--output-path') + if path is None: + # Set default to /scratch/PROJECT/USER/test-model-repro/ + project = os.environ.get('PROJECT') + user = os.environ.get('USER') + path = f'/scratch/{project}/{user}/test-model-repro' + return Path(path) + + +@pytest.fixture(scope="session") +def control_path(request): + """Set the path of the model configuration directory to test""" + path = request.config.getoption('--control-path') + if path is None: + # Set default to current working directory + path = Path.cwd() + return Path(path) + + +@pytest.fixture(scope="session") +def checksum_path(request, control_path): + """Set the path of the model configuration directory to test""" + path = request.config.getoption('--checksum-path') + if path is None: + # Set default to checksum stored on model configuration + path = control_path / 'testing' / 'checksum' / 'historical-3hr-checksum.json' + return Path(path) + + +# Set up command line options and default for directory paths +def pytest_addoption(parser): + """Attaches optional command line arguments""" + parser.addoption("--output-path", + action="store", + help="Specify the output directory path for test output") + + parser.addoption("--control-path", + action="store", + help="Specify the model configuration path to test") + + parser.addoption("--checksum-path", + action="store", + help="Specify the checksum file to compare against") + + +def pytest_configure(config): + config.addinivalue_line( + "markers", "slow: mark tests as slow (deselect with '-m \"not slow\"')" + ) + config.addinivalue_line( + "markers", "checksum: mark tests to run as part of reproducibility CI tests" + ) + config.addinivalue_line( + "markers", "test: mark tests as testing test functionality" + ) diff --git a/test/exp_test_helper.py b/test/exp_test_helper.py new file mode 100644 index 00000000..83be5190 --- /dev/null +++ b/test/exp_test_helper.py @@ -0,0 +1,185 @@ +import subprocess as sp +import sys +import shutil +import re +import os +import sys +import glob +import yaml +from pathlib import Path + +from util import wait_for_qsub +from models import index as model_index + + +class ExpTestHelper(object): + + def __init__(self, control_path: Path, lab_path: Path): + + self.exp_name = control_path.name + self.control_path = control_path + self.lab_path = lab_path + self.config_path = control_path / 'config.yaml' + self.archive_path = lab_path / 'archive' / self.exp_name + self.work_path = lab_path / 'work' / self.exp_name + self.output000 = self.archive_path / 'output000' + self.output001 = self.archive_path / 'output001' + + with open(self.config_path) as f: + self.config = yaml.safe_load(f) + + self.set_model() + + def set_model(self): + """Set model based on payu config. Currently only setting top-level + model""" + self.model_name = self.config.get('model') + ModelType = model_index[self.model_name] + self.model = ModelType(self) + + def extract_checksums(self, + output_directory: Path = None, + schema_version: str = None): + """Use model subclass to extract checksums from output""" + return self.model.extract_checksums(output_directory, schema_version) + + def has_run(self): + """ + See whether this experiment has been run. + """ + return self.model.output_exists() + + def setup_for_test_run(self): + """ + Various config.yaml settings need to be modified in order to run in the + test environment. + """ + + with open(self.config_path) as f: + doc = yaml.safe_load(f) + + # Disable git runlog + doc['runlog'] = False + + # Disable metadata and set override experiment name for work/archive + # directories + doc['metadata'] = {"enable": False} + doc['experiment'] = self.exp_name + + # Set laboratory path + doc['laboratory'] = str(self.lab_path) + + with open(self.config_path, 'w') as f: + yaml.dump(doc, f) + + def run(self): + """ + Run the experiment using payu and check output. + + Don't do any work if it has already run. + """ + + if self.has_run(): + return 0, None, None, None + else: + return self.force_qsub_run() + + def force_qsub_run(self): + """ + Run using qsub + """ + + # Change to experiment directory and run. + owd = Path.cwd() + try: + os.chdir(self.control_path) + sp.check_output(['payu', 'sweep', '--lab', self.lab_path]) + run_id = sp.check_output(['payu', 'run', '--lab', self.lab_path]) + run_id = run_id.decode().splitlines()[0] + except sp.CalledProcessError as err: + print('Error: call to payu run failed.', file=sys.stderr) + return 1, None, None, None + finally: + os.chdir(owd) + + wait_for_qsub(run_id) + run_id = run_id.split('.')[0] + + output_files = [] + # Read qsub stdout file + stdout_filename = glob.glob(str(self.control_path / f'*.o{run_id}')) + print(stdout_filename) + if len(stdout_filename) != 1: + print('Error: there are too many stdout files.', file=sys.stderr) + return 2, None, None, None + + stdout_filename = stdout_filename[0] + output_files.append(stdout_filename) + stdout = '' + with open(stdout_filename, 'r') as f: + stdout = f.read() + + # Read qsub stderr file + stderr_filename = glob.glob(str(self.control_path / f'*.e{run_id}')) + stderr = '' + if len(stderr_filename) == 1: + stderr_filename = stderr_filename[0] + output_files.append(stderr_filename) + with open(stderr_filename, 'r') as f: + stderr = f.read() + + # TODO: Early return if not collating + + # Read the qsub id of the collate job from the stdout. + # Payu puts this here. + m = re.search(r'(\d+.gadi-pbs)\n', stdout) + if m is None: + print('Error: qsub id of collate job.', file=sys.stderr) + return 3, stdout, stderr, output_files + + # Wait for the collate to complete. + run_id = m.group(1) + wait_for_qsub(run_id) + + # Return files created by qsub so caller can read or delete. + collate_files = self.control_path / f'*.[oe]{run_id}' + output_files += glob.glob(str(collate_files)) + + return 0, stdout, stderr, output_files + + def setup_and_run(self): + self.setup_for_test_run() + return self.run() + + +def setup_exp(control_path: Path, output_path: Path, exp_name: str): + """ + Create a exp by copying over base config + """ + # Set experiment control path + if control_path.name != 'base-experiment': + exp_name = f'{control_path.name}-{exp_name}' + + exp_control_path = output_path / 'control' / exp_name + + # Copy over base control directory (e.g. model configuration) + if exp_control_path.exists(): + shutil.rmtree(exp_control_path) + shutil.copytree(control_path, exp_control_path, symlinks=True) + + exp_lab_path = output_path / 'lab' + + exp = ExpTestHelper(control_path=exp_control_path, + lab_path=exp_lab_path) + + # Remove any pre-existing archive or work directories for the experiment + try: + shutil.rmtree(exp.archive_path) + except FileNotFoundError: + pass + try: + shutil.rmtree(exp.work_path) + except FileNotFoundError: + pass + + return exp diff --git a/test/models/__init__.py b/test/models/__init__.py new file mode 100644 index 00000000..c282c8f4 --- /dev/null +++ b/test/models/__init__.py @@ -0,0 +1,5 @@ +from models.accessom2 import AccessOm2 + +index = { + 'access-om2': AccessOm2 +} diff --git a/test/models/accessom2.py b/test/models/accessom2.py new file mode 100644 index 00000000..61e24dd3 --- /dev/null +++ b/test/models/accessom2.py @@ -0,0 +1,91 @@ +"""Specific Access-OM2 Model setup and post-processing""" + +# NOTE for developers: `f90nml` is imported implicitly when this code is running in +# the `Payu` conda environment. +from collections import defaultdict +import f90nml +import re +from pathlib import Path + +from models.model import Model + +BASE_SCHEMA_URL = "https://raw.githubusercontent.com/ACCESS-NRI/schema/main/au.org.access-nri/model/access-om2/experiment/reproducibility/checksums" + +SCHEMA_VERSION_1_0_0 = "1-0-0" +DEFAULT_SCHEMA_VERSION = SCHEMA_VERSION_1_0_0 +SUPPORTED_SCHEMA_VERSIONS = [SCHEMA_VERSION_1_0_0] + +class AccessOm2(Model): + def __init__(self, experiment): + super(AccessOm2, self).__init__(experiment) + self.output_file = self.experiment.output000 / 'access-om2.out' + + self.accessom2_config = experiment.control_path / 'accessom2.nml' + self.ocean_config = experiment.control_path / 'ocean' / 'input.nml' + self.default_schema_version = DEFAULT_SCHEMA_VERSION + + def set_model_runtime(self, + years: int = 0, + months: int = 0, + seconds: int = 10800): + """Set config files to a short time period for experiment run. + Default is 3 hours""" + with open(self.accessom2_config) as f: + nml = f90nml.read(f) + + nml['date_manager_nml']['restart_period'] = [years, months, seconds] + nml.write(self.accessom2_config, force=True) + + def output_exists(self): + """Check for existing output file""" + return self.output_file.exists() + + def extract_checksums(self, + output_directory: Path = None, + schema_version: str = None): + """Parse output file and create checksum using defined schema""" + if output_directory: + output_filename = output_directory / 'access-om2.out' + else: + output_filename = self.output_file + + # Regex pattern for checksums in the `.out` file + # Examples: + # [chksum] ht -2390360641069121536 + # [chksum] hu 6389284661071183872 + # [chksum] htr 928360042410663049 + pattern = r'\[chksum\]\s+(.+)\s+(-?\d+)' + + # checksums outputted in form: + # { + # "ht": ["-2390360641069121536"], + # "hu": ["6389284661071183872"], + # "htr": ["928360042410663049"] + # } + # with potential for multiple checksums for one key. + output_checksums: dict[str, list[any]] = defaultdict(list) + + with open(output_filename) as f: + for line in f: + # Check for checksum pattern match + match = re.match(pattern, line) + if match: + # Extract values + field = match.group(1).strip() + checksum = match.group(2).strip() + + output_checksums[field].append(checksum) + + if schema_version is None: + schema_version = DEFAULT_SCHEMA_VERSION + + if schema_version == SCHEMA_VERSION_1_0_0: + checksums = { + "schema_version": schema_version, + "output": dict(output_checksums) + } + else: + raise NotImplementedError( + f"Unsupported checksum schema version: {schema_version}") + + return checksums diff --git a/test/models/model.py b/test/models/model.py new file mode 100644 index 00000000..2139cb77 --- /dev/null +++ b/test/models/model.py @@ -0,0 +1,22 @@ +"""Generic Model class""" +from pathlib import Path + + +class Model(object): + def __init__(self, experiment): + self.experiment = experiment + + def extract_checksums(self, output_directory: Path = None): + """Extract checksums from output directory""" + raise NotImplementedError + + def set_model_runtime(self, + years: int = 0, + months: int = 0, + seconds: int = 10800): + """Configure model runtime""" + raise NotImplementedError + + def output_exists(self): + """Check for existing output files""" + raise NotImplementedError diff --git a/test/requirements.txt b/test/requirements.txt new file mode 100644 index 00000000..967a4754 --- /dev/null +++ b/test/requirements.txt @@ -0,0 +1,2 @@ +pytest==8.0.1 +jsonschema==4.21.1 diff --git a/test/test/resources/access-om2-checksums-1-0-0.json b/test/test/resources/access-om2-checksums-1-0-0.json new file mode 100644 index 00000000..4b75f687 --- /dev/null +++ b/test/test/resources/access-om2-checksums-1-0-0.json @@ -0,0 +1,360 @@ +{ + "schema_version": "1-0-0", + "output": { + "xt": [ + "5227222155343350591" + ], + "xu": [ + "5223776204015802370" + ], + "yt": [ + "3524025294143080071" + ], + "yu": [ + "3533356873625590408" + ], + "dxt": [ + "-3859942835758725761" + ], + "dxu": [ + "-3858814366858890342" + ], + "dyt": [ + "-4245365089591661262" + ], + "dyu": [ + "-4232496668783427450" + ], + "dat": [ + "-7061889515055535283" + ], + "dau": [ + "-7044880903546758732" + ], + "dxtn": [ + "-3858725764265149739" + ], + "dytn": [ + "-4245884269268605071" + ], + "dxte": [ + "-3860029997118692252" + ], + "dyte": [ + "-4231975470790906385" + ], + "dxun": [ + "-3857620260571262423" + ], + "dyun": [ + "-4230552185666092470" + ], + "dxue": [ + "-3858896327844488328" + ], + "dyue": [ + "-4224360586904360567" + ], + "dtn+dts": [ + "-4245365089591661262" + ], + "dun+dus": [ + "-4232496668783427450" + ], + "dte+dtw": [ + "-3859942835758725761" + ], + "due+duw": [ + "-3858814366858890342" + ], + "dte": [ + "-4832765571991274682" + ], + "dtw": [ + "-4832675138550231117" + ], + "due": [ + "-4831634525894608354" + ], + "duw": [ + "-4831549246847226606" + ], + "sin_rot": [ + "-5025817628090435319" + ], + "cos_rot": [ + "-1010217553039298448" + ], + "ht": [ + "-2390360641069121536" + ], + "hu": [ + "6389284661071183872" + ], + "htr": [ + "928360042410663049" + ], + "kmu": [ + "5491" + ], + "kmt": [ + "5888" + ], + "Zonal velocity": [ + "9051849634365276068", + "8922740144762992812" + ], + "Meridional velocity": [ + "9051849634365276068", + "6810759182811944486" + ], + "Advection of u": [ + "0", + "-5761337654722229343" + ], + "Advection of v": [ + "0", + "-1518588548831679925" + ], + "rho(taup1)": [ + "-7748370226989976718", + "-7836300473769660453" + ], + "pressure_at_depth": [ + "-8571165105956384768", + "3766338433422967267" + ], + "denominator_r": [ + "1503206819559825144", + "1699359254996115987" + ], + "drhodT": [ + "0", + "3686596329662716908" + ], + "drhodS": [ + "0", + "-7165071628708799152" + ], + "drhodz_zt": [ + "6262314188798781904", + "-3707801510282936917" + ], + "temp": [ + "7545926072668392930" + ], + "salt": [ + "-6460318925134188788" + ], + "age_global": [ + "-2264750745304107183" + ], + "pot_temp": [ + "-1231025579416513895" + ], + "frazil": [ + "2886833225635905730" + ], + "ending agm_array": [ + "136505912869249989" + ], + "ending aredi_array": [ + "-5841239085443710976" + ], + "ending rossby_radius": [ + "1018344707395653218" + ], + "ending rossby_radius_raw": [ + "-1967313038743695259" + ], + "ending bczone_radius": [ + "0" + ], + "ending bih_viscosity": [ + "-8366038681792779727" + ], + "ending lap_viscosity": [ + "4282876009757965617" + ], + "thickness_sigma": [ + "-8922971025493857343" + ], + "eta_t": [ + "-7643303129117768563" + ], + "eta_u": [ + "4335153674007343634" + ], + "deta_dt": [ + "-4731158623285319520" + ], + "eta_t_bar": [ + "-2539382737297032752" + ], + "pbot_t": [ + "-5089330828196492646" + ], + "pbot_u": [ + "8536052501137027772" + ], + "dpbot_dt": [ + "0" + ], + "anompb": [ + "-7968761713393458496" + ], + "anompb_bar": [ + "0" + ], + "patm_t": [ + "0" + ], + "dpatm_dt": [ + "0" + ], + "ps": [ + "-6273952104955748667" + ], + "grad_ps_1": [ + "-3829201769181609948" + ], + "grad_ps_2": [ + "-3586998115853265377" + ], + "grad_anompb_1": [ + "0" + ], + "grad_anompb_2": [ + "0" + ], + "udrho": [ + "-2669908285424828097" + ], + "vdrho": [ + "3622748990756279145" + ], + "conv_rho_ud_t": [ + "-2981374551194158997" + ], + "source": [ + "449088406912069258" + ], + "eta smoother": [ + "449088406912069258" + ], + "pbot smoother": [ + "0" + ], + "eta_nonbouss": [ + "8720620272377679830" + ], + "forcing_u_bt": [ + "-6365243820425754853" + ], + "forcing_v_bt": [ + "5332587263235255684" + ], + "Thickness%rho_dzt(taup1)": [ + "8938551651288402083" + ], + "Thickness%rho_dzu(taup1)": [ + "9097856201495518223" + ], + "Thickness%mass_u(taup1)": [ + "-4119591982426715508" + ], + "Thickness%rho_dzten(1)": [ + "3245828328916392269" + ], + "Thickness%rho_dzten(2)": [ + "-5732678299602144116" + ], + "Thickness%rho_dztr": [ + "5185722031152095224" + ], + "Thickness%rho_dzur": [ + "5511880979934500710" + ], + "Thickness%rho_dzt_tendency": [ + "7696702313963327787" + ], + "Thickness%dzt": [ + "2592653947508724691" + ], + "Thickness%dzten(1)": [ + "-2940272069865901925" + ], + "Thickness%dzten(2)": [ + "6504170165872752137" + ], + "Thickness%dztlo": [ + "732700519349319924" + ], + "Thickness%dztup": [ + "732634083460098581" + ], + "Thickness%dzt_dst": [ + "2087681027450509173" + ], + "Thickness%dzwt(k=0)": [ + "-3827093499830983540" + ], + "Thickness%dzwt(k=1:nk)": [ + "2024101905758120881" + ], + "Thickness%dzu": [ + "-6605743456808752599" + ], + "Thickness%dzwu(k=0)": [ + "6504633577267880026" + ], + "Thickness%dzwu(k=1:nk)": [ + "6198994589541357456" + ], + "Thickness%depth_zt": [ + "-769930805780118318" + ], + "Thickness%geodepth_zt": [ + "5239684065229990142" + ], + "Thickness%depth_zu": [ + "-2586740127944684224" + ], + "Thickness%depth_zwt": [ + "1482420673528295096" + ], + "Thickness%depth_zwu": [ + "-2312823509789010079" + ], + "Thickness%depth_st": [ + "-436572698594795605" + ], + "Thickness%depth_swt": [ + "1807210613030518784" + ], + "Thickness%dst": [ + "2929478174762860544" + ], + "Thickness%dstlo": [ + "1069524742763059344" + ], + "Thickness%dstup": [ + "1069458314554632048" + ], + "Thickness%dswt(k=0)": [ + "-3816777125227134976" + ], + "Thickness%dswt(k=1:nk)": [ + "2356975803744414556" + ], + "Thickness%pbot0": [ + "-5076855368579519850" + ], + "Thickness%mass_en(1)": [ + "941724057156411220" + ], + "Thickness%mass_en(2)": [ + "1400420897894443932" + ] + } +} \ No newline at end of file diff --git a/test/test/resources/access-om2.out b/test/test/resources/access-om2.out new file mode 100644 index 00000000..bb626469 --- /dev/null +++ b/test/test/resources/access-om2.out @@ -0,0 +1,3547 @@ + YATM_VERSION=2.0.202212 + matmxx: LIBACCESSOM2_VERSION=2.0.202212 +NOTE from PE 0: MPP_DOMAINS_SET_STACK_SIZE: stack size set to 32768. + &MPP_IO_NML + HEADER_BUFFER_VAL = 16384, + GLOBAL_FIELD_ON_ROOT_PE = T, + IO_CLOCKS_ON = F, + SHUFFLE = 1, + DEFLATE_LEVEL = -1, + CF_COMPLIANCE = F + / +NOTE from PE 0: MPP_IO_SET_STACK_SIZE: stack size set to 131072. +NOTE from PE 0: MPP_DOMAINS_SET_STACK_SIZE: stack size set to 115200. + + + + ======== MODEL BEING DRIVEN BY OCEAN_SOLO_MOD ======== + + &OCEAN_SOLO_NML + N_MASK = 0, + LAYOUT_MASK = 2*0, + MASK_LIST = 4096*0, + RESTART_INTERVAL = 6*0, + DEBUG_THIS_MODULE = F, + ACCESSOM2_CONFIG_DIR = ../ + + + + + + + + / + mom5xx: LIBACCESSOM2_VERSION=2.0.202212 +NOTE from PE 0: diag_manager_mod::diag_manager_init: prepend_date only supported when diag_manager_init is called with time_init present. + + + &OCEAN_PARAMETERS_NML + CP_OCEAN = 3992.10322329649 , + CP_LIQUID_RUNOFF = 4218.00000000000 , + CP_SOLID_RUNOFF = 2106.00000000000 , + RHO0 = 1035.00000000000 , + TFREEZE = 273.150000000000 , + OMEGA_EARTH = 7.292100000000000E-005, + GRAV = 9.80000000000000 + / + + ======== STARTING MOM INITIALIZATION ======== + + + ==>NOTE: Using dynamically allocated array option in MOM + + + &OCEAN_MODEL_NML + TIME_TENDENCY = twolevel , + IMPOSE_INIT_FROM_RESTART = F, + REINITIALIZE_THICKNESS = F, + BAROCLINIC_SPLIT = 1, + BAROTROPIC_SPLIT = 80, + SURFACE_HEIGHT_SPLIT = 1, + LAYOUT = 16, 15, + IO_LAYOUT = 4, 3, + DEBUG = F, + VERTICAL_COORDINATE = zstar , + DT_OCEAN = -1, + CMIP_UNITS = T, + CMIP_VERSION = 5, + HORIZONTAL_GRID = bgrid , + USE_BLOBS = F, + USE_VELOCITY_OVERRIDE = F, + MASK_TABLE = INPUT/ocean_mask_table , + INTRODUCE_BLOBS = F, + BETA_TXTY = 0.000000000000000E+000, + BETA_TF = 0.000000000000000E+000, + BETA_QF = 0.000000000000000E+000, + BETA_LWSW = 0.000000000000000E+000, + DO_WAVE = F + / + + ==>Note: Running MOM using 216 computer processors. + + + ==>Note: Running MOM with staggered twotime level scheme to compute time tenden + cies. + This is the default. Mass/volume and tracer are conserved with this sc + heme. + + + ==>Note: Time%Time_init = time stamp at very start of the MOM experiment is given by +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 0: 0: 0 + + ==>Note: Time%model_time = time stamp at start of this leg of the MOM experiment is +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 0: 0: 0 + + ==>Note: Time%init=.true. =>MOM will start from user specified initial conditions. + + ==> Note: time steps (seconds) used for MOM + dtts (tracer) = 5400.00 + dtuv (baroclinic) = 5400.00 + dteta (surface height or bottom pressure) = 5400.00 + dtbt (barotropic) = 67.50 + + ==> Note: The velocity equations will be split into baroclinic and barotropic pieces. + + + ==> Note: Using MOM with B-grid horizontal layout of variables on a grid. + + ==> Note: Using MOM with zstar vertical coordinate. + + The equations are Boussinesq, and so conserve volume rather than mass. + Use one of the pressure-like coordinates to get non-Boussinesq effects. + + + + &OCEAN_GRIDS_NML + DEBUG_THIS_MODULE = F, + VERBOSE_INIT = T, + READ_RHO0_PROFILE = F, + DO_BITWISE_EXACT_SUM = F, + WRITE_GRID = F + / + ==>Note from ocean_grids_mod(set_ocean_grid_size): read grid from mosaic versio + n grid +NOTE from PE 0: ==>Note from ocean_grids_mod(set_ocean_grid_size): x_boundary_type is cyclic +NOTE from PE 0: ==>Note from ocean_grids_mod(set_ocean_grid_size): y_boundary_type is fold_north_edge + + ==> Note: Energy conversion errors are nontrivial when using tripolar=.true. + The cause is related to the need to update redundantly computed information + across the Arctic bipolar fold in a bit-wise exact manner for terms contributing + to the energy conversion analysis. The extra code and mpp calls have not been + implemented. + + + &OCEAN_DOMAINS_NML + HALO = 1, + MAX_TRACERS = 5, + X_CYCLIC_OFFSET = 0, + Y_CYCLIC_OFFSET = 0 + / +==> NOTE from ocean_model_init: reading maskmap information from INPUT/ocean_mask_table + parse_mask_table: Number of domain regions masked in ocean model = 24 + mom_domain domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +NOTE from PE 0: MPP_DOMAINS_SET_STACK_SIZE: stack size set to 275000. + Reading setup_nml + Reading grid_nml + Reading tracer_nml + Reading thermo_nml + Reading dynamics_nml + Reading shortwave_nml + Reading ponds_nml + Reading forcing_nml + Diagnostic output will be in file + ice_diag.d + + ocean_super_grid domain decomposition +whalo = 2, ehalo = 2, shalo = 2, nhalo = 2 + X-AXIS = 46 46 46 46 44 44 44 44 44 44 44 44 46 46 46 46 + Y-AXIS = 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 + Reading zbgc_nml +NOTE from PE 0: ==>Note from ocean_grids_mod (set_ocean_hgrid_arrays): altering U-grid arrays at j=0 +[chksum] xt 5227222155343350591 +[chksum] xu 5223776204015802370 +[chksum] yt 3524025294143080071 +[chksum] yu 3533356873625590408 +[chksum] dxt -3859942835758725761 +[chksum] dxu -3858814366858890342 +[chksum] dyt -4245365089591661262 +[chksum] dyu -4232496668783427450 +[chksum] dat -7061889515055535283 +[chksum] dau -7044880903546758732 +[chksum] dxtn -3858725764265149739 +[chksum] dytn -4245884269268605071 +[chksum] dxte -3860029997118692252 +[chksum] dyte -4231975470790906385 +[chksum] dxun -3857620260571262423 +[chksum] dyun -4230552185666092470 +[chksum] dxue -3858896327844488328 +[chksum] dyue -4224360586904360567 +[chksum] dtn+dts -4245365089591661262 +[chksum] dun+dus -4232496668783427450 +[chksum] dte+dtw -3859942835758725761 +[chksum] due+duw -3858814366858890342 +[chksum] dte -4832765571991274682 +[chksum] dtw -4832675138550231117 +[chksum] due -4831634525894608354 +[chksum] duw -4831549246847226606 +[chksum] sin_rot -5025817628090435319 +[chksum] cos_rot -1010217553039298448 + + + &OCEAN_TOPOG_NML + FLAT_BOTTOM = F, + FLAT_BOTTOM_KMT = 50, + FLAT_BOTTOM_HT = 5500.00000000000 , + WRITE_TOPOG = F, + MIN_THICKNESS = 1.000000000000000E-003, + KMT_RECOMPUTE = F, + KMT_RECOMPUTE_OFFSET = 0, + DEBUG_THIS_MODULE = T + / + Topography checksums + + The shallowest wet ocean model grid cell has depth (meters) 11.80575 + and this occurs at (i,j,k) = (133, 8, 4) + which has (long,lat,depth) = ( -147.5000, -76.1063, 11.80575) + + Beware that shallow regions (e.g., those shallower than 50m) may be subject + to numerical problems if strong surface forcing is not mixed vertically. + Such problems may occur especially in shallow regions with kmt==2. + Current speeds and/or tracer deviations may become large due to the deposition + of wind and/or buoyancy over just a small upper ocean region. Such problems + can be resolved by adding sufficient vertical mixing in these regions. + Such happens in Nature due to tides and breaking surface waves. +[chksum] ht -2390360641069121536 +[chksum] hu 6389284661071183872 +[chksum] htr 928360042410663049 +[chksum] kmu 5491 +[chksum] kmt 5888 + + + + &OCEAN_OBC_NML + NOBC = 0, + DIRECTION = , + NAME = test_obc none none none , + IS = 4*-999, + IE = 4*-999, + JS = 4*-999, + JE = 4*-999, + IERS = 4*-999, + IERE = 4*-999, + JERS = 4*-999, + JERE = 4*-999, + ITRS = 4*-999, + ITRE = 4*-999, + JTRS = 4*-999, + JTRE = 4*-999, + OBC_NOR = NOGRAD NOGRAD NOGRAD NOGRAD , + OBC_TAN = NOGRAD NOGRAD NOGRAD NOGRAD , + OBC_ETA = NOTHIN NOTHIN NOTHIN NOTHIN , + OBC_UD = NOGRAD NOGRAD NOGRAD NOGRAD , + OBC_TRA = NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD NO + GRAD NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD NOGRAD + NOGRAD NOGRAD NOGRAD NOGRAD , + OBC_MIX = NOGRAD NOGRAD NOGRAD NOGRAD , + REL_COEF_ETA_IN = 4*0.000000000000000E+000 , + REL_COEF_ETA_OUT = 4*0.000000000000000E+000 , + REL_ETA_PNTS = 4*1, + REL_CLIN_PNTS = 40*1, + CTROP_MAX = 4*1.50000000000000 , + CTROP_MIN = 4*0.100000000000000 , + CTROP_INC = 4*0.000000000000000E+000 , + CTROP_SMOOTH = 4*0.700000000000000 , + FILENAME_ETA = obc_eta_t.nc none none + none , + FIELDNAME_ETA = eta_t none none none , + FILENAME_UD = obc_ud.nc none none + none , + FIELDNAME_UD = ud none none none , + OBC_CONSIDER_CONVU = 4*F, + OBC_ADJUST_FORCING_BT = 4*F, + OBC_VERT_ADVEL_T = 4*F, + OBC_VERT_ADVEL_U = 4*F, + OBC_ENHANCE_VISC_BACK = NONE NONE NONE NONE , + OBC_ENHANCE_DIFF_BACK = NONE NONE NONE NONE , + ENH_PNTS = 4*1, + ENH_FAC_V = 4*0.900000000000000 , + ENH_FAC_D = 4*1.00000000000000 , + OBC_RELAX_TRACER = 40*F, + OBC_FLOW_RELAX = 40*1, + OBC_CONSIDER_SOURCES = 40*F, + OBC_TRACER_NO_INFLOW = 40*F, + REL_COEF_TRACER_IN = 40*0.000000000000000E+000 , + REL_COEF_TRACER_OUT = 40*0.000000000000000E+000 , + FILENAME_TRACER = INPUT/obc_tr.nc INPUT/obc_tr.nc INPUT/obc_tr.nc + INPUT/obc_tr.nc INPUT/obc_tr.nc + INPUT/obc_tr.nc INPUT/obc_tr.nc INPUT/obc_tr.nc + none none + none none none + none none none + none none + none none none + none none + none none none + none none + none none none + none none + none none none + none none + none none , + FIELDNAME_TRACER = temp_obc temp_obc temp_obc temp_obc salt_obc salt_obc salt_obc salt_obc none none none none none none none none none none none none + none none none none none none none none none none none none none none none none none none none none + , + DEBUG_PHASE_SPEED = F, + DEBUG_THIS_MODULE = F, + OBC_DAMP_NEWTON = 4*F, + DAMP_FACTOR = 4*1.00000000000000 + / + + Number of wet ocean tracer points = 2707869 + Number of wet ocean velocity points = 2572719 + Number of computed ocean tracer points = 5400000 + + Wet ocean volume with eta_t=0.0 (T-cells) = 1.31790647563173427E+18 m^3 (not bit reproducible) + Ocean surface area (T-cells) = 3.61576164485804500E+14 m^2 (not bit reproducible) + + Wet ocean volume with eta_u=0.0 (U-cells) = 1.22544990277975962E+18 m^3 (not bit reproducible) + Wet ocean surface area (U-cells) = 3.49063144058595875E+14 m^2 (not bit reproducible) + + Wet ocean + masked-out (land) surface area (T-cells) = 4.73557361748878625E+14 m^2 (not bit reproducible) + Wet ocean + masked-out (land) surface area (U-cells) = 4.72945709666937375E+14 m^2 (not bit reproducible) + + + + &OCEAN_TRACER_UTIL_NML + REBIN_ONTO_RHO_ALL_VALUES = T, + DEBUG_DIAGNOSE_MASS_OF_LAYER = F, + EPSLN_DIAGNOSE_MASS_OF_LAYER = 1.000000000000000E-005 + / + +Note: ocean_tracer_util: rebin_onto_rho will include density values outside bounds range. + + + &OCEAN_CORIOLIS_NML + DEBUG_THIS_MODULE = F, + USE_THIS_MODULE = T, + ACOR = 0.500000000000000 + / +==>Note: Coriolis on Bgrid computed semi-implicitly to remove inertial time step constraint. + + ==> Note: 2*pi timesteps/(min inertial period) implies a maximum dtuv for time-explicit Coriolis = 6856. sec. + + + &OCEAN_VELOCITY_NML + DEBUG_THIS_MODULE = F, + WRITE_A_RESTART = T, + MAX_CGINT = 1.00000000000000 , + ZERO_TENDENCY = F, + ZERO_TENDENCY_EXPLICIT_A = F, + ZERO_TENDENCY_EXPLICIT_B = F, + ZERO_TENDENCY_IMPLICIT = F, + TRUNCATE_VELOCITY = F, + TRUNCATE_VERBOSE = T, + TRUNCATE_VELOCITY_LAT = 0.000000000000000E+000, + TRUNCATE_VELOCITY_VALUE = 2.00000000000000 , + ADAMS_BASHFORTH_THIRD = T, + ADAMS_BASHFORTH_EPSILON = 0.600000000000000 , + USE_CONSTANT_VELOCITY = F, + CONSTANT_U = 0.000000000000000E+000, + CONSTANT_V = 0.000000000000000E+000, + UPDATE_VELOCITY_VIA_UPRIME = T + / + +==>Note from ocean_velocity_mod: use of twolevel time_tendency + necessitates an Adams-Bashforth treatment of velocity advection. + + Using 3rd order Adams-Bashforth for velocity advection. + This is the MOM default. + +NOTE from PE 0: ==>update_velocity_via_uprime=.true., so keep udrho from external mode solver. + + Baroclinic time step stability most nearly violated at U-cell (i,j) = ( 198, 246), (lon,lat) = ( -82.00, 65.14). + The number of kmu-levels at this point is 19 + The dxu grid distance (m) at this point is 0.467431E+05 + The dyu grid distance (m) at this point is 0.159462E+05 + Due to a specified maximum baroclinic gravity wave speed of 1.00 m/s. + "dtuv" must be less than 15092. sec. "dtuv" = 5400. sec. +NOTE from PE 0: ==> From ocean_velocity_mod: Initializing velocity to zero since Time%init=.true. and did not find INPUT/ocean_velocity.res.nc. + + ===Initial velocity checksums ==> +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 0: 0: 0 + From ocean_velocity_mod: initial velocity chksum (taup1) +[chksum] Zonal velocity 9051849634365276068 +[chksum] Meridional velocity 9051849634365276068 +[chksum] Advection of u 0 +[chksum] Advection of v 0 + + + &OCEAN_BAROTROPIC_NML + WRITE_A_RESTART = T, + ZERO_TENDENCY = F, + ZERO_ETA_IC = F, + ZERO_ETA_T = F, + ZERO_ETA_U = F, + ZERO_CORIOLIS_BT = F, + ZERO_NONLINEAR_FORCING_BT = F, + ZERO_FORCING_BT = F, + ZERO_ETA_TENDENCY = F, + BAROTROPIC_TIME_STEPPING_A = T, + BAROTROPIC_TIME_STEPPING_B = F, + TIDAL_FORCING_M2 = F, + TIDAL_FORCING_8 = F, + TIDAL_FORCING_IDEAL = F, + GEOID_FORCING = F, + ALPHAT = 0.948000000000000 , + PRED_CORR_GAMMA = 0.200000000000000 , + SMOOTH_ETA_T_BT_LAPLACIAN = F, + SMOOTH_ETA_T_BT_BIHARMONIC = F, + SMOOTH_ETA_T_LAPLACIAN = T, + SMOOTH_ETA_T_BIHARMONIC = F, + SMOOTH_ANOMPB_BT_LAPLACIAN = F, + SMOOTH_ANOMPB_BT_BIHARMONIC = F, + SMOOTH_PBOT_T_LAPLACIAN = T, + SMOOTH_PBOT_T_BIHARMONIC = F, + SMOOTH_PBOT_T_BIHARMONIC_LEGACY = F, + SMOOTH_ETA_DIAG_LAPLACIAN = T, + SMOOTH_ETA_DIAG_BIHARMONIC = F, + VEL_MICOM_LAP = 5.000000000000000E-002, + VEL_MICOM_LAP_DIAG = 0.200000000000000 , + VEL_MICOM_BIH = 1.000000000000000E-002, + VEL_MICOM_BIH_DIAG = 0.100000000000000 , + TRUNCATE_ETA = F, + VERBOSE_TRUNCATE = T, + ETA_MAX = 8.00000000000000 , + FRAC_CRIT_CELL_HEIGHT = 0.200000000000000 , + VERBOSE_INIT = T, + DEBUG_THIS_MODULE = F, + DIAG_STEP = 4320, + ETA_OFFSET = 1.000000000000000E-012, + PBOT_OFFSET = 1.000000000000000E-012, + INITSUM_WITH_BAR_MOM4P0 = F, + INITSUM_WITH_BAR_MOM4P1 = T, + IDEAL_INITIAL_ETA = F, + IDEAL_INITIAL_ETA_AMPLITUDE = 5.00000000000000 , + IDEAL_INITIAL_ETA_XWIDTH = 100000.000000000 , + IDEAL_INITIAL_ETA_YWIDTH = 100000.000000000 , + UDRHO_BT_LAP = F, + UDRHO_BT_BIH = F, + UDRHO_LAP = F, + UDRHO_BIH = F, + UDRHO_LAP_VEL_MICOM = 5.000000000000000E-002, + UDRHO_BIH_VEL_MICOM = 1.000000000000000E-002, + BAROTROPIC_HALO = 10, + DO_BITWISE_EXACT_SUM = F, + USE_LEGACY_BAROTROPIC_HALOS = F + / + horz diff flux domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + barotropic domain domain decomposition +whalo = 10, ehalo = 10, shalo = 10, nhalo = 10 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +NOTE from PE 0: Using barotropic predictor-corrector for integrating barotropic dynamics. + + Predictor-Corrector time filter on barotropic dynamics has value= 0.20 + + Updating eta_t or pbot_t using a big time step as in MOM4.0. Not recommended for OBC applications. + + Initialise sum of barotropic sea level with eta_t or pbot_t. This is the default. + + ==> Note: The barotropic dynamics integrate 160 timesteps for every one baroclinic timestep. + + ==>Using smooth_eta_t_laplacian to smooth eta_t. + + Barotropic stability most nearly violated at T-cell (i,j) = ( 85, 300), (lon,lat) = ( -269.55, 88.76). + The number of kmt-levels at this point is 46 + The dxt grid spacing (m) at this point is 0.247075E+05 + The dyt grid spacing (m) at this point is 0.500014E+05 + where the barotropic gravity wave speed is ~229.0 m/s. + "dtbt" must be less than 105.000 sec. dtbt = 67.500 sec. +NOTE from PE 0: ==>Note from tidal_forcing_init: tidal_forcing=false, so not adding tidal forcing to external mode. + + + &OCEAN_THICKNESS_NML + DEBUG_THIS_MODULE = F, + DEBUG_THIS_MODULE_DETAIL = F, + WRITE_A_RESTART = T, + FULL_STEP_TOPOGRAPHY = F, + INITIALIZE_ZERO_ETA = F, + ENFORCE_POSITIVE_DZT = F, + DEPTH_MIN_FOR_SIGMA = 1.000000000000000E-002, + THICKNESS_METHOD = energetic , + READ_RHO0_PROFILE = F, + THICKNESS_DZT_MIN = 1.00000000000000 , + THICKNESS_DZT_MIN_INIT = 5.00000000000000 , + RESCALE_MASS_TO_GET_HT_MOD = F, + PBOT0_SIMPLE = F, + EPSILON_INIT_THICKNESS = 1.000000000000000E-005, + READ_RESCALE_RHO0_MASK = F, + RESCALE_RHO0_MASK_GFDL = F, + RESCALE_RHO0_BASIN_LABEL = -1.00000000000000 , + RESCALE_RHO0_VALUE = 1.00000000000000 , + LINEAR_FREE_SURFACE = F, + MAX_NUM_BAD_PRINT = 25, + UPDATE_DZWU_K0 = T + / +==>Note: running ocean_thickness with thickness_method=energetic. + + + &OCEAN_OPERATORS_NML + USE_LEGACY_DIV_UD = F + / + horz diff flux domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + + + &OCEAN_TRACER_NML + DEBUG_THIS_MODULE = F, + ZERO_TENDENCY = F, + ZERO_TRACER_SOURCE = F, + WRITE_A_RESTART = T, + OCEAN_TPM_DEBUG = F, + TMASK_LIMIT_TS_SAME = T, + REMAP_DEPTH_TO_S_INIT = F, + INFLOW_NBOUNDARY = F, + INTERPOLATE_TPROG_TO_PBOTT = T, + INTERPOLATE_TDIAG_TO_PBOTT = F, + LIMIT_AGE_TRACER = T, + AGE_TRACER_MAX_INIT = 0.000000000000000E+000, + FRAZIL_HEATING_BEFORE_VPHYSICS = F, + FRAZIL_HEATING_AFTER_VPHYSICS = T, + COMPUTE_TMASK_LIMIT_ON = T, + USE_TEMPSALT_CHECK_RANGE = T + / +==>Note: frazil heating called after vertical physics and after boundary fluxes. + This is the recommended method. + +NOTE from PE 0: ==>Note from ocean_tracer_mod(ocean_prog_tracer_init): Synchronous timesteps have been specified (dtts = dtuv). + + ==>Note from ocean_tpm_util_mod(otpm_set_tracer_package)[ocean_tracer_mod(ocean + _prog_tracer_init)]: Processing tracer package required + + + &OCEAN_TEMPSALT_NML + DEBUG_THIS_MODULE = F, + TEMPERATURE_VARIABLE = conservative_temp , + POTTEMP_2ND_ITERATION = T, + POTTEMP_EQUAL_CONTEMP = F, + T_MIN = -20.0000000000000 , + T_MAX = 55.0000000000000 , + S_MIN = 0.000000000000000E+000, + S_MAX = 70.0000000000000 , + T_MIN_LIMIT = -5.00000000000000 , + T_MAX_LIMIT = 32.0000000000000 , + S_MIN_LIMIT = 2.00000000000000 , + S_MAX_LIMIT = 42.0000000000000 , + REINIT_TS_WITH_IDEAL = F, + REINIT_TS_WITH_IDEAL_EFOLD = 1000.00000000000 , + REINIT_TS_WITH_IDEAL_TVALUE = 10.0000000000000 , + REINIT_TS_WITH_IDEAL_SVALUE = 30.0000000000000 , + TEOS10 = F, + DO_FAFMIP_HEAT = F + / +==>Note from ocean_tempsalt_mod: MOM prognostic temp = conservative temperature. + MOM diagnostic temp = potential temperature. + + + ==>Note from ocean_tpm_util_mod(otpm_set_prog_tracer)[ocean_tempsalt_mod/ocean_ + tempsalt_init]: Processing prog tracer temp + + ==>Note from ocean_tpm_util_mod(otpm_set_prog_tracer)[ocean_tempsalt_mod/ocean_ + tempsalt_init]: Processing prog tracer salt + + ==>Note from ocean_tpm_util_mod(otpm_set_diag_tracer)[ocean_tempsalt_mod/ocean_ + tempsalt_init]: Processing diag tracer pot_temp +==>Note from ocean_tempsalt_mod: NOT Initializing FAFMIP temperature fields. + + + &OCEAN_FRAZIL_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + FREEZING_TEMP_SIMPLE = F, + FREEZING_TEMP_PRETEOS10 = T, + FREEZING_TEMP_TEOS10 = F, + FRAZIL_FACTOR = 1.00000000000000 , + AIR_SATURATED_WATER = T, + FRAZIL_ONLY_IN_SURFACE = F + / +NOTE from PE 0: ==>Note from ocean_frazil_mod: USING frazil heating. +==>Note: Using preTEOS10 equation for seawater freezing temperature. +==>Note: Assuming seawater is saturated w/ air for freezing temperature calculation. +Assuming that frazil can form in any ocean grid cell, including cells beneath surface. + + ==>Note from ocean_tpm_util_mod(otpm_set_diag_tracer)[ocean_frazil_mod/ocean_fr + azil_init]: Processing diag tracer frazil +NOT Initializing frazil_redist heat diagnostic tracer for FAFMIP purposes. + +==>Note from ocean_frazil_mod: using frazil_factor= 1.00 +Check value for freezing temperature(C) at (35psu,200dbar) = -0.2076426227617581E+01 +This value differs from published check value by -0.4440892098500626E-15 + + ==>Note from ocean_tpm_util_mod(otpm_set_tracer_package)[ocean_passive_mod(ocea + n_passive_init)]: Processing tracer package ocean_passive + + ==>Note from ocean_passive_mod(ocean_passive_init): + No instances of passive tracers in field_table. + +==>Note: NOT running with idealized passive tracers. +NOTE from PE 0: ==>Note: ocean_passive_mod: NOT using idealized passive tracer module. + + ==>Note from ocean_tpm_util_mod(otpm_set_tracer_package)[ocean_residency_mod(oc + ean_residency_init)]: Processing tracer package ocean_residency + + ==>Note from ocean_residency_mod(ocean_residency_init): No instances + + ==>Note from ocean_tpm_util_mod(otpm_set_tracer_package)[ocean_age_tracer_mod(o + cean_age_tracer_init)]: Processing tracer package ocean_age_tracer + + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_init): 1 + instances + + ==>Note from ocean_tpm_util_mod(otpm_set_prog_tracer)[ocean_age_tracer_mod(ocea + n_age_tracer_init)]: Processing prog tracer age_global + + ==>Note from fm_util_mod(fm_util_start_namelist)[ocean_age_tracer_mod(ocean_age + _tracer_init)]: Processing namelist ocean_age_tracer/global + + ==>Note from ocean_tpm_util_mod(otpm_set_tracer_package)[transport_matrix_mod(t + ransport_matrix_init)]: Processing tracer package transport_matrix + + ==>Note from transport_matrix_mod(transport_matrix_init): No instances + + Dumping tracer_packages tracer tree +tracer_packages/ + ocean_age_tracer/ + names = 'global' + const_init_tracer = T + horizontal-advection-scheme = 'mdppm' + vertical-advection-scheme = 'mdppm' + ppm_hlimiter = 3 + ppm_vlimiter = 3 + restart_file = 'ocean_age.res.nc' + min_tracer_limit = 0.000000000000000E+000 + units = 'yr' + min_range = 0.000000000000000E+000 + max_range = 1.000000000000000E+020 + flux_units = 'm' + max_tracer_limit = 1.000000000000000E+020 + required/ + names = NULL + ocean_passive/ + names = NULL + units = 'dimensionless' + conversion = 1.00000000000000 + offset = 0.000000000000000E+000 + min_tracer = -1000000.00000000 + max_tracer = 1000000.00000000 + min_range = -10.0000000000000 + max_range = 100.000000000000 + restart_file = 'ocean_passive.res.nc' + psom_limit = T + flux_units = 'dimensionless' + min_flux_range = -1.000000000000000E+016 + max_flux_range = 1.000000000000000E+016 + min_tracer_limit = -0.100000000000000 + max_tracer_limit = 1.00000000000000 + vertical-advection-scheme = 'mdppm' + horizontal-advection-scheme = 'mdppm' + ocean_residency/ + names = NULL + units = 'yr' + restart_file = 'ocean_residency.res.nc' + flux_units = 'm' + min_tracer_limit = 0.000000000000000E+000 + max_tracer_limit = 1.000000000000000E+020 + transport_matrix/ + names = NULL + restart_file = 'transport_matrix.res.nc' + + Dumping prog_tracers tracer tree +prog_tracers/ + temp/ + horizontal-advection-scheme = 'mdppm' + vertical-advection-scheme = 'mdppm' + restart_file = 'ocean_temp_salt.res.nc' + ppm_hlimiter = 3 + ppm_vlimiter = 3 + longname = 'Conservative temperature' + units = 'deg_C' + type = '' + conversion = 3992.10322329649 + offset = 273.150000000000 + min_tracer = -20.0000000000000 + max_tracer = 55.0000000000000 + min_range = -10.0000000000000 + max_range = 500.000000000000 + use_only_advection = F + const_init_tracer = F + const_init_value = 0.000000000000000E+000 + psom_limit = F + mdt_scheme = 1 + flux_units = 'Watts/m^2' + min_flux_range = -1.000000000000000E+016 + max_flux_range = 1.000000000000000E+016 + min_tracer_limit = -5.00000000000000 + max_tracer_limit = 32.0000000000000 + salt/ + horizontal-advection-scheme = 'mdppm' + vertical-advection-scheme = 'mdppm' + restart_file = 'ocean_temp_salt.res.nc' + ppm_hlimiter = 3 + ppm_vlimiter = 3 + longname = 'Practical Salinity' + units = 'psu' + type = '' + conversion = 1.000000000000000E-003 + offset = 0.000000000000000E+000 + min_tracer = 0.000000000000000E+000 + max_tracer = 70.0000000000000 + min_range = -10.0000000000000 + max_range = 100.000000000000 + use_only_advection = F + const_init_tracer = F + const_init_value = 0.000000000000000E+000 + psom_limit = F + mdt_scheme = 1 + flux_units = 'kg/(sec*m^2)' + min_flux_range = -100000.000000000 + max_flux_range = 100000.000000000 + min_tracer_limit = 2.00000000000000 + max_tracer_limit = 42.0000000000000 + age_global/ + longname = 'Age (global)' + units = 'yr' + type = '' + conversion = 1.00000000000000 + offset = 0.000000000000000E+000 + min_tracer = -1.000000000000000E+020 + max_tracer = 1.000000000000000E+020 + min_range = 0.000000000000000E+000 + max_range = 1.000000000000000E+020 + use_only_advection = F + restart_file = 'ocean_age.res.nc' + const_init_tracer = T + const_init_value = 0.000000000000000E+000 + psom_limit = F + ppm_hlimiter = 3 + ppm_vlimiter = 3 + mdt_scheme = 1 + flux_units = 'm' + min_flux_range = 1.00000000000000 + max_flux_range = 0.000000000000000E+000 + min_tracer_limit = 0.000000000000000E+000 + max_tracer_limit = 1.000000000000000E+020 + vertical-advection-scheme = 'mdppm' + horizontal-advection-scheme = 'mdppm' + + Dumping namelists tracer tree +namelists/ + ocean_age_tracer/ + global/ + slat = -90.0000000000000 + nlat = 90.0000000000000 + wlon = 0.000000000000000E+000 + elon = 360.000000000000 + coastal_only = F + t_mask[1] = T + t_mask[2] = T + t_mask[3] = T + t_mask[4] = T + t_mask[5] = T + t_mask[6] = T + t_mask[7] = T + t_mask[8] = T + t_mask[9] = T + t_mask[10] = T + t_mask[11] = T + t_mask[12] = T + age_tracer_type = 'not used' + + ==> Note from ocean_tracer_mod: prognostic temperature = conservative temperature. + diagnostic temperature = potential temperature. + + + ==>Note from ocean_tracer_mod(ocean_prog_tracer_init): + Reading prognostic tracer initial conditions or restarts + + Initializing tracer number 1 + at time level tau. This tracer is called temp + Reading restart for prog tracer temp from file ocean_temp_salt.res.nc + After reading ic, linearly interpolate temp to partial cell bottom. + Completed initialization of tracer temp at time level tau + + Initializing tracer number 2 + at time level tau. This tracer is called salt + Reading restart for prog tracer salt from file ocean_temp_salt.res.nc + After reading ic, linearly interpolate salt to partial cell bottom. + Completed initialization of tracer salt at time level tau + + Initializing tracer number 3 + at time level tau. This tracer is called age_global + Initializing the tracer age_global to the constant 0.000000000000000E+000 + Completed initialization of tracer age_global at time level tau + + ==>Note from ocean_tracer_mod(ocean_prog_tracer_init): + finished reading prognostic tracer restarts. + + ==>Note from ocean_tpm_util_mod(otpm_set_diag_tracer)[ocean_shortwave_mod(ocean + _irradiance_init)]: Processing diag tracer irr + + ==>Note from ocean_tracer_mod(ocean_diag_tracer_init): 3 + diagnostic tracers requested. + + Dumping ocean diag field tree after reading diag tracer tree +diag_tracers/ + pot_temp/ + longname = 'Potential temperature' + units = 'deg_C' + type = '' + conversion = 3992.10322329649 + offset = 273.150000000000 + min_tracer = -20.0000000000000 + max_tracer = 55.0000000000000 + min_range = -10.0000000000000 + max_range = 500.000000000000 + restart_file = 'ocean_pot_temp.res.nc' + const_init_tracer = T + const_init_value = 0.000000000000000E+000 + frazil/ + longname = 'frazil heating' + units = 'J/m^2' + type = '' + conversion = 1.00000000000000 + offset = 0.000000000000000E+000 + min_tracer = 0.000000000000000E+000 + max_tracer = 1.000000000000000E+020 + min_range = -10.0000000000000 + max_range = 100.000000000000 + restart_file = 'ocean_frazil.res.nc' + const_init_tracer = T + const_init_value = 0.000000000000000E+000 + irr/ + longname = 'Irradiance' + units = 'Watts/m^2' + type = '' + conversion = 1.00000000000000 + offset = 0.000000000000000E+000 + min_tracer = -1.000000000000000E+020 + max_tracer = 1.000000000000000E+020 + min_range = 1.00000000000000 + max_range = 0.000000000000000E+000 + restart_file = '' + const_init_tracer = T + const_init_value = 0.000000000000000E+000 + ==>Note from ocean_tracer_mod(ocean_diag_tracer_init): + Reading diagnostic tracer initial conditions and/or restarts + + Initializing tracer number 1 + at time level tau. This tracer is called pot_temp + Initializing diagnostic tracer pot_temp to constant 0.000000000000000E+000 + + Initializing tracer number 2 + at time level tau. This tracer is called frazil + Initializing diagnostic tracer frazil to constant 0.000000000000000E+000 + + Initializing tracer number 3 + at time level tau. This tracer is called irr + Skipping tracer irr + ==>Note from ocean_tracer_mod(ocean_diag_tracer_init): + Finished reading diagnostic tracer restarts. + + + &OCEAN_ADVECTION_VELOCITY_NML + DEBUG_THIS_MODULE = F, + MAX_ADVECTION_VELOCITY = 0.500000000000000 , + INFLOW_NBOUNDARY = F, + READ_ADVECTION_VELOCITY = F, + READ_ADVECTION_TRANSPORT = F, + CONSTANT_ADVECTION_VELOCITY = F + / + + Note: Advection stability most nearly violated at T-cell (i,j) = ( 198, 246), (lon,lat) = ( -82.501, 65.069). + Assuming a maximum advection velocity of 0.50 m/s, + Linear stability requires max(dtuv,dtts) be less than 7709.00 sec. + Model is now using (dtuv,dtts) = ( 5400.00, 5400.00) sec. + + + &OCEAN_DENSITY_NML + S_TEST = 20.0000000000000 , + T_TEST = 20.0000000000000 , + P_TEST = 1000.00000000000 , + PRESS_STANDARD = 0.000000000000000E+000, + SN_TEST = 35.0000000000000 , + TN_TEST = 20.0000000000000 , + EOS_LINEAR = F, + ALPHA_LINEAR_EOS = 0.255000000000000 , + BETA_LINEAR_EOS = 0.000000000000000E+000, + EOS_PRETEOS10 = T, + EOS_TEOS10 = F, + POTRHO_PRESS = 2000.00000000000 , + POTRHO_MIN = 1028.00000000000 , + POTRHO_MAX = 1038.00000000000 , + NEUTRALRHO_MIN = 1028.00000000000 , + NEUTRALRHO_MAX = 1038.00000000000 , + LAYER_NK = 80, + THETA_MIN = -2.00000000000000 , + THETA_MAX = 30.0000000000000 , + DEBUG_THIS_MODULE = F, + WRITE_A_RESTART = T, + RHO0_DENSITY = F, + DENSITY_EQUAL_POTRHO = F, + BUOYFREQ_SMOOTH_VERT = T, + NUM_121_PASSES = 1, + EPSLN_DRHODZ = 1.000000000000000E-010, + MASK_DOMAIN_RESTART = F, + DO_BITWISE_EXACT_SUM = F, + DRHODZ_DIAG_STABLE = T, + EPSLN_DRHODZ_DIAG = 1.000000000000000E-010, + GRAD_NRHO_LRPOTRHO_COMPUTE = F, + GRAD_NRHO_LRPOTRHO_MAX = 10.0000000000000 , + GRAD_NRHO_LRPOTRHO_MIN = 1.00000000000000 , + NEUTRAL_DENSITY_OMEGA = F, + NEUTRAL_DENSITY_POTRHO = T, + NEUTRAL_DENSITY_THETA = F, + SMOOTH_STRATIFICATION_FACTOR = F, + UPDATE_DIAGNOSTIC_FACTORS = F, + SMAX_DIAG = -1.00000000000000 , + SMAX_MIN_IN_COLUMN = F + / + + ==> Note: USING preTEOS10 EOS, as relevant for realistic ocean climate simulations. + Subtracting standard atmosphere of 0.000000 dbar for EOS calculation. + + ==> Note: Computing EOS assuming prognostic temp = conservative temperature. + + ==> Note: Computing EOS assuming prognostic salinity = practical salinity. + ==>Note: The Boussinesq rho0 density has a value of (kg/m^3) + 1035.00000000000 + + ==> Note: Computing diagnostic neutral_rho as potential density referenced to pressure potrho_press. + + ==> Note: Enforcing drhodz_diag < 0, so to use stable stratification for certain diagnostic purposes. + + ==> Note: Diagnostic factors are NOT computed. So if enable watermass diagnostics, they will be corrupted. + +preTEOS10 EQUATION OF STATE TEST VALUES +s_test(psu) = 20.00, t_test(C) = 20.00, p_test(dbar) = 1000.00 +rho ( 20.00, 20.00, 1000.00) = 0.1017842890411976E+04 kg/m^3 +diff from JMFWG = 0.5684341886080801E-12 kg/m^3 +alpha( 20.00, 20.00, 1000.00) = 0.2436057013634661E-03 1/C +diff from JMFWG = 0.1192622389734055E-17 1/C +beta ( 20.00, 20.00, 1000.00) = 0.7314818108935242E-03 1/psu +squared sound speed ( 20.00, 20.00, 1000.00) = 0.2311451354560629E+03 (m/s)^2 +diff from JMFWG = -.6505213034913027E-18 1/psu + +NEUTRAL DENSITY EQUATION TEST VALUES +sn_test(psu) = 35.00, tn_test(C) = 20.00 +rho ( 35.00, 20.00) = 0.1024438639277630E+04 kg/m^3 +diff from Klocker and McDougall test = 0.0000000000000000E+00 kg/m^3 + + Initialising salinity for use in density calculation + + ==>Note: From ocean_density_mod: Boussinesq reference density rho0(kg/m3) = 0.103500000000E+04 + Initial rho_average(kg/m3) = 0.103741601533E+04 + Since rho0 .ne. rho_average, consider changing rho0 in + ocean_parameters.F90 to be equal to rho_average for better accuracy. + + + From ocean_density_mod: density chksums from ocean_density_init +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 0: 0: 0 +[chksum] rho(taup1) -7748370226989976718 +[chksum] pressure_at_depth -8571165105956384768 +[chksum] denominator_r 1503206819559825144 +[chksum] drhodT 0 +[chksum] drhodS 0 +[chksum] drhodz_zt 6262314188798781904 + + + &OCEAN_BLOB_NML + BLOB_SMALL_MASS = 1000.00000000000 , + DEBUG_THIS_MODULE = F, + REALLY_DEBUG = F, + DO_BITWISE_EXACT_SUM = F, + BITWISE_REPRODUCTION = F, + MAX_PROP_THICKNESS = 0.700000000000000 + / +==>Note: NOT using the Lagrangian buoyancy blobs scheme. + + + &OCEAN_PRESSURE_NML + DEBUG_THIS_MODULE = F, + ZERO_PRESSURE_FORCE = F, + ZERO_CORRECTION_TERM_GRAD = F, + ZERO_DIAGONAL_PRESS_GRAD = F, + ZERO_ETA_OVER_H_ZSTAR_PRESSURE = F + / + ==>NOTE: Running MOM with finite difference formulation of pressure force. + + + &OCEAN_VERT_MIX_NML + DEBUG_THIS_MODULE = F, + VERT_MIX_SCHEME = kpp_mom4p1, + VERBOSE_INIT = T, + AIDIF = 1.00000000000000 , + VERT_DIFF_BACK_VIA_MAX = T, + USE_EXPLICIT_VERT_DIFFUSE = T, + USE_DIFF_CBT_TABLE = F, + LINEAR_TAPER_DIFF_CBT_TABLE = F, + BRYAN_LEWIS_DIFFUSIVITY = F, + BRYAN_LEWIS_LAT_DEPEND = F, + BRYAN_LEWIS_LAT_TRANSITION = 35.0000000000000 , + AFKPH_90 = 0.550000000000000 , + DFKPH_90 = 1.05000000000000 , + SFKPH_90 = 4.500000000000000E-005, + ZFKPH_90 = 250000.000000000 , + AFKPH_00 = 0.550000000000000 , + DFKPH_00 = 1.05000000000000 , + SFKPH_00 = 4.500000000000000E-005, + ZFKPH_00 = 250000.000000000 , + VERT_VISC_BACK = F, + VISC_CBU_BACK_MAX = 1.000000000000000E-002, + VISC_CBU_BACK_MIN = 1.000000000000000E-003, + VISC_CBU_BACK_ZMID = 50.0000000000000 , + VISC_CBU_BACK_ZWID = 30.0000000000000 , + HWF_DIFFUSIVITY = F, + HWF_DEPTH_TRANSITION = 25000000.0000000 , + HWF_MIN_DIFFUSIVITY = 2.000000000000000E-006, + HWF_30_DIFFUSIVITY = 2.000000000000000E-005, + HWF_N0_2OMEGA = 20.0000000000000 , + HWF_DIFFUSIVITY_3D = F, + DIFF_CBT_TANH = F, + DIFF_CBT_TANH_MAX = 1.000000000000000E-003, + DIFF_CBT_TANH_MIN = 2.000000000000000E-005, + DIFF_CBT_TANH_ZMID = 150.000000000000 , + DIFF_CBT_TANH_ZWID = 30.0000000000000 , + J09_DIFFUSIVITY = T, + J09_BGMIN = 1.000000000000000E-006, + J09_BGMAX = 5.000000000000000E-006, + J09_LAT = 20.0000000000000 , + QUEBEC_2009_10_BUG = F, + VMIX_RESCALE_NONBOUSS = F, + VMIX_SET_MIN_DISSIPATION = F, + VMIX_MIN_DISS_CONST = 1.000000000000000E-007, + VMIX_MIN_DISS_BVFREQ_SCALE = 5.999999999999999E-004, + VMIX_MIN_DISS_FLUX_RI_MAX = 0.200000000000000 , + SMOOTH_RHO_N2 = T, + NUM_121_PASSES = 1, + READ_DIFF_CBT_FILE = F + / + + + &OCEAN_VERT_UTIL_NML + DEBUG_THIS_MODULE = F, + SMOOTH_N2 = T, + SMOOTH_RI_NUMBER = T, + NUM_N2_SMOOTH = 1, + NUM_RI_SMOOTH = 1 + / +NOTE from PE 0: ==>Warning: ocean_vert_mix_init NO table for enhanced diff_cbt. No diffusivities read. + + + &OCEAN_VERT_TIDAL_NML + USE_THIS_MODULE = T, + USE_LEGACY_METHODS = F, + DEBUG_THIS_MODULE = F, + USE_WAVE_DISSIPATION = T, + USE_DRAG_DISSIPATION = T, + READ_ROUGHNESS = T, + READ_TIDE_SPEED = T, + DEFAULT_ROUGHNESS_LENGTH = 25.0000000000000 , + DEFAULT_TIDE_SPEED = 1.000000000000000E-002, + SHELF_DEPTH_CUTOFF = -1000.00000000000 , + DECAY_SCALE = 500.000000000000 , + ROUGHNESS_SCALE = 12000.0000000000 , + TIDAL_DISS_EFFICIENCY = 0.333330000000000 , + MIXING_EFFICIENCY = 0.200000000000000 , + MIXING_EFFICIENCY_N2DEPEND = T, + MUNK_ANDERSON_P = 0.250000000000000 , + MUNK_ANDERSON_SIGMA = 3.00000000000000 , + DRAG_DISSIPATION_EFOLD = T, + DRAG_DISSIPATION_TIDE_PERIOD = 43200.0000000000 , + DRAG_MASK_DEEP = T, + DRAG_MASK_DEEP_RATIO = 0.100000000000000 , + BOTTOM_DRAG_CD = 2.400000000000000E-003, + DRHODZ_MIN = 1.000000000000000E-010, + SPEED_MIN = 5.000000000000000E-003, + BACKGROUND_DIFFUSIVITY = 0.000000000000000E+000, + BACKGROUND_VISCOSITY = 1.000000000000000E-004, + MAX_WAVE_DIFFUSIVITY = 1.000000000000000E-002, + MAX_DRAG_DIFFUSIVITY = 5.000000000000000E-003, + SMOOTH_BVFREQ_BOTTOM = T, + VEL_MICOM_SMOOTH = 0.200000000000000 , + SMOOTH_RHO_N2 = T, + NUM_121_PASSES = 1, + WAVE_DIFFUSIVITY_MONOTONIC = T, + TIDE_SPEED_DATA_ON_T_GRID = T, + READING_ROUGHNESS_AMP = T, + READING_ROUGHNESS_LENGTH = F, + READ_WAVE_DISSIPATION = F, + FIXED_WAVE_DISSIPATION = F, + WAVE_ENERGY_FLUX_MAX = 0.100000000000000 , + USE_LEEWAVE_DISSIPATION = F, + READ_LEEWAVE_DISSIPATION = F, + DRAG_DISSIPATION_USE_CDBOT = T + / +NOTE from PE 0: ==>Note: USING ocean_vert_tidal_mod +Using Simmons etal scheme to compute dia-surface diffusivity and viscosity based on internal wave breaking. +Using Lee etal scheme to compute dia-surface diffusivity and viscosity based on barotropic tide drag on bottom. +NOT using Nikurashin scheme for dia-surface diffusivity and viscosity. + ==>ocean_vert_tidal_mod: Completed read of topographic roughness amplitude on T + -grid. +==>Note: NOT reading wave dissipation for ocean_vert_tidal_mod. +==>Note: NOT reading leewave dissipation for ocean_vert_tidal_mod. + ==>ocean_vert_tidal_mod: Completed read of tide_speed on T-grid. +==>Note from ocean_vert_tidal: using cdbot_array(i,j) for tide drag_dissipation scheme. + +==>Note from ocean_vert_mix: KPP_mom4p1 for vert diffusivity, viscosity, nonlocal, and barotropic tide drag. + + + + &OCEAN_VERT_KPP_MOM4P1_NML + USE_THIS_MODULE = T, + SHEAR_INSTABILITY = T, + DOUBLE_DIFFUSION = T, + DIFF_CBT_IW = 0.000000000000000E+000, + VISC_CBU_IW = 0.000000000000000E+000, + VISC_CBU_LIMIT = 5.000000000000000E-003, + DIFF_CBT_LIMIT = 5.000000000000000E-003, + VISC_CON_LIMIT = 0.100000000000000 , + DIFF_CON_LIMIT = 0.100000000000000 , + CONCV = 1.80000000000000 , + RICR = 0.300000000000000 , + NON_LOCAL_KPP = T, + SMOOTH_BLMC = F, + LGAM = 1.04000000000000 , + CW_0 = 0.150000000000000 , + L_SMYTH = 2.00000000000000 , + LTMAX = 5.00000000000000 , + WSTFAC = 0.600000000000000 , + KL_MIN = 2, + KBL_STANDARD_METHOD = F, + DEBUG_THIS_MODULE = F, + LIMIT_WITH_HEKMAN = T, + LIMIT_GHATS = F, + HBL_WITH_RIT = F, + RADIATION_LARGE = F, + RADIATION_ZERO = F, + RADIATION_IOW = F, + USE_SBL_BOTTOM_FLUX = F, + WSFC_COMBINE_RUNOFF_CALVE = T, + BVF_FROM_BELOW = F, + VARIABLE_VTC = F, + USE_MAX_SHEAR = F, + LINEAR_HBL = T, + CALC_VISC_ON_CGRID = F, + SMOOTH_RI_KMAX_EQ_KMU = T, + DO_LANGMUIR = F, + DO_LANGMUIR_CVMIX = F, + CALCULATE_U10 = F + / + + ==> NOTE: USING KPP vertical mixing scheme. + ==> NOTE: KPP is typically run with penetrative shortwave heating. + ==> NOTE: KPP is typically run with a seasonal and/or diurnal cycle. + + +==>Note from ocean_vert_kpp_mom4p1_mod: using forward time step for vert-frict of (secs) 5400.00 + +==>Note from ocean_vert_kpp_mom4p1_mod: using forward time step for vert-diff of (secs) 5400.00 + ==> NOTE from ocean_vert_kpp_mom4p1_mod: adjust kbl to hbl with the non-standard method. + ==>WARNING from ocean_vert_kpp_mom4p1_mod: change kl_min to 1 to avoid negative mixing coefficients with low wind stress. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Find BVF from a backward derivatives. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Diagnose hbl with constant concv. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Use average shear around a tracer cell for diagnostics of hbl. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Use linear interpolation to find hbl + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Do not limit ghats*diff_cbt to 1. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Limit hbl with hekman for stable case. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Interpolate viscosity to c-grid. + ==> NOTE from ocean_vert_kpp_mom4p1_mod: Leave full sw-radiation in non-local surface flux. +Computing vertical mixing from shear instability in KPP module. + + + &OCEAN_BIH_TRACER_NML + USE_THIS_MODULE = F, + ABIH = 0.000000000000000E+000, + TRACER_MIX_MICOM = F, + VEL_MICOM = 0.000000000000000E+000, + READ_DIFFUSIVITY_MASK = F, + HORZ_Z_DIFFUSE = F, + HORZ_S_DIFFUSE = T + / + ==>Note from ocean_bih_tracer_mod: NOT using this module. + + + &OCEAN_LAP_TRACER_NML + USE_THIS_MODULE = F, + ALAP = 0.000000000000000E+000, + TRACER_MIX_MICOM = F, + VEL_MICOM = 0.000000000000000E+000, + VERBOSE_INIT = T, + READ_DIFFUSIVITY_MASK = F, + HORZ_Z_DIFFUSE = F, + HORZ_S_DIFFUSE = T + / + ==>Note from ocean_lap_tracer_mod: NOT using this module. + + + &OCEAN_SIGMA_TRANSPORT_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + TMASK_SIGMA_ON = F, + SIGMA_DIFFUSION_ON = T, + SIGMA_ADVECTION_ON = F, + SIGMA_ADVECTION_SGS_ONLY = T, + SIGMA_ADVECTION_CHECK = T, + THICKNESS_SIGMA_LAYER = 50.0000000000000 , + THICKNESS_SIGMA_MAX = 100.000000000000 , + THICKNESS_SIGMA_MIN = 10.0000000000000 , + SIGMA_DIFFUSIVITY = 1000.00000000000 , + SIGMA_DIFFUSIVITY_RATIO = 1.000000000000000E-006, + TRACER_MIX_MICOM = F, + VEL_MICOM = 0.500000000000000 , + VERBOSE_INIT = T, + SIGMA_JUST_IN_BOTTOM_CELL = T, + CAMPINGOOSE_MU = 1.000000000000000E-004, + CAMPINGOOSE_DELTA = 0.333300000000000 , + SIGMA_UMAX = 0.100000000000000 , + WRITE_A_RESTART = T, + SMOOTH_SIGMA_THICKNESS = T, + SMOOTH_SIGMA_VELOCITY = T, + SMOOTH_VELMICOM = 0.200000000000000 + / +NOTE from PE 0: ==>Note from ocean_sigma_transport_mod: USING ocean_sigma_transport_mod. +==>Note: ocean_sigma_transport_mod: using forward time step of (secs) 5400.00 +==>Note: ocean_sigma_transport_mod: sigma_diffusion_on=.true. +==>Note: ocean_sigma_transport_mod: sigma_advection_on=.false. +==>Note from ocean_sigma_transport_mod: using sigma_just_in_bottom=.true., as in mom4p0. + flux dom sigma domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 +==>Note: ocean_sigma_transport_mod: initial thickness of sigma layer (m) = 50.0000 +==>Note: ocean_sigma_transport_mod: smooth_sigma_thickness=.true. => diffuse sigma_thickness. + + + &OCEAN_NPHYSICS_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + WRITE_A_RESTART = T, + USE_NPHYSICSA = F, + USE_NPHYSICSB = F, + USE_NPHYSICSC = T + / + +[Note] ocean_nphysics.F90: USING ocean_nphysics_mod. + + + &OCEAN_NPHYSICS_UTIL_NML + DEBUG_THIS_MODULE = F, + NPHYSICS_UTIL_ZERO_INIT = T, + SMAX = 1.000000000000000E-002, + SWIDTH = 5.000000000000000E-004, + EPSLN_DRHODZ = 1.000000000000000E-030, + DRHODZ_MOM4P1 = T, + DRHODZ_SMOOTH_HORZ = F, + DRHODZ_SMOOTH_VERT = F, + NUM_121_PASSES = 1, + AREDI = 600.000000000000 , + AGM = 1000.00000000000 , + AREDI_EQUAL_AGM = F, + TRACER_MIX_MICOM = F, + VEL_MICOM = 0.000000000000000E+000, + BRYAN_LEWIS_AREDI = F, + AHS = 0.000000000000000E+000, + AHB = 0.000000000000000E+000, + NEUTRAL_HORZ_MIX_BDY = F, + VEL_MICOM_BDY = 0.000000000000000E+000, + AH_BDY = 0.000000000000000E+000, + AGM_LAT_BANDS = F, + AGM_LAT_BANDS_BOUNDARY = -999.000000000000 , + AGM_LAT_BANDS_RATIO = 1.00000000000000 , + ROSSBY_RADIUS_MAX = 100000.000000000 , + ROSSBY_RADIUS_MIN = 15000.0000000000 , + AGM_READ_RESTART = F, + AGM_CLOSURE = T, + AGM_CLOSURE_SCALING = 7.000000000000001E-002, + AGM_CLOSURE_MAX = 600.000000000000 , + AGM_CLOSURE_MIN = 50.0000000000000 , + AGM_CLOSURE_GROWTH_SCALE = 0.500000000000000 , + AGM_CLOSURE_LENGTH_FIXED = F, + AGM_CLOSURE_LENGTH = 50000.0000000000 , + AGM_CLOSURE_LENGTH_ROSSBY = F, + AGM_CLOSURE_LENGTH_BCZONE = F, + BCZONE_MAX_PTS = 10, + AGM_CLOSURE_BCZONE_CRIT_RATE = 1.400000000000000E-006, + AGM_CLOSURE_EDEN_GREATBATCH = F, + AGM_CLOSURE_EDEN_GAMMA = 200.000000000000 , + AGM_CLOSURE_EDEN_LENGTH_CONST = F, + AGM_CLOSURE_EDEN_LENGTH = 10000.0000000000 , + AGM_CLOSURE_EADY_SMOOTH_VERT = T, + AGM_CLOSURE_EADY_SMOOTH_HORZ = T, + AGM_CLOSURE_EADY_AVE_MIXED = T, + AGM_CLOSURE_EADY_CAP = T, + AGM_CLOSURE_BAROCLINIC = T, + AGM_CLOSURE_BUOY_FREQ = 4.000000000000000E-003, + AGM_CLOSURE_UPPER_DEPTH = 100.000000000000 , + AGM_CLOSURE_LOWER_DEPTH = 2000.00000000000 , + AGM_CLOSURE_LENGTH_CAP = F, + AGM_CLOSURE_LENGTH_MAX = 50000.0000000000 , + AGM_SMOOTH_SPACE = F, + VEL_MICOM_SMOOTH = 0.200000000000000 , + AGM_SMOOTH_TIME = F, + AGM_DAMPING_TIME = 10.0000000000000 , + AGM_CLOSURE_GRID_SCALING = T, + AGM_CLOSURE_GRID_SCALING_POWER = 2.00000000000000 , + AREDI_DIFFUSIVITY_GRID_SCALING = F, + AGM_CLOSURE_N2_SCALE = F, + AGM_CLOSURE_N2_SCALE_COEFF = 1000.00000000000 , + AGM_CLOSURE_N2_SCALE_NREF_CST = F, + SMAX_GRAD_GAMMA_SCALAR = 1.000000000000000E-002, + EPSLN_DRHODZ_DIAGNOSTICS = 1.000000000000000E-007, + WDIANEUTRAL_SMOOTH = T, + SMOOTH_ETA_TEND_GM90 = F + / + bczone domain decomposition +whalo = 10, ehalo = 10, shalo = 10, nhalo = 10 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + +[Note] ocean_nphysics_util.F90: Computing 2d flow-dependent tracer diffusivity with agm_closure_baroclinic. + The maximum allowable diffusivity (m^2/s) is given by .60000E+03 + The minimum allowable diffusivity (m^2/s) is given by .50000E+02 + Depths (m) between which compute eady growth and baroclinicity = .10000E+03 .20000E+04 + +[Note] ocean_nphysics_util.F90: Length and time scales set by vertically averaged baroclinicity |grad(rho)|, + as well as the constant buoyancy freq(sec^-1) = .40000E-02 + and the constant length scale (m) = .50000E+05 + +[Note] ocean_nphysics.F90: USING ocean_nphysicsC. + + + &OCEAN_NPHYSICSC_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + DO_NEUTRAL_DIFFUSION = T, + DO_GM_SKEWSION = T, + NEUTRAL_PHYSICS_LIMIT = T, + NEUTRAL_EDDY_DEPTH = T, + DM_TAPER = T, + GKW_TAPER = F, + TMASK_NEUTRAL_ON = T, + DIFFUSION_ALL_EXPLICIT = F, + TURB_BLAYER_MIN = 50.0000000000000 , + GM_SKEWSION_MODES = F, + NUMBER_BC_MODES = 2, + GM_SKEWSION_BVPROBLEM = T, + BVP_BC_MODE = 2, + BVP_MIN_SPEED = 0.100000000000000 , + BVP_SPEED = 0.000000000000000E+000, + BVP_CONSTANT_SPEED = F, + BV_FREQ_SMOOTH_VERT = T, + NUM_121_PASSES = 1, + MIN_BC_SPEED = 1.000000000000000E-006, + SMOOTH_PSI = T, + EPSLN_BV_FREQ = 1.000000000000000E-012, + REGULARIZE_PSI = F, + SMAX_PSI = 1.000000000000000E-002, + SMOOTH_BC_MODES = F, + USE_NEUTRAL_SLOPES_POTRHO = F, + NEUTRAL_SLOPES_POTRHO_PRESS = 2000.00000000000 , + SMOOTH_ADVECT_TRANSPORT = T, + SMOOTH_ADVECT_TRANSPORT_NUM = 2 + / + +[Note] ocean_nphysicsC.F90: USING ocean_nphysicsC. + + ==> Note from ocean_nphysicsC_mod: using forward time step of (secs) 5400.00 + +[Note] ocean_nphysicsC.F90: computing neutral diffusion acting on each tracer. + +[Note] ocean_nphysicsC.F90: computing GM skewsion w/ streamfunction computed by boundary value problem. + +[Note] ocean_nphysicsC.F90: neutral_physics_limit=.true. + Will revert to horizontal diffusion for points where tracer is outside specified range. + +[Note] ocean_nphysicsC.F90: dm_taper=.true. Will use the tanh scheme + of Danabasoglu and McWilliams to taper neutral diffusion in steep sloped regions + flux dom neutral domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + +[Note] ocean_nphysics_util.F90: Starting ocean_nphysics_util fields from raw initialization. + aredi_equal_agm=.false. and agm_read_restart=.false. => aredi_array set to static profiles. + +[Note] ocean_nphysics_util.F90: aredi_equal_agm=.false. allows aredi_array to differ from agm_array + +---Neutral direction slope check I for linear stability of neutral diffusion--- +With a neutral physics time step (secs) of 0.5400000E+04 +the most stringent linear stability constraint was found at the following ocean cell: +long( 205, 249) = -0.7555040E+02 +lat ( 205, 249) = 0.6567656E+02 +thick( 205, 249, 5) = 0.1000000E+01 +aredi( 205, 249, 5) = 0.6000000E+03 +delta_iso = 0.3376041E-02 is the maximum neutral direction slope +available for linear stability of the neutral diffusion scheme. +The namelist parameter smax should conservatively be <= delta_iso. +==> Warning: The namelist parameter smax= 0.01000 is >= to delta_iso. +Linear stability of the neutral diffusion scheme may be compromised. + + +---Neutral direction slope check II for linear stability of neutral diffusion--- +Assuming maximum Redi neutral diffusion slope of 0.1000000E-01 +and neutral physics time step (secs) of 0.5400000E+04 +the most stringent linear stability constraint was found at the following ocean cell: +long( 205, 249) = -0.7555040E+02 +lat ( 205, 249) = 0.6567656E+02 +thick( 205, 249, 5)= 0.1000000E+01 +A_max = 0.2025624E+03 (m^2/sec) is the maximum neutral diffusivity +available for linear stability of the neutral diffusion scheme. +Conservatively, neutral diffusivities used in the model should be less than A_max. +-------------------------------------------------------------------------------- + + + + &OCEAN_NPHYSICS_NEW_NML + USE_THIS_MODULE = F, + DRHODZ_SMOOTH_VERT = F, + DRHODZ_SMOOTH_HORZ = F, + SMAX = 1.000000000000000E-002, + VEL_MICOM_SMOOTH = 0.200000000000000 + / + + + &OCEAN_NPHYSICS_UTIL_NEW_NML + NUM_121_PASSES = 1 + / + +[Note] ocean_nphysics_new.F90: NOT using ocean_nphysics_new. + + + &OCEAN_SUBMESOSCALE_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + DIAG_STEP = 1200, + USE_HBLT_CONSTANT = F, + USE_HBLT_EQUAL_MLD = T, + SMOOTH_HBLT = F, + SMOOTH_HBLT_NUM = 2, + CONSTANT_HBLT = 100.000000000000 , + COEFFICIENT_CE = 5.000000000000000E-002, + TIME_CONSTANT = 86400.0000000000 , + FRONT_LENGTH_CONST = 5000.00000000000 , + MIN_KBLT = 4, + MINIMUM_HBLT = 0.000000000000000E+000, + SMOOTH_PSI = T, + SMOOTH_PSI_NUM = 2, + FRONT_LENGTH_DEFORM_RADIUS = T, + LIMIT_PSI = T, + USE_PSI_LEGACY = F, + LIMIT_PSI_VELOCITY_SCALE = 0.500000000000000 , + SUBMESO_LIMIT_FLUX = T, + SMOOTH_ADVECT_TRANSPORT = T, + SMOOTH_ADVECT_TRANSPORT_NUM = 2, + SUBMESO_SKEW_FLUX = T, + SUBMESO_ADVECT_FLUX = F, + SUBMESO_ADVECT_UPWIND = T, + SUBMESO_ADVECT_SWEBY = F, + SUBMESO_ADVECT_LIMIT = T, + SUBMESO_ADVECT_ZERO_BDY = T, + SUBMESO_DIFFUSION = F, + SUBMESO_DIFFUSION_SCALE = 10.0000000000000 , + SUBMESO_DIFFUSION_BIHARMONIC = T + / +NOTE from PE 0: ==>Note: USING ocean_submesoscale_mod +==>Note: For ocean_submesoscale, setting bldepth equal to diagnosed mld. +==>Note: For ocean_submesoscale, tendency computed as skew flux convergence. + mdfl domain decomposition +whalo = 2, ehalo = 2, shalo = 2, nhalo = 2 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + flux dom submeso domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + + + &OCEAN_LAP_FRICTION_NML + LAP_FRICTION_SCHEME = general , + DEBUG_THIS_MODULE = F, + WRITE_A_RESTART = T + / +==>Note from ocean_lap_friction_init: general laplacian friction scheme for B-grid is used. + + + &OCEAN_LAPGEN_FRICTION_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + BOTTOM_5POINT = T, + K_SMAG_ISO = 0.000000000000000E+000, + K_SMAG_ANISO = 0.000000000000000E+000, + VEL_MICOM_ISO = 0.100000000000000 , + VEL_MICOM_ANISO = 0.000000000000000E+000, + EQ_VEL_MICOM_ISO = 0.000000000000000E+000, + EQ_VEL_MICOM_ANISO = 0.000000000000000E+000, + EQ_LAT_MICOM = 0.000000000000000E+000, + EQUATORIAL_ZONAL = F, + EQUATORIAL_ZONAL_LAT = 0.000000000000000E+000, + EQUATORIAL_NO_SMAG = F, + VISCOSITY_NCAR = F, + VISCOSITY_NCAR_2000 = T, + VISCOSITY_NCAR_2007 = F, + NCAR_ISOTROPIC_OFF_EQUATOR = F, + NCAR_ONLY_EQUATORIAL = F, + VCONST_1 = 10000000.0000000 , + VCONST_2 = 0.000000000000000E+000, + VCONST_3 = 0.160000000000000 , + VCONST_4 = 2.000000000000000E-008, + VCONST_5 = 3, + VCONST_6 = 10000000.0000000 , + VCONST_7 = 100.000000000000 , + VCONST_8 = 45.0000000000000 , + DEBUG_NCAR_A = F, + DEBUG_NCAR_B = F, + VISC_VEL_SCALE_LENGTH = 150000.000000000 , + NEPTUNE = F, + NEPTUNE_LENGTH_EQ = 1200.00000000000 , + NEPTUNE_LENGTH_POLE = 3000.00000000000 , + NEPTUNE_DEPTH_MIN = 100.000000000000 , + NEPTUNE_SMOOTH = T, + NEPTUNE_SMOOTH_NUM = 1, + RESTRICT_POLAR_VISC = T, + RESTRICT_POLAR_VISC_LAT = 60.0000000000000 , + RESTRICT_POLAR_VISC_RATIO = 0.350000000000000 , + NCAR_ISOTROPIC_AT_DEPTH = F, + NCAR_ISOTROPIC_DEPTH = 4000.00000000000 , + NCAR_ISOTROPIC_AT_DEPTH_VISC = 10000.0000000000 , + DIVERGENCE_DAMP = F, + DIVERGENCE_DAMP_VEL_MICOM = 0.000000000000000E+000, + VISCOSITY_SCALE_BY_ROSSBY = T, + VISCOSITY_SCALE_BY_ROSSBY_POWER = 4.00000000000000 , + ASYNC_DOMAIN_UPDATE = F, + BLOCKSIZE = 10, + USE_SIDE_DRAG_FRICTION = F, + SIDE_DRAG_FRICTION_SCALING = 1.00000000000000 , + SIDE_DRAG_FRICTION_UVMAG_MAX = 10.0000000000000 , + SIDE_DRAG_FRICTION_MAX = 1.00000000000000 + / +NOTE from PE 0: ==> NOTE: USING ocean_lapgen_friction_mod. +==>Note: not using asynchronous domain update in the vertical loop. This may be slow. + +==> Note from ocean_lapgen_friction_mod: using forward time step of (secs) 5400.00 + ==> Note: Scaling the laplacian viscosity according to grid scale and Rossby radius. + ==> Note: Will reduce horizontal friction to a 5point Laplacian on the bottom + This helps to alleviate numerical problems with thin bottom partial cells. + ==> NOTE: Setting horz isotropic Smagorinsky viscosity to zero. + ==> NOTE: Setting horz anisotropic Smagorinsky viscosity to zero. + ==> NOTE: NOT using NCAR scheme for computing viscosities. + ==> NOTE: USING background horz isotropic viscosity via MICOM. + ==> NOTE: USING zero background horz anisotropic viscosity. + + Using restrict_polar_visc to lower visc_crit poleward of (deg) 60.00000 + by an amount given by the fraction 0.35000 + This approach is useful when coupling to ice, where effective (ocn+ice) visc > ocn visc. + + + + &OCEAN_BIH_FRICTION_NML + BIH_FRICTION_SCHEME = general , + DEBUG_THIS_MODULE = F, + WRITE_A_RESTART = T + / +==>Note from ocean_bih_friction_init: general biharmonic friction scheme for B-grid is used. + + + &OCEAN_BIHGEN_FRICTION_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + K_SMAG_ISO = 2.00000000000000 , + K_SMAG_ANISO = 0.000000000000000E+000, + VEL_MICOM_ISO = 4.000000000000000E-002, + VEL_MICOM_ANISO = 0.000000000000000E+000, + EQ_VEL_MICOM_ISO = 0.000000000000000E+000, + EQ_VEL_MICOM_ANISO = 0.000000000000000E+000, + EQ_LAT_MICOM = 0.000000000000000E+000, + VEL_MICOM_BOTTOM = 1.000000000000000E-002, + BOTTOM_5POINT = T, + EQUATORIAL_ZONAL = F, + EQUATORIAL_ZONAL_LAT = 0.000000000000000E+000, + VISC_CRIT_SCALE = 0.250000000000000 , + READ_AISO_BIH_BACK = F, + NCAR_BOUNDARY_SCALING = T, + NCAR_RESCALE_POWER = 2, + NCAR_VCONST_4 = 2.000000000000000E-008, + NCAR_VCONST_5 = 5, + NCAR_BOUNDARY_SCALING_READ = F, + NEPTUNE = F, + NEPTUNE_LENGTH_EQ = 4200.00000000000 , + NEPTUNE_LENGTH_POLE = 17000.0000000000 , + NEPTUNE_DEPTH_MIN = 100.000000000000 , + NEPTUNE_SCALING = 1.00000000000000 , + NEPTUNE_SMOOTH = T, + NEPTUNE_SMOOTH_NUM = 1, + VISC_DIVERGE_SCALING = 0.000000000000000E+000, + USE_SIDE_DRAG_FRICTION = F, + SIDE_DRAG_FRICTION_SCALING = 1.00000000000000 , + SIDE_DRAG_FRICTION_UVMAG_MAX = 10.0000000000000 , + SIDE_DRAG_FRICTION_MAX = 1.00000000000000 + / +NOTE from PE 0: ==> NOTE: USING ocean_bihgen_friction_mod. + + +==> Note from ocean_bihgen_friction_mod: using forward time step of (secs) 5400.00 + + + + ==> NOTE: Will make horizontal friction to a 5point Laplacian on the bottom + This helps alleviate numerical problems with thin bottom partial cells. + Computing horziontal isotropic biharmonic viscosity via Smagorinsky. + Setting horzizontal anisotropic biharmonic Smagorinsky viscosity to zero. + Computing background horzizontal biharmonic isotropic viscosity via MICOM. + Setting background horziontal biharmonic anisotropic viscosity to zero. + Note: rescaling background bih viscosities so they are larger in western boundaries. +From ncar_boundary_scale, minimum ncar_rescale = 0.100000E+01 +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 6) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 7) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 8) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 9) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 10) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 11) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 12) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 13) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 14) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 15) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 16) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 17) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 18) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 19) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 20) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 21) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 22) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 23) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 24) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 25) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 26) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 27) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 28) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 29) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 22) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 23) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 24) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 25) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 26) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 27) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 28) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 29) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 36, 112, 50) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 106, 50) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 5) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 6) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 7) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 8) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 9) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 10) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 11) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 12) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 13) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 14) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 15) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 16) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 17) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 18) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 19) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 20) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 21) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 22) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 23) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 24) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 25) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 26) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 27) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 28) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 29) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 44, 111, 50) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 107, 50) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 5) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 6) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 7) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 8) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 9) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 10) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 11) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 12) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 13) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 14) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 15) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 16) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 17) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 18) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 19) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 20) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 21) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 22) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 23) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 24) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 25) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 26) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 27) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 28) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 29) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 108, 50) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 5) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 6) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 7) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 8) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 9) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 10) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 11) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 12) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 13) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 14) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 15) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 16) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 17) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 18) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 19) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 20) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 21) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 22) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 23) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 24) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 25) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 26) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 27) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 28) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 29) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 30) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 31) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 32) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 33) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 34) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 35) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 36) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 37) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 38) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 39) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 40) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 41) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 42) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 43) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 44) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 45) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 46) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 47) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 48) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 49) set over land. Is your table correct? +==>Warning ocean_momentum_source_init: ignored nonzero rayleigh_damp_table( 62, 109, 50) set over land. Is your table correct? + + + &OCEAN_MOMENTUM_SOURCE_NML + VERBOSE_INIT = T, + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + USE_RAYLEIGH_DAMP_TABLE = T, + RAYLEIGH_DAMP_EXP_FROM_BOTTOM = F, + RAYLEIGH_DAMP_EXP_SCALE = 100.000000000000 , + RAYLEIGH_DAMP_EXP_TIME = 864000.000000000 + / +==>Note from ocean_momentum_source_mod: USING this module + ==>Note: ocean_momentum_source_init will read Rayleigh damping coefficients fro + m rayleigh_damp_table. + + + &OCEAN_FORM_DRAG_NML + VERBOSE_INIT = T, + USE_THIS_MODULE = F, + DEBUG_THIS_MODULE = F, + USE_FORM_DRAG_AIKI = F, + CPRIME_AIKI = 0.300000000000000 , + FORM_DRAG_AIKI_BOTTOM_LAYER = F, + FORM_DRAG_AIKI_BOTTOM_KLEVELS = 3, + FORM_DRAG_AIKI_SCALE_BY_GRADH = F, + FORM_DRAG_AIKI_GRADH_MAX = 5.000000000000000E-002, + FORM_DRAG_AIKI_GRADH_POWER = 1.00000000000000 , + FORM_DRAG_AIKI_SCALE_BY_GM = F, + USE_FORM_DRAG_GBATCH = F, + VISC_CBU_FORM_DRAG_MAX = 1.00000000000000 , + VEL_FORM_DRAG_MAX = 1.00000000000000 , + N_SQUARED_MIN = 1.000000000000000E-010, + AGM_FORM_DRAG = 600.000000000000 , + FORM_DRAG_GBATCH_SURF_LAYER = F, + KSURF_BLAYER_MIN = 3, + FORM_DRAG_GBATCH_ALPHA_F2 = F, + FORM_DRAG_GBATCH_ALPHA = 300000000.000000 , + FORM_DRAG_GBATCH_F2OVERN2 = F, + FORM_DRAG_GBATCH_F2OVERNB2 = F, + FORM_DRAG_GBATCH_SMOOTH_N2 = F, + NUM_121_PASSES = 1, + FORM_DRAG_GBATCH_F2OVERNO2 = F, + FORM_DRAG_GBATCH_NO = 5.000000000000000E-003 + / +NOTE from PE 0: ==>Note from ocean_form_drag_mod: NOT USING this module + + + &OCEAN_TRACER_ADVECT_NML + DEBUG_THIS_MODULE = F, + LIMIT_WITH_UPWIND = F, + ADVECT_SWEBY_ALL = F, + ZERO_TRACER_ADVECT_HORZ = F, + ZERO_TRACER_ADVECT_VERT = F, + WRITE_A_RESTART = T, + PSOM_LIMIT_PRATHER = F, + READ_BASIN_MASK = F, + ASYNC_DOMAIN_UPDATE = F + / + + From ocean_tracer_advect_init: SUMMARY OF TRACER ADVECTION SCHEMES + temp is using multi-dim piecewise parabolic for horz/vert advection. + salt is using multi-dim piecewise parabolic for horz/vert advection. + age_global is using multi-dim piecewise parabolic for horz/vert advection. + + flux domain decomposition +whalo = 1, ehalo = 1, shalo = 1, nhalo = 1 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + fourth domain decomposition +whalo = 2, ehalo = 2, shalo = 2, nhalo = 2 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + sixth domain decomposition +whalo = 3, ehalo = 3, shalo = 3, nhalo = 3 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + quicker domain decomposition +whalo = 2, ehalo = 2, shalo = 2, nhalo = 2 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + mdfl domain decomposition +whalo = 2, ehalo = 2, shalo = 2, nhalo = 2 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + mdppm domain decomposition +whalo = 4, ehalo = 4, shalo = 4, nhalo = 4 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + mdmdt domain decomposition +whalo = 4, ehalo = 4, shalo = 4, nhalo = 4 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + + + &OCEAN_VELOCITY_ADVECT_NML + DEBUG_THIS_MODULE = F, + ZERO_VELOCITY_ADVECT_HORZ = F, + ZERO_VELOCITY_ADVECT_VERT = F, + VELOCITY_ADVECT_CENTERED = T, + VELOCITY_ADVECT_UPWIND = F + / + ==>Note: running MOM with traditional second order centred advection of linear + momentum. + + + &OCEAN_CONVECT_NML + USE_THIS_MODULE = F, + CONVECT_NCON = F, + NCON = 7, + CONVECT_FULL_SCALAR = F, + CONVECT_FULL_VECTOR = F + / +==>Note: NOT using convective adjustment in gravitationally unstable water columns. + + + &OCEAN_SBC_NML + TEMP_RESTORE_TSCALE = -10.0000000000000 , + SALT_RESTORE_TSCALE = 21.2800000000000 , + SALT_RESTORE_UNDER_ICE = T, + SALT_RESTORE_AS_SALT_FLUX = T, + ETA_RESTORE_TSCALE = -30.0000000000000 , + ZERO_NET_PME_ETA_RESTORE = F, + ROTATE_WINDS = F, + TAUX_SINX = F, + TAUY_SINY = F, + USE_WATERFLUX = T, + WATERFLUX_TAVG = F, + MAX_ICE_THICKNESS = 0.000000000000000E+000, + RUNOFFSPREAD = F, + CALVINGSPREAD = F, + USE_WATERFLUX_OVERRIDE_CALVING = F, + USE_WATERFLUX_OVERRIDE_EVAP = F, + USE_WATERFLUX_OVERRIDE_FPREC = F, + SALINITY_REF = 35.0000000000000 , + ZERO_NET_SALT_RESTORE = T, + ZERO_NET_WATER_RESTORE = T, + ZERO_NET_WATER_COUPLER = T, + ZERO_NET_WATER_COUPLE_RESTORE = T, + ZERO_NET_SALT_CORRECTION = F, + ZERO_NET_WATER_CORRECTION = F, + DEBUG_WATER_FLUXES = F, + ZERO_WATER_FLUXES = F, + ZERO_CALVING_FLUXES = F, + ZERO_PME_FLUXES = F, + ZERO_RUNOFF_FLUXES = F, + ZERO_RIVER_FLUXES = F, + CONVERT_RIVER_TO_PME = F, + ZERO_HEAT_FLUXES = F, + ZERO_SURFACE_STRESS = F, + AVG_SFC_VELOCITY = T, + AVG_SFC_TEMP_SALT_ETA = T, + ICE_SALT_CONCENTRATION = 5.000000000000000E-003, + OCEAN_ICE_SALT_LIMIT = 0.000000000000000E+000, + RUNOFF_SALINITY = 0.000000000000000E+000, + RUNOFF_TEMP_MIN = 0.000000000000000E+000, + READ_RESTORE_MASK = F, + RESTORE_MASK_GFDL = F, + LAND_MODEL_HEAT_FLUXES = F, + USE_FULL_PATM_FOR_SEA_LEVEL = F, + MAX_DELTA_SALINITY_RESTORE = -0.500000000000000 , + DO_FLUX_CORRECTION = F, + SALINITY_RESTORE_LIMIT_LOWER = 0.000000000000000E+000, + SALINITY_RESTORE_LIMIT_UPPER = 100.000000000000 , + TEMP_CORRECTION_SCALE = 0.000000000000000E+000, + SALT_CORRECTION_SCALE = 0.000000000000000E+000, + TAU_X_CORRECTION_SCALE = 0.000000000000000E+000, + TAU_Y_CORRECTION_SCALE = 0.000000000000000E+000, + DO_BITWISE_EXACT_SUM = T, + SBC_HEAT_FLUXES_CONST = F, + SBC_HEAT_FLUXES_CONST_VALUE = 0.000000000000000E+000, + SBC_HEAT_FLUXES_CONST_SEASONAL = F, + USE_CONSTANT_SSS_FOR_RESTORE = F, + CONSTANT_SSS_FOR_RESTORE = 35.0000000000000 , + USE_CONSTANT_SST_FOR_RESTORE = F, + CONSTANT_SST_FOR_RESTORE = 12.0000000000000 , + USE_IDEAL_CALVING = F, + USE_IDEAL_RUNOFF = F, + CONSTANT_HLF = T, + CONSTANT_HLV = T, + READ_STOKES_DRIFT = F, + DO_LANGMUIR = F, + DO_USTAR_CORRECTION = T, + DO_FRAZIL_REDIST = T + / + + + &OCEAN_SBC_OFAM_NML + RESTORE_MASK_OFAM = F, + RIVER_TEMP_OFAM = F + / + sbc domain decomposition +whalo = 0, ehalo = 0, shalo = 0, nhalo = 0 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + ==>Note from ocean_sbc_mod: applying surface restoring to salt + +==>Note from ocean_sbc_mod: if inputting river water, enable rivermix_mod to get river tracers into ocean. + + ==>Note from ocean_sbc_mod: temp_restore_tscale < 0. no surface restoring for t + emp + ==>Note from ocean_sbc_mod: salt_restore_under_ice=.true. => sss restore even u + nder ice. + ==>Note from ocean_sbc_mod: zero_net_water_restore=.true.=>zero net restoring w + ater put in ocean. + ==>Note from ocean_sbc_mod: zero_net_water_correction=.false.=>nonzero net corr + ection water put in ocean. + ==>Note from ocean_sbc_mod: zero_net_water_coupler=.true.=>zero water into ocea + n via coupler (sans the sea ice). + ==>ocean_sbc_mod: zero_net_water_couple_restore=.true.=>zero water into ocean f + rom restore + coupler (sans the sea ice). + ==>Note from ocean_sbc_mod: eta_restore_tscale < 0. no surface restoring for et + a + ==>If coupling, then avg_sfc_velocity=.true. means will pass averaged ocean vel + ocity to ice model. + ==>If coupling, then avg_sfc_temp_salt_eta=.true. means will pass averaged sst, + sss, eta to ice model. + ==>Note from ocean_sbc_mod: Using constant latent heat of fusion at ocean surfa + ce. + ==>Note from ocean_sbc_mod: Using constant latent heat of evaporation at ocean + surface. + ==>Note that diagnose_sea_level_forcing==.false., so no "eta_tend_" fields will + be diagnosed. + + + &OCEAN_BBC_NML + BMF_IMPLICIT = T, + CDBOT = 2.500000000000000E-003, + URESIDUAL = 5.000000000000000E-002, + CDBOT_LAW_OF_WALL = F, + LAW_OF_WALL_ROUGH_LENGTH = 1.000000000000000E-002, + CDBOT_ROUGHNESS_LENGTH = F, + USE_GEOTHERMAL_HEATING = F, + CONVERT_GEOTHERMAL = 1.000000000000000E-003, + CDBOT_HI = 7.000000000000000E-003, + CDBOT_LO = 1.000000000000000E-003, + CDBOT_GAMMA = 40.0000000000000 , + UVMAG_MAX = 10.0000000000000 , + BMF_MAX = 1.00000000000000 , + DEBUG_THIS_MODULE = F, + CDBOT_ROUGHNESS_UAMP = T, + CDBOT_HH = 1100.00000000000 , + CDBOT_UU = 1.00000000000000 , + CDBOT_WAVE = F + / + + + &OCEAN_BBC_OFAM_NML + READ_TIDE_SPEED = F, + URESIDUAL2_MAX = 5.000000000000000E-002 + / +==>Note: NOT reading tide_speed for ocean_vert_tidal_mod. +NOTE from PE 0: ==>ocean_vert_tidal_mod: Setting tide_speed to default value. +==>Note from ocean_bbc_mod: Computing bottom drag implicitly in time. + ==>ocean_bbc_mod: read in topographic roughness length, assumed to be on B-grid + velocity point. + ==>ocean_bbc_mod: completed read of tidal velocity amplitude, assumed to be on + B-grid velocity point. + + + &OCEAN_SHORTWAVE_NML + USE_THIS_MODULE = T, + USE_SHORTWAVE_GFDL = T, + USE_SHORTWAVE_CSIRO = F, + USE_SHORTWAVE_JERLOV = F, + USE_SHORTWAVE_EXT = F + / +NOTE from PE 0: ==>Note: USING shortwave_mod. + + + &OCEAN_SHORTWAVE_GFDL_NML + USE_THIS_MODULE = T, + READ_CHL = T, + CHL_DEFAULT = 8.000000000000000E-002, + ZMAX_PEN = 1000000.00000000 , + SW_FRAC_TOP = 0.000000000000000E+000, + DEBUG_THIS_MODULE = F, + ENFORCE_SW_FRAC = T, + OVERRIDE_F_VIS = T, + SW_MOREL_FIXED_DEPTHS = F, + OPTICS_FOR_UNIFORM_CHL = F, + OPTICS_MOREL_ANTOINE = F, + OPTICS_MANIZZA = T + / +NOTE from PE 0: ==>Note: USING shortwave_gfdl_mod. +=>Note: Using shortwave penetration with GFDL formulaton & Manizza etal optics. +NOTE from PE 0: ==>Note: Reading in chlorophyll-a from data file for shortwave penetration. +=>Note: computing solar shortwave penetration. Assume stf has sw-radiation field + included. Hence, solar shortwave penetration effects placed in sw_source will + subtract out the effects of shortwave at k=1 to avoid double-counting. + ==>Note: Setting optical model coefficients assuming nonuniform chl distribution. + + + &OCEAN_SPONGES_TRACER_NML + USE_THIS_MODULE = F, + DAMP_COEFF_3D = F + / + + + &OCEAN_SPONGES_TRACER_OFAM_NML + USE_ADAPTIVE_RESTORE = F, + USE_SPONGE_AFTER_INIT = F, + USE_NORMALISING = F, + USE_HARD_THUMP = F, + ATHRESH = 0.500000000000000 , + TAUMIN = 720.000000000000 , + LAMBDA = 8.300000000000000E-003, + NPOWER = 1.00000000000000 , + DAYS_TO_RESTORE = 1, + SECS_TO_RESTORE = 0, + DEFLATE = F, + DEFLATE_FRACTION = 0.600000000000000 , + LIMIT_TEMP = F, + LIMIT_TEMP_MIN = -1.80000000000000 , + LIMIT_TEMP_RESTORE = 10800.0000000000 , + LIMIT_SALT = F, + LIMIT_SALT_MIN = 1.000000000000000E-002, + LIMIT_SALT_RESTORE = 3600.00000000000 + / + ==>Note from ocean_sponges_tracer_mod: NOT using ocean tracer sponges. + + + &OCEAN_SPONGES_VELOCITY_NML + USE_THIS_MODULE = F, + DAMP_COEFF_3D = F + / + + + &OCEAN_SPONGES_VELOCITY_OFAM_NML + USE_ADAPTIVE_RESTORE = F, + USE_SPONGE_AFTER_INIT = F, + USE_NORMALISING = F, + USE_HARD_THUMP = F, + ATHRESH = 0.500000000000000 , + TAUMIN = 720.000000000000 , + LAMBDA = 8.300000000000000E-003, + NPOWER = 1.00000000000000 , + DAYS_TO_RESTORE = 1, + SECS_TO_RESTORE = 0 + / + ==>Note from ocean_sponges_velocity_mod: NOT using this module: no velocity spo + nges. + + + &OCEAN_SPONGES_ETA_NML + USE_THIS_MODULE = F + / + + + &OCEAN_SPONGES_ETA_OFAM_NML + USE_ADAPTIVE_RESTORE = F, + USE_SPONGE_AFTER_INIT = F, + USE_NORMALISING = F, + USE_HARD_THUMP = F, + ATHRESH = 0.500000000000000 , + TAUMIN = 720.000000000000 , + LAMBDA = 8.300000000000000E-003, + NPOWER = 1.00000000000000 , + DAYS_TO_RESTORE = 1, + SECS_TO_RESTORE = 0 + / + ==>Note from ocean_sponges_eta_mod: NOT using this module. + + ==>Warning: ocean_xlandinsert_init found n < 1 for xland_insert table. Will NO + T use ocean_xlandinsert. + + + ==>Warning: ocean_riverspread_init: n<1 for riverspread table. Will NOT use tab + le for ocean_riverspread. + + + &OCEAN_RIVERSPREAD_NML + USE_THIS_MODULE = F, + DEBUG_THIS_MODULE = F, + RIVERSPREAD_DIFFUSION = F, + RIVERSPREAD_DIFFUSION_PASSES = 0, + VEL_MICOM_SMOOTH = 0.200000000000000 + / +NOTE from PE 0: ==>From ocean_riverspread_mod: NOT using riverspread module, yet there are n > 0 riverspread points. + + + &OCEAN_RIVERMIX_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + DEBUG_ALL_IN_TOP_CELL = F, + DEBUG_THIS_MODULE_HEAT = F, + RIVER_DIFFUSE_TEMP = T, + RIVER_DIFFUSE_SALT = T, + RIVER_DIFFUSION_THICKNESS = 0.000000000000000E+000, + RIVER_DIFFUSIVITY = 0.000000000000000E+000, + DISCHARGE_COMBINE_RUNOFF_CALVE = T, + RIVER_INSERTION_THICKNESS = 40.0000000000000 , + RUNOFF_INSERTION_THICKNESS = 0.000000000000000E+000, + CALVING_INSERTION_THICKNESS = 0.000000000000000E+000, + DO_BITWISE_EXACT_SUM = F + / +NOTE from PE 0: ==>From ocean_rivermix_mod: Using rivermix module to mix liquid and/or solid runoff into the ocean. +==>Note: discharging calving+runoff together. The alternative is to separately discharge. +==>Note: if using waterflux and rivers, then will + discharge river tracer over 9 grid points in vertical +NOTE from PE 0: ==>Note: resetting river_diffusion_thickness=dzt(1) for enhanced diff_cbt of temperature. +NOTE from PE 0: ==>Note: resetting river_diffusion_thickness=dzt(1) for enhanced diff_cbt of salt and passive + + + &OCEAN_OVEREXCHANGE_NML + USE_THIS_MODULE = F, + DEBUG_THIS_MODULE = F, + OVEREXCH_NPTS = 1, + OVEREXCH_WIDTH = 1, + OVEREXCH_WEIGHT_FAR = F, + OVERFLOW_MU = 1.000000000000000E-004, + OVERFLOW_DELTA = 0.333300000000000 , + OVERFLOW_UMAX = 1.00000000000000 , + DO_BITWISE_EXACT_SUM = F, + OVEREXCH_STABILITY = 0.250000000000000 , + OVEREXCH_MIN_THICKNESS = 4.00000000000000 , + OVEREXCH_CHECK_EXTREMA = F + / +NOTE from PE 0: ==>From ocean_overexchange_mod: NOT using overflow exchange scheme. + + + &OCEAN_MIXDOWNSLOPE_NML + USE_THIS_MODULE = T, + DEBUG_THIS_MODULE = F, + MIXDOWNSLOPE_NPTS = 4, + MIXDOWNSLOPE_WIDTH = 1, + MIXDOWNSLOPE_WEIGHT_FAR = F, + MIXDOWNSLOPE_FRAC_CENTRAL = 0.250000000000000 , + DO_BITWISE_EXACT_SUM = F, + READ_MIXDOWNSLOPE_MASK = F, + MIXDOWNSLOPE_MASK_GFDL = F + / +NOTE from PE 0: ==>From ocean_mixdownslope_mod: USING downslope mixing scheme. + In ocean_mixdownslope_mod: mixdownslope_npts = 4 + Be sure this number is smaller than dimensions of computational domain. + mixdownslope domain decomposition +whalo = 4, ehalo = 4, shalo = 4, nhalo = 4 + X-AXIS = 23 23 23 23 22 22 22 22 22 22 22 22 23 23 23 23 + Y-AXIS = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + + + &OCEAN_OVERFLOW_NML + USE_THIS_MODULE = F, + DEBUG_THIS_MODULE = F, + OVERFLOW_MU = 1.000000000000000E-004, + OVERFLOW_DELTA = 0.333300000000000 , + OVERFLOW_UMAX = 1.000000000000000E-002, + DO_BITWISE_EXACT_SUM = F, + NO_RETURN_FLOW = F, + TRANSPORT_UNITS = Sv + / +NOTE from PE 0: ==>From ocean_overflow_mod: NOT using Campin and Goosse overflow scheme. + +==>Warning: ocean_overflow_OFP_init found n_src < 1 for overflow_OFP table. Will NOT use ocean_overflow_OFP. + + + ==>Note from fm_util_mod(fm_util_start_namelist)[ocean_age_tracer_mod(ocean_age + _tracer_start)]: Processing namelist ocean_age_tracer/global + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Assigning month + 1 + + ==>Note from ocean_age_tracer_mod(set_array): age_global region: 1 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 2 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 3 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 4 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 5 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 6 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 7 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 8 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 9 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 10 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 11 + ==>Note from ocean_age_tracer_mod(ocean_age_tracer_start): Duplicating month + 1 as 12 + + + &OCEAN_ADV_VEL_DIAG_NML + MAX_CFL_VALUE = 100.000000000000 , + LARGE_CFL_VALUE = 10.0000000000000 , + VERBOSE_CFL = T, + DIAG_STEP = 4320 + / + + +==>Maximum T-->U remapping error = 6.193E-07 m/s at (i,j) = (345,273), (lon,lat) = ( 68.16, 68.66) +==>Note: T-->U remapping error will be small (i.e., order 1e-20) only for spherical grids. + + + &OCEAN_TRACER_DIAG_NML + TRACER_CONSERVE_DAYS = 30.0000000000000 , + DIAG_STEP = 4320, + PSU2PPT = 1.00486700000000 , + DEBUG_DIAGNOSE_MIXINGA = F, + DEBUG_DIAGNOSE_MIXINGB = F, + DEBUG_DIAGNOSE_MIXINGC = F, + DEBUG_DIAGNOSE_MIXINGD = F, + SMOOTH_KAPPA_SORT = 0, + RHO_GRAD_MIN = 1.000000000000000E-005, + RHO_GRAD_MAX = 1.000000000000000E+028, + BUOYANCY_CRIT = 3.000000000000000E-004, + DO_BITWISE_EXACT_SUM = F, + FRAZIL_FACTOR = 1.00000000000000 , + SMOOTH_MLD = F, + SMOOTH_MLD_FOR_SUBDUCTION = T, + DTHETA_CRIT = 2.00000000000000 + / + +Note: tracer and mass/volume conservation tests based on time_tendency==twolevel. + + Note: Set frazil_factor = 1.00 for computation of heat diagnostics. + Be sure this agrees with the value set in nml for ocean_frazil_mod + + + &OCEAN_VELOCITY_DIAG_NML + DIAG_STEP = 4320, + ENERGY_DIAG_STEP = 4320, + DO_BITWISE_EXACT_SUM = F, + DEBUG_THIS_MODULE = F, + MAX_CFL_VALUE = 100.000000000000 , + LARGE_CFL_VALUE = 10.0000000000000 , + VERBOSE_CFL = F, + LAND_CELL_NUM_MAX = 100 + / + + + &OCEAN_INCREMENT_ETA_NML + USE_THIS_MODULE = F, + FRACTION_INCREMENT = 1.00000000000000 , + DAYS_TO_INCREMENT = 1, + SECS_TO_INCREMENT = 0 + / + + + &OCEAN_INCREMENT_TRACER_NML + USE_THIS_MODULE = F, + FRACTION_INCREMENT = 1.00000000000000 , + DAYS_TO_INCREMENT = 1, + SECS_TO_INCREMENT = 0 + / + + + &OCEAN_INCREMENT_VELOCITY_NML + USE_THIS_MODULE = F, + FRACTION_INCREMENT = 1.00000000000000 , + DAYS_TO_INCREMENT = 1, + SECS_TO_INCREMENT = 0 + / + + + &OCEAN_WAVE_NML + WAVEDAMP = -10.0000000000000 , + DAMP_WHERE_ICE = T, + WRITE_A_RESTART = T, + DEBUG_THIS_MODULE = F, + USE_TMA = T, + FILTER_WAVE_MOM = T, + USE_THIS_MODULE = F + / +==>Note: Not using the idealized ocean surface wave module. + auscom_ice_nml= + + + &AUSCOM_ICE_NML + DT_CPL = 0, + TLTHK0 = 10.0000000000000 , + POP_ICEDIAG = T, + DO_ICE_ONCE = F, + KMXICE = 5, + FIXMELTT = F, + TMELT = -0.216000000000000 , + LIMIT_SRFSTRESS = F, + MSTRESS = 2.00000000000000 , + USE_IOAICE = T, + AICE_CUTOFF = 0.150000000000000 , + ICEMLT_FACTOR = 1.00000000000000 , + FRAZIL_FACTOR = 1.00000000000000 , + ICEFORM_ADJ_SALT = F, + SIGN_STFLX = 1.00000000000000 , + REDSEA_GULFBAY_SFIX = F, + IRS1 = 314, + IRE1 = 324, + JRS1 = 169, + JRE1 = 196, + IRS2 = 325, + IRE2 = 331, + JRS2 = 169, + JRE2 = 180, + IGS = 328, + IGE = 345, + JGS = 189, + JGE = 198, + KSMAX = 5, + SFIX_HOURS = 12, + DO_SFIX_AT_START = F, + CHK_I2O_FIELDS = F, + CHK_O2I_FIELDS = F, + CHK_FIELDS_PERIOD = 1, + CHK_FIELDS_START_TIME = 0 + / + + + &OCEAN_DRIFTERS_NML + USE_THIS_MODULE = F, + OUTPUT_INTERVAL = 1 + / + + ======== COMPLETED MOM INITIALIZATION ======== + + + + &MOM_OASIS3_INTERFACE_NML + NUM_FIELDS_IN = 17, + NUM_FIELDS_OUT = 7, + FIELDS_IN = u_flux v_flux lprec fprec salt_flxmh_flux sw_flux q_flux t_flux lw_flux runof p aice wfimelt wfiform licefw liceht , + FIELDS_OUT = t_surf s_surf u_surf v_surf dssldx dssldy frazil , + SEND_BEFORE_OCEAN_UPDATE = F, + SEND_AFTER_OCEAN_UPDATE = T, + FRAC_VIS_DIR = 0.215000000000000 , + FRAC_VIS_DIF = 0.215000000000000 , + FRAC_NIR_DIR = 0.285000000000000 , + FRAC_NIR_DIF = 0.285000000000000 + / + CICE_VERSION=202301 + cicexx: LIBACCESSOM2_VERSION=2.0.202212 +NOTE from PE 0: MPP_IO_SET_STACK_SIZE: stack size set to 460000. + + Ending temp chksum (taup1) ==> + + === Prognostic tracer checksum follows === +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] temp 7545926072668392930 + + Ending salt chksum (taup1) ==> + + === Prognostic tracer checksum follows === +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] salt -6460318925134188788 + + Ending age_global chksum (taup1) ==> + + === Prognostic tracer checksum follows === +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] age_global -2264750745304107183 + + Ending pot_temp chksum (diag) ==> + === Diagnostic tracer checksum follows === +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] pot_temp -1231025579416513895 + + Ending frazil chksum (diag) ==> + === Diagnostic tracer checksum follows === +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] frazil 2886833225635905730 + + From ocean_nphysics_coeff_end: ending chksum +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] ending agm_array 136505912869249989 +[chksum] ending aredi_array -5841239085443710976 +[chksum] ending rossby_radius 1018344707395653218 +[chksum] ending rossby_radius_raw -1967313038743695259 +[chksum] ending bczone_radius 0 + + From ocean_bih_friction_end: ending chksum +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] ending bih_viscosity -8366038681792779727 + + From ocean_lap_friction_end: ending chksum +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] ending lap_viscosity 4282876009757965617 + + From ocean_sigma_transport_mod: ending chksums +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] thickness_sigma -8922971025493857343 + + From ocean_velocity_mod: ending velocity chksum (taup1) +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] Zonal velocity 8922740144762992812 +[chksum] Meridional velocity 6810759182811944486 +[chksum] Advection of u -5761337654722229343 +[chksum] Advection of v -1518588548831679925 + + From ocean_barotropic_mod: ending external mode chksums at taup1 +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] eta_t -7643303129117768563 +[chksum] eta_u 4335153674007343634 +[chksum] deta_dt -4731158623285319520 +[chksum] eta_t_bar -2539382737297032752 +[chksum] pbot_t -5089330828196492646 +[chksum] pbot_u 8536052501137027772 +[chksum] dpbot_dt 0 +[chksum] anompb -7968761713393458496 +[chksum] anompb_bar 0 +[chksum] patm_t 0 +[chksum] dpatm_dt 0 +[chksum] ps -6273952104955748667 +[chksum] grad_ps_1 -3829201769181609948 +[chksum] grad_ps_2 -3586998115853265377 +[chksum] grad_anompb_1 0 +[chksum] grad_anompb_2 0 +[chksum] udrho -2669908285424828097 +[chksum] vdrho 3622748990756279145 +[chksum] conv_rho_ud_t -2981374551194158997 +[chksum] source 449088406912069258 +[chksum] eta smoother 449088406912069258 +[chksum] pbot smoother 0 +[chksum] eta_nonbouss 8720620272377679830 +[chksum] forcing_u_bt -6365243820425754853 +[chksum] forcing_v_bt 5332587263235255684 + +NOTE from PE 0: MPP_IO_SET_STACK_SIZE: stack size set to 469200. + + From ocean_thickness_mod: ending thickness checksums +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +ncfile created: ./RESTART/i2o.nc +[chksum] Thickness%rho_dzt(taup1) 8938551651288402083 +[chksum] Thickness%rho_dzu(taup1) 9097856201495518223 +[chksum] Thickness%mass_u(taup1) -4119591982426715508 +[chksum] Thickness%rho_dzten(1) 3245828328916392269 +[chksum] Thickness%rho_dzten(2) -5732678299602144116 +[chksum] Thickness%rho_dztr 5185722031152095224 +[chksum] Thickness%rho_dzur 5511880979934500710 +[chksum] Thickness%rho_dzt_tendency 7696702313963327787 +[chksum] Thickness%dzt 2592653947508724691 +[chksum] Thickness%dzten(1) -2940272069865901925 +[chksum] Thickness%dzten(2) 6504170165872752137 +[chksum] Thickness%dztlo 732700519349319924 +[chksum] Thickness%dztup 732634083460098581 +[chksum] Thickness%dzt_dst 2087681027450509173 +[chksum] Thickness%dzwt(k=0) -3827093499830983540 +[chksum] Thickness%dzwt(k=1:nk) 2024101905758120881 +[chksum] Thickness%dzu -6605743456808752599 +[chksum] Thickness%dzwu(k=0) 6504633577267880026 +[chksum] Thickness%dzwu(k=1:nk) 6198994589541357456 +[chksum] Thickness%depth_zt -769930805780118318 +[chksum] Thickness%geodepth_zt 5239684065229990142 +[chksum] Thickness%depth_zu -2586740127944684224 +[chksum] Thickness%depth_zwt 1482420673528295096 +[chksum] Thickness%depth_zwu -2312823509789010079 +[chksum] Thickness%depth_st -436572698594795605 +[chksum] Thickness%depth_swt 1807210613030518784 +[chksum] Thickness%dst 2929478174762860544 +[chksum] Thickness%dstlo 1069524742763059344 +[chksum] Thickness%dstup 1069458314554632048 +[chksum] Thickness%dswt(k=0) -3816777125227134976 +[chksum] Thickness%dswt(k=1:nk) 2356975803744414556 +[chksum] Thickness%pbot0 -5076855368579519850 +[chksum] Thickness%mass_en(1) 941724057156411220 +[chksum] Thickness%mass_en(2) 1400420897894443932 + +ncfile created: ./RESTART/u_star.nc +ncfile created: ./RESTART/sicemass.nc + + From ocean_density_mod: ending density chksums +yyyy/mm/dd hh:mm:ss = 1958/ 1/ 1 3: 0: 0 +[chksum] rho(taup1) -7836300473769660453 +[chksum] pressure_at_depth 3766338433422967267 +[chksum] denominator_r 1699359254996115987 +[chksum] drhodT 3686596329662716908 +[chksum] drhodS -7165071628708799152 +[chksum] drhodz_zt -3707801510282936917 + + + ==================Summary of completed MOM integration======================= + + Some of the basic physical parameters used in the simulation + Reference density for the Boussinesq approximation (kg/m^3) = 0.1035000000E+04 + Gravitational acceleration (m/s^2) = 0.9800000000E+01 + Rotational rate of the earth (radians/sec) = 0.7292100000E-04 + Specific heat capacity of seawater J/(kg*degC) = 0.3992103223E+04 + Specific heat capacity of liquid runoff J/(kg*degC) = 0.4218000000E+04 + Specific heat capacity of solid runoff J/(kg*degC) = 0.4218000000E+04 + Von Karman dimensionless constant for turbulent mixing = 0.4000000000E+00 + + Finished MOM integration using ZSTAR as the vertical coordinate. + B-grid was used for the horizontal layout of discrete variables. + number of time steps = 2 + number of prog-tracers = 3 + number of diag-tracers = 3 + number of i-points(ni) = 360 + number of j-points(nj) = 300 + number of k-points(nk) = 50 + number of computed ocean tracer points(ni*nj*nk) = 5400000 + number of wet ocean tracer points = 2707869 + number of wet ocean velocity points = 2572719 + slow motion time tendency computed using = twolevel + barotropic motion computed using = barotropic_pred_corr + tracer time step dtts (secs) = 5400.000000 + baroclinic velocity time step dtuv (secs) = 5400.000000 + barotropic time step dtbt (secs) = 67.500000 + implicit Coriolis parameter acor = 0.500000 + implicit vertical mixing parameter aidif = 1.000000 + + Did NOT use any open/radiating boundary conditions. + Did NOT use Lagrangian blobs. + Did NOT use velocity override + Computed Coriolis force on Bgrid using semi-implicit time stepping. + Time stepped the baroclinic velocity. + Time stepped the barotropic fields. + Time stepped the prognostic tracer fields. + preTEOS10 equation of state used for density. + Prognostic temperature variable is conservative temperature. + Frazil sea ice anywhere in ocean column with an accurate freezing temp equation. + KPP_mom4p1 used for vertical diffusivities & viscosity & barotropic tide drag. + Did NOT use convective adjustment. + Used tidal wave mixing option for vertical mixing. + Used tidal drag mixing option for vertical mixing. + Did NOT use Bryan-Lewis background vertical diffusivity. + Did NOT use HWF background vertical diffusivity. + Did NOT use tanh background vertical diffusivity. + Did NOT read background vertical diffusivity from file. + Used j09 background vertical diffusivity. + Did NOT use horizontal biharmonic tracer mixing. + Did NOT use horizontal laplacian tracer mixing. + Used general horizontal Laplacian friction. + Used general horizontal biharmonic friction. + Used momentum sources. + Did NOT use parameterized form drag. + Used bottom drag from map of bottom roughness w/ tidal amplitude from law of wall. + Used bottom drag computed implicitly in time. + Did NOT introduce geothermal heating. + Used neutral physics with nphysicsC algorithm. + Did NOT use neutral physics new option. + Used submesoscale closure for surface restratification. + Used ocean sigma transport option. + Did NOT use Campin and Goosse overflow scheme. + Did NOT use overflow exchange scheme. + Used the downslope mixing scheme. This scheme is experimental! + Used GFDL shortwave penetration module with Manizza etal optics. + Did NOT use xlandmix. + Did NOT use xlandinsert. + Used rivermix module to mix liquid and/or solid runoff into ocean. + Did NOT use riverspread module. + Did NOT use the idealized passive tracer module. + Did NOT use ocean eta sponges. + Did NOT use ocean tracer sponges. + Did NOT use ocean velocity sponges. + Did NOT include CMIP6/FAFMIP prognostic temperature tracers. + ==================================================== + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-area_t + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-area_u + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-drag_coeff + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-dxt + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-dxu + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-dyt + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-dyu + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-geolat_c + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-geolat_t + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-ht + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-hu + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-kmt + + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-kmu + +NOTE from PE 0: Potential error in diag_manager_end: age_global NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-age_global-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: buoyfreq2_wt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-buoyfreq2_wt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: diff_cbt_t NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-diff_cbt_t-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: dzt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-dzt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pot_rho_0 NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-pot_rho_0-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pot_rho_2 NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-pot_rho_2-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pot_temp NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-pot_temp-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: salt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-salt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_xflux_adv NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-temp_xflux_adv-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_yflux_adv NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-temp_yflux_adv-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-temp-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: tx_trans NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-tx_trans-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_gm NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-ty_trans_gm-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_nrho_submeso NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: MPP_IO_SET_STACK_SIZE: stack size set to 736000. +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_rho_gm NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_rho NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_submeso NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-ty_trans_submeso-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: ty_trans NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-ty_trans-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: u NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-u-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: v NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-v-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: vert_pv NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-vert_pv-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: wt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-wt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: u NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-u-1-monthly-pow02-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: v NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-3d-v-1-monthly-pow02-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: agm NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-agm-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: aredi NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-aredi-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: bmf_u NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-bmf_u-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: bmf_v NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-bmf_v-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: ekman_we NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-ekman_we-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: eta_nonbouss NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-eta_nonbouss-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: evap_heat NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-evap_heat-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: evap NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-evap-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: fprec_melt_heat NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-fprec_melt_heat-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: fprec NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-fprec-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: frazil_3d_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-frazil_3d_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: lprec NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-lprec-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: lw_heat NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-lw_heat-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: melt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-melt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: mh_flux NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-mh_flux-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: mld NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-mld-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: net_sfc_heating NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-net_sfc_heating-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pbot_t NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-pbot_t-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pme_net NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-pme_net-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pme_river NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-pme_river-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: river NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-river-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: runoff NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-runoff-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sea_level_sq NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sea_level_sq-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sea_level NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sea_level-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sens_heat NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sens_heat-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_coupler NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_coupler-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_from_runoff NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_from_runoff-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_pme NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_pme-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_salt_flux_coupler NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_salt_flux_coupler-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_salt_flux_ice NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_salt_flux_ice-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_salt_flux_restore NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_salt_flux_restore-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_pot_temp NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_pot_temp-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_salt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_salt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: swflx NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-swflx-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: tau_x NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-tau_x-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: tau_y NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-tau_y-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_int_rhodz NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_int_rhodz-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_xflux_adv_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_xflux_adv_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_xflux_gm_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_xflux_gm_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_xflux_ndiffuse_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_xflux_ndiffuse_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_xflux_submeso_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_xflux_submeso_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_yflux_adv_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_yflux_adv_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_yflux_gm_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_yflux_gm_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_yflux_ndiffuse_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_yflux_ndiffuse_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: temp_yflux_submeso_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-temp_yflux_submeso_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: tx_trans_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-tx_trans_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: ty_trans_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-ty_trans_int_z-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: wfiform NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-wfiform-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: wfimelt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-wfimelt-1-monthly-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: mld_max NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-mld-1-monthly-max-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_pot_temp_min NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_pot_temp-1-monthly-min-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: bottom_temp NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-bottom_temp-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: frazil_3d_int_z NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-frazil_3d_int_z-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: mld NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-mld-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: pme_river NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-pme_river-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sea_level NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sea_level-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_coupler NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_coupler-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_from_runoff NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_from_runoff-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sfc_hflux_pme NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sfc_hflux_pme-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_pot_temp NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_pot_temp-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_salt NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_salt-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: usurf NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-usurf-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: vsurf NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-vsurf-1-daily-mean-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: bottom_temp_max NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-bottom_temp-1-daily-max-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: sea_level_max NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-sea_level-1-daily-max-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_pot_temp_max NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_pot_temp-1-daily-max-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: surface_pot_temp_min NOT available, check if output interval > runlength. Netcdf fill_values are written + +WARNING from PE 0: diag_util_mod::opening_file: one axis has auxiliary but the corresponding field is NOT found in file ocean-2d-surface_pot_temp-1-daily-min-ym%4yr%2mo + +NOTE from PE 0: Potential error in diag_manager_end: eta_global NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: ke_tot NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: pe_tot NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: rhoave NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: salt_global_ave NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: salt_surface_ave NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: temp_global_ave NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: temp_surface_ave NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_net_sfc_heating NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_evap_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_evap NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_fprec_melt_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_fprec NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_hflux_coupler NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_hflux_evap NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_hflux_prec NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_lprec NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_lw_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_melt NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_mh_flux NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_pme_river NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_river_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_river NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_runoff_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_runoff NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_salt NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_sens_heat NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_sfc_salt_flux_coupler NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_swflx_vis NOT available, check if output interval > runlength. Netcdf fill_values are written +NOTE from PE 0: Potential error in diag_manager_end: total_ocean_swflx NOT available, check if output interval > runlength. Netcdf fill_values are written + ==================*** CICE END ***================= + MPP_DOMAINS_STACK high water mark= 204000 + +Tabulating mpp_clock statistics across 216 PEs... + + tmin tmax tavg tstd tfrac grain pemin pemax +Total runtime 3.981636 3.981729 3.981642 0.000006 1.000 0 0 215 +Initialization 1.701041 1.701777 1.701405 0.000143 0.427 0 0 215 +Main Loop 0.402630 0.403508 0.403110 0.000200 0.101 0 0 215 +Termination 1.857534 1.873408 1.864624 0.004016 0.468 0 0 215 +Ocean 0.263096 0.264347 0.263726 0.000334 0.066 1 0 215 +(Ocean initialization) 1.331626 1.411262 1.367991 0.015945 0.344 11 0 215 +(Ocean ODA) 0.000000 0.000000 0.000000 0.000000 0.000 11 0 215 +(Red Sea/Gulf Bay salinity fix) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean advection velocity) 0.002189 0.003626 0.003386 0.000119 0.001 31 0 215 +(Ocean density diag) 0.002918 0.003735 0.003312 0.000148 0.001 31 0 215 +(Ocean update density) 0.007978 0.009250 0.008710 0.000261 0.002 31 0 215 +(Ocean vertical mixing coeff) 0.014449 0.021416 0.017651 0.001275 0.004 31 0 215 +(Ocean neutral physics) 0.057735 0.061249 0.059396 0.000821 0.015 31 0 215 +(Ocean viscous form drag) 0.000172 0.000647 0.000441 0.000118 0.000 31 0 215 +(Ocean submesoscale restrat) 0.012411 0.016049 0.014133 0.000703 0.004 31 0 215 +(Ocean shortwave) 0.001622 0.006035 0.004058 0.001109 0.001 31 0 215 +(Ocean sponges_eta) 0.000002 0.000169 0.000014 0.000036 0.000 31 0 215 +(Ocean sponges_tracer) 0.000001 0.000003 0.000002 0.000000 0.000 31 0 215 +(Ocean sponges_velocity) 0.000000 0.000002 0.000001 0.000000 0.000 31 0 215 +(Ocean xlandinsert) 0.000002 0.000037 0.000005 0.000004 0.000 31 0 215 +(Ocean xlandmix) 0.000003 0.000102 0.000006 0.000008 0.000 31 0 215 +(Ocean rivermix) 0.000473 0.001800 0.001034 0.000304 0.000 31 0 215 +(Ocean overexchange) 0.000003 0.000026 0.000005 0.000003 0.000 31 0 215 +(Ocean mixdownslope) 0.008128 0.012685 0.009793 0.000965 0.002 31 0 215 +(Ocean blob update) 0.000002 0.000019 0.000003 0.000003 0.000 31 0 215 +(Ocean blob cell update) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean blob diagnose depth) 0.000002 0.000321 0.000203 0.000101 0.000 31 0 215 +(Ocean overflow) 0.000008 0.000069 0.000017 0.000006 0.000 31 0 215 +(Ocean overflow_OFP) 0.000002 0.000012 0.000005 0.000001 0.000 31 0 215 +(Ocean sigma transport) 0.002569 0.004412 0.003232 0.000321 0.001 31 0 215 +(Ocean tracer update) 0.030008 0.033641 0.032246 0.000739 0.008 31 0 215 +(Ocean surface flux) 0.019122 0.021731 0.019894 0.000477 0.005 31 0 215 +(Ocean bottom flux) 0.000056 0.000172 0.000098 0.000019 0.000 31 0 215 +(Ocean restoring flux) 0.007904 0.010017 0.009172 0.000403 0.002 31 0 215 +(Ocean TPM source) 0.000115 0.000260 0.000182 0.000028 0.000 31 0 215 +(Ocean TPM bbc) 0.000000 0.000001 0.000000 0.000000 0.000 31 0 215 +(Ocean TPM tracer) 0.000016 0.000022 0.000019 0.000001 0.000 31 0 215 +(Ocean explicit accel_a) 0.034839 0.036908 0.035840 0.000417 0.009 31 0 215 +(Ocean explicit accel_b) 0.000278 0.001001 0.000656 0.000096 0.000 31 0 215 +(Ocean implicit accel) 0.001802 0.005009 0.004455 0.000217 0.001 31 0 215 +(Ocean eta and pbot tendency) 0.000020 0.000301 0.000051 0.000056 0.000 31 0 215 +(Ocean eta and pbot update) 0.000054 0.001702 0.000190 0.000138 0.000 31 0 215 +(Ocean eta and pbot diagnose) 0.000676 0.004718 0.002407 0.000928 0.001 31 0 215 +(Ocean rho_dzt tendency) 0.000130 0.000660 0.000346 0.000052 0.000 31 0 215 +(Ocean dzt_dst update) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean surface height smooth) 0.001048 0.003095 0.001691 0.000474 0.000 31 0 215 +(Ocean bottom pressure smooth) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean mass forcing) 0.000102 0.000392 0.000190 0.000072 0.000 31 0 215 +(Ocean barotropic forcing) 0.000341 0.001174 0.000579 0.000178 0.000 31 0 215 +(Ocean barotropic dynamics) 0.008471 0.009602 0.009054 0.000277 0.002 31 0 215 +(Ocean velocity update) 0.002416 0.003432 0.003186 0.000114 0.001 31 0 215 +(Ocean diagnostics) 0.003483 0.006652 0.005776 0.000564 0.001 31 0 215 +(Ocean update T-cell thickness) 0.001155 0.002663 0.002404 0.000132 0.001 31 0 215 +(Ocean update Total thickness) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean update L sys. thickness) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean update E sys. thickness) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean update U-cell thickness) 0.003671 0.004618 0.004215 0.000174 0.001 31 0 215 +(Ocean tracer halo updates) 0.000440 0.001011 0.000690 0.000094 0.000 31 0 215 +(Ocean velocity halo update) 0.000311 0.007513 0.000969 0.000684 0.000 31 0 215 +(Ocean sum ocean surface) 0.000101 0.000216 0.000132 0.000020 0.000 31 0 215 +(Ocean average state) 0.000008 0.000039 0.000017 0.000005 0.000 31 0 215 +(Ocean tracer tmask limit) 0.000876 0.002408 0.001733 0.000428 0.000 31 0 215 +(Ocean gotm: advection) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean increment eta) 0.000000 0.000003 0.000001 0.000000 0.000 31 0 215 +(Ocean increment tracer) 0.000001 0.000003 0.000001 0.000000 0.000 31 0 215 +(Ocean increment velocity) 0.000004 0.000029 0.000007 0.000005 0.000 31 0 215 +(Ocean update rho_salinity) 0.000039 0.000105 0.000070 0.000013 0.000 31 0 215 +(Ocean idealized surface waves) 0.000003 0.000018 0.000004 0.000002 0.000 31 0 215 +(Ocean open boundaries) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean tracer: bih tracer) 0.000004 0.000052 0.000007 0.000006 0.000 31 0 215 +(Ocean tracer: lap tracer) 0.000000 0.000003 0.000001 0.000000 0.000 31 0 215 +(Ocean tracer: vert diffuse) 0.000298 0.000660 0.000510 0.000077 0.000 31 0 215 +(Ocean tracer: vert diffuse impl 0.002566 0.004291 0.003621 0.000292 0.001 31 0 215 +(Ocean tracer: advection) 0.019716 0.023263 0.021511 0.000656 0.005 31 0 215 +(Ocean tracer: frazil) 0.000460 0.000657 0.000503 0.000027 0.000 31 0 215 +(Ocean tracer: convection) 0.000000 0.000002 0.000001 0.000000 0.000 31 0 215 +(Ocean tracer: Lagrangian blobs) 0.000008 0.000033 0.000010 0.000003 0.000 31 0 215 +(Ocean tracer: implicit blobs) 0.000003 0.000024 0.000004 0.000002 0.000 41 0 215 +(Ocean tracer: adjust the L thic 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer: adjust the E thic 0.000003 0.000028 0.000004 0.000002 0.000 41 0 215 +(Ocean CT2PT: 1) 0.000117 0.000277 0.000183 0.000030 0.000 31 0 215 +(Ocean CT2PT: 2) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean CT2PT: 3) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean vmix: constant) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: PPvmix) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: KPP_test) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: KPP_mom4p0) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: KPP_mom4p1) 0.009524 0.015359 0.011975 0.001153 0.003 41 0 215 +(Ocean vmix: chenvmix) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: gotmvmix) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean vmix: tidal) 0.002860 0.007263 0.004365 0.000745 0.001 41 0 215 +(Ocean vmix: watermass_diag) 0.000006 0.000057 0.000011 0.000006 0.000 41 0 215 +(Ocean neutral: tracer derivs) 0.003369 0.005000 0.004652 0.000195 0.001 41 0 215 +(Ocean neutral: slopes) 0.002159 0.003155 0.002797 0.000146 0.001 41 0 215 +(Ocean neutral: eady rate) 0.002132 0.005802 0.003047 0.000599 0.001 41 0 215 +(Ocean neutral: baroclinic) 0.000009 0.000076 0.000016 0.000007 0.000 41 0 215 +(Ocean neutral: rossby radius) 0.000206 0.000593 0.000383 0.000097 0.000 41 0 215 +(Ocean neutral: bc zone radius) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: diffusivity) 0.001113 0.003625 0.001590 0.000419 0.000 41 0 215 +(Ocean neutral: cabbel/thermob) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: eta_tend_gm90) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: nrho-trans) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: rho-trans) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: theta-trans) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean neutral: diffuse) 0.014028 0.017184 0.015097 0.000491 0.004 41 0 215 +(Ocean neutral: GM stir) 0.008949 0.013007 0.010503 0.000701 0.003 41 0 215 +(Ocean neutral: blayer) 0.000793 0.003660 0.001233 0.000343 0.000 41 0 215 +(Ocean neutral: fz-terms) 0.003783 0.004841 0.004345 0.000207 0.001 41 0 215 +(Ocean ndiffuse: fx-flux) 0.003575 0.005019 0.003794 0.000149 0.001 41 0 215 +(Ocean ndiffuse: fy-flux) 0.003731 0.004320 0.003880 0.000097 0.001 41 0 215 +(Ocean ndiffuse: fz-flux) 0.002395 0.003364 0.003058 0.000184 0.001 41 0 215 +(Ocean gm: fx-flux) 0.001459 0.002291 0.001769 0.000169 0.000 41 0 215 +(Ocean gm: fy-flux) 0.001469 0.001933 0.001596 0.000058 0.000 41 0 215 +(Ocean gm: fz-flux) 0.001950 0.002916 0.002302 0.000121 0.001 41 0 215 +(Ocean gm: bc_modes) 0.000772 0.004179 0.002174 0.000769 0.001 41 0 215 +(Ocean gm: psi_modes) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean gm: psi_bvp) 0.009034 0.015271 0.012061 0.001096 0.003 41 0 215 +(Ocean const lap frict) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean general lap frict) 0.009042 0.014192 0.009658 0.000539 0.002 31 0 215 +(Ocean C-grid lap frict) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean const bih frict) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean general bih frict) 0.016269 0.018253 0.017436 0.000453 0.004 31 0 215 +(Ocean c-grid bih frict) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean advect: horz 4th) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert 4th) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: horz 6th) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert 6th) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: horz quk) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert quk) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: horz qukmom3) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert qukmom3) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sup-b) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-all) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-test) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: DST-linear) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: DST-linear-test) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-mpi) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-cuk) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-cui) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-cuj) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDFL-sweby-diag) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDPPM) 0.016452 0.019927 0.018141 0.000736 0.005 41 0 215 +(Ocean advect: MDPPM-TEST) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: psom total) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean psom advect: psom_x) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean psom advect: psom_y) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean psom advect: psom_z) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: MDMDT-TEST) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: horz up) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert up) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: horz 2nd) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: vert 2nd) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: gyre_overturn) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean advect: advect diss) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean shortwave morel pen) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean shortwave morel pen-mom4p 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean_OFP_init) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean_OFP_main) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(ocean_OFP_update_1) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(ocean_OFP_update_2) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(ocean_OFP_update_3) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Ocean diagnostics: adv_vel) 0.001719 0.003669 0.002872 0.000412 0.001 31 0 215 +(Ocean diagnostics: tracer) 0.000715 0.001470 0.001182 0.000142 0.000 31 0 215 +(Ocean diagnostics: velocity) 0.001046 0.001960 0.001717 0.000129 0.000 31 0 215 +(Ocean adv_vel_diag: numerics) 0.000000 0.000002 0.000001 0.000000 0.000 41 0 215 +(Ocean adv_vel_diag: s-trans) 0.000934 0.001333 0.001167 0.000066 0.000 41 0 215 +(Ocean adv_vel_diag: rho-trans) 0.000749 0.002367 0.001692 0.000383 0.000 41 0 215 +(Ocean adv_vel_diag: nrho-trans) 0.000000 0.000002 0.000001 0.000000 0.000 41 0 215 +(Ocean adv_vel_diag: theta-trans 0.000003 0.000031 0.000005 0.000002 0.000 41 0 215 +(Ocean tracer_diag: compute_subd 0.000000 0.000001 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: compute_trac 0.000003 0.000036 0.000004 0.000003 0.000 41 0 215 +(Ocean tracer_diag: mld_dtheta) 0.000000 0.000001 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: mld) 0.000625 0.001367 0.001066 0.000139 0.000 41 0 215 +(Ocean tracer_diag: rho_mld) 0.000001 0.000004 0.000002 0.000000 0.000 41 0 215 +(Ocean tracer_diag: potrho depth 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: theta depth) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: tracer on rh 0.000000 0.000002 0.000001 0.000000 0.000 41 0 215 +(Ocean tracer_diag: tracer_zrho 0.000000 0.000001 0.000001 0.000000 0.000 41 0 215 +(Ocean tracer_diag: numerical) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: diag mixing 0.000001 0.000007 0.000002 0.000001 0.000 41 0 215 +(Ocean tracer_diag: conserve) 0.000069 0.000139 0.000093 0.000012 0.000 41 0 215 +(Ocean tracer_diag: total water 0.000000 0.000001 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: total water 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: total tracer 0.000002 0.000009 0.000005 0.000001 0.000 41 0 215 +(Ocean tracer_diag: integrals) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: change) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Ocean tracer_diag: land check) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Velocity diag: energy analysis) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Velocity diag: press convert) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Velocity diag: press energy) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Velocity diag: friction energy) 0.000000 0.000000 0.000000 0.000000 0.000 31 0 215 +(Velocity diag: vert dissipation 0.000001 0.000020 0.000002 0.000001 0.000 31 0 215 +(Wave model initialization) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +(Wave diagnostics) 0.000000 0.000000 0.000000 0.000000 0.000 41 0 215 +Override 0.000311 0.000416 0.000368 0.000036 0.000 1 0 215 +OASIS init 0.230632 0.237934 0.235288 0.003060 0.059 1 0 215 +oasis_recv 0.124221 0.137701 0.125312 0.002236 0.031 31 0 215 +oasis_send 0.000182 0.000702 0.000475 0.000118 0.000 31 0 215 +oasis_recv1 0.000255 0.002517 0.000889 0.000743 0.000 31 0 215 +oasis_send1 0.000051 0.000118 0.000061 0.000012 0.000 31 0 215 + MPP_STACK high water mark= 0 + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- + MOM5: --- completed --- diff --git a/test/test/test_access_om2_extract_checksums.py b/test/test/test_access_om2_extract_checksums.py new file mode 100644 index 00000000..a08e1afa --- /dev/null +++ b/test/test/test_access_om2_extract_checksums.py @@ -0,0 +1,45 @@ +import pytest +import requests +import json +import jsonschema +from pathlib import Path +from unittest.mock import Mock + +from models.accessom2 import AccessOm2 +from models.accessom2 import SUPPORTED_SCHEMA_VERSIONS + +@pytest.mark.parametrize("version", SUPPORTED_SCHEMA_VERSIONS) +@pytest.mark.test +def test_extract_checksums(version): + # Mock ExpTestHelper + mock_experiment = Mock() + mock_experiment.output000 = Path('test/test/resources') + mock_experiment.control_path = Path('test/tmp') + + model = AccessOm2(mock_experiment) + + checksums = model.extract_checksums( + schema_version=version + ) + + # Assert version is set as expected + assert checksums["schema_version"] == version + + # Check the entire checksum file is expected + with open(f'test/test/resources/access-om2-checksums-1-0-0.json', 'r') as file: + expected_checksums = json.load(file) + + assert checksums == expected_checksums + + # Validate checksum file with schema + schema = get_schema_from_url(expected_checksums["schema"]) + + # Validate checksums against schema + jsonschema.validate(instance=checksums, schema=schema) + + +def get_schema_from_url(url): + """Retrieve schema from github""" + response = requests.get(url) + assert response.status_code == 200 + return response.json() diff --git a/test/test_bit_reproducibility.py b/test/test_bit_reproducibility.py new file mode 100644 index 00000000..303b81a5 --- /dev/null +++ b/test/test_bit_reproducibility.py @@ -0,0 +1,127 @@ +"""Tests for model reproducibility""" + +import json +import pytest +from pathlib import Path + +from exp_test_helper import setup_exp + +class TestBitReproducibility(): + + @pytest.mark.checksum + def test_bit_repro_historical(self, output_path: Path, control_path: Path, + checksum_path: Path): + """ + Test that a run reproduces historical checksums + """ + # Setup checksum output directory + # NOTE: The checksum output file is used as part of `repro-ci` workflow + output_dir = output_path / 'checksum' + output_dir.mkdir(parents=True, exist_ok=True) + checksum_output_file = output_dir / 'historical-3hr-checksum.json' + if checksum_output_file.exists(): + checksum_output_file.unlink() + + # Setup and run experiment + exp = setup_exp(control_path, output_path, "test_bit_repro_historical") + exp.model.set_model_runtime() + exp.setup_and_run() + + assert exp.model.output_exists() + + #Check checksum against historical checksum file + hist_checksums = None + hist_checksums_schema_version = None + + if not checksum_path.exists(): # AKA, if the config branch doesn't have a checksum, or the path is misconfigured + hist_checksums_schema_version = exp.model.default_schema_version + else: # we can use the historic-3hr-checksum that is in the testing directory + with open(checksum_path, 'r') as file: + hist_checksums = json.load(file) + + # Parse checksums using the same version + hist_checksums_schema_version = hist_checksums["schema_version"] + + checksums = exp.extract_checksums(schema_version=hist_checksums_schema_version) + + # Write out checksums to output file + with open(checksum_output_file, 'w') as file: + json.dump(checksums, file, indent=2) + + assert hist_checksums == checksums, f"Checksums were not equal. The new checksums have been written to {checksum_output_file}." + + @pytest.mark.slow + def test_bit_repro_repeat(self, output_path: Path, control_path: Path): + """ + Test that a run has same checksums when ran twice + """ + exp_bit_repo1 = setup_exp(control_path, output_path, + "test_bit_repro_repeat_1") + exp_bit_repo2 = setup_exp(control_path, output_path, + "test_bit_repro_repeat_2") + + # Reconfigure to a 3 hours (default) and run + for exp in [exp_bit_repo1, exp_bit_repo2]: + exp.model.set_model_runtime() + exp.setup_and_run() + + # Compare expected to produced. + assert exp_bit_repo1.model.output_exists() + expected = exp_bit_repo1.extract_checksums() + + assert exp_bit_repo2.model.output_exists() + produced = exp_bit_repo2.extract_checksums() + + assert produced == expected + + @pytest.mark.slow + @pytest.mark.skip(reason="TODO:Check checksum comparision across restarts") + def test_restart_repro(self, output_path: Path, control_path: Path): + """ + Test that a run reproduces across restarts. + """ + # First do two short (1 day) runs. + exp_2x1day = setup_exp(control_path, output_path, + 'test_restart_repro_2x1day') + + # Reconfigure to a 1 day run. + exp_2x1day.model.set_model_runtime(seconds=86400) + + # Now run twice. + exp_2x1day.setup_and_run() + exp_2x1day.force_qsub_run() + + # Now do a single 2 day run + exp_2day = setup_exp(control_path, output_path, + 'test_restart_repro_2day') + # Reconfigure + exp_2day.model.set_model_runtime(seconds=172800) + + # Run once. + exp_2day.setup_and_run() + + # Now compare the output between our two short and one long run. + checksums_1d_0 = exp_2x1day.extract_checksums() + checksums_1d_1 = exp_2x1day.extract_checksums(exp_2x1day.output001) + + # Adding checksums over two outputs might need to be model specific? + checksums_2x1d = checksums_1d_0['output'] + checksums_1d_1['output'] + + checksums_2d = exp_2day.extract_checksums() + + matching_checksums = True + for item in checksums_2d['output']: + if item not in checksums_2x1d: + print("Unequal checksum:", item) + matching_checksums = False + + if not matching_checksums: + # Write checksums out to file + with open(output_path / 'restart-1d-0-checksum.json', 'w') as file: + json.dump(checksums_1d_0, file, indent=2) + with open(output_path / 'restart-1d-1-checksum.json', 'w') as file: + json.dump(checksums_1d_1, file, indent=2) + with open(output_path / 'restart-2d-0-checksum.json', 'w') as file: + json.dump(checksums_2d, file, indent=2) + + assert matching_checksums diff --git a/test/util.py b/test/util.py new file mode 100644 index 00000000..bfb84042 --- /dev/null +++ b/test/util.py @@ -0,0 +1,20 @@ +import time +import subprocess as sp + + +def wait_for_qsub(run_id): + """ + Wait for the qsub job to terminate. + """ + + while True: + time.sleep(1*60) + try: + qsub_out = sp.check_output(['qstat', run_id], stderr=sp.STDOUT) + except sp.CalledProcessError as err: + qsub_out = err.output + + qsub_out = qsub_out.decode() + + if 'Job has finished' in qsub_out: + break