View Issue Details

IDProjectCategoryView StatusLast Update
0003080OpenFOAMFeaturepublic2018-10-02 21:46
ReporterFynnAschmoneit Assigned Towill  
PrioritylowSeverityfeatureReproducibilityN/A
Status resolvedResolutionfixed 
PlatformGNU/LinuxOSUbuntuOS Version15.04
Fixed in Versiondev 
Summary0003080: foamMonitor to plot in terminal window, e.g. for execution on server
DescriptionI made some minor changes to foamMonitor to use gnuplot's 'dump' output, if foamMonitor is executed with -d or -dumb option.
I use this a lot to have a quick look at how my function objects outputs are evolving. Especially when OF is executed on a server this allows you to still use foamMonitor without a GUI.


TagsNo tags attached.

Activities

FynnAschmoneit

2018-10-01 13:51

reporter  

foamMonitor (5,202 bytes)   
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    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
#
#------------------------------------------------------------------------------
usage() {
    cat<<USAGE

Usage: ${0##*/} [OPTION] <file>
options:
  -help     | -h         print the usage
  -dumb     | -d         uses gnuplot's 'dump' terminal (default x11)
  -idle     | -i <time>  stops if <file> unchanging for <time> sec (default 60s)
  -logscale | -l         plots data (y-axis) on log scale, e.g. for residuals
  -refresh  | -r <time>  refreshes display every <time> sec (default 10s) 
  -title    | -t <title> set the graph title (default "Data Monitoring")
  -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

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 $gpterminal
$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"
gpterminal='x11 1 font "helvetica,17" linewidth 1.5 persist noraise'

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
        ;;
    -d | -dumb)
	gpterminal='dumb'
	shift 1
	;;
    -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
        ;;
    -r | -refresh)
        [ "$#" -ge 2 ] || error "'$1' option requires an argument"
        refresh=$(isInteger "$2") || error "Argument of '$1' is not an integer: '$2'"
        shift 2
        ;;
    -t | -title)
        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
        title=$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"

#------------------------------------------------------------------------------
foamMonitor (5,202 bytes)   

will

2018-10-02 21:46

manager   ~0010080

Agreed. This is useful.

Equivalent changes have been pushed to dev as commit 80df5420. The argument I've gone for is "-ascii" or "-a". The name "-dumb" isn't terribly descriptive. We are wrapping gnuplot, so there's the option of something a little more usable.

I've also added a "-size"/"-s" argument which I can be used for enlarging the ascii image, which is particularly useful when you are looking at multiple lines (e.g., residuals). This argument can be used with x11, too.

Issue History

Date Modified Username Field Change
2018-10-01 13:51 FynnAschmoneit New Issue
2018-10-01 13:51 FynnAschmoneit File Added: foamMonitor
2018-10-02 21:46 will Assigned To => will
2018-10-02 21:46 will Status new => resolved
2018-10-02 21:46 will Resolution open => fixed
2018-10-02 21:46 will Fixed in Version => dev
2018-10-02 21:46 will Note Added: 0010080