mirror of
https://github.com/OpenFOAM/OpenFOAM-6.git
synced 2025-12-08 06:57:46 +00:00
198 lines
5.0 KiB
Bash
Executable File
198 lines
5.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#------------------------------------------------------------------------------
|
|
# ========= |
|
|
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
# \\ / O peration | Website: https://openfoam.org
|
|
# \\ / A nd | Copyright (C) 2015-2018 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
|
|
# foamMonitor
|
|
#
|
|
# Description
|
|
# Monitor data with Gnuplot from time-value(s) graphs written by OpenFOAM
|
|
# e.g. by functionObjects
|
|
# - requires gnuplot, gnuplot_x11
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
usage() {
|
|
cat<<USAGE
|
|
|
|
Usage: ${0##*/} [OPTION] <file>
|
|
options:
|
|
-help | -h print the usage
|
|
-idle | -i <time> stops if <file> unchanging for <time> sec (default 60s)
|
|
-title | -t <title> set the graph title (default "Data Monitoring")
|
|
-logscale | -l plots data (y-axis) on log scale, e.g. for residuals
|
|
-refresh | -r <time> refreshes display every <time> sec (default 10s)
|
|
-yrange | -y <range> sets data (y-axis) <range>, format "[0:1]"
|
|
|
|
Monitor data with Gnuplot from time-value(s) graphs written by OpenFOAM
|
|
e.g. by functionObjects
|
|
- requires gnuplot, gnuplot_x11
|
|
|
|
Example:
|
|
foamMonitor -l postProcessing/residuals/0/residuals.dat
|
|
|
|
USAGE
|
|
}
|
|
|
|
error() {
|
|
exec 1>&2
|
|
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
|
usage
|
|
exit 1
|
|
}
|
|
|
|
plotFileHeader() {
|
|
cat<<EOF
|
|
set term x11 1 font "helvetica,17" linewidth 1.5 persist noraise
|
|
$logscale
|
|
$yrange
|
|
set title "$title"
|
|
set xlabel "$xlabel"
|
|
plot \\
|
|
EOF
|
|
}
|
|
|
|
plotFileFooter() {
|
|
cat<<EOF
|
|
|
|
pause $refresh
|
|
reread
|
|
EOF
|
|
}
|
|
|
|
howMany() ( echo "$1" | awk '{ print NF }' )
|
|
#howMany() ( echo "$1" | set -f; set -- $1; echo $# )
|
|
|
|
isInteger() {
|
|
[ ! -z "${1##*[!0-9]*}" ] && echo "$1" && return 0
|
|
}
|
|
|
|
idle=60
|
|
refresh=10
|
|
logscale=""
|
|
yrange=""
|
|
title="Data Monitoring"
|
|
command -v gnuplot >/dev/null 2>&1 || error "Gnuplot not installed"
|
|
|
|
# parse options
|
|
while [ "$#" -gt 0 ]
|
|
do
|
|
case "$1" in
|
|
-h | -help)
|
|
usage && exit 0
|
|
;;
|
|
-i | -idle)
|
|
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
|
|
idle=$(isInteger "$2") || error "Argument of '$1' is not an integer: '$2'"
|
|
shift 2
|
|
;;
|
|
-l | -logscale)
|
|
logscale="set logscale y"
|
|
shift 1
|
|
;;
|
|
-t | -title)
|
|
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
|
|
title=$2
|
|
shift 2
|
|
;;
|
|
-r | -refresh)
|
|
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
|
|
refresh=$(isInteger "$2") || error "Argument of '$1' is not an integer: '$2'"
|
|
shift 2
|
|
;;
|
|
-y | -yrange)
|
|
[ "$#" -ge 2 ] || error "'$1' option requires an argument"
|
|
yrange="set yrange $2"
|
|
shift 2
|
|
;;
|
|
-*)
|
|
error "unknown option: '$*'"
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[ $# -eq 1 ] || error "Incorrect arguments specified"
|
|
[ -f "$1" ] || error "File $1 does not exit"
|
|
file=$1
|
|
|
|
# Get keys from header
|
|
keys=$(grep -E '^#' "$file" | tail -1)
|
|
|
|
[ "x$keys" = "x" ] && keys="# Step"
|
|
n_keys=$(howMany "$keys")
|
|
n_cols=$(tail -1 "$file" | awk '{ print NF }')
|
|
|
|
# With full column labels, n_keys = n_cols + 1, since it includes "#"
|
|
|
|
# If n_keys > n_cols + 1, REMOVE EXCESS keys
|
|
n_cols_pone=$(( n_cols + 1 ))
|
|
[ "$n_keys" -gt "$n_cols_pone" ] && \
|
|
keys=$(echo "$keys" | cut -d" " -f1-$n_cols_pone)
|
|
n_keys=$(howMany "$keys")
|
|
|
|
i=0
|
|
while [ "$n_keys" -le "$n_cols" ]
|
|
do
|
|
i=$(( i + 1 ))
|
|
keys="$keys data$i"
|
|
n_keys=$(howMany "$keys")
|
|
done
|
|
|
|
# Remove # and Time keys
|
|
xlabel=$(echo "$keys" | cut -d " " -f2)
|
|
keys=$(echo "$keys" | cut -d " " -f3-)
|
|
|
|
gp_file=$(mktemp /tmp/tmp.XXXXXX)
|
|
plotFileHeader > "$gp_file"
|
|
i=1
|
|
for field in $keys
|
|
do
|
|
i=$(( i + 1 ))
|
|
plot_line="\"$file\" using 1:${i} with lines title \"$field\""
|
|
if [ $i -lt "$n_cols" ]
|
|
then
|
|
plot_line="$plot_line, \\"
|
|
fi
|
|
echo "$plot_line" >> "$gp_file"
|
|
done
|
|
plotFileFooter >> "$gp_file"
|
|
|
|
touch "$file"
|
|
gnuplot "$gp_file" &
|
|
pid=$!
|
|
|
|
while true
|
|
do
|
|
mod_time=$(stat --format=%Y "$file")
|
|
idle_ago=$(( $(date +%s) - idle ))
|
|
test "$mod_time" -gt "$idle_ago" || break
|
|
sleep "$refresh"
|
|
done
|
|
|
|
kill -9 $pid
|
|
rm "$gp_file"
|
|
|
|
#------------------------------------------------------------------------------
|