def cart3d_to_usm3d_bc_filename(cart3d_filename, usm3d_bc_filename, log=None, debug=False): """ Converts a Cart3D file to STL format. :param cart3d_filename: path to the input Cart3D file :param usm3d_bc_filename: path to the output BC file :param log: a logger object (or None) :param debug: True/False (used if log is not defined) """ cart3d = Cart3DReader(log=log, debug=debug) (nodes, elements, regions, loads) = cart3d.read_cart3d(cart3d_filename) #nodes = cart3d.nodes #elements = cart3d.elements #regions = cart3d.regions usm3d_bc = open(usm3d_bc_filename, 'wb') patches = unique(regions) npatches = len(patches) nelements, three = elements.shape usm3d_bc.write('%-8s %-8s %-8s %s\n' % (nelements, 'intA', npatches, 'intB')) usm3d_bc.write('Triangle Patch Nodes\n') for i, element, iregion in zip(count(), elements, regions): (n1, n2, n3) = element usm3d_bc.write('%-8s %-8s %-8s %-8s %s\n' % (i + 1, iregion, n1, n2, n3)) usm3d_bc.close()
def nastran_to_cart3d(bdf, log=None, debug=False): """ Converts a Nastran BDF object to Cart3D format. :param bdf: a BDF object :param log: a logger object (or None) :param debug: True/False (used if log is not defined) :returns cart3d: a Cart3D object """ cart3d = Cart3DReader(log=log, debug=debug) nnodes = len(model.nodes) nelements = len(model.elements) nodes = zeros((nnodes, 3), 'float64') elements = zeros((nelements, 3), 'int32') regions = zeros(nelements, 'int32') i = 0 for node_id, node in sorted(iteritems(model.nodes)): elements[i, :] = node.Position() for element_id, element in sorted(iteritems(model.elements)): if element.type == 'CTRIA3': elements[i, :] = element.NodeIDs() regions[i] = element.Mid() else: raise NotImplementedError(element.type) cart3d.nodes = nodes cart3d.elements = elements cart3d.regions = regions return cart3d
def test_1(self): lines = """7 6 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 2.000000 0.000000 0.000000 1.000000 1.000000 0.000000 2.000000 1.000000 0.000000 1.000000 -1.000000 0.000000 2.000000 -1.000000 0.000000 1 4 2 2 4 5 2 5 3 2 6 1 5 6 2 5 5 2 1 2 3 2 4 6 """ infileName = os.path.join(test_path, 'flat_full.tri') f = open(infileName, 'wb') f.write(lines) f.close() cart3d = Cart3DReader(log=None, debug=False) (points, elements, regions, loads) = cart3d.read_cart3d(infileName) assert len(points) == 7, 'npoints=%s' % len(points) assert len(elements) == 6, 'nelements=%s' % len(elements) assert len(regions) == 6, 'nregions=%s' % len(regions) assert len(loads) == 0, 'nloads=%s' % len(loads)
def main(): """tests getting the normal groups""" cart3d = Cart3DReader(log=None, debug=False) result_names = [] # read the mesh only (points, elements, regions, loads) = cart3d.read_cart3d('Cart3d_55000_2.4_10_0_0_0_0.i.triq', result_names=result_names) celements = elements.copy() normals, groups = get_normal_groups(points, celements) tris, quads = normal_groups_to_quads(celements, normals, groups) write_nastran_quads_tris(points, tris, quads, bdf_filename='tris_quads.bdf')
def cart3d_to_nastran_filename(cart3d_filename, bdf_filename, log=None, debug=False): """ Converts a Cart3D file to STL format. :param cart3d_filename: path to the input Cart3D file :param bdf_filename: path to the output BDF file :param log: a logger object (or None) :param debug: True/False (used if log is not defined) """ cart3d = Cart3DReader(log=log, debug=debug) (nodes, elements, regions, loads) = cart3d.read_cart3d(cart3d_filename) #bdf = BDF() #bdf.nodes = cart3d.nodes #bdf.elements = cart3d.elements #bdf.write_bdf(bdf_filename) #return f = open(bdf_filename, 'wb') f.write('CEND\n') f.write('BEGIN BULK\n') f.write('$Nodes\n') i = 0 nid = 1 cid = 0 for node in nodes: card = print_card_16(['GRID', nid, cid] + list(node)) f.write(card) eid = 1 f.write('$Elements\n') for (n1, n2, n3), pid in zip(elements, regions): card = print_card_8(['CTRIA3', eid, pid, n1, n2, n3]) f.write(card) eid += 1 t = 0.1 E = 1e7 nu = 0.3 f.write('$Properties\n') for pid in unique(regions): mid = pid card = print_card_8(['PSHELL', pid, mid, t]) f.write(card) card = print_card_8(['MAT1', mid, E, None, nu]) f.write(card) f.write('ENDDATA\n') f.close()
def test_2(self): lines = """5 3 6 0. 0. 0. 1. 0. 0. 2. 0. 0. 1. 1. 0. 2. 1. 0. 1 4 2 2 4 5 2 5 3 1 2 3 1. 1. 1. 1. 1. 1. 2. 2. 2. 2. 2. 2. 3. 3. 3. 3. 3. 3. 4. 4. 4. 4. 4. 4. 5. 5. 5. 5. 5. 5. """ infileName = os.path.join(test_path, 'flat.tri') f = open(infileName, 'wb') f.write(lines) f.close() cart3d = Cart3DReader(log=None, debug=False) (points, elements, regions, loads) = cart3d.read_cart3d(infileName) assert len(points) == 5, 'npoints=%s' % len(points) assert len(elements) == 3, 'nelements=%s' % len(elements) assert len(regions) == 3, 'nregions=%s' % len(regions) assert len(loads) == 10, 'nloads=%s' % len(loads) assert len(loads['Cp']) == 5, 'nCp=%s' % len(loads['Cp']) outfileName = os.path.join(test_path, 'flat.bin.tri') cart3d.write_cart3d(outfileName, points, elements, regions, loads=None, is_binary=True) cnormals = cart3d.get_normals(points, elements) nnormals = cart3d.get_normals_at_nodes(points, elements, cnormals)
def test_3(self): infileName = os.path.join(test_path, 'threePlugs.bin.tri') outfileName = os.path.join(test_path, 'threePlugs_out.tri') outfileName_bin = os.path.join(test_path, 'threePlugs_bin2.tri') outfileName_bin_out = os.path.join(test_path, 'threePlugs_bin_out.tri') cart3d = Cart3DReader(log=None, debug=False) (points, elements, regions, loads) = cart3d.read_cart3d(infileName) cart3d.write_cart3d(outfileName, points, elements, regions, loads=None, is_binary=False) cart3d.write_cart3d(outfileName_bin, points, elements, regions, loads=None, is_binary=True) (points2, elements2, regions2, loads2) = cart3d.read_cart3d(outfileName) check_array(points, points2) (points2, elements2, regions2, loads2) = cart3d.read_cart3d(outfileName_bin) check_array(points, points2) os.remove(outfileName) os.remove(outfileName_bin) cart3d.write_cart3d(outfileName_bin_out, points2, elements2, regions2, loads2, is_binary=False) os.remove(outfileName_bin_out)
def write_new_cart3d_mesh(cfdGridFile, cfdGridFile2, wA): """takes in half model wA, and baseline cart3d model, updates full model grids""" log.info("---starting write_new_cart3d_mesh---") # make half model cart3d = Cart3DReader() result_names = ['Cp'] (points, elements, regions, loads) = cart.read_cart3d(cfdGridFile, result_names=result_names) # reading full model (points, elements, regions, loads) = cart.make_half_model(points, elements, regions, loads) # adjusting points points2 = {} for (iPoint, point) in sorted(points.iteritems()): wai = wA[iPoint] (x, y, z) = point points2[iPoint] = [x, y, z + wai] (points, elements, regions, loads) = cart.make_mirror_model(points2, elements, regions, loads) # mirroring model cart.write_cart3d(cfdGridFile2, points, elements, regions) # writing half model; no loads (cleans up leftover parameters) log.info("---finished write_new_cart3d_mesh---") sys.stdout.flush()
def cart3d_to_stl_filename(cart3d_filename, stl_filename, log=None, debug=False): """ Converts a Cart3D file to STL format. :param cart3d_filename: path to the input Cart3D file :param stl_filename: path to the output STL file :param log: a logger object (or None) :param debug: True/False (used if log is not defined) """ cart3d = Cart3DReader(log=log, debug=debug) cart3d.read_cart3d(cart3d_filename) stl = STLReader() stl.nodes = cart3d.nodes stl.elements = cart3d.elements stl.write_stl(stl_filename) return if 0: normals = model.normals() f = open(stl_filename, 'wb') f.write('solid cart3d_model\n') i = 0 for (n1, n2, n3) in model.elements: #f.write('solid cart3d_model\n') n = normals[i] f.write('loop\n') f.write(' facet normal %f %f %f\n' % (n[0], n[1], n[2])) f.write(' vertex %f %f %f\n' % (n1[0], n1[1], n1[2])) f.write(' vertex %f %f %f\n' % (n1[0], n1[1], n1[2])) f.write(' vertex %f %f %f\n' % (n1[0], n1[1], n1[2])) f.write(' endfacet') f.write('endloop\n') i += 1 f.close()
def read_cart3d_points(cfdGridFile): """return half model points to shrink xK matrix""" cart = Cart3DReader() (points, elements, regions, loads) = cart.read_cart3d(cfdGridFile) (points, elements, regions, loads) = cart.make_half_model(points, elements, regions, loads) return points
def read_cart3d(self, cart3d_filename): nodes, elements, regions, loads = Cart3DReader.read_cart3d( self, cart3d_filename) self.nodes = nodes self.elements = elements - 1
def load_cart3d_geometry(self, cart3d_filename, dirname, plot=True): #key = self.caseKeys[self.iCase] #case = self.resultCases[key] skipReading = self.removeOldGeometry(cart3d_filename) if skipReading: return model = Cart3DReader(log=self.log, debug=False) self.modelType = 'cart3d' #self.modelType = model.modelType (nodes, elements, regions, loads) = model.read_cart3d(cart3d_filename) self.nNodes = model.nPoints self.nElements = model.nElementsRead #print("nNodes = ",self.nNodes) #print("nElements = ", self.nElements) self.grid.Allocate(self.nElements, 1000) #self.gridResult.SetNumberOfComponents(self.nElements) self.grid2.Allocate(1, 1000) points = vtk.vtkPoints() points.SetNumberOfPoints(self.nNodes) #self.gridResult.Allocate(self.nNodes, 1000) #vectorReselt.SetNumberOfComponents(3) self.nidMap = {} #elem.SetNumberOfPoints(nNodes) if 0: fraction = 1. / self.nNodes # so you can color the nodes by ID for nid, node in sorted(iteritems(nodes)): points.InsertPoint(nid - 1, *node) self.gridResult.InsertNextValue(nid * fraction) #print(str(element)) #elem = vtk.vtkVertex() #elem.GetPointIds().SetId(0, i) #self.aQuadGrid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) #vectorResult.InsertTuple3(0, 0.0, 0.0, 1.0) assert nodes is not None nnodes = nodes.shape[0] nid = 0 #print("nnodes=%s" % nnodes) mmax = amax(nodes, axis=0) mmin = amin(nodes, axis=0) dim_max = (mmax - mmin).max() self.update_axes_length(dim_max) for i in range(nnodes): points.InsertPoint(nid, nodes[i, :]) nid += 1 nelements = elements.shape[0] elements -= 1 for eid in range(nelements): elem = vtkTriangle() node_ids = elements[eid, :] elem.GetPointIds().SetId(0, node_ids[0]) elem.GetPointIds().SetId(1, node_ids[1]) elem.GetPointIds().SetId(2, node_ids[2]) self.grid.InsertNextCell( 5, elem.GetPointIds()) #elem.GetCellType() = 5 # vtkTriangle self.grid.SetPoints(points) #self.grid2.SetPoints(points2) #self.grid.GetPointData().SetScalars(self.gridResult) #print(dir(self.grid) #.SetNumberOfComponents(0)) #self.grid.GetCellData().SetNumberOfTuples(1); #self.grid.GetCellData().SetScalars(self.gridResult) self.grid.Modified() #self.grid2.Modified() self.grid.Update() #self.grid2.Update() print("updated grid") # loadCart3dResults - regions/loads self.TurnTextOn() self.scalarBar.VisibilityOn() self.scalarBar.Modified() assert loads is not None if 'Mach' in loads: avgMach = mean(loads['Mach']) note = ': avg(Mach)=%g' % avgMach else: note = '' self.iSubcaseNameMap = {1: ['Cart3d%s' % note, '']} cases = {} ID = 1 #print("nElements = ",nElements) form, cases = self._fill_cart3d_case(cases, ID, nodes, elements, regions, loads, model) #self._finish_results_io(cases) self._finish_results_io2(form, cases)
def __init__(self, log=None, debug=False): Cart3DReader.__init__(self, log=log, debug=debug)
def load_cart3d_results(self, cart3d_filename, dirname): model = Cart3DReader(log=self.log, debug=False) self.load_cart3d_geometry(cart3d_filename, dirname)
def load_cart3d_geometry(self, cart3dFileName, dirname): #key = self.caseKeys[self.iCase] #case = self.resultCases[key] skipReading = self.removeOldGeometry(cart3dFileName) if skipReading: return model = Cart3DReader(log=self.log, debug=False) self.modelType = model.modelType (nodes, elements, regions, loads) = model.read_cart3d(cart3dFileName) self.nNodes = model.nPoints self.nElements = model.nElementsRead #print("nNodes = ",self.nNodes) print("nElements = ", self.nElements) self.grid.Allocate(self.nElements, 1000) #self.gridResult.SetNumberOfComponents(self.nElements) self.grid2.Allocate(1, 1000) points = vtk.vtkPoints() points.SetNumberOfPoints(self.nNodes) #self.gridResult.Allocate(self.nNodes, 1000) #vectorReselt.SetNumberOfComponents(3) self.nidMap = {} #elem.SetNumberOfPoints(nNodes) if 0: fraction = 1. / self.nNodes # so you can color the nodes by ID for nid, node in sorted(nodes.iteritems()): points.InsertPoint(nid - 1, *node) self.gridResult.InsertNextValue(nid * fraction) #print str(element) #elem = vtk.vtkVertex() #elem.GetPointIds().SetId(0, i) #self.aQuadGrid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) #vectorResult.InsertTuple3(0, 0.0, 0.0, 1.0) assert nodes is not None nnodes, three = nodes.shape nid = 0 print "nnodes=%s" % nnodes for i in xrange(nnodes): points.InsertPoint(nid, nodes[i, :]) nid += 1 nelements, three = elements.shape elements -= 1 for eid in xrange(nelements): elem = vtkTriangle() node_ids = elements[eid, :] elem.GetPointIds().SetId(0, node_ids[0]) elem.GetPointIds().SetId(1, node_ids[1]) elem.GetPointIds().SetId(2, node_ids[2]) self.grid.InsertNextCell( 5, elem.GetPointIds()) #elem.GetCellType() = 5 # vtkTriangle self.grid.SetPoints(points) #self.grid2.SetPoints(points2) #self.grid.GetPointData().SetScalars(self.gridResult) #print dir(self.grid) #.SetNumberOfComponents(0) #self.grid.GetCellData().SetNumberOfTuples(1); #self.grid.GetCellData().SetScalars(self.gridResult) self.grid.Modified() #self.grid2.Modified() self.grid.Update() #self.grid2.Update() print("updated grid") # loadCart3dResults - regions/loads self.TurnTextOn() self.scalarBar.VisibilityOn() self.scalarBar.Modified() assert loads is not None if 'Mach' in loads: avgMach = mean(loads['Mach']) note = ': avg(Mach)=%g' % avgMach else: note = '' self.iSubcaseNameMap = {1: ['Cart3d%s' % note, '']} cases = {} ID = 1 #print "nElements = ",nElements cases = self.fillCart3dCase(cases, ID, elements, regions, loads) self.resultCases = cases self.caseKeys = sorted(cases.keys()) #print "caseKeys = ",self.caseKeys #print "type(caseKeys) = ",type(self.caseKeys) self.iCase = -1 self.nCases = len(self.resultCases) - 1 # number of keys in dictionary self.cycleResults() # start at nCase=0
def intersect_model(cart3d_filename): cart3d = Cart3DReader() points, elements, regions, loads = cart3d.read_cart3d(cart3d_filename) intersect = Intersect(points, elements, regions) intersect.intersect_tris()
def read_cart3d(self, cart3d_filename): nodes, elements, regions, loads = Cart3DReader.read_cart3d(self, cart3d_filename) self.nodes = nodes self.elements = elements - 1
def __init__(self, log=None, debug=False): Cart3DReader.__init__(self, log=log, debug=debug)
def run_map_loads(inputs, cart3dGeom='Components.i.triq', bdfModel='fem.bdf', bdfModelOut='fem.loads.out'): assert os.path.exists(bdfModel), '%r doesnt exist' % bdfModel t0 = time() aero_format = inputs['aero_format'].lower() # the property regions to map elements to propertyRegions = [1, 1101, 1501, 1601, 1701, 1801, 1901, 2101, 2501, 2601, 2701, 2801, 2901, 10103, 10201, 10203, 10301, 10401, 10501, 10601, 10701, 10801, 10901, 20103, 20203, 20301, 20401, 20501, 20601, 20701, 20801, 20901, 701512, 801812] if inputs is None: inputs = { 'aero_format' : 'Cart3d', 'Mach' : 0.825, 'pInf' : 499.3, # psf, alt=35k (per Schaufele p. 11) 'pInf' : pInf / 144., # convert to psi 'qInf' : 1.4 / 2. * pInf * Mach**2., 'Sref' : 1582876., # inch^2 'Lref' : 623., # inch 'xref' : 268., # inch 'isubcase' : 1, } isubcase = inputs['isubcase'] pInf = inputs['pInf'] qInf = inputs['qInf'] if aero_format == 'cart3d': mesh = Cart3DReader() half_model = cart3dGeom + '_half' result_names = ['Cp', 'rho', 'rhoU', 'rhoV', 'rhoW', 'E'] if not os.path.exists(half_model): (nodes, elements, regions, loads) = mesh.read_cart3d(cart3dGeom, result_names=result_names) #Cp = loads['Cp'] (nodes, elements, regions, loads) = mesh.make_half_model(nodes, elements, regions, loads, axis='y') Cp = loads['Cp'] #(nodes, elements, regions, Cp) = mesh.renumber_mesh(nodes, elements, regions, Cp) mesh.write_cart3d(half_model, nodes, elements, regions, loads) else: (nodes, elements, regions, loads) = mesh.read_cart3d(half_model, result_names=['Cp']) Cp = loads['Cp'] else: raise NotImplementedError('aero_format=%r' % aero_format) aeroModel = AeroModel(inputs, nodes, elements, Cp) log.info("elements[1] = %s" % elements[1]) del elements, nodes, Cp fem = BDF(debug=True, log=log) fem.read_bdf(bdfModel) sys.stdout.flush() # 1 inboard # 1000s upper - lower inboard # 2000s lower - lower inboard # big - fin structuralModel = StructuralModel(fem, propertyRegions) mapper = LoadMapping(aeroModel, structuralModel) t1 = time() mapper.set_flight_condition(pInf, qInf) mapper.setOutput(bdffile=bdfModelOut, loadCase=isubcase) log.info("setup time = %g sec; %g min" % (t1-t0, (t1-t0)/60.)) mapper.build_mapping_matrix(debug=False) t2 = time() log.info("mapping matrix time = %g sec; %g min" % (t2-t1, (t2-t1)/60.)) mapper.mapLoads() t3 = time() log.info("map loads time = %g sec" % (t3 - t2)) log.info("total time = %g min" % ((t3 - t0) / 60.))
def run_map_loads(cart3dGeom='Components.i.triq', bdfModel='fem.bdf', bdfModelOut='fem.loads.out'): assert os.path.exists(bdfModel), '%r doesnt exist' % bdfModel t0 = time() mesh = Cart3DReader() half_model = cart3dGeom + '_half' result_names = ['Cp', 'rho', 'rhoU', 'rhoV', 'rhoW', 'E'] (nodes, elements, regions, loads) = mesh.read_cart3d(cart3dGeom, result_names=result_names) #Cp = loads['Cp'] (nodes, elements, regions, loads) = mesh.make_half_model(nodes, elements, regions, loads, axis='y') Cp = loads['Cp'] #(nodes, elements, regions, Cp) = mesh.renumber_mesh(nodes, elements, regions, Cp) mesh.write_cart3d(half_model, nodes, elements, regions, loads) Mach = 0.825 pInf = 499.3 # psf, alt=35k (per Schaufele p. 11) pInf = pInf / 144. # convert to psi qInf = 1.4 / 2. * pInf * Mach**2. aeroModel = AeroModel(nodes, elements, Cp, pInf, qInf) log.info("elements[1] = %s" % elements[1]) del elements, nodes, Cp fem = BDF(debug=True, log=log) fem.read_bdf(bdfModel) sys.stdout.flush() propertyRegions = [ 1, 1101, 1501, 1601, 1701, 1801, 1901, 2101, 2501, 2601, 2701, 2801, 2901, 10103, 10201, 10203, 10301, 10401, 10501, 10601, 10701, 10801, 10901, 20103, 20203, 20301, 20401, 20501, 20601, 20701, 20801, 20901, 701512, 801812 ] # 1 inboard # 1000s upper - lower inboard # 2000s lower - lower inboard # big - fin structuralModel = StructuralModel(fem, propertyRegions) mapper = LoadMapping(aeroModel, structuralModel) t1 = time() mapper.set_flight_condition(pInf, qInf) mapper.setOutput(bdffile=bdfModelOut, loadCase=1) log.info("setup time = %g sec; %g min" % (t1 - t0, (t1 - t0) / 60.)) mapper.build_mapping_matrix(debug=False) t2 = time() log.info("mapping matrix time = %g sec; %g min" % (t2 - t1, (t2 - t1) / 60.)) mapper.mapLoads() t3 = time() log.info("map loads time = %g sec" % (t3 - t2)) log.info("total time = %g min" % ((t3 - t0) / 60.))