-
Notifications
You must be signed in to change notification settings - Fork 568
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
Updated Numerical Solution for Wave Attenuation in sea ice #1294
base: develop
Are you sure you want to change the base?
Conversation
Maybe it is possible to progress with some discussion/review during this pause, @MatthewMasarik-NOAA ? I don't know if any IC4 developers in particular have feedback |
Hi @NickSzapiro-NOAA, others should feel free to discuss. If this is not needed for either gfsv17 or gefsv13 though, than Avichal has reiterated that the waves team needs to pause any reviewing since we don't have the manpower currently. |
@erinethomas, we will also process this in ~November. Thank you for the very informative PR header. |
I've made a github repository about this issue at https://github.com/cmbitz/WW3Numerics where I've written up some more detailed notes about this issue and show some results in slides from a number of integrations to test it. I also provide a Python Notebook with some idealized examples that can be solved exactly where I compare the various solution options. In short, the modifications I'm suggesting can be implemented so they only matter in the sea ice. They can work for any IC/IS option combination, though I confess I've only tested with IC4Method10. I'm 100% sure it would improve wave amplitudes in the sea ice for any IC option. Happy to talk to anyone who wants to listen. I understand that this issue is on the back-burner, which is okay with me. I'll wait. |
thanks for the extra details @cmbitz! |
model/src/w3srcemd.F90
Outdated
@@ -2097,7 +2145,7 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & | |||
#ifdef W3_IC3 | |||
ATT=EXP(ICE*VDIC(IS)*DTG) | |||
#endif | |||
#ifdef W3_IC4 | |||
#ifndef W3_IC4_ACCURATE_NUMERICS |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In a case of IC0 for example, where there is no IC1-IC5 defined, then VDIC has not been defined (look at line 744 in this same script) and the build will give this error: This name does not have a type, and must have an explicit type. [VDIC]
ATT=EXP(ICE*VDIC(IS)*DTG)
suggested changes is:
#ifdef WW3_IC4
#ifndef WW3_IC4_ACCURATE_NUMERICS
ATT = EXP(ICE * VDIC(IS) * DTG)
#endif
#endif
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@erinethomas @NickSzapiro-NOAA do you agree with this change? If so could you please go ahead and make the changes?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Keeping both makes sense to me to protect VDIC
Why is this implemented as a switch? Could a logical variable in the IC4 namelist do the same thing? |
Hi Erick. We were following the example of the W3_IC? options here. Happy to change it to a namelist option if this is preferred. |
Hi David. |
Ok. I will work with @erinethomas on this. |
Adding a namelist variable is very easy. I just did this the other day, to put in a new option for hacking the ice thickness. You can look at an existing variable to see how it is done, e.g. "grep IC4 *.F90 | grep -i ki". Any new variable will have 2 names. One is used in ww3_grid.inp and the other is used internally, e.g. IC4KI and IC4_KI. There are 3-4 files that need minor editing to add the new variable, as you will see with the output from above grep command. Keep in mind that after making this change, any old mod-def files that you have will no longer work. |
This seems like a good way forward (to go with namelist options rather than switches) - I will update the PR as soon as I can! |
@erinethomas @dabail10 Do we have any updates to this PR? |
yes -I have worked out how to move this from a switch setting to a namelist parameter - I am still doing some final tests - code coming soon. |
b703df9
to
031da9d
Compare
… numerics fix should be applicable to ALL IC settings.
031da9d
to
97f26f0
Compare
@cmbitz @dabail10 @NickSzapiro-NOAA |
Thank you @erinethomas for your updates! Please let me know when you are ready for the second round of review. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The recent updates by Erin look good to me. I don't have any other concerns or suggestions. I suppose it needs to get through the matrix testing now.
Thank you @ErickRogers for your review. @erinethomas I will be starting my second round of review soon. Please let me know if there are still changes or checks you need to do on you side before I do so. Thanks |
thanks @ErickRogers, @sbanihash - you are welcome to review this now - but I would very much like one or more of the other developers (@cmbitz, @dabail10, @NickSzapiro-NOAA) to review these changes as well before the PR is finalized. |
@@ -809,6 +809,7 @@ MODULE W3GRIDMD | |||
! | |||
REAL(8) :: GSHIFT ! see notes in WMGHGH | |||
LOGICAL :: FLC, ICEDISP, TRCKCMPR | |||
LOGICAL :: ICNUMERICS |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a nit-picky thing, but do we need both ICNUMERICS and IC_NUMERICS? I feel like the other ice flags have IICESMOOTH and ICESMOOTH.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was following the naming convention for "IC4KI and IC4_KI" - but the MISC namelist settings seem to have the 'extra I' rather than the underscore... we could probably pick either convention. I have no strong opinion on this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is fine, IMO.
@@ -1423,6 +1457,11 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & | |||
#ifdef W3_UOST | |||
VS(IS) = VS(IS) + VSUO(IS) | |||
#endif | |||
IF ( IC_NUMERICS .AND. ICE.GT.0. ) THEN | |||
#if defined(W3_IC1) || defined(W3_IC2) || defined(W3_IC3) || defined(W3_IC4) || defined(W3_IC5) | |||
VS(IS) = VS(IS) + VSIC(IS) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In my version of the code we also have VD(IS) = VD(IS) + VDIC(IS)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh wait, I see this is down further.
@@ -700,6 +701,7 @@ MODULE W3GDATMD | |||
|
|||
LOGICAL :: GINIT, FLDRY, FLCX, FLCY, FLCTH, FLCK, FLSOU, IICEDISP,& | |||
IICESMOOTH | |||
LOGICAL, POINTER :: IC_NUMERICS |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this supposed to be a pointer in both places?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not 100% sure to be honest - I don't understand why some of the namlist settings here are pointers... but other are not... for example, most of the IC4 namelist settings are pointers in both places? but the IICEDISP is only a pointer in one place?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Testing this out in CESM.
@@ -1454,6 +1498,11 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & | |||
|
|||
! | |||
DT = MAX ( 0.5, DT ) ! The hardcoded min. dt is a problem for certain cases e.g. laborotary scale problems. | |||
IF ( IC_NUMERICS .AND. ICE .GT. 0.01 .and. ICE .LT. 0.95) THEN |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ICE.GT.0 is used elsewhere. Is this a big change in efficiency or to avoid something in particular?
If not, I'm hesitant as these seem buried and may lead to spatial differences around these sea ice concentrations
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good question @NickSzapiro-NOAA ... @cmbitz can you explain your logic for putting 'ICE.GT.01' rather than 0 here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It doesn't really matter if it is 0 or 0.01 provided tiny dots of sea ice don't hang around. I was just trying to make the code run a bit faster when the sea ice concentration is small since there isn't much point in increasing the accuracy for less than 1% of the area. The error in the 99% or more area of open water will dominate anyway. Though @dabail10 is right that I think we should not bother with this line of code at all. I wouldn't bother with it regardless of OFFSET. We had limited the timestep since there are conditions where my recommended numerical changes in the sea ice are less accurate unless the timestep is also reduced. However, I don't think it is that important. What is much more important is the "merging" of the sea ice source with the other source terms that is the main thrust of this pull request.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks for the extra details! I will remove this line and update the PR.
@cmbitz was actually advocating that we should remove this timestep limitation under the ice. However, I don't know if that is only when OFFSET=0.5 in w3srcemod.F90 |
These changes work in the CESM code. |
Pull Request Summary
This PR provides a new switch (called IC4_ACCURATE_NUMERICS). This switch allows for using an updated numerics scheme for wave attenuation in sea ice.
Description
The default behavior for wave attenuation in sea ice uses 'time splitting' for the wave action equation. This PR and the use of the new switch setting allows the user to place the 'sea ice' with the other source terms, thus reducing the errors introduced with the time splitting method for wave attenuation in sea ice resulting in more accurate wave action in sea ice.
Currently, this code is intended to be used in tandem with the newly proposed Meylan et al 2021 attenuation scheme : IC4M10 (see PR: #1293 ). This combination (IC4M10 plus IC4_ACCURATE_NUMERICS) has been tested in coupled CESM and E3SM runs, yet we note, at this time, this new numerics calculation for wave attenuation has not yet been tested with IC4 methods 1-9, although, we expect similar improvements for all IC4 methods.
This PR is the original work of @cmbitz and Vince Cooper (University of Washington). Collaborators include @erinethomas, @dabail10, @NickSzapiro-NOAA
Issue(s) addressed
This PR fixes the following Issue: #738
Commit Message
Introduction of a new switch (IC4_ACCURATE_NUMERICS) that allows for more accurate numerics scheme for wave attenuation in sea ice. Coauthors: Cecilia Bitz, Vince Cooper, Erin Thomas, David Bailey, Nick Szapiro.
Check list
Testing
This code has been tested by @cmbitz (details to be posted below), by @erinethomas in E3SM configurations with wave-sea ice coupling, and by @dabail10 in CESM configurations with wave-sea ice coupling.