ece-ifs+nemo.sh.tmpl 28 KB

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