#!/bin/bash
#
#-----------------------------------------------------------------------------#
#           Group on Data Assimilation Development - GDAD/CPTEC/INPE          #
#-----------------------------------------------------------------------------#
#
#BOP
#
# !SCRIPT:  
#
# !DESCRIPTION:
#
# !CALLING SEQUENCE:
#     
#        ./runDAV4.4.sh EXP LABELI CIC
#
#           o EXP      :   Nome do experimento, ex. SAN
#           o LABELI   :   Data da analise (YYYYMMDDHH), ex. 2021010100
#           o LABELS   :   Data do inicio do ciclo (YYYYMMDDHH), ex. 2021010100
#           o CIC      :   1: Com ciclo - 0: Sem ciclo
#           o INIT     :   Offset em minutos  
#
# !REVISION HISTORY:
#
# 30 Sept 2025 - Vendrasco, E. P. - Initial Version based on LMS
# 
# !REMARKS:
#
#EOP
#-----------------------------------------------------------------------------#
#BOC

function usage(){
   sed -n '/^# !CALLING SEQUENCE:/,/^# !/{p}' runDAV4.4.sh | head -n 6
}

#
# Verificando argumentos de entrada
#

if  [ $# -ne 5 ] && [ $# -ne 6 ] ; then
   usage
   exit 1
fi

EXP=${1}
LABELI=${2}
LABELS=${3}
CIC=${4}
INIT=${5}
pid=${6}

start_date=${LABELI:0:4}-${LABELI:4:2}-${LABELI:6:2}_${LABELI:8:2}:00:00

LABELF=${LABELI}
LABELI_INIT=`date -d "${LABELI:0:8} ${LABELI:8:4} ${INIT} minutes ago" '+%Y%m%d%H%M'`

printf "\nAnalisys Time: ${LABELI}\n"

BASEDIR=${HOMEBE}/Opera
RUNDIR=${BASEDIR}/run
GFSDIR=${BASEDIR}/gfsdata
EXEDIR=${BASEDIR}/bin/V4.4
TBLDIR=${BASEDIR}/tables/V4.4
NMLDIR=${BASEDIR}/namelists
SCRDIR=${BASEDIR}/scripts
GEODIR=${BASEDIR}/geog/V4.4
DADDIR=${BASEDIR}/dadata
CRTDIR=${BASEDIR}/crtm2/V4.4
OBRADARDIR=${BASEDIR}/dadata/ob/radar

EXPDIR=${RUNDIR}/${EXP}/${LABELI}/runwda
EXPDIR_INIT=${RUNDIR}/${EXP}/${LABELI_INIT}
LOGDIR=${EXPDIR}/logs

NETCDF=/home/ubuntu/Packages/Libraries/supplib/netcdf4
HDF5=/home/ubuntu/Packages/Libraries/supplib/hdf5
 
export LD_LIBRARY_PATH=$NETCDF/lib:$HDF5/lib:$LD_LIBRARY_PATH

DAFDIR=${EXPDIR}/dafiles

if [ ! -e ${DAFDIR} ]; then
   mkdir -p ${DAFDIR}
fi

runradar="T"
hwindow=180
updateNET=0
updateNET_hour=6

if [ ${EXP} == "AV" ]; then
  befile="be.dat.cv7_x480y380z42_2km"
 elif [ ${EXP} == "AV" ]; then
  befile="be.dat.cv7_x480y380z42_2km"
 else
  echo "BE for experiment ${EXP} does not exist."
  exit
fi

ANADATE=$(date    --date "${LABELI:0:8} ${LABELI:8:4}        0 minutes     " +%Y-%m-%d_%H:%M:00.0000)
WINDATEmax=$(date --date "${LABELI:0:8} ${LABELI:8:4} $hwindow minutes     " +%Y-%m-%d_%H:%M:00.0000)
WINDATEmin=$(date --date "${LABELI:0:8} ${LABELI:8:4} $hwindow minutes ago " +%Y-%m-%d_%H:%M:00.0000)

HH=${LABELI:8:2}

BUFRFiles="gfs.t${HH}z.prepbufr.nr gfs.t${HH}z.satwnd.tm00.bufr_d gfs.t${HH}z.1bamua.tm00.bufr_d gfs.t${HH}z.1bhrs4.tm00.bufr_d gfs.t${HH}z.1bmhs.tm00.bufr_d gfs.t${HH}z.gpsro.tm00.bufr_d.nr gfs.t${HH}z.gpsipw.tm00.bufr_d.nr" 
BUFRFiles="gdas.t${HH}z.prepbufr.nr gdas.t${HH}z.satwnd.tm00.bufr_d gdas.t${HH}z.1bamua.tm00.bufr_d gdas.t${HH}z.1bhrs4.tm00.bufr_d gdas.t${HH}z.1bmhs.tm00.bufr_d gdas.t${HH}z.gpsro.tm00.bufr_d.nr gdas.t${HH}z.gpsipw.tm00.bufr_d.nr" 
BUFRFiles="gdas.t18z.prepbufr.nr" 

cd ${EXPDIR}

ln -sf ${RUNDIR}/${EXP}/static/geo*.nc       ${EXPDIR}
ln -sf ${TBLDIR}/co2_trans                   ${EXPDIR}/co2_trans
ln -sf ${TBLDIR}/ETAMPNEW_DATA               ${EXPDIR}/ETAMPNEW_DATA
ln -sf ${TBLDIR}/ETAMPNEW_DATA.expanded_rain ${EXPDIR}/ETAMPNEW_DATA.expanded_rain
ln -sf ${TBLDIR}/grib2map.tbl                ${EXPDIR}/grib2map.tbl
ln -sf ${TBLDIR}/gribmap.txt                 ${EXPDIR}/gribmap.txt
ln -sf ${TBLDIR}/RRTM*                       ${EXPDIR}
ln -sf ${TBLDIR}/aerosol*                    ${EXPDIR}
ln -sf ${TBLDIR}/ozone*                      ${EXPDIR} 
ln -sf ${TBLDIR}/tr49t67                     ${EXPDIR}/tr49t67
ln -sf ${TBLDIR}/tr49t85                     ${EXPDIR}/tr49t85
ln -sf ${TBLDIR}/tr67t85                     ${EXPDIR}/tr67t85
ln -sf ${TBLDIR}/VEGPARM.TBL                 ${EXPDIR}/VEGPARM.TBL
ln -sf ${TBLDIR}/METGRID.TBL                 ${EXPDIR}/METGRID.TBL
ln -sf ${TBLDIR}/GENPARM.TBL                 ${EXPDIR}/GENPARM.TBL
ln -sf ${TBLDIR}/LANDUSE.TBL                 ${EXPDIR}/LANDUSE.TBL
ln -sf ${TBLDIR}/MPTABLE.TBL                 ${EXPDIR}/MPTABLE.TBL
ln -sf ${TBLDIR}/SOILPARM.TBL                ${EXPDIR}/SOILPARM.TBL
ln -sf ${TBLDIR}/CAMtr_volume_mixing_ratio   ${EXPDIR}/CAMtr_volume_mixing_ratio

ln -sf ${TBLDIR}/Vtable.GFS                  ${EXPDIR}/Vtable.GFS
ln -sf ${TBLDIR}/Vtable.SST                  ${EXPDIR}/Vtable.SST

inputfile=wrf_gsi_input_d01_${LABELI:0:4}-${LABELI:4:2}-${LABELI:6:2}_${LABELI:8:2}:${LABELI:10:2}:00

if [ $CIC -eq 1 -a ! -s ${EXPDIR_INIT}/runwrf/$inputfile ]; then
 echo "Arquivos ${EXPDIR_INIT}/runwrf/$inputfile não existe"
fi

#Not fully implemented
if [ $CIC -eq 1 -a $updateNET -eq 1 -a ${LABELI:8:2} -eq ${updateNET_hour} ]; then
   cp -v ${EXPDIR_INIT}/runwrf/$inputfile           ${EXPDIR}/filefromcycle
   cp -v ${RUNDIR}/${EXP}/${LABELI}/runwps/wrfinput_d01              ${EXPDIR}/filetocycle
  
   echo "Updating NETCDF..."
   /home/ubuntu/Opera/bin/change_netcdf_var.exe

   ln -sf ${EXPDIR}/filetocycle                     ${EXPDIR}/fg
   echo "WRFDA FG From Pre-Processamento (Real). UpdateNET = 1"
fi  

ln -sf ${DADDIR}/be/$befile                  ${EXPDIR}/be.dat  

sed -e "s,#EXPDIR#,${EXPDIR},g"    ${NMLDIR}/namelist.updatebcl > ${EXPDIR}/parame.in

ln -sf ${TBLDIR}/radiance_info      ${EXPDIR}
ln -sf ${CRTDIR}/crtm_coeffs_2.3.0  ${EXPDIR}/crtm_coeffs

ifi=0
for BUFRFile in $(echo ${BUFRFiles}); do
 bufrname=$(echo $BUFRFile | cut -f3 -d.)
 if [ ${bufrname} == "prepbufr" ]; then bufrname="ob"    ; fi
 if [ ${bufrname} == "1bamua"   ]; then bufrname="amsua" ; fi
 if [ ${bufrname} == "1bhrs4"   ]; then bufrname="hirs4" ; fi
 if [ ${bufrname} == "1bmhs"    ]; then bufrname="mhs"   ; fi

 if test -s ${DADDIR}/ob/${LABELI:0:4}/${LABELI:4:2}/${LABELI:6:2}/$BUFRFile ; then
   cp ${DADDIR}/ob/${LABELI:0:4}/${LABELI:4:2}/${LABELI:6:2}/$BUFRFile             ${EXPDIR}/${bufrname}.bufr
   (( ifi = ifi + 1 ))
 fi  
done

if [ $ifi -gt 0 ]; then
  echo ""
  echo -e "\033[33;1m       >  Dados encontrados! (${DADDIR}/ob/${LABELI:0:4}/${LABELI:4:2}/${LABELI:6:2})\033[m"
  echo ""
fi

if [ $runradar == "T" ]; then
# observacao do radar
#-------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------
# Verificando a existencia dos dados dos radares de Sao Roque e do Pico do Couto. A busca e' feita no 
# intervalo de tempo de $hwindow minutos e dependendo da existencia dos arquivos eles podem ser 
# assimilados simultaneamente ou apenas um deles.

radares="Manaus"

radcount=0
cat /dev/null > ${EXPDIR}/ob.radar
for rd in `echo $radares`; do

 echo ""
 echo  -e "\033[33;1m       >  Procurando os dados do radar ${rd}... \033[m"

 k=-1
 while : ; do 
  let k++

  dataser=$(date --date "${LABELI:0:8} ${LABELI:8:4} $k minutes" +%Y%m%d%H%M)'00'
  arqradar=${dataser}_ob.radar

  if test -s ${OBRADARDIR}/$rd/${arqradar} ; then
   echo ""
   echo -e "\033[33;1m       >  Dados do radar $rd encontrados! (OBRADARDIR/$rd/${arqradar})\033[m"
   let radcount++ 
   eval radar$rd="ok"       
   eval arq$rd=${arqradar}
   cp ${OBRADARDIR}/$rd/${arqradar}                         ${EXPDIR}
   mv ${EXPDIR}/${arqradar} ${EXPDIR}/${rd}_${arqradar}
   sed '1,2d' ${EXPDIR}/${rd}_${arqradar} >> ${EXPDIR}/ob.radar
   break
  fi

  dataser=$(date --date "${LABELI:0:8} ${LABELI:8:4} $k minutes ago" +%Y%m%d%H%M)'00'
  arqradar=${dataser}_ob.radar

  if test -s ${OBRADARDIR}/$rd/${arqradar} ; then 
   echo ""
   echo -e "\033[33;1m       >  Dados do radar $rd encontrados! (OBRADARDIR/$rd/${arqradar})\033[m"
   let radcount++ 
   eval radar$rd="ok"       
   eval arq$rd=${arqradar}
   cp ${OBRADARDIR}/$rd/${arqradar}                         ${EXPDIR}
   mv ${EXPDIR}/${arqradar} ${EXPDIR}/${rd}_${arqradar}
   sed '1,2d' ${EXPDIR}/${rd}_${arqradar} >> ${EXPDIR}/ob.radar
   break
  fi
   
  if [ $k -ge $hwindow ]; then break ; fi

 done

done

if [ $radcount -gt 0 ]; then
 totrad="#-----------------#"
 sed -e '1i\' -e "$totrad" ${EXPDIR}/ob.radar > ${EXPDIR}/tmp.radar
 mv ${EXPDIR}/tmp.radar ${EXPDIR}/ob.radar
 totrad="Total Number =  $radcount"
 sed -e '1i\' -e "$totrad" ${EXPDIR}/ob.radar > ${EXPDIR}/tmp.radar
 mv ${EXPDIR}/tmp.radar ${EXPDIR}/ob.radar
 runradar=T
 (( ifi = ifi + 1 ))
else
  echo
  echo -e "\033[33;1m       >  Dados do Radar nao existem! Nao sera' realizada assimilacao de dados de radar! \033[m"
  runradar=F
fi
#-------------------------------------------------------------------------------------------------------
#-------------------------------------------------------------------------------------------------------
fi

if [ $ifi -eq 0 ]; then
  echo
  echo -e "\033[31;1m       >  Dados nao encontrados para serem assimilados! Saindo! \033[m"
  exit
fi

sed -e "s,#IYEAR#,${LABELI:0:4},g;s,#IMON#,${LABELI:4:2},g;s,#IDAY#,${LABELI:6:2},g; \
	s,#IHOU#,${LABELI:8:2},g;s,#IMIN#,${LABELI:10:2},g;s,#FYEAR#,${LABELF:0:4},g;s,#FMON#,${LABELF:4:2},g; \
	s,#FDAY#,${LABELF:6:2},g;s,#FHOU#,${LABELF:8:2},g;s,#FMIN#,${LABELF:10:2},g;s,#ANADATE#,${ANADATE},g; \
	s,#WINDATEmin#,${WINDATEmin},g;s,#WINDATEmax#,${WINDATEmax},g; \
        s,#RADAROBS#,${runradar},g" \
	 ${NMLDIR}/namelist.input.wrfda.${EXP} > ${EXPDIR}/namelist.input

NTASKS=128
JNAME="DA"
cat > daMP.slurm <<EOF0
#!/bin/bash

#SBATCH --time=00:30:00
#SBATCH --ntasks=$NTASKS
#SBATCH --job-name=$JNAME
#SBATCH --partition=batch

ulimit -s unlimited

cd ${EXPDIR}

if [ $CIC -eq 1 ]; then
  ln -sf ${EXPDIR_INIT}/runwrf/$inputfile           ${EXPDIR}/fg
  echo "WRFDA FG From Previous Run."
 else
  ln -sf ${RUNDIR}/${EXP}/${LABELI}/runwps/wrfinput_d01              ${EXPDIR}/fg
  echo "WRFDA FG From Pre-Processamento (Real)."  
fi
if [ ${LABELI} -ne ${LABELS} ]; then
 cp  ${RUNDIR}/${EXP}/${LABELS}/runwps/wrfbdy_d01    ${RUNDIR}/${EXP}/${LABELI}/runwps
fi
cp  ${RUNDIR}/${EXP}/${LABELI}/runwps/wrfbdy_d01     ${EXPDIR}

export LD_LIBRARY_PATH=$NETCDF/lib:$HDF5/lib:$GRIB2/lib:$LD_LIBRARY_PATH

echo  "STARTING AT \`date\` "
Start=\`date +%s.%N\`
echo \$Start >  ${EXPDIR}/Timing.wrfda

date

export OMP_NUM_THREADS=1
time mpirun -np ${NTASKS} ${EXEDIR}/daMP.exe &> ${EXPDIR}/logs/log.wrfda

wait

End=\`date +%s.%N\`
echo  "FINISHED AT \`date\` "
echo \$End   >> ${EXPDIR}/Timing.wrfda
echo \$Start \$End | awk '{print \$2 - \$1" sec"}' >>  ${EXPDIR}/Timing.wrfda

grep "WRF-Var completed successfully" rsl.error.0000

if [ \$? -ne 0 ]; then
   echo "  BUMMER: WRFDA failed for some yet unknown reason."
   exit 
fi
   echo "  ##################################"
   echo "  ### WRFDA completed - \$(date) ####"
   echo "  ##################################"

   #cp rsl.error.0000       ${EXPDIR}/runwda/rsl.error.0000_wrfda
   #cp rsl.out.0000         ${EXPDIR}/runwda/rsl.out.0000_wrfda
   #mv Timing.wrfda         ${EXPDIR}/logs/Timing.wrfda
   #mv rsl.*                $DAFDIR
   #mv rej_obs_conv_*       $DAFDIR
   #mv unpert_obs*          $DAFDIR
   #mv gts_omb_oma*         $DAFDIR
   #mv radar_omb_oma*       $DAFDIR
   #cd                      $DAFDIR
   #tar -zcvf dafiles.tgz *.????
   #rm -f *.????
   #cd -
   #mv namelist.output.da namelist.input analysis_increments buddy_check check_max_iv cost_fn grad_fn jo statistics qcstat_conv_01 ${EXPDIR}/runwda

   
date
exit 0
EOF0

chmod +x daMP.slurm

cat > updatebcl.sh <<EOF1
#!/bin/bash
#SBATCH --time=00:05:00
#SBATCH --ntasks=1
#SBATCH --job-name=update_bc
#SBATCH --partition=batch

ulimit -s unlimited

export LD_LIBRARY_PATH=$NETCDF/lib:$HDF5/lib:$GRIB2/lib:$LD_LIBRARY_PATH

cd ${EXPDIR}

sed -e "s,#EXPDIR#,${EXPDIR},g"  ${NMLDIR}/namelist.updatebcl > ${EXPDIR}/parame.in

echo  "STARTING AT \`date\` "
Start=\`date +%s.%N\`
echo \$Start >  ${EXPDIR}/Timing.updatebcl

date

time mpirun -np 1 ${EXEDIR}/da_update_bc.exe &> ${EXPDIR}/logs/log.updatebcl
wait

End=\`date +%s.%N\`
echo  "FINISHED AT \`date\` "
echo \$End   >> ${EXPDIR}/Timing.updatebcl
echo \$Start \$End | awk '{print \$2 - \$1" sec"}' >>  ${EXPDIR}/Timing.updatebcl

grep "Update_bc completed successfully" ${LOGDIR}/log.updatebcl >& /dev/null
if [ $? -ne 0 ];  then
   echo "ERROR, update lateral bdy failed..."
   exit 
fi

#mv wrfvar_output        ${EXPDIR}/runwda
#mv wrfbdy*              ${EXPDIR}/runwda
#mv Timing.updatebcl     ${EXPDIR}/runwda
#mv parame.in            ${EXPDIR}/runwda
#mv fort.11 fort.12      ${EXPDIR}/runwda

wait

date
exit 0
EOF1

chmod +x updatebcl.sh

if [ 'x'$pid == 'x' ]; then
  pidi=$(sbatch daMP.slurm | awk '{print $NF}' | tail  -1)
 else
  pidi=$(sbatch --dependency=afterok:${pid} daMP.slurm | awk '{print $NF}' | tail  -1)
fi

wait

sbatch --dependency=afterok:${pidi} ./updatebcl.sh

exit 0
#EOF

