Exemple #1
0
def create_cube(shape, width, height, depth):
    """ Creates a cube-shaped single-zone structured domain. """
    imax, jmax, kmax = shape

    delta_x = float(width)  / (imax - 1)
    delta_y = float(height) / (jmax - 1)
    delta_z = float(depth)  / (kmax - 1)

    dtype = numpy.float32  # Default single-precision.

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)
    z = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)
    q5 = numpy.zeros(shape, dtype=dtype)

    for i in range(imax):
        for j in range(jmax):
            for k in range(kmax):
                x.itemset(i, j, k, delta_x * i)
                y.itemset(i, j, k, delta_y * j)
                z.itemset(i, j, k, delta_z * k)

                q1.itemset(i, j, k, delta_x * i)

                q2.itemset(i, j, k, delta_x * i)
                q3.itemset(i, j, k, delta_y * j)
                q4.itemset(i, j, k, delta_z * k)

                q5.itemset(i, j, k, delta_z * k)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3
    momentum.z = q4
    
    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y
    zone.grid_coordinates.z = z

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q5)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
Exemple #2
0
def create_cube(shape, width, height, depth):
    """ Creates a cube-shaped single-zone structured domain. """
    imax, jmax, kmax = shape

    delta_x = float(width)  / (imax - 1)
    delta_y = float(height) / (jmax - 1)
    delta_z = float(depth)  / (kmax - 1)

    dtype = numpy.float32  # Default single-precision.

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)
    z = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)
    q5 = numpy.zeros(shape, dtype=dtype)

    for i in range(imax):
        for j in range(jmax):
            for k in range(kmax):
                x.itemset(i, j, k, delta_x * i)
                y.itemset(i, j, k, delta_y * j)
                z.itemset(i, j, k, delta_z * k)

                q1.itemset(i, j, k, delta_x * i)

                q2.itemset(i, j, k, delta_x * i)
                q3.itemset(i, j, k, delta_y * j)
                q4.itemset(i, j, k, delta_z * k)

                q5.itemset(i, j, k, delta_z * k)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3
    momentum.z = q4
    
    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y
    zone.grid_coordinates.z = z

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q5)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
Exemple #3
0
def _read_vars(zone, nq, nqc, stream, logger):
    """ Reads field variables for `zone` """
    shape = zone.shape
    imax, jmax, kmax = shape
    reclen = stream.read_recordmark()
    expected = stream.reclen_floats(nq * imax * jmax * kmax)
    if reclen != expected:
        logger.warning('unexpected Q variables recordlength'
                       ' %d vs. %d', reclen, expected)
    name = 'density'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    vec = Vector()

    vec.x = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.x min %g, max %g', vec.x.min(), vec.x.max())

    vec.y = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.y min %g, max %g', vec.y.min(), vec.y.max())

    vec.z = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.z min %g, max %g', vec.z.min(), vec.z.max())

    zone.flow_solution.add_vector('momentum', vec)

    name = 'energy_stagnation_density'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    name = 'gamma'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    for i in range(nqc):
        name = 'species_%d_density' % (i + 1)
        arr = stream.read_floats(shape, order='Fortran')
        logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
        zone.flow_solution.add_array(name, arr)

    for i in range(nq - (6 + nqc)):
        name = 'turbulence_%d' % (i + 1)
        arr = stream.read_floats(shape, order='Fortran')
        logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
        zone.flow_solution.add_array(name, arr)

    if stream.unformatted:
        reclen2 = stream.read_recordmark()
        if reclen2 != reclen:
            logger.warning('mismatched Q variables recordlength'
                           ' %d vs. %d', reclen2, reclen)
Exemple #4
0
def create_wedge_2d(shape, inner, outer, angle):
    """ Creates a 2D wedge-shaped single-zone structured domain. """
    imax, jmax = shape

    delta_radius = float(outer - inner) / (imax - 1) if imax > 1 else 1.
    delta_theta  = float(angle * _DEG2RAD) / (jmax - 1) if jmax > 1 else 1.

    dtype = numpy.float32  # Default single-precision.

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)

    for i in range(imax):
        radial = inner + delta_radius * i
        for j in range(jmax):
            tangential = delta_theta * j

            x.itemset(i, j, radial * cos(tangential))
            y.itemset(i, j, radial * sin(tangential))

            q1.itemset(i, j, radial)

            q2.itemset(i, j, radial)
            q3.itemset(i, j, tangential)

            q4.itemset(i, j, tangential)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3
    
    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q4)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
