#!/bin/bash

########################################################################################################################
# Script que inicializa las tareas del WPS o preproceso.
#
# Marcos Molina Cano - 12/11/2015
########################################################################################################################

#-------------------------------------------------------------------------------
# Uso:
#     wps_run.sh DOMRES
#
# Siendo:
#     DOM: Dominio que queremos estudiar, e.g., ESP, MUR, etc.
#     RES: Resolución a la que queremos estudiar el dominio. (RES<0.25º)
#-------------------------------------------------------------------------------

if test ${#} -eq 0 ; then
  echo "Error de uso en ${0} "
  exit
fi

# Definición de directorios a usar.
TOP_DIR="${HOME}/WRF"
WPS_DIR="${TOP_DIR}/WPS"
DOMAIN_DIR="${TOP_DIR}/domains/${1}"
GEOGRID_OUTPUT="${DOMAIN_DIR}/geogrid_output"
UNGRIB_OUTPUT="${DOMAIN_DIR}/ungrib_output"
METGRID_OUTPUT="${DOMAIN_DIR}/metgrid_output"
SHARE="${HOME}/wrf_model/share"
SCRIPTS="${HOME}/wrf_model/scripts"
WRF_PRD="${HOME}/WRF_PRD"
GRIB_DATA="${WRF_PRD}/grib_data"
GEOG_DATA="${WRF_PRD}/geog_data"

# Comprobación de que se han descargado correctamente todos los *.grib2. Si aún
# no ha acabado la descarga, sale.
GFS_DOWNLOAD_FINISHED="${GRIB_DATA}/GFS_DOWNLOAD_`date +%Y%m%d`_00.FINISHED"
if test ! -e ${GFS_DOWNLOAD_FINISHED} ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Aún no se han terminado de descargar los gribs."
  exit
fi

# Comprobación de que ya ha terminado las tareas en una pasada anterior.
WPS_FINISHED="${DOMAIN_DIR}/WPS_${1}_`date +%Y%m%d`_00.FINALIZADO"
if test -e ${WPS_FINISHED} ; then
    echo "[`date +%Y-%m-%d_%H:%M:%S`] - La pasada ya ha sido finalizada anteriormente. Saliendo."
    exit
fi

# Comprobación de que existen los directorios oportunos.
if test ! -d ${DOMAIN_DIR} ; then
  mkdir ${DOMAIN_DIR} ${GEOGRID_OUTPUT} ${UNGRIB_OUTPUT} ${METGRID_OUTPUT}
fi

WPS_LOCKFILE="${DOMAIN_DIR}/WPS_${1}_`date +%Y%m%d`_00.lock"
if test -e ${WPS_LOCKFILE} ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ya está trabajando wps_run.sh ${1}"
  exit
else
  touch ${WPS_LOCKFILE}
fi

# Borrado de todo lo que haya de una pasada anterior en las carpetas $*_OUTPUT.
rm ${GEOGRID_OUTPUT}/* ${UNGRIB_OUTPUT}/* ${METGRID_OUTPUT}/*

# Cambio a directorio de trabajo.
cd ${WPS_DIR}

# Una vez en el directorio del WPS, creo todos los enlaces necesarios para que puedan funcionar las tres fases del WPS.
# Creo namelist.wps con la fecha apropiada, GEOGRID.TBL, METGRID.TBL, Vtable y GRIBFILE.???. Tras esto, se ejecutan secuencialmente
# geogrid.exe, ungrib.exe y metgrid.exe. Si alguno de ellos falla el script acaba automáticamente.
rm namelist.wps

# 15/06/2016
# Parche añadido para que el preproceso de los dominios diferentes a ESP010 sea una sola iteración hasta +3h, manteniendo cada
# 3 horas las predicciones para el dominio ESP010 hasta +24h.
if test ${1} = 'ESP010' ; then
  end_date=`date +%Y-%m-%d --date="tomorrow"`_00:00:00
else
  end_date=`date +%Y-%m-%d`_03:00:00
fi

cat > namelist.wps << EOF
&share
wrf_core = 'NMM',
max_dom = 1,
start_date = '`date +%Y-%m-%d`_00:00:00',
end_date   = '`echo ${end_date}`',
interval_seconds = 10800,
io_form_geogrid = 2,
opt_output_from_geogrid_path='`echo ${GEOGRID_OUTPUT}`',
/

EOF

cat ${SHARE}/namelist/namelist.wps.${1} >> namelist.wps

cat >> namelist.wps << EOF
geog_data_path = '`echo ${GEOG_DATA}`',
/

&ungrib
out_format = 'WPS',
prefix = '`echo ${UNGRIB_OUTPUT}`/GFS',
/

&metgrid
fg_name = '`echo ${UNGRIB_OUTPUT}`/GFS',
io_form_metgrid = 2,
opt_output_from_metgrid_path='`echo ${METGRID_OUTPUT}`'
/
EOF


ln -sf GEOGRID.TBL.NMM geogrid/GEOGRID.TBL
ln -sf METGRID.TBL.NMM metgrid/METGRID.TBL
ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable
res="0p25"

# Se crean links a los archivos *.grib2 del directorio ${GRIB_DATA}.
${SCRIPTS}/link_gribs.sh ${res}

echo "[`date +%Y-%m-%d_%H:%M:%S`] - Comienzo de las tareas de geogrid."
./geogrid.exe > /dev/null

cat geogrid.log | grep "Successful completion of program geogrid.exe" > geogrid.out
if test -s geogrid.out ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Tareas de geogrid completadas con éxito."
  rm geogrid.out
else
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ha habido algún problema en las tareas de geogrid."
  rm geogrid.out ${WPS_LOCKFILE}
  exit
fi

echo "[`date +%Y-%m-%d_%H:%M:%S`] - Comienzo de las tareas de ungrib."
./ungrib.exe  > /dev/null

cat ungrib.log | grep "Successful completion of program ungrib.exe" > ungrib.out
if test -s ungrib.out ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Tareas de ungrib completadas con éxito."
  rm ungrib.out
else
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ha habido algún problema en las tareas de ungrib."
  rm ungrib.out ${WPS_LOCKFILE}
  exit
fi

echo "[`date +%Y-%m-%d_%H:%M:%S`] - Comienzo de las tareas de metgrid."
./metgrid.exe > /dev/null

cat metgrid.log | grep "Successful completion of program metgrid.exe" > metgrid.out
if test -s metgrid.out ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Tareas de metgrid completadas con éxito."
  rm metgrid.out
else
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ha habido algún problema en las tareas de metgrid."
  rm metgrid.out ${WPS_LOCKFILE}
  exit
fi

# Libero espacio de geogrid y ungrib.
rm ${GEOGRID_OUTPUT}/* ${UNGRIB_OUTPUT}/*

# Llegados a este punto, el script ha finalizado las tareas de preproceso.
rm ${WPS_LOCKFILE}
touch ${WPS_FINISHED}
