123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #!/bin/bash
- set -u
- # This script takes EC-Earth outputs, reinterpolates them to the NEMO grid, and then generates BDY dta from it.
- # Author: C. Pelletier
- # Inclusive year range
- year_start=1985
- year_stop=2013
- # Input prefix (with folder) for input data files (in .tar format).
- in_prefix="/storepelican/dverfail/bsc/anom/hindcasts"
- # Name of experience
- name_exp="a3du"
- fc_num="fc00"
- # Frequency
- freq="1m"
- # Working folder where pre-interpolated datafiles will be put
- dest_folder="/storepelican/dverfail/nemo_bdy/bdydta"
- dest_prefix="ECEarth_${name_exp}_${fc_num}_${freq}_eORCA025-SO_BDYDTA_nbr1_"
- pwd=`pwd`
- # Python script for reformatting BDYDTA (final step)
- reformat_script="${pwd}/generate_new_bdy_dta_onefile.py"
- # min_lon, max_lon, min_lat, max_lat
- # To precut the input data prior to interpolation (not required, but less expensive if your source code is much bigger than the destination one, which is the case from global to the Southern Ocean.
- # Take a generous margin (4-5 nodes bigger than the destination grid limit)
- latlon_cut="-180,180,-90,-28"
- # # Script for converting EOS80 to TEOS-10 (look at the script comments for why it exists and what it does).
- # not needed for EC-Earth, which is already in TEOS-10
- # curr_dir=`pwd`
- # eos10_script="${curr_dir}/convert_eos10_new.py"
- # NEMO destination CDO grid description (see `cdo_get_griddes.sh`).
- dest_gridfile_t="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_T.grid"
- dest_gridfile_u="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_U.grid"
- dest_gridfile_v="/storepelican/pelletie/nemo_bdy/grids/eORCA025-SO_grid_V.grid"
- pid="$$"
- mkdir -p ${dest_folder}
- cd ${dest_folder}
- for((year=year_start;year<=year_stop;year++)); do
- # Loop over input years.
-
- module purge
- module load 2018b CDO NCO
- # 1) Extract T, S and ssh (T grid).
- tar -xvf ${in_prefix}/${fc_num}/MMO_${name_exp}_19841101_${fc_num}_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc
-
- cdo selname,thetao,so ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc tmp_pid${pid}.nc
- cdo selname,zos ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc tmp2_pid${pid}.nc
- cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
- rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_T_2D.nc
-
- # precut
- cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
- ncrename -v olevel,deptht tmp_pid${pid}.nc
- ncrename -d olevel,deptht tmp_pid${pid}.nc
-
- # remap
- cdo remapbil,${dest_gridfile_t} tmp_pid${pid}.nc tmp2_pid${pid}.nc
- cdo setmisstonn tmp2_pid${pid}.nc tmp_pid${pid}.nc
- module purge
- module load ELIC/0.1-foss-2018b-Python-3.6.6
- input_full=`readlink -f tmp_pid${pid}.nc`
- output_full="${dest_folder}/${dest_prefix}grid_T_y${year}.nc"
-
- python ${reformat_script} ${input_full} t ${output_full}
- module purge
- module load CDO NCO
-
- # 2) Extract u velocities.
- if [ "${freq}" == "1d" ]; then
-
- tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_2D.nc
- cdo selname,ubar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_2D.nc tmp2_pid${pid}.nc
- else
- # ubar is not stored in monthly outputs, so take it from daily and monmean
- tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_1d_${year}0101_${year}1231_opa_grid_U_2D.nc
- cdo selname,ubar ${name_exp}_1d_${year}0101_${year}1231_opa_grid_U_2D.nc tmp3_pid${pid}.nc
- cdo monmean tmp3_pid${pid}.nc tmp2_pid${pid}.nc
-
- fi
-
- cdo selname,uo ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc tmp_pid${pid}.nc
- cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
- rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_U_3D.nc ${name_exp}_??_${year}0101_${year}1231_opa_grid_U_2D.nc
-
- # precut
- cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
- ncap2 -O -s 'uobaroclinic = uo - ubar;' tmp_pid${pid}.nc tmp2_pid${pid}.nc
- ncks -x -v uo tmp2_pid${pid}.nc -O tmp_pid${pid}.nc
- ncrename -v ubar,uobarotropic tmp_pid${pid}.nc
- ncrename -v olevel,depthu -v olevel_bnds,depthu_bnds tmp_pid${pid}.nc
- ncatted -a bounds,depthu,o,c,"depthu_bnds" -a name,depthu,o,c,"depthu" tmp_pid${pid}.nc
- ncrename -d olevel,depthu tmp_pid${pid}.nc
- ncpdq -O -a time_counter,depthu,y,x tmp_pid${pid}.nc tmp2_pid${pid}.nc
-
- # remap
- cdo remapbil,${dest_gridfile_u} tmp2_pid${pid}.nc tmp_pid${pid}.nc
- cdo setmisstonn tmp_pid${pid}.nc tmp2_pid${pid}.nc
- module purge
- module load ELIC/0.1-foss-2018b-Python-3.6.6
- input_full=`readlink -f tmp2_pid${pid}.nc`
- output_full="${dest_folder}/${dest_prefix}grid_U_y${year}.nc"
-
- python ${reformat_script} ${input_full} u ${output_full}
- module purge
- module load CDO NCO
-
- # 3) Extract v velocities.
- if [ "${freq}" == "1d" ]; then
-
- tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_2D.nc
- cdo selname,vbar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_2D.nc tmp2_pid${pid}.nc
- else
- # vbar is not stored in monthly outputs, so take it from daily and monmean
- tar -xvf ${in_prefix}/${name_exp}/NEMO/MMO_${name_exp}_18500101_fc0_${year}0101-${year}1231.tar ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_1d_${year}0101_${year}1231_opa_grid_V_2D.nc
- cdo selname,vbar ${name_exp}_1d_${year}0101_${year}1231_opa_grid_V_2D.nc tmp3_pid${pid}.nc
- cdo monmean tmp3_pid${pid}.nc tmp2_pid${pid}.nc
-
- fi
-
- cdo selname,vo ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc tmp_pid${pid}.nc
- cdo merge tmp_pid${pid}.nc tmp2_pid${pid}.nc tmp3_pid${pid}.nc
- rm -f ${name_exp}_${freq}_${year}0101_${year}1231_opa_grid_V_3D.nc ${name_exp}_??_${year}0101_${year}1231_opa_grid_V_2D.nc
-
- # precut
- cdo -O sellonlatbox,${latlon_cut} tmp3_pid${pid}.nc tmp_pid${pid}.nc
- ncap2 -O -s 'vobaroclinic = vo - vbar;' tmp_pid${pid}.nc tmp2_pid${pid}.nc
- ncks -x -v vo tmp2_pid${pid}.nc -O tmp_pid${pid}.nc
- ncrename -v vbar,vobarotropic tmp_pid${pid}.nc
- ncrename -v olevel,depthv -v olevel_bnds,depthv_bnds tmp_pid${pid}.nc
- ncatted -a bounds,depthv,o,c,"depthv_bnds" -a name,depthv,o,c,"depthv" tmp_pid${pid}.nc
- ncrename -d olevel,depthv tmp_pid${pid}.nc
- ncpdq -O -a time_counter,depthv,y,x tmp_pid${pid}.nc tmp2_pid${pid}.nc
-
- # remap
- cdo remapbil,${dest_gridfile_v} tmp2_pid${pid}.nc tmp_pid${pid}.nc
- cdo setmisstonn tmp_pid${pid}.nc tmp2_pid${pid}.nc
- module purge
- module load ELIC/0.1-foss-2018b-Python-3.6.6
- input_full=`readlink -f tmp2_pid${pid}.nc`
- output_full="${dest_folder}/${dest_prefix}grid_V_y${year}.nc"
-
- python ${reformat_script} ${input_full} v ${output_full}
- module purge
- module load CDO NCO
-
- done
- rm -rf ./*pid${pid}*
|