prepare_ecearth_hindcasts_paraso.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #!/bin/bash
  2. set -u
  3. # This script takes EC-Earth hindcast outputs, reinterpolates them to the NEMO grid, and then generates BDY dta from it.
  4. # Author: C. Pelletier & D. Verfaillie
  5. # Inclusive year range
  6. year_start=1985
  7. year_stop=2014
  8. # Input prefix (with folder) for input data files.
  9. in_prefix="/storepelican/dverfail/bsc/anom_bias/hindcasts"
  10. # Name of experience
  11. name_exp="a3du"
  12. # Frequency
  13. freq="1m"
  14. for fc_num in fc00 fc01 fc02; do
  15. # Working folder where pre-interpolated datafiles will be put
  16. dest_folder="/storepelican/dverfail/bsc/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 --force purge
  39. module load releases/2020b
  40. module load noarch
  41. module load NCO
  42. module load CDO
  43. # 1) Extract T, S and ssh (T grid).
  44. cdo selname,thetao,so ${in_prefix}/${fc_num}/${name_exp}_${freq}_opa_grid_T_3D_${year}.nc tmp_pid${pid}.nc
  45. cdo selname,zos ${in_prefix}/${fc_num}/${name_exp}_${freq}_opa_grid_T_2D_${year}.nc tmp2_pid${pid}.nc
  46. cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  47. # precut
  48. cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
  49. ncrename -v olevel,deptht tmp_pid${pid}.nc
  50. ncrename -d olevel,deptht tmp_pid${pid}.nc
  51. # remap
  52. cdo remapbil,${dest_gridfile_t} tmp_pid${pid}.nc tmp2_pid${pid}.nc
  53. cdo setmisstonn tmp2_pid${pid}.nc tmp_pid${pid}.nc
  54. module --force purge
  55. module load releases/2019a
  56. module load noarch
  57. module load Java/11.0.2
  58. module load ELIC_Python/1-foss-2019a-Python-3.7.2
  59. input_full=`readlink -f tmp_pid${pid}.nc`
  60. output_full="${dest_folder}/${dest_prefix}grid_T_y${year}.nc"
  61. python ${reformat_script} ${input_full} t ${output_full}
  62. module --force purge
  63. module load releases/2020b
  64. module load noarch
  65. module load NCO
  66. module load CDO
  67. # 2) Extract u velocities.
  68. #calculate ubarotropic from uo (3D): vertical mean of uo
  69. cdo selname,uo ${in_prefix}/${fc_num}/${name_exp}_${freq}_opa_grid_U_3D_${year}.nc tmp_pid${pid}.nc
  70. cdo vertmean tmp_pid${pid}.nc tmp2_pid${pid}.nc
  71. ncap2 -O -s 'ubar = uo;' tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  72. cdo merge tmp_pid${pid}.nc tmp3_pid${pid}.nc tmp4_pid${pid}.nc
  73. # precut
  74. cdo -O sellonlatbox,${latlon_cut} tmp4_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,uo_2 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 --force purge
  86. module load releases/2019a
  87. module load noarch
  88. module load Java/11.0.2
  89. module load ELIC_Python/1-foss-2019a-Python-3.7.2
  90. input_full=`readlink -f tmp2_pid${pid}.nc`
  91. output_full="${dest_folder}/${dest_prefix}grid_U_y${year}.nc"
  92. python ${reformat_script} ${input_full} u ${output_full}
  93. module --force purge
  94. module load releases/2020b
  95. module load noarch
  96. module load NCO
  97. module load CDO
  98. # 3) Extract v velocities.
  99. #calculate vbarotropic from vo (3D): vertical mean of vo
  100. cdo selname,vo ${in_prefix}/${fc_num}/${name_exp}_${freq}_opa_grid_V_3D_${year}.nc tmp_pid${pid}.nc
  101. cdo vertmean tmp_pid${pid}.nc tmp2_pid${pid}.nc
  102. ncap2 -O -s 'vbar = vo;' tmp2_pid${pid}.nc tmp3_pid${pid}.nc
  103. cdo merge tmp_pid${pid}.nc tmp3_pid${pid}.nc tmp4_pid${pid}.nc
  104. # precut
  105. cdo -O sellonlatbox,${latlon_cut} tmp4_pid${pid}.nc tmp_pid${pid}.nc
  106. ncap2 -O -s 'vobaroclinic = vo - vbar;' tmp_pid${pid}.nc tmp2_pid${pid}.nc
  107. ncks -x -v vo,vo_2 tmp2_pid${pid}.nc -O tmp_pid${pid}.nc
  108. ncrename -v vbar,vobarotropic tmp_pid${pid}.nc
  109. ncrename -v olevel,depthv -v olevel_bnds,depthv_bnds tmp_pid${pid}.nc
  110. ncatted -a bounds,depthv,o,c,"depthv_bnds" -a name,depthv,o,c,"depthv" tmp_pid${pid}.nc
  111. ncrename -d olevel,depthv tmp_pid${pid}.nc
  112. ncpdq -O -a time_counter,depthv,y,x tmp_pid${pid}.nc tmp2_pid${pid}.nc
  113. # remap
  114. cdo remapbil,${dest_gridfile_v} tmp2_pid${pid}.nc tmp_pid${pid}.nc
  115. cdo setmisstonn tmp_pid${pid}.nc tmp2_pid${pid}.nc
  116. module --force purge
  117. module load releases/2019a
  118. module load noarch
  119. module load Java/11.0.2
  120. module load ELIC_Python/1-foss-2019a-Python-3.7.2
  121. input_full=`readlink -f tmp2_pid${pid}.nc`
  122. output_full="${dest_folder}/${dest_prefix}grid_V_y${year}.nc"
  123. python ${reformat_script} ${input_full} v ${output_full}
  124. module --force purge
  125. module load releases/2020b
  126. module load noarch
  127. module load NCO
  128. module load CDO
  129. done
  130. done
  131. rm -rf ./*pid${pid}*