mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: foamMonitor: modernise and refactor for POSIX compliance (#2202)
ENH: add xrange option
This commit is contained in:
125
bin/foamMonitor
125
bin/foamMonitor
@ -7,7 +7,7 @@
|
|||||||
# \\/ M anipulation |
|
# \\/ M anipulation |
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Copyright (C) 2015 OpenFOAM Foundation
|
# Copyright (C) 2015 OpenFOAM Foundation
|
||||||
# Copyright (C) 2019 OpenCFD Ltd.
|
# Copyright (C) 2019-2021 OpenCFD Ltd.
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# License
|
# License
|
||||||
# This file is part of OpenFOAM.
|
# This file is part of OpenFOAM.
|
||||||
@ -34,35 +34,49 @@
|
|||||||
# - requires gnuplot, gnuplot_x11
|
# - requires gnuplot, gnuplot_x11
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
usage() {
|
printHelp() {
|
||||||
exec 1>&2
|
|
||||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
|
||||||
cat<<USAGE
|
cat<<USAGE
|
||||||
|
|
||||||
Usage: ${0##*/} [OPTION] <file>
|
Usage: ${0##*/} [OPTIONS] <file>
|
||||||
options:
|
Options:
|
||||||
-h | -help prints the usage
|
-g | -grid Draw grid lines
|
||||||
-i | -idle <time> stops if <file> unchanging for <time> sec (default = 60)
|
-i | -idle <time> Stop if <file> unchanging for <time> sec (default = 60)
|
||||||
-l | -logscale plots data (y-axis) on log scale, e.g. for residuals
|
-l | -logscale Plot y-axis data on log scale
|
||||||
-r | -refresh <time> refreshes display every <time> sec (default = 10)
|
-r | -refresh <time> Refresh display every <time> sec (default = 10)
|
||||||
-y | -yrange <range> sets data (y-axis) <range>, format "[0:1]"
|
-x | -xrange <range> Set <range> of x-axis data, format "[0:1]"
|
||||||
-g | -grid draws grid lines on the plot
|
-y | -yrange <range> Set <range> of y-axis data, format "[0:1]"
|
||||||
|
-h | -help Display short help and exit
|
||||||
|
|
||||||
Monitor data with Gnuplot from time-value(s) graphs written by OpenFOAM
|
Monitor data with Gnuplot from time-value(s) graphs written by OpenFOAM
|
||||||
e.g. by functionObjects
|
e.g. by functionObjects. For example,
|
||||||
- requires gnuplot, gnuplot_x11
|
|
||||||
|
|
||||||
Example:
|
foamMonitor -l postProcessing/residuals/0/residuals.dat
|
||||||
foamMonitor -l postProcessing/residuals/0/residuals.dat
|
|
||||||
|
|
||||||
USAGE
|
USAGE
|
||||||
|
exit 0 # A clean exit
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Report error and exit
|
||||||
|
die()
|
||||||
|
{
|
||||||
|
exec 1>&2
|
||||||
|
echo
|
||||||
|
echo "Error encountered:"
|
||||||
|
while [ "$#" -ge 1 ]; do echo " $1"; shift; done
|
||||||
|
echo
|
||||||
|
echo "See '${0##*/} -help' for usage"
|
||||||
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Set Gnuplot header
|
||||||
plotFileHeader() {
|
plotFileHeader() {
|
||||||
cat<<EOF
|
cat<<EOF
|
||||||
set term x11 1 font "helvetica,17" linewidth 1.5 persist noraise
|
set term x11 1 font "helvetica,17" linewidth 1.5 persist noraise
|
||||||
$LOGSCALE
|
$LOGSCALE
|
||||||
|
$XRANGE
|
||||||
$YRANGE
|
$YRANGE
|
||||||
$GRID
|
$GRID
|
||||||
set title "Data Monitoring"
|
set title "Data Monitoring"
|
||||||
@ -71,34 +85,49 @@ plot \\
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Set Gnuplot footer
|
||||||
plotFileFooter() {
|
plotFileFooter() {
|
||||||
cat<<EOF
|
cat<<EOF
|
||||||
|
|
||||||
pause $REFRESH
|
pause $REFRESH
|
||||||
reread
|
reread
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
howMany() ( set -f; set -- $1; echo $# )
|
|
||||||
|
|
||||||
|
# Count number of tokens in a variable
|
||||||
|
howMany() {
|
||||||
|
( set -f; set -- $1; echo $# )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
IDLE=60
|
IDLE=60
|
||||||
REFRESH=10
|
REFRESH=10
|
||||||
LOGSCALE=""
|
LOGSCALE=""
|
||||||
|
XRANGE=""
|
||||||
YRANGE=""
|
YRANGE=""
|
||||||
GRID=""
|
GRID=""
|
||||||
GNUPLOT=$(which gnuplot)
|
GNUPLOT=$(which gnuplot)
|
||||||
! [ "x$GNUPLOT" = "x" ] || usage "Gnuplot not installed"
|
[ ! "$GNUPLOT" = "" ] || die "foamMonitor requires Gnuplot installed"
|
||||||
|
|
||||||
# parse options
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Parse options
|
||||||
while [ "$#" -gt 0 ]
|
while [ "$#" -gt 0 ]
|
||||||
do
|
do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-h | -help*)
|
-h | -help*)
|
||||||
usage
|
printHelp
|
||||||
;;
|
;;
|
||||||
-i | -idle)
|
-i | -idle)
|
||||||
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
||||||
[ ! -z "${2##*[!0-9]*}" ] && IDLE=$2 || usage "Argument of '$1' is not an integer: '$2'"
|
if [ -n "${2##*[!0-9]*}" ]
|
||||||
|
then
|
||||||
|
IDLE=$2
|
||||||
|
else
|
||||||
|
die "Argument of '$1' is not an integer: '$2'"
|
||||||
|
fi
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-l | -logscale)
|
-l | -logscale)
|
||||||
@ -106,12 +135,22 @@ do
|
|||||||
shift 1
|
shift 1
|
||||||
;;
|
;;
|
||||||
-r | -refresh)
|
-r | -refresh)
|
||||||
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
||||||
[ ! -z "${2##*[!0-9]*}" ] && REFRESH=$2 || usage "Argument of '$1' is not an integer: '$2'"
|
if [ -n "${2##*[!0-9]*}" ]
|
||||||
|
then
|
||||||
|
REFRESH=$2
|
||||||
|
else
|
||||||
|
die "Argument of '$1' is not an integer: '$2'"
|
||||||
|
fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-x | -xrange)
|
||||||
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
||||||
|
XRANGE="set xrange $2"
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
-y | -yrange)
|
-y | -yrange)
|
||||||
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
||||||
YRANGE="set yrange $2"
|
YRANGE="set yrange $2"
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
@ -120,7 +159,7 @@ do
|
|||||||
shift 1
|
shift 1
|
||||||
;;
|
;;
|
||||||
-*)
|
-*)
|
||||||
usage "unknown option: '$*'"
|
die "unknown option: '$*'"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
break
|
break
|
||||||
@ -128,28 +167,28 @@ do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
[ $# -eq 1 ] || usage "Incorrect arguments specified"
|
[ "$#" -eq 1 ] || die "Incorrect arguments specified"
|
||||||
[ -f $1 ] || usage "File $1 does not exit"
|
[ -f "$1" ] || die "File $1 does not exit"
|
||||||
FILE=$1
|
FILE="$1"
|
||||||
|
|
||||||
# Get KEYS from header
|
# Get KEYS from header
|
||||||
KEYS=$(grep -E '^#' $FILE | tail -1)
|
KEYS=$(grep -E '^#' "$FILE" | tail -1)
|
||||||
|
|
||||||
[ "x$KEYS" = "x" ] && KEYS="# Step"
|
[ "$KEYS" = "" ] && KEYS="# Step"
|
||||||
NKEYS=$(howMany "$KEYS")
|
NKEYS=$(howMany "$KEYS")
|
||||||
NCOLS=$(tail -1 $FILE | awk '{ print NF}')
|
NCOLS=$(grep -m 1 '^[^#]' "$FILE" | awk '{ print NF }')
|
||||||
|
|
||||||
# With full column labels, NKEYS = NCOLS + 1, since it includes "#"
|
# With full column labels, NKEYS = NCOLS + 1, since it includes "#"
|
||||||
|
|
||||||
# If NKEYS > NCOLS + 1, REMOVE EXCESS KEYS
|
# If NKEYS > NCOLS + 1, REMOVE EXCESS KEYS
|
||||||
NCOLSPONE=$(expr $NCOLS + 1)
|
NCOLSPONE=$((NCOLS+1))
|
||||||
[ "$NKEYS" -gt "$NCOLSPONE" ] && KEYS=$(echo $KEYS | cut -d" " -f1-$NCOLSPONE)
|
[ "$NKEYS" -gt "$NCOLSPONE" ] && KEYS=$(echo $KEYS | cut -d" " -f1-$NCOLSPONE)
|
||||||
NKEYS=$(howMany "$KEYS")
|
NKEYS=$(howMany "$KEYS")
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
while [ "$NKEYS" -le "$NCOLS" ]
|
while [ "$NKEYS" -le "$NCOLS" ]
|
||||||
do
|
do
|
||||||
i=$(expr $i + 1)
|
i=$((i+1))
|
||||||
KEYS="$KEYS data$i"
|
KEYS="$KEYS data$i"
|
||||||
NKEYS=$(howMany "$KEYS")
|
NKEYS=$(howMany "$KEYS")
|
||||||
done
|
done
|
||||||
@ -159,33 +198,33 @@ XLABEL=$(echo $KEYS | cut -d " " -f2)
|
|||||||
KEYS=$(echo $KEYS | cut -d " " -f3-)
|
KEYS=$(echo $KEYS | cut -d " " -f3-)
|
||||||
|
|
||||||
GPFILE=$(mktemp)
|
GPFILE=$(mktemp)
|
||||||
plotFileHeader > $GPFILE
|
plotFileHeader > "$GPFILE"
|
||||||
i=1
|
i=1
|
||||||
for field in $KEYS
|
for field in $KEYS
|
||||||
do
|
do
|
||||||
i=$(expr $i + 1)
|
i=$((i+1))
|
||||||
PLOTLINE="\"$FILE\" using 1:${i} with lines title \"$field\""
|
PLOTLINE="\"$FILE\" using 1:${i} with lines title \"$field\""
|
||||||
if [ $i -lt $NCOLS ]
|
if [ $i -lt $NCOLS ]
|
||||||
then
|
then
|
||||||
PLOTLINE="$PLOTLINE, \\"
|
PLOTLINE="$PLOTLINE, \\"
|
||||||
fi
|
fi
|
||||||
echo $PLOTLINE >> $GPFILE
|
echo $PLOTLINE >> "$GPFILE"
|
||||||
done
|
done
|
||||||
plotFileFooter >> $GPFILE
|
plotFileFooter >> "$GPFILE"
|
||||||
|
|
||||||
touch $FILE
|
touch "$FILE"
|
||||||
$GNUPLOT $GPFILE &
|
$GNUPLOT "$GPFILE" &
|
||||||
PID=$!
|
PID=$!
|
||||||
|
|
||||||
while true
|
while true
|
||||||
do
|
do
|
||||||
MODTIME=$(stat --format=%Y $FILE)
|
MODTIME=$(stat --format=%Y $FILE)
|
||||||
IDLEAGO=$(expr $(date +%s) - $IDLE)
|
IDLEAGO=$(($(date +%s)-IDLE))
|
||||||
test "$MODTIME" -gt "$IDLEAGO" || break
|
test "$MODTIME" -gt "$IDLEAGO" || break
|
||||||
sleep $REFRESH
|
sleep $REFRESH
|
||||||
done
|
done
|
||||||
|
|
||||||
kill -9 $PID
|
kill -9 $PID
|
||||||
rm $GPFILE
|
rm -f "$GPFILE"
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user