diff --git a/config/jet.py b/config/jet.py index 6eaf448a35666664ee9ff824ab075e143d8e786e..ebb475d6120fc2e88ed44c90aec7644f1cd2972c 100755 --- a/config/jet.py +++ b/config/jet.py @@ -12,12 +12,10 @@ cluster.np_WRF = 16 # binaries cluster.python = '/jetfs/home/lkugler/miniforge3/envs/verif/bin/python' cluster.ncks = '/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/nco-5.1.0-izrhxv24jqco5epjhf5ledsqwanojc5m/bin/ncks' -cluster.ideal = '/jetfs/home/lkugler/data/compile/bin/ideal-v4.3-quarter_ss-20250204.exe' -cluster.wrfexe = '/jetfs/home/lkugler/bin/wrf-v4.3_v1.22_ifort_20230413.exe' +cluster.ideal = '/jetfs/home/lkugler/data/compile/bin/ideal-v4.6.0_20250210_StS.exe' +cluster.wrfexe = '/jetfs/home/lkugler/data/compile/bin/wrf-v4.6.0_20250210_StS.exe' cluster.dart_modules = 'module purge; module load rttov/v13.2-gcc-8.5.0' -cluster.wrf_modules = """module purge; module load intel-oneapi-compilers/2022.2.1-zkofgc5 hdf5/1.12.2-intel-2021.7.1-w5sw2dq netcdf-fortran/4.5.3-intel-2021.7.1-27ldrnt netcdf-c/4.7.4-intel-2021.7.1-lnfs5zz intel-oneapi-mpi/2021.7.1-intel-2021.7.1-pt3unoz -export HDF5=/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/hdf5-1.12.2-w5sw2dqpcq2orlmeowleamoxr65dhhdc -""" +cluster.wrf_modules = """module purge; module load netcdf-fortran/4.5.3-intel-2021.7.1-27ldrnt""" # paths for data output cluster.wrf_rundir_base = '/jetfs/home/lkugler/data/run_WRF/' # path for temporary files @@ -33,8 +31,9 @@ cluster.dartwrf_dir = '/jetfs/home/lkugler/DART-WRF/' # other inputs cluster.geo_em_nature = '/jetfs/home/lkugler/data/sim_archive/geo_em.d01.nc.250m_1600x1600' cluster.geo_em_forecast = '/jetfs/home/lkugler/data/sim_archive/geo_em.d01.nc.2km_200x200' -cluster.obs_impact_filename = cluster.dartwrf_dir+'/templates/impactfactor_T.txt' -cluster.namelist = cluster.dartwrf_dir+'/config/templates/namelist.input' +#cluster.obs_impact_filename = cluster.dartwrf_dir+'/templates/impactfactor_T.txt' +cluster.namelist = cluster.dartwrf_dir+'/config/templates/namelist.input_nat_exact' +cluster.rttov_nml = cluster.dartwrf_dir + "/config/templates/obs_def_rttov.VIS+WV.nml" cluster.run_WRF = '/jetfs/home/lkugler/DART-WRF/dartwrf/run_ens.jet.sh' cluster.slurm_cfg = {"account": "lkugler", "partition": "all", diff --git a/config/templates/namelist.input b/config/templates/namelist.input index 02d0422b6357120a7b78654c1a8f81a299d965db..74cfd66dd9973319d823ee07118496cd1d5ea401 100644 --- a/config/templates/namelist.input +++ b/config/templates/namelist.input @@ -101,8 +101,9 @@ tke_adv_opt = 1, 1, 1, non_hydrostatic = .true., .true., .true., mix_full_fields = .true., .true., .true., - use_theta_m = 1, + use_theta_m = 1, top_lid = .true., + pert_coriolis = .true., / &bdy_control @@ -127,5 +128,5 @@ / &ideal - ideal_case = 2 + ideal_case = 9 ! les / diff --git a/config/templates/obs_def_rttov.VIS.nml b/config/templates/obs_def_rttov.VIS.nml deleted file mode 100644 index 50099921558e3ecd438fac23c97c86b24d4cb3b9..0000000000000000000000000000000000000000 --- a/config/templates/obs_def_rttov.VIS.nml +++ /dev/null @@ -1,71 +0,0 @@ -&obs_def_rttov_nml - rttov_sensor_db_file = 'rttov_sensor_db.csv' - first_lvl_is_sfc = .true. - mw_clear_sky_only = .false. - interp_mode = 1 - do_checkinput = .true. - apply_reg_limits = .true. - verbose = .true. - fix_hgpl = .false. - do_lambertian = .false. - lambertian_fixed_angle = .true. - rad_down_lin_tau = .true. - use_q2m = .false. - use_uv10m = .false. - use_wfetch = .false. - use_water_type = .false. - addrefrac = .true. - plane_parallel = .false. - use_salinity = .false. - cfrac_data = .true. - clw_data = .true. - rain_data = .false. - ciw_data = .true. - snow_data = .false. - graupel_data = .false. - hail_data = .false. - w_data = .false. - clw_scheme = 2 - clw_cloud_top = 322. - fastem_version = 6 - supply_foam_fraction = .false. - use_totalice = .true. - use_zeeman = .false. - cc_threshold = 0.05 - ozone_data = .false. - co2_data = .false. - n2o_data = .false. - co_data = .false. - ch4_data = .false. - so2_data = .false. - addsolar = .true. - rayleigh_single_scatt = .false. - do_nlte_correction = .false. - solar_sea_brdf_model = 2 - ir_sea_emis_model = 2 - use_sfc_snow_frac = .false. - add_aerosl = .false. - aerosl_type = 1 - add_clouds = .true. - ice_scheme = 1 - use_icede = .true. - idg_scheme = 1 - user_aer_opt_param = .false. - user_cld_opt_param = .false. - grid_box_avg_cloud = .true. - cldcol_threshold = -1.0 - cloud_overlap = 1 - ir_scatt_model = 2 - vis_scatt_model = 3 - dom_nstreams = 8 - dom_accuracy = 0.0 - dom_opdep_threshold = 0.0 - addpc = .false. - npcscores = -1 - addradrec = .false. - ipcreg = 1 - use_htfrtc = .false. - htfrtc_n_pc = -1 - htfrtc_simple_cloud = .false. - htfrtc_overcast = .false. -/ diff --git a/cycled_exp.py b/cycled_exp.py index 42b71b51688e12b62a41a86590da62c6cc51932c..91ab2babbb42b59569ad5e44f4a1f5a1cee7c496 100755 --- a/cycled_exp.py +++ b/cycled_exp.py @@ -9,7 +9,7 @@ if __name__ == "__main__": """ Run a cycled OSSE with WRF and DART. """ - w = WorkFlows(exp_config='exp_hires.py', server_config='jet.py') + w = WorkFlows(exp_config='exp_hires.py', server_config='jet_ACF.py') timedelta_integrate = dt.timedelta(minutes=15) timedelta_btw_assim = dt.timedelta(minutes=15) @@ -46,7 +46,7 @@ if __name__ == "__main__": init_time = dt.datetime(2008, 7, 30, 11,45) time = dt.datetime(2008, 7, 30, 12) last_assim_time = dt.datetime(2008, 7, 30, 13) - forecast_until = dt.datetime(2008, 7, 30, 13,15) + forecast_until = dt.datetime(2008, 7, 30, 18) w.prepare_WRFrundir(init_time) # id = w.run_ideal(depends_on=id) @@ -61,17 +61,16 @@ if __name__ == "__main__": # i.e. 13z as a prior to assimilate 12z observations prior_valid_time = time - if False: + if True: ACF_config = dict( var='WV73', - # 192, 96, 48, 24, 12), #(256, 128, 64, 32, 16), # # - scales_km=(12,), #192, 96, 48, 24, 12), + scales_km=(192, 96, 48, 24, 12), observed_width_km=384, dx_km_obs=1.0, dx_km_forecast=2.0, # ('value', 0.6), #('percentile', 30), #('value', 230), #('value', 0.6), #('value', 230), #('percentile', 90), # ('value', 0.6), # threshold=('value', 230), - difference=False, + difference=True, first_guess_pattern='/RT_wrfout_d01_%Y-%m-%d_%H:%M:%S.nc', # observed_data='/jetfs/scratch/a11716773/master_thesis_2023/data2/sim_archive/nature_dx=2000m/RT_wrfout_d01_%Y-%m-%d_%H:%M:%S.nc', @@ -82,8 +81,8 @@ if __name__ == "__main__": # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_VIS/OE_VIS_CF_0.6.csv', # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_VIS/OE_VIS_CF_0.6_difference.csv', # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_VIS/OE_VIS_SO_difference.csv', - obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_CF_230.csv', - # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_CF_230_difference.csv', + #obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_CF_230.csv', + obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_CF_230_difference.csv', # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_superobs.csv', # obs_err_csv='/jetfs/home/lkugler/CloudfractionDA/data/hrNat_IR/OE-WV73_SO_difference.csv', diff --git a/dartwrf/dart_nml.py b/dartwrf/dart_nml.py index a0474ee7b08efee5fad3c6ed330651a1c4ab0cb6..08204b7af47c93778cea9bf5e58bbd55107e688c 100644 --- a/dartwrf/dart_nml.py +++ b/dartwrf/dart_nml.py @@ -423,9 +423,8 @@ def write_namelist(just_prior_values=False): write_namelist_from_dict(nml, cluster.dart_rundir + "/input.nml") # append section for RTTOV - rttov_nml = cluster.dartwrf_dir + "/templates/obs_def_rttov.VIS.nml" - append_file(cluster.dart_rundir + "/input.nml", rttov_nml) - # alternatively, we could do this in cfg.py or the template input.nml in DART's model/wrf/work folder + if hasattr(cluster, 'rttov_nml'): + append_file(cluster.dart_rundir + "/input.nml", cluster.rttov_nml) return nml # in case we want to access namelist settings in python diff --git a/dartwrf/server_config.py b/dartwrf/server_config.py index 54df3835c982d055e9825b0f4162dcd68b94a0dc..ebb475d6120fc2e88ed44c90aec7644f1cd2972c 100755 --- a/dartwrf/server_config.py +++ b/dartwrf/server_config.py @@ -4,20 +4,18 @@ from dartwrf.exp_config import exp cluster = utils.ClusterConfig(exp) cluster.name = 'jet' -cluster.max_nproc = 12 +cluster.max_nproc = 20 cluster.use_slurm = True cluster.size_WRF_jobarray = exp.n_ens -cluster.np_WRF = 12 +cluster.np_WRF = 16 # binaries -cluster.python = '/jetfs/home/lkugler/miniconda3/envs/DART/bin/python' +cluster.python = '/jetfs/home/lkugler/miniforge3/envs/verif/bin/python' cluster.ncks = '/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/nco-5.1.0-izrhxv24jqco5epjhf5ledsqwanojc5m/bin/ncks' -cluster.ideal = '/jetfs/home/lkugler/bin/ideal-v4.3_v1.22.exe' -cluster.wrfexe = '/jetfs/home/lkugler/bin/wrf-v4.3_v1.22_ifort_20230413.exe' -cluster.dart_modules = 'module purge; module load rttov/v13.2-gcc-8.5.0; ' -cluster.wrf_modules = """module purge; module load intel-oneapi-compilers/2022.2.1-zkofgc5 hdf5/1.12.2-intel-2021.7.1-w5sw2dq netcdf-fortran/4.5.3-intel-2021.7.1-27ldrnt netcdf-c/4.7.4-intel-2021.7.1-lnfs5zz intel-oneapi-mpi/2021.7.1-intel-2021.7.1-pt3unoz -export HDF5=/jetfs/spack/opt/spack/linux-rhel8-skylake_avx512/intel-2021.7.1/hdf5-1.12.2-w5sw2dqpcq2orlmeowleamoxr65dhhdc -""" +cluster.ideal = '/jetfs/home/lkugler/data/compile/bin/ideal-v4.6.0_20250210_StS.exe' +cluster.wrfexe = '/jetfs/home/lkugler/data/compile/bin/wrf-v4.6.0_20250210_StS.exe' +cluster.dart_modules = 'module purge; module load rttov/v13.2-gcc-8.5.0' +cluster.wrf_modules = """module purge; module load netcdf-fortran/4.5.3-intel-2021.7.1-27ldrnt""" # paths for data output cluster.wrf_rundir_base = '/jetfs/home/lkugler/data/run_WRF/' # path for temporary files @@ -26,16 +24,32 @@ cluster.archive_base = '/jetfs/home/lkugler/data/sim_archive/' # paths used as input cluster.srcdir = '/jetfs/home/lkugler/data/compile/WRF-4.3/run' -cluster.dart_srcdir = '/jetfs/home/lkugler/data/compile/DART/DART-10.8.3/models/wrf/work' +cluster.dart_srcdir = '/jetfs/home/lkugler/data/compile/DART/DART-10.8.3_10pct/models/wrf/work/' cluster.rttov_srcdir = '/jetfs/home/lkugler/data/compile/RTTOV13/rtcoef_rttov13/' cluster.dartwrf_dir = '/jetfs/home/lkugler/DART-WRF/' # other inputs -cluster.geo_em_for_WRF_ideal = '/jetfs/home/lkugler/data/geo_em.d01.nc' -cluster.obs_impact_filename = cluster.dartwrf_dir+'/templates/impactfactor_T.txt' -cluster.namelist = cluster.dartwrf_dir+'/templates/namelist.input' +cluster.geo_em_nature = '/jetfs/home/lkugler/data/sim_archive/geo_em.d01.nc.250m_1600x1600' +cluster.geo_em_forecast = '/jetfs/home/lkugler/data/sim_archive/geo_em.d01.nc.2km_200x200' +#cluster.obs_impact_filename = cluster.dartwrf_dir+'/templates/impactfactor_T.txt' +cluster.namelist = cluster.dartwrf_dir+'/config/templates/namelist.input_nat_exact' +cluster.rttov_nml = cluster.dartwrf_dir + "/config/templates/obs_def_rttov.VIS+WV.nml" cluster.run_WRF = '/jetfs/home/lkugler/DART-WRF/dartwrf/run_ens.jet.sh' -cluster.slurm_cfg = {"account": "lkugler", "partition": "compute", #"nodelist": "jet07", +cluster.slurm_cfg = {"account": "lkugler", "partition": "all", "ntasks": "1", "ntasks-per-core": "1", "mem": "30G", "mail-type": "FAIL", "mail-user": "lukas.kugler@univie.ac.at"} + +# WRF file format, will only change if WRF changes +cluster.wrfout_format = '/wrfout_d01_%Y-%m-%d_%H:%M:%S' + +# pattern for the init_time folder in sim_archive +cluster.pattern_init_time = "/%Y-%m-%d_%H:%M/" + +# how an obs_seq.out file is archived +cluster.pattern_obs_seq_out = cluster.archivedir + \ + "/diagnostics/%Y-%m-%d_%H:%M_obs_seq.out" + +# how an obs_seq.final file is archived +cluster.pattern_obs_seq_final = cluster.archivedir + \ + "/diagnostics/%Y-%m-%d_%H:%M_obs_seq.final" diff --git a/free_forecast.py b/free_forecast.py index 17286a898f7317ac1f909ba7dcf8404fe1c439c7..9a8c3976b53a3392b0fd36b1f5f36b18ab679013 100755 --- a/free_forecast.py +++ b/free_forecast.py @@ -95,14 +95,13 @@ if True: # do a free run (all inits) inits = [dt.datetime(2008, 7, 30, 8)] inits += list(pd.date_range(start=dt.datetime(2008, 7, 30, 11), - end=dt.datetime(2008, 7, 30, 14), + end=dt.datetime(2008, 7, 30, 15), freq=dt.timedelta(minutes=15))) input_is_restart = False - # w.prepare_WRFrundir(inits[0]) # create initial conditions - #id = w.run_ideal(depends_on=id) - #sys.exit() + w.prepare_WRFrundir(inits[0]) # create initial conditions + id = w.run_ideal(depends_on=id) # id = wrfinput_insert_wbubble(perturb=True, depends_on=id) time = inits[0] @@ -147,28 +146,28 @@ if True: # do a free run (all inits) w.verify_sat(depends_on=id_sat) if False: # to continue a free run - start = dt.datetime(2008, 7, 30, 13, 30) + start = dt.datetime(2008, 7, 30, 14) end = dt.datetime(2008, 7, 30, 18) w.prepare_WRFrundir(start) - id = w.run_ideal(depends_on=id) + # id = w.run_ideal(depends_on=id) - # prior_path_exp = w.cluster.archivedir - # # prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.23_P2_noDA+1' - # prior_init_time = dt.datetime(2008, 7, 30, 13, 15) - # prior_valid_time = start - - # id = w.prepare_IC_from_prior( - # prior_path_exp, prior_init_time, prior_valid_time, depends_on=id) - - # id = w.run_ENS(begin=start, end=end, - # input_is_restart=True, - # #output_restart_interval=(end-start).total_seconds()/60, - # output_restart_interval=9999, - # depends_on=id) - # id = w.create_satimages(start, depends_on=id) - # w.verify_sat(id) - # w.verify_wrf(id) + prior_path_exp = w.cluster.archivedir + # prior_path_exp = '/jetfs/scratch/lkugler/data/sim_archive/exp_v1.23_P2_noDA+1' + prior_init_time = dt.datetime(2008, 7, 30, 8) + prior_valid_time = start + + id = w.prepare_IC_from_prior( + prior_path_exp, prior_init_time, prior_valid_time, depends_on=id) + + id = w.run_ENS(begin=start, end=end, + input_is_restart=True, + #output_restart_interval=(end-start).total_seconds()/60, + output_restart_interval=9999, + depends_on=id) + id = w.create_satimages(start, depends_on=id) + w.verify_sat(id) + w.verify_wrf(id) if False: # to continue a free run after spinup start = dt.datetime(2008, 7, 30, 12)