https://github.com/geodynamics/citcoms
Raw File
Tip revision: 00f1e0f5696e8b3839554697524030ea694956b1 authored by Eric Heien on 02 February 2012, 18:23:53 UTC
Tagged 3.2.0
Tip revision: 00f1e0f
estimate_size.py
#!/usr/bin/env python
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
#<LicenseText>
#
# 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
#
#</LicenseText>
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

"""
This script estimates the size of the output from CitcomS,
assuming binary floating point data.

Options are:

    estimate_size.py [ --help | -h ]
                     [ --steps <number> | -t <number> ]
                     [ --nodex <number> | -x <number> ]
                     [ --nodey <number> | -y <number> ]
                     [ --nodez <number> | -z <number> ]
                     [ --caps  <number> | -c <number> | --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
back to top