ece-ifs+nemo.sh.tmpl 30 KB

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