def _read_vars(zone, nq, nqc, stream, logger):
    """ Reads field variables for `zone` """
    shape = zone.shape
    imax, jmax, kmax = shape
    reclen = stream.read_recordmark()
    expected = stream.reclen_floats(nq * imax * jmax * kmax)
    if reclen != expected:
        logger.warning('unexpected Q variables recordlength'
                       ' %d vs. %d', reclen, expected)
    name = 'density'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    vec = Vector()

    vec.x = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.x min %g, max %g', vec.x.min(), vec.x.max())

    vec.y = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.y min %g, max %g', vec.y.min(), vec.y.max())

    vec.z = stream.read_floats(shape, order='Fortran')
    logger.debug('    momentum.z min %g, max %g', vec.z.min(), vec.z.max())

    zone.flow_solution.add_vector('momentum', vec)

    name = 'energy_stagnation_density'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    name = 'gamma'
    arr = stream.read_floats(shape, order='Fortran')
    logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
    zone.flow_solution.add_array(name, arr)

    for i in range(nqc):
        name = 'species_%d_density' % (i+1)
        arr = stream.read_floats(shape, order='Fortran')
        logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
        zone.flow_solution.add_array(name, arr)

    for i in range(nq - (6 + nqc)):
        name = 'turbulence_%d' % (i+1)
        arr = stream.read_floats(shape, order='Fortran')
        logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
        zone.flow_solution.add_array(name, arr)

    if stream.unformatted:
        reclen2 = stream.read_recordmark()
        if reclen2 != reclen:
            logger.warning('mismatched Q variables recordlength'
                           ' %d vs. %d', reclen2, reclen)
Exemple #6
0
def create_wedge_2d(shape, inner, outer, angle):
    """ Creates a 2D wedge-shaped single-zone structured domain. """
    imax, jmax = shape

    delta_radius = float(outer - inner) / (imax - 1) if imax > 1 else 1.
    delta_theta = float(angle * _DEG2RAD) / (jmax - 1) if jmax > 1 else 1.

    dtype = numpy.float32  # Default single-precision.

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)

    for i in range(imax):
        radial = inner + delta_radius * i
        for j in range(jmax):
            tangential = delta_theta * j

            x.itemset(i, j, radial * cos(tangential))
            y.itemset(i, j, radial * sin(tangential))

            q1.itemset(i, j, radial)

            q2.itemset(i, j, radial)
            q3.itemset(i, j, tangential)

            q4.itemset(i, j, tangential)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3

    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q4)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
def create_curve_2d(npoints, radius, angle):
    """ Creates a curve (arc) of `npoints` at `radius` through `angle`. """
    delta_theta  = float(angle * _DEG2RAD) / (npoints - 1)
    dtype = numpy.float32  # Default single-precision.
    shape = (npoints,)

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)

    for i in range(npoints):
        tangential = delta_theta * i

        x.itemset(i, radius * cos(tangential))
        y.itemset(i, radius * sin(tangential))

        q1.itemset(i, radius)

        q2.itemset(i, radius)
        q3.itemset(i, tangential)

        q4.itemset(i, tangential)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3
    
    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q4)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
Exemple #8
0
def create_curve_2d(npoints, radius, angle):
    """ Creates a curve (arc) of `npoints` at `radius` through `angle`. """
    delta_theta = float(angle * _DEG2RAD) / (npoints - 1)
    dtype = numpy.float32  # Default single-precision.
    shape = (npoints, )

    x = numpy.zeros(shape, dtype=dtype)
    y = numpy.zeros(shape, dtype=dtype)

    q1 = numpy.zeros(shape, dtype=dtype)
    q2 = numpy.zeros(shape, dtype=dtype)
    q3 = numpy.zeros(shape, dtype=dtype)
    q4 = numpy.zeros(shape, dtype=dtype)

    for i in range(npoints):
        tangential = delta_theta * i

        x.itemset(i, radius * cos(tangential))
        y.itemset(i, radius * sin(tangential))

        q1.itemset(i, radius)

        q2.itemset(i, radius)
        q3.itemset(i, tangential)

        q4.itemset(i, tangential)

    momentum = Vector()
    momentum.x = q2
    momentum.y = q3

    zone = Zone()
    zone.grid_coordinates.x = x
    zone.grid_coordinates.y = y

    zone.flow_solution.mach = 0.5
    zone.flow_solution.alpha = 0.
    zone.flow_solution.reynolds = 100000.
    zone.flow_solution.time = 42.

    zone.flow_solution.add_array('density', q1)
    zone.flow_solution.add_vector('momentum', momentum)
    zone.flow_solution.add_array('energy_stagnation_density', q4)

    domain = DomainObj()
    domain.reference_state = dict(length_reference=PhysicalQuantity(1., 'ft'))
    domain.add_zone('xyzzy', zone)

    return domain
