diff --git a/cycled_exp.py b/cycled_exp.py index 90679efc3b1a6deda42bc2e376ac7eb2ee62b53f..b2173aaa6be30f0ff695e127f6c26822f727ad1e 100755 --- a/cycled_exp.py +++ b/cycled_exp.py @@ -14,7 +14,7 @@ if __name__ == "__main__": id = None - if False: # warm bubble + if True: # warm bubble prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_noDA' init_time = dt.datetime(2008, 7, 30, 12) @@ -26,19 +26,18 @@ if __name__ == "__main__": # id = w.run_ideal(depends_on=id) # id = w.wrfinput_insert_wbubble(depends_on=id) - if True: # random + if False: # random prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P2_noDA' - init_time = dt.datetime(2008, 7, 30, 12) - time = dt.datetime(2008, 7, 30, 13) - last_assim_time = dt.datetime(2008, 7, 30, 13) - forecast_until = dt.datetime(2008, 7, 30, 13, 15) + init_time = dt.datetime(2008, 7, 30, 7) + time = dt.datetime(2008, 7, 30, 12) + last_assim_time = dt.datetime(2008, 7, 30, 14) + forecast_until = dt.datetime(2008, 7, 30, 18) w.prepare_WRFrundir(init_time) # id = w.run_ideal(depends_on=id) # prior_path_exp = w.cluster.archivedir - # prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P5+su_noDA' prior_init_time = init_time prior_valid_time = time @@ -69,10 +68,12 @@ if __name__ == "__main__": id = w.run_ENS(begin=time, # start integration from here end=time + timedelta_integrate, # integrate until here output_restart_interval=output_restart_interval, + first_minutes=True, depends_on=id) # as we have WRF output, we can use own exp path as prior - prior_path_exp = w.cluster.archivedir + prior_path_exp = w.cluster.archivedir + # prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.19_P2_noDA/' id_sat = w.create_satimages(time, depends_on=id) @@ -84,3 +85,16 @@ if __name__ == "__main__": w.verify_sat(id_sat) w.verify_wrf(id) + + +# assim_times = [dt.datetime(2008,7,30,12,30), ] +# time range from 12:30 to 13:30 every 15 minutes +assim_times = [dt.datetime(2008,7,30,12,30) + dt.timedelta(minutes=15*i) for i in range(5)] +tuples = [] +for init in assim_times: + for s in range(30,3*60+1,30): + tuples.append((init, init+dt.timedelta(seconds=s))) + + +# evaluate the forecast at +1 minute after the assimilation time +w.evaluate_obs_posterior_after_analysis(tuples, depends_on=id) diff --git a/dartwrf/exp_config.py b/dartwrf/exp_config.py index 6d90a43f96cd3c435ed1b557f4ae9fd6aff29b31..58e71ed1b177b6febad8ad637033066a0816b91f 100644 --- a/dartwrf/exp_config.py +++ b/dartwrf/exp_config.py @@ -4,14 +4,17 @@ exp = utils.Experiment() exp.expname = "template_experiment" exp.model_dx = 2000 exp.n_ens = 40 -exp.superob_km = False # False or int (spatial averaging of observations) +exp.superob_km = False # False or int (spatial averaging of observations, unit: km) +exp.do_quality_control = False # bool -exp.use_existing_obsseq = False # False or pathname (use precomputed obs_seq.out files) -#exp.use_existing_obsseq = '/jetfs/home/lkugler/data/sim_archive//exp_v1.18_P1_nature+1//obs_seq_out/%Y-%m-%d_%H:%M_obs_seq.out' +# Use existing observations (path to obs_seq.out) or generate observations (False) +exp.use_existing_obsseq = False +#exp.use_existing_obsseq = '/users/students/lehre/advDA_s2023/dartwrf_tutorial/very_cold_observation.out' -# path to the nature run, where we take observations from -exp.nature_expname = 'exp_v1.18_P1_nature+1' +# path from where observations can be generated +exp.nature_wrfout_pattern = '/jetfs/home/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_nat/*/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' +# for initialization profiles exp.input_profile = '/mnt/jetfs/home/lkugler/data/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof' @@ -30,7 +33,7 @@ exp.dart_nml = {'&assim_tools_nml': output_sd='.true.', stages_to_write='output', ), - '&quality_control_nml': + '&quality_control_nml': dict(outlier_threshold='-1', ), '&location_nml': @@ -73,9 +76,9 @@ wv62 = dict(var_name='Brightness temperature WV 6.2µm', unit='[K]', wv73 = dict(var_name='Brightness temperature WV 7.3µm', unit='[K]', kind='MSG_4_SEVIRI_TB', sat_channel=6, - n_obs=256, obs_locations='square_array_evenly_on_grid', - error_generate=1., error_assimilate=1., - loc_horiz_km=10) + n_obs=961, obs_locations='square_array_evenly_on_grid', + error_generate=1., error_assimilate=3., + loc_horiz_km=20) ir108 = dict(var_name='Brightness temperature IR 10.8µm', unit='[K]', kind='MSG_4_SEVIRI_TB', sat_channel=9, @@ -99,22 +102,25 @@ t = dict(var_name='Temperature', unit='[K]', loc_horiz_km=50, loc_vert_km=2.5) q = dict(var_name='Specific humidity', unit='[kg/kg]', - kind='RADIOSONDE_SPECIFIC_HUMIDITY', n_obs=1, + kind='RADIOSONDE_SPECIFIC_HUMIDITY', + n_obs=961, obs_locations='square_array_evenly_on_grid', error_generate=0., error_assimilate=5*1e-5, heights=[1000], #range(1000, 17001, 2000), loc_horiz_km=0.1, loc_vert_km=2.5) t2m = dict(var_name='SYNOP Temperature', unit='[K]', kind='SYNOP_TEMPERATURE', - n_obs=256, obs_locations='square_array_evenly_on_grid', - error_generate=0.3, error_assimilate=0.3, - loc_horiz_km=10, loc_vert_km=2) + n_obs=961, obs_locations='square_array_evenly_on_grid', + error_generate=0.1, error_assimilate=0.1, + loc_horiz_km=40, loc_vert_km=2.5) psfc = dict(var_name='SYNOP Pressure', unit='[Pa]', - kind='SYNOP_SURFACE_PRESSURE', n_obs=1, + kind='SYNOP_SURFACE_PRESSURE', + n_obs=961, obs_locations='square_array_evenly_on_grid', error_generate=50., error_assimilate=100., loc_horiz_km=32, loc_vert_km=5) -exp.observations = [wv73] +exp.observations = [vis] exp.update_vars = ['U', 'V', 'W', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'PSFC'] + diff --git a/dartwrf/utils.py b/dartwrf/utils.py index 427d5a4feb1d50c382f57529bc2c2bcbbc96d98b..53d89039c8988ca0a18bbfedf9f574173f5631cc 100755 --- a/dartwrf/utils.py +++ b/dartwrf/utils.py @@ -132,7 +132,7 @@ userhome = os.path.expanduser('~') def shell(args): print(args) #subprocess.run(args.split(' ')) #, shell=True) #, stderr=subprocess.STDOUT) - os.system(args) + return os.system(args) def print(*args): __builtin__.print(*args, flush=True)