diff --git a/config/cfg.py b/config/cfg.py index 0c8131dd9a6df53dc9778b05da477c81572c147a..f48bf9fd770b92cad47396b6ee6f85c8499abd52 100755 --- a/config/cfg.py +++ b/config/cfg.py @@ -7,37 +7,44 @@ class ExperimentConfiguration(object): pass exp = ExperimentConfiguration() -exp.expname = "exp_v1.19_rr_WV_obs4-20_loc10" +exp.expname = "exp_v1.21_P3_wbub7_WV+VIS_obs10_loc20" exp.model_dx = 2000 exp.n_ens = 40 exp.n_nodes = 10 +#exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_P5+su_nat2/2008-07-30_07:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' +exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_P3_wbub7_nat/2008-07-30_12:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' #exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_Pwbub5_nat/2008-07-30_12:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' -exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.18_P1_nature/2008-07-30_06:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' +#exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.18_P1_nature/2008-07-30_06:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' +#exp.nature_wrfout = '/home/fs71386/lkugler/data/sim_archive/exp_v1.19_P4_nat/2008-07-30_07:00/1/wrfout_d01_%Y-%m-%d_%H:%M:%S' #exp.input_profile = '/home/fs71386/lkugler/wrf_profiles/data/wrf/ens/2021-05-04/raso.nat.001.wrfprof' #exp.input_profile = '/home/fs71386/lkugler/wrf_profiles/data/wrf/ens/2021-05-04/raso.nat.<iens>.wrfprof' -exp.input_profile = '/home/fs71386/lkugler/wrf_profiles/data/wrf/ens/2021-05-04/raso.fc.<iens>.wrfprof' -#exp.input_profile = '/home/fs71386/lkugler/wrf_profiles/data/wrf/ens/improved_pert10/raso.fc.<iens>.wrfprof' +#exp.input_profile = '/home/fs71386/lkugler/wrf_profiles/data/wrf/ens/2021-05-04/raso.fc.<iens>.wrfprof' +#exp.input_profile = '/home/fs71386/lkugler/data/initial_profiles/wrf/ens/large_mean_error/raso.nat.<iens>.wrfprof' +exp.input_profile = '/gpfs/data/fs71386/lkugler/initial_profiles/wrf/ens/2022-03-31/raso.fc.<iens>.wrfprof' +#exp.input_profile = '/gpfs/data/fs71386/lkugler/initial_profiles/wrf/ens/2022-03-31/raso.nat.<iens>.wrfprof' +#exp.input_profile = '/gpfs/data/fs71386/lkugler/initial_profiles/wrf/ens/2022-05-18_nopert/raso.nat.<iens>.wrfprof' +#exp.input_profile = '/gpfs/data/fs71386/lkugler/initial_profiles/wrf/ens/2022-05-18/raso.fc.<iens>.wrfprof' # localize vertically, if it has a vertical position # needs a horizontal scale too, to calculate the vertical normalization # since you can not specify different vertical localizations for diff. variables -#exp.cov_loc_vert_km_horiz_km = (2, 20) -exp.superob_km = 20 +exp.cov_loc_vert_km_horiz_km = (2, 20) +#exp.superob_km = 10 -n_obs = 5776 # 5776: 4km, 121: 30km, 256:16x16 (20km); 961: 10km resoltn # radar: n_obs for each observation height level +n_obs = 961 # 22500: 2km, 5776: 4km, 121: 30km, 256:16x16 (20km); 961: 10km resoltn # radar: n_obs for each observation height level vis = dict(plotname='VIS 0.6µm', plotunits='[1]', kind='MSG_4_SEVIRI_BDRF', sat_channel=1, n_obs=n_obs, error_generate=0.03, error_assimilate=0.06, - cov_loc_radius_km=10) + cov_loc_radius_km=20) wv73 = dict(plotname='Brightness temperature WV 7.3µm', plotunits='[K]', kind='MSG_4_SEVIRI_TB', sat_channel=6, n_obs=n_obs, - error_generate=1., error_assimilate=3., - cov_loc_radius_km=10) + error_generate=1., error_assimilate=False, + cov_loc_radius_km=20) ir108 = dict(plotname='Brightness temperature IR 10.8µm', plotunits='[K]', kind='MSG_4_SEVIRI_TB', sat_channel=9, n_obs=n_obs, @@ -46,15 +53,15 @@ ir108 = dict(plotname='Brightness temperature IR 10.8µm', plotunits='[K]', radar = dict(plotname='Radar reflectivity', plotunits='[dBz]', kind='RADAR_REFLECTIVITY', n_obs=n_obs, - error_generate=2.5, error_assimilate=5., - heights=np.arange(1000, 15001, 1000), - cov_loc_radius_km=10) + error_generate=2.5, error_assimilate=5, + heights=np.arange(2000, 14001, 2000), + cov_loc_radius_km=20) t = dict(plotname='Temperature', plotunits='[K]', kind='RADIOSONDE_TEMPERATURE', n_obs=n_obs, - error_generate=0.25, error_assimilate=0.5, - heights=np.arange(1000, 15001, 1000), - cov_loc_radius_km=10) + error_generate=0.2, error_assimilate=0.4, + heights=np.arange(1000, 17001, 2000), + cov_loc_radius_km=20) t2m = dict(plotname='SYNOP Temperature', plotunits='[K]', kind='SYNOP_TEMPERATURE', n_obs=n_obs, @@ -67,8 +74,9 @@ psfc = dict(plotname='SYNOP Pressure', plotunits='[dBz]', cov_loc_radius_km=32) -exp.observations = [wv73] -exp.update_vars = ['U', 'V', 'T', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'CLDFRA', 'PSFC'] +exp.observations = [vis, wv73] +exp.update_vars = ['U', 'V', 'W', 'T', 'THM', 'PH', 'MU', 'QVAPOR', 'QCLOUD', 'QICE', 'PSFC'] +#exp.update_vars = ['U', 'V', 'W', 'T', 'PH', 'MU', 'QVAPOR', 'PSFC'] # directory paths depend on the name of the experiment cluster.expname = exp.expname diff --git a/config/clusters.py b/config/clusters.py index 72baf5e01dbe986bc113d8306d3fbfbcccc80ecd..5b84038829bd3834617977b1f3305bd57da92709 100755 --- a/config/clusters.py +++ b/config/clusters.py @@ -77,7 +77,7 @@ vsc.archive_base = '/gpfs/data/fs71386/lkugler/sim_archive/' # paths used as input vsc.srcdir = '/gpfs/data/fs71386/lkugler/compile/WRF/WRF-4.3/run' -vsc.dart_srcdir = '/gpfs/data/fs71386/lkugler/compile/DART/DART-9.11.9/models/wrf/work' +vsc.dart_srcdir = '/gpfs/data/fs71386/lkugler/compile/DART/DART/models/wrf/work' vsc.rttov_srcdir = '/gpfs/data/fs71386/lkugler/compile/RTTOV13/rtcoef_rttov13/' vsc.scriptsdir = '/home/fs71386/lkugler/DART-WRF/dartwrf/' diff --git a/dartwrf/obsseq.py b/dartwrf/obsseq.py index 208510d67ec8a3cc6eecb9b937ad0e9c03cbe26d..e9340edb738347b7b45586837ef4aa57702fb251 100755 --- a/dartwrf/obsseq.py +++ b/dartwrf/obsseq.py @@ -1,3 +1,8 @@ +"""Read, modify and save DART obs_seq files. + +Not usable for creating obs_seq, since it does not know which metadata is necessary for each type +""" + import os, sys, shutil, warnings import numpy as np import pandas as pd diff --git a/dartwrf/utils.py b/dartwrf/utils.py index 89392b5cb3dbe5fc2d3b57135b8cd0e86220783f..10d178a8a0fa78f65da0455b184752fef1fabb33 100755 --- a/dartwrf/utils.py +++ b/dartwrf/utils.py @@ -1,6 +1,10 @@ import os, sys, shutil, glob import builtins as __builtin__ #copy = shutil.copy +import subprocess + +def shell(cmd): + subprocess.check_output(cmd.split(' '), shell=True) def print(*args): __builtin__.print(*args, flush=True) @@ -21,9 +25,6 @@ def try_remove(f): def mkdir(path): os.system('mkdir -p '+path) -def mkdir_srvx8(path): - os.system('ssh a1254888@srvx8.img.univie.ac.at mkdir -p '+path) - def script_to_str(path): return open(path, 'r').read() diff --git a/scheduler.py b/scheduler.py index 3885d0f911c4ff87ab11aa1ceb2518270503fa0f..9367f68828b3033e27a14a4d6a52bba374095466 100755 --- a/scheduler.py +++ b/scheduler.py @@ -52,10 +52,10 @@ def backup_scripts(): def prepare_WRFrundir(init_time): """Create WRF/run directories and wrfinput files """ - s = my_Slurm("prep_wrfrundir", cfg_update={"time": "5", "mail-type": "BEGIN"}) - id = s.run(cluster.python+' '+cluster.scripts_rundir+'/prepare_wrfrundir.py ' - +init_time.strftime('%Y-%m-%d_%H:%M')) - return id + cmd = cluster.python+' '+cluster.scripts_rundir+'/prepare_wrfrundir.py '+init_time.strftime('%Y-%m-%d_%H:%M') + print(cmd) + os.system(cmd) + # return id def run_ideal(depends_on=None): """Run ideal for every ensemble member""" @@ -200,7 +200,7 @@ def update_IC_from_DA(assim_time, depends_on=None): def create_satimages(init_time, depends_on=None): - s = my_Slurm("pRTTOV", cfg_update={"ntasks": "48", "time": "60", "nodes": "1"}) + s = my_Slurm("pRTTOV", cfg_update={"ntasks": "48", "time": "80", "nodes": "1"}) id = s.run('/home/fs71386/lkugler/RTTOV-WRF/withmodules /home/fs71386/lkugler/RTTOV-WRF/run_init.py '+cluster.archivedir +init_time.strftime('/%Y-%m-%d_%H:%M/'), depends_on=[depends_on]) @@ -220,12 +220,23 @@ def gen_obsseq(depends_on=None): return id -def verify(depends_on=None): - s = my_Slurm("verify-"+exp.expname, cfg_update={"time": "240", "mail-type": "FAIL,END", "ntasks": "1", +def verify_sat(depends_on=None): + s = my_Slurm("verif-SAT-"+exp.expname, cfg_update={"time": "120", "mail-type": "FAIL,END", "ntasks": "1", + "ntasks-per-node": "1", "ntasks-per-core": "1"}) + cmd = cluster.python_enstools+' /home/fs71386/lkugler/osse_analysis/plot_from_raw/analyze_fc.py '+exp.expname+' has_node sat verif1d FSS BS' + s.run(cmd, depends_on=[depends_on]) + +def verify_wrf(depends_on=None): + s = my_Slurm("verif-WRF-"+exp.expname, cfg_update={"time": "180", "mail-type": "FAIL,END", "ntasks": "1", "ntasks-per-node": "1", "ntasks-per-core": "1"}) - cmd = cluster.python_enstools+' /home/fs71386/lkugler/osse_analysis/plot_from_raw/analyze_fc.py '+exp.expname+' has_node sat wrf verif1d FSS BS' + cmd = cluster.python_enstools+' /home/fs71386/lkugler/osse_analysis/plot_from_raw/analyze_fc.py '+exp.expname+' has_node wrf verif1d FSS BS' s.run(cmd, depends_on=[depends_on]) +def verify_fast(depends_on=None): + s = my_Slurm("verif-fast-"+exp.expname, cfg_update={"time": "30", "mail-type": "FAIL", "ntasks": "1", + "ntasks-per-node": "1", "ntasks-per-core": "1"}) + cmd = cluster.python_enstools+' /home/fs71386/lkugler/osse_analysis/plot_fast/plot_single_exp.py '+exp.expname + s.run(cmd, depends_on=[depends_on]) ################################ if __name__ == "__main__": @@ -237,21 +248,37 @@ if __name__ == "__main__": backup_scripts() id = None - init_time = dt.datetime(2008, 7, 30, 12) - time = dt.datetime(2008, 7, 30, 12, 30) + if False: # warm bubble + prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P3_wbub7_noDA' + + init_time = dt.datetime(2008, 7, 30, 12) + time = dt.datetime(2008, 7, 30, 12,30) + last_assim_time = dt.datetime(2008, 7, 30, 13,30) + forecast_until = dt.datetime(2008, 7, 30, 18) + + prepare_WRFrundir(init_time) + id = run_ideal(depends_on=id) + id = wrfinput_insert_wbubble(depends_on=id) + + if True: # random + prior_path_exp = '/gpfs/data/fs71386/lkugler/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, 14) + forecast_until = dt.datetime(2008, 7, 30, 18) + + prepare_WRFrundir(init_time) + id = run_ideal(depends_on=id) - id = prepare_WRFrundir(init_time) - #id = run_ideal(depends_on=id) #prior_path_exp = cluster.archivedir # - #prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P2_noDA' - prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P3_wbub7_noDA' - #id = wrfinput_insert_wbubble(depends_on=id) + #prior_path_exp = '/gpfs/data/fs71386/lkugler/sim_archive/exp_v1.19_P5+su_noDA' prior_init_time = init_time prior_valid_time = time - while time <= dt.datetime(2008, 7, 30, 13, 30): + while time <= last_assim_time: # usually we take the prior from the current time # but one could use a prior from a different time from another run @@ -269,9 +296,9 @@ if __name__ == "__main__": # How long shall we integrate? timedelta_integrate = timedelta_btw_assim output_restart_interval = timedelta_btw_assim.total_seconds()/60 - if time == dt.datetime(2008, 7, 30, 13,30): #this_forecast_init.minute in [0,]: # longer forecast every full hour - timedelta_integrate = dt.timedelta(hours=4.5) - output_restart_interval = 9999 + if time == last_assim_time: #this_forecast_init.minute in [0,]: # longer forecast every full hour + timedelta_integrate = forecast_until - last_assim_time # dt.timedelta(hours=4) + output_restart_interval = 9999 #timedelta_btw_assim.total_seconds()/60 # 9999 # 3) Run WRF ensemble id = run_ENS(begin=time, # start integration from here @@ -291,4 +318,6 @@ if __name__ == "__main__": prior_init_time = time - timedelta_btw_assim id = gen_obsseq(id) - verify(id_sat) + verify_sat(id_sat) + verify_wrf(id) + verify_fast(id) diff --git a/templates/input.eval.nml b/templates/input.eval.nml index 92212cad31ee54584af062f76d80425f4c47fe1a..e9bfa9219a51991aa00c4ae67324df789859e183 100644 --- a/templates/input.eval.nml +++ b/templates/input.eval.nml @@ -139,7 +139,7 @@ '../../../observations/forward_operators/obs_def_gps_mod.f90', '../../../observations/forward_operators/obs_def_vortex_mod.f90', '../../../observations/forward_operators/obs_def_gts_mod.f90', - '../../../observations/forward_operators/obs_def_rttov_mod.f90', + '../../../observations/forward_operators/obs_def_rttov13_mod.f90', / &obs_kind_nml @@ -156,10 +156,10 @@ 'ACARS_TEMPERATURE', 'GPSRO_REFRACTIVITY', 'DOPPLER_RADIAL_VELOCITY', - 'RADAR_REFLECTIVITY', + 'RADAR_REFLECTIVITY', 'MSG_4_SEVIRI_RADIANCE', - 'MSG_4_SEVIRI_TB', - 'MSG_4_SEVIRI_BDRF', + 'MSG_4_SEVIRI_TB', + 'MSG_4_SEVIRI_BDRF', 'LAND_SFC_PRESSURE', 'SYNOP_SURFACE_PRESSURE', 'SYNOP_TEMPERATURE', @@ -214,7 +214,7 @@ 'V', 'QTY_V_WIND_COMPONENT', 'TYPE_V', 'UPDATE','999', 'W', 'QTY_VERTICAL_VELOCITY', 'TYPE_W', 'UPDATE','999', 'PH', 'QTY_GEOPOTENTIAL_HEIGHT', 'TYPE_GZ', 'UPDATE','999', - 'T', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', + 'THM', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', 'MU', 'QTY_PRESSURE', 'TYPE_MU', 'UPDATE','999', 'QVAPOR','QTY_VAPOR_MIXING_RATIO', 'TYPE_QV', 'UPDATE','999', 'QICE', 'QTY_ICE_MIXING_RATIO', 'TYPE_QI', 'UPDATE','999', diff --git a/templates/input.nml b/templates/input.nml index 31e34c1292ce18ea647b5ef2156aae13c935cd9a..9f7de60eed02a08a6bd904dbf8aa952defd9c6c0 100644 --- a/templates/input.nml +++ b/templates/input.nml @@ -141,7 +141,7 @@ '../../../observations/forward_operators/obs_def_gps_mod.f90', '../../../observations/forward_operators/obs_def_vortex_mod.f90', '../../../observations/forward_operators/obs_def_gts_mod.f90', - '../../../observations/forward_operators/obs_def_rttov_mod.f90', + '../../../observations/forward_operators/obs_def_rttov13_mod.f90', / &obs_kind_nml @@ -216,7 +216,7 @@ 'V', 'QTY_V_WIND_COMPONENT', 'TYPE_V', 'UPDATE','999', 'W', 'QTY_VERTICAL_VELOCITY', 'TYPE_W', 'UPDATE','999', 'PH', 'QTY_GEOPOTENTIAL_HEIGHT', 'TYPE_GZ', 'UPDATE','999', - 'T', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', + 'THM', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', 'MU', 'QTY_PRESSURE', 'TYPE_MU', 'UPDATE','999', 'QVAPOR','QTY_VAPOR_MIXING_RATIO', 'TYPE_QV', 'UPDATE','999', 'QICE', 'QTY_ICE_MIXING_RATIO', 'TYPE_QI', 'UPDATE','999', diff --git a/templates/input.prioronly.nml b/templates/input.prioronly.nml index 994e6e33cf499d236705e3e2dee8c57dd7c17d59..f5d30f4ee4ef2083ecea61e9b301c4cb6356e61a 100644 --- a/templates/input.prioronly.nml +++ b/templates/input.prioronly.nml @@ -139,7 +139,7 @@ '../../../observations/forward_operators/obs_def_gps_mod.f90', '../../../observations/forward_operators/obs_def_vortex_mod.f90', '../../../observations/forward_operators/obs_def_gts_mod.f90', - '../../../observations/forward_operators/obs_def_rttov_mod.f90', + '../../../observations/forward_operators/obs_def_rttov13_mod.f90', / &obs_kind_nml @@ -210,7 +210,7 @@ 'V', 'QTY_V_WIND_COMPONENT', 'TYPE_V', 'UPDATE','999', 'W', 'QTY_VERTICAL_VELOCITY', 'TYPE_W', 'UPDATE','999', 'PH', 'QTY_GEOPOTENTIAL_HEIGHT', 'TYPE_GZ', 'UPDATE','999', - 'T', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', + 'THM', 'QTY_POTENTIAL_TEMPERATURE','TYPE_T', 'UPDATE','999', 'MU', 'QTY_PRESSURE', 'TYPE_MU', 'UPDATE','999', 'QVAPOR','QTY_VAPOR_MIXING_RATIO', 'TYPE_QV', 'UPDATE','999', 'QICE', 'QTY_ICE_MIXING_RATIO', 'TYPE_QI', 'UPDATE','999', diff --git a/templates/obs_def_rttov.IR.nml b/templates/obs_def_rttov.IR.nml index 26c0098988fa1d76b30bced0a1af7717f785746f..09deccdd87f37096ce78fe1a24d8b7969c8767ce 100644 --- a/templates/obs_def_rttov.IR.nml +++ b/templates/obs_def_rttov.IR.nml @@ -48,7 +48,7 @@ aerosl_type = 1 add_clouds = .true. ice_scheme = 1 - use_icede = .false. + use_icede = .true. idg_scheme = 2 user_aer_opt_param = .false. user_cld_opt_param = .false. diff --git a/templates/obs_def_rttov.VIS.nml b/templates/obs_def_rttov.VIS.nml index 2b97f672ef18403cbcbd7bce6bd8120e06eed0f7..50099921558e3ecd438fac23c97c86b24d4cb3b9 100644 --- a/templates/obs_def_rttov.VIS.nml +++ b/templates/obs_def_rttov.VIS.nml @@ -48,7 +48,7 @@ aerosl_type = 1 add_clouds = .true. ice_scheme = 1 - use_icede = .false. + use_icede = .true. idg_scheme = 1 user_aer_opt_param = .false. user_cld_opt_param = .false. diff --git a/tests/test_dart-rttov.py b/tests/test_dart-rttov.py new file mode 100644 index 0000000000000000000000000000000000000000..11ad6f349e249e44b247f7d417b2e012b6af423e --- /dev/null +++ b/tests/test_dart-rttov.py @@ -0,0 +1,154 @@ +import os, filecmp, shutil +import numpy as np +import datetime as dt +import pandas as pd + +from config.cfg import exp, cluster +from dartwrf import obsseq +import dartwrf.create_obsseq as osq +import dartwrf.assim_synth_obs as aso +from dartwrf import wrfout_add_geo + +import matplotlib as mpl +import proplot as plt +import xarray as xr + +n_obs = 22500 +vis = dict(plotname='VIS 0.6µm', plotunits='[1]', + kind='MSG_4_SEVIRI_BDRF', sat_channel=1, n_obs=n_obs, + error_generate=0, error_assimilate=0.05, + cov_loc_radius_km=20) +wv73 = dict(plotname='Brightness temperature WV 7.3µm', plotunits='[K]', + kind='MSG_4_SEVIRI_TB', sat_channel=6, n_obs=n_obs, + error_generate=0, error_assimilate=False, + cov_loc_radius_km=20) + +def test_rttov(): + + times = pd.date_range(start=dt.datetime(2008, 7, 30, 13,30), + end=dt.datetime(2008, 7, 30, 15,30), + freq=dt.timedelta(minutes=15)) + + case = 'exp_v1.18_P1_nature' + # case = 'exp_v1.19_P3_wbub7_nat' + for obsvar in ['VIS06']: #'WV73', + + for time in times: + + fname = '/home/fs71386/lkugler/data/analysis/'+case+'/dart-rttov-compare_'+obsvar+time.strftime('_%H:%M')+'-2.png' + + # if os.path.isfile(fname): + # print(fname, 'skipping...') + # continue + + ds = xr.open_dataset('/home/fs71386/lkugler/data/sim_archive/'+case+'/2008-07-30_06:00/1/'+time.strftime('RT2_wrfout_d01_2008-07-30_%H:%M:00.nc')) + # + da = ds[obsvar].squeeze() + + + shutil.copy('/home/fs71386/lkugler/data/sim_archive/'+case+'/2008-07-30_06:00/1/'+time.strftime('wrfout_d01_2008-07-30_%H:%M:00'), + cluster.dartrundir + "/wrfout_d01") + + wrfout_add_geo.run( + cluster.dartrundir + "/../geo_em.d01.nc", cluster.dartrundir + "/wrfout_d01" + ) + + + error_generate = np.zeros(n_obs) + if obsvar == 'VIS06': + osq.create_obsseqin_alltypes(time, [vis]) + else: + osq.create_obsseqin_alltypes(time, [wv73]) + aso.set_DART_nml() + aso.run_perfect_model_obs() + + + obs = obsseq.ObsSeq(cluster.dartrundir+'/obs_seq.out') + obs_map = obs.df.truth.values.reshape(150,150) + + + fig, ax = plt.subplots(ncols=2) + + if obsvar == 'VIS06': + norm = mpl.colors.Normalize(vmin=0, vmax=1) + levels = plt.arange(0, 1, .05) + else: + norm = mpl.colors.Normalize(vmin=210, vmax=260) + levels = plt.arange(200, 260, 5) + + ax[0].pcolormesh(obs_map, norm=norm, levels=levels) + ax[0].set_title('DART-RTTOV') + m1 = ax[1].pcolormesh(da.values[24:175,24:175], norm=norm, levels=levels) + ax[1].set_title('py-RTTOV') + fig.colorbar(m1, loc='r') + fig.suptitle(time.strftime('%H:%M')) + + fig.savefig(fname) + print(fname) + + + + fig, ax = plt.subplots() + + # norm = mpl.colors.Normalize(vmin=0, vmax=1) + # levels = plt.arange(0, 1, .05) + # norm = mpl.colors.Normalize(vmin=210, vmax=260) + # levels = plt.arange(200, 260, 5) + + diff = da.values[25:175,25:175] - obs_map + + ax[0].pcolormesh(diff, norm=norm, levels=levels) + ax[0].set_title('pyRTTOV - DART-RTTOV') + fig.colorbar(m1, loc='r') + fig.suptitle(time.strftime('%H:%M')) + + fname = '/home/fs71386/lkugler/data/analysis/'+case+'/dart-rttov-compare_'+obsvar+time.strftime('_%H:%M')+'-diff.png' + fig.savefig(fname) + print(fname) + + #from IPython import embed; embed() + + + # shutil.copy(cluster.dartrundir+'/obs_seq.out', + # '/home/fs71386/lkugler/data/analysis/'+case+time.strftime('/obs_seq_'+obsvar+'_%H:%M.out')) + + + # fig, ax = plt.subplots() + # m = ax.pcolormesh(obs_map) + # ax.colorbar(m, loc='r') + # ax.set_title(time.strftime('%H:%M')) + # fname = '/home/fs71386/lkugler/data/analysis/exp_v1.18_P1_nature/dart-rttov-output_'+time.strftime('%H:%M')+'.png' + # fig.savefig(fname) + # print(fname) + + +if __name__ == '__main__': + test_rttov() + pass + # case = 'test_IR+VIS' + # time = dt.datetime(2008,7,30,13,30) + + + + # error_generate = np.zeros(n_obs) + # osq.create_obsseqin_alltypes(time, [vis]) + # aso.set_DART_nml() + # aso.run_perfect_model_obs() + + + # obs = obsseq.ObsSeq(cluster.dartrundir+'/obs_seq.out') + # obs_map = obs.df.truth.values.reshape(150,150) + + + # ds = xr.open_dataset('/home/fs71386/lkugler/data/run_DART/test_IR+VIS/RT_wrfout_d01_cloudy.nc') + # da = ds['VIS06'].squeeze() + # pyrttov = da.values[25:175,25:175] + + # diff = pyrttov - obs_map + + # i, j = np.unravel_index(diff.argmax(), (150,150)) + # print(i,j) + + # print(pyrttov[i,j], obs_map[i,j]) + + # from IPython import embed; embed() diff --git a/tests/test_obsseq.py b/tests/test_obsseq.py index 516f31400e7f902408ee6a796bf7201a305c3aa9..96d7dbe013b9d5a15ca6bf6fbcf9e43ac5286a01 100644 --- a/tests/test_obsseq.py +++ b/tests/test_obsseq.py @@ -14,20 +14,44 @@ def test_oso(): obs = obsseq.ObsSeq(input) # select a subset - obs.superob(window_km=50) + obs.df = obs.df.superob(window_km=50) + + #obs.plot(f_out="/home/fs71386/lkugler/data/analysis/map_obs_superobs_obs10-50.png") # write to obs_seq.out in DART format obs.to_dart(f=output) - assert filecmp.cmp(output, output_true) + #assert filecmp.cmp(output, output_true) + +def test_plot(): + input = cluster.scriptsdir + "/../tests/obs_seq.out_obs2" + obs = obsseq.ObsSeq(input) + # select a subset + obs.df = obs.df.superob(window_km=10) + + obs.plot(f_out="/home/fs71386/lkugler/data/analysis/map_obs_superobs_obs2-10.png") def test_osf(): input = cluster.scriptsdir + "/../tests/obs_seq.final" obs = obsseq.ObsSeq(input) - prior_Hx = obs.get_prior_Hx_matrix() + prior_Hx = obs.df.get_prior_Hx() # TODO: compare with given truth +def test_superob(): + input = cluster.scriptsdir + "/../tests/obs_seq.out_obs2" + output = cluster.scriptsdir + "/../tests/obs_seq.test.out" + obs = obsseq.ObsSeq(input) + + obs.df = obs.df.superob(window_km=10) + + obs.to_dart(f=output) + + obs = obsseq.ObsSeq(output) + + from IPython import embed; embed() + if __name__ == '__main__': - pass \ No newline at end of file + test_superob() + pass