plot_timing_stats.py.html CLAWPACK  
 Source file:   plot_timing_stats.py
 Directory:   /Users/rjl/clawpack_src/clawpack_master/amrclaw/examples/advection_2d_inflow
 Converted:   Mon Feb 19 2024 at 17:58:02   using clawcode2html
 This documentation file will not reflect any later changes in the source file.

 
"""
Plot timing info found in timing.csv file.
Requires modified valout function from Clawpack 5.5.0 to print this info.

This might eventually be turned into a more general utility function in visclaw.
For now, copy this file and modify it for your needs.
"""

from __future__ import print_function
from pylab import *
import os

# Location of timing.csv files:
outdir = '_output'

make_pngs = True  # print plots?

def make_png(fname):
    savefig(fname)
    #savefig(fname, bbox_inches='tight')
    print('Created %s' % fname)

# set desired units for simulation time and computer time,
# based on length of run:

# set units and scaling factors for Simulation time t (simtime), 
# CPU/Wall time (comptime), and for number of cells updated.
# units is used for text in plots, factor is used for scaling values read in
# if None, then no units appear in plots, and/or no scaling is done.

# computer time is recorded in seconds so this is the natural units:
comptime_units = 'seconds'
if comptime_units == 'seconds':
    comptime_factor = 1
elif comptime_units == 'minutes':
    comptime_factor = 60.
elif comptime_units == 'hours':
    comptime_factor = 3600.
else:
    comptime_factor = 1

# for applications where t in the PDE is dimensionless, use this:
simtime_units = 'dimensionless'
simtime_factor = 1

# for GeoClaw or other applications where the simulation time is in
# seconds, set simtime_units to 'seconds', 'minutes' or 'hours' depending
# on time scale of simulation and use this:
#simtime_units = 'seconds'
if simtime_units == 'seconds':
    simtime_factor = 1
elif simtime_units == 'minutes':
    simtime_factor = 60.
elif simtime_units == 'hours':
    simtime_factor = 3600.

# if the time units in the application are different, set simtime_units
# and simtime_factor appropriately.
    
# Some useful units for cell updates:
#cell_units = None # for raw cell count
cell_units = 'millions'

if cell_units == 'millions':
    cell_factor = 1e6
elif cell_units == 'billions':
    cell_factor = 1e9
elif cell_units == 'trillions':
    cell_factor = 1e12
else:
    cell_factor = 1


# define colors, with colors[0] used for overhead, colors[j] for level j >= 1
colors = ['y'] + 3*['r','g','m','c','b']  # allow <= 15 levels


# Read in timing states from output directory:
timing_stats_file = os.path.join(outdir, 'timing.csv')
timing_stats = loadtxt(timing_stats_file, skiprows=1, delimiter=',')
ntimes = timing_stats.shape[0]
nlevels = int(timing_stats.shape[1] / 3) - 1

time = zeros(ntimes)
total_cpu = zeros(ntimes)
total_wall = zeros(ntimes)
wtime = zeros((ntimes, nlevels))
cpu = zeros((ntimes, nlevels))
cells = zeros((ntimes, nlevels))

for j in range(ntimes):
    time[j] = timing_stats[j,0] / simtime_factor
    total_wall[j] = timing_stats[j,1] / comptime_factor
    total_cpu[j] = timing_stats[j,2] / comptime_factor
    for level in range(nlevels):
        wtime[j, level] = timing_stats[j,3*level + 3] / comptime_factor
        cpu[j, level] = timing_stats[j,3*level + 4] / comptime_factor
        cells[j, level] = timing_stats[j,3*level + 5] / cell_factor
    
xlimits = [time.min(), time.max()]
ylimits_comptime = [0, 1.1*total_cpu.max()]
ylimits_cells = [0, 1.1*sum(cells[-1,:])]


