ESCOMP / ESCOMP/CTSM

Consider coupling log(z0) rather than z0

Open
#1,154 2 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Fortran
Stars
352
Forks
361
Avg merge
2d 21h
Merged PRs (30d)
7

Description

In https://github.com/ESCOMP/CTSM/issues/892#issuecomment-694553097 , @apcraig comments:

> @billsacks, just a quick question about this implementation. I will be pulling this mod into my version of CTSM for coupling with WRF. We need to add the momentum z0 for coupling with WRF in RASM/NNA as well. Thanks to Keith for pointing me to it (https://bb.cgd.ucar.edu/cesm/threads/gridcell-mean-z0m.5581/), I have an older version of the CTSM code that does not contain this modification yet.
>
> I'm curious about your implementation. In RASM, we are coupling the log(z0m) and that is mapped and merged in the coupler from multiple surfaces in typical fashion. When the coupling variable, logz0, is passed into WRF, the z0 is computed by taking exp(logz0). It turns out that mapping and merging logz0 rather than z0 improves the science by creating a more "correct" area weighted z0 average field based on how z0 is used in WRF. Are you mapping and merging in the coupler in your applications? If you are coupling, mapping, and merging z0 and not log(z0), is you might want to think about this issue.
>
> Which leads to my actual question. In this implementation, to aggregate to the gridcell, you are doing
>
> ```
> call p2g(bounds, &
> frictionvel_inst%z0m_actual_patch (bounds%begp:bounds%endp), &
> lnd2atm_inst%z0m_grc (bounds%begg:bounds%endg), &
> p2c_scale_type='unity', c2l_scale_type= 'urbans', l2g_scale_type='unity')
> ```
> I suspect the right way to implement this is to also do the p2g average on the log(z0m_actual_patch). I will probably modify this code to do that. For our implementation, I will rename %z0m_grc to %logz0m_grc and just carry that thru to the coupling layer since we are passing the log(z0m) anyway. So that would look something like
>
> ```
> logz0m(bounds%begp:bounds%endp) = log(frictionvel_inst%z0mv_actual_patch(bounds%begp:bounds%endp))
> call p2g(bounds, &
> logz0m, &
> lnd2atm_inst%logz0m_grc (bounds%begg:bounds%endg), &
> p2c_scale_type='unity', c2l_scale_type= 'unity', l2g_scale_type='unity')
>
> ...
>
> l2x(index_l2x_Sl_logz0,i) = lnd2atm_inst%logz0m_grc(g)
> ```
>
> where logz0m is just a local variable that stores the log of %z0mv_actual_patch so it can be passed into p2g. Let me know whether you think I'm off the rails. If I can help with anything or answer any questions if you decide to shift to log(z0), just let me know.

What he's saying sounds reasonable, but I don't know enough about this to say whether this is something we want to do in the CTSM-LILAC-WRF coupling.

@olyson @dlawrenncar @slevisconsulting @negin513 @weiwangncar do any of you have insight into this?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.