#---------------------------------*- sh -*------------------------------------- # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation # \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM. # # OpenFOAM is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # OpenFOAM is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with OpenFOAM. If not, see . # # Script # RunFunctions # # Description # Miscellaneous functions for running tutorial cases #------------------------------------------------------------------------------ # The normal locations [ -n "$FOAM_TUTORIALS" ] || export FOAM_TUTORIALS=$WM_PROJECT_DIR/tutorials #------------------------------------------------------------------------------ # # Look for '-parallel' in the argument list. # isParallel() { for i; do [ "$i" = "-parallel" ] && return 0; done return 1 } # # Look for '-test' in the argument list. # isTest() { for i; do [ "$i" = "-test" ] && return 0; done return 1 } # # Extract 'numberOfSubdomains' from system/decomposeParDict # (or alternative location). # # On failure: # return '1' # exit status 1 # getNumberOfProcessors() { local dict="${1:-system/decomposeParDict}" # Re-use positional parameters for automatic whitespace elimination set -- $(foamDictionary -entry numberOfSubdomains -value "$dict" 2>/dev/null) if [ "$#" -eq 1 ] then echo "$1" else echo "Warning no 'numberOfSubdomains' in '$dict'" 1>&2 echo 1 # serial as fallback return 1 fi } # # Extract 'application' from system/controlDict # # On failure: # return 'false' which is also a command (ie, shell builtin or /bin/false) # exit status 1 # getApplication() { # Re-use positional parameters for automatic whitespace elimination set -- $(foamDictionary -entry application -value system/controlDict) if [ "$#" -eq 1 ] then echo "$1" else echo "Error retrieving 'application' from controlDict" 1>&2 echo false return 1 fi } runApplication() { APP_RUN= LOG_IGNORE=false LOG_APPEND=false LOG_SUFFIX= # Parse options and executable while [ $# -gt 0 ] && [ -z "$APP_RUN" ]; do key="$1" case "$key" in -append|-a) LOG_IGNORE=true LOG_APPEND=true ;; -overwrite|-o) LOG_IGNORE=true ;; -suffix|-s) LOG_SUFFIX=".$2" shift ;; *) APP_RUN="$key" APP_NAME="${key##*/}" LOG_SUFFIX="${APP_NAME}${LOG_SUFFIX}" ;; esac shift done if [ -f log.$LOG_SUFFIX ] && [ "$LOG_IGNORE" = "false" ] then echo "$APP_NAME already run on $PWD:" \ "remove log file 'log.$LOG_SUFFIX' to re-run" else echo "Running $APP_RUN on $PWD" if [ "$LOG_APPEND" = "true" ]; then $APP_RUN "$@" >> log.$LOG_SUFFIX 2>&1 else $APP_RUN "$@" > log.$LOG_SUFFIX 2>&1 fi fi } runParallel() { APP_RUN= LOG_IGNORE=false LOG_APPEND=false LOG_SUFFIX= # Store any parsed additional arguments e.g. decomposeParDict APP_PARARGS= # Initialise number of procs to unset value nProcs=-1 # Parse options and executable while [ $# -gt 0 ] && [ -z "$APP_RUN" ]; do key="$1" case "$key" in -append|-a) LOG_IGNORE=true LOG_APPEND=true ;; -overwrite|-o) LOG_IGNORE=true ;; -suffix|-s) LOG_SUFFIX=".$2" shift ;; -np|-n) nProcs="$2" shift ;; -decomposeParDict) nProcs=$(getNumberOfProcessors "$2") APP_PARARGS="$APP_PARARGS -decomposeParDict $2" shift ;; *) APP_RUN="$key" APP_NAME="${key##*/}" LOG_SUFFIX="${APP_NAME}${LOG_SUFFIX}" ;; esac shift done [ "$nProcs" -eq -1 ] && nProcs=$(getNumberOfProcessors system/decomposeParDict) if [ -f log.$LOG_SUFFIX ] && [ "$LOG_IGNORE" = "false" ] then echo "$APP_NAME already run on $PWD:" \ "remove log file 'log.$LOG_SUFFIX' to re-run" else echo "Running $APP_RUN in parallel on $PWD using $nProcs processes" if [ "$LOG_APPEND" = "true" ]; then ( mpirun -np $nProcs $APP_RUN $APP_PARARGS -parallel "$@" < /dev/null >> log.$LOG_SUFFIX 2>&1 ) else ( mpirun -np $nProcs $APP_RUN $APP_PARARGS -parallel "$@" < /dev/null > log.$LOG_SUFFIX 2>&1 ) fi fi } compileApplication() { echo "Compiling $1 application" wmake $1 } # # cloneCase srcDir dstDir # cloneCase() { if [ -e "$2" ] then echo "Case already cloned: remove case directory $2 to clone" elif [ -d "$1" ] then echo "Cloning $2 case from $1" mkdir $2 # These must exist, so do not hide error messages for f in system constant do \cp -r $1/$f $2 done # Either (or both) may exist, so error messages may be spurious for f in 0 0.orig do \cp -r $1/$f $2 2>/dev/null done else echo "Error: cannot clone from non-existent directory" echo " $1" fi } # Overwrite 0/ with the contents of 0.orig/ if it exists. # The -processor option to do the processor directories instead # restore0Dir() { if [ "$1" = "-processor" ] then echo "Restore 0/ from 0.orig/ for processor directories" [ -d 0.orig ] || echo " Warning: no 0.orig/ found" # do nonetheless \ls -d processor* | xargs -I {} \rm -rf ./{}/0 \ls -d processor* | xargs -I {} \cp -r 0.orig ./{}/0 > /dev/null 2>&1 else echo "Restore 0/ from 0.orig/" if [ -d 0.orig ] then \rm -rf 0 \cp -r 0.orig 0 2>/dev/null else echo " Warning: no 0.orig/ found" fi fi } #------------------------------------------------------------------------------