#!/bin/bash # # $Id$ # # ######################################################################## # for debug, uncomment line below #set -xv ######################################################################## # options par defaut pour la commande make ######################################################################## dim="96x72x19" physique=lmd code=gcm filtre=filtrez grille=reg couple=false veget=false chimie=false parallel=none paramem="par" compil_mod=prod io=ioipsl LIBPREFIX="" fcm_path=none cosp=false # guess a default 'arch' arch="local" # start with assuming we're on a local machine with local arch file ## try to recognise machine and infer arch from it machine=`hostname` if [[ "$machine" == "brodie" ]] then arch="SX8_BRODIE" fi if [[ "${machine:0:6}" == "vargas" ]] then arch="PW6_VARGAS" fi if [[ "${machine:0:6}" == "ciclad" ]] then arch="AMD64_CICLAD" fi if [[ "${machine:0:7}" == "platine" ]] then arch="IA64_PLATINE" fi if [[ "${machine:0:6}" == "titane" ]] then arch="X64_TITANE" fi if [[ "${machine:0:8}" == "mercure1" ]] then arch="SX8_MERCURE" fi if [[ "${machine:0:8}" == "mercure2" ]] then arch="SX9_MERCURE" fi LMDGCM=`pwd -P` LIBFGCM=$LMDGCM/libf LIBOGCM=$LMDGCM/libo if [[ ! -d $LIBOGCM ]] then # create the directory mkdir $LIBOGCM if [[ ! $? ]] then echo "Failed to create directory $LIBOGCM" exit fi fi COSP_PATH=$LMDGCM/.void_dir localdir=`pwd -P` ######################################################################## # Quelques initialisations de variables du shell. ######################################################################## CPP_KEY="" INCLUDE='-I$(LIBF)/grid -I$(LIBF)/bibio -I$(LIBF)/filtrez -I. ' LIB="" adjnt="" ##COMPIL_FFLAGS="%PROD_FFLAGS" PARA_FFLAGS="" PARA_LD="" EXT_SRC="" ######################################################################## # lecture des options ######################################################################## while (($# > 0)) do case $1 in "-h") cat < .void_file rm -rf .void_dir mkdir .void_dir rm -f arch.path if [[ -r arch/arch-${arch}.path ]] then ln -s arch/arch-${arch}.path ./arch.path source arch.path else echo "Error: missing arch/arch-${arch}.path file !" exit fi rm -f arch.fcm if [[ -r arch/arch-${arch}.fcm ]] then ln -s arch/arch-${arch}.fcm arch.fcm else echo "Error: missing arch/arch-${arch}.fcm file !" exit fi ######################################################################## # Definition des clefs CPP, des chemins des includes et modules # et des libraries ######################################################################## # basic compile flags from arch.fcm file archfileline=$( grep -i '^%BASE_FFLAGS' arch.fcm ) COMPIL_FFLAGS=$( echo ${archfileline##%BASE_FFLAGS} ) # other compile flags, depending on compilation mode if [[ "$compil_mod" == "prod" ]] then ## read COMPIL_FFLAGS from arch.fcm file archfileline=$( grep -i '^%PROD_FFLAGS' arch.fcm ) archfileopt=$( echo ${archfileline##%PROD_FFLAGS} ) COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}" elif [[ "$compil_mod" == "dev" ]] then ## read %DEV_FFLAGS from arch.fcm file archfileline=$( grep -i '^%DEV_FFLAGS' arch.fcm ) archfileopt=$( echo ${archfileline##%DEV_FFLAGS} ) COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}" elif [[ "$compil_mod" == "debug" ]] then ## read %DEBUG_FFLAGS from arch.fcm file archfileline=$( grep -i '^%DEBUG_FFLAGS' arch.fcm ) archfileopt=$( echo ${archfileline##%DEBUG_FFLAGS} ) COMPIL_FFLAGS="${COMPIL_FFLAGS} ${archfileopt}" fi # add CPP_KEY defined in arch.fcm file archfileline=$( grep -i '^%FPP_DEF' arch.fcm ) archfileopt=$( echo ${archfileline##%FPP_DEF} ) CPP_KEY="$CPP_KEY ${archfileopt}" # get compiler name from arch.fcm file archfileline=$( grep -i '^%COMPILER' arch.fcm ) fcompiler=$( echo ${archfileline##%COMPILER} ) # get linker name from arch.fcm file archfileline=$( grep -i '^%LINK' arch.fcm ) linker=$( echo ${archfileline##%LINK} ) # get ar command from arch.fcm file archfileline=$( grep -i '^%AR' arch.fcm ) arcommand=$( echo ${archfileline##%AR} ) # get make utility from arch.fcm file archfileline=$( grep -i '^%MAKE' arch.fcm ) makecommand=$( echo ${archfileline##%MAKE} ) # get basic libraries to link with arch.fcm file archfileline=$( grep -i '^%BASE_LD' arch.fcm ) archfileopt=$( echo ${archfileline##%BASE_LD} ) LIB="$LIB ${archfileopt}" if [[ "$physique" != "nophys" ]] then #We'll use some physics CPP_KEY="$CPP_KEY CPP_PHYS" if [[ "${physique:0:3}" == "lmd" ]] then #For lmd physics, default planet type is Earth CPP_KEY="$CPP_KEY CPP_EARTH" fi fi if [[ "$chimie" == "INCA" ]] then CPP_KEY="$CPP_KEY INCA" INCLUDE="$INCLUDE -I${INCA_INCDIR}" LIB="$LIB -L${INCA_LIBDIR} -lchimie" libchimie=" -L${INCA_LIBDIR} -lchimie" fi if [[ "$couple" != "false" ]] then CPP_KEY="$CPP_KEY CPP_COUPLE" INCLUDE="$INCLUDE -I${OASIS_INCDIR}" LIB="$LIB -L${OASIS_LIBDIR} -lpsmile.${couple} -lmpp_io" fi if [[ "$parallel" == "none" ]] then FLAG_PARA='' else FLAG_PARA="par" fi if [[ "$parallel" == "mpi" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI" # MPI additional compilation options archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm ) PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} ) # MPI additional links archfileline=$( grep -i '^%MPI_LD' arch.fcm ) PARA_LD=$( echo ${archfileline##%MPI_LD} ) elif [[ "$parallel" == "omp" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP" # OMP additional compilation options archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm ) PARA_FFLAGS=$( echo ${archfileline##%OMP_FFLAGS} ) # OMP additional links archfileline=$( grep -i '^%OMP_LD' arch.fcm ) PARA_LD=$( echo ${archfileline##%OMP_LD} ) elif [[ "$parallel" == "mpi_omp" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP" # MPI additional compilation options archfileline=$( grep -i '^%MPI_FFLAGS' arch.fcm ) PARA_FFLAGS=$( echo ${archfileline##%MPI_FFLAGS} ) # OMP additional compilation options archfileline=$( grep -i '^%OMP_FFLAGS' arch.fcm ) PARA_FFLAGS="${PARA_FFLAGS} "$( echo $archfileopt ${archfileline##%OMP_FFLAGS} ) # MPI additional links archfileline=$( grep -i '^%MPI_LD' arch.fcm ) PARA_LD=$( echo ${archfileline##%MPI_LD} ) # OMP additional links archfileline=$( grep -i '^%OMP_LD' arch.fcm ) PARA_LD="${PARA_LD} "$( echo $archfileopt ${archfileline##%OMP_LD} ) fi if [[ ( "$parallel" == "omp" || "$parallel" == "mpi_omp" ) \ && "$compil_mod" == "debug" ]] then echo "Usually, parallelization with OpenMP requires some optimization." echo "We suggest switching to \"-dev\"." fi if [[ "$veget" == "true" ]] then CPP_KEY="$CPP_KEY CPP_VEGET" INCLUDE="${INCLUDE} -I${ORCH_INCDIR}" LIB="${LIB} -L${ORCH_LIBDIR} -l${LIBPREFIX}sechiba -l${LIBPREFIX}parameters -l${LIBPREFIX}stomate -l${LIBPREFIX}parallel -l${LIBPREFIX}orglob" fi if [[ $io == ioipsl ]] then CPP_KEY="$CPP_KEY CPP_IOIPSL" INCLUDE="$INCLUDE -I${IOIPSL_INCDIR}" LIB="$LIB -L${IOIPSL_LIBDIR} -l${LIBPREFIX}ioipsl" fi if [[ "$cosp" == "true" ]] then CPP_KEY="$CPP_KEY CPP_COSP" COSP_PATH="$LIBFGCM/cosp" # LIB="${LIB} -l${LIBPREFIX}cosp" opt_dep="$opt_dep cosp" lcosp="-l${LIBPREFIX}cosp" INCLUDE="$INCLUDE"' -I$(LIBF)/cosp' fi INCLUDE="$INCLUDE ${NETCDF_INCDIR}" LIB="$LIB ${NETCDF_LIBDIR}" ######################################################################## # calcul du nombre de dimensions ######################################################################## dim_full=$dim dim=`echo $dim | sed -e 's/[^0-9]/ /g'` set $dim dimc=$# echo calcul de la dimension echo dim $dim echo dimc $dimc ######################################################################## # Gestion des dimensions du modele. # on cree ou remplace le fichier des dimensions ######################################################################## cd $LIBFGCM/grid if [[ -f dimensions.h ]] then echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs' echo "Attendez que la premiere compilation soit terminee pour relancer la suivante." echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs," echo vous pouvez continuer en repondant oui. echo "Voulez-vous vraiment continuer?" read reponse if [[ $reponse == "oui" ]] then \rm -f $LIBFGCM/grid/dimensions.h else exit fi fi cd $LIBFGCM/grid/dimension ./makdim $dim cat $LIBFGCM/grid/dimensions.h cd $LMDGCM ######################################################################## # Differentes dynamiques (3d, 2d, 1d) ######################################################################## dimension=`echo $dim | wc -w` echo dimension $dimension if (( $dimension == 3 )) then cd $LIBFGCM/grid \rm fxyprim.h cp -p fxy_${grille}.h fxyprim.h else echo "Probleme dans les dimensions de la dynamique !!" echo "Non reactive pour l'instant !!!" fi ###################################################################### # Gestion du filtre qui n'existe qu'en 3d. ###################################################################### if (( `expr $dimc \> 2` == 1 )) then filtre="FILTRE=$filtre" else filtre="FILTRE= L_FILTRE= " fi echo MACRO FILTRE $filtre echo $dimc ###################################################################### # Creation du suffixe de la configuration ###################################################################### SUFF_NAME=_${dim_full} SUFF_NAME=${SUFF_NAME}_phy${physique} if [[ "$parallel" != "none" ]] then SUFF_NAME=${SUFF_NAME}_para DYN=dyn${dimc}d${paramem} if [[ "$paramem" == "mem" ]] then SUFF_NAME=${SUFF_NAME}_${paramem} fi else SUFF_NAME=${SUFF_NAME}_seq DYN=dyn${dimc}d fi if [[ $veget == "true" ]] then SUFF_NAME=${SUFF_NAME}_orch fi if [[ $couple != "false" ]] then SUFF_NAME=${SUFF_NAME}_couple fi if [[ $chimie == "INCA" ]] then SUFF_NAME=${SUFF_NAME}_inca fi cd $LMDGCM ######################################################################## # Avant de lancer le make, on recree le makefile si necessaire ######################################################################## ######################################################################## # c'est a dire dans 3 cas: # 1. si la liste des fichiers .F et .h a ete modifiee depuis la # derniere creation du makefile # 2. si le fichier contenant cette liste "liste_des_sources" # n'existe pas. # 3. Si le makefile n'existe pas. ######################################################################## cd $LMDGCM find libf -name '*.[Fh]' -print > tmp77 find libf -name '*.[Fh]' -exec egrep -i " *use *ioipsl" {} \; -print > tmp90 find libf -name '*.[Fh90]' -print >> tmp90 if [[ ! ( -r makefile ) || ! ( -r liste_des_sources_f90 ) || ! ( -r liste_des_sources_f77 ) || ` diff tmp77 liste_des_sources_f77 | wc -w ` -ne 0 || ` diff tmp90 liste_des_sources_f90 | wc -w ` -ne 0 ]] then echo "les fichiers suivants ont ete crees ou detruits" echo "ou les fichiers suivants sont passes ou ne sont plus en Fortran 90" diff liste_des_sources_f77 tmp77 diff liste_des_sources_f90 tmp90 \cp -f tmp77 liste_des_sources_f77 \cp -f tmp90 liste_des_sources_f90 echo "on recree le makefile" ./create_make_gcm > tmp \mv -f tmp makefile echo "Nouveau makefile cree" fi ################################################################# # Preparation de l'execution de la comande make ################################################################# source_code=${code}.F if [[ -r $LMDGCM/libf/dyn${dimc}d${FLAG_PARA}/${code}.F90 ]] then source_code=${code}.F90 fi # library directory name: if [[ "$parallel" == "none" ]] then nomlib=${arch}_${physique}_${dim_full}_${grille}_${compil_mod} else nomlib=${arch}_${physique}_${dim_full}_${grille}_${compil_mod}_${FLAG_PARA} fi if [[ ! -d "${LIBOGCM}/${nomlib}" ]] then mkdir ${LIBOGCM}/${nomlib} # check we indeed managed to create the directory if [[ ! $? ]] then echo "Error: could not create directory ${LIBOGCM}/${nomlib}" exit fi fi # where module files are created mod_loc_dir=$localdir if [[ "$physique" != "nophys" ]] then INCLUDE="$INCLUDE"' -I$(LIBF)/phy'"$physique" fi INCLUDE="$INCLUDE"' -I$(LIBF)/dyn'${dimc}'d'$FLAG_PARA' -I'${LIBOGCM}/${nomlib} # ranlib utility (check it exists or else default to ls) if [[ `which ranlib > /dev/null 2>&1 ; echo $?` -eq 0 ]] then ranlib="ranlib" else ranlib="ls" fi # add CPP keys to COMPIL_FLAGS # (but first add -D before all CPP_KEY items) cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-D&/g'` # (but add a -WF,-D before all CPP_KEY items) => for xlf on Vargas if [[ "${fcompiler:0:3}" == "xlf" ]] then cpp_definitions=`echo $CPP_KEY | sed -e 's/[A-Za-z_=0-9]*/-WF,-D&/g'` fi COMPIL_FFLAGS="${COMPIL_FFLAGS} ${cpp_definitions}" ################################################################# # Execution du make ################################################################# echo $makecommand RANLIB=$ranlib -f $LMDGCM/makefile \ OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \ OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ INCLUDE="$INCLUDE" \ $filtre \ LIBO=${LIBOGCM}/${nomlib} \ "PHYS=$physique" \ DIM=$dimc \ FLAG_PARA=$FLAG_PARA \ L_ADJNT=$adjnt \ L_COSP="$lcosp" \ L_CHIMIE="$libchimie" \ LOCAL_DIR="$localdir" \ F77="$fcompiler" \ F90="$fcompiler" \ OPLINK="$LIB" \ LINK="$linker" \ GCM="$LMDGCM" \ MOD_LOC_DIR=$mod_loc_dir \ MOD_SUFFIX="mod" \ AR=$arcommand \ SOURCE=$source_code \ PROG=$code $makecommand RANLIB=$ranlib -f $LMDGCM/makefile \ OPTION_DEP="$opt_dep" OPTION_LINK="$LIB ${PARA_LD}" \ OPTIM90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ OPTIMTRU90="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ OPTIM="${COMPIL_FFLAGS} ${PARA_FFLAGS}" \ INCLUDE="$INCLUDE" \ $filtre \ LIBO=${LIBOGCM}/${nomlib} \ "PHYS=$physique" \ DIM=$dimc \ FLAG_PARA=$FLAG_PARA \ L_ADJNT="$adjnt" \ L_COSP="$lcosp" \ L_CHIMIE="$libchimie" \ LOCAL_DIR="$localdir" \ F77="$fcompiler" \ F90="$fcompiler" \ OPLINK="$LIB" \ LINK="$linker" \ GCM="$LMDGCM" \ MOD_LOC_DIR=$mod_loc_dir \ MOD_SUFFIX="mod" \ AR=$arcommand \ SOURCE=$source_code \ PROG=$code if [[ -r $LIBFGCM/grid/dimensions.h ]] then # Cleanup: remove dimension.h file \rm -f $LIBFGCM/grid/dimensions.h fi