diff --git a/dartwrf/obsseq_2dim.py b/dartwrf/obsseq_2dim.py index f32b8ec99c901c24b0dc371422ee460189aebcd6..46bd60539978d729181fbf46645691760aa0ef2a 100755 --- a/dartwrf/obsseq_2dim.py +++ b/dartwrf/obsseq_2dim.py @@ -3,7 +3,14 @@ Specifically, one observation per column which is the maximum of the column Use this script before running the OSSE workflow, to prepare obs_seq.out files. -path_3d_obsseq = '/path/exp_obs10_loc20/obs_seq_out/2008-07-30_%H:%M_obs_seq.out' +Note: + path_3d_obsseq = '/path/exp_obs10_loc20/obs_seq_out/2008-07-30_%H:%M_obs_seq.out' + +Note: + Only works in case there is 1 observation type! + +Example: + python obsseq_2dim.py exp_v1.22_P2_rr_REFL_obs10_loc20_oe2.5 2008-07-30_13:00 """ from copy import copy @@ -17,42 +24,41 @@ from dartwrf import utils from dartwrf import assim_synth_obs as aso from dartwrf import obsseq +def _get_n_obs_per_layer(oso): + """Get number of observations per layer""" + height_all = np.array([a[2] for a in oso.df.loc3d]) + + height_first = height_all[0] + + # count how often this height appears + n_obs_per_layer = int(np.sum(height_all == height_first)) + return n_obs_per_layer + if __name__ == "__main__": - exp = sys.argv[1] assim_time = dt.datetime.strptime(sys.argv[2], "%Y-%m-%d_%H:%M") path_3d_obsseq = cluster.archive_base+exp+'/obs_seq_out/%Y-%m-%d_%H:%M_obs_seq.out' oso_input = assim_time.strftime(path_3d_obsseq) - # load experiment config - sys.path.insert(0, cluster.archivedir+'/'+exp+'/DART-WRF') - from config import cfg - - # only assured to work with single obstype - if len(cfg.exp.observations) > 1: - raise NotImplementedError() - # existing obsseq with multi levels oso = obsseq.ObsSeq(oso_input) + + n_obs_3d = len(oso.df) + n_obs_per_layer = _get_n_obs_per_layer(oso) + nlev = int(n_obs_3d/n_obs_per_layer) + assert np.allclose(nlev, n_obs_3d/n_obs_per_layer), 'n_obs not evenly divisible!' - n_obs = cfg.exp.observations[0]['n_obs'] - nlev = len(oso.df)/n_obs - if nlev - int(nlev) != 0: - raise RuntimeError() - nlev = int(nlev) # levels per obs - print('nlev', nlev) - print('n_obs', n_obs) + print('n_obs_per_layer', n_obs_per_layer) + print('n_obs_3d', n_obs_3d) output = copy(oso) # copy will be modified # output.df = output.df.copy() # without this, we get a SettingWithCopyWarning output.df = output.df.iloc[0::nlev] # every nth level = first level - #print(output.df, oso.df) - # iterate through, set value to max - for i_obs in range(0, n_obs): # go through n_obs (all columns) + for i_obs in range(0, ): # go through n_obs (all columns) i_obs_subset = i_obs*nlev # jumps by nlev (from one to next column) column = oso.df.loc[0 + i_obs_subset:nlev + i_obs_subset, :] # select column