Skip to content
Snippets Groups Projects
foamNewCase 5.66 KiB
Newer Older
Mark Olesen's avatar
Mark Olesen committed
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
OpenFOAM bot's avatar
OpenFOAM bot committed
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
OpenFOAM bot's avatar
OpenFOAM bot committed
#------------------------------------------------------------------------------
#     Copyright (C) 2011 OpenFOAM Foundation
#     Copyright (C) 2018-2019 OpenCFD Ltd.
#------------------------------------------------------------------------------
Mark Olesen's avatar
Mark Olesen committed
# 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.
Mark Olesen's avatar
Mark Olesen committed
#
#     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/>.
Mark Olesen's avatar
Mark Olesen committed
#
# Script
#     foamNewCase
#
# Description
#     Create a new case from a template for particular applications
#     - requires rsync
#
#     WM_PROJECT_DIR
#     WM_PROJECT_SITE
#
Mark Olesen's avatar
Mark Olesen committed
#------------------------------------------------------------------------------
groupDir="${WM_PROJECT_SITE:-${WM_PROJECT_DIR:-<unknown>}/site}"
userDir="$HOME/.OpenFOAM"
projectApi="${FOAM_API:-unknown}"
Mark Olesen's avatar
Mark Olesen committed
templateDir="appTemplates"

#------------------------------------------------------------------------------
usage() {
Mark Olesen's avatar
Mark Olesen committed
    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
Mark Olesen's avatar
Mark Olesen committed
  -list             list the applications available
  -with-api=NUM     specify alternative api to use (default: \$FOAM_API)
  -version VER      [obsolete]
  -help             Print the usage
Mark Olesen's avatar
Mark Olesen committed

clone initial application settings to the specified case from
    $userDir/$templateDir/{$projectApi,}/APP
    $groupDir/$templateDir/{$projectApi,}/APP
Mark Olesen's avatar
Mark Olesen committed

USAGE
    exit 1
}
#------------------------------------------------------------------------------
unset appName caseName optList
Mark Olesen's avatar
Mark Olesen committed

# parse options
while [ "$#" -gt 0 ]
do
    case "$1" in
Mark Olesen's avatar
Mark Olesen committed
        usage
        ;;
    -app)
        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
        appName="$2"
Mark Olesen's avatar
Mark Olesen committed
        ;;
    -case)
        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
        caseName="$2"
Mark Olesen's avatar
Mark Olesen committed
        ;;
    -l | -list)
Mark Olesen's avatar
Mark Olesen committed
        ;;
    -v | -ver | -version)
        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
        echo "ignored defunct option -version" 1>&2
        shift
        ;;
    -with-api=*)
        projectApi="${1#*=}"
Mark Olesen's avatar
Mark Olesen committed
        ;;
    -*)
        usage "unknown option: '$*'"
        ;;
        usage "unexpected argument: '$*'"
Mark Olesen's avatar
Mark Olesen committed
        ;;
    esac
# need rsync, except for when listing
command -v rsync >/dev/null 2>&1 || \
   [ "$optList" = true ] || usage "Error: 'rsync' seems to be missing"
Mark Olesen's avatar
Mark Olesen committed
#------------------------------------------------------------------------------

#
# 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"
    for dir in "$userDir/$templateDir" "$groupDir/$templateDir"
Mark Olesen's avatar
Mark Olesen committed
        then
            findApps                              ## generic

            ## version-specific
            if [ -n "$projectApi" ]
            then
                cd "$projectApi" 2>/dev/null && findApps
            fi
Mark Olesen's avatar
Mark Olesen committed
        fi
    done | sort | uniq
)


listApps()
{
    echo
    echo "applications available:"
    for i in $appList
    do
        echo "    $i"
    done
    echo
}


Mark Olesen's avatar
Mark Olesen committed
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"
Mark Olesen's avatar
Mark Olesen committed
    do
        if [ -d $dir ]
        then
            for appDir in "$dir/$projectApi/$appName" "$dir/$appName"
Mark Olesen's avatar
Mark Olesen committed
            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" ] || {
Andrew Heather's avatar
Andrew Heather committed
    echo "Error: target directory does not exist or is unwritable"
Mark Olesen's avatar
Mark Olesen committed
    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

#------------------------------------------------------------------------------