#!/bin/bash

########################################################################################################################
# Script que ejecuta las dos fases del núcleo del WRF, añadiendo los archivos necesarios provenientes del WPS.
# Ejecuta real_nmm.exe y, tras esto, wrf.exe.
#
# Marcos Molina Cano - 12/11/2015
########################################################################################################################

#-------------------------------------------------------------------------------
# Uso:
#     wrf_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"
WRF_DIR="${TOP_DIR}/WRFV3"
DOMAIN_DIR="${TOP_DIR}/domains/${1}"
METGRID_OUTPUT="${DOMAIN_DIR}/metgrid_output"
WRFPRD="${DOMAIN_DIR}/wrfprd"
SHARE="${HOME}/wrf_model/share"

# Comprobación de que ya se han terminado las tareas de WPS. Si no es así, salimos.
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`] - Aún no se han ejecutado las tareas de WPS. Saliendo."
  exit
fi

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

# Comprobación de que ya está realizando las tareas y no volver a ejecutar el script.
WRF_LOCKFILE=${DOMAIN_DIR}/WRF_${1}_`date +%Y%m%d`_00.lock
if test -e ${WRF_LOCKFILE} ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ya está trabajando wrf_run.sh ${1}"
  exit
else
  touch ${WRF_LOCKFILE}
fi


cd ${WRF_DIR}/run
rm rsl* met_nmm* wrfbdy* wrfinput* wrfout*

# Creo el archivo namelist.input con los parámetros horarios apropiados y los archivos metgrid* para lanzar el real_nmm.exe. Tras esto y en caso
# de que real_nmm haya terminado correctamente lanzo wrf.exe y compruebo que ha realizado sus tareas correctamente.

# --> (15/06/2016) Parche añadido para correr los dominios de Guillermo sólo para +3h mientras que ESP010 queda igual.
if test ${1} = 'ESP010' ; then
  run_hours=24
  end_year=`date +%Y --date="tomorrow"`
  end_month=`date +%m --date="tomorrow"`
  end_day=`date +%d --date="tomorrow"`
  end_hour=00
else
  run_hours=3
  end_year=`date +%Y`
  end_month=`date +%m`
  end_day=`date +%d`
  end_hour=03
fi

rm namelist.input
cat > namelist.input << EOF
&time_control
 run_days                            = 0,
 run_hours                           = `echo ${run_hours}`,
 run_minutes                         = 0,
 run_seconds                         = 0,
 start_year                          = `date +%Y`,
 start_month                         = `date +%m`,
 start_day                           = `date +%d`,
 start_hour                          = 00,
 start_minute                        = 00,
 start_second                        = 00,
 tstart                              = 00,
 end_year                            = `echo ${end_year}`,
 end_month                           = `echo ${end_month}`,
 end_day                             = `echo ${end_day}`,
 end_hour                            = `echo ${end_hour}`,
 end_minute                          = 00,
 end_second                          = 00,
EOF

cat ${SHARE}/namelist/namelist.input.${1} >> namelist.input
ln -sf ${METGRID_OUTPUT}/met_nmm* ./

# Cálculo del número de procesadores de la máquina para usar la mitad en
# la ejecución de real_nmm.exe y wrf.exe.
procTotales=`nproc`
procUsables=`expr ${procTotales} / 2`

# Ejecución de real_nmm.exe .
echo "[`date +%Y-%m-%d_%H:%M:%S`] - Comienzo de real_nmm.exe."
mpirun -np ${procUsables} ./real_nmm.exe > /dev/null

cat rsl.out.0000 | grep "SUCCESS COMPLETE REAL_NMM INIT" > real_nmm.out
if test -s real_nmm.out ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Tareas de real_nmm completadas con éxito."
  rm real_nmm.out
else
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ha habido algún problema en las tareas de real_nmm."
  rm real_nmm.out ${WRF_LOCKFILE}
  exit
fi

# Ejecución de wrf.exe .
echo "[`date +%Y-%m-%d_%H:%M:%S`] - Comienzo de wrf.exe."
mpirun -np ${procUsables} ./wrf.exe > /dev/null

cat rsl.out.0000 | grep "SUCCESS COMPLETE WRF" > wrf.out
if test -s wrf.out ; then
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Tareas de wrf completadas con éxito."
  rm wrf.out
else
  echo "[`date +%Y-%m-%d_%H:%M:%S`] - Ha habido algún problema en las tareas de wrf."
  rm wrf.out ${WRF_LOCKFILE}
  exit
fi

# Copio los archivos de salida wrfout* al directorio $WRFPRD y borro todo lo creado
# para preparar la siguiente pasada.
if test ! -d ${WRFPRD} ; then
  mkdir ${WRFPRD}
fi
rm ${WRFPRD}/*
cp wrfout* ${WRFPRD}
rm rsl* met_nmm* wrfbdy* wrfinput* wrfout* ${METGRID_OUTPUT}/*

rm ${WRF_LOCKFILE}
touch ${WRF_FINISHED}
