#!/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, distributed under GPL-3.0-or-later. # # 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:-}/site}" userDir="$HOME/.OpenFOAM" projectApi="${FOAM_API:-unknown}" templateDir="appTemplates" #------------------------------------------------------------------------------ usage() { exec 1>&2 while [ "$#" -ge 1 ]; do echo "$1"; shift; done cat<&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 #------------------------------------------------------------------------------