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
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)
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)
def create_wedge_3d(shape, length, inner, outer, angle, axis='z'): """ Creates a 3D wedge-shaped single-zone structured domain. """ imax, jmax, kmax = shape delta_axis = float(length) / (imax - 1) if imax > 1 else 1. delta_radius = float(outer - inner) / (jmax - 1) if jmax > 1 else 1. delta_theta = float(angle * _DEG2RAD) / (kmax - 1) if kmax > 1 else 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): axial = delta_axis * i for j in range(jmax): radial = inner + delta_radius * j for k in range(kmax): tangential = delta_theta * k if axis == 'z': x.itemset(i, j, k, radial * cos(tangential)) y.itemset(i, j, k, radial * sin(tangential)) z.itemset(i, j, k, axial) else: x.itemset(i, j, k, axial) y.itemset(i, j, k, radial * cos(tangential)) z.itemset(i, j, k, radial * sin(tangential)) q1.itemset(i, j, k, axial) q2.itemset(i, j, k, axial) q3.itemset(i, j, k, 0.) q4.itemset(i, j, k, length - axial) q5.itemset(i, j, k, radial) 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
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 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
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