ece-ifs+nemo.sh.tmpl 28 KB

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