ece-ifs+nemo.sh.tmpl 30 KB

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