Skip to content
Snippets Groups Projects
Commit 141342b4 authored by Lukas Kugler's avatar Lukas Kugler
Browse files

obskind_read moved

parent 2cc847c5
No related branches found
No related tags found
No related merge requests found
......@@ -7,10 +7,10 @@ import time as time_module
import datetime as dt
import numpy as np
from dartwrf.utils import Config, symlink, copy, try_remove, print, shell, write_txt, load_dict
from dartwrf.utils import Config, symlink, copy, try_remove, print, shell, write_txt, obskind_read
from dartwrf import wrfout_add_geo
from dartwrf.obs import error_models as err
from dartwrf.obs import obsseq, obskind_read
from dartwrf.obs import obsseq
from dartwrf import dart_nml
......
"""
To be able to generate obs_seq.in files, we need a dictionary to convert obs kinds to numbers
a) we read the obs kind definitions (obs_kind_mod.f90 from DART code)
b) we generate a python file with this dictionary
# Note: to include it in the documentary, the file needs to exist also in the repository
# (so the documentation generator SPHINX can read it)
"""
import os, sys
import shutil
def _dict_to_py(d, outfile):
"""Write a python dictionary to a .py file
Args:
d (dict): dictionary to write
outfile (str): path to output file
Returns:
None
"""
with open(outfile, 'w') as f:
txt = '""" NOTE: This file is autogenerated! \nUse dartwrf/create_obskind_table.py to regenerate!\n"""\nobs_kind_nrs = {\n'
for k, v in d.items():
txt += '"'+k+'": '+str(v)+', \n'
txt += '}'
f.write(txt)
def _save_config_to_scriptsdir(server_config, original_scripts_dir):
try:
dir_path = os.path.dirname(os.path.realpath(__file__))
shutil.copyfile(dir_path+'/../config/'+server_config,
original_scripts_dir+'/server_config.py')
except shutil.SameFileError:
pass
def run(server_config='jet.py'):
"""Create obskind.py from obs_kind_mod.f90
"""
# usually /home/DART-WRF/dartwrf/
original_scripts_dir = '/'.join(__file__.split('/')[:-1])
# copy the original config to "scripts_dir"
_save_config_to_scriptsdir(server_config, original_scripts_dir)
# import the config from scripts_dir
sys.path.append(original_scripts_dir)
from server_config import cluster
from dartwrf import obs
obskind_dictionary = obs.obskind_read(cluster.dart_srcdir)
_dict_to_py(obskind_dictionary, original_scripts_dir+'/obs/obskind.py')
print('>>>', original_scripts_dir+'/obs/obskind.py', 'created')
if __name__ == '__main__':
run(server_config='jet_ACF.py')
def obskind_read(dart_srcdir: str) -> dict:
"""Read dictionary of observation types + ID numbers ("kind")
from DART f90 script and return it as python dictionary
"""
definitionfile = dart_srcdir + \
'/../../../assimilation_code/modules/observations/obs_kind_mod.f90'
with open(definitionfile, 'r') as f:
kind_def_f = f.readlines()
obskind_nrs = {}
for i, line in enumerate(kind_def_f):
if 'Integer definitions for DART OBS TYPES' in line:
# data starts below this line
i_start = i
break
for line in kind_def_f[i_start+1:]:
if 'MAX_DEFINED_TYPES_OF_OBS' in line:
# end of data
break
if '::' in line:
# a line looks like this
# integer, parameter, public :: MSG_4_SEVIRI_TB = 261
data = line.split('::')[-1].split('=')
kind_str = data[0].strip()
kind_nr = int(data[1].strip())
obskind_nrs[kind_str] = kind_nr
return obskind_nrs
\ No newline at end of file
......@@ -12,7 +12,6 @@ from pysolar.solar import get_altitude, get_azimuth
from dartwrf import utils
from dartwrf.utils import Config
from dartwrf.obs import calculate_obs_locations as col
from dartwrf.obs import obskind_read
# position on earth for RTTOV ray geometry
lat0 = 45.
......@@ -218,7 +217,7 @@ def create_obs_seq_in(cfg: Config, output_path='./obs_seq.in'):
os.makedirs(os.path.dirname(output_path), exist_ok=True)
obs_kind_nrs = obskind_read(cfg.dir_dart_src)
obs_kind_nrs = utils.obskind_read(cfg.dir_dart_src)
print('creating obs_seq.in:')
time_dt = _add_timezone_UTC(time_dt)
......
......@@ -3,10 +3,9 @@ import shutil
import glob
import warnings
from dartwrf.utils import Config, try_remove, print, shell, symlink, copy
from dartwrf.utils import Config, try_remove, print, shell, symlink, copy, obskind_read
import dartwrf.obs.create_obsseq_in as osi
from dartwrf.obs import obsseq, obskind_read
from dartwrf import assimilate as aso
from dartwrf.obs import obsseq
from dartwrf import wrfout_add_geo
......
......@@ -365,3 +365,31 @@ def save_dict(dictionary, fpath):
def load_dict(fpath):
with open(fpath, 'rb') as f:
return pickle.load(f)
def obskind_read(dart_srcdir: str) -> dict:
"""Read dictionary of observation types + ID numbers ("kind")
from DART f90 script and return it as python dictionary
"""
definitionfile = dart_srcdir + \
'/../../../assimilation_code/modules/observations/obs_kind_mod.f90'
with open(definitionfile, 'r') as f:
kind_def_f = f.readlines()
obskind_nrs = {}
for i, line in enumerate(kind_def_f):
if 'Integer definitions for DART OBS TYPES' in line:
# data starts below this line
i_start = i
break
for line in kind_def_f[i_start+1:]:
if 'MAX_DEFINED_TYPES_OF_OBS' in line:
# end of data
break
if '::' in line:
# a line looks like this
# integer, parameter, public :: MSG_4_SEVIRI_TB = 261
data = line.split('::')[-1].split('=')
kind_str = data[0].strip()
kind_nr = int(data[1].strip())
obskind_nrs[kind_str] = kind_nr
return obskind_nrs
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment