I am trying to use the observation nudging scheme in WRF with some dropsonde observations we have over the Arctic. I tested with a single sounding in a single domain with WRF3.8.1. The sounding data was read in by WRF successfully (such as lat/lon, number of levels) but no nudging is done in the WRF run (by comparing runs with obs_nudge_opt=1 vs 0). I did some more modification to the subroutine errob in phys/module_fddaobs_rtffda.F and the nudging seems to work properly for my case (multiple sounding as well) but there are still issues on communication between processors that might cause troubles for other RTFDDA cases. I guess this is a bug report but I don't have a perfect solution yet. I'd appreciate any advice on how to fix this bug. Some more details from my tests are listed below.
I tested on the phys/module_fddaobs_rtffda.F and found out the issue might be related to the values of rko and errf(9,:). The variable rko is not calculated and set to zero together with errf(9,:) in the subroutine errob. On the processor that is handling the gridboxes including the location of the dropsonde, there are still several tiles (but I guess the CPUs on my cluster treats these tiles sequentially). In my case, the location of the dropsonde is not on the first tile, so MP_LOCAL_DUMMASK(N) is set to .False. in the first tile and rko is not computed. At the end of errob, rko is set to 0, the value of errf(9,:). When the second tile is computed, although MP_LOCAL_DUMMASK(N) is .True., but the check for abs(rko(n)+99).lt.1 failed, so rko is still not calculated. That's why rko and errf(9,:) are all zeros and no actual nudging is done in nudob.
I have to add the following changes to errob to have the nudging active:
(1) change the check for rko(n) from
Code: Select all
Code: Select all
if( abs(rko(n)+99).lt.1. .or. abs(rko(n)).lt.1. )
I know the second change is not right because the resulting rko are garbage (over 8e5) on tiles that do not include the location of the sounding ( when TILE_MASK(IOB, JOB, its, ite, jts, jte) returns .False. ). But the rko and errf(9,:) are still 0 if MP_LOCAL_DUMMASK is not set true. I guess there are still some value communication issue between processors and tile handling. But I am not sure how to do it properly.