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