Source code for NEDAS.models.nextsim.v1.namelist
import os
[docs]
def value_str(value):
# convert values to string in namelist
if isinstance(value, bool):
if value:
vstr = 'true'
else:
vstr = 'false'
elif isinstance(value, str):
vstr = value
else:
vstr = f'{value}'
return vstr
[docs]
def namelist(m, time, forecast_period, run_dir='.'):
"""Generate namelist for nextsim v1 model
Input:
-m: Model class object with model configurations
-time: start time (datetime obj)
-forecast_period: period (hour) to run the forecast
-run_dir: directory where the model runtime files are stored
"""
# start building the namelist content
nmlstr = "[mesh]\n"
nmlstr += "filename="+value_str(m.msh_filename)+"\n"
nmlstr += "[setup]\n"
nmlstr += "ice-type="+value_str(m.ice_type)+"\n"
nmlstr += "ocean-type="+value_str(m.ocean_type)+"\n"
nmlstr += "atmosphere-type="+value_str(m.atmosphere_type)+"\n"
nmlstr += "bathymetry-type="+value_str(m.bathymetry_type)+"\n"
nmlstr += "use_assimilation=false\n"
nmlstr += "dynamics-type="+value_str(m.dynamics_type)+"\n"
nmlstr += "atmospheric_forcing_input_path="+os.path.join('data',m.atmos_forcing_path)+"\n"
nmlstr += "oceanic_forcing_input_path="+os.path.join('data',m.ocean_forcing_path)+"\n"
nmlstr += "[simul]\n"
nmlstr += "spinup_duration=0\n"
nmlstr += "timestep="+value_str(int(m.timestep))+"\n"
nmlstr += "time_init="+time.strftime('%Y-%m-%d %H:%M:%S')+"\n"
nmlstr += "duration="+f"{forecast_period / 24}"+"\n"
nmlstr += "[thermo]\n"
nmlstr += "use_assim_flux=false\n"
nmlstr += "assim_flux_exponent=4\n"
nmlstr += "diffusivity_sss="+value_str(m.diffusivity_sss)+"\n"
nmlstr += "diffusivity_sst="+value_str(m.diffusivity_sst)+"\n"
nmlstr += "ocean_nudge_timeS_days="+value_str(m.ocean_nudge_timeS)+"\n"
nmlstr += "ocean_nudge_timeT_days="+value_str(m.ocean_nudge_timeT)+"\n"
nmlstr += "freezingpoint-type="+m.freezingpoint_type+"\n"
nmlstr += "h_young_max="+value_str(m.h_young_max)+"\n"
nmlstr += "alb_ice="+value_str(m.alb_ice)+"\n"
nmlstr += "alb_sn="+value_str(m.alb_sn)+"\n"
nmlstr += "albedoW="+value_str(m.albedoW)+"\n"
nmlstr += "melt_type="+value_str(m.melt_type)+"\n"
nmlstr += "PhiM="+value_str(m.PhiM)+"\n"
nmlstr += "snow_cond="+value_str(m.snow_cond)+"\n"
nmlstr += "[dynamics]\n"
nmlstr += "time_relaxation_damage="+value_str(m.time_relaxation_damage)+"\n"
nmlstr += "compression_factor="+value_str(m.compression_factor)+"\n"
nmlstr += "C_lab="+value_str(m.cohesion)+"\n"
nmlstr += "substeps="+value_str(m.substeps)+"\n"
nmlstr += "use_temperature_dependent_healing="+value_str(m.use_temperature_dependent_healing)+"\n"
nmlstr += "ECMWF_quad_drag_coef_air="+value_str(m.ECMWF_quad_drag_coef_air)+"\n"
nmlstr += "quad_drag_coef_water="+value_str(m.quad_drag_coef_water)+"\n"
nmlstr += "Lemieux_basal_k1="+value_str(m.Lemieux_basal_k1)+"\n"
nmlstr += "compaction_param="+value_str(m.compaction_param)+"\n"
nmlstr += "oceanic_turning_angle="+value_str(m.oceanic_turning_angle)+"\n"
nmlstr += "[age]\n"
nmlstr += "include_young_ice="+value_str(m.include_young_ice)+"\n"
nmlstr += "[restart]\n"
nmlstr += "start_from_restart="+value_str(m.start_from_restart)+"\n"
nmlstr += "type="+value_str(m.restart_type)+"\n"
nmlstr += "write_initial_restart="+value_str(m.write_initial_restart)+"\n"
nmlstr += "write_interval_restart="+value_str(m.write_interval_restart)+"\n"
nmlstr += "output_interval="+f"{m.restart_dt / 24}"+"\n"
nmlstr += "check_restart="+value_str(m.check_restart)+"\n"
nmlstr += "input_path="+value_str(m.restart_input_path)+"\n"
nmlstr += "basename="+time.strftime('%Y%m%dT%H%M%SZ')+"\n"
nmlstr += "[output]\n"
nmlstr += "output_per_day="+f"{int(24 / m.restart_dt)}"+"\n"
nmlstr += "datetime_in_filename="+value_str(m.datetime_in_filename)+"\n"
nmlstr += "exporter_path="+value_str(m.exporter_path)+"\n"
nmlstr += "export_before_regrid="+value_str(m.export_before_regrid)+"\n"
nmlstr += "export_after_regrid="+value_str(m.export_after_regrid)+"\n"
nmlstr += "[moorings]\n"
nmlstr += "use_moorings="+value_str(m.use_moorings)+"\n"
nmlstr += "grid_type="+value_str(m.mooring_grid_type)+"\n"
nmlstr += "spacing="+value_str(m.mooring_spacing)+"\n"
nmlstr += "output_timestep="+f"{m.restart_dt / 24}"+"\n"
for varname in m.mooring_variables:
nmlstr += "variables="+varname+"\n"
nmlstr += "[drifters]\n"
nmlstr += "use_osisaf_drifters="+value_str(m.use_osisaf_drifters)+"\n"
nmlstr += "use_sidfex_drifters="+value_str(m.use_sidfex_drifters)+"\n"
nmlstr += "sidfex_drifters_output_time_step="+f"{m.sidfex_output_dt / 24}"+"\n"
nmlstr += "sidfex_ignore_restart="+value_str(m.sidfex_ignore_restart)+"\n"
nmlstr += "[debugging]\n"
nmlstr += "check_fields_fast="+value_str(m.check_fields_fast)+"\n"
# write the namelist to nextsim.cfg file
with open(os.path.join(run_dir, 'nextsim.cfg'), 'wt') as f:
f.write(nmlstr)