diff --git a/dartwrf/assimilate.py b/dartwrf/assimilate.py index 275ce2b4ed3637aad594f2e1ac9c1ea852cd3afb..6b669ce3ea402944dac9277eff1fe391ad1de0ba 100755 --- a/dartwrf/assimilate.py +++ b/dartwrf/assimilate.py @@ -19,12 +19,28 @@ pattern_init_time = "/%Y-%m-%d_%H:%M/" # pattern for the init_time folder in si pattern_obs_seq_out = cluster.archivedir + "/diagnostics/%Y-%m-%d_%H:%M_obs_seq.out" # how an obs_seq.out file is archived pattern_obs_seq_final = cluster.archivedir + "/diagnostics/%Y-%m-%d_%H:%M_obs_seq.final" # how an obs_seq.final file is archived -def _prepare_DART_grid_template(): +def _prepare_DART_grid_template(prior_path_exp=False): # DART needs a wrfinput file as a template for the grid # No data except grid info will be read from this file # The grid information must match exactly with the nature file "wrfout_d01" - symlink(cluster.dart_rundir + "/wrfout_d01", - cluster.dart_rundir + "/wrfinput_d01") + + # find any model forecast and link it + if os.path.isfile(cluster.dart_rundir + "/wrfinput_d01"): + pass # file exists + else: + if prior_path_exp == False: + raise ValueError('If run_DART/wrfinput_d01 does not exist, prior_path_exp may not be empty') + else: + try: + f = glob.glob(prior_path_exp+'/*/1/wrfout_d01*')[0] + except IndexError: + raise IOError('Could not find any model forecast file to get the grid information using the pattern '+prior_path_exp+'/*/wrfout_d01*') + print('link', f) + copy(f, cluster.dart_rundir + "/wrfinput_d01") + + # add coordinates if not already present + if cluster.geo_em_for_WRF_ideal: + wrfout_add_geo.run(cluster.geo_em_for_WRF_ideal, cluster.dart_rundir + "/wrfinput_d01") def _find_nature(time): """Find the path to the nature file for the given time @@ -150,7 +166,6 @@ def filter(nproc=12): None (writes to file) """ nproc = min(nproc, cluster.max_nproc) - _prepare_DART_grid_template() print("time now", dt.datetime.now()) print("running filter") @@ -167,8 +182,8 @@ def filter(nproc=12): if not os.path.isfile(cluster.dart_rundir + "/obs_seq.final"): raise RuntimeError( - "obs_seq.final does not exist in " + cluster.dart_rundir, - "\n look for " + cluster.dart_rundir + "/log.filter") + "obs_seq.final does not exist in run_DART directory. ", + "Check log file at " + cluster.dart_rundir + "/log.filter") ############### archiving @@ -364,7 +379,7 @@ def evaluate(assim_time, os.makedirs(cluster.dart_rundir, exist_ok=True) # create directory to run DART in os.chdir(cluster.dart_rundir) - link_DART_binaries_and_RTTOV_files() + _link_DART_binaries_and_RTTOV_files() # remove any existing observation files os.system("rm -f input.nml obs_seq.final") @@ -486,7 +501,7 @@ def archive_inflation_2(time): copy(f_output, f_archive) print(f_archive, 'saved') -def link_DART_binaries_and_RTTOV_files(): +def _link_DART_binaries_and_RTTOV_files(): joinp = os.path.join # link DART binaries @@ -526,11 +541,12 @@ def link_DART_binaries_and_RTTOV_files(): raise RuntimeError('cluster.rttov_srcdir not set, but satellite channel will be assimilated') -def prepare_run_DART_folder(): +def prepare_run_DART_folder(prior_path_exp=False): os.makedirs(cluster.dart_rundir, exist_ok=True) # create directory to run DART in os.chdir(cluster.dart_rundir) - link_DART_binaries_and_RTTOV_files() + _link_DART_binaries_and_RTTOV_files() + _prepare_DART_grid_template(prior_path_exp=prior_path_exp) # remove any existing observation files os.system("rm -f input.nml obs_seq.in obs_seq.out obs_seq.out-orig obs_seq.final") @@ -560,8 +576,8 @@ def main(time, prior_init_time, prior_valid_time, prior_path_exp): """ obscfg = exp.observations do_QC = getattr(exp, "do_quality_control", False) # True: triggers additional evaluations of prior & posterior - prepare_run_DART_folder() - prepare_prior_ensemble(time, prior_init_time, prior_valid_time, prior_path_exp) + prepare_run_DART_folder(prior_path_exp) + prepare_prior_ensemble(time, prior_init_time, prior_valid_time, prior_path_exp) nml = dart_nml.write_namelist() print(" get observations with specified obs-error")