source: lmdz_wrf/trunk/tools/get_WRFsounding-surface_data.bash @ 2034

Last change on this file since 2034 was 2023, checked in by lfita, 7 years ago

Adding retrieval of surface 2D maps

  • Property svn:executable set to *
File size: 16.7 KB
Line 
1#!/bin/bash
2#### Script to get data from a given specific sounding and surface stations from WRF
3##
4## e.g. # get_WRFsounding-surface_data.bash true ./ control 87576,-58.52,-34.81 87576,-58.52,-34.81 /home/lluis/PY/wrfout_d01_1995-01-01_00:00:00 WRFt:WRFtda:WRFp:WRFua:WRFva:ws:WRFwd wds:wss:WRFtdas T2
5if test $1 = '-h'; then
6  echo "************************************"
7  echo "*** Script to get snd & sfc data ***"
8  echo "***        from WRF output       ***"
9  echo "************************************"
10  echo "get_WRFsounding-surface_data.bash [scratch] [odir] [expl]                    \
11    [sndid],[sndlon],[sndlat] [sfcid],[sfclon],[sfclat] [infilen] [wrfsnddiags]      \
12    [wrfsfcdiags] [wrfsfcnodiags]"
13else
14
15if test $1 = 'true'; then fscratch=true
16else fscratch=false; fi
17
18odir=$2
19expl=$3
20if test ! $4 = 'None'; then
21  sndid=`echo $4 | tr ',' ' ' | awk '{print $1}'`
22  sndlon=`echo $4 | tr ',' ' ' | awk '{print $2}'`
23  sndlat=`echo $4 | tr ',' ' ' | awk '{print $3}'`
24else
25  sndid='None'
26fi
27
28if test ! $5 = 'None'; then
29  sfcid=`echo $5 | tr ',' ' ' | awk '{print $1}'`
30  sfclon=`echo $5 | tr ',' ' ' | awk '{print $2}'`
31  sfclat=`echo $5 | tr ',' ' ' | awk '{print $3}'`
32else
33  sfcid='None'
34fi
35
36infilen=$6
37wrfsnddiags=$7
38wrfsfcdiags=$8
39wrfsfcnodiags=$9
40
41function isin_list() {
42# Function to check whether a value is in a list
43  list=$1
44  value=$2
45 
46  is=`echo ${list} | tr ':' '\n' | awk '{print "@"$1"@"}' | grep '@'${value}'@' | wc -w`
47  if test ${is} -eq 1
48  then
49    true
50  else
51    false
52  fi
53}
54
55function get_WRFsounding_data(){
56# Function to get the data to compute analysis in a sounding point
57#   stlon= longitude value of the station
58#   stlat= latitude value of the station
59#   filen= name of the file
60#   lonvarn= name of the longitude variable
61#   latvarn= name of the latitude variable
62#   snddiagnames= diagnostics to compute (as ':' separated list)
63
64  funcvals=$1
65
66  stlon=`echo ${funcvals} | tr '#' ' ' | awk '{print $1}'`
67  stlat=`echo ${funcvals} | tr '#' ' ' | awk '{print $2}'`
68  filen=`echo ${funcvals} | tr '#' ' ' | awk '{print $3}'`
69  lonvarn=`echo ${funcvals} | tr '#' ' ' | awk '{print $4}'`
70  latvarn=`echo ${funcvals} | tr '#' ' ' | awk '{print $5}'`
71  snddiagnames=`echo ${funcvals} | tr '#' ' ' | awk '{print $6}'`
72
73  vals=${lonvarn}':'${latvarn}':Time|0'
74  gridsndv=`python ${pyHOME}/nc_var.py -o get_point -f ${filen} -S ${vals}           \
75    -v ${stlon},${stlat} | tr ' ' '!'`
76  echo "* get grid point: "${stlon}", "${stlat} >> ${ofileins}
77  echo python ${pyHOME}/nc_var.py -o get_point -f ${filen} -S "'"${vals}"'"          \
78    -v ${stlon},${stlat} >> ${ofileins}
79  echo " " >> ${ofileins}
80
81  xsnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $1}' | tr ',' ' ' |              \
82   awk '{print $1}'`
83  ysnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $1}' | tr ',' ' ' |              \
84  awk '{print $2}'`
85  dsnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $2}'`
86
87  xsnd1=`expr ${xsnd} + 1`
88  ysnd1=`expr ${ysnd} + 1`
89
90  # Getting values
91  if ${fscratch}; then rm ${simsndptf} >& /dev/null; fi
92  if test ! -f ${simsndptf}; then
93    values='Time,0,-1,1@bottom_top,0,-1,1@south_north,'${ysnd}','${ysnd}',1@'
94    values=${values}'west_east,'${xsnd}','${xsnd}',1@south_north_stag,'${ysnd}','
95    values=${values}${ysnd1}',1@west_east_stag,'${xsnd}','${xsnd1}',1:False'
96    python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}               \
97      -S ${values} -v all
98    if test $? -ne 0; then
99      echo ${errmsg}
100      echo "  python failed!!"
101      echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}        \
102        -S "'"${values}"'" -v all
103      exit
104    fi
105    echo "* get values at snd point: "${stlon}", "${stlat} >> ${ofileins}
106    echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}          \
107      -S "'"${values}"'" -v all >> ${ofileins}
108    echo " " >> ${ofileins}
109
110    ofilen='newfile_multidims.nc'
111    mv ${ofilen} ${simsndptf}
112  fi
113   
114  # Computing sounding diagnostics
115  snddiagd='Time@WRFtime,bottom_top@P'
116  diagns=`echo ${snddiagnames} | tr ':' ' '`
117
118  idiag=1
119  for diagn in ${diagns}; do
120    diagv=`cat $pyHOME/diagnostics.inf | grep ${diagn}',' | tr ',' ' ' |             \
121      awk '{print $2"|"$3}'`
122    if test ${idiag} -eq 1; then
123      snddiagvals=${diagv}
124    else
125      snddiagvals=${snddiagvals}','${diagv}
126    fi
127    idiag=`expr ${idiag} + 1`
128  done
129
130  if ${fscratch}; then rm ${simsnddiagsf}; fi
131  if test ! -f ${simsnddiagsf}; then
132    python ${pyHOME}/diagnostics.py -f ${simsndptf} -d ${snddiagd} -v ${snddiagvals}
133    if test $? -ne 0; then
134      echo ${errmsg}
135      echo "  python failed!!"
136      echo python ${pyHOME}/diagnostics.py -f ${simsndptf} -d "'"${snddiagd}"'" -v   \
137        "'"${snddiagvals}"'"
138      exit
139    fi
140    echo "* computing diagnostics at snd point: "${stlon}", "${stlat} >> ${ofileins}
141    echo python ${pyHOME}/diagnostics.py -f "'"${simsndptf}"'" -d "'"${snddiagd}"'"  \
142      -v "'"${snddiagvals}"'" >> ${ofileins}
143    echo " " >> ${ofileins}
144
145    mv diagnostics.nc ${simsnddiagsf}
146    if $(isin_list ${snddiagnames} WRFt); then
147      #To deg
148      python ${pyHOME}/nc_var.py -o valmod -S subc,273.15 -f ${simsnddiagsf} -v ta
149    fi
150    if $(isin_list ${snddiagnames} WRFp); then
151      #To Pa
152      python ${pyHOME}/nc_var.py -o valmod -S divc,100. -f ${simsnddiagsf} -v pres
153    fi
154  fi
155}
156
157function get_WRFsurface_data(){
158# Function to get the data to compute analysis in a surface point
159#   stlon= longitude value of the station
160#   stlat= latitude value of the station
161#   filen= name of the file
162#   lonvarn= name of the longitude variable
163#   latvarn= name of the latitude variable
164#   sfcdiagnames= diagnostics to compute (as ':' separated list)
165#   nondiagvs= ':' list of variables which are not from a diagnostics ('None' for
166#     without)
167
168  funcvals=$1
169
170  stlon=`echo ${funcvals} | tr '#' ' ' | awk '{print $1}'`
171  stlat=`echo ${funcvals} | tr '#' ' ' | awk '{print $2}'`
172  filen=`echo ${funcvals} | tr '#' ' ' | awk '{print $3}'`
173  lonvarn=`echo ${funcvals} | tr '#' ' ' | awk '{print $4}'`
174  latvarn=`echo ${funcvals} | tr '#' ' ' | awk '{print $5}'`
175  sfcdiagnames=`echo ${funcvals} | tr '#' ' ' | awk '{print $6}'`
176  nondiagvs=`echo ${funcvals} | tr '#' ' ' | awk '{print $7}'`
177
178  vals=${lonvarn}':'${latvarn}':Time|0'
179  gridsndv=`python ${pyHOME}/nc_var.py -o get_point -f ${filen} -S ${vals}           \
180    -v ${stlon},${stlat} | tr ' ' '!'`
181  echo "* get grid point: "${stlon}", "${stlat} >> ${ofileins}
182  echo python ${pyHOME}/nc_var.py -o get_point -f ${filen} -S "'"${vals}"'"          \
183    -v ${stlon},${stlat} >> ${ofileins}
184  echo " " >> ${ofileins}
185  xsnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $1}' | tr ',' ' ' |              \
186   awk '{print $1}'`
187  ysnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $1}' | tr ',' ' ' |              \
188  awk '{print $2}'`
189  dsnd=`echo ${gridsndv} | tr '!' ' ' | awk '{print $2}'`
190
191  xsnd1=`expr ${xsnd} + 1`
192  ysnd1=`expr ${ysnd} + 1`
193
194  # Getting values
195  if ${fscratch}; then rm ${simsfcptf} >& /dev/null; fi
196  if test ! -f ${simsfcptf}; then
197    values='Time,0,-1,1@south_north,'${ysnd}','${ysnd}',1@'
198    values=${values}'west_east,'${xsnd}','${xsnd}',1@south_north_stag,'${ysnd}','
199    values=${values}${ysnd1}',1@west_east_stag,'${xsnd}','${xsnd1}',1:false'
200    python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}               \
201      -S ${values} -v all
202    if test $? -ne 0; then
203      echo ${errmsg}
204      echo "  python failed!!"
205      echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}        \
206        -S "'"${values}"'" -v all
207      exit
208    fi
209  echo "* get values at sfc point: "${stlon}", "${stlat} >> ${ofileins}
210  echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}            \
211      -S "'"${values}"'" -v all >> ${ofileins}
212  echo " " >> ${ofileins}
213
214    ofilen='newfile_multidims.nc'
215    mv ${ofilen} ${simsfcptf}
216  fi
217   
218  # Computing sfc diagnostics
219  sfcdiagd='Time@WRFtime'
220  diagns=`echo ${sfcdiagnames} | tr ':' ' '`
221
222  idiag=1
223  for diagn in ${diagns}; do
224    diagv=`cat $pyHOME/diagnostics.inf | grep WRF | grep ${diagn}',' | tr ',' ' ' |  \
225      awk '{print $2"|"$3}'`
226    if test ${idiag} -eq 1; then
227      sfcdiagvals=${diagv}
228    else
229      sfcdiagvals=${sfcdiagvals}','${diagv}
230    fi
231    idiag=`expr ${idiag} + 1`
232  done
233
234  if ${fscratch}; then rm ${simsfcdiagsf}; fi
235  if test ! -f ${simsfcdiagsf}; then
236    python ${pyHOME}/diagnostics.py -f ${simsfcptf} -d ${sfcdiagd} -v ${sfcdiagvals}
237    if test $? -ne 0; then
238      echo ${errmsg}
239      echo "  python failed!!"
240      echo python ${pyHOME}/diagnostics.py -f ${simsfcptf} -d "'"${sfcdiagd}"'"      \
241        -v "'"${sfcdiagvals}"'"
242      exit
243    fi
244    echo "* diagnostics at sfc point: "${stlon}", "${stlat} >> ${ofileins}
245    echo python ${pyHOME}/diagnostics.py -f ${simsfcptf} -d "'"${sfcdiagd}"'"        \
246      -v "'"${sfcdiagvals}"'" >> ${ofileins}
247    echo " " >> ${ofileins}
248    mv diagnostics.nc ${simsfcdiagsf}
249    if $(isin_list ${sfcdiagnames} wds); then
250      #To rad
251      python ${pyHOME}/nc_var.py -o valmod -S mulc,0.0174532925199 -f ${simsfcdiagsf}\
252        -v wds
253      python ${pyHOME}/nc_var.py -o varaddattr -S 'units|rad' -f ${simsfcdiagsf} -v wds
254    fi
255  fi
256
257  #Adding non-diagnostic variables
258  if test ! ${nondiagvs} = 'None'; then
259    varsadd=`echo ${nondiagvs} | tr ':' ' '`
260    for vadd in ${varsadd}; do
261      python ${pyHOME}/nc_var.py -o fvaradd -S ${simsfcptf},${vadd} -f ${simsfcdiagsf}
262      if test $? -ne 0; then
263        echo ${errmsg}
264        echo "  python failed!!"
265        echo python ${pyHOME}/nc_var.py -o fvaradd -S "'"${simsfcptf},${vadd}"'"     \
266          -f ${simsfcdiagsf}
267        exit
268        rm ${simsfcdiagsf}
269      fi
270      echo "* adding variable '"${vadd}"' at sfc point: "${stlon}", "${stlat} >> ${ofileins}
271      echo python ${pyHOME}/nc_var.py -o fvaradd -S "'"${simsfcptf},${vadd}"'"       \
272        -f ${simsfcdiagsf} >> ${ofileins}
273      echo " " >> ${ofileins}
274      # CF varname
275      CFvarn=`python $pyHOME/generic.py -o variables_values -S ${vadd} | tr ':' ' ' |\
276        awk '{print $1}'`
277      if test $? -ne 0; then
278        echo ${errmsg}
279        echo "  python failed!!"
280        echo python $pyHOME/generic.py -o variables_values -S ${vadd}
281        exit
282        rm ${simsfcdiagsf}
283      fi
284      python $pyHOME/nc_var.py -o chvarname -S ${CFvarn} -f ${simsfcdiagsf} -v ${vadd}
285      if test $? -ne 0; then
286        echo ${errmsg}
287        echo "  python failed!!"
288        echo python ${pyHOME}/nc_var.py -o chvarname -S ${CFvarn} -f ${simsfcdiagsf} \
289          -v ${vadd}
290        exit
291        rm ${simsfcdiagsf}
292      fi
293    done
294  fi
295}
296
297function get_WRFsfc2D_data(){
298# Function to get the data to compute analysis in a surface map
299#   filen= name of the file
300#   sfcdiagnames= diagnostics to compute (as ':' separated list)
301#   nondiagvs= ':' list of variables which are not from a diagnostics ('None' for
302#     without)
303
304  funcvals=$1
305
306  filen=`echo ${funcvals} | tr '#' ' ' | awk '{print $1}'`
307  sfcdiagnames=`echo ${funcvals} | tr '#' ' ' | awk '{print $2}'`
308  nondiagvs=`echo ${funcvals} | tr '#' ' ' | awk '{print $3}'`
309
310  # Computing sfc diagnostics
311  sfcmapdiagd='Time@WRFtime:south_north@XLAT:west_east@XLONG'
312  diagns=`echo ${sfcdiagnames} | tr ':' ' '`
313
314  # getting that variables only required for the diagnostics
315  vardiags=''
316  idiag=1
317  for diagn in ${diagns}; do
318    diagv=`cat $pyHOME/diagnostics.inf | grep WRF | grep ${diagn}',' | tr ',' ' ' |  \
319      awk '{print $2"|"$3}'`
320    if test ${idiag} -eq 1; then
321      sfcdiagvals=${diagv}
322      vardiags=`echo ${diagv} | tr '|' ' ' | awk '{print $2}' | tr '@' ':'`
323    else
324      sfcdiagvals=${sfcdiagvals}','${diagv}
325      vardiag=`echo ${diagv} | tr '|' ' ' | awk '{print $2}' | tr '@' ' '`
326      for vd in ${vardiag}; do
327        if ! $(isin_list ${vardiags} ${vd}); then vardiags=${vardiags}':'${vd}; fi
328      done
329    fi
330    idiag=`expr ${idiag} + 1`
331  done
332
333  # Inlcuding non-diagnostics
334  if test ! ${nondiagvs} = 'None'; then
335    nvns=`echo ${nondiagvs} | tr ':' ' '`
336    for vn in ${nvns}; do
337      if ! $(isin_list ${vardiags} ${vn}); then vardiags=${vardiags}':'${vn}; fi
338    done
339  fi
340  vardiag=`echo ${vardiags} | tr ':' ','`
341 
342  # Getting values
343  if ${fscratch}; then rm ${simsfcmapf} >& /dev/null; fi
344  if test ! -f ${simsfcmapf}; then
345    values='Time,0,-1,1@south_north,0,-1,1@west_east,0,-1,1@south_north_stag,0,-1,1@'
346    values=${values}'west_east_stag,0,-1,1:False'
347    python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}               \
348      -S ${values} -v ${vardiag}
349    if test $? -ne 0; then
350      echo ${errmsg}
351      echo "  python failed!!"
352      echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}        \
353        -S "'"${values}"'"  -v ${vardiag}
354      exit
355    fi
356    echo "* get values for 2D map diagnostics: " >> ${ofileins}
357    echo python ${pyHOME}/nc_var.py -o DataSetSection_multidims -f ${filen}          \
358      -S "'"${values}"'" -v ${vardiag} >> ${ofileins}
359    echo " " >> ${ofileins}
360
361    ofilen='newfile_multidims.nc'
362    mv ${ofilen} ${simsfcmapf}
363  fi
364
365  if ${fscratch}; then rm ${simsfcmapdiagsf}; fi
366  if test ! -f ${simsfcmapdiagsf}; then
367    python ${pyHOME}/diagnostics.py -f ${simsfcmapf} -d ${sfcmapdiagd}               \
368      -v ${sfcdiagvals}
369    if test $? -ne 0; then
370      echo ${errmsg}
371      echo "  python failed!!"
372      echo python ${pyHOME}/diagnostics.py -f ${simsfcmapf} -d "'"${sfcmapdiagd}"'"  \
373        -v "'"${sfcdiagvals}"'"
374      exit
375    fi
376    echo "* diagnostics for sfc 2D map: " >> ${ofileins}
377    echo python ${pyHOME}/diagnostics.py -f ${simsfcmapf} -d "'"${sfcmapdiagd}"'"    \
378      -v "'"${sfcdiagvals}"'" >> ${ofileins}
379    echo " " >> ${ofileins}
380    mv diagnostics.nc ${simsfcmapdiagsf}
381    if $(isin_list ${sfcdiagnames} wds); then
382      #To rad
383      python ${pyHOME}/nc_var.py -o valmod -S mulc,0.0174532925199                   \
384        -f ${simsfcmapdiagsf} -v wds
385      python ${pyHOME}/nc_var.py -o varaddattr -S 'units|rad' -f ${simsfcmapdiagsf}  \
386        -v wds
387    fi
388
389    #Adding non-diagnostic variables
390    if test ! ${nondiagvs} = 'None'; then
391      varsadd=`echo ${nondiagvs} | tr ':' ' '`
392      for vadd in ${varsadd}; do
393        python ${pyHOME}/nc_var.py -o fvaradd -S ${simsfcmapf},${vadd}               \
394          -f ${simsfcmapdiagsf}
395        if test $? -ne 0; then
396          echo ${errmsg}
397          echo "  python failed!!"
398          echo python ${pyHOME}/nc_var.py -o fvaradd -S "'"${simsfcmapf},${vadd}"'"  \
399            -f ${simsfcmapdiagsf}
400          exit
401          rm ${simsfcmapdiagsf}
402        fi
403        echo "* adding variable '"${vadd}"' at sfc map: " >> ${ofileins}
404        echo python ${pyHOME}/nc_var.py -o fvaradd -S "'"${simsfcmapf},${vadd}"'"    \
405          -f ${simsfcmapdiagsf} >> ${ofileins}
406        echo " " >> ${ofileins}
407        # CF varname
408        CFvarn=`python $pyHOME/generic.py -o variables_values -S ${vadd} |           \
409          tr ':' ' ' | awk '{print $1}'`
410        if test $? -ne 0; then
411          echo ${errmsg}
412          echo "  python failed!!"
413          echo python $pyHOME/generic.py -o variables_values -S ${vadd}
414          exit
415          rm ${simsfcmapdiagsf}
416        fi
417        python $pyHOME/nc_var.py -o chvarname -S ${CFvarn} -f ${simsfcmapdiagsf}     \
418          -v ${vadd}
419        if test $? -ne 0; then
420          echo ${errmsg}
421          echo "  python failed!!"
422          echo python ${pyHOME}/nc_var.py -o chvarname -S ${CFvarn}                  \
423            -f ${simsfcmapdiagsf} -v ${vadd}
424          exit
425          rm ${simsfcmapdiagsf}
426        fi
427      done
428    fi
429  fi
430}
431
432#######    #######
433## MAIN
434    #######
435
436  rootsh=`pwd`
437
438  ofileins=${rootsh}'/allins_functions.inf'
439
440  if ${fscratch}; then
441    echo "All instructions _______ " > ${ofileins}
442    echo "******* ****** ***** **** *** ** *" >> ${ofileins}
443    echo " " >> ${ofileins}
444  fi
445
446  fileN=`basename ${infilen}`
447  fdate=`echo ${fileN} | tr '_' ' ' | awk '{print $3"_"$4}'`
448
449  # Sounding
450  if test ! ${sndid} = 'None'; then
451    stid=${sndid}
452    simsndptf=${odir}'/simout_vars_sndpt_'${stid}'_'${expl}'_'${fdate}'.nc'
453    simsnddiagsf=${odir}'/simout_snddiags_'${stid}'_'${expl}'_'${fdate}'.nc'
454
455    fvals=${sndlon}'#'${sndlat}'#'${infilen}'#XLONG#XLAT#'${wrfsnddiags}
456    get_WRFsounding_data ${fvals}
457  fi
458
459  # Surface
460  if test ! ${sfcid} = 'None'; then
461    stid=${sfcid}
462    simsfcptf=${odir}'/simout_vars_sfcpt_'${stid}'_'${expl}'_'${fdate}'.nc'
463    simsfcdiagsf=${odir}'/simout_sfcdiags_'${stid}'_'${expl}'_'${fdate}'.nc'
464 
465    fvals=${sfclon}'#'${sfclat}'#'${infilen}'#XLONG#XLAT#'${wrfsfcdiags}'#'${wrfsfcnodiags}
466    get_WRFsurface_data ${fvals}
467  fi
468
469  # Surface maps
470  if test ! ${sfcmapid} = 'None'; then
471    simsfcmapf=${odir}'/simout_vars_sfcmap_'${stid}'_'${expl}'_'${fdate}'.nc'
472    simsfcmapdiagsf=${odir}'/simout_sfcmapdiags_'${stid}'_'${expl}'_'${fdate}'.nc'
473
474    fvals=${infilen}'#'${wrfsfcdiags}'#'${wrfsfcnodiags}
475    get_WRFsfc2D_data ${fvals}
476
477fi
Note: See TracBrowser for help on using the repository browser.