1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (c) 2011, Intel Corporation. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# DESCRIPTION 8*4882a593Smuzhiyun# This script operates on the .dat file generated by bb-matrix.sh. It tolerates 9*4882a593Smuzhiyun# the header by skipping the first line, but error messages and bad data records 10*4882a593Smuzhiyun# need to be removed first. It will generate three views of the plot, and leave 11*4882a593Smuzhiyun# an interactive view open for further analysis. 12*4882a593Smuzhiyun# 13*4882a593Smuzhiyun# AUTHORS 14*4882a593Smuzhiyun# Darren Hart <dvhart@linux.intel.com> 15*4882a593Smuzhiyun# 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# Setup the defaults 18*4882a593SmuzhiyunDATFILE="bb-matrix.dat" 19*4882a593SmuzhiyunXLABEL="BB_NUMBER_THREADS" 20*4882a593SmuzhiyunYLABEL="PARALLEL_MAKE" 21*4882a593SmuzhiyunFIELD=3 22*4882a593SmuzhiyunDEF_TITLE="Elapsed Time (seconds)" 23*4882a593SmuzhiyunPM3D_FRAGMENT="unset surface; set pm3d at s hidden3d 100" 24*4882a593SmuzhiyunSIZE="640,480" 25*4882a593Smuzhiyun 26*4882a593Smuzhiyunfunction usage { 27*4882a593SmuzhiyunCMD=$(basename $0) 28*4882a593Smuzhiyuncat <<EOM 29*4882a593SmuzhiyunUsage: $CMD [-d datfile] [-f field] [-h] [-t title] [-w] 30*4882a593Smuzhiyun -d datfile The data file generated by bb-matrix.sh (default: $DATFILE) 31*4882a593Smuzhiyun -f field The field index to plot as the Z axis from the data file 32*4882a593Smuzhiyun (default: $FIELD, "$DEF_TITLE") 33*4882a593Smuzhiyun -h Display this help message 34*4882a593Smuzhiyun -s W,H PNG and window size in pixels (default: $SIZE) 35*4882a593Smuzhiyun -t title The title to display, should describe the field (-f) and units 36*4882a593Smuzhiyun (default: "$DEF_TITLE") 37*4882a593Smuzhiyun -w Render the plot as wireframe with a 2D colormap projected on the 38*4882a593Smuzhiyun XY plane rather than as the texture for the surface 39*4882a593SmuzhiyunEOM 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun# Parse and validate arguments 43*4882a593Smuzhiyunwhile getopts "d:f:hs:t:w" OPT; do 44*4882a593Smuzhiyun case $OPT in 45*4882a593Smuzhiyun d) 46*4882a593Smuzhiyun DATFILE="$OPTARG" 47*4882a593Smuzhiyun ;; 48*4882a593Smuzhiyun f) 49*4882a593Smuzhiyun FIELD="$OPTARG" 50*4882a593Smuzhiyun ;; 51*4882a593Smuzhiyun h) 52*4882a593Smuzhiyun usage 53*4882a593Smuzhiyun exit 0 54*4882a593Smuzhiyun ;; 55*4882a593Smuzhiyun s) 56*4882a593Smuzhiyun SIZE="$OPTARG" 57*4882a593Smuzhiyun ;; 58*4882a593Smuzhiyun t) 59*4882a593Smuzhiyun TITLE="$OPTARG" 60*4882a593Smuzhiyun ;; 61*4882a593Smuzhiyun w) 62*4882a593Smuzhiyun PM3D_FRAGMENT="set pm3d at b" 63*4882a593Smuzhiyun W="-w" 64*4882a593Smuzhiyun ;; 65*4882a593Smuzhiyun *) 66*4882a593Smuzhiyun usage 67*4882a593Smuzhiyun exit 1 68*4882a593Smuzhiyun ;; 69*4882a593Smuzhiyun esac 70*4882a593Smuzhiyundone 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun# Ensure the data file exists 73*4882a593Smuzhiyunif [ ! -f "$DATFILE" ]; then 74*4882a593Smuzhiyun echo "ERROR: $DATFILE does not exist" 75*4882a593Smuzhiyun usage 76*4882a593Smuzhiyun exit 1 77*4882a593Smuzhiyunfi 78*4882a593SmuzhiyunPLOT_BASENAME=${DATFILE%.*}-f$FIELD$W 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun# Set a sane title 81*4882a593Smuzhiyun# TODO: parse the header and define titles for each format parameter for TIME(1) 82*4882a593Smuzhiyunif [ -z "$TITLE" ]; then 83*4882a593Smuzhiyun if [ ! "$FIELD" == "3" ]; then 84*4882a593Smuzhiyun TITLE="Field $FIELD" 85*4882a593Smuzhiyun else 86*4882a593Smuzhiyun TITLE="$DEF_TITLE" 87*4882a593Smuzhiyun fi 88*4882a593Smuzhiyunfi 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun# Determine the dgrid3d mesh dimensions size 91*4882a593SmuzhiyunMIN=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 1 | sed 's/^0*//' | sort -n | uniq | head -n1) 92*4882a593SmuzhiyunMAX=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 1 | sed 's/^0*//' | sort -n | uniq | tail -n1) 93*4882a593SmuzhiyunBB_CNT=$[${MAX} - $MIN + 1] 94*4882a593SmuzhiyunMIN=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 2 | sed 's/^0*//' | sort -n | uniq | head -n1) 95*4882a593SmuzhiyunMAX=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 2 | sed 's/^0*//' | sort -n | uniq | tail -n1) 96*4882a593SmuzhiyunPM_CNT=$[${MAX} - $MIN + 1] 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun(cat <<EOF 100*4882a593Smuzhiyunset title "$TITLE" 101*4882a593Smuzhiyunset xlabel "$XLABEL" 102*4882a593Smuzhiyunset ylabel "$YLABEL" 103*4882a593Smuzhiyunset style line 100 lt 5 lw 1.5 104*4882a593Smuzhiyun$PM3D_FRAGMENT 105*4882a593Smuzhiyunset dgrid3d $PM_CNT,$BB_CNT splines 106*4882a593Smuzhiyunset ticslevel 0.2 107*4882a593Smuzhiyun 108*4882a593Smuzhiyunset term png size $SIZE 109*4882a593Smuzhiyunset output "$PLOT_BASENAME.png" 110*4882a593Smuzhiyunsplot "$DATFILE" every ::1 using 1:2:$FIELD with lines ls 100 111*4882a593Smuzhiyun 112*4882a593Smuzhiyunset view 90,0 113*4882a593Smuzhiyunset output "$PLOT_BASENAME-bb.png" 114*4882a593Smuzhiyunreplot 115*4882a593Smuzhiyun 116*4882a593Smuzhiyunset view 90,90 117*4882a593Smuzhiyunset output "$PLOT_BASENAME-pm.png" 118*4882a593Smuzhiyunreplot 119*4882a593Smuzhiyun 120*4882a593Smuzhiyunset view 60,30 121*4882a593Smuzhiyunset term wxt size $SIZE 122*4882a593Smuzhiyunreplot 123*4882a593SmuzhiyunEOF 124*4882a593Smuzhiyun) | gnuplot --persist 125