Exemple #9
0
    def test_vector(self):
        logging.debug('')
        logging.debug('test_vector')

        logger = logging.getLogger()

        vec = Vector()
        self.assertEqual(vec.x, None)
        self.assertEqual(vec.y, None)
        self.assertEqual(vec.z, None)
        self.assertEqual(vec.r, None)
        self.assertEqual(vec.t, None)
        self.assertEqual(vec.shape, ())

        self.assertFalse(vec.is_equivalent([], 'vec', logger))

        assert_raises(self, 'vec.flip_z()', globals(), locals(),
                      AttributeError, 'flip_z: no Z component')

        assert_raises(self, 'vec.rotate_about_x(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_x: no Y component')

        assert_raises(self, 'vec.rotate_about_y(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_y: no X component')

        assert_raises(self, 'vec.rotate_about_z(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_z: no X component')

        wedge = create_wedge_2d((20, 10), 0.5, 2., 30.)
        vec = wedge.xyzzy.flow_solution.momentum
        assert_raises(self, 'vec.rotate_about_x(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_x: no Z component')

        assert_raises(self, 'vec.rotate_about_y(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_y: no Z component')

        wedge.make_cylindrical()

        wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.)
        grid = wedge.xyzzy.grid_coordinates
        grid.make_cylindrical(axis='z')
        vec = wedge.xyzzy.flow_solution.momentum
        assert_raises(self, "vec.make_cylindrical(grid, axis='q')", globals(),
                      locals(), ValueError, "axis must be 'z' or 'x'")
        assert_raises(self, "vec.make_cartesian(grid, axis='q')", globals(),
                      locals(), ValueError, "axis must be 'z' or 'x'")
        grid.make_cartesian(axis='z')

        domain = wedge.copy()
        domain.xyzzy.flow_solution.momentum.z += 1.
        self.assertFalse(domain.is_equivalent(wedge, logger))
        self.assertFalse(domain.is_equivalent(wedge, logger,
                                              tolerance=0.00001))

        domain = wedge.copy()
        grid = domain.xyzzy.grid_coordinates
        grid.make_cylindrical(axis='z')
        vec = domain.xyzzy.flow_solution.momentum
        vec.make_cylindrical(grid)
        self.assertFalse(
            vec.is_equivalent(wedge.xyzzy.flow_solution.momentum, 'momentum',
                              logger))
