diff --git a/dartwrf/dart_nml.py b/dartwrf/dart_nml.py index 06ed9d1a6abcdb6f6d7bf83f7c625f882038f035..85716b640511a9f48c2f04aa9d33de66e9830379 100644 --- a/dartwrf/dart_nml.py +++ b/dartwrf/dart_nml.py @@ -1,5 +1,5 @@ +import warnings from dartwrf.utils import append_file - from dartwrf.exp_config import exp from dartwrf.server_config import cluster @@ -191,36 +191,36 @@ def _get_list_of_localizations(): loc_horiz_rad = to_radian_horizontal(loc_horiz_km) l_loc_horiz_rad.append(loc_horiz_rad) - # compute vertical localization - - # do we have vertical localization? - if not hasattr(obscfg, "loc_vert_km") and not hasattr(obscfg, "loc_vert_scaleheight"): - l_loc_vert_km.append(-1) - l_loc_vert_scaleheight.append(-1) - # if not add dummy value - - # choose either localization by height or by scale height - if hasattr(obscfg, "loc_vert_km") and hasattr(obscfg, "loc_vert_scaleheight"): - raise ValueError("Observation config contains both loc_vert_km and loc_vert_scaleheight. Please choose one.") - - elif hasattr(obscfg, "loc_vert_km"): # localization by height + try: # localization by height loc_vert_km = obscfg["loc_vert_km"] vert_norm_hgt = to_vertical_normalization(loc_vert_km, loc_horiz_km) l_loc_vert_km.append(vert_norm_hgt) - elif hasattr(obscfg, "loc_vert_scaleheight"): # localization by scale height - loc_vert_scaleheight = obscfg["loc_vert_scaleheight"] + # set the other (unused) list to a dummy value + l_loc_vert_scaleheight = [-1,] + + except AttributeError: # localization by scale height + try: + loc_vert_scaleheight = obscfg["loc_vert_scaleheight"] - # no conversion necessary, take the values as defined in obscfg - l_loc_vert_scaleheight.append(loc_vert_scaleheight) + # no conversion necessary, take the values as defined in obscfg + l_loc_vert_scaleheight.append(loc_vert_scaleheight) - # set the other (unused) list to a dummy value - if len(l_loc_vert_km) > 0: - l_loc_vert_scaleheight = [-1,] - else: - l_loc_vert_km = [-1,] - + # set the other (unused) list to a dummy value + l_loc_vert_km = [-1,] + + except AttributeError: + + # do we have vertical localization? + # check parameter horiz_dist_only == true + if exp.dart_nml['&location_nml']['horiz_dist_only'][0] == '.true.': + # no vertical localization + l_loc_vert_km.append(-1) + l_loc_vert_scaleheight.append(-1) + else: + raise ValueError('Neither `loc_vert_km` nor `loc_vert_scaleheight` defined in obscfg.') + return l_obstypes, l_loc_horiz_rad, l_loc_vert_km, l_loc_vert_scaleheight @@ -330,8 +330,8 @@ def write_namelist(just_prior_values=False): # fail if horiz_dist_only == false but observations contain a satellite channel if nml['&location_nml']['horiz_dist_only'][0] == '.false.': for obscfg in exp.observations: - if hasattr(obscfg, "sat_channel"): - raise ValueError("Selected vertical localization, but observations contain satellite obs -> Not possible.") + if 'sat_channel' in obscfg: + warnings.warn("Selected vertical localization, but observations contain satellite obs -> Bug in DART.") # write to file write_namelist_from_dict(nml, cluster.dart_rundir + "/input.nml")