-
Notifications
You must be signed in to change notification settings - Fork 134
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
icepack_parameters: optionally compute 'dragio' from under-ice roughness #366
icepack_parameters: optionally compute 'dragio' from under-ice roughness #366
Conversation
@phil-blain |
I'm curious why this is in icepack at all. It seems you are just storing a value in icepack, but never using it in icepack. |
I'm not familiar with the form drag parameterization, but I know that one of our colleague looked at that an made some changes to |
I'm not opposed to this particular modification to the code, but since it's just one step in a larger set of changes, it would be helpful to see the big picture. Do you have something like a design document for the overall approach, or at least a basic outline/description of it? |
Ok I can share a little bit of the game plan. Right now I have a working NEMO3.6/CICE6 codebase, but with some custom patches to CICE/Icepack to make it work with our version of NEMO: 1- the staggered atmoshepric level PRs After that we will be running NEMO3.6 with a "pristine" version of CICE6, i.e. no custom patches. But not all of our CICE modifications have been re-implemented in CICE6 yet, so as we upgrade our forecasting systems with the new NEMO-CICE executable we will progessively re-implement what we still need (the Maybe @JFLemieux73 and @dupontf want to add some more details but that's the gist of it. So for this here PR it's really just making |
I agree that Icepack is the right place to put this parameter, as opposed to CICE. However, I question whether it needs to be in the ice model at all, since it's essentially just a parameter for an ocean model parameterization. If it were variable, e.g. depending on the ice morphology, then it would make sense to have it in the ice model. (And if that's the plan, then probably some coordination with the form drag implementation is advisable.) But as it is, it doesn't make a lot of sense to house it in the ice model. So you use CICE's namelist as the method for ensuring that the ice and ocean components are using the same parameters? |
it is used to compute |
I'm still thinking about this one, and there are several considerations. For example, dragio is not a namelist parameter in either Icepack or CICE -- it's just a parameter set in Icepack that is queried when needed. However, it looks like CESM and the NUOPC couplers change the value (somehow), without it being in namelist. If ECCC also wants to change the value, then we should fix the code to allow that. My take on this is that the current code is poorly implemented. The follow-on question, then, is whether the value should be constant or variable over the grid and time. The code has an array option (Cdn_ocn) but its use might be limited to just the formdrag parameterization. Maybe that needs to be generalized? Finally, I still don't think that iceruf_ocn should be a parameter in the sea ice component unless the sea ice component actually uses it somewhere. But this question is really one of coupled model architecture -- which component owns what pieces of information. We made the decision that Icepack would "own" its parameters and be queried by the driver to share a common value -- in that sense, the parameter belongs in Icepack. BUT iceruf_ocn isn't a parameter needed by Icepack or CICE (yet)! We've had several rounds of cleaning up unused variables/parameters, and this essentially would be one of those. What could be interesting and useful for the broader community, though, is to share the parameterization in which you use iceruf_ocn to compute dragio. The natural home for that, I think, would be in the mixed-layer ocean parameterization. You wouldn't use that parameterization when running coupled, but it would provide context for having iceruf_ocn in Icepack. Would that make sense? |
Thanks for the feedback Elizabeth. I'll try to add some details.
I think the approach is simply to call This would be the approach I would take. I don't need to change the way he current CICE/Icepack code is implemented for that.
I think this is a separate question.
Yes, I understand that. I also agree it's a little awkward if it's not used anywhere.
We could, but that's not really what I'm working on right now... As you write it would not be used in coupled mode... the parameterization is not very complicated, it's basically the same as what we used in !compute dragio as a function of z0io and first ocean layer thickness
zm=gdepw_1d(2)
zmon2=0.5_wp*zm
dragio=(vkarmn/log(zmon2/z0io))**2 !dragio at half first layer
lambda=(zm-z0io)/(zm*(sqrt(dragio)/vkarmn*(log(2._wp)-1._wp+z0io/zm)+1._wp))
dragio=dragio*lambda**2 Here However this has only been tested in a coupled context, so I don't know if we want to implement in in the ocean mixed-layer param... |
Sorry if I sounded harsh above, it was really not my intention. Here is a (slightly edited) copy of an email thread we had yesterday: @eclare108213 writes:
F. Roy answers:
@eclare108213 answers:
I answer:
|
de62844
to
fddf286
Compare
I've implemented the computation of I did not add any tests for this new feature, and did not add the two new parameters to the Icepack namelist, because I'm not 100% sure they would be required / desired. For our needs we only need So I'd like feedback on the testing front: do we want to add a test in Icepack, or it makes more sense to only add a test in CICE? Do we want to do a longer run ? etc. |
How about thickness_ocn_sfc or thickness_ocn_layer1? just to be a little more specific.
I think it's helpful to have parameters like this in the namelist. It's not clear to me how other modeling centers are using namelist versus directly inserting parameter values. I didn't realize that some of you do both. That's a discussion we should have, but not for this PR.
The answers to all of those questions are "yes". It's more important to have a test in Icepack than in CICE, in my opinion, but would be good in both places. A longer run would also be helpful to make sure that it's behaving as expected compared with Francois's paper. |
fddf286
to
2e761e5
Compare
Thanks for the quick turnaround on feedback, very much appreciated. I've changed |
279f5b5
to
8c0bcc0
Compare
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 much happier with this approach. Have you tried a longer run with calc_dragio=T (either coupled or not) to see if it behaves as expected?
Is iceruf_ocn=0.03 the value that makes dragio equal (or close) to the default value? If not, what value does? (I'm curious)
I did not yet do a long run since I was waiting on this PR and the upcoming CICE one to be merged before I rebase my stuff. But I can certainly do that. The 0.03 value for |
In some applications, we want the ice-ocean drag coefficient 'dragio' to be computed using an under-ice roughness length and the thickness of the first ocean level instead of imposing its value directly. Add a new boolean flag 'calc_dragio' and real parameters 'iceruf_ocn', 'thickness_ocn_layer1', where 'iceruf_ocn' is the under-ice roughness length, and 'thickness_ocn_layer1' is the thickness of the first ocean level, to module 'icepack_parameters'. With 'calc_dragio = .true.', compute the ice-ocean drag coefficient following [1]. Update the documentation accordingly. [1] https://doi.org/10.1002/2014JC010677
Add the 'calc_dragio' flag introduced in the previous commit to the Icepack namelist. Add a test for the new feature in the base_suite.
8c0bcc0
to
7839c16
Compare
The 0.03 value for iceruf_ocn is referenced in Roy et al 2015 and comes from
I've rebased my stuff and I'm starting a one year coupled run with the changes from this branch just to check everything behaves as it should. |
I've ran a 2 months coupled run with `calc_dragio=.true.̀ and the new staggered atmospheric level, a configuration which is very close to what we are running for CICE4, and compared with a CICE4 run. Everything seems to behave as expected. So we are good to merge I would say. |
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.
Excellent, @phil-blain, thank you for all the extra work on this one. This is great!
@@ -1609,6 +1633,8 @@ subroutine icepack_recompute_constants() | |||
|
|||
!autodocument_end | |||
|
|||
real (kind=dbl_kind) :: lambda |
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 lambda just a temporary variable, or does it have a physical meaning? units?
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 unit-less. I followed our in-house implementation, which in turn follows Roy et al 2015. Lambda is defined in equation (6) (top of p. 7).
Thanks @eclare108213 🎊 |
In CICE-Consortium/Icepack@a80472b (icepack_parameters: optionally compute 'dragio' from under-ice roughness (CICE-Consortium/Icepack#366), 2021-06-22), Icepack was updated to optionally compute the ice-ocean drag coefficicent 'dragio' using an under-ice roughness length and the thickness of the first ocean level. Leverage this new feature in CICE by adding 'calc_dragio' and 'iceruf_ocn' to the CICE namelist. Add the new variables to the index in the documentation and add a test with the new feature (using default values for 'iceruf_ocn' and 'thickness_ocn_layer1'). As this new feature will mostly be useful in a coupled context, we do not add 'thickness_ocn_layer1' to the namelist as it is expected that the ocean model will pass this information to CICE.
…#612) * icepack: optionally compute 'dragio' using under-ice roughness length In CICE-Consortium/Icepack@a80472b (icepack_parameters: optionally compute 'dragio' from under-ice roughness (CICE-Consortium/Icepack#366), 2021-06-22), Icepack was updated to optionally compute the ice-ocean drag coefficicent 'dragio' using an under-ice roughness length and the thickness of the first ocean level. Leverage this new feature in CICE by adding 'calc_dragio' and 'iceruf_ocn' to the CICE namelist. Add the new variables to the index in the documentation and add a test with the new feature (using default values for 'iceruf_ocn' and 'thickness_ocn_layer1'). As this new feature will mostly be useful in a coupled context, we do not add 'thickness_ocn_layer1' to the namelist as it is expected that the ocean model will pass this information to CICE. * ice_grid: set 'thickness_ocn_layer1' if using 'calc_dragio' In the previous commit we updated Icepack to allow computing the ice-ocean drag coefficient 'dragio' using an under-ice roughness length and the thickness of the first ocean layer, 'thickness_ocean_layer1', a new Icepack parameter. In some situations, we have access in CICE to the thicknesses of the ocean levels, either hard-coded (use_bathymetry = false, bathymetry_format = default), read from a file (use_bathymetry = true, bathymetry_format = pop), or generated from the kmt_file (use_bathymetry = false, bathymetry_format = pop). In these situations, for consistency set 'thickness_ocean_layer1' in Icepack to the thickness of the first ocean level, 'thick(1)' if 'calc_dragio' is active.
PR checklist
add an option to compute
dragio
from under-ice roughnessiceruf_ocn
(and thickness of first ocean layer)P Blain. based on code by F. Roy.
See: https://github.com/CICE-Consortium/Test-Results/wiki/2e761e581b.daley.intel.21-06-09.191841.0
The MISS is the test I'm adding which is new so was not in the baseline I'm comparing to (43a909a)
calc_dragio
andiceruf_ocn
to the CICE namelistIn some applications, we want the ice-ocean drag coefficient 'dragio' to be computed using an under-ice roughness length and the thickness of the first ocean level instead of imposing its value directly.
Add a new boolean flag 'calc_dragio' and real parameters 'iceruf_ocn', 'thickness_ocn_layer1', where 'iceruf_ocn' is the under-ice roughness length, and 'thickness_ocn_layer1' is the thickness of the first ocean level, to module 'icepack_parameters'.
EDIT 09-06-2021 I've updated the description with the test results and an up-to-date description.