prepare_ecearth_hindcasts_paraso.sh 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/bash
  2. set -u
  3. # This script takes EC-Earth outputs, reinterpolates them to the NEMO grid, and then generates BDY dta from it.
  4. # Author: C. Pelletier
  5. # Inclusive year range
  6. year_start=1985
  7. year_stop=2013
  8. # Input prefix (with folder) for input data files (in .tar format).
  9. in_prefix="/storepelican/dverfail/bsc/anom/hindcasts"
  10. # Name of experience
  11. name_exp="a3du"
  12. fc_num="fc00"
  13. # Frequency
  14. freq="1m"
  15. # Working folder where pre-interpolated datafiles will be put
  16. dest_folder="/storepelican/dverfail/nemo_bdy/bdydta"
  17. dest_prefix="ECEarth_${name_exp}_${fc_num}_${freq}_eORCA025-SO_BDYDTA_nbr1_"
  18. pwd=`pwd`
  19. # Python script for reformatting BDYDTA (final step)
  20. reformat_script="${pwd}/generate_new_bdy_dta_onefile.py"
  21. # min_lon, max_lon, min_lat, max_lat
  22. # To precut the input data prior to interpolation (not required, but less expensive if your source code is much bigger than the destination one, which is the case from global to the Southern Ocean.
  23. # Take a generous margin (4-5 nodes bigger than the destination grid limit)
  24. latlon_cut="-180,180,-90,-28"
  25. # # Script for converting EOS80 to TEOS-10 (look at the script comments for why it exists and what it does).
  26. # not needed for EC-Earth, which is already in TEOS-10
  27. # curr_dir=`pwd`
  28. # eos10_script="${curr_dir}/convert_eos10_new.py"
  29. # NEMO destination CDO grid description (see `cdo_get_griddes.sh`).
  30. dest_gridfile_t="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_T.grid"
  31. dest_gridfile_u="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_U.grid"
  32. dest_gridfile_v="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_V.grid"
  33. pid="$$"
  34. mkdir -p ${dest_folder}
  35. cd ${dest_folder}
  36. for((year=year_start;year<=year_stop;year++)); do
  37. # Loop over input years.
  38. module purge
  39. module load 2018b CDO NCO
  40. # 1) Extract T, S and ssh (T grid).
  41. tar -xvf ${in_prefix}/${fc_num}/MMO_${name_exp}_19841101_${fc_num}_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc
  42. cdo selname,thetao,so ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc tmp_pid${pid}.nc
  43. cdo selname,zos ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc tmp2_pid${pid}.nc
  44. cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  45. rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc
  46. # precut
  47. cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
  48. ncrename -v olevel,deptht tmp_pid${pid}.nc
  49. ncrename -d olevel,deptht tmp_pid${pid}.nc
  50. # remap
  51. cdo remapbil,${dest_gridfile_t} tmp_pid${pid}.nc tmp2_pid${pid}.nc
  52. cdo setmisstonn tmp2_pid${pid}.nc tmp_pid${pid}.nc
  53. module purge
  54. module load ELIC/0.1-foss-2018b-Python-3.6.6
  55. input_full=`readlink -f tmp_pid${pid}.nc`
  56. output_full="${dest_folder}/${dest_prefix}grid_T_y${year}.nc"
  57. python ${reformat_script} ${input_full} t ${output_full}
  58. module purge
  59. module load CDO NCO
  60. # 2) Extract u velocities.
  61. if [ "${freq}" == "1d" ]; then
  62. tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_2D.nc
  63. cdo selname,ubar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_2D.nc tmp2_pid${pid}.nc
  64. else
  65. # ubar is not stored in monthly outputs, so take it from daily and monmean
  66. tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_1d_${year}0101_${year}1231_opa_grid_U_2D.nc
  67. cdo selname,ubar ${name_exp}_1d_${year}0101_${year}1231_opa_grid_U_2D.nc tmp3_pid${pid}.nc
  68. cdo monmean tmp3_pid${pid}.nc tmp2_pid${pid}.nc
  69. fi
  70. cdo selname,uo ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc tmp_pid${pid}.nc
  71. cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  72. rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_??_${year}0101_${year}1231_opa_grid_U_2D.nc
  73. # precut
  74. cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
  75. ncap2 -O -s 'uobaroclinic = uo - ubar;' tmp_pid${pid}.nc tmp2_pid${pid}.nc
  76. ncks -x -v uo tmp2_pid${pid}.nc -O tmp_pid${pid}.nc
  77. ncrename -v ubar,uobarotropic tmp_pid${pid}.nc
  78. ncrename -v olevel,depthu -v olevel_bnds,depthu_bnds tmp_pid${pid}.nc
  79. ncatted -a bounds,depthu,o,c,"depthu_bnds" -a name,depthu,o,c,"depthu" tmp_pid${pid}.nc
  80. ncrename -d olevel,depthu tmp_pid${pid}.nc
  81. ncpdq -O -a time_counter,depthu,y,x tmp_pid${pid}.nc tmp2_pid${pid}.nc
  82. # remap
  83. cdo remapbil,${dest_gridfile_u} tmp2_pid${pid}.nc tmp_pid${pid}.nc
  84. cdo setmisstonn tmp_pid${pid}.nc tmp2_pid${pid}.nc
  85. module purge
  86. module load ELIC/0.1-foss-2018b-Python-3.6.6
  87. input_full=`readlink -f tmp2_pid${pid}.nc`
  88. output_full="${dest_folder}/${dest_prefix}grid_U_y${year}.nc"
  89. python ${reformat_script} ${input_full} u ${output_full}
  90. module purge
  91. module load CDO NCO
  92. # 3) Extract v velocities.
  93. if [ "${freq}" == "1d" ]; then
  94. tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_2D.nc
  95. cdo selname,vbar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_2D.nc tmp2_pid${pid}.nc
  96. else
  97. # vbar is not stored in monthly outputs, so take it from daily and monmean
  98. tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_1d_${year}0101_${year}1231_opa_grid_V_2D.nc
  99. cdo selname,vbar ${name_exp}_1d_${year}0101_${year}1231_opa_grid_V_2D.nc tmp3_pid${pid}.nc
  100. cdo monmean tmp3_pid${pid}.nc tmp2_pid${pid}.nc
  101. fi
  102. cdo selname,vo ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc tmp_pid${pid}.nc
  103. cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  104. rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_??_${year}0101_${year}1231_opa_grid_V_2D.nc
  105. # precut
  106. cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
  107. ncap2 -O -s 'vobaroclinic = vo - vbar;' tmp_pid${pid}.nc tmp2_pid${pid}.nc
  108. ncks -x -v vo tmp2_pid${pid}.nc -O tmp_pid${pid}.nc
  109. ncrename -v vbar,vobarotropic tmp_pid${pid}.nc
  110. ncrename -v olevel,depthv -v olevel_bnds,depthv_bnds tmp_pid${pid}.nc
  111. ncatted -a bounds,depthv,o,c,"depthv_bnds" -a name,depthv,o,c,"depthv" tmp_pid${pid}.nc
  112. ncrename -d olevel,depthv tmp_pid${pid}.nc
  113. ncpdq -O -a time_counter,depthv,y,x tmp_pid${pid}.nc tmp2_pid${pid}.nc
  114. # remap
  115. cdo remapbil,${dest_gridfile_v} tmp2_pid${pid}.nc tmp_pid${pid}.nc
  116. cdo setmisstonn tmp_pid${pid}.nc tmp2_pid${pid}.nc
  117. module purge
  118. module load ELIC/0.1-foss-2018b-Python-3.6.6
  119. input_full=`readlink -f tmp2_pid${pid}.nc`
  120. output_full="${dest_folder}/${dest_prefix}grid_V_y${year}.nc"
  121. python ${reformat_script} ${input_full} v ${output_full}
  122. module purge
  123. module load CDO NCO
  124. done
  125. rm -rf ./*pid${pid}*