fix: correct physics bugs in 3-equation ice cavity melt model#875
fix: correct physics bugs in 3-equation ice cavity melt model#875JanStreffing wants to merge 2 commits into
Conversation
Five physics/correctness fixes in cavity_heat_water_fluxes_3eq: 1. Conduction term (ep31): use rhor^2 instead of rhor, because the ice draft (zice) must be converted to full ice thickness via D_ice = D_draft * (rhow/rhoi), and the heat balance is normalised by rhow. Verified against Holland & Jenkins (1999). ~11% correction. 2. Reynolds number length scale: replace hardcoded 10 m with actual top-layer thickness hnode(nzmin,node), restoring the velocity- and geometry-dependent formulation from the original BRIOS code. 3. Depth-to-pressure conversion: pass abs(zice)*1.025 [dbar] instead of abs(zice) [m] to potit() for the in-situ temperature calculation. 4. Latent heat lhf: correct value from 3.33e5 to 334000 J/kg to match the L constant declared in the same subroutine. 5. Discriminant guard: add max(..., 0.) before sqrt() to prevent NaN from negative discriminant under numerical extremes. Also fix comment: tdif is thermal diffusivity [m2/s], not conductivity.
|
Not sure if any of these will be major changes, perhaps not. But can't hurt to be accurate? |
|
|
||
| real(kind=WP),parameter :: pr = 13.8 !Prandtl number [dimensionless] | ||
| real(kind=WP),parameter :: sc = 2432. !Schmidt number [dimensionless] | ||
| real(kind=WP),parameter :: ak = 2.50e-3 !dimensionless drag coeff. |
There was a problem hiding this comment.
The drag coefficient is the most effective tool to reduce the melt rates which are always too large. Numbers down to 0.5e-3 are reasonable. We could consider reducing the default value in this merge.
There was a problem hiding this comment.
Can you safely rule out the possibility that melt rates are too large only because the water is too warm? 0.5e-3 is not totally unreasonable, but rather unsual. I wouldn't feel comfortable putting this as a default into the code just to get rid of a bias in a certain simulation or a certain set of simulations.
As for the #1 of Jan's comments on top of this page: The choice of using the ice draft instead of the full ice thickness for heat conduction was actually done on purpose (not by me, but by the original developers). The idea is that large bodies of ice (the model was developped with FRIS in mind) tend to have an internal temperature minimum very roughly at the water level. The idea was that heat conduction should be computed between the ice base and this internal temperature minimum. Whether that was a good choice may clearly be debatable; however I would like to make it understood that it was a choice, not a mistake. Given that the model is applied to a wide range of different ice shelves now, and that the assumption was not exactly very robust or accurrate anyway, I can totally agree that it may be a good idea to change this.
| !rt s_surf_flux(i,j)=gas*(sf-(s(i,j,N,lrhs)+35.0)) | ||
|
|
||
| heat_flux(node) = rhow*cpw*gat*(tin-tf) ! [W/m2] ! positive for upward | ||
| water_flux(node) = ep5*(sf-sal)/sf ! [m/s] ! |
There was a problem hiding this comment.
According to Ralph Timmermann the fix in #855 was wrong and line 365 must be replaced with water_flux(node) = rhow / rhofw * gas * (sal-sf)/sf, with rhofw=1000kg/m3 #866 . Replacing ep5 with rhow / rhofw * gas seems correct to me based on Ralph's explanation. Replacing sf-sal with sal-sf would however switch the sign of the term and would require according modification of the code.
There was a problem hiding this comment.
I never said/wrote that you should replace the whole line; in fact I did state that deriving the line from the original papers gives a different sign, that this is only a matter of definition, and that I am convinced that the order of differencing in FESOM is correct. The density ratio should be replaced/corrected, that's all.
BTW, I support Finn's push towards implementing the Losch (2008) scheme. With increasing vertical resolution (>100 levels) the issue fades, but it never vanishes completely.
FinnHeu
left a comment
There was a problem hiding this comment.
These are good fixes, @JanStreffing. In my opinion, we should consider to additionally implement Losch 2008 (https://doi.org/10.1029/2007JC004368), which solves the problem of missing boundary layers right underneath the ice due to dilution of the heat and freshwater fluxes in coarse (or unevenly thick) z-coordinates. The general idea is to introduce an imaginary boundary layer of a certain thickness (e.g. 10 m) under the ice tongue no matter the thickness of the first active layer. The heat and freshwater fluxes are computed according to the temperature, salinity, and velocity of this boundary layer (which is relaxed to the full cells T and S to follow its evolution) and ultimately applied to both, the full cell and the boundary layer itself. This way, a cooler and fresher boundary layer develops and is used to compute the fluxes, which should further reduce the fluxes. I wanted to properly try this anyway and would rank it higher on my agenda.
|
Trying these fixes in AWI-ESM2 with fesom-2.6.11, these fixes seem to have very little effect on the overall freshwater fluxes. Over 10 year test runs there is little difference to before, both in the total flux and specific cavity behaviour |
Five physics/correctness fixes in cavity_heat_water_fluxes_3eq:
Conduction term (ep31): use rhor^2 instead of rhor, because the ice draft (zice) must be converted to full ice thickness via D_ice = D_draft * (rhow/rhoi), and the heat balance is normalised by rhow. Verified against Holland & Jenkins (1999). ~11% correction.
Reynolds number length scale: replace hardcoded 10 m with actual top-layer thickness hnode(nzmin,node), restoring the velocity- and geometry-dependent formulation from the original BRIOS code.
Depth-to-pressure conversion: pass abs(zice)*1.025 [dbar] instead of abs(zice) [m] to potit() for the in-situ temperature calculation.
Latent heat lhf: correct value from 3.33e5 to 334000 J/kg to match the L constant declared in the same subroutine.
Discriminant guard: add max(..., 0.) before sqrt() to prevent NaN from negative discriminant under numerical extremes.
Also fix comment: tdif is thermal diffusivity [m2/s], not conductivity.