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

calc_dragio functionality #463

Closed
eclare108213 opened this issue Oct 1, 2023 · 4 comments · Fixed by #466
Closed

calc_dragio functionality #463

eclare108213 opened this issue Oct 1, 2023 · 4 comments · Fixed by #466

Comments

@eclare108213
Copy link
Contributor

The option to calculate ice-ocean drag based on a (variable) under-ice ice roughness and the thickness of the ocean layer was added to icepack_parameters.F and the documentation, but apparently the actual calculation is done outside of icepack and the resulting value is sent in as the parameter iceruf_ocn. Is that correct? So setting calc_dragio=.true. in Icepack does nothing? Maybe we should write a warning in the Icepack driver to make that clear. Why is thickness_ocn_layer1 needed in Icepack? And a final question: what would a non-Canadian user need to do in CICE or somewhere else in their coupled model to make this work? A little more documentation on that point would be helpful, e.g. a sentence in layman's language that outlines the calculation. If someone is looking at Icepack without CICE, then it needs to be clear that this capability must be implemented outside of Icepack, that Icepack only ingests the results. I've been exploring it for E3SM, and it appears to be a bit of a science project. Thanks!

@phil-blain
Copy link
Member

Hi Elizabeth,

The option to calculate ice-ocean drag based on a (variable) under-ice ice roughness and the thickness of the ocean layer was added to icepack_parameters.F and the documentation, but apparently the actual calculation is done outside of icepack and the resulting value is sent in as the parameter iceruf_ocn. Is that correct?

That's not correct. In the documentation (which I added in #366), we have (last paragraph of https://cice-consortium-icepack.readthedocs.io/en/main/science_guide/sg_boundary_forcing.html#ocean):

The ice-ocean drag coefficient, :math:`c_w`, can optionally be computed from the thickness of the first ocean level, :math:`h_1`, and an under-ice roughness length, :math:`z_{io}`.
The computation follows :cite:`Roy15` :
.. math::
c_w = c_w^* \lambda^2
:label: dragio
where
.. math::
\begin{aligned}
c_w^* &= \frac{\kappa^2} {\ln^2\left( h_1 / z_{io} \right)}, \\
\lambda &= \frac{h_1 - z_{io}} {h_1 \left[ \sqrt{c_w^*} \kappa^{-1} \left( \ln(2) - 1 + z_{io} / h_1 \right) + 1 \right] }
\end{aligned}
:label: dragio-defs

and this is implemented in icepack_recompute_constants:

if (calc_dragio) then
dragio = (vonkar/log(p5 * thickness_ocn_layer1/iceruf_ocn))**2 ! dragio at half first layer
lambda = (thickness_ocn_layer1 - iceruf_ocn) / &
(thickness_ocn_layer1*(sqrt(dragio)/vonkar*(log(c2) - c1 + iceruf_ocn/thickness_ocn_layer1) + c1))
dragio = dragio*lambda**2
endif

So under calc_dragio=.true., we do this computation, and when it's false, we use the value of dragio (default or set via icepack_init_parameters).

So setting calc_dragio=.true. in Icepack does nothing?

No, it does not do nothing. It computes dragio from iceruf_ocn and thickness_ocn_layer1, instead of taking the dragio value directly from the Icepack parameters.

 And a final question: what would a non-Canadian user need to do in CICE or somewhere else in their coupled model to make this work?

I guess the same as a Canadian user :P That is, set calc_dragio=.true., and set iceruf_ocn and thickness_ocn_layer1 as needed.

I hope that's clear ? Let me know how you think the documentation could be improved. I guess the section I link to above would be clearer if the text also mentioned the corresponding code variables...

@phil-blain
Copy link
Member

I started #466, I'll update if we want more details.

@eclare108213
Copy link
Contributor Author

My question is a little different from the one you're answering -- sorry for not being clear. My assumption is that iceruf_ocn is different for each grid cell (thickness_ocn_layer could also be different for each one). If those are constants everywhere, then this functionality doesn't really do much, right? Isn't the value in it that they can vary? But how they vary must be calculated outside of the sea ice model, or at least outside of Icepack. Does that make sense?

@phil-blain
Copy link
Member

OK, yes I understand better now.

It's true that it does not do much if they are constant. Currently both iceruf_ocn and thickness_ocn_layer are indeed constant in our setup. So, we could have simply computed dragio externally, and set its value using icepack_init_parameters.

I went back to my PR (#366) and it turns out we quite a long discussion about it :) In fact, it seems you suggested the current approach (having the option to do the computation in Icepack itself).

I'm not opposed to removing it and computing it outside Icepack (and CICE) if we feel it's more natural this way.

One motivation for the current approach was that it added iceruf_ocn to Icepack, and we had some other in-house code that made use of this value for the form drag parameterization. It turns out I still haven't reimplemented those changes as they are not used in operations. I don't know if we will revisit them eventually.

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

Successfully merging a pull request may close this issue.

2 participants