#!/bin/csh
#
# $Header$
#
# FH : on ne cr�e plus le fichier arch.mk qui est suppos� exister par
# FH : ailleurs.
# FH : ult�rieurement, ce fichier sera pr�-existant pour une s�rie
# FH : de configurations en versions optimis�es et debug qui seront
# FH : li�s (ln -s) avec arch.mk en fonction de l'architecture.
# FH : Pour le moment, cette version est en test et on peut cr�er les
# FH : arch.mk en lan�ant une premi�re fois makegcm7.
#
set verbose echo
########################################################################
# options par defaut pour la commande make
########################################################################

set dim="96x72x19"
set physique=lmd
set ntrac = 4
set filtre=filtrez
set grille=reg
set couple=false
set veget=false
set chimie=false
set parallel=none
set compil_mod=prod
set io=ioipsl
set LIBPREFIX=""

set LMDGCM=`/bin/pwd`
set LIBOGCM=$LMDGCM/libo
set LIBFGCM=$LMDGCM/libf

########################################################################
#  Quelques initialisations de variables du shell.
########################################################################

set CPP_KEY="" 
set INCLUDE=""
set LIB=""
set adjnt=""
set COMPIL_FFLAGS="%PROD_FFLAGS"
set PARA_FFLAGS=""
set PARA_LD=""

########################################################################
# lecture des options de mymake
########################################################################

