Skip to content

Conversation

@eclare108213
Copy link
Contributor

@eclare108213 eclare108213 commented Dec 5, 2025

PR checklist

  • Short (1 sentence) summary of your PR:
    Add option for externally generated significant wave height
  • Developer(s):
    @erinethomas @eclare108213
  • Suggest PR reviewers from list in the column to the right.
  • Please copy the PR test results link or provide a summary of testing completed below.
    Base_suite is fully BFB with baseline.
    Also tested in modified CICE quick_suite, including the 4 FSD tests. All pass, including comparisons with baseline.
  • How much do the PR code changes differ from the unmodified code?
    • bit for bit
    • different at roundoff level
    • more substantial
  • Does this PR create or have dependencies on CICE or any other models?
    • Yes, it will require driver changes and input forcing to access the new feature, but is backward compatibile without those changes
    • No
  • Does this PR add any new test cases?
    • Yes
    • No
  • Is the documentation being updated? ("Documentation" includes information on the wiki or in the .rst files from doc/source/, which are used to create the online technical docs at https://readthedocs.org/projects/cice-consortium-cice/.)
    • Yes
    • No, does the documentation need to be updated at a later time?
      • Yes
      • No
  • Please document the changes in detail, including why the changes are made. This will become part of the PR commit log.

A new namelist flag allows significant wave height to be passed into the ice model from a coupler. In addition, this PR

  1. moves wave_spec_height out of icepack interface argument lists, since it is initialized via icepack_init_parameters
  2. consolidates multiple wave-spectrum calculations of significant wave height, to reduce duplication of code, used when wave_height_type = 'internal'.

This PR is the first step in resyncing the CICE Consortium and E3SM versions of Icepack. It is in draft form until we ensure it runs as expected in E3SM. A few extra commits show up in the list because of differences in histories between the Consortium and E3SM Icepack repositories, going back to the last time they were in sync. Only the wave-height related changes are new, as shown in the file comparison.

@eclare108213
Copy link
Contributor Author

I'm thinking of changing the wave_height_type = 'internal' option to 'spectral', and wave_height to wave_sig_ht, wherever it appears in the code.
CICE draft PR will be posted soon to illustrate the changes needed in the driver.
FYI @lettie-roach

@lettie-roach
Copy link
Contributor

Thanks for consolidating! I think that looks good.

Just a comment on the naming. Now wave_spec_type is only used to determine how wave fracture is computed (convergence over random sea surface height phase, vs one iteration and constant phase). Maybe we should rename 'wave_spec_type' to 'wave_frac_method' or something similar? Then we can later add in new wave fracture methods using this as well.

Then we might keep 'wave_spec_type' for the other option (instead of wave_height_type) - as the input data is the wave energy spectrum as a function of frequency, E(f)

@eclare108213
Copy link
Contributor Author

eclare108213 commented Dec 5, 2025

Just a comment on the naming. Now wave_spec_type is only used to determine how wave fracture is computed (convergence over random sea surface height phase, vs one iteration and constant phase). Maybe we should rename 'wave_spec_type' to 'wave_frac_method' or something similar? Then we can later add in new wave fracture methods using this as well.

We can certainly generalize this, but I'd prefer to do that in a separate PR from this one.

Then we might keep 'wave_spec_type' for the other option (instead of wave_height_type) - as the input data is the wave energy spectrum as a function of frequency, E(f)

This would be really confusing, I think. We don't have any new wave data for CICE at the moment, but the input data for wave_height_type = 'coupled' in E3SM is actually significant wave height calculated by WW3. This PR is intended to support that coupling approach while still allowing the existing options.

Copy link
Contributor

@dabail10 dabail10 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this looks fine. I am still confused about why dwavefreq goes away.

wave_sig_ht, &
wave_spectrum, &
wavefreq, &
dwavefreq, &
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I am not sure why you are removing dwavefreq from the call, but not wavefreq?

if (wave_spec) then
if (wave_sig_ht > puny) then
call wave_dep_growth (wave_spectrum, &
wavefreq, dwavefreq, &
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I see here that you removed dwavefreq.


integer (kind=int_kind) :: k

w_amp = c2* SQRT(SUM(local_wave_spec*dwavefreq)) ! sig wave amplitude
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Starting to understand now. Is this bfb?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is BFB in my tests so far.

@lettie-roach
Copy link
Contributor

Then we might keep 'wave_spec_type' for the other option (instead of wave_height_type) - as the input data is the wave energy spectrum as a function of frequency, E(f)

This would be really confusing, I think. We don't have any new wave data for CICE at the moment, but the input data for wave_height_type = 'coupled' in E3SM is actually significant wave height calculated by WW3. This PR is intended to support that coupling approach while still allowing the existing options.

Ah, I hadn't realized that E3SM is using wave significant height rather than the spectrum. Then 'wave_height_type' makes sense.

I do think 'wave_frac_method' or 'wave_frac_type' would be less confusing than 'wave_spec_type' for the option to do convergence over random sea surface height phase vs one iteration and constant phase in the wave fracture scheme.

@anton-seaice
Copy link
Contributor

FYI @NoahDay @ezhilsabareesh8 - I don't think this impacts us? (There will be a companion change to cice - see CICE-Consortium/CICE#1071)

"", "``random``", "wave data file is provided, sea surface height generated using random number (multiple iterations of wave fracture)", ""
"``wave_height_type``", "``internal``", "significant wave heights are calculated by icepack from the wave_spectra", "``none``"
"", "``none``", "No wave data provided, no wave-ice interactions", ""
"", "``coupled``", "significant wave heights data provided from a coupled wave model, like WW3", ""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about the wave spectra? Are these passed from E3SM in addition to significant wave height? Or is there some reconstruction of the wave spectra (e.g. Bretschneider) occurring somewhere?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think they are passing the data to ensure the fields are all consistent. Treating wave height as external forcing makes sense to me since the wave model is a separate component (in E3SM), but sea ice could still modify wave height during the timestep if the coupling needs to be tighter.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes- we pass the direction integrated wave spectra for the breaking (controlled by wave_spec_type), as well as wave height (controlled by wave_height_type) .

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps for a later PR then, we could make the logic like this?

wave_spec_type
= ‘none’ - No wave data provided, no wave-ice interactions
= ‘profile’ - constant spectra, for testing only
= ‘coupled’ - from file or coupling with wave model

wave_height_type
= ‘none’ ?
= ‘internal’ - calculated from wave spectra within sea ice model
= ‘coupled’ - from file or coupling with wave model

wave_frac_type
= ‘none’ ?
= ‘HT15-single’ - as Horvat & Tziperman (2015) - one iteration with fixed sea surface height phase
= ‘HT15-convergence’ - as Horvat & Tziperman (2015) - run to convergence with random sea surface height phases

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I made a new issue to keep this on the radar. Thanks!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this idea for for the future!

@apcraig
Copy link
Contributor

apcraig commented Dec 8, 2025

Please run

./icepack.setup --docintfc

before final PR. This will update the Icepack interface document as needed. Do a git diff on the doc files to make sure it looks reasonable. Thanks!

@erinethomas
Copy link

The wave-ice parts of this PR has now been fully tested in E3SM. I fully approve of all @eclare108213s consolidations!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants