ece-esm.sh.tmpl 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865
  1. #!/usr/bin/env bash
  2. set -ue
  3. # librunscript defines some helper functions
  4. source ./librunscript.sh
  5. # =============================================================================
  6. # *** BEGIN User configuration
  7. # =============================================================================
  8. # -----------------------------------------------------------------------------
  9. # *** General configuration
  10. # -----------------------------------------------------------------------------
  11. # Component configuration (for syntax of the $config variable, see librunscript.sh)
  12. #
  13. # Currently maintained:
  14. # config="ifs amip oasis" # "GCM forced-SST" : IFS + AMIP
  15. # config="ifs amip oasis lpjg:fdbck" # "Veg" : forced-GCM + LPJ-Guess
  16. # config="ifs amip oasis tm5:chem,o3fb,ch4fb,aerfb" # "AerChem" : forced-GCM + TM5
  17. #
  18. # config="ifs nemo lim3 rnfmapper xios:detached oasis" # "GCM" : IFS+NEMO
  19. # config="ifs nemo lim3 rnfmapper xios:detached oasis lpjg:fdbck" # "Veg" : GCM+LPJ-Guess
  20. # config="ifs nemo lim3 rnfmapper xios:detached oasis pisces lpjg:fdbck tm5:co2,co2fb" # "C-cycle" : GCM+LPJG+TM5
  21. # config="ifs nemo lim3 rnfmapper xios:detached oasis tm5:chem,o3fb,ch4fb,aerfb" # "AerChem" : GCM+TM5
  22. #
  23. # config="ifs nemo pisces lim3 rnfmapper xios:detached oasis" # "GCM" : IFS+NEMO+PISCES
  24. #
  25. config="ifs nemo lim3 rnfmapper xios:detached oasis lpjg:fdbck tm5:co2"
  26. # minimum sanity
  27. has_config amip nemo && error "Cannot have both nemo and amip in config!!"
  28. ! has_config ifs && error "The ESM script requires ifs in config"
  29. # Experiment name (exactly 4 letters!)
  30. export exp_name=[[[MOD:GENERAL:EXP_NAME]]]
  31. # Simulation start and end date. Use any (reasonable) syntax you want.
  32. run_start_date="[[[MOD:GENERAL:RUN_START_DATE]]]"
  33. run_end_date="[[[MOD:GENERAL:RUN_END_DATE]]]"
  34. # Set $force_run_from_scratch to 'true' if you want to force this run to start
  35. # from scratch, possibly ignoring any restart files present in the run
  36. # directory. Leave set to 'false' otherwise.
  37. # NOTE: If set to 'true' the run directory $run_dir is cleaned!
  38. force_run_from_scratch=[[[MOD:GENERAL:FORCE_RUN_FROM_SCRATCH]]]
  39. # Resolution (TM5 resolution is set at compilation)
  40. ifs_grid=[[[MOD:IFS:GRID]]]
  41. nem_grid=[[[MOD:NEM:GRID]]]
  42. # Restart frequency. Use any (reasonable) number and time unit you want.
  43. # For runs without restart, leave this variable empty
  44. rst_freq="[[[MOD:GENERAL:RST_FREQ]]]"
  45. # Number of restart legs to be run in one go
  46. run_num_legs=[[[MOD:GENERAL:RUN_NUM_LEGS]]]
  47. # Coupling frequencies
  48. has_config ifs tm5 && cpl_freq_atm_ctm_hrs=[[[MOD:OASIS:CPL_FREQ_ATM_CHE_HRS]]]
  49. has_config ifs lpjg && cpl_freq_atm_lpjg_hrs=[[[MOD:OASIS:CPL_FREQ_ATM_LPJG_HRS]]]
  50. # Don't change the coupling frequency because UPDCLIE (where SST and SIC
  51. # are updated) is called every 24 hours (hardcoded in ifs-36r4/src/ifs/utility/updtim.F90)
  52. has_config amip && cpl_freq_amip_sec=86400
  53. # Directories
  54. start_dir=${PWD}
  55. ctrl_file_dir=${start_dir}/ctrl
  56. output_control_files_dir=${start_dir}/[[[MOD:GENERAL:OUTPUT_CONTROL_FILES_DIR]]]
  57. # Architecture
  58. build_arch=[[[PLT:ACTIVE:BUILD_ARCH]]]
  59. use_machinefile=[[[PLT:ACTIVE:USE_MACHINEFILE]]]
  60. # This file is used to store information about restarts
  61. ece_info_file="ece.info"
  62. # -----------------------------------------------------------------------------
  63. # *** Read platform dependent configuration
  64. # -----------------------------------------------------------------------------
  65. source ./ecconf.cfg
  66. configure
  67. # -----------------------------------------------------------------------------
  68. # *** Time step settings
  69. # -----------------------------------------------------------------------------
  70. if has_config ifs
  71. then
  72. case "${ifs_grid}" in
  73. T159L*) ifs_time_step_sec=3600 ;;
  74. T255L*) ifs_time_step_sec=2700 ;;
  75. T511L*) ifs_time_step_sec=900 ;;
  76. *) error "Can't set time steps for unknown horizontal grid: ${ifs_grid}"
  77. ;;
  78. esac
  79. fi
  80. if has_config nemo
  81. then
  82. case "${nem_grid}" in
  83. ORCA1L*) nem_time_step_sec=2700; lim_time_step_sec=2700 ;;
  84. ORCA025L*) nem_time_step_sec=900 ; lim_time_step_sec=900 ;;
  85. *) error "Can't set time steps for unknown horizontal grid: ${nem_grid}"
  86. ;;
  87. esac
  88. fi
  89. if has_config ifs nemo
  90. then
  91. case "${ifs_grid}--${nem_grid}" in
  92. T159L*--ORCA1L*)
  93. ifs_time_step_sec=3600; nem_time_step_sec=2700; lim_time_step_sec=2700; cpl_freq_atm_oce_sec=10800
  94. ;;
  95. T255L*--ORCA1L*)
  96. ifs_time_step_sec=2700; nem_time_step_sec=2700; lim_time_step_sec=2700; cpl_freq_atm_oce_sec=2700
  97. ;;
  98. T511L*--ORCA025L*)
  99. ifs_time_step_sec=900 ; nem_time_step_sec=900 ; lim_time_step_sec=900 ; cpl_freq_atm_oce_sec=2700
  100. ;;
  101. *) error "Can't set time steps for unknown combination of horizontal grids: ${ifs_grid}-${nem_grid}"
  102. ;;
  103. esac
  104. fi
  105. # -----------------------------------------------------------------------------
  106. # *** IFS configuration
  107. # -----------------------------------------------------------------------------
  108. ifs_version=36r4
  109. ifs_di_freq=$(( 24 * 3600 / ifs_time_step_sec ))
  110. ifs_ddh_freq=$(( 120 * 3600 / ifs_time_step_sec ))
  111. export ifs_res_hor=$(echo ${ifs_grid} | sed 's:T\([0-9]\+\)L\([0-9]\+\):\1:')
  112. ifs_res_ver=$(echo ${ifs_grid} | sed 's:T\([0-9]\+\)L\([0-9]\+\):\2:')
  113. ifs_numproc=[[[MOD:IFS:NUMPROC]]]
  114. ifs_exe_file=${ecearth_src_dir}/ifs-${ifs_version}/bin/ifsmaster-${build_arch}
  115. ifs_lastout=false
  116. ifs_cmip5=[[[MOD:IFS:CMIP5]]]
  117. ifs_cmip5_rcp=[[[MOD:IFS:CMIP5_RCP]]]
  118. export ifs_cmip_fixyear=[[[MOD:IFS:CMIP_FIXYEAR]]]
  119. export ifs_cmip_fixyear_ch4=[[[MOD:IFS:CMIP_FIXYEAR_CH4]]]
  120. # Repeat trap from ifs/suecrad.F90 for early catch
  121. if ! has_config tm5:ch4fb && (( $ifs_cmip_fixyear != $ifs_cmip_fixyear_ch4 ))
  122. then
  123. error 'CH4 in IFS is not provided by TM5, NCMIPFIXYR_CH4 should be set equal to NCMIPFIXYR'
  124. fi
  125. ifs_cmip6=[[[MOD:IFS:CMIP6]]]
  126. ifs_mac2sp=[[[MOD:IFS:CMIP6]]]
  127. ifs_cmip6piaer=[[[MOD:IFS:CMIP6]]]
  128. ifs_cmip6_scenario=[[[MOD:IFS:CMIP6_SCENARIO]]]
  129. # Enable optional COVID-19 scenarios, will enforce ifs_cmip6_scenario=SSP2-4.5
  130. ifs_covid19=FALSE
  131. # Choose one scenario : Base TwoYearBlip ModerateGreen StrongGreen FossilFuel
  132. ifs_covid19scen=Base
  133. # Basic sanity checks
  134. if [ ${ifs_covid19} == TRUE ] ; then
  135. [ ${ifs_cmip6_scenario} != SSP2-4.5 ] && echo "*WARNING* with ifs_covid19=TRUE IFS uses ifs_cmip6_scenario=SSP2-4.5 not ${ifs_cmip6_scenario}"
  136. has_config any lpjg pisces tm5 && error "ifs_covid19=TRUE is not supported with LPJ-GUESS, PISCES nor TM5"
  137. fi
  138. lcmip6_strataer_simp=FALSE
  139. lcmip6_strataer_full=[[[MOD:IFS:CMIP6]]]
  140. lcmip6_strataer_bckgd=FALSE
  141. export ifs_A4xCO2=[[[MOD:IFS:CMIP6_A4xCO2]]]
  142. export ifs_1PCTCO2=[[[MOD:IFS:CMIP6_1PCTCO2]]]
  143. export bgc_1PCTCO2=[[[MOD:IFS:CMIP6_1PCTCO2_BGC]]]
  144. # Time-varying orbital forcing (Qiong Zhang, SU-2013-09)
  145. # https://dev.ec-earth.org/projects/ecearth3/wiki/Orbital_forcing_in_EC-Earth_3
  146. #
  147. # ifs_orb_switch=false, no orbital calculations applied
  148. # ifs_orb_switch=true, use orbital calculations according to ifs_orb_mode
  149. # ifs_orb_mode="fixed_year", or "variable_year", or "fixed_parameters"
  150. # fixed_year: calculate the orbital parameters at ifs_orb_iyear, e.g.,1850
  151. # variable_year: calculate orbital parameters annually start from ifs_orb_iyear
  152. # fixed_parameters: prescribe orbital parameters for given year
  153. case "${ifs_grid}" in
  154. T159*) ifs_orb_switch=true ;;
  155. *) ifs_orb_switch=false ;;
  156. esac
  157. ifs_orb_mode="variable_year"
  158. ifs_orb_iyear=$(date -u -d "${run_start_date}" +%Y)
  159. # Relaxation of soil moisture (Wilhelm May, LU; October 2017)
  160. #
  161. # LRXSM: Parameter indicating the levels to be nudged
  162. #
  163. # LRXSM = 0: no nudging
  164. # LRXSM = 12: 4xdaily data and 3 levels (excluding level 1)
  165. # LRXSM = 13: 4xdaily data and 4 levels
  166. #
  167. # LRXSMTx: time scale of the relaxation for level X (in hours)
  168. #
  169. # LRXSMTx = 0: actual values relpaced by external ones
  170. # LRXSMTx = 24: 1 day
  171. # LRXSMTx = 120: 5 days
  172. #
  173. # LRXSMS: indicates when the relaxation is done
  174. #
  175. # LRXSMS = 0: before the time step
  176. # LRXSMS = 1: after the time step
  177. #
  178. has_config soilnudg && ifs_lrxsm=13 || ifs_lrxsm=0
  179. ifs_lrxsmt1=96
  180. ifs_lrxsmt2=72
  181. ifs_lrxsmt3=48
  182. ifs_lrxsmt4=24
  183. ifs_lrxsms=1
  184. # IFS tuning parameters
  185. variant=
  186. has_config tm5:chem && variant=-AerChem
  187. ifs_tuning_parameter_file=${ctrl_file_dir}/ifs-tuning-parameters-${ifs_grid}${variant}.sh
  188. if [ -f ${ifs_tuning_parameter_file} ]
  189. then
  190. source ${ifs_tuning_parameter_file}
  191. else
  192. error "Sorry, ${ifs_tuning_parameter_file} not found, exiting."
  193. fi
  194. # Select source of vegetation data:
  195. # ifs climatology from IFS
  196. # era20c vegetation from an off-line LPJ-Guess run forced with ERA20C
  197. # (currently available only for T255 and T159)
  198. # cmip6 vegetation from an EC-Earth3-Veg (interactive LPJ-Guess) run
  199. # (currently available only for T255)
  200. # custom_exp vegetation from any EC-Earth3-Veg run exp
  201. # (must contain same variables as era20c & cmip6 and located in icmcl_exp folder)
  202. # none don't create an ICMCL file with vegetation data (this is set
  203. # automatically if LPJG is used with feedback)
  204. #
  205. ifs_veg_source="cmip6"
  206. has_config lpjg:fdbck && ifs_veg_source="none"
  207. case ${ifs_veg_source} in
  208. "ifs" )
  209. # Use Lambert-Beer to compute effective vegetation cover
  210. n_compute_eff_veg_fraction=2
  211. ;;
  212. "era20c" )
  213. # LPJG vegetation is provided as effective cover
  214. # Don't use Lambert-Beer
  215. n_compute_eff_veg_fraction=0
  216. case "${ifs_grid}" in
  217. T159L*) veg_version=v29 ;;
  218. T255L*) veg_version=v16 ;;
  219. *) error "Vegetation from off-line LPJ-Guess not available for ${ifs_grid}" ;;
  220. esac
  221. ;;
  222. "cmip6" )
  223. # LPJG vegetation is provided as effective cover
  224. # Don't use Lambert-Beer
  225. n_compute_eff_veg_fraction=0
  226. case "${ifs_grid}" in
  227. T255L*) veg_version=v32 ;;
  228. *) error "Vegetation from CMIP6 EC-Earth3-Veg not available for ${ifs_grid}" ;;
  229. esac
  230. ;;
  231. "custom_"* )
  232. # LPJG vegetation is provided as effective cover
  233. # Don't use Lambert-Beer
  234. n_compute_eff_veg_fraction=0
  235. veg_version=${ifs_veg_source:7}
  236. if [ ! -d ${ini_data_dir}/ifs/${ifs_grid}/icmcl_${veg_version} ]
  237. then
  238. error "requested IFS_VEG_SOURCE = ${ifs_veg_source} but not found in ${ini_data_dir}/ifs/${ifs_grid}/icmcl_${veg_version}"
  239. fi
  240. ;;
  241. "none" )
  242. # LPJG with feedback
  243. n_compute_eff_veg_fraction=0
  244. ! has_config lpjg:fdbck && error "IFS requires an offline source of vegetation"
  245. ;;
  246. * )
  247. error "Vegetation from ${ifs_veg_source} not implemented"
  248. ;;
  249. esac
  250. # use DMI land ice physics and varying snow albedo
  251. case "${ifs_grid}" in
  252. T159*) ifs_landice=true ;;
  253. *) ifs_landice=false ;;
  254. esac
  255. # -----------------------------------------------------------------------------
  256. # *** NEMO/LIM configuration
  257. # -----------------------------------------------------------------------------
  258. # This is only needed if the experiment is started from an existing set of NEMO
  259. # restart files
  260. nem_restart_file_path=${start_dir}/nemo-rst
  261. nem_restart_offset=0
  262. nem_res_hor=$(echo ${nem_grid} | sed 's:ORCA\([0-9]\+\)L[0-9]\+:\1:')
  263. nem_config=${nem_grid}
  264. has_config lim3 && nem_config=${nem_config}_LIM3
  265. if has_config pisces tm5:co2
  266. then
  267. nem_config=${nem_config}_CarbonCycle
  268. elif has_config pisces
  269. then
  270. nem_config=${nem_config}_PISCES
  271. fi
  272. # TODO - nemo standalone configs are not accounted for in this script, but this would set the required nem_config
  273. ! has_config ifs && nem_config=${nem_config}_standalone
  274. nem_exe_file=${ecearth_src_dir}/nemo-3.6/CONFIG/${nem_config}/BLD/bin/nemo.exe
  275. nem_numproc=[[[MOD:NEM:NUMPROC]]]
  276. # Thermal conductivity of snow, see comment in ctrl/namelist.lim3.ref.sh
  277. case "${ifs_grid}" in
  278. T159L* ) nem_rn_cdsn=0.25 ;;
  279. * ) nem_rn_cdsn=0.27 ;;
  280. esac
  281. # -----------------------------------------------------------------------------
  282. # *** Runoff mapper configuration
  283. # -----------------------------------------------------------------------------
  284. rnf_exe_file=${ecearth_src_dir}/runoff-mapper/bin/runoff-mapper.exe
  285. rnf_numproc=1
  286. # -----------------------------------------------------------------------------
  287. # *** LPJ-GUESS configuration
  288. # -----------------------------------------------------------------------------
  289. lpjg_time_step_sec=[[[MOD:LPJG:TIME_STEP_SEC]]]
  290. lpjg_numproc=[[[MOD:LPJG:NUMPROC]]]
  291. has_config lpjg && lpjg_on=1
  292. has_config lpjg:fdbck && lpjg_fdbck=1
  293. has_config tm5:co2 && lpjg_fdbck_tm5=1 || lpjg_fdbck_tm5=0
  294. export lpjg_fixNdepafter=[[[MOD:LPJG:LPJG_FIXNDEPAFTER]]]
  295. export lpjg_fixLUafter=[[[MOD:LPJG:LPJG_FIXLUAFTER]]]
  296. info '!!!! CMIP FIX YEAR SETTINGS:'
  297. info "ifs_cmip_fixyear: $ifs_cmip_fixyear"
  298. info "lpjg_fixNDepAfter: $lpjg_fixNdepafter"
  299. info "lpjg_fixLUAfter: $lpjg_fixLUafter"
  300. info '!!!!'
  301. lpjg_res=T${ifs_res_hor}
  302. lpjg_exe_file=${ecearth_src_dir}/lpjg/build/guess_${lpjg_res}
  303. # -----------------------------------------------------------------------------
  304. # *** AMIP-reader configuration
  305. # -----------------------------------------------------------------------------
  306. amip_exe_file=${ecearth_src_dir}/amip-forcing/bin/amip-forcing.exe
  307. amip_numproc=1
  308. # -----------------------------------------------------------------------------
  309. # *** TM5 configuration
  310. # -----------------------------------------------------------------------------
  311. if $(has_config tm5)
  312. then
  313. # With TM5, NPRTRV is set to 1 in the namelist. To avoid some out-of-bound
  314. # arrays in IFS, we must limit the number of cores for IFS
  315. if (( ifs_numproc > (ifs_res_hor+1) ))
  316. then
  317. error "too much cores requested for IFS, max is $((ifs_res_hor+1))"
  318. fi
  319. # TM5 settings
  320. has_config tm5:co2 && tmversion="co2" || tmversion="cb05"
  321. has_config tm5:co2 && export tm5_co2=1 || export tm5_co2=0
  322. export tm5_exch_nlevs=[[[MOD:TM5:NLEVS]]]
  323. tm5_time_step_sec=[[[MOD:TM5:TIME_STEP_SEC]]]
  324. export tm5_numproc_x=[[[MOD:TM5:NUMPROC_X]]]
  325. export tm5_numproc_y=[[[MOD:TM5:NUMPROC_Y]]]
  326. tm5_numproc=$(( tm5_numproc_x * tm5_numproc_y ))
  327. export tm5_emiss_fixyear=[[[MOD:TM5:EMISS_FIXYEAR]]]
  328. # limited number of levels for feedback (aerosols, currently set to lmax_conv in TM5)
  329. case ${tm5_exch_nlevs} in
  330. 34) export tm5_exch_nlevs_cutoff=23 ;;
  331. 10) export tm5_exch_nlevs_cutoff=10 ;;
  332. 4) export tm5_exch_nlevs_cutoff=4 ;;
  333. *) error "not supported number of levels for TM5"
  334. esac
  335. # executable
  336. tm5_exe_file=${ecearth_src_dir}/tm5mp/build-${tmversion}-ml${tm5_exch_nlevs}/appl-tm5-${tmversion}.x
  337. # path to initial conditions, modify as needed
  338. tm5_restart_file_path=${ini_data_dir}/tm5/restart/${tmversion}-ml${tm5_exch_nlevs}
  339. # fields sent back to IFS
  340. has_config tm5:o3fb && tm5_to_ifs=O3 || tm5_to_ifs=
  341. has_config tm5:ch4fb && tm5_to_ifs=${tm5_to_ifs},CH4
  342. has_config tm5:aerfb && tm5_to_ifs=${tm5_to_ifs},"\
  343. N2,SU2,BC2,OC2,N3,SU3,BC3,OC3,SS3,DU3,\
  344. N4,SU4,BC4,OC4,SS4,DU4,N5,BC5,OC5,N6,DU6,N7,DU7,\
  345. NO3,MSA,\
  346. AOD_01,AOD_02,AOD_03,AOD_04,AOD_05,AOD_06,AOD_07,AOD_08,AOD_09,AOD_10,AOD_11,AOD_12,AOD_13,AOD_14,\
  347. SSA_01,SSA_02,SSA_03,SSA_04,SSA_05,SSA_06,SSA_07,SSA_08,SSA_09,SSA_10,SSA_11,SSA_12,SSA_13,SSA_14,\
  348. ASF_01,ASF_02,ASF_03,ASF_04,ASF_05,ASF_06,ASF_07,ASF_08,ASF_09,ASF_10,ASF_11,ASF_12,ASF_13,ASF_14"
  349. has_config tm5:co2fb && tm5_to_ifs=${tm5_to_ifs},CO2
  350. export tm5_to_ifs=$(echo ${tm5_to_ifs} | sed "s/^,//")
  351. # coupled to LPJ-Guess and/or PISCES?
  352. has_config tm5:co2 lpjg && export cpl_tm_guess=T || export cpl_tm_guess=F
  353. has_config tm5:co2 pisces && export cpl_tm_pisces=T || export cpl_tm_pisces=F
  354. fi
  355. # -----------------------------------------------------------------------------
  356. # *** OASIS configuration
  357. # -----------------------------------------------------------------------------
  358. # Restart files for the coupling fields (note 8 character limit in OASIS)
  359. # rstas.nc : atmosphere single-category fields
  360. # rstam.nc : atmosphere multi-category fields
  361. # rstos.nc : ocean single-category fields
  362. # rstom.nc : ocean multi-category fields
  363. oas_rst_ifs_nemo="rstas.nc rstos.nc"
  364. oas_rst_ifs_lpjg="vegin.nc lpjgv.nc"
  365. # Met fields from IFS to TM (always required)
  366. oas_rst_ifs_tm5="r_hum.nc r_g2d.nc r_udr.nc r_div.nc r_vor.nc \
  367. r_ddr.nc r_tmp.nc r_dmf.nc r_s2d.nc r_umf.nc"
  368. has_config tm5:chem && \
  369. oas_rst_ifs_tm5=${oas_rst_ifs_tm5}' r_cc_.nc r_clw.nc r_cco.nc r_ciw.nc r_ccu.nc'
  370. has_config tm5:o3fb || has_config tm5:ch4fb && oas_rst_ifs_tm5=$oas_rst_ifs_tm5' o3ch4.nc'
  371. has_config tm5:aerfb && oas_rst_ifs_tm5=$oas_rst_ifs_tm5' C???????'
  372. # C-cycle configuration
  373. has_config tm5:co2 lpjg && oas_rst_ifs_tm5=$oas_rst_ifs_tm5' l_co2.nc rlpjg.nc'
  374. has_config tm5:co2 pisces && oas_rst_ifs_tm5=$oas_rst_ifs_tm5' o_co2.nc pisce.nc'
  375. has_config tm5:co2fb && oas_rst_ifs_tm5=$oas_rst_ifs_tm5' co2mx.nc'
  376. # final list of files depends on the activated components - this is used in save_ic as well
  377. #oas_rst_files="${oas_rst_ifs_nemo} ${oas_rst_ifs_tm5} vegin.nc lpjgv.nc"
  378. oas_rst_files=""
  379. has_config ifs nemo && oas_rst_files+=" ${oas_rst_ifs_nemo}"
  380. has_config ifs lpjg && oas_rst_files+=" ${oas_rst_ifs_lpjg}"
  381. has_config ifs tm5 && oas_rst_files+=" ${oas_rst_ifs_tm5}"
  382. # Decide whether the OASIS weight files for interpolation should be linked from
  383. # the setup directory (true) or not (false). In the latter case, the weights
  384. # are re-computed at the start of the run.
  385. oas_link_weights=true
  386. # Flux correction for runoff (not calving) sent from Oasis to ocean.
  387. # 1.07945 is computed to compensate for a P-E=-0.016 mm/day (valid for std res)
  388. case "${ifs_grid}" in
  389. T159L* ) has_config nemo && oas_mb_fluxcorr=1.08652 ;;
  390. * ) has_config nemo && oas_mb_fluxcorr=1.07945 ;;
  391. esac
  392. # -----------------------------------------------------------------------------
  393. # *** XIOS configuration
  394. # -----------------------------------------------------------------------------
  395. xio_exe_file=${ecearth_src_dir}/xios-2.5/bin/xios_server.exe
  396. xio_numproc=[[[MOD:XIO:NUMPROC]]]
  397. # -----------------------------------------------------------------------------
  398. # *** Extra initial conditions saved during the run
  399. # -----------------------------------------------------------------------------
  400. if has_config save_ic
  401. then
  402. source ./libsave_ic.sh
  403. declare -a save_ic_date save_ic_date1 save_ic_sec save_ic_day save_ic_ppt_file save_ic_nemo_ts
  404. oas_rst_files="${oas_rst_ifs_nemo} ${oas_rst_ifs_tm5} vegin.nc lpjgv.nc"
  405. fi
  406. # -----------------------------------------------------------------------------
  407. # *** Carbon cycle configuration
  408. # -----------------------------------------------------------------------------
  409. # set to true to write co2 fluxes sent to TM5
  410. ccycle_debug_fluxes=true
  411. # =============================================================================
  412. # *** END of User configuration
  413. # =============================================================================
  414. # =============================================================================
  415. # *** This is where the code begins ...
  416. # =============================================================================
  417. # -----------------------------------------------------------------------------
  418. # *** Create the run dir if necessary and go there
  419. # Everything is done from here.
  420. # -----------------------------------------------------------------------------
  421. if [ ! -d ${run_dir} ]
  422. then
  423. mkdir -p ${run_dir}
  424. fi
  425. cd ${run_dir}
  426. # -----------------------------------------------------------------------------
  427. # *** Determine the time span of this run and whether it's a restart leg
  428. # -----------------------------------------------------------------------------
  429. # Regularise the format of the start and end date of the simulation
  430. run_start_date=$(date -uR -d "${run_start_date}")
  431. run_end_date=$(date -uR -d "${run_end_date}")
  432. # -----------------------------------------------------------------------------
  433. # *** Set path to grib_set
  434. # -----------------------------------------------------------------------------
  435. grib_set=${GRIB_BIN_PATH}${GRIB_BIN_PATH:+/}grib_set
  436. # Loop over the number of legs
  437. for (( ; run_num_legs>0 ; run_num_legs-- ))
  438. do
  439. # Check for restart information file and set the current leg start date
  440. # Ignore restart information file if force_run_from_scratch is true
  441. if ${force_run_from_scratch} || ! [ -r ${ece_info_file} ]
  442. then
  443. leg_is_restart=false
  444. leg_start_date=${run_start_date}
  445. leg_number=1
  446. else
  447. leg_is_restart=true
  448. . ./${ece_info_file}
  449. leg_start_date=${leg_end_date}
  450. leg_number=$((leg_number+1))
  451. fi
  452. # Compute the end date of the current leg
  453. if [ -n "${rst_freq}" ]
  454. then
  455. leg_end_date=$(date -uR -d "${leg_start_date} + ${rst_freq}")
  456. else
  457. leg_end_date=${run_end_date}
  458. fi
  459. # Check if legs are integer multiples of full years if LPJG is used
  460. if has_config lpjg
  461. then
  462. if [[ $(date +%m%d%T -u -d "${leg_start_date}") != "010100:00:00" || \
  463. $(date +%m%d%T -u -d "${leg_start_date} + ${rst_freq}") != "010100:00:00" ]]
  464. then
  465. error "LPJ-GUESS runs must start on Jan 1 and end on Dec 31. Multi-year legs are allowed."
  466. fi
  467. fi
  468. if [ $(date -u -d "${leg_end_date}" +%s) -ge $(date -u -d "${run_end_date}" +%s) ]
  469. then
  470. leg_end_date=${run_end_date}
  471. ifs_lastout=true
  472. fi
  473. # Some time variables needed later
  474. leg_length_sec=$(( $(date -u -d "${leg_end_date}" +%s) - $(date -u -d "${leg_start_date}" +%s) ))
  475. leg_start_sec=$(( $(date -u -d "${leg_start_date}" +%s) - $(date -u -d "${run_start_date}" +%s) ))
  476. leg_end_sec=$(( $(date -u -d "${leg_end_date}" +%s) - $(date -u -d "${run_start_date}" +%s) ))
  477. leg_start_date_yyyymmdd=$(date -u -d "${leg_start_date}" +%Y%m%d)
  478. leg_start_date_yyyy=$(date -u -d "${leg_start_date}" +%Y)
  479. leg_end_date_yyyy=$(date -u -d "${leg_end_date}" +%Y)
  480. # Check whether there's actually time left to simulate - exit otherwise
  481. if [ ${leg_length_sec} -le 0 ]
  482. then
  483. info "Leg start date equal to or after end of simulation."
  484. info "Nothing left to do. Exiting."
  485. exit 0
  486. fi
  487. # Initial conditions saved during the run
  488. do_save_ic=false
  489. has_config save_ic && save_ic_get_config
  490. # if you do not use an option with save_ic, you must define 'do_save_ic' and
  491. # 'save_ic_date_offset' here or in ../libsave_ic.sh/save_ic_get_config()
  492. ${do_save_ic} && save_ic_define_vars
  493. # -------------------------------------------------------------------------
  494. # *** Prepare the run directory for a run from scratch
  495. # -------------------------------------------------------------------------
  496. if ! $leg_is_restart
  497. then
  498. # ---------------------------------------------------------------------
  499. # *** Check if run dir is empty. If not, and if we are allowed to do so
  500. # by ${force_run_from_scratch}, remove everything
  501. # ---------------------------------------------------------------------
  502. if $(ls * >& /dev/null)
  503. then
  504. if ${force_run_from_scratch}
  505. then
  506. rm -fr ${run_dir}/*
  507. else
  508. error "Run directory not empty and \$force_run_from_scratch not set."
  509. fi
  510. fi
  511. # ---------------------------------------------------------------------
  512. # *** Copy executables of model components
  513. # *** Additionally, create symlinks to the original place for reference
  514. # ---------------------------------------------------------------------
  515. cp ${ifs_exe_file} .
  516. ln -s ${ifs_exe_file} $(basename ${ifs_exe_file}).lnk
  517. if $(has_config amip)
  518. then
  519. cp ${amip_exe_file} .
  520. ln -s ${amip_exe_file} $(basename ${amip_exe_file}).lnk
  521. fi
  522. if $(has_config nemo)
  523. then
  524. cp ${nem_exe_file} .
  525. ln -s ${nem_exe_file} $(basename ${nem_exe_file}).lnk
  526. cp ${rnf_exe_file} .
  527. ln -s ${rnf_exe_file} $(basename ${rnf_exe_file}).lnk
  528. cp ${xio_exe_file} .
  529. ln -s ${xio_exe_file} $(basename ${xio_exe_file}).lnk
  530. fi
  531. if $(has_config lpjg)
  532. then
  533. cp ${lpjg_exe_file} .
  534. ln -s ${lpjg_exe_file} $(basename ${lpjg_exe_file}).lnk
  535. fi
  536. if $(has_config tm5)
  537. then
  538. cp ${tm5_exe_file} .
  539. ln -s ${tm5_exe_file} $(basename ${tm5_exe_file}).lnk
  540. fi
  541. # ---------------------------------------------------------------------
  542. # *** Files needed for IFS (linked)
  543. # ---------------------------------------------------------------------
  544. # Initial data
  545. ln -s \
  546. ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMGGECE3INIUA \
  547. ICMGG${exp_name}INIUA
  548. ln -s \
  549. ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMSHECE3INIT \
  550. ICMSH${exp_name}INIT
  551. rm -f ICMGG${exp_name}INIT
  552. cp ${ini_data_dir}/ifs/${ifs_grid}/${leg_start_date_yyyymmdd}/ICMGGECE3INIT \
  553. ICMGG${exp_name}INIT
  554. # add bare_soil_albedo to ICMGG*INIT
  555. tempfile=tmp.$$
  556. ${grib_set} -s dataDate=$(date -u -d "$run_start_date" +%Y%m%d) \
  557. ${ini_data_dir}/ifs/${ifs_grid}/climate/bare_soil_albedos.grb \
  558. ${tempfile}
  559. cat ${tempfile} >> ICMGG${exp_name}INIT
  560. rm -f ${tempfile}
  561. # add land ice mask if needed
  562. if ${ifs_landice}
  563. then
  564. tempfile=tmp.$$
  565. cdo divc,10 -setcode,82 -selcode,141 ICMGG${exp_name}INIT ${tempfile}
  566. ${grib_set} -s gridType=reduced_gg ${tempfile} ${tempfile}
  567. cat ${tempfile} >> ICMGG${exp_name}INIT
  568. rm -f ${tempfile}
  569. fi
  570. # Other stuff
  571. ln -s ${ini_data_dir}/ifs/rtables/* .
  572. # Output control (ppt files)
  573. if [ ! -f ${output_control_files_dir}/pptdddddd0600 ] && [ ! -f ${output_control_files_dir}/pptdddddd0300 ];then
  574. echo "Error from ece-esm.sh: Neither the file pptdddddd0600 or pptdddddd0300 exists in the directory:"
  575. echo " " ${output_control_files_dir}
  576. exit -1
  577. fi
  578. mkdir postins
  579. cp ${output_control_files_dir}/ppt* postins/
  580. if [ -f postins/pptdddddd0600 ];then
  581. ln -s pptdddddd0600 postins/pptdddddd0000
  582. ln -s pptdddddd0600 postins/pptdddddd1200
  583. ln -s pptdddddd0600 postins/pptdddddd1800
  584. fi
  585. if [ -f postins/pptdddddd0300 ];then
  586. ln -s pptdddddd0300 postins/pptdddddd0900
  587. ln -s pptdddddd0300 postins/pptdddddd1500
  588. ln -s pptdddddd0300 postins/pptdddddd2100
  589. if [ ! -f postins/pptdddddd0600 ];then
  590. ln -s pptdddddd0300 postins/pptdddddd0000
  591. ln -s pptdddddd0300 postins/pptdddddd0600
  592. ln -s pptdddddd0300 postins/pptdddddd1200
  593. ln -s pptdddddd0300 postins/pptdddddd1800
  594. fi
  595. fi
  596. /bin/ls -1 postins/* > dirlist
  597. # ---------------------------------------------------------------------
  598. # *** Files needed for LPJ-GUESS
  599. # ---------------------------------------------------------------------
  600. if $(has_config lpjg)
  601. then
  602. # Check for valid grid
  603. if [ $lpjg_res != "T255" -a $lpjg_res != "T159" ]
  604. then
  605. error "LPJG-gridlist doesn't exist for ifs-grid: ${ifs_grid}"
  606. fi
  607. # Initial data - saved state for LPJ-GUESS (.bin format)
  608. lpjgstartdir=$(printf "lpjg_state_%04d" $leg_start_date_yyyy)
  609. ln -sf ${ini_data_dir}/lpjg/ini_state/${lpjg_res}/${lpjgstartdir} ${run_dir}/${lpjgstartdir}
  610. # Control files (i.e. .ins, landuse, N deposition, soil type files etc.)
  611. cp -f ${ecearth_src_dir}/lpjg/data/ins/*.ins .
  612. # activate the new litterfall scheme for C4MIP - for the coupled model this is done when both pisces and lpjg are activated
  613. has_config pisces lpjg && echo -e "!override for EC-Earth-CC in runscript\nifpftlitterfall 1\ncalc_phen_after_restart 0" >> global.ins
  614. mkdir -p ${run_dir}/landuse
  615. fi
  616. # ---------------------------------------------------------------------
  617. # *** Files needed for NEMO (linked)
  618. # ---------------------------------------------------------------------
  619. if $(has_config nemo)
  620. then
  621. # Link initialisation files for matching ORCA grid
  622. for f in \
  623. bathy_meter.nc coordinates.nc \
  624. ahmcoef.nc \
  625. K1rowdrg.nc M2rowdrg.nc mask_itf.nc \
  626. decay_scale_bot.nc decay_scale_cri.nc \
  627. mixing_power_bot.nc mixing_power_cri.nc mixing_power_pyc.nc \
  628. runoff_depth.nc subbasins.nc
  629. do
  630. [ -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f ] && ln -s ${ini_data_dir}/nemo/initial/${nem_grid}/$f
  631. done
  632. # Copying the time independent NEMO files for the matching ORCA grid in order to facilitate cmorisation:
  633. for f in \
  634. bathy_meter.nc subbasins.nc
  635. do
  636. mkdir -p output/nemo/ofx-data
  637. [ -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f ] && cp -f ${ini_data_dir}/nemo/initial/${nem_grid}/$f output/nemo/ofx-data/
  638. done
  639. # Link geothermal heating file (independent of grid) and matching weight file
  640. ln -s ${ini_data_dir}/nemo/initial/Goutorbe_ghflux.nc
  641. ln -s ${ini_data_dir}/nemo/initial/weights_Goutorbe1_2_orca${nem_res_hor}_bilinear.nc
  642. # Link the salinity climatology file (needed for diagnostics)
  643. ln -s ${ini_data_dir}/nemo/climatology/${nem_grid}/sali_ref_clim_monthly.nc
  644. # Link either restart files or climatology files for the initial state
  645. if $(has_config nemo:start_from_restart)
  646. then
  647. # When linking restart files, we accept three options:
  648. # (1) Merged files for ocean and ice, i.e.
  649. # restart_oce.nc and restart_ice.nc
  650. # (2) One-file-per-MPI-rank, i.e.
  651. # restart_oce_????.nc and restart_ice_????.nc
  652. # No check is done whether the number of restart files agrees
  653. # with the number of MPI ranks for NEMO!
  654. # (3) One-file-per-MPI-rank with a prefix, i.e.
  655. # <exp_name>_<time_step>_restart_oce_????.nc (similar for the ice)
  656. # The prefix is ignored.
  657. # The code assumes that one of the options can be applied! If more
  658. # options are applicable, the first is chosen. If none of the
  659. # options apply, NEMO will crash with missing restart file.
  660. if ls -U ${nem_restart_file_path}/restart_[oi]ce.nc > /dev/null 2>&1
  661. then
  662. ln -s ${nem_restart_file_path}/restart_[oi]ce.nc ./
  663. elif ls -U ${nem_restart_file_path}/restart_[oi]ce_????.nc > /dev/null 2>&1
  664. then
  665. ln -s ${nem_restart_file_path}/restart_[oi]ce_????.nc ./
  666. else
  667. for f in ${nem_restart_file_path}/????_????????_restart_[oi]ce_????.nc
  668. do
  669. ln -s $f $(echo $f | sed 's/.*_\(restart_[oi]ce_....\.nc\)/\1/')
  670. done
  671. fi
  672. else
  673. # Temperature and salinity files for initialisation
  674. ln -s ${ini_data_dir}/nemo/climatology/absolute_salinity_WOA13_decav_Reg1L75_clim.nc
  675. ln -s ${ini_data_dir}/nemo/climatology/conservative_temperature_WOA13_decav_Reg1L75_clim.nc
  676. ln -s ${ini_data_dir}/nemo/climatology/weights_WOA13d1_2_orca${nem_res_hor}_bilinear.nc
  677. # Grid dependent runoff files
  678. case ${nem_grid} in
  679. ORCA1*) ln -s ${ini_data_dir}/nemo/climatology/runoff-icb_DaiTrenberth_Depoorter_ORCA1_JD.nc ;;
  680. ORCA025*) ln -s ${ini_data_dir}/nemo/climatology/ORCA_R025_runoff_v1.1.nc ;;
  681. esac
  682. fi
  683. # for ocean_nudging
  684. if $(has_config nemo:ocenudg) ; then
  685. ln -s ${ini_data_dir}/nemo/oce_nudg/resto.nc
  686. fi
  687. # XIOS files
  688. . ${ctrl_file_dir}/iodef.xml.sh > iodef.xml
  689. ln -s ${ctrl_file_dir}/context_nemo.xml
  690. ln -s ${ctrl_file_dir}/domain_def_nemo.xml
  691. ln -s ${ctrl_file_dir}/axis_def_nemo.xml
  692. ln -s ${ctrl_file_dir}/grids_def_nemo.xml
  693. ln -s ${ctrl_file_dir}/field_def_nemo-lim.xml
  694. ln -s ${ctrl_file_dir}/field_def_nemo-opa.xml
  695. ln -s ${ctrl_file_dir}/field_def_nemo-pisces.xml
  696. ln -s ${ctrl_file_dir}/field_def_nemo-inerttrc.xml
  697. ln -s ${output_control_files_dir}/file_def_nemo-lim3.xml file_def_nemo-lim.xml
  698. ln -s ${output_control_files_dir}/file_def_nemo-opa.xml
  699. ln -s ${output_control_files_dir}/file_def_nemo-pisces.xml
  700. if [ -f ${ini_data_dir}/xios/ORCA${nem_res_hor}/coordinates_xios.nc ]
  701. then
  702. cp ${ini_data_dir}/xios/ORCA${nem_res_hor}/coordinates_xios.nc ./
  703. else
  704. info "File 'coordinates_xios.nc' not found. NEMO can not be run with land domain removal!"
  705. fi
  706. # Files needed for TOP/PISCES
  707. if $(has_config pisces)
  708. then
  709. ln -fs ${ini_data_dir}/nemo/pisces/dust_INCA_ORCA_R1.nc
  710. ln -fs ${ini_data_dir}/nemo/pisces/ndeposition_Duce_ORCA_R1.nc
  711. ln -fs ${ini_data_dir}/nemo/pisces/pmarge_etopo_ORCA_R1.nc
  712. ln -fs ${ini_data_dir}/nemo/pisces/river_global_news_ORCA_R1.nc
  713. ln -fs ${ini_data_dir}/nemo/pisces/Solubility_T62_Mahowald_ORCA_R1.nc
  714. ln -fs ${ini_data_dir}/nemo/pisces/par_fraction_gewex_clim90s00s_ORCA_R1.nc
  715. ln -fs ${ini_data_dir}/nemo/pisces/DIC_GLODAP_annual_ORCA_R1.nc
  716. ln -fs ${ini_data_dir}/nemo/pisces/Alkalini_GLODAP_annual_ORCA_R1.nc
  717. ln -fs ${ini_data_dir}/nemo/pisces/O2_WOA2009_monthly_ORCA_R1.nc
  718. ln -fs ${ini_data_dir}/nemo/pisces/PO4_WOA2009_monthly_ORCA_R1.nc
  719. ln -fs ${ini_data_dir}/nemo/pisces/Si_WOA2009_monthly_ORCA_R1.nc
  720. ln -fs ${ini_data_dir}/nemo/pisces/DOC_PISCES_monthly_ORCA_R1.nc
  721. ln -fs ${ini_data_dir}/nemo/pisces/Fer_PISCES_monthly_ORCA_R1.nc
  722. ln -fs ${ini_data_dir}/nemo/pisces/NO3_WOA2009_monthly_ORCA_R1.nc
  723. # create co2 concentration file atcco2.txt if required
  724. if { [ $ifs_cmip_fixyear -gt 0 ] || [[ "${ifs_A4xCO2}" = "TRUE" ]]; } && [[ "${bgc_1PCTCO2}" = "FALSE" ]]
  725. then
  726. rm -f atcco2.txt
  727. elif [[ "${bgc_1PCTCO2}" = "TRUE" ]]
  728. then
  729. cp -f ${ini_data_dir}/nemo/pisces/mole-fraction-of-carbon-dioxide-in-air_1pctCO2_1849-2016.txt atcco2.txt
  730. else
  731. # determine scenario-name and co2-file middle-fix
  732. case $(echo ${ifs_cmip6_scenario} | tr '[:upper:]' '[:lower:]') in
  733. hist*) pis_scen="ssp585"; pis_sco2_mfix="REMIND-MAGPIE-ssp585-1-2-1";;
  734. ssp2-4.5*) pis_scen="ssp245"; pis_sco2_mfix="MESSAGE-GLOBIOM-ssp245-1-2-1";;
  735. ssp5-3.4*) pis_scen="ssp534os"; pis_sco2_mfix="REMIND-MAGPIE-ssp534-over-1-2-1";;
  736. ssp5-8.5*) pis_scen="ssp585"; pis_sco2_mfix="REMIND-MAGPIE-ssp585-1-2-1";;
  737. *) error "Scenario ${ifs_cmip6_scenario} not defined for PISCES" ;;
  738. esac
  739. # concatenate historic and scenario (2015+) co2 concentration file
  740. pis_sco2_pfix="${ini_data_dir}/nemo/pisces/mole-fraction-of-carbon-dioxide-in-air_input4MIPs_GHGConcentrations"
  741. cat ${pis_sco2_pfix}_CMIP_UoM-CMIP-1-2-0_gr1-GMNHSH_1849-2014.txt ${pis_sco2_pfix}_ScenarioMIP_UoM-${pis_sco2_mfix}_gr1-GMNHSH_2015-2500.txt > atcco2.txt
  742. fi
  743. fi
  744. #linking surface boundary conditions for CFCs (even if CFCs are not included)
  745. ln -fs ${ini_data_dir}/nemo/cfc/CFCs_CDIAC_extension_1637_2019.dat CFCs_CDIAC.dat
  746. if $(has_config pisces:start_from_restart)
  747. then
  748. # Same three options as for nemo:start_from_restart
  749. if ls -U ${nem_restart_file_path}/restart_trc.nc > /dev/null 2>&1
  750. then
  751. ln -s ${nem_restart_file_path}/restart_trc.nc ./
  752. elif ls -U ${nem_restart_file_path}/restart_trc_????.nc > /dev/null 2>&1
  753. then
  754. ln -s ${nem_restart_file_path}/restart_trc_????.nc ./
  755. else
  756. for f in ${nem_restart_file_path}/????_????????_restart_trc_????.nc
  757. do
  758. ln -s $f $(echo $f | sed 's/.*_\(restart_trc_....\.nc\)/\1/')
  759. done
  760. fi
  761. fi
  762. fi
  763. # ---------------------------------------------------------------------
  764. # *** Files needed for the Runoff mapper (linked)
  765. # ---------------------------------------------------------------------
  766. has_config rnfmapper && \
  767. ln -s ${ini_data_dir}/runoff-mapper/runoff_maps.nc
  768. # -------------------------------------------------------------------------
  769. # *** File and dir needed for TM5
  770. # -------------------------------------------------------------------------
  771. if $(has_config tm5)
  772. then
  773. tm5_istart=[[[MOD:TM5:ISTART]]]
  774. case ${tm5_istart} in
  775. 33|32) ln -s \
  776. ${tm5_restart_file_path}/TM5_restart_${leg_start_date_yyyymmdd}_0000_glb300x200.nc
  777. ;;
  778. 31) ln -s ${tm5_restart_file_path}/tm5_save.hdf
  779. ;;
  780. 5) ln -s ${tm5_restart_file_path}/tm5_mmix.hdf
  781. ;;
  782. 2|9)
  783. ;;
  784. *) error "Unsupported initial fields option (TM5): ${tm5_istart}"
  785. ;;
  786. esac
  787. # spectral info
  788. ln -s ${ini_data_dir}/tm5/TM5_INPUT/T${ifs_res_hor}_info.txt
  789. # Profiling dir for TM5
  790. mkdir -p ${run_dir}/tm5_profile
  791. fi
  792. # ---------------------------------------------------------------------
  793. # *** Files needed for OASIS (linked)
  794. # ---------------------------------------------------------------------
  795. # Name table file
  796. ln -s ${ini_data_dir}/oasis/cf_name_table.txt
  797. # -- Get grid definition and weight files for IFS/NEMO or IFS/AMIP coupling
  798. has_config nemo && \
  799. oas_grid_dir=${ini_data_dir}/oasis/T${ifs_res_hor}-ORCA${nem_res_hor} && \
  800. mycp='cp'
  801. has_config amip && \
  802. oas_grid_dir=${ini_data_dir}/oasis/AMIP && \
  803. mycp='cdo -f nc copy' # to enforce nc format, needed for 'cdo merge' to work (have nc4c with Primavera files)
  804. # Grid definition files
  805. if $(has_config tm5)
  806. then
  807. ${mycp} ${oas_grid_dir}/areas.nc gcm_areas.nc
  808. ${mycp} ${oas_grid_dir}/grids.nc gcm_grids.nc
  809. ${mycp} ${oas_grid_dir}/masks.nc gcm_masks.nc
  810. else
  811. ln -s ${oas_grid_dir}/areas.nc
  812. ln -s ${oas_grid_dir}/grids.nc
  813. ln -s ${oas_grid_dir}/masks.nc
  814. fi
  815. # Weight files
  816. case ${ifs_res_hor} in
  817. 159) oas_agrd=080
  818. ;;
  819. 255) oas_agrd=128
  820. ;;
  821. 511) oas_agrd=256
  822. ;;
  823. 799) oas_agrd=400
  824. ;;
  825. *) error "Unsupported horizontal resolution (IFS): ${ifs_res_hor}"
  826. ;;
  827. esac
  828. if $(has_config nemo)
  829. then
  830. case ${nem_res_hor} in
  831. 1) oas_ogrd=O1t0
  832. ;;
  833. 025) oas_ogrd=Ot25
  834. ;;
  835. *) error "Unsupported horizontal resolution (NEMO): ${nem_res_hor}"
  836. ;;
  837. esac
  838. fi
  839. if ${oas_link_weights}
  840. then
  841. for f in ${oas_grid_dir}/rmp_????_to_????_GAUSWGT.nc
  842. do
  843. ln -s $f
  844. done
  845. fi
  846. if $(has_config ifs nemo)
  847. then
  848. for f in ${oas_rst_ifs_nemo}
  849. do
  850. cp ${oas_grid_dir}/rst/$f .
  851. done
  852. fi
  853. # -- Get grid definition, weight and restart files for TM5 coupling
  854. if $(has_config tm5)
  855. then
  856. oas_grid_dir=${ini_data_dir}/oasis/T${ifs_res_hor}-TM5-LPJG
  857. cp ${oas_grid_dir}/tm5_areas.nc .
  858. cp ${oas_grid_dir}/tm5_grids.nc .
  859. cp ${oas_grid_dir}/tm5_masks.nc .
  860. if ${oas_link_weights}
  861. then
  862. for f in ${oas_grid_dir}/rmp_????_to_????_*.nc
  863. do
  864. ln -s $f
  865. done
  866. fi
  867. # -- Get restart files for TM5-IFS/LPJG/PISCES
  868. for f in ${oas_rst_ifs_tm5}
  869. do
  870. cp ${oas_grid_dir}/rst/${tm5_exch_nlevs}-levels/$f .
  871. done
  872. # -- Merge grid definition files
  873. cdo merge gcm_areas.nc tm5_areas.nc areas.nc
  874. cdo merge gcm_grids.nc tm5_grids.nc grids.nc
  875. cdo merge gcm_masks.nc tm5_masks.nc masks.nc
  876. fi
  877. else # i.e. $leg_is_restart == true
  878. # ---------------------------------------------------------------------
  879. # *** Remove all leftover output files from previous legs
  880. # ---------------------------------------------------------------------
  881. # IFS files
  882. rm -f ICM{SH,GG}${exp_name}+??????
  883. # NEMO files
  884. rm -f ${exp_name}_??_????????_????????_{grid_U,grid_V,grid_W,grid_T,icemod,SBC,scalar,SBC_scalar,diad_T}.nc
  885. # TM5 restart file type
  886. tm5_istart=33
  887. if [ $tm5_istart -eq 31 ] && $(has_config tm5)
  888. then
  889. ln -sf save_${leg_start_date_yyyymmdd}00_glb300x200.hdf tm5_save.hdf
  890. fi
  891. fi # ! $leg_is_restart
  892. #--------------------------------------------------------------------------
  893. # *** Surface restoring and ocean nudging options
  894. #--------------------------------------------------------------------------
  895. if $(has_config nemo:ocenudg) ; then
  896. ln -fs ${ini_data_dir}/nemo/oce_nudg/temp_sal*.nc ./
  897. fi
  898. if $(has_config nemo:surfresto) ; then
  899. ln -fs ${ini_data_dir}/nemo/surface_restoring/sss_restore_data*.nc ./
  900. ln -fs ${ini_data_dir}/nemo/surface_restoring/sst_restore_data*.nc ./
  901. ln -fs ${ini_data_dir}/nemo/surface_restoring/mask_restore*.nc ./
  902. fi
  903. # -------------------------------------------------------------------------
  904. # *** Remove land grid-points
  905. # -------------------------------------------------------------------------
  906. if $(has_config nemo:elpin)
  907. then
  908. if [ ! -f coordinates_xios.nc ]
  909. then
  910. error "ELpIN requested, but file 'coordinates_xios.nc' was not found"
  911. fi
  912. jpns=($(${ecearth_src_dir}/util/ELPiN/ELPiNv2.cmd ${nem_numproc}))
  913. info "nemo domain decompostion from ELpIN: ${jpns[@]}"
  914. nem_numproc=${jpns[0]}
  915. nem_jpni=${jpns[1]}
  916. nem_jpnj=${jpns[2]}
  917. elif has_config nemo
  918. then
  919. info "nemo original domain decomposition (not using ELPiN)"
  920. fi
  921. # -------------------------------------------------------------------------
  922. # *** Initial conditions saved during the run
  923. # -------------------------------------------------------------------------
  924. ${do_save_ic} && save_ic_prepare_output
  925. # -------------------------------------------------------------------------
  926. # *** Create some control files
  927. # -------------------------------------------------------------------------
  928. # Create TM5 runtime rcfile
  929. tm5_start_date=$(date -u -d "${leg_start_date}" +%F\ %T)
  930. tm5_end_date=$(date -u -d "${leg_end_date}" +%F\ %T)
  931. if $(has_config tm5)
  932. then
  933. cp -f ${ctrl_file_dir}/tm5-config-run.rc ${run_dir}
  934. ${ecearth_src_dir}/tm5mp/setup_tm5 --no-compile \
  935. --time-start="${tm5_start_date}" --time-final="${tm5_end_date}" \
  936. --istart=${tm5_istart} ${run_dir}/tm5-config-run.rc
  937. fi
  938. # IFS frequency output for namelist
  939. if [ -f postins/pptdddddd0300 ]
  940. then
  941. ifs_output_freq=$(( 3 * 3600 / ifs_time_step_sec ))
  942. elif [ -f postins/pptdddddd0600 ]
  943. then
  944. ifs_output_freq=$(( 6 * 3600 / ifs_time_step_sec ))
  945. else
  946. error "IFS output frequency undefined."
  947. fi
  948. # IFS, NEMO, LIM, AMIP namelist and OASIS namcouple files
  949. has_config ifs && . ${ctrl_file_dir}/namelist.ifs.sh > fort.4
  950. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.ref.sh > namelist_ref
  951. has_config ifs nemo && . ${ctrl_file_dir}/namelist.nemo-${nem_grid}-coupled.cfg.sh > namelist_cfg
  952. has_config lim3 && . ${ctrl_file_dir}/namelist.lim3.ref.sh > namelist_ice_ref
  953. has_config lim3 && . ${ctrl_file_dir}/namelist.lim3-${nem_grid}.cfg.sh > namelist_ice_cfg
  954. has_config rnfmapper && . ${ctrl_file_dir}/namelist.runoffmapper.sh > namelist.runoffmapper
  955. has_config amip && . ${ctrl_file_dir}/namelist.amip.sh > namelist.amip
  956. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.top.ref.sh > namelist_top_ref
  957. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.top.cfg.sh > namelist_top_cfg
  958. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.pisces.ref.sh > namelist_pisces_ref
  959. has_config pisces && . ${ctrl_file_dir}/namelist.nemo.pisces.cfg.sh > namelist_pisces_cfg
  960. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.age.ref.sh > namelist_age_ref
  961. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.age.cfg.sh > namelist_age_cfg
  962. #include CFCs namelist even if CFCs are not included
  963. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.cfc.ref.sh > namelist_cfc_ref
  964. has_config nemo && . ${ctrl_file_dir}/namelist.nemo.cfc.cfg.sh > namelist_cfc_cfg
  965. # C-cycle - overwrite coupled nemo namelist
  966. has_config pisces tm5:co2 && \
  967. . ${ctrl_file_dir}/namelist.nemo-${nem_grid}-carboncycle.cfg.sh > namelist_cfg
  968. lucia=[[[MOD:OASIS:LUCIA]]]
  969. . ${ctrl_file_dir}/namcouple.sh > namcouple
  970. # -------------------------------------------------------------------------
  971. # *** LPJ-GUESS initial data
  972. # -------------------------------------------------------------------------
  973. if $(has_config lpjg)
  974. then
  975. # LPJG runtime rcfile - update with leg dates
  976. . ${ctrl_file_dir}/namelist.lpjg.sh > lpjg_steps.rc
  977. # determine lpjg scenario-name and co2-file middle-fix
  978. case $(echo ${ifs_cmip6_scenario} | tr '[:upper:]' '[:lower:]') in
  979. hist*) lpjg_scen="ssp370"; lu_src="AIM" ; lpjg_sco2_mfix="AIM-ssp370-1-2-1" ; lu_file_posfix="2018_10_08.txt";;
  980. ssp1-1.9*) lpjg_scen="ssp119"; lu_src="IMAGE" ; lpjg_sco2_mfix="IMAGE-ssp119-1-2-1" ; lu_file_posfix="2019_03_13.txt";;
  981. ssp1-2.6*) lpjg_scen="ssp126"; lu_src="IMAGE" ; lpjg_sco2_mfix="IMAGE-ssp126-1-2-1" ; lu_file_posfix="2018_10_08.txt";;
  982. ssp2-4.5*) lpjg_scen="ssp245"; lu_src="MESSAGE"; lpjg_sco2_mfix="MESSAGE-GLOBIOM-ssp245-1-2-1"; lu_file_posfix="2018_10_08.txt";;
  983. ssp3-7.0*) lpjg_scen="ssp370"; lu_src="AIM" ; lpjg_sco2_mfix="AIM-ssp370-1-2-1" ; lu_file_posfix="2018_10_08.txt";;
  984. ssp4-3.4*) lpjg_scen="ssp434"; lu_src="GCAM" ; lpjg_sco2_mfix="GCAM4-ssp434-1-2-1" ; lu_file_posfix="2018_10_08.txt";;
  985. ssp5-3.4*) lpjg_scen="ssp534os"; lu_src="MAGPIE"; lpjg_sco2_mfix="REMIND-MAGPIE-ssp534-over-1-2-1" ; lu_file_posfix="2019_05_10.txt";;
  986. ssp5-8.5*) lpjg_scen="ssp585"; lu_src="MAGPIE" ; lpjg_sco2_mfix="REMIND-MAGPIE-ssp585-1-2-1" ; lu_file_posfix="2018_10_08.txt";;
  987. *) error "Scenario ${ifs_cmip6_scenario} not defined for LPJ-GUESS" ;;
  988. esac
  989. lpjg_scenario_new="historical + $lpjg_sco2_mfix"
  990. lpjg_scenario_info=${run_dir}/lpjg_scenario.info
  991. if [ -f $lpjg_scenario_info ]
  992. then
  993. source $lpjg_scenario_info
  994. if [ "$lpjg_scenario_new" = "$lpjg_scenario" ]
  995. then
  996. lpjg_copy_rte=false
  997. else
  998. lpjg_copy_rte=true
  999. fi
  1000. else
  1001. lpjg_copy_rte=true
  1002. fi
  1003. # copy RTE only if necessary (at beginning of a run or when scenario changes)
  1004. if $lpjg_copy_rte
  1005. then
  1006. # write info about installed scenarios to file
  1007. echo "lpjg_scenario=\"historical + $lpjg_sco2_mfix\"" > $lpjg_scenario_info
  1008. # set file prefixes depending on scenario
  1009. lu_file_prefix="1850_2100_luh2_Hist_ScenarioMIP_UofMD"
  1010. lu_file_midfix="2_1_f"
  1011. lu_path="${ini_data_dir}/lpjg/landuse/${lpjg_res}/${lpjg_scen}"
  1012. # copy and reference-link landuse, gross transitions, crops, n-fertilisation
  1013. for inp in lu gross crop nfert
  1014. do
  1015. if [ $inp == "crop" -o $inp == "nfert" ]
  1016. then
  1017. lu_src_file="${lu_path}/${inp}_rfirr_${lu_file_prefix}_${lu_src}_${lpjg_scen}_${lu_file_midfix}_${lpjg_res}_${lu_file_posfix}"
  1018. else
  1019. lu_src_file="${lu_path}/${inp}_${lu_file_prefix}_${lu_src}_${lpjg_scen}_${lu_file_midfix}_${lpjg_res}_${lu_file_posfix}"
  1020. fi
  1021. cp -f $lu_src_file ${run_dir}/landuse/${inp}_luh2.txt
  1022. ln -fs $lu_src_file ${run_dir}/landuse/${inp}_luh2.txt.lnk
  1023. done
  1024. # nitrogen deposition files
  1025. mkdir -p ${run_dir}/ndep
  1026. for inp in drynhx2 drynoy2 wetnhx2 wetnoy2
  1027. do
  1028. ndep_src_file="${ini_data_dir}/lpjg/ndep/${lpjg_res}/${lpjg_scen}/${lpjg_scen}_${lpjg_res}_${inp}.nc"
  1029. cp -f $ndep_src_file ${run_dir}/ndep/${inp}.nc
  1030. ln -fs $ndep_src_file ${run_dir}/ndep/${inp}.nc.lnk
  1031. done
  1032. # concatenate historic and scenario (2015+) co2 concentration file
  1033. # hist co2 file
  1034. lpjg_hco2_file="${ini_data_dir}/ifs/cmip6-data/mole-fraction-of-carbon-dioxide-in-air_input4MIPs_GHGConcentrations_CMIP_UoM-CMIP-1-2-0_gr1-GMNHSH_0000-2014.nc"
  1035. # scenario co2 file
  1036. lpjg_sco2_file="${ini_data_dir}/ifs/cmip6-data/mole-fraction-of-carbon-dioxide-in-air_input4MIPs_GHGConcentrations_ScenarioMIP_UoM-${lpjg_sco2_mfix}_gr1-GMNHSH_2015-2500.nc"
  1037. # combined file
  1038. lpjg_co2_file="${run_dir}/mole_fraction_of_carbon_dioxide_in_air_input4MIPs_lpjg.nc"
  1039. rm -f $lpjg_co2_file
  1040. cdo mergetime $lpjg_hco2_file $lpjg_sco2_file $lpjg_co2_file
  1041. fi
  1042. # Populate or update LPJG run directories
  1043. for (( n=1; n<=${lpjg_numproc}; n++ ))
  1044. do
  1045. # if run from scratch or number of procs has been extended
  1046. if ! $leg_is_restart || [ ! -d ${run_dir}/run${n} ]
  1047. then
  1048. # Make output directories
  1049. mkdir -p ${run_dir}/run${n}/output
  1050. # Copy *.ins, lpjg_steps.rc and OASIS-MCT restart files
  1051. cp ${run_dir}/*.ins ${run_dir}/run${n}
  1052. # Copy output control files
  1053. cp ${output_control_files_dir}/lpjg_cmip6_output.ins ${run_dir}/run${n}
  1054. ln -s ${output_control_files_dir}/lpjg_cmip6_output.ins ${run_dir}/run${n}/lpjg_cmip6_output.ins.lnk
  1055. cp ${ini_data_dir}/lpjg/oasismct/ghg*.txt ${run_dir}/run${n}
  1056. cp ${ini_data_dir}/lpjg/oasismct/${lpjg_res}/ece_gridlist_${lpjg_res}.txt ${run_dir}/run${n}/ece_gridlist.txt
  1057. ln -s ${ini_data_dir}/lpjg/oasismct/${lpjg_res}/ece_gridlist_${lpjg_res}.txt ${run_dir}/run${n}/ece_gridlist.txt.lnk
  1058. # Data only needed by master
  1059. if [ $n == 1 ]
  1060. then
  1061. cp ${ini_data_dir}/lpjg/oasismct/${lpjg_res}/*.nc ${run_dir}
  1062. cp ${ini_data_dir}/lpjg/oasismct/lpjgv.txt ${run_dir}/run${n}
  1063. fi
  1064. fi
  1065. # Refresh output-dirs after they hav been removed at end of the last leg
  1066. mkdir -p ${run_dir}/run${n}/output/CMIP6
  1067. mkdir -p ${run_dir}/run${n}/output/CRESCENDO
  1068. done
  1069. if $leg_is_restart
  1070. then
  1071. lpjg_restart_dir="restart/lpjg/$(printf %03d $((leg_number-1)))"
  1072. lpjg_rst_state="${lpjg_restart_dir}/lpjg_state_${leg_start_date_yyyy}"
  1073. if [ -d "$lpjg_rst_state" ]
  1074. then
  1075. ln -sf $lpjg_rst_state
  1076. else
  1077. echo "lpjg restart dir $lpjg_rst_state not available"
  1078. exit -1
  1079. fi
  1080. # get oasis restart files
  1081. oasis_restart_dir="restart/oasis/$(printf %03d $((leg_number)))"
  1082. cp -f ${oasis_restart_dir}/*.nc ${run_dir}/
  1083. fi
  1084. fi
  1085. # -------------------------------------------------------------------------
  1086. # *** Create ICMCL file with vegetation fields
  1087. # not needed if LPJG is used with feedback
  1088. # -------------------------------------------------------------------------
  1089. tempfile=tmp.$$
  1090. case ${ifs_veg_source} in
  1091. "ifs" )
  1092. # Vegetation from IFS (climatology)
  1093. icmclfile=${ini_data_dir}/ifs/${ifs_grid}/climate/ICMCL_ONLY_VEG_PD
  1094. # Create data for december, the year before the leg starts
  1095. ${grib_set} \
  1096. -s dataDate=$(printf "%04d" $((leg_start_date_yyyy-1)))1215 \
  1097. ${icmclfile}-12 ICMCL${exp_name}INIT
  1098. # Create data for all month in the years of the leg
  1099. for (( y=${leg_start_date_yyyy} ; y<=${leg_end_date_yyyy} ; y++ ))
  1100. do
  1101. yy=$(printf "%04d" $y)
  1102. for m in {1..12}
  1103. do
  1104. mm=$(printf "%02d" $m)
  1105. ${grib_set} -s dataDate=${yy}${mm}15 ${icmclfile}-${mm} ${tempfile}
  1106. cat ${tempfile} >> ICMCL${exp_name}INIT
  1107. done
  1108. done
  1109. # Create data for january, the year after the leg ends
  1110. ${grib_set} \
  1111. -s dataDate=$(printf "%04d" $((leg_end_date_yyyy+1)))0115 \
  1112. ${icmclfile}-01 ${tempfile}
  1113. cat ${tempfile} >> ICMCL${exp_name}INIT
  1114. ;;
  1115. "era20c"|"cmip6"|"custom_"* )
  1116. # Vegetation from a LPJG run (off-line or EC-Earth3-Veg)
  1117. rm -f ICMCL${exp_name}INIT
  1118. # Create data for all years of the leg, including one year
  1119. # before and one year after
  1120. for (( yr=leg_start_date_yyyy-1 ; yr<=leg_end_date_yyyy+1 ; yr+=1 ))
  1121. do
  1122. case ${ifs_veg_source} in
  1123. 'era20c' )
  1124. # no scenario needed with era20c
  1125. icmcl_scenario="" ;;
  1126. 'custom_'* )
  1127. # no scenario implemented yet with custom_dir
  1128. icmcl_scenario="" ;;
  1129. 'cmip6' )
  1130. # select scenario, use SSP3-7.0 as default
  1131. # if not otherwise specified
  1132. icmcl_scenario="historical"
  1133. if ( [ $ifs_cmip_fixyear -le 0 ] && [ $yr -ge 2015 ] ) || \
  1134. [ $ifs_cmip_fixyear -ge 2015 ]
  1135. then
  1136. [[ ${ifs_cmip6_scenario} =~ ^SSP ]] \
  1137. && icmcl_scenario=${ifs_cmip6_scenario} \
  1138. || if [ ${ifs_covid19^^} == TRUE ]
  1139. then
  1140. icmcl_scenario='SSP2-4.5'
  1141. else
  1142. icmcl_scenario='SSP3-7.0'
  1143. fi
  1144. fi ;;
  1145. esac
  1146. if [ $ifs_cmip_fixyear -le 0 ] || [[ ${ifs_veg_source} == custom_* ]]
  1147. then
  1148. cat ${ini_data_dir}/ifs/${ifs_grid}/icmcl_${veg_version}/${icmcl_scenario}/icmcl_$yr.grb >> ICMCL${exp_name}INIT
  1149. else
  1150. # Fixed year forcing, requires cdo! (only when not using ifs_veg_source=custom_exp*)
  1151. # If cdo is not available at runtime you need to fix proper
  1152. # icmcl files beforehand and use them here
  1153. cdo setyear,$yr ${ini_data_dir}/ifs/${ifs_grid}/icmcl_${veg_version}/${icmcl_scenario}/icmcl_${ifs_cmip_fixyear}.grb ${tempfile}
  1154. cat ${tempfile} >> ICMCL${exp_name}INIT
  1155. fi
  1156. done
  1157. ;;
  1158. "none" )
  1159. info "no ICMCL file is created"
  1160. ;;
  1161. * )
  1162. error "Vegetation from ${ifs_veg_source} not implemented"
  1163. ;;
  1164. esac
  1165. # Clean up
  1166. rm -f ${tempfile}
  1167. # -------------------------------------------------------------------------
  1168. # *** Link the appropriate NEMO restart files of the previous leg
  1169. # -------------------------------------------------------------------------
  1170. if $leg_is_restart && $(has_config nemo)
  1171. then
  1172. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  1173. for (( n=0 ; n<nem_numproc ; n++ ))
  1174. do
  1175. np=$(printf %04d ${n})
  1176. ln -fs ${exp_name}_${ns}_restart_oce_${np}.nc restart_oce_${np}.nc
  1177. ln -fs ${exp_name}_${ns}_restart_ice_${np}.nc restart_ice_${np}.nc
  1178. has_config pisces && \
  1179. ln -fs ${exp_name}_${ns}_restart_trc_${np}.nc restart_trc_${np}.nc
  1180. done
  1181. # Make sure there are no global restart files
  1182. # If links are found, they will be removed. We are cautious and do
  1183. # _not_ remove real files! However, if real global restart files are
  1184. # present, NEMO/LIM will stop because time stamps will not match.
  1185. [ -h restart_oce.nc ] && rm restart_oce.nc
  1186. [ -h restart_ice.nc ] && rm restart_ice.nc
  1187. [ -h restart_trc.nc ] && rm restart_trc.nc
  1188. fi
  1189. # -------------------------------------------------------------------------
  1190. # *** Remove some OASIS files of the previous leg
  1191. # -------------------------------------------------------------------------
  1192. if $leg_is_restart
  1193. then
  1194. rm -f anaisout_*
  1195. fi
  1196. # -------------------------------------------------------------------------
  1197. # *** Remove any ccycle debug output files
  1198. # -------------------------------------------------------------------------
  1199. if ${ccycle_debug_fluxes} && $leg_is_restart && $(has_config tm5:co2)
  1200. then
  1201. if $(has_config lpjg)
  1202. then
  1203. rm -f GUE_{CNAT,CANT,CNPP}_*.nc run1/GUE_{CNAT,CANT,CNPP}_*.nc
  1204. rm -f TM5_Land{CNAT,CANT,CNPP}_*.nc
  1205. fi
  1206. if $(has_config pisces)
  1207. then
  1208. rm -f O_CO2FLX_*.nc
  1209. rm -f TM5_OceCFLX_*.nc
  1210. fi
  1211. fi
  1212. # -------------------------------------------------------------------------
  1213. # *** Check consistency of OASIS restarts and IFS rcf with ece_info_file
  1214. # -------------------------------------------------------------------------
  1215. if $leg_is_restart
  1216. then
  1217. info "Check OASIS restarts and IFS rcf before launch"
  1218. leg_nb_3d=$(printf %03d $((leg_number)))
  1219. for oasis_restart_file in restart/oasis/${leg_nb_3d}/*
  1220. do
  1221. [ ! -f "${oasis_restart_file}" ] && break
  1222. if ! diff -q $(basename ${oasis_restart_file}) ${oasis_restart_file} >/dev/null
  1223. then
  1224. echo "*WARNING* Overwriting OASIS restart (${oasis_restart_file})"
  1225. cp -f ${oasis_restart_file} .
  1226. fi
  1227. done
  1228. rcf_restart_file=restart/ifs/${leg_nb_3d}/rcf
  1229. if [ -f "${rcf_restart_file}" ]
  1230. then
  1231. if ! diff -q rcf ${rcf_restart_file} >/dev/null
  1232. then
  1233. echo "*WARNING* Overwriting IFS rcf file (${rcf_restart_file})"
  1234. cp -f ${rcf_restart_file} .
  1235. fi
  1236. fi
  1237. fi
  1238. # -------------------------------------------------------------------------
  1239. # *** Start the run
  1240. # -------------------------------------------------------------------------
  1241. export DR_HOOK_IGNORE_SIGNALS='-1'
  1242. export CPLNG='active'
  1243. # Use the launch function from the platform configuration file
  1244. has_config nemo && \
  1245. cmd="${xio_numproc} ${xio_exe_file} -- \
  1246. ${nem_numproc} ${nem_exe_file} -- \
  1247. ${ifs_numproc} ${ifs_exe_file} -v ecmwf -e ${exp_name}" || \
  1248. cmd="${ifs_numproc} ${ifs_exe_file} -v ecmwf -e ${exp_name}"
  1249. has_config lpjg && cmd=${cmd}" -- ${lpjg_numproc} ${lpjg_exe_file} guess.ins -parallel"
  1250. has_config tm5 && cmd=${cmd}" -- ${tm5_numproc} ${tm5_exe_file} tm5-run.rc"
  1251. has_config amip && cmd=${cmd}" -- ${amip_numproc} ${amip_exe_file}"
  1252. has_config nemo && cmd=${cmd}" -- ${rnf_numproc} ${rnf_exe_file}"
  1253. t1=$(date +%s)
  1254. launch $cmd
  1255. t2=$(date +%s)
  1256. tr=$(date -d "0 -$t1 sec + $t2 sec" +%T)
  1257. # -------------------------------------------------------------------------
  1258. # *** Check for signs of success
  1259. # Note the tests provide no guarantee that things went fine! They are
  1260. # just based on the IFS, NEMO and TM5 log files. More tests (e.g. checking
  1261. # restart files) could be implemented.
  1262. # -------------------------------------------------------------------------
  1263. # Checking for IFS success
  1264. if [ -f ifs.stat ]
  1265. then
  1266. if [ "$(awk 'END{print $3}' ifs.stat)" == "CNT0" ]
  1267. then
  1268. info "Leg successfully completed according to IFS log file 'ifs.stat'."
  1269. else
  1270. error "Leg not completed according to IFS log file 'ifs.stat'."
  1271. fi
  1272. else
  1273. error "IFS log file 'ifs.stat' not found after run."
  1274. fi
  1275. # Check for NEMO success
  1276. if $(has_config nemo)
  1277. then
  1278. if [ -f ocean.output ]
  1279. then
  1280. if [ "$(sed -n '/New day/h; ${g;s:.*\([0-9/]\{10\}\).*:\1:;p;}' ocean.output)" == "$(date -u -d "${leg_end_date} - 1 day" +%Y/%m/%d)" ]
  1281. then
  1282. info "Leg successfully completed according to NEMO log file 'ocean.output'."
  1283. else
  1284. error "Leg not completed according to NEMO log file 'ocean.output'."
  1285. fi
  1286. else
  1287. error "NEMO log file 'ocean.output' not found after run."
  1288. fi
  1289. fi
  1290. # Check for TM5 success
  1291. if $(has_config tm5)
  1292. then
  1293. if [ -f tm5.ok ]
  1294. then
  1295. info "Leg successfully completed according to existing TM5 file 'tm5.ok'."
  1296. else
  1297. error "Leg not completed according to non-existing TM5 file 'tm5.ok'."
  1298. fi
  1299. fi
  1300. # -------------------------------------------------------------------------
  1301. # *** Post-process initial conditions saved during the run if requested
  1302. # -------------------------------------------------------------------------
  1303. ${do_save_ic} && save_ic_postproc
  1304. # -------------------------------------------------------------------------
  1305. # *** Move IFS output files to archive directory
  1306. # -------------------------------------------------------------------------
  1307. outdir="output/ifs/$(printf %03d $((leg_number)))"
  1308. mkdir -p ${outdir}
  1309. prv_leg=$(printf %03d $((leg_number-1)))
  1310. # This takes care of a special IFS feature: The output for the last time
  1311. # step of each leg is written at the first time step of the new leg. The
  1312. # following code makes sure that the output is appended to the appropriate
  1313. # file. Since GRIB files are just streams, its done with a simple cat
  1314. # command.
  1315. for f in ICMSH${exp_name}+?????? ICMGG${exp_name}+??????
  1316. do
  1317. if [ -f output/ifs/${prv_leg}/${f} ]
  1318. then
  1319. cat ${f} >> output/ifs/${prv_leg}/${f}
  1320. rm -f ${f}
  1321. else
  1322. mv ${f} ${outdir}
  1323. fi
  1324. done
  1325. # -------------------------------------------------------------------------
  1326. # *** Move NEMO output files to archive directory
  1327. # -------------------------------------------------------------------------
  1328. if $(has_config nemo)
  1329. then
  1330. outdir="output/nemo/$(printf %03d $((leg_number)))"
  1331. mkdir -p ${outdir}
  1332. for v in grid_U grid_V grid_W grid_T icemod SBC scalar SBC_scalar diad_T ptrc_T bioscalar \
  1333. grid_T_2D grid_U_2D grid_V_2D grid_W_2D grid_T_3D grid_U_3D grid_V_3D grid_W_3D \
  1334. grid_T_SFC grid_1point grid_T_3D_ncatice vert_sum \
  1335. grid_ptr_W_3basin_3D grid_ptr_T_3basin_2D grid_ptr_T_2D \
  1336. zoom_700_sum zoom_300_sum zoom_2000_sum
  1337. do
  1338. for f in ${exp_name}_*_????????_????????_*${v}.nc
  1339. do
  1340. test -f $f && mv $f $outdir/
  1341. done
  1342. done
  1343. fi
  1344. # -------------------------------------------------------------------------
  1345. # *** Move LPJ-GUESS output files to archive directory
  1346. # -------------------------------------------------------------------------
  1347. if $(has_config lpjg)
  1348. then
  1349. outdir="output/lpjg/$(printf %03d $((leg_number)))"
  1350. if [ -d ${outdir} ]
  1351. then
  1352. rm -rf ${outdir}
  1353. fi
  1354. mkdir -p ${outdir}
  1355. # LPJG run directories
  1356. # concatenate *.out (or compressed *.out.gz) files from each run* into output dir
  1357. flist=$(cd ${run_dir}/run1/output && find *.out.gz -type f 2>/dev/null || true)
  1358. if [ "$flist" = "" ]
  1359. then
  1360. lpjg_compress_output=false
  1361. flist=$(cd ${run_dir}/run1/output && find *.out -type f 2>/dev/null)
  1362. else
  1363. lpjg_compress_output=true
  1364. fi
  1365. mkdir ${outdir}/CMIP6
  1366. for (( n=1; n<=${lpjg_numproc}; n++ ))
  1367. do
  1368. for ofile in $flist
  1369. do
  1370. if $lpjg_compress_output
  1371. then
  1372. [ $n == 1 ] && gzip -c ${run_dir}/run${n}/output/`basename ${ofile} .gz`.hdr > ${outdir}/$ofile
  1373. cat ${run_dir}/run${n}/output/${ofile} >> ${outdir}/$ofile
  1374. else
  1375. if (( n == 1 ))
  1376. then
  1377. cat ${run_dir}/run${n}/output/${ofile} > ${outdir}/$ofile
  1378. else
  1379. awk '(FNR!=1){print $0}' ${run_dir}/run${n}/output/${ofile} >> ${outdir}/$ofile
  1380. fi
  1381. fi
  1382. done
  1383. rm -rf ${run_dir}/run${n}/output
  1384. done
  1385. # move monthly file if available
  1386. if [ -f ${run_dir}/LPJ-GUESS_monthlyoutput.txt ]
  1387. then
  1388. mv ${run_dir}/LPJ-GUESS_monthlyoutput.txt ${outdir}
  1389. fi
  1390. fi
  1391. # -------------------------------------------------------------------------
  1392. # *** Move TM5 output files to archive directory
  1393. # -------------------------------------------------------------------------
  1394. if $(has_config tm5)
  1395. then
  1396. outdir="output/tm5/$(printf %03d $((leg_number)))"
  1397. mkdir -p ${outdir}
  1398. set +e
  1399. mv budget_??????????_??????????_global.hdf ${outdir}
  1400. mv j_statistics_??????????_??????????.hdf ${outdir}
  1401. mv mmix_??????????_??????????_glb???x???.hdf ${outdir}
  1402. mv aerocom?_TM5_*_????????_daily.nc ${outdir}
  1403. mv aerocom?_TM5_*_??????_monthly.nc ${outdir}
  1404. mv AOD_????_??_??.nc ${outdir}
  1405. mv -f TM5MP_${exp_name}_griddef.nc ${outdir}
  1406. mv TM5MP_${exp_name}_TP_????_??_??.nc ${outdir}
  1407. mv TM5MP_${exp_name}_vmr3_????_??_??.nc ${outdir}
  1408. mv general_TM5_${exp_name}_??????????_hourly.nc ${outdir}
  1409. mv general_TM5_${exp_name}_??????_monthly.nc ${outdir}
  1410. mv *EC-Earth3-*_${exp_name}_*.nc ${outdir}
  1411. set -e
  1412. # move profiling files if any
  1413. if [ "$(ls -A ${run_dir}/tm5_profile)" ]
  1414. then
  1415. outdir="output/tm5/profile_$(printf %03d $((leg_number)))"
  1416. mkdir -p ${outdir}
  1417. for f in ${run_dir}/tm5_profile/*
  1418. do
  1419. test -f ${f} && mv $f ${outdir}
  1420. done
  1421. fi
  1422. fi
  1423. # -------------------------------------------------------------------------
  1424. # *** Move IFS restart files to archive directory
  1425. # -------------------------------------------------------------------------
  1426. if $leg_is_restart
  1427. then
  1428. outdir="restart/ifs/$(printf %03d $((leg_number)))"
  1429. mkdir -p ${outdir}
  1430. # Figure out the time part of the restart files (cf. CTIME on rcf files)
  1431. # NOTE: Assuming that restarts are at full days (time=0000) only!
  1432. nd="$(printf %06d $((leg_start_sec/(24*3600))))0000"
  1433. mv srf${nd}.???? ${outdir}
  1434. fi
  1435. # -------------------------------------------------------------------------
  1436. # *** Move ccycle debug output files to archive directory
  1437. # -------------------------------------------------------------------------
  1438. if ${ccycle_debug_fluxes} && $(has_config tm5:co2)
  1439. then
  1440. outdir="output/tm5/$(printf %03d $((leg_number)))"
  1441. mkdir -p ${outdir}
  1442. if $(has_config lpjg)
  1443. then
  1444. for f in CNAT CANT CNPP ; do
  1445. mv TM5_Land${f}_*.nc ${outdir}
  1446. rm -f GUE_${f}_*.nc run1/GUE_${f}_*.nc
  1447. #gf=`ls -1 GUE_${f}_*.nc | head -n 1`
  1448. #cdo mergetime ${gf} run1/${gf} ${outdir}/${gf}
  1449. done
  1450. fi
  1451. if $(has_config pisces)
  1452. then
  1453. mv TM5_OceCFLX_*.nc ${outdir}
  1454. rm -f O_CO2FLX_*.nc
  1455. #mv O_CO2FLX_*.nc ${outdir}
  1456. fi
  1457. fi
  1458. # -------------------------------------------------------------------------
  1459. # *** Move LPJ-GUESS restart files to archive directory
  1460. # -------------------------------------------------------------------------
  1461. if $(has_config lpjg)
  1462. then
  1463. outdir="restart/lpjg/$(printf %03d $((leg_number)))"
  1464. if [ -d ${outdir} ]
  1465. then
  1466. rm -rf ${outdir}
  1467. fi
  1468. mkdir -p ${outdir}
  1469. state_dir="./lpjg_state_$(printf %04d $((leg_end_date_yyyy)))"
  1470. mv ${state_dir} ${outdir}
  1471. # LPJG writes into run1 dir, so mv to main rundir
  1472. mv -f run1/lpjgv.nc .
  1473. has_config tm5:co2 lpjg && mv -f run1/rlpjg.nc .
  1474. # remove restart link
  1475. if $leg_is_restart
  1476. then
  1477. old_state_dir="./lpjg_state_$(printf %04d $((leg_start_date_yyyy)))"
  1478. if [ -L $old_state_dir ]
  1479. then
  1480. rm -f "$old_state_dir"
  1481. fi
  1482. fi
  1483. fi
  1484. # -------------------------------------------------------------------------
  1485. # *** Move NEMO restart files to archive directory
  1486. # -------------------------------------------------------------------------
  1487. if $leg_is_restart && $(has_config nemo)
  1488. then
  1489. outdir="restart/nemo/$(printf %03d $((leg_number)))"
  1490. mkdir -p ${outdir}
  1491. ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
  1492. for f in oce ice
  1493. do
  1494. mv ${exp_name}_${ns}_restart_${f}_????.nc ${outdir}
  1495. done
  1496. if has_config pisces
  1497. then
  1498. mv ${exp_name}_${ns}_restart_trc_????.nc ${outdir}
  1499. fi
  1500. fi
  1501. # -------------------------------------------------------------------------
  1502. # *** Move TM5 restart file to archive directory
  1503. # -------------------------------------------------------------------------
  1504. if $leg_is_restart && $(has_config tm5)
  1505. then
  1506. outdir="restart/tm5/$(printf %03d $((leg_number)))"
  1507. mkdir -p ${outdir}
  1508. case ${tm5_istart} in
  1509. 33|32) f=TM5_restart_${leg_start_date_yyyymmdd}_0000_glb300x200.nc
  1510. ;;
  1511. 31) f=save_${leg_start_date_yyyymmdd}00_glb300x200.hdf
  1512. ;;
  1513. esac
  1514. mv $f ${outdir}
  1515. fi
  1516. # -------------------------------------------------------------------------
  1517. # *** Copy OASIS restart files to archive directory
  1518. # NOTE: These files are copied and not moved as they are used in the
  1519. # next leg!
  1520. # Note also that the OASIS restart files present at the end of
  1521. # the leg correspond to the start of the next leg!
  1522. # -------------------------------------------------------------------------
  1523. outdir="restart/oasis/$(printf %03d $((leg_number+1)))"
  1524. mkdir -p ${outdir}
  1525. for f in ${oas_rst_files}
  1526. do
  1527. test -f ${f} && cp ${f} ${outdir}
  1528. done
  1529. # -------------------------------------------------------------------------
  1530. # *** Copy rcf files to the archive directory (of the next leg!)
  1531. # -------------------------------------------------------------------------
  1532. outdir="restart/ifs/$(printf %03d $((leg_number+1)))"
  1533. mkdir -p ${outdir}
  1534. for f in rcf
  1535. do
  1536. test -f ${f} && cp ${f} ${outdir}
  1537. done
  1538. # -------------------------------------------------------------------------
  1539. # *** Move log files to archive directory
  1540. # -------------------------------------------------------------------------
  1541. outdir="log/$(printf %03d $((leg_number)))"
  1542. mkdir -p ${outdir}
  1543. for f in \
  1544. ifs.log ifs.stat fort.4 ocean.output \
  1545. time.step solver.stat guess.log run1/guess0.log \
  1546. amip.log namelist.amip \
  1547. nout.000000 debug.root.?? \
  1548. ctm.tm5.log.0
  1549. do
  1550. test -f ${f} && mv ${f} ${outdir}
  1551. done
  1552. has_config pisces && cp ocean.carbon ${outdir}
  1553. for f in ctm.tm5.log.*
  1554. do
  1555. if [[ -f ${f} ]]
  1556. then
  1557. [[ -s ${f} ]] && mv ${f} ${outdir} || \rm -f ${f}
  1558. fi
  1559. done
  1560. # -------------------------------------------------------------------------
  1561. # *** Write the restart control file
  1562. # -------------------------------------------------------------------------
  1563. # Compute CPMIP performance
  1564. sypd="$(cpmip_sypd $leg_length_sec $(($t2 - $t1)))"
  1565. ncores=0
  1566. has_config nemo && (( ncores+=${nem_numproc} )) || :
  1567. has_config ifs && (( ncores+=${ifs_numproc} )) || :
  1568. has_config xios && (( ncores+=${xio_numproc} )) || :
  1569. has_config rnfmapper && (( ncores+=${rnf_numproc} )) || :
  1570. has_config lpjg && (( ncores+=${lpjg_numproc} )) || :
  1571. has_config tm5 && (( ncores+=${tm5_numproc} )) || :
  1572. has_config amip && (( ncores+=${amip_numproc} )) || :
  1573. chpsy="$(cpmip_chpsy $leg_length_sec $(($t2 - $t1)) $ncores)"
  1574. echo "#" | tee -a ${ece_info_file}
  1575. echo "# Finished leg at `date '+%F %T'` after ${tr} (hh:mm:ss)" \
  1576. | tee -a ${ece_info_file}
  1577. echo "# CPMIP performance: $sypd SYPD $chpsy CHPSY"| tee -a ${ece_info_file}
  1578. echo "leg_number=${leg_number}" | tee -a ${ece_info_file}
  1579. echo "leg_start_date=\"${leg_start_date}\"" | tee -a ${ece_info_file}
  1580. echo "leg_end_date=\"${leg_end_date}\"" | tee -a ${ece_info_file}
  1581. # Need to reset force_run_from_scratch in order to avoid destroying the next leg
  1582. force_run_from_scratch=false
  1583. done # loop over legs
  1584. # -----------------------------------------------------------------------------
  1585. # *** Platform dependent finalising of the run
  1586. # -----------------------------------------------------------------------------
  1587. finalise
  1588. exit 0