From 20a26ae2d3e223cd1900304a49da80ec9ba20782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20J=C3=A4hn?= Date: Fri, 3 Nov 2023 10:22:09 +0100 Subject: [PATCH] Add icon-art-oem-test (#40) * Add config.yaml * Replace inidate with startdate_sim * Fix icontools scripts * Fix chem file names * Set correct input file names * Small fix for latbc grid file name * Add prefix to chem file * GitHub Action: Apply Pep8-formatting * Fix for chem file * GitHub Action: Apply Pep8-formatting * More corrections for chem file * GitHub Action: Apply Pep8-formatting * Fix art namelist * Fix art input folder * Update on how to build icon(-art) * Update .gitignore * Correcting case name in comment * Use config variables for num_procs in namelist * Fix ICON namelists * Remove config.py * Only process initial file if present * GitHub Action: Apply Pep8-formatting * Add start of icontools runscript to logger --------- Co-authored-by: github-actions --- .gitignore | 1 + cases/icon-art-global-test/icon_runjob.cfg | 2 +- cases/icon-art-oem-test/config.py | 153 ------------------ cases/icon-art-oem-test/config.yaml | 71 ++++++++ cases/icon-art-oem-test/icon_runjob.cfg | 62 +++---- .../icontools_remap_00_lbc_runjob.cfg | 32 ++-- .../icontools_remap_ic_chem_runjob.cfg | 10 +- .../icontools_remap_ic_runjob.cfg | 12 +- .../icontools_remap_lbc_chem_runjob.cfg | 24 +-- .../icontools_remap_lbc_rest_runjob.cfg | 26 +-- jenkins/scripts/build_icon-art.sh | 3 +- jenkins/scripts/build_icon.sh | 5 +- jobs/check_output.py | 2 +- jobs/prepare_data.py | 115 ++++++------- 14 files changed, 224 insertions(+), 294 deletions(-) delete mode 100644 cases/icon-art-oem-test/config.py create mode 100644 cases/icon-art-oem-test/config.yaml diff --git a/.gitignore b/.gitignore index 23536aa6..2838e4a4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ input/ output/ work/ src/*/ +*.code-workspace diff --git a/cases/icon-art-global-test/icon_runjob.cfg b/cases/icon-art-global-test/icon_runjob.cfg index 0604e023..610f0d0f 100644 --- a/cases/icon-art-global-test/icon_runjob.cfg +++ b/cases/icon-art-global-test/icon_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="{cfg.casename}_{cfg.startdate_sim_yyyymmddhh}_{cfg.forecasttime}" #SBATCH --account={cfg.compute_account} #SBATCH --time={cfg.icon_walltime} #SBATCH --nodes={cfg.icon_np_tot} diff --git a/cases/icon-art-oem-test/config.py b/cases/icon-art-oem-test/config.py deleted file mode 100644 index 40b2fbbb..00000000 --- a/cases/icon-art-oem-test/config.py +++ /dev/null @@ -1,153 +0,0 @@ -import os -""" -Configuration file for the 'icon-art-oem-test' case with ICON-ART -""" - -# GENERAL SETTINGS =========================================================== -user = os.environ['USER'] -if user == 'jenkins': - compute_account = 'g110' -elif os.path.exists(os.environ['HOME'] + '/.acct'): - with open(os.environ['HOME'] + '/.acct', 'r') as file: - compute_account = file.read().rstrip() -else: - compute_account = os.popen("id -gn").read().splitlines()[0] -compute_host = 'daint' -compute_queue = 'normal' -constraint = 'gpu' # 'mc' - -model = 'icon-art-oem' -restart_step = 24 # hours - -# Number of tasks per node -ntasks_per_node = 36 if constraint == 'mc' else 12 - -# Case name = pathname in cases/ -casename = os.path.basename(os.path.dirname(os.path.realpath(__file__))) - -# Root directory of the sourcecode of the chain (where run_chain.py is) -chain_src_dir = os.getcwd() - -# Root directory of the working space of the chain -work_root = os.path.join(chain_src_dir, 'work') - -# Case directory -case_dir = os.path.join(chain_src_dir, 'cases', casename) - -# PRE-PROCESSING ============================================================= -input_root = os.path.join(chain_src_dir, 'input', model) -# meteo -input_root_meteo = os.path.join(input_root, 'meteo') -meteo_prefix = 'ifs_' -meteo_nameformat = meteo_prefix + '%Y%m%d%H' -meteo_suffix = '.grb' -meteo_inc = 3 - -input_root_chem = os.path.join(input_root, 'chem') -input_root_icbc = os.path.join(input_root, 'icbc') -chem_prefix = 'cams_gqpe_' -chem_nameformat = chem_prefix + '%Y%m%d_%H' -chem_suffix = '.grb' - -icontools_runjobs = [ - 'icontools_remap_ic_runjob.cfg', - 'icontools_remap_00_lbc_runjob.cfg', - 'icontools_remap_lbc_rest_runjob.cfg', - 'icontools_remap_ic_chem_runjob.cfg', - 'icontools_remap_lbc_chem_runjob.cfg', -] - -# Input data for runscript---------------------------------------------------- -# Grid - -input_files = { - 'radiation_grid_filename': ['testcase_DOM01.parent.nc', 'grid'], - 'dynamics_grid_filename': ['testcase_DOM01.nc', 'grid'], - 'map_file_latbc': ['map_file.latbc', 'grid'], - 'lateral_boundary_grid': ['lateral_boundary.grid.nc', 'grid'], - 'extpar_filename': - ['external_parameter_icon_testcase_DOM01_tiles.nc', 'grid'], - 'cldopt_filename': ['rrtm_cldopt.nc', 'rad'], - 'lrtm_filename': ['rrtmg_lw.nc', 'rad'], - 'map_file_ana': ['map_file.ana', 'mapping'], - 'chemtracer_xml_filename': ['tracers_oh_pntsrc.xml', 'XML'], - 'pntSrc_xml_filename': ['pntSrc_example.xml', 'XML'], - 'oem_gridded_emissions_nc': ['tno_3cat.nc', 'OEM'], - 'oem_vertical_profiles_nc': ['vertical_profiles.nc', 'OEM'], - 'oem_hourofday_nc': ['hourofday.nc', 'OEM'], - 'oem_dayofweek_nc': ['dayofweek.nc', 'OEM'], - 'oem_monthofyear_nc': ['monthofyear.nc', 'OEM'], -} - -# File names ----------------------------------------------------------------- -latbc_filename = "ifs__lbc.nc" -inidata_prefix = "ifs_init_" -inidata_nameformat = inidata_prefix + '%Y%m%d%H' -inidata_filename_suffix = ".nc" - -output_filename = "icon-art-oem-test" -filename_format = "_DOM_" - -lateral_boundary_grid_order = 'lateral_boundary' - -# ART settings---------------------------------------------------------------- -art_input_folder = os.path.join(input_root, 'ART') - -# SIMULATION ================================================================= -# ICON ----------------------------------------------------------------------- -# Executable -icon_bin = os.path.join(chain_src_dir, 'src', 'icon-art', 'bin', 'icon') - -# eccodes -eccodes_dir = os.path.join(chain_src_dir, 'input', 'eccodes_definitions') - -# Icontools executables -iconremap_bin = 'iconremap' -iconsub_bin = 'iconsub' - -# Namelists and slurm runscript templates -icon_runjob = os.path.join(case_dir, 'icon_runjob.cfg') - -# Walltimes and domain decomposition -if compute_queue == "normal": - icon_walltime = "00:30:00" - icon_np_tot = 16 -elif compute_queue == "debug": - icon_walltime = "00:30:00" - icon_np_tot = 10 - -# POST-PROCESSING ============================================================ -# REDUCE_OUTPUT -------------------------------------------------------------- -convert_gas = True -output_levels = 20 - -# POST_COSMO ----------------------------------------------------------------- -# Root directory where the output of the chain is copied to -output_root = os.path.join(chain_src_dir, "output", casename) - -# VERIFY_CHAIN --------------------------------------------------------------- -reference_dir = os.path.join(input_root, "reference_output") - -# If the output file that gets compared to the reference is not at the location -# that post_icon copied it to, give the path to it here. Else leave it 'None' -#output_dir = None -output_dir = os.path.join(work_root, casename, '2018010100_0_24', 'icon', - 'output') - -# variables_to_check is a dict() with a tuple() of filenames as key and a list -# of variables-names as value. The tuple consists of the filenames of the two -# files to check, the list contains the variable-names that are compared. -# The verify_chain job will look for the files in the reference_dir (first tuple -# element) and the ouput_dir (second tuple element) -values_to_check = { - ("icon-oem-pgi-20.1.1-cpu-20210215-NWP_LAM_DOM01_01000000.nc", "NWP_LAM_DOM01_01000000.nc"): - [ - 'temp', - 'pres', - 'u', - 'v', - 'w', - 'OEM_tracer_1', - 'OEM_tracer_2', - ] -} diff --git a/cases/icon-art-oem-test/config.yaml b/cases/icon-art-oem-test/config.yaml new file mode 100644 index 00000000..5a3d8511 --- /dev/null +++ b/cases/icon-art-oem-test/config.yaml @@ -0,0 +1,71 @@ +# Configuration file for the 'icon-art-oem-test' case with ICON + +model: icon-art-oem +constraint: gpu +run_on: cpu +compute_queue: normal +ntasks_per_node: 12 +restart_step: PT6H +startdate: 2018-01-01T00:00:00Z +enddate: 2018-01-01T12:00:00Z + +eccodes_dir: ./input/eccodes_definitions +iconremap_bin: iconremap +iconsub_bin: iconsub +latbc_filename: ifs__lbc.nc +inidata_prefix: ifs_init_ +inidata_nameformat: '%Y%m%d%H' +inidata_filename_suffix: .nc +output_filename: icon-art-oem-test +filename_format: _DOM_ +lateral_boundary_grid_order: lateral_boundary +art_input_folder: ./input/icon-art-oem/ART + +meteo: + dir: ./input/meteo + prefix: ifs_ + nameformat: '%Y%m%d%H' + suffix: .grb + inc: 3 + +chem: + dir: ./input/icon-art-oem/chem + prefix: cams_gqpe_ + nameformat: '%Y%m%d_%H' + suffix: .grb + inc: 3 + +icontools_runjobs: + - icontools_remap_ic_runjob.cfg + - icontools_remap_00_lbc_runjob.cfg + - icontools_remap_lbc_rest_runjob.cfg + - icontools_remap_ic_chem_runjob.cfg + - icontools_remap_lbc_chem_runjob.cfg + +input_files: + radiation_grid_filename: ./input/icon-art-oem/grid/testcase_DOM01.parent.nc + dynamics_grid_filename: ./input/icon-art-oem/grid/testcase_DOM01.nc + map_file_latbc: ./input/icon-art-oem/grid/map_file.latbc + lateral_boundary_grid: ./input/icon-art-oem/grid/lateral_boundary.grid.nc + extpar_filename: ./input/icon-art-oem/grid/external_parameter_icon_testcase_DOM01_tiles.nc + cldopt_filename: ./input/icon-art-oem/rad/rrtm_cldopt.nc + lrtm_filename: ./input/icon-art-oem/rad/rrtmg_lw.nc + map_file_ana: ./input/icon-art-oem/mapping/map_file.ana + chemtracer_xml_filename: ./input/icon-art-oem/XML/tracers_oh_pntsrc.xml + pntSrc_xml_filename: ./input/icon-art-oem/XML/pntSrc_example.xml + oem_gridded_emissions_nc: ./input/icon-art-oem/OEM/tno_3cat.nc + oem_vertical_profiles_nc: ./input/icon-art-oem/OEM/vertical_profiles.nc + oem_hourofday_nc: ./input/icon-art-oem/OEM/hourofday.nc + oem_dayofweek_nc: ./input/icon-art-oem/OEM/dayofweek.nc + oem_monthofyear_nc: ./input/icon-art-oem/OEM/monthofyear.nc + +icon: + binary_file: ./src/icon-art/bin/icon + runjob_filename: icon_runjob.cfg + compute_queue: normal + walltime: '00:10:00' + np_tot: 8 + np_io: 1 + np_restart: 1 + np_prefetch: 1 + diff --git a/cases/icon-art-oem-test/icon_runjob.cfg b/cases/icon-art-oem-test/icon_runjob.cfg index a19192ce..3e69720c 100644 --- a/cases/icon-art-oem-test/icon_runjob.cfg +++ b/cases/icon-art-oem-test/icon_runjob.cfg @@ -1,11 +1,9 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="{cfg.casename}_{cfg.startdate_sim_yyyymmddhh}_{cfg.forecasttime}" #SBATCH --account={cfg.compute_account} #SBATCH --time={cfg.icon_walltime} #SBATCH --nodes={cfg.icon_np_tot} -#SBATCH --ntasks-per-core=1 #SBATCH --ntasks-per-node={cfg.ntasks_per_node} -#SBATCH --cpus-per-task=1 #SBATCH --partition={cfg.compute_queue} #SBATCH --constraint={cfg.constraint} #SBATCH --hint=nomultithread @@ -39,38 +37,42 @@ ln -sf {cfg.art_input_folder}/runctrl_examples/init_ctrl/* . cat > icon_master.namelist << EOF ! master_nml: ---------------------------------------------------------------- &master_nml - lrestart = {cfg.lrestart} ! .TRUE.=current experiment is resumed + lrestart = {cfg.lrestart} ! .TRUE.=current experiment is resumed + read_restart_namelists = .true. +/ + +! master_time_control_nml: --------------------------------------------------- +&master_time_control_nml + calendar = 'proleptic gregorian' + restartTimeIntval = '{cfg.restart_step}' + checkpointTimeIntval = '{cfg.restart_step}' + experimentStartDate = '{cfg.ini_datetime_string}' + experimentStopDate = '{cfg.end_datetime_string}' / ! master_model_nml: repeated for each model ---------------------------------- &master_model_nml model_type = 1 ! identifies which component to run (atmosphere,ocean,...) model_name = "ATMO" ! character string for naming this component. - model_namelist_filename = "NAMELIST_NWP" ! file name containing the model namelists + model_namelist_filename = "NAMELIST_{cfg.casename}" ! file name containing the model namelists model_min_rank = 1 ! start MPI rank for this model model_max_rank = 65536 ! end MPI rank for this model model_inc_rank = 1 ! stride of MPI ranks / - -! time_nml: specification of date and time------------------------------------ -&time_nml - ini_datetime_string = "{cfg.ini_datetime_string}" ! initial date and time of the simulation - end_datetime_string = "{cfg.end_datetime_string}" ! end date and time of the simulation 10T00 -/ EOF # ---------------------------------------------------------------------- # model namelists # ---------------------------------------------------------------------- -cat > NAMELIST_NWP << EOF +cat > NAMELIST_{cfg.casename} << EOF ! parallel_nml: MPI parallelization ------------------------------------------- ¶llel_nml nproma = 128 ! loop chunk length p_test_run = .FALSE. ! .TRUE. means verification run for MPI parallelization - num_io_procs = 1 ! number of I/O processors - num_restart_procs = 0 ! number of restart processors - num_prefetch_proc = 1 ! number of processors for LBC prefetching + num_io_procs = {cfg.icon_np_io} ! number of I/O processors + num_restart_procs = {cfg.icon_np_restart} ! number of restart processors + num_prefetch_proc = {cfg.icon_np_prefetch} ! number of processors for LBC prefetching iorder_sendrecv = 3 ! sequence of MPI send/receive calls / @@ -108,18 +110,18 @@ cat > NAMELIST_NWP << EOF cart_cheminit_type = 'EMAC' cart_cheminit_coord = '{inidata_filename}' iart_seasalt = 0 ! enable seasalt - cart_chemtracer_xml = '{cfg.chemtracer_xml_filename_scratch}' ! path to xml file for passive tracers - cart_pntSrc_xml = '{cfg.pntSrc_xml_filename_scratch}' + cart_chemtracer_xml = '{cfg.input_files_scratch_chemtracer_xml_filename}' ! path to xml file for passive tracers + cart_pntSrc_xml = '{cfg.input_files_scratch_pntSrc_xml_filename}' cart_input_folder = '{cfg.art_input_folder}' ! absolute Path to ART source code / ! oem_nml: online emission module --------------------------------------------- &oemctrl_nml - gridded_emissions_nc = '{cfg.oem_gridded_emissions_nc_scratch}' - vertical_profile_nc = '{cfg.oem_vertical_profiles_nc_scratch}' - hour_of_day_nc = '{cfg.oem_hourofday_nc_scratch}' - day_of_week_nc = '{cfg.oem_dayofweek_nc_scratch}' - month_of_year_nc = '{cfg.oem_monthofyear_nc_scratch}' + gridded_emissions_nc = '{cfg.input_files_scratch_oem_gridded_emissions_nc}' + vertical_profile_nc = '{cfg.input_files_scratch_oem_vertical_profiles_nc}' + hour_of_day_nc = '{cfg.input_files_scratch_oem_hourofday_nc}' + day_of_week_nc = '{cfg.input_files_scratch_oem_dayofweek_nc}' + month_of_year_nc = '{cfg.input_files_scratch_oem_monthofyear_nc}' / ! diffusion_nml: horizontal (numerical) diffusion ---------------------------- @@ -145,7 +147,7 @@ cat > NAMELIST_NWP << EOF ! extpar_nml: external data -------------------------------------------------- &extpar_nml itopo = 1 ! topography (0:analytical) - extpar_filename = '{cfg.extpar_filename_scratch}' ! filename of external parameter input file + extpar_filename = '{cfg.input_files_scratch_extpar_filename}' ! filename of external parameter input file n_iter_smooth_topo = 1,1 ! iterations of topography smoother heightdiff_threshold = 3000. ! height difference between neighb. grid points hgtdiff_max_smooth_topo = 750.,750. ! see Namelist doc @@ -157,15 +159,15 @@ cat > NAMELIST_NWP << EOF init_mode = 2 ! 7: start from DWD fg with subsequent vertical remapping lread_ana = .FALSE. ! no analysis data will be read ifs2icon_filename = "{inidata_filename}" ! initial data filename - ana_varnames_map_file = "{cfg.map_file_ana_scratch}" ! dictionary mapping internal names onto GRIB2 shortNames + ana_varnames_map_file = "{cfg.input_files_scratch_map_file_ana}" ! dictionary mapping internal names onto GRIB2 shortNames ltile_coldstart = .TRUE. ! coldstart for surface tiles ltile_init = .FALSE. ! set it to .TRUE. if FG data originate from run without tiles / ! grid_nml: horizontal grid -------------------------------------------------- &grid_nml - dynamics_grid_filename = "{cfg.dynamics_grid_filename_scratch}" ! array of the grid filenames for the dycore - radiation_grid_filename = "{cfg.radiation_grid_filename_scratch}" ! array of the grid filenames for the radiation model + dynamics_grid_filename = "{cfg.input_files_scratch_dynamics_grid_filename}" ! array of the grid filenames for the dycore + radiation_grid_filename = "{cfg.input_files_scratch_radiation_grid_filename}" ! array of the grid filenames for the radiation model dynamics_parent_grid_id = 0 ! array of the indexes of the parent grid filenames lredgrid_phys = .TRUE. ! .true.=radiation is calculated on a reduced grid lfeedback = .TRUE. ! specifies if feedback to parent grid is performed @@ -199,9 +201,9 @@ cat > NAMELIST_NWP << EOF itype_latbc = 1 ! 1: time-dependent lateral boundary conditions dtime_latbc = 10800 ! time difference between 2 consecutive boundary data nlev_latbc = 90 ! Number of vertical levels in boundary data - latbc_boundary_grid = "{cfg.lateral_boundary_grid_scratch}" ! Grid file defining the lateral boundary + latbc_boundary_grid = "{cfg.input_files_scratch_lateral_boundary_grid}" ! Grid file defining the lateral boundary latbc_path = "{cfg.icon_input_icbc}" ! Absolute path to boundary data - latbc_varnames_map_file = "{cfg.map_file_latbc_scratch}" + latbc_varnames_map_file = "{cfg.input_files_scratch_map_file_latbc}" latbc_filename = "{cfg.latbc_filename}" ! boundary data input filename init_latbc_from_fg = .FALSE. ! .TRUE.: take lbc for initial time from first guess / @@ -266,8 +268,8 @@ cat > NAMELIST_NWP << EOF icapdcycl = 3 ! apply CAPE modification to improve diurnalcycle over tropical land icpl_aero_conv = 1 ! coupling between autoconversion and Tegen aerosol climatology icpl_aero_gscp = 1 ! coupling between autoconversion and Tegen aerosol climatology - lrtm_filename = '{cfg.lrtm_filename_scratch}' ! longwave absorption coefficients for RRTM_LW - cldopt_filename = '{cfg.cldopt_filename_scratch}' ! RRTM cloud optical properties + lrtm_filename = '{cfg.input_files_scratch_lrtm_filename}' ! longwave absorption coefficients for RRTM_LW + cldopt_filename = '{cfg.input_files_scratch_cldopt_filename}' ! RRTM cloud optical properties dt_rad = 720. ! time step for radiation in s dt_conv = 120.,90.,90. ! time step for convection in s (domain specific) dt_sso = 120.,360.,360. ! time step for SSO parameterization diff --git a/cases/icon-art-oem-test/icontools_remap_00_lbc_runjob.cfg b/cases/icon-art-oem-test/icontools_remap_00_lbc_runjob.cfg index 190c9871..f81d9bdd 100644 --- a/cases/icon-art-oem-test/icontools_remap_00_lbc_runjob.cfg +++ b/cases/icon-art-oem-test/icontools_remap_00_lbc_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="iconsub_{cfg.startdate_sim_yyyymmddhh}" #SBATCH --account={cfg.compute_account} #SBATCH --chdir={cfg.icon_work} #SBATCH --partition={cfg.compute_queue} @@ -13,7 +13,7 @@ ulimit -s unlimited -set -e -x +set -x export ECCODES_DEFINITION_PATH={cfg.eccodes_dir}/definitions.edzw-2.12.5-2:{cfg.eccodes_dir}/definitions @@ -24,30 +24,30 @@ spack load icontools # PART I: Create auxiliary grid file which contains only the cells of the # boundary zone. #----------------------------------------------------------------------------- -cat > NAMELIST_ICONSUB_{cfg.inidate_yyyymmddhh} << EOF_1 +cat > NAMELIST_ICONSUB_{cfg.startdate_sim_yyyymmddhh} << EOF_1 &iconsub_nml - grid_filename = '{cfg.dynamics_grid_filename}', + grid_filename = '{cfg.input_files_scratch_dynamics_grid_filename}', output_type = 4, lwrite_grid = .TRUE., / &subarea_nml ORDER = "{cfg.lateral_boundary_grid_order}", - grf_info_file = '{cfg.dynamics_grid_filename}', + grf_info_file = '{cfg.input_files_scratch_dynamics_grid_filename}', min_refin_c_ctrl = 1 max_refin_c_ctrl = 14 / EOF_1 srun -n 1 {cfg.iconsub_bin} \ - --nml NAMELIST_ICONSUB_{cfg.inidate_yyyymmddhh} 2>&1 + --nml NAMELIST_ICONSUB_{cfg.startdate_sim_yyyymmddhh} 2>&1 #----------------------------------------------------------------------------- # PART II: Extract boundary data #----------------------------------------------------------------------------- -rm -f ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}* +rm -f ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}* set +x -cat > NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} << EOF +cat > NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} << EOF ! &input_field_nml ! temperature inputname = "T" @@ -122,23 +122,23 @@ echo "DATAFILELIST is {datafile_list}" for datafilename in {datafile_list} ; do datafile="${{datafilename##*/}}" # get filename without path outdatafile=${{datafile%.*}} # get filename without suffix - cat > NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} << EOF_2C + cat > NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} << EOF_2C &remap_nml - in_grid_filename = '{cfg.input_root_meteo}/{cfg.meteo_prefix}{cfg.inidate_yyyymmddhh}{cfg.meteo_suffix}' - in_filename = '{cfg.input_root_meteo}/${{datafile}}' + in_grid_filename = '{cfg.meteo_dir}/{cfg.meteo_prefix}{cfg.startdate_sim_yyyymmddhh}{cfg.meteo_suffix}' + in_filename = '{cfg.meteo_dir}/${{datafile}}' in_type = 1 - out_grid_filename = '{cfg.lateral_boundary_grid_scratch}' + out_grid_filename = '{cfg.input_files_scratch_lateral_boundary_grid}' out_filename = '{cfg.icon_input_icbc}/${{outdatafile}}_lbc.nc' out_type = 2 out_filetype = 4 l_have3dbuffer = .false. -! ncstorage_file = "ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}" +! ncstorage_file = "ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}" / EOF_2C srun -n 1 {cfg.iconremap_bin} -q \ - --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} \ - --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} 2>&1 + --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} \ + --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} 2>&1 done @@ -146,7 +146,7 @@ done # clean-up rm -f nml.log -rm -f NAMELIST_ICONSUB_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} +rm -f NAMELIST_ICONSUB_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} #----------------------------------------------------------------------------- exit diff --git a/cases/icon-art-oem-test/icontools_remap_ic_chem_runjob.cfg b/cases/icon-art-oem-test/icontools_remap_ic_chem_runjob.cfg index 66b459d5..4d80d10c 100644 --- a/cases/icon-art-oem-test/icontools_remap_ic_chem_runjob.cfg +++ b/cases/icon-art-oem-test/icontools_remap_ic_chem_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="{cfg.casename}_{cfg.startdate_sim_yyyymmddhh}_{cfg.forecasttime}" #SBATCH --account={cfg.compute_account} #SBATCH --chdir={cfg.icon_work} #SBATCH --partition={cfg.compute_queue} @@ -54,7 +54,7 @@ EOF #----------------------------------------------------------------------------- # loop over file list: -datafilename={cfg.input_root_chem}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix} +datafilename={cfg.chem_dir}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix} datafile="${{datafilename##*/}}" # get filename without path outdatafile=${{datafile%.*}} # get filename without suffix @@ -64,10 +64,10 @@ outdatafile=${{datafile%.*}} # get filename without suffix cat > NAMELIST_ICONREMAP << EOF &remap_nml - in_grid_filename = '{cfg.input_root_chem}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix}' - in_filename = '{cfg.input_root_chem}/${{datafile}}' + in_grid_filename = '{cfg.chem_dir}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix}' + in_filename = '{cfg.chem_dir}/${{datafile}}' in_type = 1 - out_grid_filename = '{cfg.dynamics_grid_filename_scratch}' + out_grid_filename = '{cfg.input_files_scratch_dynamics_grid_filename}' out_filename = '{cfg.icon_input_icbc}/${{outdatafile}}.nc' out_type = 2 out_filetype = 4 diff --git a/cases/icon-art-oem-test/icontools_remap_ic_runjob.cfg b/cases/icon-art-oem-test/icontools_remap_ic_runjob.cfg index 8ac77d8f..7cfdb530 100644 --- a/cases/icon-art-oem-test/icontools_remap_ic_runjob.cfg +++ b/cases/icon-art-oem-test/icontools_remap_ic_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="iconremap_{cfg.startdate_sim_yyyymmddhh}" #SBATCH --account={cfg.compute_account} #SBATCH --chdir={cfg.icon_work} #SBATCH --partition={cfg.compute_queue} @@ -13,7 +13,7 @@ ulimit -s unlimited -set -e-x +set -x export ECCODES_DEFINITION_PATH={cfg.eccodes_dir}/definitions.edzw-2.12.5-2:{cfg.eccodes_dir}/definitions @@ -208,7 +208,7 @@ EOF #----------------------------------------------------------------------------- # loop over file list: -datafilename={cfg.input_root_meteo}/{cfg.meteo_prefix}{cfg.inidate_yyyymmddhh}{cfg.meteo_suffix} +datafilename={cfg.meteo_dir}/{cfg.meteo_prefix}{cfg.startdate_sim_yyyymmddhh}{cfg.meteo_suffix} datafile="${{datafilename##*/}}" # get filename without path outdatafile=${{datafile%.*}} # get filename without suffix @@ -218,10 +218,10 @@ outdatafile=${{datafile%.*}} # get filename without suffix cat > NAMELIST_ICONREMAP << EOF &remap_nml - in_grid_filename = '{cfg.input_root_meteo}/{cfg.meteo_prefix}{cfg.inidate_yyyymmddhh}{cfg.meteo_suffix}' - in_filename = '{cfg.input_root_meteo}/${{datafile}}' + in_grid_filename = '{cfg.meteo_dir}/{cfg.meteo_prefix}{cfg.startdate_sim_yyyymmddhh}{cfg.meteo_suffix}' + in_filename = '{cfg.meteo_dir}/${{datafile}}' in_type = 1 - out_grid_filename = '{cfg.dynamics_grid_filename}' + out_grid_filename = '{cfg.input_files_scratch_dynamics_grid_filename}' out_filename = '{cfg.icon_input_icbc}/${{outdatafile}}.nc' out_type = 2 out_filetype = 4 diff --git a/cases/icon-art-oem-test/icontools_remap_lbc_chem_runjob.cfg b/cases/icon-art-oem-test/icontools_remap_lbc_chem_runjob.cfg index 0f9689fc..be948240 100644 --- a/cases/icon-art-oem-test/icontools_remap_lbc_chem_runjob.cfg +++ b/cases/icon-art-oem-test/icontools_remap_lbc_chem_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="{cfg.casename}_{cfg.startdate_sim_yyyymmddhh}_{cfg.forecasttime}" #SBATCH --account={cfg.compute_account} #SBATCH --chdir={cfg.icon_work} #SBATCH --partition={cfg.compute_queue} @@ -24,9 +24,9 @@ spack load icontools # Extract boundary data #----------------------------------------------------------------------------- -rm -f ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}* +rm -f ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}* -cat > NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} << EOF +cat > NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} << EOF ! &input_field_nml inputname = "ch4" @@ -61,32 +61,32 @@ echo "DATAFILELIST is {datafile_list_chem}" for datafilename in {datafile_list_chem} ; do datafile="${{datafilename##*/}}" # get filename without path outdatafile=${{datafile%.*}} # get filename without suffix - cat > NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} << EOF_2C + cat > NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} << EOF_2C &remap_nml - in_grid_filename = '{cfg.input_root_chem}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix}' - in_filename = '{cfg.input_root_chem}/${{datafile}}' + in_grid_filename = '{cfg.chem_dir}/{cfg.chem_prefix}{cfg.startdate_sim_yyyymmdd_hh}{cfg.chem_suffix}' + in_filename = '{cfg.chem_dir}/${{datafile}}' in_type = 1 - out_grid_filename = '{cfg.lateral_boundary_grid_scratch}' + out_grid_filename = '{cfg.input_files_scratch_lateral_boundary_grid}' out_filename = '{cfg.icon_input_icbc}/${{outdatafile}}_lbc.nc' out_type = 2 out_filetype = 4 l_have3dbuffer = .false. -! ncstorage_file = "ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}" +! ncstorage_file = "ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}" / EOF_2C srun -n 1 {cfg.iconremap_bin} -q \ - --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} \ - --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} 2>&1 + --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} \ + --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} 2>&1 done #----------------------------------------------------------------------------- # clean-up -#rm -f ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}* +#rm -f ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}* rm -f nml.log -rm -f NAMELIST_ICONSUB_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} +rm -f NAMELIST_ICONSUB_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} #----------------------------------------------------------------------------- exit diff --git a/cases/icon-art-oem-test/icontools_remap_lbc_rest_runjob.cfg b/cases/icon-art-oem-test/icontools_remap_lbc_rest_runjob.cfg index 24f53352..3bc183c3 100644 --- a/cases/icon-art-oem-test/icontools_remap_lbc_rest_runjob.cfg +++ b/cases/icon-art-oem-test/icontools_remap_lbc_rest_runjob.cfg @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#SBATCH --job-name="{cfg.casename}_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="iconremap_lbc_{cfg.startdate_sim_yyyymmddhh}" #SBATCH --account={cfg.compute_account} #SBATCH --chdir={cfg.icon_work} #SBATCH --partition={cfg.compute_queue} @@ -13,7 +13,7 @@ ulimit -s unlimited -set -e -x +set -x export ECCODES_DEFINITION_PATH={cfg.eccodes_dir}/definitions.edzw-2.12.5-2:{cfg.eccodes_dir}/definitions @@ -24,9 +24,10 @@ spack load icontools # Extract boundary data #----------------------------------------------------------------------------- -rm -f ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}* +rm -f ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}* -cat > NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} << EOF +cat > NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} << EOF +! &input_field_nml ! temperature inputname = "T" outputname = "T" @@ -94,31 +95,32 @@ echo "DATAFILELIST is {datafile_list_rest}" for datafilename in {datafile_list_rest} ; do datafile="${{datafilename##*/}}" # get filename without path outdatafile=${{datafile%.*}} # get filename without suffix - cat > NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} << EOF_2C + cat > NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} << EOF_2C &remap_nml - in_grid_filename = '{cfg.input_root_meteo}/{cfg.meteo_prefix}{cfg.inidate_yyyymmddhh}{cfg.meteo_suffix}' - in_filename = '{cfg.input_root_meteo}/${{datafile}}' + in_grid_filename = '{cfg.meteo_dir}/{cfg.meteo_prefix}{cfg.startdate_sim_yyyymmddhh}{cfg.meteo_suffix}' + in_filename = '{cfg.meteo_dir}/${{datafile}}' in_type = 1 - out_grid_filename = '{cfg.lateral_boundary_grid_scratch}' + out_grid_filename = '{cfg.input_files_scratch_lateral_boundary_grid}' out_filename = '{cfg.icon_input_icbc}/${{outdatafile}}_lbc.nc' out_type = 2 out_filetype = 4 l_have3dbuffer = .false. +! ncstorage_file = "ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}" / EOF_2C srun -n 1 {cfg.iconremap_bin} -q \ - --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} \ - --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} 2>&1 + --remap_nml NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} \ + --input_field_nml NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} 2>&1 done #----------------------------------------------------------------------------- # clean-up -#rm -f ncstorage.tmp_lbc_{cfg.inidate_yyyymmddhh}* +#rm -f ncstorage.tmp_lbc_{cfg.startdate_sim_yyyymmddhh}* rm -f nml.log -rm -f NAMELIST_ICONSUB_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.inidate_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.inidate_yyyymmddhh} +rm -f NAMELIST_ICONSUB_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_lbc_{cfg.startdate_sim_yyyymmddhh} NAMELIST_ICONREMAP_FIELDS_{cfg.startdate_sim_yyyymmddhh} #----------------------------------------------------------------------------- exit diff --git a/jenkins/scripts/build_icon-art.sh b/jenkins/scripts/build_icon-art.sh index 6d228e99..36cf15cb 100755 --- a/jenkins/scripts/build_icon-art.sh +++ b/jenkins/scripts/build_icon-art.sh @@ -22,8 +22,9 @@ rm -fr icon-art # Clone icon-art git clone --depth 1 --recurse-submodules --shallow-submodules -b ${BRANCH} ${GIT_REMOTE} icon-art +SPACK_TAG=`cat icon-art/config/cscs/SPACK_TAG` pushd icon-art - spack env activate -p -d config/cscs/spack/v0.18.1.7/art_daint_cpu_nvhpc + spack env activate -p -d config/cscs/spack/${SPACK_TAG}/daint_cpu_nvhpc_art spack install -u build popd popd diff --git a/jenkins/scripts/build_icon.sh b/jenkins/scripts/build_icon.sh index 249d1f1a..bff225c9 100755 --- a/jenkins/scripts/build_icon.sh +++ b/jenkins/scripts/build_icon.sh @@ -21,9 +21,10 @@ pushd src rm -fr icon # Clone icon -git clone --depth 1 --recurse-submodules --shallow-submodules -b ${BRANCH} ${GIT_REMOTE} +git clone --depth 1 --recurse-submodules --shallow-submodules -b ${BRANCH} ${GIT_REMOTE} icon +SPACK_TAG=`cat icon/config/cscs/SPACK_TAG` pushd icon - spack env activate -p -d config/cscs/spack/v0.18.1.4/daint_cpu_nvhpc + spack env activate -p -d config/cscs/spack/${SPACK_TAG}/daint_cpu_nvhpc spack install -u build popd popd diff --git a/jobs/check_output.py b/jobs/check_output.py index 2d88a6a7..133e969c 100644 --- a/jobs/check_output.py +++ b/jobs/check_output.py @@ -743,7 +743,7 @@ def main(cfg, model_cfg): to_write = """#!/usr/bin/env bash #SBATCH --partition=debug #SBATCH --account=em05 -#SBATCH --job-name="check_output_{cfg.inidate_yyyymmddhh}_{cfg.forecasttime}" +#SBATCH --job-name="check_output_{cfg.startdate_sim_yyyymmddhh}_{cfg.forecasttime}" #SBATCH --open-mode=append #SBATCH --time=00:30:00 #SBATCH --constraint=mc diff --git a/jobs/prepare_data.py b/jobs/prepare_data.py index 9830546e..15e7ee82 100644 --- a/jobs/prepare_data.py +++ b/jobs/prepare_data.py @@ -318,7 +318,7 @@ def main(cfg, model_cfg): time.strftime(cfg.meteo['nameformat'])) if cfg.model == 'icon-art' or cfg.model == 'icon-art-oem': chem_file = os.path.join( - cfg.icon_input_icbc, + cfg.icon_input_icbc, cfg.chem['prefix'] + time.strftime(cfg.chem_nameformat)) datafile_list_chem.append(chem_file + cfg.chem['suffix']) if meteo_file.endswith('00'): @@ -349,6 +349,7 @@ def main(cfg, model_cfg): datafile_list=datafile_list, datafile_list_rest=datafile_list_rest, datafile_list_chem=datafile_list_chem)) + logging.info(f" Starting icontools runscript {runscript}.") result = subprocess.run([ "sbatch", "--wait", os.path.join(cfg.icon_work, "%s.job" % runscript) @@ -357,7 +358,7 @@ def main(cfg, model_cfg): if exitcode != 0: raise RuntimeError( "sbatch returned exitcode {}".format(exitcode)) - logging.info("%s successfully executed." % runscript) + logging.info(f"{runscript} successfully executed.") #----------------------------------------------------- # Add GEOSP to all meteo files @@ -414,33 +415,34 @@ def main(cfg, model_cfg): cfg.startdate_sim.strftime(cfg.meteo['prefix'] + cfg.meteo['nameformat']) + '.nc') - merged_file = os.path.join( - cfg.icon_input_icbc, - cfg.startdate_sim.strftime(cfg.meteo['prefix'] + - cfg.meteo['nameformat']) + - '_merged.nc') - ds = xr.open_dataset(meteo_file) - merging = False - if 'PS' not in ds: - if 'LNPS' not in ds: - raise KeyError( - f"'LNPS' must be found in the initial conditions file {meteo_file}" - ) - merging = True - ds['PS'] = ds['LNPS'] - ds['PS'].attrs = ds['LNPS'].attrs - ds['PS'] = np.exp(ds['PS']) - ds['PS'] = ds['PS'].squeeze(dim='lev_2') - ds['PS'].attrs["long_name"] = 'surface pressure' - ds['PS'].attrs['units'] = 'Pa' - logging.info(f"Added PS to file {meteo_file}") - if 'Q' not in ds: - merging = True - ds['Q'] = ds['QV'] - logging.info(f"Added Q to file {meteo_file}") - if merging: - ds.to_netcdf(merged_file) - tools.rename_file(merged_file, meteo_file) + if os.path.isfile(meteo_file): + merged_file = os.path.join( + cfg.icon_input_icbc, + cfg.startdate_sim.strftime(cfg.meteo['prefix'] + + cfg.meteo['nameformat']) + + '_merged.nc') + ds = xr.open_dataset(meteo_file) + merging = False + if 'PS' not in ds: + if 'LNPS' not in ds: + raise KeyError( + f"'LNPS' must be found in the initial conditions file {meteo_file}" + ) + merging = True + ds['PS'] = ds['LNPS'] + ds['PS'].attrs = ds['LNPS'].attrs + ds['PS'] = np.exp(ds['PS']) + ds['PS'] = ds['PS'].squeeze(dim='lev_2') + ds['PS'].attrs["long_name"] = 'surface pressure' + ds['PS'].attrs['units'] = 'Pa' + logging.info(f"Added PS to file {meteo_file}") + if 'Q' not in ds: + merging = True + ds['Q'] = ds['QV'] + logging.info(f"Added Q to file {meteo_file}") + if merging: + ds.to_netcdf(merged_file) + tools.rename_file(merged_file, meteo_file) #----------------------------------------------------- # In case of OEM: merge chem tracers with meteo-files @@ -457,31 +459,34 @@ def main(cfg, model_cfg): cfg.icon_input_icbc, time.strftime(cfg.meteo['prefix'] + cfg.meteo['nameformat']) + '.nc') - chem_file = os.path.join( - cfg.icon_input_icbc, - time.strftime(cfg.chem_nameformat) + '.nc') - merged_file = os.path.join( - cfg.icon_input_icbc, - time.strftime(cfg.meteo['prefix'] + - cfg.meteo['nameformat']) + - '_merged.nc') - ds_meteo = xr.open_dataset(meteo_file) - ds_chem = xr.open_dataset(chem_file) - # LNPS --> PS - ds_chem['PS'] = ds_chem['LNPS'] - ds_chem['PS'].attrs = ds_chem['LNPS'].attrs - ds_chem['PS'] = ds_chem['PS'].squeeze(dim='lev_2') - ds_chem['PS'].attrs["long_name"] = 'surface pressure' - # merge: - ds_merged = xr.merge([ds_meteo, ds_chem], - compat="override") - #ds_merged.attrs = ds.attrs - ds_merged.to_netcdf(merged_file) - # Rename file to get original file name - tools.rename_file(merged_file, meteo_file) - tools.remove_file(chem_file) - logging.info("Added chemical tracer to file {}".format( - merged_file)) + if os.path.isfile(meteo_file): + chem_file = os.path.join( + cfg.icon_input_icbc, cfg.chem['prefix'] + + time.strftime(cfg.chem['nameformat']) + '.nc') + merged_file = os.path.join( + cfg.icon_input_icbc, + time.strftime(cfg.meteo['prefix'] + + cfg.meteo['nameformat']) + + '_merged.nc') + ds_meteo = xr.open_dataset(meteo_file) + ds_chem = xr.open_dataset(chem_file) + # LNPS --> PS + ds_chem['PS'] = ds_chem['LNPS'] + ds_chem['PS'].attrs = ds_chem['LNPS'].attrs + ds_chem['PS'] = ds_chem['PS'].squeeze(dim='lev_2') + ds_chem['PS'].attrs[ + "long_name"] = 'surface pressure' + # merge: + ds_merged = xr.merge([ds_meteo, ds_chem], + compat="override") + #ds_merged.attrs = ds.attrs + ds_merged.to_netcdf(merged_file) + # Rename file to get original file name + tools.rename_file(merged_file, meteo_file) + tools.remove_file(chem_file) + logging.info( + "Added chemical tracer to file {}".format( + merged_file)) #------------ # Merge LBC: @@ -491,7 +496,7 @@ def main(cfg, model_cfg): time.strftime(cfg.meteo['prefix'] + cfg.meteo['nameformat']) + '_lbc.nc') chem_file = os.path.join( - cfg.icon_input_icbc, + cfg.icon_input_icbc, cfg.chem['prefix'] + time.strftime(cfg.chem_nameformat) + '_lbc.nc') merged_file = os.path.join( cfg.icon_input_icbc,