#!/bin/bash
#
#-----------------------------------------------------------------------------#
#           Group on Data Assimilation Development - GDAD/CPTEC/INPE          #
#-----------------------------------------------------------------------------#
#
#BOP
#
# !SCRIPT:  
#
# !DESCRIPTION:
#
# !CALLING SEQUENCE:
#     
#        ./runPreV4.4.sh EXP LABELI FCST num_dom
#
#           o EXP     :   Nome do experimento, ex. SAN
#           o LABELI  :   Data inicial (YYYYMMDDHHMM), ex. 202101010000
#           o FCST    :   Tempo de previsao, em horas (ex. 24 [horas])
#           o num_dom :   Quantidade de dominios, ex. 1
#           o INTSEC  :   Intervalo em segundos para a interpolação do contorno (namelist.wps)
#
# !REVISION HISTORY:
#
# 30 Sept 2025 - Vendrasco, E. P. - Initial Version based on LMS
# 
# !REMARKS:
#
#EOP
#-----------------------------------------------------------------------------#
#BOC

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

function diffdate(){

 di=${1}
 df=${2}

 si=$(date --date "${di:0:8} ${di:8:2}:${di:10:2}:${di:12:2}" +%s)
 sf=$(date --date "${df:0:8} ${df:8:2}:${df:10:2}:${df:12:2}" +%s)

 (( ddhoras = (sf - si )/3600 ))
 (( ddminutos = ( (sf - si ) - horas*3600 )/60 ))
 (( ddsegundos = (sf - si ) - horas*3600 - minutos*60 ))

 if [ $ddhoras    -lt 10 ]; then ddhoras='00'$ddhoras       ; fi
 if [ $ddminutos  -lt 10 ]; then ddminutos='00'$ddminutos   ; fi
 if [ $ddsegundos -lt 10 ]; then ddsegundos='00'$ddsegundos ; fi

 if [ $ddhoras    -ge 10 -a $ddhoras    -lt 100 ]; then ddhoras='0'$ddhoras       ; fi
 if [ $ddminutos  -ge 10 -a $ddminutos  -lt 100 ]; then ddminutos='0'$ddminutos   ; fi
 if [ $ddsegundos -ge 10 -a $ddsegundos -lt 100 ]; then ddsegundos='0'$ddsegundos ; fi

}

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

EXP=${1}
LABELI=${2}
FCST=${3}
NDOM=${4}
INTSEC=${5}
pid=${6}

INC=3
INOUTINTM=60 ; (( INOUTINTH = INOUTINTM /60 ))

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

LABELF=`date -d "${LABELI:0:8} ${LABELI:8:2} +${FCST} minutes" '+%Y%m%d%H%M'`

printf "\nLABELI: ${LABELI}\nLABELF: ${LABELF}\n"

end_date=${LABELF:0:4}-${LABELF:4:2}-${LABELF:6:2}_${LABELF:8:2}:${LABELF:10:2}:00

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

EXPDIR=${RUNDIR}/${EXP}/${LABELI}

NETCDF=${HOME}/Packages/netcdf4
HDF5=${HOME}/Packages/hdf5

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

USERDATA="GFS"
GFSRES="0p25"

OPERDIR=${GFSDIR}
BNDDIR=${OPERDIR}

echo
echo "GFS DIR: ${OPERDIR} - DATA: ${LABELI}"

if [ ! -d ${BNDDIR} ]; then
   echo "Condicao de contorno inexistente !"
   echo "Verifique a data da rodada."
   echo "$0 ${LABELI}"
   exit 1
fi

if [ -e ${EXPDIR} ]; then
 rm -rf ${EXPDIR}
fi

mkdir -p ${EXPDIR}/{runwps/logs,runwda/logs,runwrf/logs}

EXPDIR=${RUNDIR}/${EXP}/${LABELI}/runwps
LOGDIR=${EXPDIR}/logs


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

case ${LABELI:8:2} in
      00) OFF=00 ;;
      01) OFF=01 ;;
      02) OFF=02 ;;
      03) OFF=03 ;;
      04) OFF=04 ;;
      05) OFF=05 ;;
      06) OFF=00 ;;
      07) OFF=01 ;;
      08) OFF=02 ;;
      09) OFF=03 ;;
      10) OFF=04 ;;
      11) OFF=05 ;;
      12) OFF=00 ;;
      13) OFF=01 ;;
      14) OFF=02 ;;
      15) OFF=03 ;;
      16) OFF=04 ;;
      17) OFF=05 ;;
      18) OFF=00 ;;
      19) OFF=01 ;;
      20) OFF=02 ;;
      21) OFF=03 ;;
      22) OFF=04 ;;
      23) OFF=05 ;;

      *) echo "Horario Incorreto... Saindo!" ; exit ;;
esac