def read(casename, logger, suffix='.restart.new'):
    """ Return domain read from ADPAC .input, .mesh, and .restart files. """
    # Read input.
    input = Input()
    input.read(casename)

    # Read mesh.
    domain = read_plot3d_grid(casename+'.mesh', big_endian=True,
                              unformatted=False, logger=logger)

    # Set global reference state.
    domain.reference_state = {
        'ideal_gas_constant': PhysicalQuantity(input.rgas, 'ft*lbf/(slug*degR)'),
        'length_reference': PhysicalQuantity(input.diam, 'ft'),
        'pressure_reference': PhysicalQuantity(input.pref, 'lbf/ft**2'),
        'specific_heat_ratio': PhysicalQuantity(input.gamma, 'unitless'),
        'temperature_reference': PhysicalQuantity(input.tref, 'degR'),
    }

    # Set zone handedness and symmetry.  Also make cylindrical if necessary.
    for i, zone in enumerate(domain.zones):
        zone.right_handed = False
        try:
            nbld = input.nbld[i]
        except IndexError:
            nbld = 1  # Default.
        if nbld > 1:
            zone.symmetry = 'rotational'
            zone.symmetry_axis = 'x'
            zone.symmetry_instances = input.nbld[i]
        try:
            fcarb = input.fcarb[i]
        except IndexError:
            fcarb = input.fcart  # Default
        else:
            if fcarb == -1:
                fcarb = input.fcart
        if not fcarb:
            zone.make_cylindrical(axis='x')

    # Read restart.
    restart = casename+suffix
    with open(restart, 'rb') as inp:
        logger.info('reading restart file %r', restart)
        stream = Stream(inp, binary=True, big_endian=True,
                        single_precision=True, integer_8=False,
                        unformatted=False, recordmark_8=False)

        # Read number of zones.
        nblocks = stream.read_int()
        if nblocks != len(domain.zones):
            raise RuntimeError('nblocks (%d) in %r != #Mesh zones (%d)'
                               % (nblocks, restart, len(domain.zones)))

        # Read zone dimensions.
        for zone in domain.zones:
            name = domain.zone_name(zone)
            imax, jmax, kmax = stream.read_ints(3)
            logger.debug('    %s: %dx%dx%d', name, imax, jmax, kmax)
            zone_i, zone_j, zone_k = zone.shape
            if imax != zone_i+1 or jmax != zone_j+1 or kmax != zone_k+1:
                raise RuntimeError('%s: Restart %dx%dx%d != Mesh %dx%dx%d' \
                                   % (name, imax, jmax, kmax,
                                      zone_i, zone_j, zone_k))
        # Read zone variables.
        for i, zone in enumerate(domain.zones):
            name = domain.zone_name(zone)
            zone_i, zone_j, zone_k = zone.shape
            shape = (zone_i+1, zone_j+1, zone_k+1)
            logger.debug('reading data for %s', name)

            zone.flow_solution.grid_location = 'CellCenter'
            zone.flow_solution.ghosts = [1, 1, 1, 1, 1, 1]

            name = 'density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            vec = Vector()
            if zone.coordinate_system == 'Cartesian':
                vec.x = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.x min %g, max %g',
                             vec.x.min(), vec.x.max())
                vec.y = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.y min %g, max %g',
                             vec.y.min(), vec.y.max())
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g',
                             vec.z.min(), vec.z.max())
            else:
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g',
                             vec.z.min(), vec.z.max())
                vec.r = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.r min %g, max %g',
                             vec.r.min(), vec.r.max())
                vec.t = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.t min %g, max %g',
                             vec.t.min(), vec.t.max())
            zone.flow_solution.add_vector('momentum', vec)

            name = 'energy_stagnation_density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            name = 'pressure'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

        # Read zone scalars.
        ncyc = stream.read_ints(len(domain.zones))
        dtheta = stream.read_floats(len(domain.zones))
        omegal = stream.read_floats(len(domain.zones))
        logger.debug('    ncyc %s', str(ncyc))
        logger.debug('    dtheta %s', str(dtheta))
        logger.debug('    omegal %s', str(omegal))
        for i, zone in enumerate(domain.zones):
            zone.flow_solution.ncyc = ncyc[i]
            zone.flow_solution.dtheta = dtheta[i]
            zone.flow_solution.omegal = omegal[i]

        # Implicit calculation data not supported.

    return domain
    def test_vector(self):
        logging.debug('')
        logging.debug('test_vector')

        logger = logging.getLogger()

        vec = Vector()
        self.assertEqual(vec.x, None)
        self.assertEqual(vec.y, None)
        self.assertEqual(vec.z, None)
        self.assertEqual(vec.r, None)
        self.assertEqual(vec.t, None)
        self.assertEqual(vec.shape, ())

        self.assertFalse(vec.is_equivalent([], 'vec', logger))

        assert_raises(self, 'vec.flip_z()', globals(), locals(),
                      AttributeError, 'flip_z: no Z component')

        assert_raises(self, 'vec.rotate_about_x(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_x: no Y component')

        assert_raises(self, 'vec.rotate_about_y(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_y: no X component')

        assert_raises(self, 'vec.rotate_about_z(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_z: no X component')

        wedge = create_wedge_2d((20, 10), 0.5, 2., 30.)
        vec = wedge.xyzzy.flow_solution.momentum
        assert_raises(self, 'vec.rotate_about_x(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_x: no Z component')

        assert_raises(self, 'vec.rotate_about_y(0.)', globals(), locals(),
                      AttributeError, 'rotate_about_y: no Z component')

        wedge.make_cylindrical()

        wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.)
        grid = wedge.xyzzy.grid_coordinates
        grid.make_cylindrical(axis='z')
        vec = wedge.xyzzy.flow_solution.momentum
        assert_raises(self, "vec.make_cylindrical(grid, axis='q')",
                      globals(), locals(), ValueError,
                      "axis must be 'z' or 'x'")
        assert_raises(self, "vec.make_cartesian(grid, axis='q')",
                      globals(), locals(), ValueError,
                      "axis must be 'z' or 'x'")
        grid.make_cartesian(axis='z')

        domain = wedge.copy()
        domain.xyzzy.flow_solution.momentum.z += 1.
        self.assertFalse(domain.is_equivalent(wedge, logger))
        self.assertFalse(domain.is_equivalent(wedge, logger, tolerance=0.00001))

        domain = wedge.copy()
        grid = domain.xyzzy.grid_coordinates
        grid.make_cylindrical(axis='z')
        vec = domain.xyzzy.flow_solution.momentum
        vec.make_cylindrical(grid)
        self.assertFalse(vec.is_equivalent(wedge.xyzzy.flow_solution.momentum,
                                           'momentum', logger))
