#!/usr/bin/env python # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # # # estimate_size.py by Luis Armendariz # Copyright (C) 2002-2005, California Institute of Technology. # # This program 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 2 of the License, or # (at your option) any later version. # # This program 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 this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # """ This script estimates the size of the output from CitcomS, assuming binary floating point data. Options are: estimate_size.py [ --help | -h ] [ --steps | -t ] [ --nodex | -x ] [ --nodey | -y ] [ --nodez | -z ] [ --caps | -c | --full | --regional ] [ --all | -a ] [ --connectivity ] [ --stress ] [ --pressure ] [ --surf ] [ --botm ] [ --horiz_avg ] Examples: python estimate_size.py python estimate_size.py --all python estimate_size.py --full --all --steps=100 --nodex=33 --nodey=33 -z65 python estimate_size.py --regional --surf --botm --pressure python estimate_size.py --regional --pressure --stress -x55 -y55 -z43 python estimate_size.py --caps=12 --steps 100 -x 33 -y 33 -z 33 --stress python estimate_size.py -c12 -t100 -x33 -y33 -z33 -a python estimate_size.py --help """ def TiB(x): """Convert from bytes to terabytes""" return x / 1024.0 ** 4 def GiB(x): """Convert from bytes to gigabytes""" return x / 1024.0 ** 3 def MiB(x): """Convert from bytes to megabytes""" return x / 1024.0 ** 2 def KiB(x): """Convert from bytes to kilobytes""" return x / 1024.0 def ps(x): """print size""" if x < 1024: return '%g bytes' % x elif x < 1024**2: return '%g KiB' % KiB(x) elif x < 1024**3: return '%g MiB' % MiB(x) elif x < 1024**4: return '%g GiB' % GiB(x) else: return '%g TiB' % TiB(x) def pc(x,total): """print percentage""" return '%2.3f%%' % ((100*x)/float(total)) def main(): import sys import getopt out = { 'connectivity': False, 'stress': False, 'pressure': False, 'surf': False, 'botm': False, 'horiz_avg': False, } caps = None steps = None nodex = None nodey = None nodez = None opts, args = getopt.getopt(sys.argv[1:], "hac:t:x:y:z:", ['help','full','regional','caps=','steps=','nodex=','nodey=','nodez=', 'all','connectivity','stress','pressure','surf','botm','horiz_avg']) for opt,arg in opts: if opt in ('-h','--help'): print __doc__ sys.exit(1) if opt == '--regional': caps = 1 if opt == '--full': caps = 12 if opt in ('-c','--caps'): caps = int(arg) if opt in ('-t','--steps'): steps = int(arg) if opt in ('-x','--nodex'): nodex = int(arg) if opt in ('-y','--nodey'): nodey = int(arg) if opt in ('-z','--nodez'): nodez = int(arg) if opt in ('-a','--all'): for k in out: out[k] = True if opt == '--connectivity': out['connectivity'] = True if opt == '--stress': out['stress'] = True if opt == '--pressure': out['pressure'] = True if opt == '--surf': out['surf'] = True if opt == '--botm': out['botm'] = True if opt == '--horiz_avg': out['horiz_avg'] = True if not caps or not steps or not nodex or not nodey or not nodez: print "Enter the following quantities:\n" if not caps: caps = int(raw_input('\tcaps = ')) if not steps: steps = int(raw_input('\tsteps = ')) if not nodex: nodex = int(raw_input('\tnodex = ')) if not nodey: nodey = int(raw_input('\tnodey = ')) if not nodez: nodez = int(raw_input('\tnodez = ')) nno = nodex * nodey * nodez nsf = nodex * nodey elx = nodex - 1 ely = nodey - 1 elz = nodez - 1 nel = elx * ely * elz # conversion factor (double = 8 bytes, float = 4 bytes, int = 4 bytes) f = 4 # fields tensor3d = f * nno * 6 vector3d = f * nno * 3 scalar3d = f * nno * 1 vector2d = f * nsf * 2 scalar2d = f * nsf * 1 scalar1d = f * nodez buffer_total = tensor3d + vector3d + scalar3d + \ vector2d + scalar2d + \ scalar1d connectivity = f * nel * 8 coord = caps * scalar3d velocity = steps * caps * vector3d temperature = steps * caps * scalar3d viscosity = steps * caps * scalar3d pressure = steps * caps * scalar3d stress = steps * caps * tensor3d surf_velocity = steps * caps * vector2d surf_temperature = steps * caps * scalar2d surf_heatflux = steps * caps * scalar2d surf_topography = steps * caps * scalar2d surf_total = surf_velocity + surf_temperature + \ surf_heatflux + surf_topography have_temp = steps * caps * scalar1d have_vxy = steps * caps * scalar1d have_vz = steps * caps * scalar1d have_total = have_temp + have_vxy + have_vz total = coord + velocity + temperature + viscosity if out['connectivity']: total += connectivity if out['stress']: total += stress if out['pressure']: total += pressure if out['surf']: total += surf_total if out['botm']: total += surf_total if out['horiz_avg']: total += have_total hr = 33 print "\n" print "By Type (per cap per timestep):" print "=" * hr print "3D Tensor Field: %s" % ps(tensor3d) print "3D Vector Field: %s" % ps(vector3d) print "3D Scalar Field: %s" % ps(scalar3d) print "2D Vector Field: %s" % ps(vector2d) print "2D Scalar Field: %s" % ps(scalar2d) print "1D Scalar Field: %s" % ps(scalar1d) print "-" * hr print "total %s" % ps(buffer_total) print "\n" print "By Dataset:" print "=" * hr if out['connectivity']: print "connectivity %s" % ps(connectivity) if True: print "coord %s" % ps(coord) print "velocity %s" % ps(velocity) print "temperature %s" % ps(temperature) print "viscosity %s" % ps(viscosity) if out['pressure']: print "pressure %s" % ps(pressure) if out['stress']: print "stress %s" % ps(stress) if out['surf']: print "surf/velocity %s" % ps(surf_velocity) print "surf/heatflux %s" % ps(surf_heatflux) print "surf/topography %s" % ps(surf_topography) if out['botm']: print "botm/velocity %s" % ps(surf_velocity) print "botm/heatflux %s" % ps(surf_heatflux) print "botm/topography %s" % ps(surf_topography) if out['horiz_avg']: print "horiz_avg/temperature %s" % ps(have_temp) print "horiz_avg/horiz_velo %s" % ps(have_vxy) print "horiz_avg/vert_velo %s" % ps(have_vz) if True: print "-" * hr print "total %s" % ps(total) print "\n" print "By Percentage:" print "=" * hr if out['connectivity']: print "connectivity %s" % pc(connectivity,total) if True: print "coord %s" % pc(coord,total) print "velocity %s" % pc(velocity,total) print "temperature %s" % pc(temperature,total) print "viscosity %s" % pc(viscosity,total) if out['pressure']: print "pressure %s" % pc(pressure,total) if out['stress']: print "stress %s" % pc(stress,total) if out['surf']: print "surf %s" % pc(surf_total,total) if out['botm']: print "botm %s" % pc(surf_total,total) if out['horiz_avg']: print "horiz_avg %s" % pc(have_total,total) if __name__ == '__main__': main() # version # $Id$ # End of file