#!/bin/bash # $Id: makelmdz_fcm 1615 2012-02-10 15:42:26Z emillour $ # This is a script in Bash. # FH : on ne crée plus le fichier arch.mk qui est supposé exister par # FH : ailleurs. # FH : ulterieurement, 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 makegcm. # ##set -x ######################################################################## # options par defaut pour la commande make ######################################################################## dim="96x72x19" physique=lmd filtre=filtrez grille=reg couple=false veget=false chimie=false chemistry=false parallel=none paramem="par" compil_mod=prod io=ioipsl LIBPREFIX="" cosp=false bands="" scatterers="" job=1 full='' LMDGCM=`/bin/pwd` LIBOGCM=$LMDGCM/libo LIBFGCM=$LMDGCM/libf # path for optional packages, but default set to ".void_dir" COSP_PATH=$LMDGCM/.void_dir CHEM_PATH=$LMDGCM/.void_dir AERONO_PATH=$LMDGCM/.void_dir # Path to fcm utility: ##fcm_path=$LMDGCM/tools/fcm/bin fcm_path=$(dirname $(which fcm)) ######################################################################## # Quelques initialisations de variables du shell. ######################################################################## CPP_KEY="" INCLUDE="" LIB="" adjnt="" COMPIL_FFLAGS="%PROD_FFLAGS" PARA_FFLAGS="" PARA_LD="" EXT_SRC="" ######################################################################## # lecture des options de mymake ######################################################################## while (($# > 0)) do case $1 in "-h") cat < .void_file rm -rf .void_dir mkdir .void_dir rm -f arch.path ln -s arch/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 COMPIL_FFLAGS="%PROD_FFLAGS" elif [[ "$compil_mod" == "dev" ]] then COMPIL_FFLAGS="%DEV_FFLAGS" elif [[ "$compil_mod" == "debug" ]] then COMPIL_FFLAGS="%DEBUG_FFLAGS" fi 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" 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" == "mpi" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI" PARA_FFLAGS="%MPI_FFLAGS" PARA_LD="%MPI_LD" elif [[ "$parallel" == "omp" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_OMP" PARA_FFLAGS="%OMP_FFLAGS" PARA_LD="%OMP_LD" elif [[ "$parallel" == "mpi_omp" ]] then CPP_KEY="$CPP_KEY CPP_PARA CPP_MPI CPP_OMP" PARA_FFLAGS="%MPI_FFLAGS %OMP_FFLAGS" PARA_LD="%MPI_LD %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" -o "$veget" = "orchidee1.9" -o "$veget" = "orchidee2.0" ] then #NB: option 'true': for backward compatibility. To be used with ORCHIDEE tag 1.9-1.9.6 # For this case, cpp flag ORCHIDEE_NOOPENMP must be added to the makelmdz_fcm arguments # option orchidee1.9 : Compile with ORCHIDEE version up to the inclusion of OpenMP in ORCHIDEE : tag 1.9-1.9.5(version AR5)-1.9.6 INCLUDE="${INCLUDE} -I${ORCH_INCDIR}" CPP_KEY="$CPP_KEY CPP_VEGET" # temporary, for Orchidee versions 1.9.* (before openmp activation) if [[ "$veget" == "orchidee1.9" ]] ; then CPP_KEY="$CPP_KEY ORCHIDEE_NOOPENMP" fi if [[ "$veget" == "orchidee2.0" ]] ; then orch_libs=orchidee else orch_libs="sechiba parameters stomate parallel orglob" fi LIB="${LIB} -L${ORCH_LIBDIR}" for lib in ${orch_libs} ; do if [ -f ${ORCH_LIBDIR}/lib${LIBPREFIX}$lib.a ] ; then LIB="${LIB} -l${LIBPREFIX}$lib " fi done elif [[ "$veget" != "false" ]] ; then echo "Option -v $veget does not exist" echo "Use ./makelmdz_fcm -h for more information" exit 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" fi if [[ "$physique" == "titan" ]] then CHEM_PATH="${LIBFGCM}/chim${physique}" INCLUDE="$INCLUDE -I${LIBFGCM}/chim${physique}" fi # for Mars (but could be used by others as well), there is also "aeronomars" if [[ -d ${LIBFGCM}/aerono${physique} ]] then AERONO_PATH="${LIBFGCM}/aerono${physique}" INCLUDE="$INCLUDE -I${LIBFGCM}/aerono${physique}" 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?" echo "" echo "WARNING: you are probably already compiling the model somewhere else." echo "Wait until the first compilation is finished before launching this one." echo "If you are sure that you are not compiling elsewhere, just answer " echo "yes (or 'oui') to the question below to proceed." echo "Do you wish to continue?" read reponse if [[ $reponse == "oui" || $reponse == "yes" ]] then \rm -f $LIBFGCM/grid/dimensions.h else exit fi fi cd $LIBFGCM/grid/dimension ./makdim $dim cat $LIBFGCM/grid/dimensions.h cd $LMDGCM if [[ "$bands" != "" ]] then # Generic model, recreate bands.h (IR & VIS bands for radiative transfer) bands=$(echo $bands | sed -e 's/[^0-9]/ /g') cd $LIBFGCM/phy$physique/bands ./makbands $bands cat $LIBFGCM/phy$physique/bands.h cd $LMDGCM fi if [[ "$scatterers" != "" ]] then # Generic model, recreate scatterers.h cd $LIBFGCM/phy$physique/scatterers ./make_scatterers $scatterers cat $LIBFGCM/phy$physique/scatterers.h cd $LMDGCM fi ######################################################################## # 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 if (( $dimension == 1 )) then ##in 1D, add dyn3d to include path (because main prog is in physics) INCLUDE="$INCLUDE -Ilibf/dyn3d" # echo pas de dynamique # dyn="DYN= L_DYN=-ldyn3d " fi ###################################################################### # 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 # fi #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 ## specific stuff for 1D model (needs includes which are in dyn3d) if (( $dimension == 1 )) ; then SUFF_NAME=${SUFF_NAME} DYN=dyn3d fi fi if [[ $veget != "false" ]] 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 config_fcm="config.fcm" rm -f $config_fcm touch $config_fcm rm -f bin/${code}${SUFF_NAME}.e rm -f arch.fcm rm -f arch.opt 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 "%COSP $COSP_PATH" >> $config_fcm echo "%CHEM $CHEM_PATH" >> $config_fcm echo "%AERONO $AERONO_PATH" >> $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 echo "%EXT_SRC $EXT_SRC" >> $config_fcm ln -s arch/arch-${arch}.fcm arch.fcm if test -f arch/arch-${arch}.opt && [ $compil_mod = "prod" ] then ln -s arch/arch-${arch}.opt arch.opt else ln -s .void_file arch.opt fi rm -f $LIBOGCM/${arch}${SUFF_NAME}/.config/fcm.bld.lock ./build_gcm ${fcm_path} -j $job $full rm -rf tmp_src rm -rf config ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config config ln -s $LIBOGCM/${arch}${SUFF_NAME}/.config/tmp tmp_src if [[ -r $LIBFGCM/grid/dimensions.h ]] then # Cleanup: remove dimension.h file \rm -f $LIBFGCM/grid/dimensions.h fi