Exemple #12
0
def read(casename, logger):
    """ Return domain read from ADPAC .input, .mesh, and .restart files. """
    rgas  = 1716.3507
    diam  = 0.083333
    pref  = 759.0528
    gamma = 1.4
    tref  = 444.3192
    nbld  = 64

    try:
        PhysicalQuantity(0., 'slug')
    except ValueError:
        add_unit('slug', '14.5939*kg', 'Slug')

    # Read mesh.
    domain = read_plot3d_grid(casename+'.mesh', big_endian=True,
                              unformatted=False, logger=logger)

    # Set global reference state.
    domain.reference_state = {
        'ideal_gas_constant': PhysicalQuantity(rgas, 'ft*lbf/(slug*degR)'),
        'length_reference': PhysicalQuantity(diam, 'ft'),
        'pressure_reference': PhysicalQuantity(pref, 'lbf/ft**2'),
        'specific_heat_ratio': PhysicalQuantity(gamma, 'unitless'),
        'temperature_reference': PhysicalQuantity(tref, 'degR'),
    }

    # Set zone handedness and symmetry.  Also make cylindrical if necessary.
    for i, zone in enumerate(domain.zones):
        zone.right_handed = False
        zone.symmetry = 'rotational'
        zone.symmetry_axis = 'x'
        zone.symmetry_instances = nbld
        zone.make_cylindrical(axis='x')

    # Read restart.
    restart = casename+'.restart.new'
    with open(restart, 'rb') as inp:
        logger.info("reading restart file '%s'", restart)
        stream = Stream(inp, binary=True, big_endian=True,
                        single_precision=True, integer_8=False,
                        unformatted=False, recordmark_8=False)

        # Read number of zones.
        nblocks = stream.read_int()
        if nblocks != len(domain.zones):
            raise RuntimeError("nblocks (%d) in '%s' != #Mesh zones (%d)"
                               % (nblocks, restart, len(domain.zones)))

        # Read zone dimensions.
        for zone in domain.zones:
            name = domain.zone_name(zone)
            imax, jmax, kmax = stream.read_ints(3)
            logger.debug('    %s: %dx%dx%d', name, imax, jmax, kmax)
            zone_i, zone_j, zone_k = zone.shape
            if imax != zone_i+1 or jmax != zone_j+1 or kmax != zone_k+1:
                raise RuntimeError('%s: Restart %dx%dx%d != Mesh %dx%dx%d' \
                                   % (name, imax, jmax, kmax,
                                      zone_i, zone_j, zone_k))
        # Read zone variables.
        for zone in domain.zones:
            name = domain.zone_name(zone)
            zone_i, zone_j, zone_k = zone.shape
            shape = (zone_i+1, zone_j+1, zone_k+1)
            logger.debug('reading data for %s', name)

            zone.flow_solution.grid_location = 'CellCenter'
            zone.flow_solution.ghosts = [1, 1, 1, 1, 1, 1]

            name = 'density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            vec = Vector()
            if zone.coordinate_system == 'Cartesian':
                vec.x = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.x min %g, max %g',
                             vec.x.min(), vec.x.max())
                vec.y = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.y min %g, max %g',
                             vec.y.min(), vec.y.max())
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g',
                             vec.z.min(), vec.z.max())
            else:
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g',
                             vec.z.min(), vec.z.max())
                vec.r = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.r min %g, max %g',
                             vec.r.min(), vec.r.max())
                vec.t = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.t min %g, max %g',
                             vec.t.min(), vec.t.max())
            zone.flow_solution.add_vector('momentum', vec)

            name = 'energy_stagnation_density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            name = 'pressure'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

    return domain
