source: BOL/LMDZ_Setup_amaury/era2gcm_tuto.sh @ 4999

Last change on this file since 4999 was 4993, checked in by abarral, 3 months ago

add ecrad physics check
change ecrad data path
update lmdz_env for adastra
update DEF/namelist_ecrad

File size: 9.7 KB
Line 
1#!/bin/bash
2
3#-----------------------------------------------------------------------------
4#
5#  Script for interpolating monthly ERA* files to the LMDZ grid;
6#  it creates the folder structure required by the LMDZ_Setup scripts
7#
8#  NB: for "cleanest" guiding, the 1st step of the next month should be added at the end of each month.
9#    If you need such precision, you should use the scripts here  - AND adjust "ERADIR" in script_SIMU !
10#    wget http://forge.ipsl.jussieu.fr/igcmg/browser/TOOLS/INTERP_NUDGE
11#      documented on LMDZpedia (search for "Guidage" )
12#
13#-----------------------------------------------------------------------------
14# Requires : netcdf, ferret, nco, cdo
15#-----------------------------------------------------------------------------
16#@JZ module load netcdf/4.7.2-mpi-cuda ferret nco cdo
17#
18# Check&modify section "User choices", then run the script with ./era2gcm.sh
19#-----------------------------------------------------------------------------
20# ATTENTION : VERIFIEZ
21#  --> l'accès (repositoire ou telechargement) a la réanalyse ERA souhaitée (variable ANA_DIR)
22#    Contact pour demander acces aux fichiers sur Jean-Zay :
23#        Sophie Bouffiès-Cloché, IPSL : Sophie.Bouffies-Cloche@ipsl.fr
24
25#  --> la disponibilite des fichiers pour la periode souhaitee (variables file*)
26#-----------------------------------------------------------------------------
27
28#------------------------------------------------
29# User choices
30#------------------------------------------------
31# Periode :
32mth_i=202201
33mth_f=202201
34#
35# Guidage en vent(u&v) et/ou temperature, humidite
36guide_uv="y"
37guide_t="n"
38guide_q="n"
39#
40# Choix des fichiers de guidage ("rea"nalyses) : ERA5, ERAI, OPERA
41rea="ERA5"
42#------------------------------------------------
43
44#@JZ ERA5_PATH="/gpfsstore/rech/psl/rpsl376/ergon/ERA5/"
45#@JZ ERAI_PATH="/gpfsstore/rech/psl/rpsl376/ergon/ERAI/"
46#@ADS SCRATCH=$SCRATCHDIR
47
48set -u  # raise error if path if unset on machine
49echo "Paths: $ERA5_PATH $ERAI_PATH $SCRATCH"
50set +u
51
52GRID_DIR=./INIT
53
54#-----------------------------------------------------------------------------
55#Utilite du block suivant a re-examiner :
56#-----------------------------------------------------------------------------
57#L'utilisateur a maintenant des choix a faire en plus de mth* : type de guidage, et "rea"
58# Alors c'est plus facile d'editer&modifier le script, puis lancer avec ./era2gcm.sh, que de donner tous les params
59# TODO check w/ Adriana if we can remove those and put them as inline args (above)
60while (($# > 0))
61   do
62   case $1 in
63     "-h") cat <<........fin
64           ./era2gcm.sh [-mthini initial_month] [-mthend final_month] [-grid_dir directory_containing_grille_gcm.nc]
65........fin
66     exit ;;
67     "-grille_dir") GRID_DIR=$2 ; shift ; shift ;;
68     "-mthini") mth_i=$2 ; shift ; shift ;;
69     "-mthend") mth_f=$2 ; shift ; shift ;;
70     *) $0 -h ; exit 1
71   esac
72done
73#--Fin du bloc a examiner --------------------------------------------
74
75tmin=1
76resol=grilles_gcm.nc
77
78GRID_FI=${GRID_DIR}/${resol}
79if [ ! -f "$GRID_FI" ] ; then
80   echo "Le fichier $GRID_DIR/$resol est nécessaire; créer le fichier $GRID_FI avec grilles_gcm_netcdf.e"
81   exit 1
82fi
83mth=$mth_i
84
85
86#####################################################################
87while (( mth <= mth_f )) ; do
88#####################################################################
89   echo "mth $mth"
90   mois=$(echo "$mth" | cut -c 5-)
91   an=$(echo "$mth" | cut -c -4)
92   ndays=( 31 28 31 30 31 30 31 31 30 31 30 31 )
93   months=( jan feb mar apr may jun jul aug sep oct nov dec )
94   if [ $(( an % 4 )) = 0 ] ; then ndays[1]=29 ; fi
95   imois=$(( ${mois#0} - 1 ))
96   month=${months[$imois]}
97   nday=${ndays[$imois]}
98   tmax=$(( nday * 4 ))
99   echo "PARAMETRES CALENDAIRES $imois $month $nday $tmax"
100
101
102   iip1=$(ncdump -h "$GRID_FI" | grep lonu | head -1 | awk ' { print $3 } ')
103   jjm=$(ncdump -h "$GRID_FI" | grep latv | head -1 | awk ' { print $3 } ')
104   (( jjp1 = jjm + 1 ))
105#   \rm t2.nc ua.nc va.nc sst.nc u.nc v.nc T.nc ts.nc
106
107#####################################################################
108# Choix de la periode temporelle
109#####################################################################
110
111   t0="l=$tmin"
112   t1tn="l=${tmin}:${tmax}"
113
114#####################################################################
115# Lien avec les fichiers netcdf contenant les d0 ECMWF
116#####################################################################
117   echo "-------- liens de telechargement a actualiser ----"
118   if [ "$rea" = "ERA5" ] ; then
119     if [[ $an -ge 2022 ]] ; then
120      ANA_DIR="$ERA5_PATH/NETCDF/GLOBAL_025/hourly"
121      suf="ap1e5.GLOBAL_025"
122     else
123      ANA_DIR="$ERA5_PATH/NETCDF/GLOBAL_025/4xdaily"
124      suf="aphe5.GLOBAL_025"
125     fi
126   elif [ "$rea" = "ERAI" ] ; then
127      ANA_DIR="$ERAI_PATH/NETCDF/GLOBAL_1125/4xdaily"
128      suf="aphei.GLOBAL_1125"
129   fi
130
131varu=u
132varv=v
133vart=ta # peut etre parfois juste "t"
134varq=q
135if [ "$rea" = "ERA5" ] ; then varq=r ; fi
136#varp=msl
137
138if [ "$rea" = "ERAI" ] ; then
139  # variables en format "short" doivent etre transformees en "float" via NCO
140  # This is done here with ncap2 ; also possible: "ncpdq --overwrite --unpack fin.nc fout.nc"
141  fushort="$ANA_DIR/AN_PL/$an/u.$an$mois.$suf.nc"
142  fvshort="$ANA_DIR/AN_PL/$an/v.$an$mois.$suf.nc"
143  ftshort="$ANA_DIR/AN_PL/$an/ta.$an$mois.$suf.nc"
144  fqshort="$ANA_DIR/AN_PL/$an/r.$an$mois.$suf.nc"
145  fileu="$SCRATCH/u.$an$mois.$suf.nc"
146  filev="$SCRATCH/v.$an$mois.$suf.nc"
147  filet="$SCRATCH/ta.$an$mois.$suf.nc"
148  fileq="$SCRATCH/r.$an$mois.$suf.nc"
149  if [ "$guide_uv" = "y" ] ; then
150    ncap2 -s 'u=float(u)' $fushort $fileu
151    ncap2 -s 'v=float(v)' $fvshort $filev
152  fi
153  if [ "$guide_t" = "y" ] ; then ncap2 -s 'ta=float(ta)' $ftshort $filet ; fi
154  if [ "$guide_q" = "y" ] ; then ncap2 -s 'q=float(q)' $fqshort $fileq ; fi
155elif [ "$rea" = "ERA5" -a $an -ge 2022 ] ; then
156  echo Extract 0,6,12,18 hours from ERA5 hourly files
157  fu1h="$ANA_DIR/AN_PL/$an/u.$an$mois.$suf.nc"
158  fv1h="$ANA_DIR/AN_PL/$an/v.$an$mois.$suf.nc"
159  ft1h="$ANA_DIR/AN_PL/$an/ta.$an$mois.$suf.nc"
160  fq1h="$ANA_DIR/AN_PL/$an/r.$an$mois.$suf.nc"
161  fileu="$SCRATCH/u.$an$mois.$suf.nc"
162  filev="$SCRATCH/v.$an$mois.$suf.nc"
163  filet="$SCRATCH/ta.$an$mois.$suf.nc"
164  fileq="$SCRATCH/r.$an$mois.$suf.nc"
165  if [ "$guide_uv" = "y" ] ; then 
166    cdo selhour,0,6,12,18 $fu1h $fileu
167    cdo selhour,0,6,12,18 $fv1h $filev
168  fi
169  if [ "$guide_t" = "y" ] ; then cdo selhour,0,6,12,18 $ft1h $filet ; fi
170  if [ "$guide_q" = "y" ] ; then cdo selhour,0,6,12,18 $fq1h $fileq ; fi
171else 
172 fileu="$ANA_DIR/AN_PL/$an/u.$an$mois.$suf.nc"
173 filev="$ANA_DIR/AN_PL/$an/v.$an$mois.$suf.nc"
174 filet="$ANA_DIR/AN_PL/$an/ta.$an$mois.$suf.nc"
175 fileq="$ANA_DIR/AN_PL/$an/r.$an$mois.$suf.nc"
176fi
177
178# verifier disponibilite des fichiers
179if [ "$guide_uv" = "y" ] ; then  ls $fileu ; ls $filev ; fi
180if [ "$guide_t" = "y" ] ; then  ls $filet ; fi
181if [ "$guide_q" = "y" ] ; then  ls $fileq ; fi
182
183outd=GUIDE_${rea}/$an/$mois
184mkdir -p $outd
185
186# effacer lien vers repertoire des vents ERA interpoles (utilise dans script_SIMU) s'il existe deja
187# recreer lien vers le repertoire "rea" choisi
188# NB : si GUIDE existe en tant que repertoire, non pas comme lien, il n'est pas affecte
189rm -f GUIDE
190ln -s GUIDE_${rea} GUIDE
191
192ij="i=1:$iip1,j=1:$jjp1"
193ijm="i=1:$iip1,j=1:$jjm"
194
195###################################################################3
196# scripts ferret pour interpolation
197###################################################################3
198
199# --- guide uv ---
200
201if [ "$guide_uv" = "y" ] ; then
202
203
204cat << eod >| tmp_uv.jnl
205! NB : Augmenter la memoire (plus de 512) peut faire planter
206set memory/size=512
207
208use "$GRID_FI"
209use "$fileu"
210use "$filev"
211
212define axis/t="1-${month}-${an}:00:00":"${nday}-${month}-${an}:18:00":6/units=hours thour
213! Pour regrid horizontal on utilise la variable grille_s(lonv,latu) du fichier grilles_gcm.nc
214
215
216!! ATTENTION : pour ecrire le fichier en simple, non pas double precision :
217!! on utilise directement $varu = "float" dans le fichier d'origine (non pas une variable definie avec "let" dans ferret)
218!! Alors il faut renommer la variable à la fin (ncrename), car le code cherche "UWND", "VWND".
219save/clobber/file="$outd/u.nc" $varu[d=2,gxy=grille_u[d=1],$ij,$t0,gt=thour@asn]
220repeat/$t1tn save/file="$outd/u.nc"/append $varu[d=2,gxy=grille_u[d=1],$ij,gt=thour@asn]
221save/clobber/file="$outd/v.nc" $varv[d=3,gxy=grille_v[d=1],$ijm,$t0,gt=thour@asn]
222repeat/$t1tn save/file="$outd/v.nc"/append $varv[d=3,gxy=grille_v[d=1],$ijm,gt=thour@asn]
223
224eod
225
226ferret -nojnl <<eod
227go tmp_uv.jnl
228quit
229eod
230#Ferret a ecrit $varu en majuscules, l'equivalent en bash est ${varu^^}
231#   (Note : inversement, ${varu,,} passe $varu de majuscules en minuscules)
232ncrename -v ${varu^^},UWND $outd/u.nc
233ncrename -v ${varv^^},VWND $outd/v.nc
234
235fi  # ------- fin guide_uv --------
236
237# --- guide_t  ---
238
239if [ "$guide_t" = "y" ] ; then
240
241cat <<eod>| tmp_t.jnl
242set memory/size=512
243
244use "$GRID_FI"
245use "$filet"
246
247define axis/t="1-${month}-${an}:00:00":"${nday}-${month}-${an}:18:00":6/units=hours thour
248
249save/clobber/file="$outd/T.nc" $vart[d=2,gxy=grille_s[d=1],$ij,$t0,gt=thour@asn]
250repeat/$t1tn save/file="$outd/T.nc"/append $vart[d=2,gxy=grille_s[d=1],$ij,gt=thour@asn]
251eod
252
253ferret -nojnl <<eod
254go tmp_t.jnl
255quit
256eod
257ncrename -v ${vart^^},AIR $outd/T.nc
258
259fi  # ------- fin guide_t --------
260
261# --- guide_q  ---
262
263if [ "$guide_q" = "y" ] ; then
264
265cat <<eod>| tmp_q.jnl
266set memory/size=512
267
268use "$GRID_FI"
269use "$fileq"
270
271define axis/t="1-${month}-${an}:00:00":"${nday}-${month}-${an}:18:00":6/units=hours thour
272
273save/clobber/file="$outd/hur.nc" $varq[d=2,gxy=grille_s[d=1],$ij,$t0,gt=thour@asn]
274repeat/$t1tn save/file="$outd/hur.nc"/append $varq[d=2,gxy=grille_s[d=1],$ij,gt=thour@asn]
275eod
276
277ferret -nojnl <<eod
278go tmp_q.jnl
279quit
280eod
281ncrename -v ${varq^^},RH $outd/hur.nc
282
283fi  # ------- fin guide_q --------
284
285
286echo AN MTH $an $mois
287(( mth = $mth + 1 ))
288if [ $mois = 12 ] ; then
289   (( an = $an + 1 ))
290   mth=${an}01
291fi
292
293done
Note: See TracBrowser for help on using the repository browser.