source: BOL/LMDZ_Setup/era2gcm.sh @ 5850

Last change on this file since 5850 was 5850, checked in by fhourdin, 7 weeks ago

Improved era2gcm.sh

  • Property svn:executable set to *
File size: 9.5 KB
Line 
1#!/bin/bash
2
3. lmdz_env.sh
4
5set -eu
6
7#-----------------------------------------------------------------------------
8#
9#  Script for interpolating monthly ERA* files to the LMDZ grid;
10#  it creates the folder structure required by the LMDZ_Setup scripts
11#
12#  NB: for "cleanest" guiding, the 1st step of the next month should be added at the end of each month.
13#    If you need such precision, you should use the scripts here  - AND adjust "ERADIR" in script_SIMU !
14#    wget http://forge.ipsl.jussieu.fr/igcmg/browser/TOOLS/INTERP_NUDGE
15#      documented on LMDZpedia (search for "Guidage" )
16#
17#-----------------------------------------------------------------------------
18# Requires : netcdf, ferret, nco, cdo
19#-----------------------------------------------------------------------------
20
21#------------------------------------------------
22# User choices
23#------------------------------------------------
24# Periode :
25mth_i=200001
26mth_f=200212
27#
28vars="u v ta q"
29vars="u v"
30#
31# Choix des fichiers de guidage ("rea"nalyses) : ERA5, ERAI, OPERA
32rea="ERAI"
33resol_rea=075
34
35#------------------------------------------------
36
37ERA5_PATH="/gpfsstore/rech/psl/rpsl376/ergon/ERA5/"
38ERAI_PATH="/gpfsstore/rech/psl/rpsl376/ergon/ERAI/"
39ERAI_PATH="/lustre/fswork/projects/rech/wfe/rgzi027/LMDZ/pub/3DInputData/ReAnalyses/ERAI"
40#/lustre/fswork/projects/rech/wfe/rgzi027/LMDZ/pub/3DInputData/ReAnalyses/ERAI/NETCDF/GLOBAL_075/4xdaily/AN_PL/2014/
41
42#@ADS ERA5_PATH="/lus/work/CT1/cad15221/abarral/ERA_TMP/"  # /!\ temp for test only !
43#@ADS ERAI_PATH=""  # /!\ temp for tests only!
44#@ADS echo "/!\ Nudging files are not available on Adastra for now !"; exit 1  # comment this line for tests
45#@ADS SCRATCH=$SCRATCHDIR
46
47set -u  # raise error if path if unset on machine
48echo "Paths: $ERA5_PATH $ERAI_PATH $SCRATCH"
49set +u
50
51GRID_DIR=./INIT
52
53#-----------------------------------------------------------------------------
54#Utilite du block suivant a re-examiner :
55#-----------------------------------------------------------------------------
56#L'utilisateur a maintenant des choix a faire en plus de mth* : type de guidage, et "rea"
57# Alors c'est plus facile d'editer&modifier le script, puis lancer avec ./era2gcm.sh, que de donner tous les params
58# TODO check w/ Adriana if we can remove those and put them as inline args (above)
59while (($# > 0))
60   do
61   case $1 in
62     "-h") cat <<........fin
63           ./era2gcm.sh [-mthini initial_month] [-mthend final_month] [-grid_dir directory_containing_grille_gcm.nc]
64........fin
65     exit ;;
66     "-grid_dir") GRID_DIR=$2 ; shift ; shift ;;
67     "-mthini") mth_i=$2 ; shift ; shift ;;
68     "-mthend") mth_f=$2 ; shift ; shift ;;
69     *) $0 -h ; exit 1
70   esac
71done
72#--Fin du bloc a examiner --------------------------------------------
73
74tmin=1
75resol=grilles_gcm.nc
76
77GRID_FI=${GRID_DIR}/${resol}
78if [ ! -f "$GRID_FI" ] ; then
79   echo "Le fichier $GRID_DIR/$resol est nécessaire; créer le fichier $GRID_FI avec grilles_gcm_netcdf.e"
80   exit 1
81fi
82mth=$mth_i
83
84
85#####################################################################
86#  LOOP ON MONTHS
87#####################################################################
88while (( mth <= mth_f )) ; do
89
90   echo "mth $mth"
91   mois=$(echo "$mth" | cut -c 5-)
92   an=$(echo "$mth" | cut -c -4)
93   ndays=( 31 28 31 30 31 30 31 31 30 31 30 31 )
94   months=( jan feb mar apr may jun jul aug sep oct nov dec )
95   if [ $(( an % 4 )) = 0 ] ; then ndays[1]=29 ; fi
96   imois=$(( ${mois#0} - 1 ))
97   month=${months[$imois]}
98   nday=${ndays[$imois]}
99   tmax=$(( nday * 4 ))
100   echo "PARAMETRES CALENDAIRES $imois $month $nday $tmax"
101
102
103   iip1=$(ncdump -h "$GRID_FI" | grep lonu | head -1 | awk ' { print $3 } ')
104   jjm=$(ncdump -h "$GRID_FI" | grep latv | head -1 | awk ' { print $3 } ')
105   (( jjp1 = jjm + 1 ))
106#   \rm t2.nc ua.nc va.nc sst.nc u.nc v.nc T.nc ts.nc
107
108#####################################################################
109# Choix de la periode temporelle
110#####################################################################
111
112   t0="l=$tmin"
113   t1tn="l=${tmin}:${tmax}"
114
115#####################################################################
116# Lien avec les fichiers netcdf contenant les d0 ECMWF
117#####################################################################
118   echo "-------- liens de telechargement a actualiser ----"
119   if [ "$rea" = "ERA5" ] ; then
120     if [[ $an -ge 2022 ]] ; then
121      ANA_DIR="$ERA5_PATH/NETCDF/GLOBAL_025/hourly"
122      suf="ap1e5.GLOBAL_025"
123     else
124      ANA_DIR="$ERA5_PATH/NETCDF/GLOBAL_025/4xdaily"
125      suf="aphe5.GLOBAL_025"
126     fi
127   elif [ "$rea" = "ERAI" ] ; then
128      ANA_DIR="$ERAI_PATH/NETCDF/GLOBAL_$resol_rea/4xdaily"
129      suf="aphei.GLOBAL_$resol_rea"
130   fi
131
132   if [ ! -d $ANA_DIR ] ; then echo Directory $ANA_DIR does not exist ; exit 1 ; fi
133
134   #################################################################################
135   # Loop on variables among u, v, ta, q
136   #################################################################################
137
138   for var in $vars ; do
139
140     case $var in
141         ta) filename=T.nc ;;
142         q) filename=hur.nc ;;
143         *) filename=$var.nc
144     esac
145     outd=GUIDE_${rea}/$an/$mois
146     out_file=$outd/$filename
147
148     if [ ! -f $out_file ] ; then
149        mkdir -p $outd
150        file_rea="$ANA_DIR/AN_PL/$an/$var.$an$mois.$suf.nc"
151
152        ############################################################################
153        # Automatically downloading reanalysis if needed
154        ############################################################################
155        if [ "$( echo $ERAI_PATH | grep 3DInputData )" != "" ] ; then
156             if [ ! -f $file_rea ] ; then
157                mkdir -p $( dirname $file_rea )
158                cd $( dirname $file_rea )
159                wget http://lmdz.lmd.jussieu.fr/pub/3DInputData/$( echo $file_rea | sed -e 's/^.*3DInputData//' )
160                cd -
161             fi
162         fi
163         ############################################################################
164         # Checking the avaibility of reanalysis native file
165         ############################################################################
166         if [ ! -f $file_rea ] ; then echo Reanalysis file $file_rea missing ; exit 1 ; fi
167
168         ############################################################################
169         # Special treatments
170         ############################################################################
171         if [ "$rea" = "ERAI" ] ; then
172             # original data in "short" should be changed to "float" for ferret
173             ncap2 -s $var'=float('$var')' $file_rea -O tmp_in.nc
174         elif [ "$rea" = "ERA5" -a $an -ge 2022 ] ; then
175             # Recent analysis available on a daily basis
176             cdo selhour,0,6,12,18 $file_rea -O tmp_in.nc
177         else
178             ln -sf $file_rea tmp_in.nc
179         fi
180
181         ############################################################################
182         # Dimensions of horizontal grid
183         ############################################################################
184         case $var in
185            v) imjm="i=1:$iip1,j=1:$jjm" ;;
186            *) imjm="i=1:$iip1,j=1:$jjp1"
187         esac
188
189         ############################################################################
190         # Grid to be used from grilles_gcm.nc
191         ############################################################################
192         case $var in
193            u|v) grid=grille_$var ;;
194            *) grid=grille_s
195         esac
196
197         ############################################################################
198         # Interpolating with ferret
199         ############################################################################
200         cat <<.........eod......... >| tmp.jnl
201         ! NB : Augmenter la memoire (plus de 512) peut faire planter
202         set memory/size=512
203         use "$GRID_FI"
204         use tmp_in.nc
205         define axis/t="1-${month}-${an}:00:00":"${nday}-${month}-${an}:18:00":6/units=hours thour
206         ! Pour regrid horizontal on utilise la variable grille_s(lonv,latu) du fichier grilles_gcm.nc
207         !! Alors il faut renommer la variable à la fin (ncrename), car le code cherche "UWND", "VWND".
208         save/clobber/file="tmp_out.nc" $var[d=2,gxy=${grid}[d=1],$imjm,$t0,gt=thour@asn]
209         repeat/$t1tn save/file="tmp_out.nc"/append $var[d=2,gxy=${grid}[d=1],$imjm,gt=thour@asn]
210.........eod.........
211
212         set +e
213         ferret -nojnl <<.........eod.........
214         go tmp.jnl
215         quit
216         fi
217.........eod.........
218         if [ $? != 0 ] ; then
219            echo Something went wrong when running ferret with script tmp.jnl :
220            cat tmp.jnl
221            echo On $PWD
222            exit 1
223         else
224            set -e
225            mv tmp_out.nc $out_file
226         fi
227
228        ############################################################################
229        # Changing variable names
230        ############################################################################
231         case $var in
232            u) out_var=UWND ;;
233            v) out_var=VWND ;;
234            r) out_var=RH ;;
235            ta) out_var=AIR
236         esac
237         #Ferret a ecrit $varu en majuscules, l'equivalent en bash est ${varu^^}
238         #   (Note : inversement, ${varu,,} passe $varu de majuscules en minuscules)
239         ncrename -v ${var^^},$out_var $out_file
240     fi
241   done
242
243
244   ############################################################################
245   # Updating month counter
246   ############################################################################
247   echo AN MTH $an $mois
248   (( mth = $mth + 1 ))
249   if [ $mois = 12 ] ; then
250      (( an = $an + 1 ))
251      mth=${an}01
252   fi
253
254done
255ln -sf GUIDE_$rea GUIDE
Note: See TracBrowser for help on using the repository browser.