#! /bin/bash
# gfs_download.sh
########################################################################################################################
# Script para bajar los archivos en formato GRIB2 del servidor de la NOAA del modelo GFS. Estos paquetes sirven como
# inicialización para el modelo WRF.
#
# Marcos Molina Cano - 04/11/2015
########################################################################################################################

# Definición de archivos y directorios necesarios.
TOP_DIR="${HOME}/WRF_PRD"
GRIB_DATA="${TOP_DIR}/grib_data"
LOCKFILE="${GRIB_DATA}/gfs_download_`date -u +%Y%m%d`_00.lock"
FINISHED="${GRIB_DATA}/GFS_DOWNLOAD_`date -u +%Y%m%d`_00.FINISHED"

cd ${GRIB_DATA} # Cambio a directorio donde se guardan los *.grib2 del modelo GFS de la NOAA.

# Comprobación de que este script ha descargado todos los *.grib2 del GFS y no debe
# lanzarse más.
if test -e ${FINISHED} ; then
    exit
fi

# Comprobación de que este script ha terminado su trabajo cuando se ha ejecutado anteriormente
# y no ha habido ningún problema. Para decidir si ha habido un problema se comprueba que el
# archivo de bloqueo se haya creado hace menos de dos horas. Si tiene más de dos horas se borra
# y se crea de nuevo pues se reinicia el script.
if test ! -e ${LOCKFILE} ; then
  touch ${LOCKFILE}
  echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - *** Comienzo de la descarga de los gribs. ***"
else
  fecha_creacion_LOCKFILE=`stat -c %Y ${LOCKFILE}`
  hace_dos_horas=`date -u +%s --date="2 hours ago"`
  if test ${fecha_creacion_LOCKFILE} -lt ${hace_dos_horas} ; then
    rm ${LOCKFILE}
    touch ${LOCKFILE}
  else
    exit
  fi
fi

# Borro los gribs de 7 días anteriores por seguridad, por si se ha escapado algo, además del
# archivo $FINISHED de días anteriores por si no se ha borrado.
for dia in 1 2 3 4 5 6 7; do
  fecha_anterior=`date -u +%Y%m%d --date="${dia} days ago"`
  FINISHED_ANTERIOR="${GRIB_DATA}/GFS_DOWNLOAD_`date -u +%Y%m%d --date="${dia} days ago"`_00.FINISHED"
  rm ${FINISHED_ANTERIOR}
  for TAG in 00 06 12 18 ; do
    if test -d ${fecha_anterior}${TAG} ; then
      rm -r ${fecha_anterior}${TAG}
    fi
  done
done

# Resoluciones disponibles en los GRIBS2 del servidor de la NOAA. A elegir una de las cuatro.
export res="0p25"
#res="0p50"
#res="1p00"
#res="2p50"

# Horas de predicción disponibles a partir de la hora de pasada.
tag="00" # 06 12 18" # Hora de pasada.
fcst="000 003 006 009 012 015 018 021 024" #027 030 033 036 039 042 045 048 051 054 057 060 ... hasta 384.
fecha_actual=`date -u +%Y%m%d`
server="ftp://ftp.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.${fecha_actual}"

# Se inicia la bajada de los gribs para la fecha actual y para cada pasada en caso de estar disponibles. También
# se crea el directorio de la forma YYYYMMDDHH donde se guardarán. Si el archivo ya existe no lo descarga y
# si ha habido algún problema en la descarga borra el grib para que en el siguiente lanzamiento del script
# pruebe a descargarlo correctamente.
for TAG in ${tag} ; do
  contador="0"
  root="${server}${TAG}"
  if test ! -d ${fecha_actual}${TAG} ; then
    mkdir ${fecha_actual}${TAG}
  fi
  cd ${fecha_actual}${TAG}/
  for FCST in ${fcst} ; do
    file_name="gfs.t${TAG}z.pgrb2.${res}.f${FCST}"
    file_name_idx="${file_name}.idx"
    file_name_tmp="${file_name}.tmp"
    if test -e ${file_name} -a -e ${file_name_idx} -a ! -e ${file_name_tmp} ; then
      let contador=${contador}+1
      continue
    fi
    touch ${file_name_tmp} && \
    curl -s ${root}/${file_name} -o ${file_name} && \
    curl -s ${root}/${file_name_idx} -o ${file_name_idx} && \
    rm ${file_name_tmp} && let contador=${contador}+1 && \
    echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - Descargado ${file_name}. "
    if test -e ${file_name_tmp} ; then
      rm ${file_name} ${file_name_idx} ${file_name_tmp}
    fi
  done
  cd ..
done
rm ${LOCKFILE}

# Si "contador" es igual a 9 es porque ya se han descargado los 9 *.grib2 y podemos afirmar que el script ha acabado por hoy.
if test ${contador} -eq 9 ; then
  touch ${FINISHED}
  echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - *** Descargados todos los gribs. ***"
fi