sed -e "s,#GEODATA#,${GEODIR},g;s,#LABELI#,${start_date},g;s,#LABELF#,${end_date},g; \
	s,#STATIC#,${DATADIR},g;s,#DOM#,${NDOM},g;s,#INTSEC#,${INTSEC},g" \
	${NMLDIR}/namelist.wps.${EXP} > ${EXPDIR}/namelist.wps

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,#INOUTINTM#,${INOUTINTM},g;s,#INOUTINTH#,${INOUTINTH},g;s,#INTSEC#,${INTSEC},g; \
   s,#FDAY#,${LABELF:6:2},g;s,#FHOU#,${LABELF:8:2},g;s,#FMIN#,${LABELF:10:2},g;s,#DOM#,${NDOM},g;\
	s,#NPROC_X#,-1,g;s,#NPROC_Y#,-1,g;s,#IO_TASKS#,16,g;s,#IO_GROUPS#,4,g" \
	${NMLDIR}/namelist.input.${EXP} > ${EXPDIR}/namelist.input

LABELIOFF=$(date --date "${LABELI:0:8} ${LABELI:8:4} $OFF hours ago" +%Y%m%d%H%M)
diffdate $LABELIOFF'00' $LABELI'00'

(( FCSTOFF = 10#${ddhoras} ))   
(( FCSTOFF3 = 10#${ddhoras} + 10#${INC} ))   
FCST1=0   
LABELS=${LABELI}
FILES=""
while [ ${LABELS} -lt ${LABELF} ]; do

	export FCSTOFF=`printf "%03i" ${FCSTOFF}`
	export FCSTOFF3=`printf "%03i" ${FCSTOFF3}`
	export FCST1=`printf "%03i" ${FCST1}`

	if test ! -s $EXPDIR/${FCST1}; then 
	   mkdir -p $EXPDIR/${FCST1}
	fi

	cd ${EXPDIR}/${FCST1}

	ln -sf ${EXPDIR}/Vtable.GFS                     ./Vtable
	ln -sf ${EXEDIR}/unMP.exe                       unMP.exe

	ln -sf ${TBLDIR}/METGRID.TBL                    METGRID.TBL
	ln -sf ${EXEDIR}/meMP.exe                       meMP.exe

	ln -sf ${RUNDIR}/${EXP}/static/geo_em.d0*.nc    .

	export start_date=${LABELS:0:4}-${LABELS:4:2}-${LABELS:6:2}_${LABELS:8:2}:${LABELS:10:2}:00
 	export LABELFS=`date -d "${LABELS:0:8} ${LABELS:8:2} +${INC} hours" '+%Y%m%d%H%M'`
   end_date=${LABELFS:0:4}-${LABELFS:4:2}-${LABELFS:6:2}_${LABELFS:8:2}:${LABELFS:10:2}:00


	sed -e "s,#LABELI#,${start_date},g;s,#LABELF#,${end_date},g;s,#DOM#,${NDOM},g;s,#INTSEC#,${INTSEC},g" \
		${NMLDIR}/namelist.wps.${EXP} > ${EXPDIR}/${FCST1}/namelist.wps

	gfsfile=$(date --date "${LABELI:0:8} ${LABELI:8:4} $OFF hours ago" +gfs.t%Hz.pgrb2.${GFSRES}.f${FCSTOFF}.${LABELIOFF:0:10}.grib2)
	gfsfile3=$(date --date "${LABELI:0:8} ${LABELI:8:4} $OFF hours ago" +gfs.t%Hz.pgrb2.${GFSRES}.f${FCSTOFF3}.${LABELIOFF:0:10}.grib2)
   ln -sf ${BNDDIR}/${LABELIOFF:0:4}/${LABELIOFF:4:2}/${LABELIOFF:6:2}/${LABELIOFF:8:2}/$gfsfile  ${EXPDIR}/${FCST1}/GRIBFILE.AAA
   ln -sf ${BNDDIR}/${LABELIOFF:0:4}/${LABELIOFF:4:2}/${LABELIOFF:6:2}/${LABELIOFF:8:2}/$gfsfile3 ${EXPDIR}/${FCST1}/GRIBFILE.AAB
   echo "ln -sf ${BNDDIR}/${LABELIOFF:0:4}/${LABELIOFF:4:2}/${LABELIOFF:6:2}/${LABELIOFF:8:2}/$gfsfile ${EXPDIR}/${FCST1}/GRIBFILE.AAA"
   echo "ln -sf ${BNDDIR}/${LABELIOFF:0:4}/${LABELIOFF:4:2}/${LABELIOFF:6:2}/${LABELIOFF:8:2}/$gfsfile3 ${EXPDIR}/${FCST1}/GRIBFILE.AAB"
   
   sstfile=${BNDDIR}/${LABELI1dago:0:8}00/rtgssthr_grb_0.083.grib2
   if [ $FCST1 == "000" ]; then
	  if test -s ${sstfile}; then
            mkdir ${EXPDIR}/${FCST1}/SST
            cd ${EXPDIR}/${FCST1}/SST
            ln -sf ${EXPDIR}/Vtable.SST                                      ./Vtable
	    ln -sf ${EXEDIR}/unMP.exe                                        ./unMP.exe
            LABELI1dago=$(date --date "${LABELI:0:8} ${LABELI:8:2} 1 days ago" '+%Y%m%d%H%M')
            start_date1dago=${LABELI1dago:0:4}-${LABELI1dago:4:2}-${LABELI1dago:6:2}_00:00:00
            ln -sf ${sstfile}    ./GRIBFILE.AAA
	    sed -e "s,#LABELI#,${start_date1dago},g;s,#LABELF#,${start_date1dago},g;s,#DOM#,${NDOM},g" \
                -e "s/^ \+//;s/^prefix.*$/ prefix = 'SST',/" \
 	         ${NMLDIR}/namelist.wps.${EXP} > ${EXPDIR}/${FCST1}/SST/namelist.wps
            sed -i "s/^ \+//;s/^constants_name.*$/ constants_name = 'SST:${start_date1dago:0:10}_00',/" \
		 ${EXPDIR}/${FCST1}/namelist.wps
	  fi	 
	fi

   FILES=${FILES}' '${FCST1}
	export FCSTOFF=$((10#${FCSTOFF} + (${INC}) ))
	export FCSTOFF3=$((10#${FCSTOFF3} + (${INC}) ))
	export FCST1=$((10#${FCST1} + (${INC}) ))
	export LABELS=`date -d "${LABELS:0:8} ${LABELS:8:2} +${INC} hours" '+%Y%m%d%H%M'`
        
done

cd ${EXPDIR}

cat > unMP.sh <<EOF0
#!/bin/bash

ulimit -s unlimited

cd ${EXPDIR}

echo
echo  "STARTING AT \`date\` "

Start=\`date +%s.%N\`
echo \$Start > ${EXPDIR}/Timing.ungrib

export FILES="$FILES"

for FCST in \${FILES}; do

 cd $EXPDIR/\${FCST}
 echo 
 echo "cd $EXPDIR/\${FCST}"

 time ./unMP.exe > ungrib.\${FCST}.log ;
 wait
 
 if [ \${FCST} = "000" ]; then
   if test -s ${sstfile}; then
     cd $EXPDIR/\${FCST}/SST
     echo 
     echo "cd $EXPDIR/\${FCST}"
 
     time ./unMP.exe > ungrib.\${FCST}_SST.log ;
     wait
     mv SST:??????????_00  $EXPDIR/\${FCST}
   fi
 fi

done

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

grep "Successful completion of ungrib." ${EXPDIR}/*/ungrib.*.log >& /dev/null

if [ \$? -ne 0 ]; then
   echo "  BUMMER: Ungrib generation failed for some yet unknown reason."
   echo " "
   tail -10 ${LOGDIR}/ungrib.log
   echo " "
   exit 21
fi
   echo "  ####################################"
   echo "  ### Ungrib completed - \$(date) ####"
   echo "  ####################################"
   echo " " 
#
# clean up and remove links
#
  mv ${EXPDIR}/Timing.ungrib ${LOGDIR}
  #rm -r ${EXPDIR}/*/GRIBFILE.AAA >& /dev/null

echo "End of ungrib Job"

exit 0
EOF0

chmod +x unMP.sh

cat > meMP.sh <<EOF0
#!/bin/bash

ulimit -s unlimited

cd ${EXPDIR}

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

export FILES="$FILES"

for FCST in \${FILES}
do

cd ${EXPDIR}/\${FCST}

time ./meMP.exe > metgrid.\${FCST}.log &

done

wait

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

cd ${EXPDIR}
grep "Successful completion of program meMP.exe" runwps/*/metgrid.log.0000 >& /dev/null

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

#
# clean up and remove links
#
   mv  ${EXPDIR}/*/met_em*nc ${EXPDIR}
   #mv Timing.metgrid ${LOGDIR}

date
exit 0
EOF0

chmod +x meMP.sh

NTASKS=12
JNAME="preMP"

cat > reMP.sh <<EOF0
#!/bin/bash

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

ulimit -s unlimited

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

cd ${EXPDIR}

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

date

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

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

grep "SUCCESS COMPLETE REAL_EM INIT" rsl.error.0000

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

   #mv wrfinput* wrfbdy*        ${EXPDIR}/runwps
   #mv rsl.error.0000           ${EXPDIR}/runwps/rsl.error.0000_real
   #mv rsl.out.0000             ${EXPDIR}/runwps/rsl.out.0000_real
   #mv Timing.real              ${EXPDIR}/logs/Timing.real
   #mv ${EXPDIR}/met_em.d0*     ${EXPDIR}/runwps
   #mv rsl*                     ${EXPDIR}/runwps

date
exit 0
EOF0

chmod +x reMP.sh


./unMP.sh

wait

./meMP.sh

wait

if [ 'x'$pid == 'x' ]; then
  sbatch ./reMP.sh
 else
  sbatch --dependency=afterok:${pid} ./reMP.sh
fi

wait
#EOC
