Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Leith+E #251

Merged
merged 4 commits into from
Aug 29, 2023
Merged

Add Leith+E #251

merged 4 commits into from
Aug 29, 2023

Conversation

iangrooms
Copy link

@iangrooms iangrooms commented Jul 18, 2023

This commit adds the 2D Leith+E closure, which uses a modified 2D Leith biharmonic viscosity paired with a harmonic backscatter. ('Modified' here is not used in the same sense as 'modified 2D Leith'; it just means that the biharmonic coefficient is modified to account for enstrophy backscatter.) Variables are often named 'leithy' to refer to Leith+E.

The parameterization is controlled by three main entries in user_nl_mom:

  1. USE_LEITHY = True
  2. LEITH_CK = 1.0
  3. LEITH_BI_CONST = 8.0

To use Leith+E you should have LAPLACIAN=True and BIHARMONIC=True. (You should also be explicit and set LEITH_AH=False, along with any other viscous closures. Leith+E does use the background value of the biharmonic coefficient as a minimum, but ignores the background harmonic value.) LEITH_CK is the fraction of energy dissipated by the biharmonic term that gets backscattered by the harmonic term (it's a target; the backscatter rate is not exact.) Recommended values between 0 and 1. LEITH_BI_CONST is Upsilon^6 where Upsilon is the ratio between the grid scale and the dissipation scale for enstrophy. Values should be greater than or equal to 1; 8 is a good place to start.

The code is sensitive to the background value of Ah; specifically, if Ah is too large, the code is unstable. This is because the backscatter coefficient is proportional to Ah, and if Ah is large then you get large backscatter. If your code is unstable, consider reducing, e.g., AH_VEL_SCALE.

This commit adds the 2D Leith+E closure, which uses a modified 2D Leith biharmonic viscosity paired with a harmonic backscatter. ('Modified' here is not used in the same sense as 'modified 2D Leith'; it just means that the biharmonic coefficient is modified to account for enstrophy backscatter.) Variables are often named 'leithy' to refer to Leith+E.

The parameterization is controlled by three main entries in user_nl_mom:
1. USE_LEITHY = True
2. LEITH_CK = 1.0
3. LEITH_BI_CONST = 8.0

To use Leith+E you should have LAPLACIAN=True and BIHARMONIC=True. (It doesn't hurt to be explicit and also set LEITH_AH=False, along with any other viscous closures, but this is not required. If USE_LEITHY=True it will not use any of the other schemes. It does use the background value of the biharmonic coefficient as a minimum, but ignores the
background harmonic value.) LEITH_CK is the fraction of energy dissipated by the biharmonic term that gets backscattered by the harmonic term (it's a target; the backscatter rate is not exact.) Recommended values between 0 and 1. LEITH_BI_CONST is Upsilon^6 where Upsilon is the ratio between the grid scale and the dissipation scale for enstrophy.
Values should be greater than or equal to 1; 8 is a good place to start.

The code is sensitive to the background value of Ah; specifically, if Ah is too large, the code is unstable. This is because the backscatter coefficient is proportional to Ah, and if Ah is large then you get large backscatter. If your code is unstable, consider reducing, e.g., `AH_VEL_SCALE`.
@codecov-commenter
Copy link

codecov-commenter commented Jul 18, 2023

Codecov Report

Patch coverage: 12.82% and project coverage change: -0.06 ⚠️

Comparison is base (aa58724) 37.07% compared to head (1c8df77) 37.02%.

❗ Current head 1c8df77 differs from pull request most recent head bd13ba6. Consider uploading reports for the commit bd13ba6 to get more accurate results

Additional details and impacted files
@@             Coverage Diff              @@
##           dev/ncar     #251      +/-   ##
============================================
- Coverage     37.07%   37.02%   -0.06%     
============================================
  Files           264      264              
  Lines         74421    74564     +143     
  Branches      13780    13813      +33     
============================================
+ Hits          27592    27604      +12     
- Misses        41739    41855     +116     
- Partials       5090     5105      +15     
Impacted Files Coverage Δ
src/parameterizations/lateral/MOM_hor_visc.F90 45.62% <12.82%> (-4.70%) ⬇️

... and 1 file with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

This commit updates the code so that it uses the background Ah as
a minimum. Previously, if `SMAGORINSKY_AH = True`, Leith+E would
use the Smag value of Ah as the minimum, which is incorrect.
mnlevy1981 pushed a commit to mnlevy1981/MOM6 that referenced this pull request Aug 10, 2023
  There are extra US%T_to_s scaling factors in the expressions for ustar_min
that were recently introduced with dev/gfdl PR NCAR#251; these are duplicative of
the scaling factor that is already being applied when the parameter OMEGA is
read in.  The resulting expressions for ustar_min therefore effectively have
units of [Z s T-2 ~> m s-1] when they should have units of [Z T-1 ~> m s-1].
Because ustar_min is a tiny floor on the magnitude of ustar, there is a range of
values of T_RESCALE_POWER that will give the same answers as when it is 0, but
for large enough values the answers will change, perhaps dramatically.  This
small commit removes these extra factors.  Answers will change for some large
values of T_RESCALE_POWER, but they are bitwise identical in the TC testing and
in MOM6-examples based regression tests with modest or negative values.
Removed `do_not_log` condition on `USE_LEITHY`
@gustavo-marques
Copy link
Collaborator

Just one more minor very minor suggestion. We should follow Fortran2003 conventions, so
please use <, <=, >, >=, ==, and /= instead of .LT., .LE., .GT., .GE., .EQ., and .NE., respectively.

Added one line to fix the fact that the code would only work as
intended if either (i) writing out Ah_h, or (ii) in debug mode.
Also swapped .le. and .lt. for <= and <.
@gustavo-marques
Copy link
Collaborator

@iangrooms, thanks for addressing all the issues.
Our tests are passing (mom_pr). I also ran a few manual tests with this scheme enabled to make sure the model reproduces across restarts and with different PE layouts. Everything checks.

@gustavo-marques gustavo-marques merged commit d4aa108 into NCAR:dev/ncar Aug 29, 2023
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants