#!/bin/bash
#set -x
set -o posix
#set -u 
#set -e
#+
#
# ===============
# makenemo_fcm.sh
# ===============
#
# --------------------------
# Compile NEMO
# --------------------------
#
# SYNOPSIS
# ========
#
# ::
#
#  $ makenemo_fcm.sh
#
#
# DESCRIPTION
# ===========
#
#
# This script aims :
#
# - to choose MYCONFIG
# - to choose compiler options  
# - to create the CONFIG/MYCONFIG/WORK directory
# - to compile this configuration
#
#  Variables used :
#
#  From user input
#
# - NEW_CONF    : configuration to be created
# - REF_CONF    : reference configuration to build the new one 
# - CMP_NAM     : compiler name 
# - NBR_PRC     : number of processes used to compile  
# - NEM_SUBDIR  : NEMO subdirectory used (specified)
#
#  Locally defined :
#
# - TAB         : NEMO subdirectory used (read)  
# - MAIN_DIR : self explaining
# - CONFIG_DIR  :   "    "    "   
# - MODELES_DIR :   "    "    " 
# - TOOLS_DIR   :   "    "    " 
# - NEMO_DIR    :   "    "    "
#
# EXAMPLES
# ========
#
# ::
#
#  $ ./makenemo_fcm -t ifort_osx - j3 -n ORCA2_LIM
#
#
# TODO
# ====
#
# option debug
#
#
# EVOLUTIONS
# ==========
#
# $Id$
#
#
# - rblod 2010-06-20T16:11:47Z
#
#   * creation
#
#-

#- Local variables ---
b_n=$(basename ${0})
export MAIN_DIR=${PWD%/NEMOGCM*}/NEMOGCM
export CONFIG_DIR=${MAIN_DIR}/CONFIG
export TOOLS_DIR=${MAIN_DIR}/TOOLS
export NEMO_DIR=${MAIN_DIR}/NEMO
export AGRIFUSE=10
declare -a TAB
#-
#- FCM and functions location ---
export PATH=${MAIN_DIR}/EXTERNAL/fcm/bin:$PATH

#-
#- Choice of the options ---
x_d="";
x_n="";
x_r="";
x_m="";
x_t="";
x_j=1;
while getopts :hld:n:r:m:j:t: V
  do
	 case $V in
		(h)  echo "Usage	 : "${b_n} \
					 " [-h] [-l] [-n name] [-m arch] [-d "dir1 dir2"] [-r conf] [-j No]";
			  echo " -h		: help";
			  echo " -l		: list existing configurations";
			  echo " -n name : config name";
			  echo " -m arch : choose machine";
			  echo " -d dir  : choose NEMO sub-directories";
			  echo " -r conf : choose reference configuration";
			  echo " -j No	 : number of processes used to compile (0=nocompilation)";
			  echo " -t dir  : remporary directory for compilation"
			  echo "";
			  echo "Example to install a new configuration MY_CONFIG";
			  echo "with OPA_SRC and LIM_SRC_2 ";
			  echo "makenemo_fcm -n MY_CONFIG -d \"OPA_SRC LIM_SRC_2\"";
			  echo "";
			  echo "Defaults	  : ";
			  echo "";
			  exit 0;;
		(d)  x_d=${OPTARG};;
		(n)  x_n=${OPTARG};;
		(r)  x_r=${OPTARG};;
		(m)  x_m=${OPTARG};;
		(j)  x_j=${OPTARG};;
		(t)  x_t=${OPTARG};;
		(l)  echo "Available configurations :"; cat ${TOOLS_DIR}/cfg.txt; exit;;
		(:)  echo ${b_n}" : -"${OPTARG}" option : missing value" 1>&2;
			  exit 2;;
		(\?) echo ${b_n}" : -"${OPTARG}" option : not supported" 1>&2;
			  exit 2;;
	 esac
  done
shift $(($OPTIND-1));

#-
#- Go to NEMOGCM/config directory ---
cd ${CONFIG_DIR}

#-
#- Initialisation from input ---
export NEW_CONF=${x_n}
NBR_PRC=${x_j}
CMP_NAM=${x_m}
NEM_SUBDIR=${x_d}
REF_CONF=${x_r}
NEMO_TDIR=${x_t:-$NEMO_TDIR}
export NEMO_TDIR=${NEMO_TDIR:-$CONFIG_DIR}

#- When used for the first time, choose a compiler ---
. ${TOOLS_DIR}/Fcheck_archfile.sh ${CMP_NAM} || exit

#-
#- Choose a default configuration if needed ---
#- ORCA2_LIM or last one used ---
. ${TOOLS_DIR}/Fcheck_config.sh ${NEW_CONF} || exit 

if [ ${#NEW_CONF} -eq 0 ] ; then
	if [ ${#NEM_SUBDIR} -eq 0 -a ${#REF_CONF} -eq 0 ]; then
		echo "You are  installing a new configuration"
		ind=0
		. ${TOOLS_DIR}/Fread_dir.sh OPA_SRC	YES 
		. ${TOOLS_DIR}/Fread_dir.sh LIM_SRC_2   YES 
		. ${TOOLS_DIR}/Fread_dir.sh LIM_SRC_3    NO  
		. ${TOOLS_DIR}/Fread_dir.sh TOP_SRC	 NO  
		. ${TOOLS_DIR}/Fread_dir.sh C1D_SRC	YES 
		. ${TOOLS_DIR}/Fread_dir.sh NST_SRC	YES 
		. ${TOOLS_DIR}/Fread_dir.sh OFF_SRC	 NO  
		REF_CONF=ORCA2_LIM
	elif [ ${#NEM_SUBDIR} -gt 0 ] && [ ${#REF_CONF} -eq 0 ]; then
		echo "You are  installing a new configuration"
		TAB=( ${NEM_SUBDIR} )
		REF_CONF=ORCA2_LIM
	elif [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#REF_CONF} -gt 0 ]; then
		echo "You are  installing a new configuration based on ${REF_CONF}"
		${TOOLS_DIR}/Fcopy_dir.sh ${REF_CONF}  
	fi
	NEW_CONF=${x_n}
    . ${TOOLS_DIR}/Fmake_config.sh ${NEW_CONF} ${REF_CONF}
else
	sed -e "/${NEW_CONF} /d"  ${TOOLS_DIR}/cfg.txt >  ${TOOLS_DIR}/cfg.tmp
	\mv  ${TOOLS_DIR}/cfg.tmp  ${TOOLS_DIR}/cfg.txt
fi

#-
#- Save new configuration and directories names ---
echo ${NEW_CONF} ${TAB[*]} >> ${TOOLS_DIR}/cfg.txt

#-
#- Create the WORK ---
#- Clean links and librairies ---
#- Creating the good links, at first on OPA_SRC ---
. ${TOOLS_DIR}/Fmake_WORK.sh ${NEW_CONF} ${TAB[*]} || exit

. ${TOOLS_DIR}/Fmake_bld.sh ${NEW_CONF}  ${NEMO_TDIR} || exit

#- At this stage the configuration has beeen chosen
#- We look after agrif
grep key_agrif ${TOOLS_DIR}/cpp.fcm && export AGRIFUSE=1
. ${TOOLS_DIR}/Fprep_agrif.sh ${NEW_CONF} ${NEMO_TDIR} || exit

#-
#_ END OF CONFIGURATION PHASE
#_

#-
#- Compile ---

if [ "${NBR_PRC}" -gt 0 ]; then
cd ${NEMO_TDIR}/${NEW_CONF} || cd -

#if AGRIF we do a first preprocessing
[ "$AGRIFUSE" == 1 ] && fcm build --ignore-lock -s 2 ${TOOLS_DIR}/bld.cfg 
[ "$AGRIFUSE" == 1 ] && rm -rf  ${NEMO_TDIR}/${NEW_CONF}/BLD/*
fcm build --ignore-lock -v 1 -j ${NBR_PRC} ${TOOLS_DIR}/bld.cfg || cd -
[ -f ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe ] && ln -sf ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe  ${CONFIG_DIR}/${NEW_CONF}/EXP00/opa
fi

#-
#- Come back to original directory ---
cd -

#-
#- Unset variables
${TOOLS_DIR}/Fclean_var.sh


exit 0;
