preprocess.bash 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. #SBATCH -n 1
  3. #SBATCH -t 12:00:00
  4. #SBATCH -J pre_perturbation
  5. #SBATCH -o slurm_pre-%j.out
  6. #SBATCH -e slurm_pre-%j.err
  7. set -o nounset
  8. set -o errexit
  9. set -x
  10. # =============================================================================
  11. # Author - F. Massonnet
  12. # Purpose- Prepare DFS5.2 forcing set to create perturbations later
  13. # What the script does:
  14. # 1) Make daily means in the case atmospheric data is at higher frequency
  15. # 2) Remove leap days if any
  16. # 3) Computes year-to-year differences
  17. #
  18. # The year-to-year differences are then used to generate perturbations,
  19. # in a second script.
  20. #
  21. # History - February 2016: creation for T2 perturbation
  22. # - March 2016: sorting problems with values beyond bounds
  23. # - April 2016: extension to other variables
  24. # =============================================================================
  25. # Which variable of the DFS5.2 forcing set has to be perturbed?
  26. # Possibilities: t2, q2, u10, v10, qlw, qsw, snow or precip
  27. var=qsw
  28. # Years defining the period considered. If perturbations have to be generated
  29. # for 1980-1990 but based on anomalies of the period 1975-1985, the longest
  30. # period has to be set: 1975-1990
  31. #
  32. # yearb = 1979 and yeare = 2015 are recommended choices since the forcing
  33. # spans these years and all variables are interannual
  34. yearb=1973
  35. yeare=1974
  36. # Directory of the source of the data (i.e., the original files)
  37. sourcedir=/esarchive/releases/fg/ocean/DFS5.2/
  38. # Working directory
  39. workdir=/esnas/scratch/$USER/TMP/TMP_${var}_26904
  40. # =============================================================================
  41. # Script Starts
  42. # =============================================================================
  43. mkdir -p $workdir
  44. cd $workdir
  45. echo "Workdir is $workdir"
  46. case ${var} in
  47. t2)
  48. min=100.0 # Min and max values allowed
  49. max=400.0
  50. freq=3hour # Frequency of availability
  51. fvar=${var} # Name of the variable in the NetCDF
  52. ;;
  53. q2)
  54. min=0.0
  55. max=0.1
  56. freq=3hour
  57. fvar=${var}
  58. ;;
  59. u10)
  60. min=-100.0
  61. max=100.0
  62. freq=3hour
  63. fvar=${var}
  64. ;;
  65. v10)
  66. min=-100.0
  67. max=100.0
  68. freq=3hour
  69. fvar=${var}
  70. ;;
  71. qsw)
  72. min=0.0
  73. max=1000.0
  74. freq=1day
  75. fvar=radsw
  76. ;;
  77. qlw)
  78. min=0.0
  79. max=1000.0
  80. freq=1day
  81. fvar=radlw
  82. ;;
  83. snow)
  84. min=0.0
  85. max=0.001
  86. freq=1day
  87. fvar=${var}
  88. ;;
  89. precip)
  90. min=0.0
  91. max=0.01
  92. freq=1day
  93. fvar=${var}
  94. ;;
  95. *)
  96. echo "Variable $var unknown"
  97. exit
  98. esac
  99. for year in `seq ${yearb} ${yeare}`
  100. do
  101. echo "Year $year / $yeare"
  102. # Reset valid range. Otherwise, the CDO command settaxis messes up and several points are reported as
  103. # missing values. This then makes NEMO crash.
  104. ncatted -O -a valid_range,${fvar},m,f,"${min}, ${max}" ${sourcedir}/${var}_DFS5.2_${year}.nc tmp.${year}.nc
  105. cdo settaxis,${year}-01-01,00:00,${freq} tmp.${year}.nc ${var}_DFS5.2_${year}.nc
  106. if [ ${freq} = 3hour ]
  107. then
  108. cdo daymean ${var}_DFS5.2_${year}.nc ${var}_DFS5.2_day_${year}.nc
  109. else
  110. cp ${var}_DFS5.2_${year}.nc ${var}_DFS5.2_day_${year}.nc
  111. fi
  112. # Cope with leap years
  113. ndays=`cdo ntime ${var}_DFS5.2_day_${year}.nc`
  114. if [[ $ndays = 366 ]]
  115. then
  116. cdo delete,month=2,day=29 ${var}_DFS5.2_day_${year}.nc ${var}_DFS5.2_day_${year}.nc.X
  117. mv ${var}_DFS5.2_day_${year}.nc.X ${var}_DFS5.2_day_${year}.nc
  118. else
  119. if [[ $ndays != 365 ]]
  120. then
  121. echo "Problem: nb of days is neither 365 nor 366"
  122. exit
  123. fi
  124. fi
  125. if [[ $year -ge $(( ${yearb} + 1 )) ]]
  126. then
  127. cdo sub ${var}_DFS5.2_day_${year}.nc ${var}_DFS5.2_day_$(( ${year} - 1 )).nc diff_${var}_DFS5.2_day_${year}-$(( ${year} - 1 )).nc
  128. fi
  129. rm -f tmp.${year}.nc
  130. done
  131. echo "SCRIPT SUCCESSFULLY FINISHED"