burn.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #!/bin/bash
  2. ## burn.sh
  3. ## Afterburner cmorizer
  4. ## (2018) by Jost von Hardenberg <j.vonhardenberg AT isac.cnr.it>
  5. VERSION=v1.0
  6. #set -ex
  7. BURNER=/work/users/jost/plasim/postprocessor/burn7.x
  8. BURNER=/Users/jost/plasim/plasimnew/postprocessor/burn7.x
  9. PLEVS="20,30,50,70,100,150,200,250,300,400,500,600,700,850,925,1000"
  10. VARS3D="wap wa zeta stf psi d zg hur ta ua va hus clw cl spd psl"
  11. GACC=9.80665
  12. HUM_A=6.116441
  13. HUM_m=7.591386
  14. HUM_Tn=240.7263
  15. function makevar {
  16. outvar=$1
  17. no3d=false;
  18. case $outvar in
  19. "ps") invar="ps"; standard_name="surface_air_pressure" ; long_name="Surface Air Pressure"; units="Pa"; expr="ps=ps*100";;
  20. "psl") invar="psl"; standard_name="air_pressure_at_sea_level" ; long_name="Sea Level Pressure"; units="Pa"; expr="psl=psl*100";;
  21. "tas") invar="tas"; standard_name="air_temperature" ;long_name="Near-Surface Air Temperature"; units="K"; expr="tas=tas";;
  22. "tasmin") invar="tasmin"; standard_name="air_temperature" ;long_name="Daily Minimum Near-Surface Air Temperature"; units="K"; expr="tasmin=tasmin";;
  23. "tasmax") invar="tasmax"; standard_name="air_temperature" ;long_name="Daily Maximum Near-Surface Air Temperature"; units="K"; expr="tasmax=tasmax";;
  24. "ts") invar="ts"; standard_name="surface_temperature" ;long_name="Surface Temperature"; units="K"; expr="ts=ts";;
  25. "uas") invar="ua"; standard_name="eastward_wind" ;long_name="Eastward Near-Surface Wind"; units="m s-1"; expr="uas=ua"; no3d=true;;
  26. "vas") invar="va"; standard_name="northward_wind" ;long_name="Northward Near-Surface Wind"; units="m s-1"; expr="vas=va"; no3d=true;;
  27. "evspsbl") invar="evap"; standard_name="water_evaporation_flux" ;long_name="Evaporation"; units="kg m-2 s-1"; expr="evspsbl=-evap*1000";;
  28. "pr") invar="pr"; standard_name="precipitation_flux" ;long_name="Precipitation"; units="kg m-2 s-1"; expr="pr=pr*1000";;
  29. "prc") invar="prc"; standard_name="convective_precipitation_flux" ;long_name="Convective Precipitation"; units="kg m-2 s-1"; expr="prc=prc*1000";;
  30. "prsn") invar="prsn"; standard_name="snowfall_flux" ;long_name="Snowfall Flux"; units="kg m-2 s-1"; expr="prsn=prsn*1000";;
  31. "mrros") invar="mrro"; standard_name="surface_runoff_flux" ;long_name="Surface Runoff"; units="kg m-2 s-1"; expr="mrros=mrro*1000";;
  32. "mrso") invar="mrso"; standard_name="soil_moisture_content" ;long_name="Total Soil Moisture Content"; units="kg m-2 s-1"; expr="mrso=mrso*1000";;
  33. "tsl") invar="tso"; standard_name="soil_temperature" ;long_name="Temperature of Soil"; units="K"; expr="tsl=tso";;
  34. "rsdt") invar="rsut rst"; standard_name="toa_incoming_shortwave_flux" ;long_name="TOA Incident Shortwave Radiation"; units="W m-2"; expr="rsdt=rst-rsut";;
  35. "rsut") invar="rsut"; standard_name="toa_outgoing_shortwave_flux" ;long_name="TOA Outgoing Shortwave Radiation"; units="W m-2"; expr="rsut=-rsut";;
  36. "rlut") invar="rlut"; standard_name="toa_outgoing_longwave_flux" ;long_name="TOA Outgoing Longwave Radiation"; units="W m-2"; expr="rlut=-rlut";;
  37. "rsds") invar="ssru rss"; standard_name="surface_downwelling_shortwave_flux_in_air" ;long_name="Surface Downwelling Shortwave Radiation"; units="W m-2"; expr="rsds=rss-ssru";;
  38. "rsus") invar="ssru"; standard_name="surface_upwelling_shortwave_flux_in_air" ;long_name="Surface Upwelling Shortwave Radiation"; units="W m-2"; expr="rsus=-ssru";;
  39. "rlds") invar="stru rls"; standard_name="surface_downwelling_longwave_flux_in_air" ;long_name="Surface Downwelling Longwave Radiation"; units="W m-2"; expr="rlds=rls-stru";;
  40. "rlus") invar="stru"; standard_name="surface_upwelling_longwave_flux_in_air" ;long_name="Surface Upwelling Longwave Radiation"; units="W m-2"; expr="rlus=-stru";;
  41. "hfls") invar="hfls"; standard_name="surface_upward_latent_heat_flux" ;long_name="Surface Upward Latent Heat Flux"; units="W m-2"; expr="hfls=-hfls";;
  42. "hfss") invar="hfss"; standard_name="surface_upward_sensible_heat_flux" ;long_name="Surface Upward Sensible Heat Flux"; units="W m-2"; expr="hfss=-hfss";;
  43. "clt") invar="clt"; standard_name="cloud_area_fraction" ; long_name="Total Cloud Fraction"; units="%"; expr="clt=clt*100";;
  44. "prw") invar="prw"; standard_name="atmosphere_water_vapor_content" ;long_name="Water Vapor Path"; units="kg m-2"; expr="prw=prw";;
  45. "huss") invar="hus"; standard_name="specific_humidity" ;long_name="Near-Surface Specific Humidity"; units="1"; expr="huss=hus"; no3d=true;;
  46. "hurs") invar="tas td2m"; standard_name="specific_humidity" ;long_name="Near-Surface Specific Humidity"; units="1"; expr="hurs=100*10^($HUM_m*( td2m/(td2m + $HUM_Tn )-tas/(tas + $HUM_Tn ) )) "; no3d=true;;
  47. "clw") invar="clw"; standard_name="mass_fraction_of_cloud_liquid_water_in_air" ;long_name="Mass Fraction of Cloud Liquid Water"; units="1"; expr="clw=clw";;
  48. "hus") invar="hus"; standard_name="specific_humidity" ;long_name="Specific Humidity"; units="1"; expr="hus=hus";;
  49. "hur") invar="hur"; standard_name="relative_humidity" ;long_name="Relative Humidity"; units="%"; expr="hur=hur";;
  50. "zg") invar="zg"; standard_name="geopotential_height" ;long_name="Geopotential Height"; units="1"; expr="zg=zg";;
  51. "ta") invar="ta"; standard_name="air_temperature" ;long_name="Air Temperature"; units="K"; expr="ta=ta";;
  52. "ua") invar="ua"; standard_name="eastward_wind" ;long_name="Eastward Wind"; units="m s-1"; expr="ua=ua";;
  53. "va") invar="va"; standard_name="northward_wind" ;long_name="Northward Wind"; units="m s-1"; expr="va=va";;
  54. "wa") invar="wa"; standard_name="upward_wind" ;long_name="Upward Wind"; units="m s-1"; expr="wa=wa";;
  55. "wap") invar="wap"; standard_name="lagrangian_tendency_of_air_pressure" ;long_name="omega (=dp/dt)"; units="Pa s-1"; expr="wap=wap";;
  56. "cl") invar="cl"; standard_name="cloud_area_fraction_in_atmosphere_layer" ;long_name="Cloud Area Fraction"; units="%"; expr="cl=cl*100";;
  57. "orog") invar="sg"; standard_name="surface_altitude" ;long_name="Surface Altitude"; units="m"; expr="orog=sg/$GACC";;
  58. "snd") invar="snd"; standard_name="surface_snow_thickness" ;long_name="Snow Depth"; units="m"; expr="snd=snd";;
  59. "snm") invar="snm"; standard_name="surface_snow_melt_flux" ;long_name="Surface Snow Melt"; units="kg m-2 s-1"; expr="snm=snm*1000";;
  60. "tauu") invar="tauu"; standard_name="surface_downward_eastward_stress" ;long_name="Surface Downward Eastward Wind Stress"; units="Pa"; expr="tauu=tauu";;
  61. "tauv") invar="tauv"; standard_name="surface_downward_northward_stress" ;long_name="Surface Downward Northward Wind Stress"; units="Pa"; expr="tauv=tauv";;
  62. "td2m") invar="td2m"; standard_name="dewpoint_temperature" ;long_name="Near-Surface Dewpoint Temperature"; units="K"; expr="td2m=td2m";;
  63. "rst") invar="rst"; standard_name="toa_net_shortwave_flux" ;long_name="TOA Net Shortwave Radiation"; units="W m-2"; expr="rst=rst";;
  64. "rss") invar="rss"; standard_name="surface_net_shortwave_flux_in_air" ;long_name="Surface Net Shortwave Radiation"; units="W m-2"; expr="rss=rss";;
  65. "rls") invar="rls"; standard_name="surface_net_longwave_flux_in_air" ;long_name="Surface Net Longwave Radiation"; units="W m-2"; expr="rls=rls";;
  66. "alb") invar="alb"; standard_name="surface_albedo" ;long_name="Surface Albedo"; units="1"; expr="alb=alb";;
  67. "prl") invar="prl"; standard_name="large_scale_precipitation_flux" ;long_name="Large Scale Precipitation"; units="kg m-2 s-1"; expr="prl=prl*1000";;
  68. "sndc") invar="sndc"; standard_name="surface_snow_depth_change" ;long_name="Surface Snow Depth Change"; units="m s-1"; expr="sndc=sndc";;
  69. "stf") invar="stf"; standard_name="stream_function" ;long_name="Stream Function"; units="m"; expr="stf=stf";;
  70. "lsm") invar="lsm"; standard_name="land_sea_mask" ;long_name="Land Sea Mask"; units="1"; expr="lsm=lsm";;
  71. "sit") invar="sit"; standard_name="sea_ice_thickness" ;long_name="Sea Ice Thickness"; units="m"; expr="sit=sit";;
  72. "sic") invar="sic"; standard_name="sea_ice_cover" ;long_name="Sea Ice Cover"; units="%"; expr="sic=sic*100";;
  73. "mld") invar="mld"; standard_name="ocean_mixed_layer_thickness" ;long_name="Ocean Mixed Layer Thickness"; units="m"; expr="mld=mld";;
  74. *) invar=$outvar ; expr="none";;
  75. esac
  76. }
  77. function help {
  78. HELPVARS2D="ps psl tas tasmin tasmax ts uas vas evspsbl pr prc prl prsn mrros mrso tsl rsdt rsut rlut rsds rsus rlds rlus hfls hfss clt prw huss hurs orog snd snm tauu tauv sit sic"
  79. HELPVARS3D="hus hur zg ta ua va wa wap cl clw"
  80. HELPEXTRA="td2m rst rls alb prl sndc stf lsm mld"
  81. echo "burn.sh $VERSION"
  82. echo "Afterburner cmorizer"
  83. echo "Extracts variables from PlaSim output using CMOR conventions."
  84. echo "Adjusts variable names, signs, units and computes derived variables."
  85. echo
  86. echo Usage: burn.sh [options] infile outfile var
  87. echo Options:
  88. echo " -h Prints this help"
  89. echo " -s Extract 3D variables on sigma levels"
  90. echo " -a Afterburner variable (do not cmorize)"
  91. echo " -p lev1,lev2,... Specify pressure levels (in hPa)"
  92. echo
  93. echo "Default pressure levels are " $PLEVS "hPa"
  94. echo
  95. echo Variables which can be extracted:
  96. echo -------------------------------------------------------------------------------------
  97. echo "| 2D CMOR2 variables: |"
  98. echo -------------------------------------------------------------------------------------
  99. printf "| % 8s | % 40s | % 10s | % 14s |\n" Name "Long Name" Units "From org. vars"
  100. echo -------------------------------------------------------------------------------------
  101. for v in $HELPVARS2D; do
  102. makevar $v
  103. printf "| % 8s | % 40s | % 10s | % 14s |\n" $v "$long_name" "$units" "$invar"
  104. done
  105. echo -------------------------------------------------------------------------------------
  106. echo "| 3D CMOR2 variables: |"
  107. echo -------------------------------------------------------------------------------------
  108. printf "| % 8s | % 40s | % 10s | % 14s |\n" Name "Long Name" Units "From org. vars"
  109. echo -------------------------------------------------------------------------------------
  110. for v in $HELPVARS3D; do
  111. makevar $v
  112. printf "| % 8s | % 40s | % 10s | % 14s |\n" $v "$long_name" "$units" "$invar"
  113. done
  114. echo -------------------------------------------------------------------------------------
  115. echo "| Not standard variables: |"
  116. echo -------------------------------------------------------------------------------------
  117. printf "| % 8s | % 40s | % 10s | % 14s |\n" Name "Long Name" Units "From org. vars"
  118. echo -------------------------------------------------------------------------------------
  119. for v in $HELPEXTRA; do
  120. makevar $v
  121. printf "| % 8s | % 40s | % 10s | % 14s |\n" $v "$long_name" "$units" "$invar"
  122. done
  123. echo -------------------------------------------------------------------------------------
  124. echo Variables not in this list are extracted directly using afterburner with no change.
  125. echo Examples: zeta,d,bld etc.
  126. echo Note: uas and vas are not available in PlaSim output, derived from ua and va at sigma=1
  127. echo "Note: psl (sea level pressure) is not avaiable in PlaSim output,"
  128. echo " derived from huss (hus at sigma=1), tas and ps using the hypsometric formula"
  129. }
  130. function fixvar {
  131. local infile=$1
  132. if [ "$expr" != "none" ] && [ $after != 1 ]; then
  133. cdo setattribute,$outvar@standard_name="$standard_name" -setattribute,$outvar@long_name="$long_name" -setattribute,$outvar@units="$units" -expr,"$expr" $infile $2
  134. else
  135. cp $infile $2
  136. fi
  137. }
  138. function getvar {
  139. local infile=$1
  140. local outfile=$2
  141. local code=$3
  142. local lev1=1
  143. rm -f burn.log
  144. if [ "$no3d" == "true" ]; then
  145. lev1=10
  146. fi
  147. if [[ " $VARS3D " =~ .*\ $code\ .* ]] && [ "$no3d" != "true" ]; then
  148. if [ $sigma == 0 ]; then
  149. cat > burn$$.nl <<EOF
  150. code=$code,vtype=p,htype=g,mean=0,netcdf=1
  151. hpa=$PLEVS
  152. EOF
  153. else
  154. cat > burn$$.nl <<EOF
  155. code=$code,vtype=s,htype=g,mean=0,netcdf=1
  156. EOF
  157. fi
  158. else
  159. cat > burn$$.nl <<EOF2
  160. code=$code,vtype=s,htype=g,mean=0,netcdf=1
  161. modlev=$lev1
  162. EOF2
  163. fi
  164. $BURNER $infile $outfile < ./burn$$.nl >> burn.log
  165. rm ./burn$$.nl
  166. }
  167. ##################
  168. ## Main
  169. ##################
  170. sigma=0
  171. after=0
  172. while getopts "h?sap:" opt; do
  173. case "$opt" in
  174. h|\?) help ;;
  175. s) sigma=1 ;;
  176. a) after=1 ;;
  177. p) PLEVS=$OPTARG;;
  178. esac
  179. done
  180. shift $((OPTIND-1))
  181. if [ $# -lt 3 ] ; then
  182. help
  183. exit
  184. fi
  185. infile=$1
  186. outfile=$2
  187. outvar=$3
  188. makevar $outvar
  189. rm -f temp$$.*.nc
  190. for var in $invar
  191. do
  192. getvar $infile temp$$.$var.nc $var
  193. done
  194. cdo merge temp$$.*.nc temp$$.all.nc 2>> burn.log
  195. fixvar temp$$.all.nc $outfile $outvar 2>> burn.log
  196. rm -f temp$$.*.nc