Exemple #13
0
def read(casename, logger, suffix='.restart.new'):
    """ Return domain read from ADPAC .input, .mesh, and .restart files. """
    # Read input.
    input = Input()
    input.read(casename)

    # Read mesh.
    domain = read_plot3d_grid(casename + '.mesh',
                              big_endian=True,
                              unformatted=False,
                              logger=logger)

    # Set global reference state.
    domain.reference_state = {
        'ideal_gas_constant': PhysicalQuantity(input.rgas,
                                               'ft*lbf/(slug*degR)'),
        'length_reference': PhysicalQuantity(input.diam, 'ft'),
        'pressure_reference': PhysicalQuantity(input.pref, 'lbf/ft**2'),
        'specific_heat_ratio': PhysicalQuantity(input.gamma, 'unitless'),
        'temperature_reference': PhysicalQuantity(input.tref, 'degR'),
    }

    # Set zone handedness and symmetry.  Also make cylindrical if necessary.
    for i, zone in enumerate(domain.zones):
        zone.right_handed = False
        try:
            nbld = input.nbld[i]
        except IndexError:
            nbld = 1  # Default.
        if nbld > 1:
            zone.symmetry = 'rotational'
            zone.symmetry_axis = 'x'
            zone.symmetry_instances = input.nbld[i]
        try:
            fcarb = input.fcarb[i]
        except IndexError:
            fcarb = input.fcart  # Default
        else:
            if fcarb == -1:
                fcarb = input.fcart
        if not fcarb:
            zone.make_cylindrical(axis='x')

    # Read restart.
    restart = casename + suffix
    with open(restart, 'rb') as inp:
        logger.info('reading restart file %r', restart)
        stream = Stream(inp,
                        binary=True,
                        big_endian=True,
                        single_precision=True,
                        integer_8=False,
                        unformatted=False,
                        recordmark_8=False)

        # Read number of zones.
        nblocks = stream.read_int()
        if nblocks != len(domain.zones):
            raise RuntimeError('nblocks (%d) in %r != #Mesh zones (%d)' %
                               (nblocks, restart, len(domain.zones)))

        # Read zone dimensions.
        for zone in domain.zones:
            name = domain.zone_name(zone)
            imax, jmax, kmax = stream.read_ints(3)
            logger.debug('    %s: %dx%dx%d', name, imax, jmax, kmax)
            zone_i, zone_j, zone_k = zone.shape
            if imax != zone_i + 1 or jmax != zone_j + 1 or kmax != zone_k + 1:
                raise RuntimeError('%s: Restart %dx%dx%d != Mesh %dx%dx%d' \
                                   % (name, imax, jmax, kmax,
                                      zone_i, zone_j, zone_k))
        # Read zone variables.
        for i, zone in enumerate(domain.zones):
            name = domain.zone_name(zone)
            zone_i, zone_j, zone_k = zone.shape
            shape = (zone_i + 1, zone_j + 1, zone_k + 1)
            logger.debug('reading data for %s', name)

            zone.flow_solution.grid_location = 'CellCenter'
            zone.flow_solution.ghosts = [1, 1, 1, 1, 1, 1]

            name = 'density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            vec = Vector()
            if zone.coordinate_system == 'Cartesian':
                vec.x = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.x min %g, max %g', vec.x.min(),
                             vec.x.max())
                vec.y = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.y min %g, max %g', vec.y.min(),
                             vec.y.max())
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g', vec.z.min(),
                             vec.z.max())
            else:
                vec.z = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.z min %g, max %g', vec.z.min(),
                             vec.z.max())
                vec.r = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.r min %g, max %g', vec.r.min(),
                             vec.r.max())
                vec.t = stream.read_floats(shape, order='Fortran')
                logger.debug('    momentum.t min %g, max %g', vec.t.min(),
                             vec.t.max())
            zone.flow_solution.add_vector('momentum', vec)

            name = 'energy_stagnation_density'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

            name = 'pressure'
            arr = stream.read_floats(shape, order='Fortran')
            logger.debug('    %s min %g, max %g', name, arr.min(), arr.max())
            zone.flow_solution.add_array(name, arr)

        # Read zone scalars.
        ncyc = stream.read_ints(len(domain.zones))
        dtheta = stream.read_floats(len(domain.zones))
        omegal = stream.read_floats(len(domain.zones))
        logger.debug('    ncyc %s', str(ncyc))
        logger.debug('    dtheta %s', str(dtheta))
        logger.debug('    omegal %s', str(omegal))
        for i, zone in enumerate(domain.zones):
            zone.flow_solution.ncyc = ncyc[i]
            zone.flow_solution.dtheta = dtheta[i]
            zone.flow_solution.omegal = omegal[i]

        # Implicit calculation data not supported.

    return domain