ece-ifs+nemo.sh.tmpl 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. #!/usr/bin/env bash
  2. #PBS -q large
  3. #PBS -r y
  4. #PBS -W group_list=ecearth
  5. #PBS -l walltime=23:50:00
  6. #PBS -l select=6:ncpus=24:mem=63000mb:mpiprocs=24:ompthreads=1
  7. #PBS -M pierre-yves.barriat@uclouvain.be
  8. #PBS -m abe
  9. exec > ${PBS_O_WORKDIR-$PWD}/${PBS_JOBNAME-"local"}_${PBS_JOBID-"id"}.log
  10. echo "------------------ Job Info --------------------"
  11. echo "jobid : $PBS_JOBID"
  12. echo "jobname : $PBS_JOBNAME"
  13. echo "job type : $PBS_ENVIRONMENT"
  14. echo "submit dir : $PBS_O_WORKDIR"
  15. echo "queue : $PBS_O_QUEUE"
  16. echo "user : $PBS_O_LOGNAME"
  17. echo "threads : $OMP_NUM_THREADS"
  18. set -ue
  19. # Directories
  20. start_dir=${PBS_O_WORKDIR-$PWD}
  21. # librunscript defines some helper functions
  22. . ${start_dir}/librunscript.sh
  23. # =============================================================================
  24. # *** BEGIN User configuration
  25. # =============================================================================
  26. # -----------------------------------------------------------------------------
  27. # *** General configuration
  28. # -----------------------------------------------------------------------------
  29. # Component configuration
  30. # (for syntax of the $config variable, see librunscript.sh)
  31. config="ifs nemo lim3 rnfmapper xios:detached oasis"
  32. # Experiment name (exactly 4 letters!)
  33. exp_name=[[[MOD:GENERAL:EXP_NAME]]]
  34. # Simulation start and end date. Use any (reasonable) syntax you want.
  35. run_start_date="[[[MOD:GENERAL:RUN_START_DATE]]]"
  36. run_end_date="[[[MOD:GENERAL:RUN_END_DATE]]]"
  37. # Set $force_run_from_scratch to 'true' if you want to force this run to start
  38. # from scratch, possibly ignoring any restart files present in the run
  39. # directory. Leave set to 'false' otherwise.
  40. # NOTE: If set to 'true' the run directory $run_dir is cleaned!
  41. force_run_from_scratch=[[[MOD:GENERAL:FORCE_RUN_FROM_SCRATCH]]]
  42. special_restart=false
  43. special_restart_from=ECE3
  44. special_restart_date="1995-01-01"
  45. # Resolution
  46. ifs_grid=[[[MOD:IFS:GRID]]]
  47. nem_grid=[[[MOD:NEM:GRID]]]
  48. # Restart frequency. Use any (reasonable) number and time unit you want.
  49. # For runs without restart, leave this variable empty
  50. rst_freq="[[[MOD:GENERAL:RST_FREQ]]]"
  51. # Number of restart legs to be run in one go
  52. run_num_legs=[[[MOD:GENERAL:RUN_NUM_LEGS]]]
  53. # Directories
  54. #start_dir=${PWD}
  55. ctrl_file_dir=${start_dir}/ctrl
  56. # Architecture
  57. build_arch=[[[PLT:ACTIVE:BUILD_ARCH]]]
  58. # This file is used to store information about restarts
  59. ece_info_file="ece.info"
  60. # -----------------------------------------------------------------------------
  61. # *** Read platform dependent configuration
  62. # -----------------------------------------------------------------------------
  63. . ${start_dir}/ecconf.cfg
  64. configure
  65. # -----------------------------------------------------------------------------
  66. # *** Time step settings
  67. # -----------------------------------------------------------------------------
  68. case "${ifs_grid}--${nem_grid}" in
  69. T255L*--ORCA1L*)
  70. ifs_time_step_sec=2700; nem_time_step_sec=2700; lim_time_step_sec=2700; cpl_freq_atm_oce_sec=2700
  71. ;;
  72. T511L*--ORCA025L*)
  73. ifs_time_step_sec=900 ; nem_time_step_sec=900 ; lim_time_step_sec=900 ; cpl_freq_atm_oce_sec=2700
  74. ;;
  75. *) error "Can't set time steps for unknown combination of horizontal grids: ${ifs_grid}-${nem_grid}"
  76. ;;
  77. esac
  78. # -----------------------------------------------------------------------------
  79. # *** IFS configuration
  80. # -----------------------------------------------------------------------------
  81. ifs_version=36r4
  82. ifs_output_freq=$(( 6 * 3600 / ifs_time_step_sec ))
  83. ifs_di_freq=$(( 24 * 3600 / ifs_time_step_sec ))
  84. ifs_ddh_freq=$(( 120 * 3600 / ifs_time_step_sec ))
  85. ifs_res_hor=$(echo ${ifs_grid} | sed 's:T\([0-9]\+\)L\([0-9]\+\):\1:')
  86. ifs_res_ver=$(echo ${ifs_grid} | sed 's:T\([0-9]\+\)L\([0-9]\+\):\2:')
  87. ifs_numproc=[[[MOD:IFS:NUMPROC]]]
  88. ifs_exe_file=${ecearth_src_dir}/ifs-${ifs_version}/bin/ifsmaster-${build_arch}
  89. ifs_lastout=false
  90. ifs_cmip5=[[[MOD:IFS:CMIP5]]]
  91. ifs_cmip5_rcp=[[[MOD:IFS:CMIP5_RCP]]]
  92. ifs_cmip_fixyear=[[[MOD:IFS:CMIP_FIXYEAR]]]
  93. ifs_mac2sp=[[[MOD:IFS:MAC2SP]]]
  94. ifs_cmip6piaer=[[[MOD:IFS:CMIP6PIAER]]]
  95. ifs_cmip6=[[[MOD:IFS:CMIP6]]]
  96. ifs_A4xCO2=[[[MOD:IFS:CMIP6_A4xCO2]]]
  97. ifs_1PCTCO2=[[[MOD:IFS:CMIP6_1PCTCO2]]]
  98. # Time-varying orbital forcing (Qiong Zhang, SU-2013-09)
  99. # https://dev.ec-earth.org/projects/ecearth3/wiki/Orbital_forcing_in_EC-Earth_3
  100. #
  101. # ifs_orb_switch=FALSE, no orbital calculations applied
  102. # ifs_orb_switch=TRUE, use orbital calculations according to ifs_orb_mode
  103. # ifs_orb_mode="fixed_year", or "variable_year", or "fixed_parameters"
  104. # fixed_year: calculate the orbital parameters at ifs_orb_iyear, e.g.,1850
  105. # variable_year: calculate orbital parameters annually start from ifs_orb_iyear
  106. # fixed_parameters: prescribe orbital parameters for given year
  107. ifs_orb_switch=FALSE
  108. ifs_orb_mode="variable_year"
  109. ifs_orb_iyear=$(date -u -d "${run_start_date}" +%Y)
  110. # *** IFS tuning (the commented values are EC-Earth 3.2beta and IFS cy36r4)
  111. # ECE32b IFS cy36r4
  112. RPRCON=1.51E-3 # 1.2E-3 1.4E-3
  113. RVICE=0.125 # 0.13 0.15
  114. RLCRITSNOW=4.2E-5 # 3.0E-5 5.0E-5
  115. RSNOWLIN2=0.035 # 0.035 0.025
  116. ENTRORG=1.66E-4 # 1.5E-4 1.8E-4
  117. DETRPEN=0.69E-4 # 0.75E-4 0.75E-4
  118. ENTRDD=3.6E-4 # 3.0E-4 2.0E-4
  119. RMFDEPS=0.27 # 0.3 0.35
  120. RCLDIFF=3.E-6 # 3.E-6
  121. RCLDIFFC=5.0 # 5.0
  122. # -----------------------------------------------------------------------------
  123. # *** NEMO/LIM configuration
  124. # -----------------------------------------------------------------------------
  125. # This is only needed if the experiment is started from an existing set of NEMO
  126. # restart files
  127. nem_restart_file_path=${start_dir}/nemo-rst
  128. nem_restart_offset=0
  129. nem_res_hor=$(echo ${nem_grid} | sed 's:ORCA\([0-9]\+\)L[0-9]\+:\1:')
  130. nem_exe_file=${ecearth_src_dir}/nemo-3.6/CONFIG/${nem_grid}_LIM3/BLD/bin/nemo.exe
  131. nem_numproc=[[[MOD:NEM:NUMPROC]]]
  132. # -----------------------------------------------------------------------------
  133. # *** Runoff mapper configuration
  134. # -----------------------------------------------------------------------------
  135. rnf_exe_file=${ecearth_src_dir}/runoff-mapper/bin/runoff-mapper.exe
  136. rnf_numproc=1
  137. # -----------------------------------------------------------------------------
  138. # *** OASIS configuration
  139. # -----------------------------------------------------------------------------
  140. # Restart files for the coupling fields (note 8 character limit in OASIS)
  141. # rstas.nc : atmoshpere single-category fields
  142. # rstam.nc : atmoshpere multi-category fields
  143. # rstos.nc : ocean single-category fields
  144. # rstom.nc : ocean multi-category fields
  145. oas_rst_files="rstas.nc rstos.nc"
  146. # Decide whether the OASIS weight files for interpolation should be linked from
  147. # the setup directory (true) or not (false). In the latter case, the weights
  148. # are re-computed at the start of the run.
  149. oas_link_weights=true
  150. # Flux correction for runoff (not calving) sent from Oasis to ocean.
  151. # 1.07945 is computed to compensate for a P-E=-0.016 mm/day
  152. oas_mb_fluxcorr=1.07945
  153. # -----------------------------------------------------------------------------
  154. # *** XIOS configuration
  155. # -----------------------------------------------------------------------------
  156. xio_exe_file=${ecearth_src_dir}/xios-2/bin/xios_server.exe
  157. xio_numproc=[[[MOD:XIO:NUMPROC]]]
  158. # =============================================================================
  159. # *** END of User configuration
  160. # =============================================================================
  161. # =============================================================================
  162. # *** This is where the code begins ...
  163. # =============================================================================
  164. # -----------------------------------------------------------------------------
  165. # *** Create the run dir if necessary and go there
  166. # Everything is done from here.
  167. # -----------------------------------------------------------------------------
  168. if [ ! -d ${run_dir} ]
  169. then
  170. mkdir -p ${run_dir}
  171. if $special_restart
  172. then
  173. force_run_from_scratch=false
  174. rsync -av --delete ${run_dir}/../${special_restart_from}/ --exclude log --exclude output --exclude restart --exclude="${special_restart_from}_*" --exclude="srf*" --exclude="restart_*" --exclude="debug.*" --exclude="output.*" ${run_dir}
  175. cp -f ${nem_exe_file} ${run_dir}
  176. cp -f ${ifs_exe_file} ${run_dir}
  177. cp -f ${rnf_exe_file} ${run_dir}
  178. cp -f ${xio_exe_file} ${run_dir}
  179. special_year=${special_restart_date:0:4}
  180. sed -i "/$special_year/q" ${run_dir}/ece.info
  181. . ${run_dir}/ece.info
  182. special_restart_leg=$(printf %03d $((leg_number+1)))
  183. # PUT HERE THE INSTRUCTIONS TO COPY THE restart files
  184. rsync -av ${run_dir}/../${special_restart_from}/restart/ifs/${special_restart_leg}/ ${run_dir}
  185. rsync -av ${run_dir}/../${special_restart_from}/restart/oasis/${special_restart_leg}/ ${run_dir}
  186. cd ${run_dir}/../${special_restart_from}/restart/nemo/${special_restart_leg}
  187. for f in *.nc; do
  188. nf=${exp_name}${f:4}
  189. cp $f ${run_dir}/$nf
  190. done
  191. cd -
  192. cd ${run_dir}
  193. for f in ${exp_name}_????????_restart_???_????.nc; do
  194. nf=${f:14}
  195. ln -s $f $nf
  196. done
  197. cd -
  198. rm -f ${run_dir}/ICMCL${special_restart_from}INIT
  199. mv ${run_dir}/ICMGG${special_restart_from}INIUA ${run_dir}/ICMGG${exp_name}INIUA
  200. mv ${run_dir}/ICMGG${special_restart_from}INIT ${run_dir}/ICMGG${exp_name}INIT
  201. mv ${run_dir}/ICMSH${special_restart_from}INIT ${run_dir}/ICMSH${exp_name}INIT
  202. fi
  203. else
  204. force_run_from_scratch=false
  205. special_restart=false
  206. fi
  207. cd ${run_dir}
  208. # -----------------------------------------------------------------------------
  209. # *** Determine the time span of this run and whether it's a restart leg
  210. # -----------------------------------------------------------------------------
  211. # Regularise the format of the start and end date of the simulation
  212. run_start_date=$(date -uR -d "${run_start_date}")
  213. run_end_date=$(date -uR -d "${run_end_date}")
  214. # Loop over the number of legs
  215. for (( ; run_num_legs>0 ; run_num_legs-- ))
  216. do
  217. # Check for restart information file and set the current leg start date
  218. # Ignore restart information file if force_run_from_scratch is true
  219. if ${force_run_from_scratch} || ! [ -r ${ece_info_file} ]
  220. then
  221. leg_is_restart=false
  222. leg_start_date=${run_start_date}
  223. leg_number=1
  224. else
  225. leg_is_restart=true
  226. . ./${ece_info_file}
  227. leg_start_date=${leg_end_date}
  228. leg_number=$((leg_number+1))
  229. fi
  230. # Compute the end date of the current leg
  231. if [ -n "${rst_freq}" ]
  232. then
  233. leg_end_date=$(date -uR -d "${leg_start_date} + ${rst_freq}")
  234. else
  235. leg_end_date=${run_end_date}
  236. fi
  237. if [ $(date -d "${leg_end_date}" +%s) -gt $(date -d "${run_end_date}" +%s) ]
  238. then
  239. leg_end_date=${run_end_date}
  240. fi
  241. # Some time variables needed later
  242. leg_length_sec=$(( $(date -d "${leg_end_date}" +%s) - $(date -d "${leg_start_date}" +%s) ))
  243. leg_start_sec=$(( $(date -d "${leg_start_date}" +%s) - $(date -d "${run_start_date}" +%s) ))
  244. leg_end_sec=$(( $(date -d "${leg_end_date}" +%s) - $(date -d "${run_start_date}" +%s) ))
  245. leg_start_date_yyyymmdd=$(date -u -d "${leg_start_date}" +%Y%m%d)
  246. leg_start_date_yyyy=$(date -u -d "${leg_start_date}" +%Y)
  247. leg_end_date_yyyy=$(date -u -d "${leg_end_date}" +%Y)
  248. # Check whether there's actually time left to simulate - exit otherwise
  249. if [ ${leg_length_sec} -le 0 ]
  250. then
  251. info "Leg start date equal to or after end of simulation."
  252. info "Nothing left to do. Exiting."
  253. exit 0
  254. fi
  255. # -------------------------------------------------------------------------
  256. # *** Prepare the run directory for a run from scratch
  257. # -------------------------------------------------------------------------
  258. if ! $leg_is_restart
  259. then
  260. # ---------------------------------------------------------------------
  261. # *** Check if run dir is empty. If not, and if we are allowed to do so
  262. # by ${force_run_from_scratch}, remove everything
  263. # ---------------------------------------------------------------------
  264. if $(ls * >& /dev/null)
  265. then
  266. if ${force_run_from_scratch}
  267. then
  268. rm -fr ${run_dir}/*
  269. else
  270. error "Run directory not empty and \$force_run_from_scratch not set."
  271. fi
  272. fi
  273. # ---------------------------------------------------------------------
  274. # *** Copy executables of model components
  275. # *** Additionally, create symlinks to the original place for reference
  276. # ---------------------------------------------------------------------
  277. cp ${ifs_exe_file} .
  278. ln -s ${ifs_exe_file} $(basename ${ifs_exe_file}).lnk
  279. cp ${nem_exe_file} .
  280. ln -s ${nem_exe_file} $(basename ${nem_exe_file}).lnk
  281. cp ${rnf_exe_file} .
  282. ln -s ${rnf_exe_file} $(basename ${rnf_exe_file}).lnk
  283. cp ${xio_exe_file} .
  284. ln -s ${xio_exe_file} $(basename ${xio_exe_file}).lnk
  285. # ---------------------------------------------------------------------
  286. # *** Files needed for IFS (linked)
  287. # ---------------------------------------------------------------------
  288. # Initial data
  289. ln -s \
  290. ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMGGECE3INIUA \
  291. ICMGG${exp_name}INIUA
  292. ln -s \
  293. ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMGGECE3INIT \
  294. ICMGG${exp_name}INIT
  295. ln -s \
  296. ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMSHECE3INIT \
  297. ICMSH${exp_name}INIT
  298. # Other stuff
  299. ln -s ${ini_data_dir}/ifs/rtables/* .
  300. # Output control (ppt files)
  301. mkdir postins
  302. cp ${ctrl_file_dir}/ppt* postins/
  303. f_min=$(( ifs_output_freq * ifs_time_step_sec / 60 ))
  304. for t in $(seq $f_min $f_min 1439)
  305. do
  306. hh=$(printf %02d $((t/60)) )
  307. mm=$(printf %02d $((t%60)) )
  308. ln -s pptdddddd0000 postins/pptdddddd$hh$mm
  309. done
  310. /bin/ls -1 postins/* > dirlist
  311. # ---------------------------------------------------------------------
  312. # *** Files needed for NEMO (linked)
  313. # ---------------------------------------------------------------------
  314. # Link initialisation files for matching ORCA grid
  315. for f in \
  316. bathy_meter.nc coordinates.nc \
  317. ahmcoef.nc \
  318. K1rowdrg.nc M2rowdrg.nc mask_itf.nc \
  319. decay_scale_bot.nc decay_scale_cri.nc \
  320. mixing_power_bot.nc mixing_power_cri.nc mixing_power_pyc.nc \
  321. runoff_depth.nc
  322. do
  323. [ -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f ] && ln -s ${ini_data_dir}/nemo/initial/${nem_grid}/$f
  324. done
  325. # Link geothermal heating file (independent of grid) and matching weight file
  326. ln -s ${ini_data_dir}/nemo/initial/Goutorbe_ghflux.nc
  327. ln -s ${ini_data_dir}/nemo/initial/weights_Goutorbe1_2_orca${nem_res_hor}_bilinear.nc
  328. # Link either restart files or climatology files for the initial state
  329. if $(has_config nemo:start_from_restart)
  330. then
  331. # When linking restart files, we accept three options:
  332. # (1) Merged files for ocean and ice, i.e.
  333. # restart_oce.nc and restart_ice.nc
  334. # (2) One-file-per-MPI-rank, i.e.
  335. # restart_oce_????.nc and restart_ice_????.nc
  336. # No check is done whether the number of restart files agrees
  337. # with the number of MPI ranks for NEMO!
  338. # (3) One-file-per-MPI-rank with a prefix, i.e.
  339. # <exp_name>_<time_step>_restart_oce_????.nc (similar for the ice)
  340. # The prefix is ignored.
  341. # The code assumes that one of the options can be applied! If more
  342. # options are applicable, the first is chosen. If none of the
  343. # options apply, NEMO will crash with missing restart file.
  344. if ls -U ${nem_restart_file_path}/restart_[oi]ce.nc > /dev/null 2>&1
  345. then
  346. ln -s ${nem_restart_file_path}/restart_[oi]ce.nc ./
  347. elif ls -U ${nem_restart_file_path}/restart_[oi]ce_????.nc > /dev/null 2>&1
  348. then
  349. ln -s ${nem_restart_file_path}/restart_[oi]ce_????.nc ./
  350. else
  351. for f in ${nem_restart_file_path}/????_????????_restart_[oi]ce_????.nc
  352. do
  353. ln -s $f $(echo $f | sed 's/.*_\(restart_[oi]ce_....\.nc\)/\1/')
  354. done
  355. fi
  356. else
  357. # Temperature and salinity files for initialisation
  358. ln -s ${ini_data_dir}/nemo/climatology/absolute_salinity_WOA13_decav_Reg1L75_clim.nc
  359. ln -s ${ini_data_dir}/nemo/climatology/conservative_temperature_WOA13_decav_Reg1L75_clim.nc
  360. ln -s ${ini_data_dir}/nemo/climatology/weights_WOA13d1_2_orca${nem_res_hor}_bilinear.nc
  361. # Grid dependent runoff files
  362. case ${nem_grid} in
  363. ORCA1*) ln -s ${ini_data_dir}/nemo/climatology/runoff-icb_DaiTrenberth_Depoorter_ORCA1_JD.nc ;;
  364. ORCA025*) ln -s ${ini_data_dir}/nemo/climatology/ORCA_R025_runoff_v1.1.nc ;;
  365. esac
  366. fi
  367. # XIOS files
  368. . ${ctrl_file_dir}/iodef.xml.sh > iodef.xml
  369. ln -s ${ctrl_file_dir}/context_nemo.xml
  370. ln -s ${ctrl_file_dir}/domain_def_nemo.xml
  371. ln -s ${ctrl_file_dir}/field_def_nemo-lim.xml
  372. ln -s ${ctrl_file_dir}/field_def_nemo-opa.xml
  373. ln -s ${ctrl_file_dir}/field_def_nemo-pisces.xml
  374. ln -s ${ctrl_file_dir}/file_def_nemo-lim3.xml file_def_nemo-lim.xml
  375. ln -s ${ctrl_file_dir}/file_def_nemo-opa.xml
  376. ln -s ${ctrl_file_dir}/file_def_nemo-pisces.xml
  377. # ---------------------------------------------------------------------
  378. # *** Files needed for the Runoff mapper (linked)
  379. # ---------------------------------------------------------------------
  380. ln -s ${ini_data_dir}/runoff-mapper/runoff_maps.nc
  381. # ---------------------------------------------------------------------
  382. # *** Files needed for OASIS (linked)
  383. # ---------------------------------------------------------------------
  384. oas_grid_dir=${ini_data_dir}/oasis/T${ifs_res_hor}-ORCA${nem_res_hor}
  385. # Name table file
  386. ln -s ${ini_data_dir}/oasis/cf_name_table.txt
  387. # Grid definition files
  388. ln -s ${oas_grid_dir}/areas.nc
  389. ln -s ${oas_grid_dir}/grids.nc
  390. ln -s ${oas_grid_dir}/masks.nc
  391. # Weight files
  392. case ${ifs_res_hor} in
  393. 159) oas_agrd=080
  394. ;;
  395. 255) oas_agrd=128
  396. ;;
  397. 511) oas_agrd=256
  398. ;;
  399. 799) oas_agrd=400
  400. ;;
  401. *) error "Unsupported horizontal resolution (IFS): ${ifs_res_hor}"
  402. ;;
  403. esac
  404. case ${nem_res_hor} in
  405. 1) oas_ogrd=O1t0
  406. ;;
  407. 025) oas_ogrd=Ot25
  408. ;;
  409. *) error "Unsupported horizontal resolution (NEMO): ${nem_res_hor}"
  410. ;;
  411. esac
  412. if ${oas_link_weights}
  413. then
  414. for f in ${oas_grid_dir}/rmp_????_to_????_GAUSWGT.nc
  415. do
  416. ln -s $f
  417. done
  418. fi
  419. for f in ${oas_rst_files}
  420. do
  421. cp ${oas_grid_dir}/rst/$f .
  422. done
  423. else # i.e. $leg_is_restart == true
  424. # ---------------------------------------------------------------------
  425. # *** Remove all leftover output files from previous legs
  426. # ---------------------------------------------------------------------
  427. # IFS files
  428. rm -f ICM{SH,GG}${exp_name}+??????
  429. # NEMO files
  430. rm -f ${exp_name}_??_????????_????????_{grid_U,grid_V,grid_W,grid_T,icemod,SBC,scalar,SBC_scalar}.nc
  431. fi # ! $leg_is_restart
  432. # -------------------------------------------------------------------------
  433. # *** Create some control files
  434. # -------------------------------------------------------------------------
  435. # IFS, NEMO, LIM namelist and OASIS namcouple files
  436. . ${ctrl_file_dir}/namelist.ifs.sh > fort.4
  437. . ${ctrl_file_dir}/namelist.nemo.ref.sh > namelist_ref
  438. . ${ctrl_file_dir}/namelist.nemo-${nem_grid}-coupled.cfg.sh > namelist_cfg
  439. . ${ctrl_file_dir}/namelist.lim3.ref.sh > namelist_ice_ref
  440. . ${ctrl_file_dir}/namelist.lim3-${nem_grid}.cfg.sh > namelist_ice_cfg
  441. . ${ctrl_file_dir}/namelist.runoffmapper.sh > namelist.runoffmapper
  442. . ${ctrl_file_dir}/namcouple.sh > namcouple
  443. # -------------------------------------------------------------------------
  444. # *** IFS climatology data
  445. # -------------------------------------------------------------------------
  446. icmclfile=${ini_data_dir}/ifs/${ifs_grid}/climate/ICMCL
  447. tempfile=tmp.$$
  448. grib_set=${GRIB_BIN_PATH}${GRIB_BIN_PATH:+/}grib_set
  449. # Create data for december, the year before the leg starts
  450. ${grib_set} \
  451. -s dataDate=$(printf "%04d" $((leg_start_date_yyyy-1)))1215 ${icmclfile}-12 \
  452. ICMCL${exp_name}INIT
  453. # Create data for all month in the years of the leg
  454. for (( y=${leg_start_date_yyyy} ; y<=${leg_end_date_yyyy} ; y++ ))
  455. do
  456. yy=$(printf "%04d" $y)
  457. for m in {1..12}
  458. do
  459. mm=$(printf "%02d" $m)
  460. ${grib_set} -s dataDate=${yy}${mm}15 ${icmclfile}-${mm} ${tempfile}
  461. cat ${tempfile} >> ICMCL${exp_name}INIT
  462. done
  463. done
  464. # Create data for january, the year after the leg ends
  465. ${grib_set} -s dataDate=$(printf "%04d" $((leg_end_date_yyyy+1)))0115 ${icmclfile}-01 \
  466. ${tempfile}
  467. cat ${tempfile} >> ICMCL${exp_name}INIT
  468. # Clean up
  469. rm -f ${tempfile}
  470. # -------------------------------------------------------------------------
  471. # *** Link the appropriate NEMO restart files of the previous leg
  472. # -------------------------------------------------------------------------
  473. if $leg_is_restart
  474. then
  475. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  476. for (( n=0 ; n<nem_numproc ; n++ ))
  477. do
  478. np=$(printf %04d ${n})
  479. ln -fs ${exp_name}_${ns}_restart_oce_${np}.nc restart_oce_${np}.nc
  480. ln -fs ${exp_name}_${ns}_restart_ice_${np}.nc restart_ice_${np}.nc
  481. done
  482. # Make sure there are no global restart files
  483. # If links are found, they will be removed. We are cautious and do
  484. # _not_ remove real files! However, if real global restart files are
  485. # present, NEMO/LIM will stop because time stamps will not match.
  486. [ -h restart_oce.nc ] && rm restart_oce.nc
  487. [ -h restart_ice.nc ] && rm restart_ice.nc
  488. fi
  489. # -------------------------------------------------------------------------
  490. # *** Remove some OASIS files of the previous leg
  491. # -------------------------------------------------------------------------
  492. if $leg_is_restart
  493. then
  494. rm -f anaisout_*
  495. fi
  496. # -------------------------------------------------------------------------
  497. # *** Start the run
  498. # -------------------------------------------------------------------------
  499. export DR_HOOK_IGNORE_SIGNALS='-1'
  500. export CPLNG='active'
  501. # Use the launch function from the platform configuration file
  502. t1=$(date +%s)
  503. launch \
  504. ${xio_numproc} ${xio_exe_file} -- \
  505. ${nem_numproc} ${nem_exe_file} -- \
  506. ${rnf_numproc} ${rnf_exe_file} -- \
  507. ${ifs_numproc} ${ifs_exe_file} -v ecmwf -e ${exp_name}
  508. t2=$(date +%s)
  509. tr=$(date -d "0 -$t1 sec + $t2 sec" +%T)
  510. # -------------------------------------------------------------------------
  511. # *** Check for signs of success
  512. # Note the tests provide no guarantee that things went fine! They are
  513. # just based on the IFS and NEMO log files. More tests (e.g. checking
  514. # restart files) could be implemented.
  515. # -------------------------------------------------------------------------
  516. # Checking for IFS success
  517. if [ -f ifs.stat ]
  518. then
  519. if [ "$(awk 'END{print $3}' ifs.stat)" == "CNT0" ]
  520. then
  521. info "Leg successfully completed according to IFS log file 'ifs.stat'."
  522. else
  523. error "Leg not completed according to IFS log file 'ifs.stat'."
  524. fi
  525. else
  526. error "IFS log file 'ifs.stat' not found after run."
  527. fi
  528. # Check for NEMO success
  529. if [ -f ocean.output ]
  530. then
  531. if [ "$(awk '/New day/{d=$10}END{print d}' ocean.output)" == "$(date -d "${leg_end_date} - 1 day" +%Y/%m/%d)" ]
  532. then
  533. info "Leg successfully completed according to NEMO log file 'ocean.output'."
  534. else
  535. error "Leg not completed according to NEMO log file 'ocean.output'."
  536. fi
  537. else
  538. error "NEMO log file 'ocean.output' not found after run."
  539. fi
  540. # -------------------------------------------------------------------------
  541. # *** Move IFS output files to archive directory
  542. # -------------------------------------------------------------------------
  543. outdir="output/ifs/$(printf %03d $((leg_number)))"
  544. mkdir -p ${outdir}
  545. prv_leg=$(printf %03d $((leg_number-1)))
  546. # This takes care of a special IFS feature: The output for the last time
  547. # step of each leg is written at the first time step of the new leg. The
  548. # following code makes sure that the output is appended to the appropriate
  549. # file. Since GRIB files are just streams, its done with a simple cat
  550. # command.
  551. for f in ICMSH${exp_name}+?????? ICMGG${exp_name}+??????
  552. do
  553. if [ -f output/ifs/${prv_leg}/${f} ]
  554. then
  555. cat ${f} >> output/ifs/${prv_leg}/${f}
  556. rm -f ${f}
  557. else
  558. mv ${f} ${outdir}
  559. fi
  560. done
  561. # -------------------------------------------------------------------------
  562. # *** Move NEMO output files to archive directory
  563. # -------------------------------------------------------------------------
  564. outdir="output/nemo/$(printf %03d $((leg_number)))"
  565. mkdir -p ${outdir}
  566. for v in grid_U grid_V grid_W grid_T icemod SBC scalar SBC_scalar
  567. do
  568. for f in ${exp_name}_*_????????_????????_${v}.nc
  569. do
  570. test -f $f && mv $f $outdir/
  571. done
  572. done
  573. # -------------------------------------------------------------------------
  574. # *** Move IFS restart files to archive directory
  575. # -------------------------------------------------------------------------
  576. if $leg_is_restart
  577. then
  578. outdir="restart/ifs/$(printf %03d $((leg_number)))"
  579. mkdir -p ${outdir}
  580. # Figure out the time part of the restart files (cf. CTIME on rcf files)
  581. # NOTE: Assuming that restarts are at full days (time=0000) only!
  582. nd="$(printf %06d $((leg_start_sec/(24*3600))))0000"
  583. mv srf${nd}.???? ${outdir}
  584. fi
  585. # -------------------------------------------------------------------------
  586. # *** Move NEMO restart files to archive directory
  587. # -------------------------------------------------------------------------
  588. if $leg_is_restart
  589. then
  590. outdir="restart/nemo/$(printf %03d $((leg_number)))"
  591. mkdir -p ${outdir}
  592. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  593. for f in oce ice
  594. do
  595. mv ${exp_name}_${ns}_restart_${f}_????.nc ${outdir}
  596. done
  597. fi
  598. # -------------------------------------------------------------------------
  599. # *** Copy OASIS restart files to archive directory
  600. # NOTE: These files are copied and not moved as they are used in the
  601. # next leg!
  602. # Note also that the OASIS restart files present at the end of
  603. # the leg correspond to the start of the next leg!
  604. # -------------------------------------------------------------------------
  605. outdir="restart/oasis/$(printf %03d $((leg_number+1)))"
  606. mkdir -p ${outdir}
  607. for f in ${oas_rst_files}
  608. do
  609. test -f ${f} && cp ${f} ${outdir}
  610. done
  611. # -------------------------------------------------------------------------
  612. # *** Copy rcf files to the archive directory (of the next leg!)
  613. # -------------------------------------------------------------------------
  614. outdir="restart/ifs/$(printf %03d $((leg_number+1)))"
  615. mkdir -p ${outdir}
  616. for f in rcf
  617. do
  618. test -f ${f} && cp ${f} ${outdir}
  619. done
  620. # -------------------------------------------------------------------------
  621. # *** Move log files to archive directory
  622. # -------------------------------------------------------------------------
  623. outdir="log/$(printf %03d $((leg_number)))"
  624. mkdir -p ${outdir}
  625. for f in \
  626. ifs.log ifs.stat fort.4 ocean.output \
  627. time.step solver.stat \
  628. nout.000000 debug.??.?????? A*_??.nc O*_??.nc
  629. do
  630. test -f ${f} && mv ${f} ${outdir}
  631. done
  632. # -------------------------------------------------------------------------
  633. # *** Write the restart control file
  634. # -------------------------------------------------------------------------
  635. # Compute CPMIP performance
  636. sypd="$(cpmip_sypd $leg_length_sec $(($t2 - $t1)))"
  637. chpsy="$(cpmip_chpsy $leg_length_sec $(($t2 - $t1)) $(($ifs_numproc + $nem_numproc + $rnf_numproc + $xio_numproc)))"
  638. echo "#" | tee -a ${ece_info_file}
  639. echo "# Finished leg at `date '+%F %T'` after ${tr} (hh:mm:ss)" \
  640. | tee -a ${ece_info_file}
  641. echo "# CPMIP performance: $sypd SYPD $chpsy CHPSY"| tee -a ${ece_info_file}
  642. echo "leg_number=${leg_number}" | tee -a ${ece_info_file}
  643. echo "leg_start_date=\"${leg_start_date}\"" | tee -a ${ece_info_file}
  644. echo "leg_end_date=\"${leg_end_date}\"" | tee -a ${ece_info_file}
  645. # Need to reset force_run_from_scratch in order to avoid destroying the next leg
  646. force_run_from_scratch=false
  647. special_restart=false
  648. done # loop over legs
  649. # -----------------------------------------------------------------------------
  650. # *** Platform dependent finalising of the run
  651. # -----------------------------------------------------------------------------
  652. finalise
  653. exit 0