ece-ifs+nemo.sh.tmpl 30 KB

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