[Wrf-users] Bug in REAL interpolation code
wrfhelp
wrfhelp at ucar.edu
Thu Jul 30 14:51:32 MDT 2009
An alternative workaround is to set zap_close_levels = 0. We will also
be looking at a fix so that
zap_close_levels will not affect upper levels.
wrfhelp
On Jul 30, 2009, at 1:26 PM, Kemp, Eric M (IS) wrote:
> Dear WRF Community:
>
> I have found a subtle bug in program REAL (released with WRF 3.1)
> that can be
> triggered when processing closely packed pressure levels from WPS
> (in my case,
> high altitude pressure levels from 5 to 0.2 mb).
>
> In subroutine vert_interp (dyn_em/module_initialize_real.F),
> pressure data
> is copied from 3D array porig to 1D array ordered_porig for each
> column.
> When there are no underground pressure levels (lines 2667-2716),
> the program skips pressure levels that are "too close" to each
> other, where
> "too close" is defined by namelist variable zap_close_levels
> (default is
> 500 Pa):
>
> DO ko = knext , generic
> IF ( ordered_porig(count-1) - porig(i,ko,j) .LT.
> zap_close_levels ) THEN
> zap = zap + 1
> zap_above = zap_above + 1
> CYCLE
> END IF
> ordered_porig(count) = porig(i,ko,j)
> ordered_forig(count) = forig(i,ko,j)
> count = count + 1
> END DO
>
> Note that this can cause the level at the top of the atmosphere to be
> "zapped". The logic for the case with underground pressure levels
> (lines
> 2582-2667) is different, in that "zapping" only occurs underground and
> immediately above the surface. (Code omitted).
>
> This causes problems when the program defines the subset of
> ordered_porig that contains valid data (lines 2762-2795). If both
> underground pressure levels and the surface layer are used (lines
> 2762-2744),
> the program will loop through ordered_porig and stop when (1) it
> finds the
> pressure corresponding to the top of the atmosphere, or (2) when it
> reaches
> the end of the array (variable generic). Condition (1) is supposed to
> account for "zapped" levels, but if the top level pressure isn't
> copied to
> ordered_porig, then condition (2) will result:
>
> count = 0
> find_how_many_1 : DO ko = 1 , generic
> IF ( porig(i,generic,j) .EQ. ordered_porig(ko) )
> THEN
> count = count + 1
> EXIT find_how_many_1
> ELSE
> count = count + 1
> END IF
> END DO find_how_many_1
> kinterp_start = 1
> kinterp_end = kinterp_start + count - 1
>
> Similar code is used when underground pressures are used but the
> surface
> layer is NOT (lines 2744-2777):
>
> count = 0
> find_how_many_2 : DO ko = 1 , generic
> IF ( porig(i,generic,j) .EQ. ordered_porig(ko) )
> THEN
> count = count + 1
> EXIT find_how_many_2
> ELSE
> count = count + 1
> END IF
> END DO find_how_many_2
> kinterp_start = 1
> kinterp_end = kinterp_start + count - 1
>
> If condition (2) holds when data was "zapped", then invalid elements
> of
> ordered_porig will be passed to the interpolation code (lines
> 2799-2811),
> and cause bogus results. In some of my runs, ordered_porig
> contained zeros
> in those invalid elements, and caused NaNs/floating point exceptions
> when
> interpolating in log(pressure).
>
> IF ( interp_type .EQ. 1 ) THEN
> CALL lagrange_setup ( var_type , &
> ordered_porig(kinterp_start:kinterp_end) , &
> ordered_forig(kinterp_start:kinterp_end) , &
> count , lagrange_order , extrap_type , &
> ordered_pnew(kstart:kend) , ordered_fnew ,
> kend-kstart+1 ,i,j)
> ELSE
> CALL lagrange_setup ( var_type , &
> LOG(ordered_porig(kinterp_start:kinterp_end)) , &
> ordered_forig(kinterp_start:kinterp_end) , &
> count , lagrange_order , extrap_type , &
> LOG(ordered_pnew(kstart:kend)) , ordered_fnew ,
> kend-kstart+1 ,i,j)
> END IF
>
> I see two ways to fix this bug: either restrict "zapping" to near the
> surface, or change the logic in the "subset" code to use the zap
> variable
> that keeps track of "zapped" levels. I think the former is
> preferable,
> since "zapping" pressure levels aloft can make it difficult to raise
> the model top above 10 mb.
>
> -Eric
>
> Eric M. Kemp
> Meteorologist
> Northrop Grumman Information Systems
> Advisory Services Division (TASC)
> 4801 Stonecroft Boulevard
> Chantilly, VA 20151
> 301-286-9768 (NASA Goddard Office)
> 703-633-8300 x7078 (Chantilly SLEET Lab)
> 703-633-8300 x8278 (Chantilly Office)
> 703-449-3400 (Chantilly Fax)
>
>
wrfhelp
http://www.mmm.ucar.edu/wrf/users/supports/wrfhelp.html
More information about the Wrf-users
mailing list