figure(21)
clf()
sum_cells_over_levels = zeros(ntimes)
for j in range(nlevels):
    if max(cells[:,j]) == 0:
        break
    #plot(time/3600, cells[:,j], label='Level %s' % (j+1))
    last_sum_cells = sum_cells_over_levels.copy()
    sum_cells_over_levels += cells[:,j]
    plot(time, sum_cells_over_levels, 'k')
    fill_between(time, last_sum_cells, sum_cells_over_levels, 
                 color=colors[j+1],
                 label='Level %s' % (j+1))

plot(time, sum_cells_over_levels, 'k', lw=3, label='Total Cells')
xlim(xlimits)
#ylim(0, 1.1*sum_cells_over_levels[-1])
ylim(ylimits_cells)
title('Cumulative cells updated on each level')
xlabel('Simulation time t (%s)' % simtime_units)
if cell_units is None:
    ylabel('Grid cells updated')
else:
    ylabel('Grid cells updated (%s)' % cell_units)

legend(loc='upper left')

if make_pngs:
    make_png('CumCellUpdates.png')


figure(22)
clf()
sum_cpu_over_levels = zeros(ntimes)
for j in range(nlevels):
    if max(cpu[:,j]) == 0:
        break
    #plot(time/3600, cpu[:,j], label='Level %s' % (j+1))
    last_sum_cpu = sum_cpu_over_levels.copy()
    sum_cpu_over_levels += cpu[:,j]
    fill_between(time, last_sum_cpu, sum_cpu_over_levels, color=colors[j+1],
                 label='Level %s' % (j+1))
    plot(time, sum_cpu_over_levels, 'k')

fill_between(time, total_cpu,sum_cpu_over_levels,color=colors[0],
             label='Overhead')
plot(time, total_cpu, 'k', lw=3, label='Total CPU')
xlim(xlimits)
ylim(ylimits_comptime)
title('Cumulative CPU time on each level')
xlabel('Simulation time t (%s)' % simtime_units)
ylabel('CPU time (%s)' % comptime_units)
legend(loc='upper left')

if make_pngs:
    make_png('CumCPUtime.png')


figure(23)
clf()
sum_wtime_over_levels = zeros(ntimes)
for j in range(nlevels):
    if max(wtime[:,j]) == 0:
        break
    last_sum_wtime = sum_wtime_over_levels.copy()
    sum_wtime_over_levels += wtime[:,j]
    fill_between(time, last_sum_wtime,
sum_wtime_over_levels, 
color=colors[j+1],
                 label='Level %s' % (j+1))
    plot(time, sum_wtime_over_levels, 'k')

fill_between(time, total_wall, sum_wtime_over_levels, color=colors[0],
             label='Overhead')
plot(time, total_wall, 'k', lw=3, label='Total Wall')
title('Cumulative wall time on each level')
xlabel('Simulation time t (%s)' % simtime_units)
ylabel('CPU time (%s)' % comptime_units)
legend(loc='upper left')
xlim(xlimits)
ylim(ylimits_comptime)

if make_pngs:
    make_png('CumWallTime.png')


# d cells / dt:

figure(31)
clf()
dc_max = 0
dca = cells[1:,:] - cells[:-1,:]
for n in range(1,ntimes):
    dt = (time[n] - time[n-1])
    if dt == 0:
        break
    dcn = 0
    for j in range(nlevels):
        if dca[n-1,j] == 0:
            break
        tt = array([time[n-1],time[n]])
        #last_dc = last_dc + dc
        dc = (cells[n,j] - cells[n-1,j]) / dt
        plot(tt, [dcn+dc, dcn+dc], 'k')
        if n == 1:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1],
                         label='Level %s' % (j+1))
        else:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1])
        dcn = dcn + dc
                         
    plot([time[n-1],time[n-1]], [0,dcn], 'k')
    plot([time[n],time[n]], [0,dcn], 'k')
    dc_max = max(dc_max, dcn)

                         
