Skip to content
Snippets Groups Projects
foamMonitor 4.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/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  |
    #-------------------------------------------------------------------------------
    
    #    Copyright (C) 2015 OpenFOAM Foundation
    
    #    Copyright (C) 2019-2021 OpenCFD Ltd.
    
    #------------------------------------------------------------------------------
    
    #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
    
    #
    # Script
    #     foamMonitor
    #
    # Description
    #     Monitor data with Gnuplot from time-value(s) graphs written by OpenFOAM
    #     e.g. by functionObjects
    #     - requires gnuplot, gnuplot_x11
    #
    #------------------------------------------------------------------------------
    
    Usage: ${0##*/} [OPTIONS] <file>
    Options:
      -g | -grid            Draw grid lines
      -i | -idle <time>     Stop if <file> unchanging for <time> sec (default = 60)
      -l | -logscale        Plot y-axis data on log scale
      -r | -refresh <time>  Refresh display every <time> sec (default = 10)
      -x | -xrange <range>  Set <range> of x-axis data, format "[0:1]"
      -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
    
    e.g. by functionObjects. For example,
    
        foamMonitor -l postProcessing/residuals/0/residuals.dat
    
        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
    
    plotFileHeader() {
        cat<<EOF
    set term x11 1 font "helvetica,17" linewidth 1.5 persist noraise
    $LOGSCALE
    
    set title "Data Monitoring"
    set xlabel "$XLABEL"
    plot \\
    EOF
    }
    
    
    plotFileFooter() {
        cat<<EOF
    pause $REFRESH
    reread
    EOF
    }
    
    
    
    # Count number of tokens in a variable
    howMany() {
        ( set -f; set -- $1; echo $# )
    }
    
    
    #-------------------------------------------------------------------------------
    
    [ ! "$GNUPLOT" = "" ] || die "foamMonitor requires Gnuplot installed"
    
    #-------------------------------------------------------------------------------
    
    # Parse options
    
            [ "$#" -ge 2 ] || die "'$1' option requires an argument"
            if [ -n "${2##*[!0-9]*}" ]
            then
                IDLE=$2
            else
                die "Argument of '$1' is not an integer: '$2'"
            fi
    
            shift 2
            ;;
        -l | -logscale)
            LOGSCALE="set logscale y"
            shift 1
            ;;
        -r | -refresh)
    
            [ "$#" -ge 2 ] || die "'$1' option requires an argument"
            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"
    
            [ "$#" -ge 2 ] || die "'$1' option requires an argument"
    
        -g | -grid)
            GRID="set grid"
            shift 1
            ;;
    
    [ "$#" -eq 1 ] || die "Incorrect arguments specified"
    [ -f "$1" ]    || die "File $1 does not exit"
    FILE="$1"
    
    KEYS=$(grep -E '^#' "$FILE" | tail -1)
    
    NCOLS=$(grep -m 1 '^[^#]' "$FILE" | awk '{ print NF }')
    
    
    # With full column labels, NKEYS = NCOLS + 1, since it includes "#"
    
    # If NKEYS > NCOLS + 1, REMOVE EXCESS KEYS
    
    [ "$NKEYS" -gt "$NCOLSPONE" ] && KEYS=$(echo $KEYS | cut -d" " -f1-$NCOLSPONE)
    NKEYS=$(howMany "$KEYS")
    
    i=0
    while [ "$NKEYS" -le "$NCOLS" ]
    do
    
        KEYS="$KEYS data$i"
        NKEYS=$(howMany "$KEYS")
    done
    
    # Remove # and Time keys
    XLABEL=$(echo $KEYS | cut -d " " -f2)
    KEYS=$(echo $KEYS | cut -d " " -f3-)
    
    GPFILE=$(mktemp)
    
        PLOTLINE="\"$FILE\" using 1:${i} with lines title \"$field\""
    
        if [ $i -lt $NCOLS ]
    
    PID=$!
    
    while true
    do
        MODTIME=$(stat --format=%Y $FILE)
    
        test "$MODTIME" -gt "$IDLEAGO" || break
        sleep $REFRESH
    done
    
    kill -9 $PID
    
    
    #------------------------------------------------------------------------------