top:
if ($#argv > 0) then
    switch ($1:q)

    case -h:
cat <<fin
manuel complet sur http://...
Usage :
makegcm [options] -m arch exec
[-h]                       : manuel abrégé
[-d [[IMx]JMx]LM]          : IM, JM, LM sont les dims en x, y, z (def: $dim)
[-t NTRAC]                 : nombre de traceurs (def: 4)
[-p PHYS]                  : compilation avec la physique libf/phyPHYS, (def: lmd)
[-prod / -dev / -debug]    : compilation en mode production (default) / developpement / debug .
[-c false/MPI1/MPI2]       : couplé océan : MPI1/MPI2/false (def: false)
[-v false/true]            : avec ou sans végétation (def: false)
[-chimie SCHEMA/false]     : nom du schéma chimique ou false (def)
[-parallel none/mpi/omp/mpi_omp] : parallelisation (default: none) : mpi, openmp ou mixte mpi_openmp
[-g GRI]                   : conf. grille dans dyn3d/GRI_xy.h  (def: reg inclue un zoom)
[-io IO]                   : choix d'une librairie I/O, experts (def: ioipsl)
[-include INCLUDES]        : variables supplementaires pour include cpp, experts.
[-adjnt]                   : adjoint, a remettre en route ...
[-filtre NOMFILTRE]        : prend le filtre dans libf/NOMFILTRE (def: filtrez)
[-link LINKS]              : liens optionels avec d'autres librairies
 -m arch                   : nom de l'architecture cible
 exec                      : exécutable généré
fin
	exit

    case -d:
        set dim=$2 ; shift ; shift ; goto top
                        
    case -O:
        echo "option obsolete dans cette version intermediaire de makegcm"
	exit

     case -p
        set physique="$2" ;  shift ; shift ; goto top

     case -g
        set grille="$2" ; shift ; shift ; goto top

     case -c
	set couple="$2" ; shift ; shift ; goto top

     case -prod
        set compil_mod="prod" ; shift ; goto top

     case -dev
       set compil_mod="dev" ; shift ; goto top

     case -debug
       set compil_mod="debug" ; shift ; goto top

     case -io
        set io="$2" ; shift ; shift ; goto top

     case -v
        set veget="$2" ; shift ; shift ; goto top

     case -chimie
	set chimie="$2" ; shift ; shift ; goto top

     case -parallel
        set parallel="$2" ; shift ; shift ; goto top
  
     case -t
        set ntrac=$2 ; shift ; shift ; goto top

     case -include
        set INCLUDE="$INCLUDE -I$2" ; shift ; shift ; goto top

     case -adjnt
	echo 'otpion a reactiver ';exit
        set opt_dep="$opt_dep adjnt" ; set adjnt="-ladjnt -ldyn3d "
        set optim="$optim -Dadj" ; shift ; goto top


     case -filtre
        set filtre=$2 ; shift ; shift ; goto top

     case -link
        set LIB="$LIB $2" ; shift ; shift ; goto top

     case -m
       set arch=$2 ; shift ; shift ; goto top

     default
        set code="$1" ; shift ; goto top

   endsw
endif


###############################################################
# lecture des chemins propres � l'architecture  de la machine #
###############################################################

rm -f ./arch.path
ln -s ./machine/arch-${arch}.path ./arch.path
source arch.path

########################################################################
# Definition des clefs CPP, des chemins des includes et modules
#  et des libraries
########################################################################

if ( "$compil_mod" == 'prod' ) then
  set COMPIL_FFLAGS="%PROD_FFLAGS"
else if ( "$compil_mod" == 'dev' ) then
  set COMPIL_FFLAGS="%DEV_FFLAGS"
else if ( "$compil_mod" == 'debug' ) then
  set COMPIL_FFLAGS="%DEBUG_FFLAGS"
endif

if ( "$physique" == 'nophys' ) then
   
else
   set CPP_KEY="$CPP_KEY CPP_PHYS"
endif


if ( "$chimie" == 'AER' ) then
    set CPP_KEY="$CPP_KEY INCA INCA_AER"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
else if  ( "$chimie" == 'CH4' ) then
    set CPP_KEY="$CPP_KEY INCA INCA_CH4"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
else if  ( "$chimie" == 'CH4_AER' ) then
    set CPP_KEY="$CPP_KEY INCA INCA_AER INCA_CH4"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
else if  ( "$chimie" == 'NMHC' ) then
    set CPP_KEY="$CPP_KEY INCA INCA_NMHC"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
else if  ( "$chimie" == 'NMHC_AER' ) then
    set CPP_KEY="$CPP_KEY INCA INCA_AER INCA_NMHC"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
else if ( "$chimie" == 'GES' ) then
    set CPP_KEY="$CPP_KEY INCA"
    set INCLUDE="$INCLUDE -I${INCA_INCDIR}"
    set LIB="$LIB -L${INCA_LIBDIR} -lchimie" 
endif

if ( "$couple" != 'false' ) then
   set CPP_KEY="$CPP_KEY CPP_COUPLE"
   set INCLUDE="$INCLUDE -I${OASIS_INCDIR}"
   set LIB="$LIB -L${OASIS_LIBDIR} -lpsmile.${couple} -lmpp_io"
endif

if ( "$parallel" == 'mpi' ) then
   set CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI"
   set PARA_FFLAGS="%MPI_FFLAGS"
   set PARA_LD="%MPI_LD"
else if ("$parallel" == 'omp' ) then
   set CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP"
   set PARA_FFLAGS="%OMP_FFLAGS"
   set PARA_LD="%OMP_LD"
else if ("$parallel" == 'mpi_omp' ) then
   set CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP"
   set PARA_FFLAGS="%MPI_FFLAGS %OMP_FFLAGS"
   set PARA_LD="%MPI_LD %OMP_LD"
endif

if ( "$veget" == 'true' ) then
   set CPP_KEY="$CPP_KEY CPP_VEGET"
   set INCLUDE="${INCLUDE} -I${ORCH_INCDIR}"
   set LIB="${LIB} -L${ORCH_LIBDIR} -l${LIBPREFIX}sechiba -l${LIBPREFIX}parameters -l${LIBPREFIX}stomate -l${LIBPREFIX}parallel -l${LIBPREFIX}orglob"
endif

if ( $io == ioipsl ) then
   set CPP_KEY="$CPP_KEY CPP_IOIPSL"
   set INCLUDE="$INCLUDE -I${IOIPSL_INCDIR}"
   set LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl"
endif

set INCLUDE="$INCLUDE -I${NETCDF_INCDIR}"
set LIB="$LIB -L${NETCDF_LIBDIR} -lnetcdf"


########################################################################
# choix du nombre de traceur par defaut si il n'a pas ete choisi,
# suivant la physique
########################################################################

if ( $ntrac == 0  ) then
    if ( "$physique" == 'nophys' ) then
        set ntrac=1
    else if ( "$physique" == 'lmd' ) then
        set ntrac=2
    else if ( "$physique" == 'lmd_test_li' ) then
        set ntrac=2
    else if ( "$physique" == 'ec' ) then
        set ntrac=1
    else
        set ntrac = 1
    endif
endif


########################################################################
# calcul du nombre de dimensions
########################################################################


set dim_full=$dim
set dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
set dimc=`echo $dim | wc -w`

echo calcul de la dimension
echo dim $dim
echo dimc $dimc


########################################################################
# Gestion des dimensions du modele.
# on cree ou remplace le fichier des dimensions/nombre de traceur
########################################################################

cd $LIBFGCM/grid/dimension
./makdim $ntrac $dim
cat $LIBFGCM/grid/dimensions.h
cd $LMDGCM


########################################################################
# Differentes dynamiques (3d, 2d, 1d)
########################################################################

set dimension=`echo $dim | wc -w`
echo dimension $dimension

if ( $dimension != 3 ) then
  echo "Probleme dans les dimensions de la dynamique !!"
  echo "Non reactive pour l'instant !!!"
endif

if ( $dimension == 3 ) then
  cd $LIBFGCM/grid
  \rm fxyprim.h
  cp -p fxy_${grille}.h fxyprim.h
endif

######################################################################
#   Traitement special pour le nouveau rayonnement de Laurent Li.
#   ---> YM desactive pour le traitemement en parallele
######################################################################

#if ( -f $libf/phy$physique/raddim.h ) then
# if ( -f $libf/phy$physique/raddim.$dimh.h ) then
#  \rm -f $libf/phy$physique/raddim.h
#  cp -p $libf/phy$physique/raddim.$dimh.h $libf/phy$physique/raddim.h
#  echo $libf/phy$physique/raddim.$dimh.h 
#  cat $libf/phy$physique/raddim.h
# else
#  echo On peut diminuer la taille de l executable en creant
#  echo le fichier $libf/phy$physique/raddim.$dimh.h
#  \cp -p $libf/phy$physique/raddim.defaut.h $libf/phy$physique/raddim.h
# endif
#endif

######################################################################
# Gestion du filtre qui n'existe qu'en 3d.
######################################################################

if ( `expr $dimc \> 2` == 1 ) then
   set filtre="FILTRE=$filtre"
else
   set filtre="FILTRE= L_FILTRE= "
endif
echo MACRO FILTRE $filtre

echo $dimc



######################################################################
# Creation du suffixe de la configuration
######################################################################


set SUFF_NAME=_${dim_full}
set SUFF_NAME=${SUFF_NAME}_t${ntrac}_phy${physique}

if ( "$parallel" != 'none' ) then
  set SUFF_NAME=${SUFF_NAME}_para
  set DYN=dyn${dimc}dpar
else
  set SUFF_NAME=${SUFF_NAME}_seq
  set DYN=dyn${dimc}d
endif

if ( $veget == "true" ) then
  set SUFF_NAME=${SUFF_NAME}_orch
endif

if ( $couple != "false" ) then
  set SUFF_NAME=${SUFF_NAME}_couple
endif

if ( $chimie == "true" ) then
  set SUFF_NAME=${SUFF_NAME}_inca
endif

cd $LMDGCM
set config_fcm="config.fcm"
rm -f $config_fcm
touch $config_fcm
rm -f bin/${code}${SUFF_NAME}.e
rm -f arch.fcm

echo "%ARCH          $arch"          >> $config_fcm
echo "%INCDIR        $INCLUDE"       >> $config_fcm 
echo "%LIB           $LIB"           >> $config_fcm
echo "%ROOT_PATH     $PWD"           >> $config_fcm
echo "%LIBF          $LIBFGCM"       >> $config_fcm
echo "%LIBO          $LIBOGCM"       >> $config_fcm
echo "%DYN           $DYN"           >> $config_fcm
echo "%PHYS          phy${physique}" >> $config_fcm
echo "%CPP_KEY       $CPP_KEY"       >> $config_fcm
echo "%EXEC          $code"          >> $config_fcm
echo "%SUFF_NAME     $SUFF_NAME"     >> $config_fcm
echo "%COMPIL_FFLAGS $COMPIL_FFLAGS" >> $config_fcm
echo "%PARA_FFLAGS   $PARA_FFLAGS"   >> $config_fcm
echo "%PARA_LD       $PARA_LD"       >> $config_fcm



ln -s machine/arch-${arch}.fcm arch.fcm
rm -f $LIBOGCM/${arch}${SUFF_NAME}/.config/fcm.bld.lock
./build_gcm

rm -f tmp_src
rm -f config
ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config config
ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config/tmp tmp_src
#\rm -f $libf/grid/dimensions.h
