#!/bin/sh #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | www.openfoam.com # \\/ M anipulation | #------------------------------------------------------------------------------ # Copyright (C) 2011 OpenFOAM Foundation # Copyright (C) 2018-2019 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 <http://www.gnu.org/licenses/>. # # Script # foamNewCase # # Description # Create a new case from a template for particular applications # - requires rsync # # Environment # FOAM_API # WM_PROJECT_DIR # WM_PROJECT_SITE # #------------------------------------------------------------------------------ groupDir="${WM_PROJECT_SITE:-${WM_PROJECT_DIR:-<unknown>}/site}" userDir="$HOME/.OpenFOAM" projectApi="${FOAM_API:-unknown}" templateDir="appTemplates" #------------------------------------------------------------------------------ usage() { exec 1>&2 while [ "$#" -ge 1 ]; do echo "$1"; shift; done cat<<USAGE Usage: ${0##*/} [OPTION] options: -app NAME specify the application to use -case DIR specify alternative case directory, default is the cwd -list list the applications available -with-api=NUM specify alternative api to use (default: \$FOAM_API) -version VER [obsolete] -help Print the usage clone initial application settings to the specified case from $userDir/$templateDir/{$projectApi,}/APP $groupDir/$templateDir/{$projectApi,}/APP USAGE exit 1 } #------------------------------------------------------------------------------ unset appName caseName optList # parse options while [ "$#" -gt 0 ] do case "$1" in -h | -help*) usage ;; -app) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" appName="$2" shift ;; -case) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" caseName="$2" shift ;; -l | -list) optList=true ;; -v | -ver | -version) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" echo "ignored defunct option -version" 1>&2 shift ;; -with-api=*) projectApi="${1#*=}" ;; -*) usage "unknown option: '$*'" ;; *) usage "unexpected argument: '$*'" ;; esac shift done # need rsync, except for when listing command -v rsync >/dev/null 2>&1 || \ [ "$optList" = true ] || usage "Error: 'rsync' seems to be missing" #------------------------------------------------------------------------------ # # find apps in current directory # considered an app if it has constant/ and system/ directories # findApps() { for app in $(/bin/ls -d * 2>/dev/null) do [ -d "$app/constant" -a -d "$app/system" ] && echo "$app" done } appList=$( for dir in "$userDir/$templateDir" "$groupDir/$templateDir" do if cd "$dir" 2>/dev/null then findApps ## generic ## version-specific if [ -n "$projectApi" ] then cd "$projectApi" 2>/dev/null && findApps fi fi done | sort | uniq ) listApps() { echo echo "applications available:" for i in $appList do echo " $i" done echo } if [ "$optList" = true ] then listApps exit 0 elif [ "$(echo $appList | wc -w)" -eq 0 ] then echo "Error: no applications available" exit 1 elif [ -z "$appName" ] then echo "Error: no -app specified" listApps exit 1 fi # get the corresponding srcDir name srcDir=$( for dir in "$userDir/$templateDir" "$groupDir/$templateDir" do if [ -d $dir ] then for appDir in "$dir/$projectApi/$appName" "$dir/$appName" do if [ -d $appDir -a -d $appDir/constant -a -d $appDir/system ] then echo "$appDir" break 2 fi done fi done ) [ -d "$srcDir" ] || { echo "Error: could not find template for $appName" listApps exit 1 } # adjust for caseName as required if [ -n "$caseName" ] then [ -d "$caseName" ] || mkdir -p "$caseName" cd "$caseName" 2>/dev/null || usage "directory does not exist: '$caseName'" fi newDir=$PWD [ -d "$newDir" -a -w "$newDir" ] || { echo "Error: target directory does not exist or is unwritable" echo " $newDir" exit 1 } # add some useful subdirs: mkdir -p $newDir/postPro echo " application $appName" echo " source $srcDir" echo " target $newDir" echo " syncing ..." # sync updated files only, itemize changes so we know what is going on rsync -aui $srcDir/ $newDir echo Done #------------------------------------------------------------------------------