ece-nemo.sh.tmpl 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. #!/usr/bin/env bash
  2. set -ue
  3. # librunscript defines some helper functions
  4. source ./librunscript.sh
  5. # =============================================================================
  6. # *** BEGIN User configuration
  7. # =============================================================================
  8. # -----------------------------------------------------------------------------
  9. # *** General configuration
  10. # -----------------------------------------------------------------------------
  11. # Component configuration
  12. # (for syntax of the $config variable, see librunscript.sh)
  13. config="nemo lim3 xios:detached"
  14. nem_forcing_set=CoreII
  15. if [ -z ${nem_forcing_set-} ] ; then nem_forcing_set=CoreII ; fi
  16. # Experiment name (exactly 4 letters!)
  17. export exp_name=[[[MOD:GENERAL:EXP_NAME]]]
  18. # Simulation start and end date. Use any (reasonable) syntax you want.
  19. run_start_date="[[[MOD:GENERAL:RUN_START_DATE]]]"
  20. run_end_date="[[[MOD:GENERAL:RUN_END_DATE]]]"
  21. # Set $force_run_from_scratch to 'true' if you want to force this run to start
  22. # from scratch, possibly ignoring any restart files present in the run
  23. # directory. Leave set to 'false' otherwise.
  24. # NOTE: If set to 'true' the run directory $run_dir is cleaned!
  25. force_run_from_scratch=[[[MOD:GENERAL:FORCE_RUN_FROM_SCRATCH]]]
  26. # Resolution
  27. nem_grid=[[[MOD:NEM:GRID]]]
  28. # Restart frequency. Use any (reasonable) number and time unit you want.
  29. # For runs without restart, leave this variable empty
  30. rst_freq="[[[MOD:GENERAL:RST_FREQ]]]"
  31. # Number of restart legs to be run in one go
  32. run_num_legs=[[[MOD:GENERAL:RUN_NUM_LEGS]]]
  33. # Directories
  34. start_dir=${PWD}
  35. ctrl_file_dir=${start_dir}/ctrl
  36. output_control_files_dir=${start_dir}/[[[MOD:GENERAL:OUTPUT_CONTROL_FILES_DIR]]]
  37. # Architecture
  38. build_arch=[[[PLT:ACTIVE:BUILD_ARCH]]]
  39. use_machinefile=[[[PLT:ACTIVE:USE_MACHINEFILE]]]
  40. # This file is used to store information about restarts
  41. ece_info_file="ece.info"
  42. # -----------------------------------------------------------------------------
  43. # *** Read platform dependent configuration
  44. # -----------------------------------------------------------------------------
  45. source ./ecconf.cfg
  46. configure
  47. # -----------------------------------------------------------------------------
  48. # *** Time step settings
  49. # -----------------------------------------------------------------------------
  50. case "${nem_grid}" in
  51. ORCA1L*) nem_time_step_sec=2700; lim_time_step_sec=2700 ;;
  52. ORCA025L*) nem_time_step_sec=900 ; lim_time_step_sec=900 ;;
  53. *) error "Can't set time steps for unknown horizontal grid: ${nem_grid}"
  54. ;;
  55. esac
  56. # -----------------------------------------------------------------------------
  57. # *** NEMO/LIM configuration
  58. # -----------------------------------------------------------------------------
  59. # This is only needed if the experiment is started from an existing set of NEMO
  60. # restart files
  61. nem_restart_file_path=${start_dir}/nemo-rst
  62. nem_restart_offset=0
  63. nem_res_hor=$(echo ${nem_grid} | sed 's:ORCA\([0-9]\+\)L[0-9]\+:\1:')
  64. # Pick correct NEMO configuration, which is one of:
  65. # NEMO standalone, NEMO+PISCES-standaone, PISCES-offline
  66. nem_config_name=${nem_grid}_LIM3_standalone
  67. has_config pisces && nem_config_name=${nem_grid}_LIM3_PISCES_standalone
  68. has_config pisces:offline && nem_config_name=${nem_grid}_OFF_PISCES_standalone
  69. nem_exe_file=${ecearth_src_dir}/nemo-3.6/CONFIG/${nem_config_name}/BLD/bin/nemo.exe
  70. nem_numproc=[[[MOD:NEM:NUMPROC]]]
  71. # Thermal conductivity of snow, see comment in ctrl/namelist.lim3.ref.sh
  72. nem_rn_cdsn=0.27
  73. # -----------------------------------------------------------------------------
  74. # *** XIOS configuration
  75. # -----------------------------------------------------------------------------
  76. xio_exe_file=${ecearth_src_dir}/xios-2.5/bin/xios_server.exe
  77. xio_numproc=[[[MOD:XIO:NUMPROC]]]
  78. # -----------------------------------------------------------------------------
  79. # *** Extra initial conditions saved during the run
  80. # -----------------------------------------------------------------------------
  81. if has_config save_ic
  82. then
  83. source ./libsave_ic.sh
  84. declare -a save_ic_date save_ic_date1 save_ic_sec save_ic_day save_ic_ppt_file save_ic_nemo_ts
  85. fi
  86. # =============================================================================
  87. # *** END of User configuration
  88. # =============================================================================
  89. # =============================================================================
  90. # *** This is where the code begins ...
  91. # =============================================================================
  92. # -----------------------------------------------------------------------------
  93. # *** Create the run dir if necessary and go there
  94. # Everything is done from here.
  95. # -----------------------------------------------------------------------------
  96. if [ ! -d ${run_dir} ]
  97. then
  98. mkdir -p ${run_dir}
  99. fi
  100. cd ${run_dir}
  101. # -----------------------------------------------------------------------------
  102. # *** Determine the time span of this run and whether it's a restart leg
  103. # -----------------------------------------------------------------------------
  104. # Regularise the format of the start and end date of the simulation
  105. run_start_date=$(absolute_date_noleap "${run_start_date}")
  106. run_end_date=$(absolute_date_noleap "${run_end_date}")
  107. # Loop over the number of legs
  108. for (( ; run_num_legs>0 ; run_num_legs-- ))
  109. do
  110. # Check for restart information file and set the current leg start date
  111. # Ignore restart information file if force_run_from_scratch is true
  112. if ${force_run_from_scratch} || ! [ -r ${ece_info_file} ]
  113. then
  114. leg_is_restart=false
  115. leg_start_date=${run_start_date}
  116. leg_number=1
  117. else
  118. leg_is_restart=true
  119. . ./${ece_info_file}
  120. leg_start_date=${leg_end_date}
  121. leg_number=$((leg_number+1))
  122. fi
  123. # Compute the end date of the current leg
  124. if [ -n "${rst_freq}" ]
  125. then
  126. leg_end_date=$(absolute_date_noleap "${leg_start_date} + ${rst_freq}")
  127. else
  128. leg_end_date=${run_end_date}
  129. fi
  130. if [ $(date -d "${leg_end_date}" +%s) -gt $(date -d "${run_end_date}" +%s) ]
  131. then
  132. leg_end_date=${run_end_date}
  133. fi
  134. # Some time variables needed later
  135. leg_length_sec=$(( $(date -d "${leg_end_date}" +%s) - $(date -d "${leg_start_date}" +%s) ))
  136. leg_start_sec=$(( $(date -d "${leg_start_date}" +%s) - $(date -d "${run_start_date}" +%s) ))
  137. leg_end_sec=$(( $(date -d "${leg_end_date}" +%s) - $(date -d "${run_start_date}" +%s) ))
  138. leg_start_date_yyyymmdd=$(date -u -d "${leg_start_date}" +%Y%m%d)
  139. leg_start_date_yyyy=$(date -u -d "${leg_start_date}" +%Y)
  140. leg_end_date_yyyy=$(date -u -d "${leg_end_date}" +%Y)
  141. # Correct for leap days because NEMO standalone uses no-leap calendar
  142. leg_length_sec=$(( leg_length_sec - $(leap_days "${leg_start_date}" "${leg_end_date}")*24*3600 ))
  143. leg_start_sec=$(( leg_start_sec - $(leap_days "${run_start_date}" "${leg_start_date}")*24*3600 ))
  144. leg_end_sec=$(( leg_end_sec - $(leap_days "${run_start_date}" "${leg_end_date}")*24*3600 ))
  145. # Check whether there's actually time left to simulate - exit otherwise
  146. if [ ${leg_length_sec} -le 0 ]
  147. then
  148. info "Leg start date equal to or after end of simulation."
  149. info "Nothing left to do. Exiting."
  150. exit 0
  151. fi
  152. # Initial conditions saved during the run
  153. do_save_ic=false
  154. has_config save_ic && save_ic_get_config
  155. # if you do not use an option with save_ic, you must define 'do_save_ic' and
  156. # 'save_ic_date_offset' here or in ../libsave_ic.sh/save_ic_get_config()
  157. ${do_save_ic} && save_ic_define_vars
  158. # -------------------------------------------------------------------------
  159. # *** Prepare the run directory for a run from scratch
  160. # -------------------------------------------------------------------------
  161. if ! $leg_is_restart
  162. then
  163. # ---------------------------------------------------------------------
  164. # *** Check if run dir is empty. If not, and if we are allowed to do so
  165. # by ${force_run_from_scratch}, remove everything
  166. # ---------------------------------------------------------------------
  167. if $(ls * >& /dev/null)
  168. then
  169. if ${force_run_from_scratch}
  170. then
  171. rm -fr ${run_dir}/*
  172. else
  173. error "Run directory not empty and \$force_run_from_scratch not set."
  174. fi
  175. fi
  176. # ---------------------------------------------------------------------
  177. # *** Copy executables of model components
  178. # *** Additionally, create symlinks to the original place for reference
  179. # ---------------------------------------------------------------------
  180. cp ${nem_exe_file} .
  181. ln -s ${nem_exe_file} $(basename ${nem_exe_file}).lnk
  182. cp ${xio_exe_file} .
  183. ln -s ${xio_exe_file} $(basename ${xio_exe_file}).lnk
  184. # ---------------------------------------------------------------------
  185. # *** Files needed for NEMO (linked)
  186. # ---------------------------------------------------------------------
  187. # Link initialisation files for matching ORCA grid
  188. for f in \
  189. bathy_meter.nc coordinates.nc \
  190. ahmcoef.nc \
  191. K1rowdrg.nc M2rowdrg.nc mask_itf.nc \
  192. decay_scale_bot.nc decay_scale_cri.nc \
  193. mixing_power_bot.nc mixing_power_cri.nc mixing_power_pyc.nc \
  194. runoff_depth.nc subbasins.nc
  195. do
  196. [ -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f ] && ln -s ${ini_data_dir}/nemo/initial/${nem_grid}/$f
  197. done
  198. # Copying the time independent NEMO files for the matching ORCA grid in order to facilitate cmorisation:
  199. for f in \
  200. bathy_meter.nc subbasins.nc
  201. do
  202. mkdir -p output/nemo/ofx-data
  203. [ -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f ] && cp -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f output/nemo/ofx-data/
  204. done
  205. # Link geothermal heating file (independent of grid) and matching weight file
  206. ln -s ${ini_data_dir}/nemo/initial/Goutorbe_ghflux.nc
  207. ln -s ${ini_data_dir}/nemo/initial/weights_Goutorbe1_2_orca${nem_res_hor}_bilinear.nc
  208. # Link either restart files or climatology files for the initial state
  209. if $(has_config nemo:start_from_restart)
  210. then
  211. # When linking restart files, we accept three options:
  212. # (1) Merged files for ocean and ice, i.e.
  213. # restart_oce.nc and restart_ice.nc
  214. # (2) One-file-per-MPI-rank, i.e.
  215. # restart_oce_????.nc and restart_ice_????.nc
  216. # No check is done whether the number of restart files agrees
  217. # with the number of MPI ranks for NEMO!
  218. # (3) One-file-per-MPI-rank with a prefix, i.e.
  219. # <exp_name>_<time_step>_restart_oce_????.nc (similar for the ice)
  220. # The prefix is ignored.
  221. # The code assumes that one of the options can be applied! If more
  222. # options are applicable, the first is chosen. If none of the
  223. # options apply, NEMO will crash with missing restart file.
  224. if ls -U ${nem_restart_file_path}/restart_[oi]ce.nc > /dev/null 2>&1
  225. then
  226. ln -s ${nem_restart_file_path}/restart_[oi]ce.nc ./
  227. elif ls -U ${nem_restart_file_path}/restart_[oi]ce_????.nc > /dev/null 2>&1
  228. then
  229. ln -s ${nem_restart_file_path}/restart_[oi]ce_????.nc ./
  230. else
  231. for f in ${nem_restart_file_path}/????_????????_restart_[oi]ce_????.nc
  232. do
  233. ln -s $f $(echo $f | sed 's/.*_\(restart_[oi]ce_....\.nc\)/\1/')
  234. done
  235. fi
  236. else
  237. # Temperature and salinity files for initialisation
  238. ln -s ${ini_data_dir}/nemo/climatology/absolute_salinity_WOA13_decav_Reg1L75_clim.nc
  239. ln -s ${ini_data_dir}/nemo/climatology/conservative_temperature_WOA13_decav_Reg1L75_clim.nc
  240. ln -s ${ini_data_dir}/nemo/climatology/weights_WOA13d1_2_orca${nem_res_hor}_bilinear.nc
  241. fi
  242. # Grid dependent runoff files
  243. case ${nem_grid} in
  244. ORCA1*)
  245. ln -s ${ini_data_dir}/nemo/climatology/runoff-icb_DaiTrenberth_Depoorter_ORCA1_JD.nc
  246. if [[ "${nem_forcing_set}" == "JRA55_1.4" ]] ; then
  247. ln -s ${ini_data_dir}/nemo/forcing/JRA55_1.4/runoff_depth_JRA.nc
  248. fi
  249. ;;
  250. ORCA025*)
  251. ln -s ${ini_data_dir}/nemo/climatology/ORCA_R025_runoff_v1.1.nc
  252. ;;
  253. esac
  254. #for ocean_nudging
  255. if $(has_config nemo:ocenudg) ; then
  256. ln -fs ${ini_data_dir}/nemo/oce_nudg/resto.nc ./
  257. fi
  258. # Salinity file (needed for diagnostics)
  259. [ -f ${ini_data_dir}/nemo/climatology/${nem_grid}/sali_ref_clim_monthly.nc ] && ln -s ${ini_data_dir}/nemo/climatology/${nem_grid}/sali_ref_clim_monthly.nc
  260. # Write fake file for previous fresh water budget adjustment (nn_fwb==2 in namelist)
  261. echo " 0 0.0000000000000000E+00 0.0000000000000000E+00" > EMPave_old.dat
  262. # XIOS files
  263. . ${ctrl_file_dir}/iodef.xml.sh > iodef.xml
  264. ln -s ${ctrl_file_dir}/context_nemo.xml
  265. . ${ctrl_file_dir}/domain_def_nemo.xml.sh > domain_def_nemo.xml
  266. ln -s ${ctrl_file_dir}/axis_def_nemo.xml
  267. ln -s ${ctrl_file_dir}/grids_def_nemo.xml
  268. ln -s ${ctrl_file_dir}/field_def_nemo-lim.xml
  269. ln -s ${ctrl_file_dir}/field_def_nemo-opa.xml
  270. ln -s ${ctrl_file_dir}/field_def_nemo-pisces.xml
  271. ln -s ${ctrl_file_dir}/field_def_nemo-inerttrc.xml
  272. ln -s ${output_control_files_dir}/file_def_nemo-lim3.xml file_def_nemo-lim.xml
  273. ln -s ${output_control_files_dir}/file_def_nemo-opa.xml
  274. ln -s ${output_control_files_dir}/file_def_nemo-pisces.xml
  275. if [ -f ${ini_data_dir}/xios/ORCA${nem_res_hor}/coordinates_xios.nc ]
  276. then
  277. cp ${ini_data_dir}/xios/ORCA${nem_res_hor}/coordinates_xios.nc ./
  278. else
  279. info "File 'coordinates_xios.nc' not found. NEMO can not be run with land domain removal!"
  280. fi
  281. # ---------------------------------------------------------------------
  282. # *** Files needed for TOP/PISCES (linked)
  283. # ---------------------------------------------------------------------
  284. if $(has_config pisces)
  285. then
  286. ln -fs ${ini_data_dir}/nemo/pisces/dust_INCA_ORCA_R1.nc
  287. ln -fs ${ini_data_dir}/nemo/pisces/ndeposition_Duce_ORCA_R1.nc
  288. ln -fs ${ini_data_dir}/nemo/pisces/pmarge_etopo_ORCA_R1.nc
  289. ln -fs ${ini_data_dir}/nemo/pisces/river_global_news_ORCA_R1.nc
  290. ln -fs ${ini_data_dir}/nemo/pisces/Solubility_T62_Mahowald_ORCA_R1.nc
  291. ln -fs ${ini_data_dir}/nemo/pisces/par_fraction_gewex_clim90s00s_ORCA_R1.nc
  292. ln -fs ${ini_data_dir}/nemo/pisces/DIC_GLODAP_annual_ORCA_R1.nc
  293. ln -fs ${ini_data_dir}/nemo/pisces/Alkalini_GLODAP_annual_ORCA_R1.nc
  294. ln -fs ${ini_data_dir}/nemo/pisces/O2_WOA2009_monthly_ORCA_R1.nc
  295. ln -fs ${ini_data_dir}/nemo/pisces/PO4_WOA2009_monthly_ORCA_R1.nc
  296. ln -fs ${ini_data_dir}/nemo/pisces/Si_WOA2009_monthly_ORCA_R1.nc
  297. ln -fs ${ini_data_dir}/nemo/pisces/DOC_PISCES_monthly_ORCA_R1.nc
  298. ln -fs ${ini_data_dir}/nemo/pisces/Fer_PISCES_monthly_ORCA_R1.nc
  299. ln -fs ${ini_data_dir}/nemo/pisces/NO3_WOA2009_monthly_ORCA_R1.nc
  300. ln -fs ${ini_data_dir}/nemo/pisces/mole-fraction-of-carbon-dioxide-in-air_input4MIPs_GHGConcentrations_CMIP_UoM-CMIP-1-2-0_gr1-GMNHSH_1637-2019.txt atcco2.txt
  301. fi
  302. #linking surface boundary conditions for CFCs (even if CFCs are not included)
  303. ln -fs ${ini_data_dir}/nemo/cfc/CFCs_CDIAC_extension_1637_2019.dat CFCs_CDIAC.dat
  304. if $(has_config pisces:start_from_restart)
  305. then
  306. # Same three options as for nemo:start_from_restart
  307. if ls -U ${nem_restart_file_path}/restart_trc.nc > /dev/null 2>&1
  308. then
  309. ln -s ${nem_restart_file_path}/restart_trc.nc ./
  310. elif ls -U ${nem_restart_file_path}/restart_trc_????.nc > /dev/null 2>&1
  311. then
  312. ln -s ${nem_restart_file_path}/restart_trc_????.nc ./
  313. else
  314. for f in ${nem_restart_file_path}/????_????????_restart_trc_????.nc
  315. do
  316. ln -s $f $(echo $f | sed 's/.*_\(restart_trc_....\.nc\)/\1/')
  317. done
  318. fi
  319. fi
  320. # ---------------------------------------------------------------------
  321. # *** Files needed for TOP/PISCES (linked) ADDED FOR PISCES OFFLINE
  322. # ---------------------------------------------------------------------
  323. if $(has_config pisces:offline)
  324. then
  325. ln -fs ${ini_data_dir}/nemo/pisces/pisces_dyn/OfflineForcing_grid_U.nc OfflineForcing_grid_U.nc
  326. ln -fs ${ini_data_dir}/nemo/pisces/pisces_dyn/OfflineForcing_grid_V.nc OfflineForcing_grid_V.nc
  327. ln -fs ${ini_data_dir}/nemo/pisces/pisces_dyn/OfflineForcing_grid_W.nc OfflineForcing_grid_W.nc
  328. ln -fs ${ini_data_dir}/nemo/pisces/pisces_dyn/OfflineForcing_grid_T.nc OfflineForcing_grid_T.nc
  329. ln -fs ${ctrl_file_dir}/context_nemo_offline.xml context_nemo.xml
  330. fi
  331. else # i.e. $leg_is_restart == true
  332. # ---------------------------------------------------------------------
  333. # *** Remove all leftover output files from previous legs
  334. # ---------------------------------------------------------------------
  335. # NEMO output files
  336. rm -f ${exp_name}_??_????????_????????_{grid_U,grid_V,grid_W,grid_T,icemod,SBC,scalar,SBC_scalar,diad_T}.nc
  337. restart_dir="restart/nemo/$(printf %03d $((leg_number)))"
  338. if ! $(has_config pisces:offline) ; then
  339. [ -f ${restart_dir}/EMPave_old.dat ] && cp ${restart_dir}/EMPave_old.dat .
  340. fi
  341. fi # ! $leg_is_restart
  342. #--------------------------------------------------------------------------
  343. # *** Surface restoring and ocean nudging options
  344. #--------------------------------------------------------------------------
  345. #for ocean_nudging
  346. if $(has_config nemo:ocenudg) ; then
  347. ln -fs ${ini_data_dir}/nemo/oce_nudg/temp_sal_*.nc ./
  348. fi
  349. #for surface restoring
  350. if $(has_config nemo:surfresto) ; then
  351. ln -fs ${ini_data_dir}/nemo/surface_restoring/sss_restore_data*.nc ./
  352. ln -fs ${ini_data_dir}/nemo/surface_restoring/sst_restore_data*.nc ./
  353. ln -fs ${ini_data_dir}/nemo/surface_restoring/mask_restore*.nc ./
  354. fi
  355. # -------------------------------------------------------------------------
  356. # *** Remove land grid-points
  357. # -------------------------------------------------------------------------
  358. if $(has_config nemo:elpin)
  359. then
  360. if [ ! -f coordinates_xios.nc ]
  361. then
  362. error "ELpIN requested, but file 'coordinates_xios.nc' was not found"
  363. fi
  364. jpns=($(${ecearth_src_dir}/util/ELPiN/ELPiNv2.cmd ${nem_numproc}))
  365. info "nemo domain decompostion from ELpIN: ${jpns[@]}"
  366. nem_numproc=${jpns[0]}
  367. nem_jpni=${jpns[1]}
  368. nem_jpnj=${jpns[2]}
  369. else
  370. info "nemo original domain decomposition (not using ELPiN)"
  371. fi
  372. # -------------------------------------------------------------------------
  373. # *** Initial conditions saved during the run
  374. # -------------------------------------------------------------------------
  375. ${do_save_ic} && save_ic_prepare_output
  376. # -------------------------------------------------------------------------
  377. # *** Create some control files
  378. # -------------------------------------------------------------------------
  379. # used in namelist.nemo
  380. is_climatology=".true."
  381. if [[ "${nem_forcing_set}" == "JRA55_1.4" || "${nem_forcing_set}" == "era5" || "${nem_forcing_set}" == "ERA5_HRES" || "${nem_forcing_set}" == "ERA5_ENDA" ]] ; then
  382. ln_dm2dc=".false."
  383. else
  384. ln_dm2dc=".true."
  385. fi
  386. if [[ ${nem_fixed_forcing_year-} == -1 ]] && ! [[ "${nem_forcing_set}" == "CoreII" ]] ; then is_climatology=".false." ; fi
  387. if [[ "${nem_forcing_set}" == "JRA55_1.4" ]] ; then
  388. forcing_runoff="namelist.nemo-runoff-JRA55_1.4"
  389. else
  390. forcing_runoff="namelist.nemo-runoff-default"
  391. fi
  392. # NEMO and LIM namelists
  393. . ${ctrl_file_dir}/namelist.nemo.ref.sh > namelist_ref
  394. . ${ctrl_file_dir}/namelist.nemo-${nem_grid}-standalone.cfg.sh > namelist_cfg
  395. . ${ctrl_file_dir}/namelist.lim3.ref.sh > namelist_ice_ref
  396. . ${ctrl_file_dir}/namelist.lim3-${nem_grid}.cfg.sh > namelist_ice_cfg
  397. # NEMO/TOP+PISCES namelists
  398. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.top.ref.sh > namelist_top_ref
  399. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.top.cfg.sh > namelist_top_cfg
  400. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.pisces.ref.sh > namelist_pisces_ref
  401. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.pisces.cfg.sh > namelist_pisces_cfg
  402. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.age.ref.sh > namelist_age_ref
  403. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.age.cfg.sh > namelist_age_cfg
  404. #include CFCs namelist even if CFCs are not included
  405. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.cfc.ref.sh > namelist_cfc_ref
  406. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.cfc.cfg.sh > namelist_cfc_cfg
  407. # -------------------------------------------------------------------------
  408. # *** Link the appropriate NEMO restart files of the previous leg
  409. # -------------------------------------------------------------------------
  410. if $leg_is_restart
  411. then
  412. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  413. for (( n=0 ; n<nem_numproc ; n++ ))
  414. do
  415. np=$(printf %04d ${n})
  416. ln -fs ${exp_name}_${ns}_restart_oce_${np}.nc restart_oce_${np}.nc
  417. ln -fs ${exp_name}_${ns}_restart_ice_${np}.nc restart_ice_${np}.nc
  418. has_config pisces && \
  419. ln -fs ${exp_name}_${ns}_restart_trc_${np}.nc restart_trc_${np}.nc
  420. done
  421. # Make sure there are no global restart files
  422. # If links are found, they will be removed. We are cautious and do
  423. # _not_ remove real files! However, if real global restart files are
  424. # present, NEMO/LIM will stop because time stamps will not match.
  425. [ -h restart_oce.nc ] && rm restart_oce.nc
  426. [ -h restart_ice.nc ] && rm restart_ice.nc
  427. [ -h restart_trc.nc ] && rm restart_trc.nc
  428. fi
  429. # -------------------------------------------------------------------------
  430. # *** Start the run
  431. # -------------------------------------------------------------------------
  432. # Link NEMO forcing files
  433. if ! [[ "${nem_forcing_set}" == "CoreII" ]] && \
  434. ! [[ "${nem_forcing_set}" == "DFS5.2" ]] && \
  435. ! [[ "${nem_forcing_set}" == "eraint" ]] && \
  436. ! [[ "${nem_forcing_set}" == "CoreII_interannual" ]]&& \
  437. ! [[ "${nem_forcing_set}" == "era5" ]] && \
  438. ! [[ "${nem_forcing_set}" == "ERA5_HRES" ]] && \
  439. ! [[ "${nem_forcing_set}" == "ERA5_ENDA" ]] && \
  440. ! [[ "${nem_forcing_set}" == "JRA55_1.4" ]]
  441. then
  442. echo "${nem_forcing_set}" not supported;
  443. exit 1
  444. fi
  445. case "${nem_forcing_set}" in
  446. CoreII)
  447. for variable in u_10 v_10 t_10 q_10 ncar_precip ncar_rad ; do
  448. [ -f "${ini_data_dir}/nemo/forcing/CoreII/${variable}.15JUNE2009_fill.nc" ] && ln -sf "${ini_data_dir}/nemo/forcing/CoreII/${variable}.15JUNE2009_fill.nc"
  449. done
  450. # Weight files for forcing
  451. ln -fs ${ini_data_dir}/nemo/forcing/CoreII/weights_coreII_2_orca${nem_res_hor}_bilinear.nc
  452. ln -fs ${ini_data_dir}/nemo/forcing/CoreII/weights_coreII_2_orca${nem_res_hor}_bicubic.nc
  453. ;;
  454. * )
  455. for forcing_file in ${ini_data_dir}/nemo/forcing/${nem_forcing_set}/* ; do
  456. [ -f ${forcing_file} ] && ln -fs ${forcing_file} ./$(basename ${forcing_file})
  457. done
  458. #Weight files for forcing
  459. ln -sf ${ini_data_dir}/nemo/forcing/weights/* .
  460. ;;
  461. esac
  462. # Use the launch function from the platform configuration file
  463. t1=$(date +%s)
  464. launch \
  465. ${xio_numproc} ${xio_exe_file} -- \
  466. ${nem_numproc} ${nem_exe_file}
  467. t2=$(date +%s)
  468. tr=$(date -d "0 -$t1 sec + $t2 sec" +%T)
  469. # -------------------------------------------------------------------------
  470. # *** Check for signs of success
  471. # Note the tests provide no guarantee that things went fine! They are
  472. # just based on the IFS and NEMO log files. More tests (e.g. checking
  473. # restart files) could be implemented.
  474. # -------------------------------------------------------------------------
  475. # Check for NEMO success
  476. if [ -f ocean.output ]
  477. then
  478. if [ "$(sed -n '/New day/h; ${g;s:.*\([0-9/]\{10\}\).*:\1:;p;}' ocean.output)" == "$(date -u -d "$(absolute_date_noleap "${leg_end_date} - 1 day")" +%Y/%m/%d)" ]
  479. then
  480. info "Leg successfully completed according to NEMO log file 'ocean.output'."
  481. else
  482. error "Leg not completed according to NEMO log file 'ocean.output'."
  483. fi
  484. else
  485. error "NEMO log file 'ocean.output' not found after run."
  486. fi
  487. # -------------------------------------------------------------------------
  488. # *** Post-process initial conditions saved during the run if requested
  489. # -------------------------------------------------------------------------
  490. ${do_save_ic} && save_ic_postproc
  491. # -------------------------------------------------------------------------
  492. # *** Move NEMO output files to archive directory
  493. # -------------------------------------------------------------------------
  494. outdir="output/nemo/$(printf %03d $((leg_number)))"
  495. mkdir -p ${outdir}
  496. for v in grid_U grid_V grid_W grid_T icemod SBC scalar SBC_scalar diad_T ptrc_T bioscalar \
  497. grid_T_2D grid_U_2D grid_V_2D grid_W_2D grid_T_3D grid_U_3D grid_V_3D grid_W_3D \
  498. grid_T_SFC grid_1point grid_T_3D_ncatice vert_sum \
  499. grid_ptr_W_3basin_3D grid_ptr_T_3basin_2D grid_ptr_T_2D \
  500. zoom_700_sum zoom_300_sum zoom_2000_sum
  501. do
  502. for f in ${exp_name}_*_????????_????????_*${v}.nc
  503. do
  504. test -f $f && mv $f $outdir/
  505. done
  506. done
  507. # -------------------------------------------------------------------------
  508. # *** Move NEMO restart files to archive directory
  509. # -------------------------------------------------------------------------
  510. if $leg_is_restart
  511. then
  512. outdir="restart/nemo/$(printf %03d $((leg_number)))"
  513. mkdir -p ${outdir}
  514. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  515. for f in oce ice trc
  516. do
  517. test -f ${exp_name}_${ns}_restart_${f}_0000.nc && \
  518. mv ${exp_name}_${ns}_restart_${f}_????.nc ${outdir}
  519. done
  520. if ! $(has_config pisces:offline)
  521. then
  522. cp EMPave_old.dat ${outdir}/EMPave_old.dat
  523. fi
  524. fi
  525. if ! $(has_config pisces:offline)
  526. then
  527. cp EMPave.dat EMPave_old.dat
  528. fi
  529. # -------------------------------------------------------------------------
  530. # *** Move log files to archive directory
  531. # -------------------------------------------------------------------------
  532. outdir="log/$(printf %03d $((leg_number)))"
  533. mkdir -p ${outdir}
  534. for f in \
  535. ocean.output time.step solver.stat
  536. do
  537. test -f ${f} && mv ${f} ${outdir}
  538. done
  539. # -------------------------------------------------------------------------
  540. # *** Write the restart control file
  541. # -------------------------------------------------------------------------
  542. # Compute CPMIP performance
  543. sypd="$(cpmip_sypd $leg_length_sec $(($t2 - $t1)))"
  544. chpsy="$(cpmip_chpsy $leg_length_sec $(($t2 - $t1)) $(($nem_numproc + $xio_numproc)))"
  545. echo "#" | tee -a ${ece_info_file}
  546. echo "# Finished leg at `date '+%F %T'` after ${tr} (hh:mm:ss)" \
  547. | tee -a ${ece_info_file}
  548. echo "# CPMIP performance: $sypd SYPD $chpsy CHPSY"| tee -a ${ece_info_file}
  549. echo "leg_number=${leg_number}" | tee -a ${ece_info_file}
  550. echo "leg_start_date=\"${leg_start_date}\"" | tee -a ${ece_info_file}
  551. echo "leg_end_date=\"${leg_end_date}\"" | tee -a ${ece_info_file}
  552. # Need to reset force_run_from_scratch in order to avoid destroying the next leg
  553. force_run_from_scratch=false
  554. done # loop over legs
  555. # -----------------------------------------------------------------------------
  556. # *** Platform dependent finalising of the run
  557. # -----------------------------------------------------------------------------
  558. finalise
  559. exit 0