Files
OpenFOAM-12/bin/foamGet
Henry Weller de363dde05 functionObjectList: Moved the functions entry from controlDict into a functions file
for consistency with fvModels and fvConstraints, to simplify code and case
maintenance and to avoid the potentially complex functions entries being
unnecessarily parsed by utilities for which functionObject evaluation is
disabled.

The functions entry in controlDict is still read if the functions file is not
present for backward-compatibility, but it is advisable to migrate cases to use
the new functions file.
2024-01-20 14:46:28 +00:00

279 lines
7.2 KiB
Bash
Executable File

#!/bin/sh
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration | Website: https://openfoam.org
# \\ / A nd | Copyright (C) 2018-2024 OpenFOAM Foundation
# \\/ M anipulation |
#------------------------------------------------------------------------------
# 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
# foamGet
#
# Description
# Finds an example OpenFOAM case dictionary in $FOAM_ETC/caseDicts and
# copies it into the respective case directory.
#
#------------------------------------------------------------------------------
usage() {
cat<<USAGE
Usage: ${0##*/} [OPTIONS] <file>
options:
-case | -c <dir> specify case directory (default = local dir)
-ext | -e <ext> specify file extension, e.g -e cfg for files with ".cfg"
-help | -h print the usage
-no-ext | -n specify file without extension
-target | -t <dir> specify target directory (default = system)
Finds an example OpenFOAM case dictionary file in $FOAM_ETC/caseDicts and
copies it into the respective case directory, e.g.
foamGet decomposeParDict
foamGet extrudeMeshDict
foamGet createPatchDict
foamGet surfaces
USAGE
}
error() {
exec 1>&2
while [ "$#" -ge 1 ]; do echo "Error: $1"; shift; done
usage
exit 1
}
findFilesInDirs () {
_dirs="$1"
_str="$2"
_out=""
for _d in $_dirs
do
[ -d "$_d" ] && _out="$(find -L "$_d" -name "$_str" -type f | sort) $_out"
done
# Remove whitespace and blank lines
echo "$_out" | xargs -n 1 | awk 'NF'
}
findFiles () {
_dirs="$1"
_prefix="$2"
_ext="$3"
if [ -z "$_ext" ] || [ "$_ext" = "ANY" ] ; then
findFilesInDirs "$_dirs" "$_prefix"
else
findFilesInDirs "$_dirs" "${_prefix}.${_ext}"
fi
[ "$_ext" = "ANY" ] && findFilesInDirs "$_dirs" "${_prefix}.*"
}
# Remove files from unrelated version subdirs in ~/.OpenFOAM directory
pruneFiles () {
_files="$@"
_vers="$(find ~/.OpenFOAM/ \
-maxdepth 1 -mindepth 1 \
-type d -name "[[:digit:]]*" \
-o -name "dev" 2> /dev/null | \
grep -v "$WM_PROJECT_VERSION" | \
awk -F "/" '{print $NF}')"
[ "$_vers" ] && \
for _v in $_vers
do
_files="$(echo $_files | xargs -n 1 | grep -v ".OpenFOAM/$_v")"
done
echo "$_files"
}
nArgs () {
echo "$1" | xargs -n 1 | wc -l
}
listArgs () {
_i=0
_suggest=""
_pri=100
for _a in $1
do
_i=$(( _i + 1))
echo "${_i}) $_a" >&2
# Prioritise suggestion locations
_tests="\
caseDicts/functions/ \
caseDicts/preProcessing/ \
caseDicts/general/ \
caseDicts/mesh/ \
caseDicts/surface/ \
caseDicts/solvers/"
_n=0
for _t in $_tests
do
_n=$(( _n + 1))
[ "$_n" -lt "$_pri" ] && \
echo "$_a" | grep -q "$_t" && _suggest="$_i" && _pri="$_n"
done
done
echo "$_suggest"
}
cpFile () {
_file="$1"
_dir="$2"
[ -d "$_dir" ] || return 0
echo "Copying $_file to $_dir"
cp "$_file" "$_dir"
}
setTgt () {
_prefix="$1"
_file="$2"
_tgt="$3"
! [ "$_tgt" ] && \
echo "$_file" | grep -q fvModel && \
_tgt="constant"
! [ "$_tgt" ] && \
echo "$_file" | grep -q fvConstraint && \
_tgt="system"
! [ "$_tgt" ] && \
case "$prefix" in
All*) _tgt="." ;;
*Properties|*Cloud) _tgt="constant" ;;
s) _tgt="0" ;;
*) _tgt="system" ;;
esac
echo "$_tgt"
[ -d "$_tgt" ] && return 0
echo "target directory does not exist: '$_tgt'" >&2
return 0
}
setFile () {
_files="$1"
_n="$2"
echo "$_files" | tr -s "\n" " " | awk -v n="$_n" '{print $n}'
}
noFilesMessage () {
_ext="$1"
[ "$_ext" = "ANY" ] && echo "(with or without file extensions)" && return 1
[ -n "$_ext" ] && echo "with file extension '$_ext'" && return 1
}
searchDirs="\
${HOME}/.OpenFOAM"
[ -n "$WM_PROJECT_SITE" ] && searchDirs="$searchDirs \
$WM_PROJECT_SITE/$WM_PROJECT_VERSION/etc \
$WM_PROJECT_SITE/etc"
searchDirs="$searchDirs \
$WM_PROJECT_INST_DIR/site/$WM_PROJECT_VERSION/etc \
$WM_PROJECT_INST_DIR/site/etc \
$FOAM_ETC/caseDicts"
ext="ANY"
tgt=""
while [ "$#" -gt 0 ]
do
case "$1" in
-c | -case)
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
cd "$2" 2>/dev/null || error "directory does not exist: '$2'"
shift 2
;;
-e | -ext)
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
ext="$2"
shift 2
;;
-h | -help)
usage && exit 0
;;
-n | -no-ext)
ext=""
shift
;;
-t | -target)
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
tgt="$2"
shift 2
;;
-*)
error "invalid option '$1'"
;;
*)
break
;;
esac
done
[ $# -gt 1 ] && error "$# arguments \"$*\" specified: only 1 permitted"
[ $# -eq 1 ] || error "missing argument: no file name/prefix <file> supplied"
prefix="$1"
{ [ -s "system/controlDict" ] || [ -s "system/controlDict.orig" ] ; } || \
echo "Warning: cannot find a system/controlDict file" \
"- is this a case directory?"
files="$(findFiles "$searchDirs" "$prefix" "$ext")"
# For ~/.OpenFOAM, prune out version subdirs except current version
files="$(pruneFiles $files)"
[ -z "$files" ] && \
error "no file $prefix found $(noFilesMessage "$ext")"
nFiles="$(nArgs "$files")"
[ "$nFiles" -eq 1 ] && \
tgt="$(setTgt "$prefix" "$files" "$tgt")" && \
cpFile "$files" "$tgt" && exit 0
echo "Multiple files with \"$prefix\" prefix found:"
suggest="$(listArgs "$files")"
echo "$files" | grep -q "annotated/" && \
echo "** Note: it is easier to use files NOT in the \"annotated\" directory"
printf "\n%s" "Enter file number (1-$nFiles) to obtain description "
[ -n "$suggest" ] && printf "%s" "(suggest $suggest) "
printf "%s" ": "
read -r nFile
[ -z "$nFile" ] && [ -n "$suggest" ] && nFile="$suggest"
[ -z "$nFile" ] && \
echo "Cannot specify nothing; re-run and enter a file number" && exit 1
! [ "$nFile" -eq "$nFile" ] 2>/dev/null && \
echo "\"$nFile\" is not a number between 1 and $nFiles" && exit 1
[ "$nFile" -lt 1 ] || [ "$nFile" -gt "$nFiles" ] && \
echo "\"$nFile\" is not a number between 1 and $nFiles" && exit 1
file="$(setFile "$files" "$nFile")"
tgt="$(setTgt "$prefix" "$file" "$tgt")"
cpFile "$file" "$tgt"