xlim(xlimits)
ylim(0, 1.2*dc_max)
title('Average Cells updated / simulation time')
xlabel('Simulation time t (%s)' % simtime_units)
ylabel('cell updates / sim time')
if cell_units is None:
    ylabel('Grid cells updated / sim time')
else:
    ylabel('Grid cells updated (%s) / sim time' % cell_units)

legend(loc='upper left')

if make_pngs:
    make_png('AveCellUpdates.png')


# average cpu_time / dt:

figure(32)
clf()
dc_max = 0
dca = cpu[1:,:] - cpu[:-1,:]
for n in range(1,ntimes):
    dt = (time[n] - time[n-1])
    if dt == 0:
        break
    dcn = 0
    for j in range(nlevels):
        if dca[n-1,j] == 0:
            break
        tt = array([time[n-1],time[n]])
        #last_dc = last_dc + dc
        dc = (cpu[n,j] - cpu[n-1,j]) / dt
        plot(tt, [dcn+dc, dcn+dc], 'k')
        if n == 1:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1],
                         label='Level %s' % (j+1))
        else:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1])
        dcn = dcn + dc
                         

    
    if n == 1:
        kwargs_label = {'label': 'Overhead'}
    else:
        kwargs_label = {}
    dtot = (total_cpu[n]-total_cpu[n-1]) / dt 
    plot(tt, [dtot,dtot], 'k')
    fill_between(tt, [dcn,dcn], [dtot,dtot], 
                 color=colors[0], alpha=1, edgecolors='k', **kwargs_label)

    plot([time[n-1],time[n-1]], [0,dtot], 'k')
    plot([time[n],time[n]], [0,dtot], 'k')
    
    dc_max = max(dc_max, dtot)
     
    #plot(time, total_cpu, 'k', lw=3, label='Total CPU')

                         
#plot(time, sum_cells_over_levels, 'k', lw=3, label='Total Cells')
xlim(xlimits)
ylimits_avecomptime = [0, 1.2*dc_max]
ylim(ylimits_avecomptime)

title('Average CPU time / simulation time')
xlabel('Simulation time t (%s)' % simtime_units)
ylabel('CPU time / sim time')
legend(loc='upper left')

if make_pngs:
    make_png('AveCPUTime.png')



# average wall time / dt:

figure(33)
clf()
dc_max = 0
dca = wtime[1:,:] - wtime[:-1,:]
for n in range(1,ntimes):
    dt = (time[n] - time[n-1])
    if dt == 0:
        break
    dcn = 0
    for j in range(nlevels):
        if dca[n-1,j] == 0:
            break
        tt = array([time[n-1],time[n]])
        #last_dc = last_dc + dc
        dc = (wtime[n,j] - wtime[n-1,j]) / dt
        plot(tt, [dcn+dc, dcn+dc], 'k')
        if n == 1:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1],
                         label='Level %s' % (j+1))
        else:
            fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc],
                         color=colors[j+1])
        dcn = dcn + dc
                         

    
    if n == 1:
        kwargs_label = {'label': 'Overhead'}
    else:
        kwargs_label = {}
    dtot = (total_wall[n]-total_wall[n-1]) / dt 
    plot(tt, [dtot,dtot], 'k')
    fill_between(tt, [dcn,dcn], [dtot,dtot], 
                 color=colors[0], alpha=1, edgecolors='k', **kwargs_label)

    plot([time[n-1],time[n-1]], [0,dtot], 'k')
    plot([time[n],time[n]], [0,dtot], 'k')
    
    dc_max = max(dc_max, dtot)

                         
xlim(xlimits)
#ylim(0, 1.2*dc_max)
ylim(ylimits_avecomptime)
title('Average Wall time / simulation time')
xlabel('Simulation time t (%s)' % simtime_units)
ylabel('wtime time / sim time')
legend(loc='upper left')

if make_pngs:
    make_png('AveWallTime.png')