def write_geom1(self, op2, op2_ascii, obj): #if not hasattr(obj, 'nodes'): #return nnodes = len(obj.nodes) ncoords = len(obj.coords) if nnodes or ncoords: data = [ 4, 2, 4, #4, 2,4, 8, b'GEOM1 ', 8, 4, -1, 4, #4, 1, 4, #4, 0, 4, ] op2.write(pack('4i 8s i 3i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 7, 4, 28, 1, 2, 3, 4, 5, 6, 7, 28, ] op2.write(pack('3i 9i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -2, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ #4, 0, 4, 4, 2, 4, 8, 1, 2, 8, ] op2.write(pack('3i 4i', *data)) op2_ascii.write(str(data) + '\n') #data = [8, 1, 2, 8] #op2.write(pack('4i', *data)) #------------------------------------- data = [4, -3, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') if nnodes: #nvalues = nnodes * 8 #nbytes = nvalues * 4 #nnodes = 72 bytes_per_id = 32 assert nnodes == 72, nnodes nbytes = bytes_per_id * nnodes + 12 # 12 comes from the keys nvalues = nbytes // 4 assert nbytes == 2316, nbytes op2.write(pack('3i', *[4, nvalues, 4])) op2.write(pack('i', nbytes)) #values, nbtyes)) #op2.write(pack('3i', *[4, 0, 4])) #op2_ascii.write(str([4, 0, 4])) #values, nbtyes)) #(4501, 45, 1): ['GRID', self._read_grid], key = (4501, 45, 1) op2.write(pack('3i', *key)) op2_ascii.write(str(key) + '\n') spack = Struct('ii 3f 3i') for nid, node in sorted(iteritems(obj.nodes)): xyz = node.xyz ps = node.ps if ps == '': psi = 0 else: psi = int(ps) seid = node.seid if seid == '': seidi = 0 else: seidi = int(seid) nid = node.nid nid * 10 + 1 data = [ node.nid, node.Cp(), xyz[0], xyz[1], xyz[2], node.Cd(), psi, seidi ] op2.write(spack.pack(*data)) op2_ascii.write( ' nid=%s cp=%s xyz=(%s, %s, %s) cd=%s ps=%s seid=%s\n' % tuple(data)) op2.write(pack('i', nbytes)) #------------------------------------- data = [4, -4, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 3, 4, 12, 1, 2, 3, 12] op2.write(pack('3i 5i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -5, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 0, 4, #4, 2, 4 ] op2.write(pack('3i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- if ncoords: #(1701, 17, 6): ['CORD1C', self._read_cord1c], #(1801, 18, 5): ['CORD1R', self._read_cord1r], #(1901, 19, 7): ['CORD1S', self._read_cord1s], #(2001, 20, 9): ['CORD2C', self._read_cord2c], #(2101, 21, 8): ['CORD2R', self._read_cord2r], #(2201, 22, 10): ['CORD2S', self._read_cord2s], #(14301,143,651): ['CORD3G', self._read_cord3g], pass _write_markers(op2, op2_ascii, [2, 4])
def write_op2(self, op2_outname, obj=None, is_mag_phase=False, delete_objects=True, post=-1): """ Writes an OP2 file based on the data we have stored in the object Parameters ---------- op2_outname : str the name of the F06 file to write obj : OP2(); default=None -> self the OP2 object if you didn't inherit the class is_mag_phase : bool; default=False should complex data be written using Magnitude/Phase instead of Real/Imaginary (default=False; Real/Imag) Real objects don't use this parameter. delete_objects : bool; default=True should objects be deleted after they're written to reduce memory (default=True) """ assert op2_outname != 'ctria3.op2' print('writing %s' % op2_outname) if obj is None: obj = self if isinstance(op2_outname, str): op2 = open(op2_outname, 'wb') op2_ascii = open(op2_outname + '.txt', 'wb') print('op2 out = %r' % op2_outname) else: assert isinstance(op2_outname, file), 'type(op2_outname)= %s' % op2_outname op2 = op2_outname op2_outname = op2.name print('op2_outname =', op2_outname) #op2_ascii.write('writing [3, 7, 0] header\n') #if markers == [3,]: # PARAM, POST, -1 #self.read_markers([3]) #data = self.read_block() #self.read_markers([7]) #data = self.read_block() #data = self._read_record() #self.read_markers([-1, 0]) #elif markers == [2,]: # PARAM, POST, -2 if post == -1: #_write_markers(op2, op2_ascii, [3, 0, 7]) op2.write(pack('3i', *[ 4, 3, 4, ])) tape_code = b'NASTRAN FORT TAPE ID CODE - ' op2.write(pack('7i 28s i', *[4, 1, 4, 4, 7, 4, 28, tape_code, 28])) nastran_version = b'NX8.5 ' if obj.is_nx else b'XXXXXXXX' op2.write( pack( b'4i 8s i', *[ 4, 2, 4, #4, 2, 4, #4, 1, 4, #4, 8, 4, 8, nastran_version, 8 ])) op2.write(pack(b'6i', *[ 4, -1, 4, 4, 0, 4, ])) elif post == -2: _write_markers(op2, op2_ascii, [2, 4]) else: raise RuntimeError('post = %r; use -1 or -2' % post) self.write_geom1(op2, op2_ascii, obj) self.write_geom2(op2, op2_ascii, obj) if obj.grid_point_weight.reference_point is not None: if hasattr(result, 'write_op2'): print("grid_point_weight") obj.grid_point_weight.write_op2(op2) else: print("*op2 - grid_point_weight not written") #is_mag_phase = False # eigenvalues are written first for ikey, result in sorted(iteritems(obj.eigenvalues)): header #print('%-18s SUBCASE=%i' % (result.__class__.__name__, isubcase)) if hasattr(result, 'write_op2'): result.write_op2(op2, op2_ascii) if delete_objects: del result else: print("*op2 - %s not written" % result.__class__.__name__) write_op2 # then eigenvectors # has a special header for isubcase, result in sorted(iteritems(obj.eigenvectors)): (subtitle, label) = obj.iSubcaseNameMap[isubcase] if hasattr(result, 'write_op2'): print('%-18s SUBCASE=%i' % (result.__class__.__name__, isubcase)) result.write_op2(op2, op2_ascii, is_mag_phase=is_mag_phase) if delete_objects: del result else: print("*op2 - %s not written" % result.__class__.__name__) write_op2 # finally, we writte all the other tables # nastran puts the tables in order of the Case Control deck, # but we're lazy so we just hardcode the order #if markers == [3,]: # PARAM, POST, -2 #self.read_markers([3]) #data = self.read_block() #self.read_markers([7]) #data = self.read_block() ##self.show(100) #data = self._read_record() oef = [ # OEF - forces # alphabetical order... obj.cbar_force, # beam #obj.cbeam_forces, #obj.cbar100_forces, #obj.cbend_forces, obj.cbeam_force, obj.cbush_force, obj.celas1_force, obj.celas2_force, obj.celas3_force, obj.celas4_force, obj.cdamp1_force, obj.cdamp2_force, obj.cdamp3_force, obj.cdamp4_force, #obj.plateForces, # centroidal elements #obj.plateForces2, # bilinear elements obj.conrod_force, obj.cquad4_force, obj.cquad8_force, obj.crod_force, obj.cshear_force, obj.ctria3_force, obj.ctria6_force, obj.ctube_force, # other #obj.cgap_force, #obj.solidPressureForces, ] oes1x1 = [ # cbars/cbeams obj.cbar_stress, obj.cbeam_stress, # bush obj.cbush_stress, obj.cbush1d_stress_strain, # rods #obj.nonlinearRodStress, obj.celas1_stress, obj.celas2_stress, obj.celas3_stress, obj.celas4_stress, obj.chexa_stress, obj.conrod_stress, obj.cpenta_stress, obj.cquad4_stress, obj.cquad8_stress, obj.cquadr_stress, obj.crod_stress, obj.cshear_stress, obj.ctetra_stress, obj.ctria3_stress, obj.ctria6_stress, obj.ctriar_stress, obj.ctube_stress, ] oes1c = [ obj.cquad4_composite_stress, obj.cquad8_composite_stress, obj.cquadr_composite_stress, obj.ctria3_composite_stress, obj.ctria6_composite_stress, obj.ctriar_composite_stress, #obj.nonlinearPlateStress, obj.ctriax_stress, #obj.hyperelasticPlateStrain, ] #stress = oes1x1 + oes1c strain = [ # bars/beams obj.cbar_strain, obj.cbeam_strain, # springs, obj.celas1_strain, obj.celas2_strain, obj.celas3_strain, obj.celas4_strain, # plates obj.ctria3_strain, obj.cquad4_strain, obj.cshear_strain, obj.cquad4_composite_strain, obj.cquad8_composite_strain, obj.cquadr_composite_strain, obj.ctria3_composite_strain, obj.ctria6_composite_strain, obj.ctriar_composite_strain, #obj.nonlinearPlateStrain, #obj.ctriax_strain, obj.hyperelasticPlateStress, # solids obj.ctetra_strain, obj.cpenta_strain, obj.chexa_strain, # rods #obj.nonlinearRodStrain, # non-vectorized obj.chexa_strain, obj.conrod_strain, obj.cpenta_strain, obj.cquad4_strain, obj.cquad8_strain, obj.cquadr_strain, obj.crod_strain, obj.cshear_strain, obj.ctetra_strain, obj.ctria3_strain, obj.ctria6_strain, obj.ctriar_strain, obj.ctube_strain, # bush obj.cbush_strain, ] oug = [ obj.accelerations, obj.displacements, obj.displacementsPSD, obj.displacementsATO, obj.displacementsRMS, #obj.scaledDisplacements, # ??? obj.temperatures, obj.velocities, obj.eigenvectors, ] oqg_mpc = [obj.mpc_forces] oqg_spc = [obj.spc_forces] ogs = [obj.grid_point_stresses, obj.grid_point_volume_stresses] ogp = [obj.grid_point_forces] other = [ #obj.forceVectors, #obj.loadVectors, obj.thermal_load_vectors, ] isubcases = sorted(obj.iSubcaseNameMap.keys()) #title = obj.title res_categories = [('OUG', oug), ('OQG_SPC', oqg_spc), ('OQG_MPC', oqg_mpc), ('OEF', oef), ('OES1X', oes1x1), ('OES1C', oes1c), ('OSTR', strain), ('OGS', ogs), ('OGP', ogp), ('other', other)] res_outs = {} # TODO: this may need to be reworked such that all of subcase 1 #is printed before subcase 2 for res_category_name, res_category in res_categories: print("res_category_name = %s" % res_category_name) for res_type in res_category: res_keys = isubcases itable = -1 for res_key in res_keys: isubcase = res_key case_count = 0 if isubcase in res_type: case_count += 1 #(subtitle, label) = obj.iSubcaseNameMap[isubcase] result = res_type[isubcase] element_name = '' if hasattr(result, 'element_name'): element_name = ' - ' + result.element_name if hasattr(result, 'write_op2'): print(' %s - isubcase=%i%s' % (result.__class__.__name__, isubcase, element_name)) result.write_op2(op2, op2_ascii, itable, obj.date, is_mag_phase=False) else: print(" *op2 - %s not written" % result.__class__.__name__) footer = [4, 0, 4] op2.write(pack(b'3i', *footer)) itable -= 1 #footer = [4, itable, 4] #op2.write(pack(b'3i', *footer)) #footer = [4, 0, 4] #op2.write(pack(b'3i', *footer)) footer = [4, itable, 4] op2.write(pack(b'3i', *footer)) #footer = [4, 0, 4] #op2.write(pack(b'3i', *footer)) #if case_count: #footer = [4, 0, 4] #op2.write(pack(b'3i', *footer)) #break footer = [4, 0, 4] op2.write(pack(b'3i', *footer)) footer = [4, 0, 4] op2.write(pack(b'3i', *footer)) op2.close() op2_ascii.close()
def write_geom2(self, op2, op2_ascii, obj): #if not hasattr(obj, 'nodes'): #return nelements = len(obj.elements) if nelements: data = [ 4, 2, 4, #4, 2,4, 8, b'GEOM2 ', 8, 4, -1, 4, #4, 1, 4, #4, 0, 4, ] op2.write(pack('4i 8s i 3i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 7, 4, 28, 1, 2, 3, 4, 5, 6, 7, 28, ] op2.write(pack('3i 9i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -2, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ #4, 0, 4, 4, 2, 4, 8, 1, 2, 8, ] op2.write(pack('3i 4i', *data)) op2_ascii.write(str(data) + '\n') #data = [8, 1, 2, 8] #op2.write(pack('4i', *data)) #------------------------------------- data = [4, -3, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') if nelements: out = obj.get_card_ids_by_card_types( ['CTETRA', 'CHEXA', 'CPENTA']) for name, eids in out: nelements = len(eids) if name == 'CTETRA': key = (5508, 55, 217) nbytes_per_id = 48 else: raise NotImplementedError(name) #if name in ['CTETRA', 'CHEXA', 'CPENTA']: #data_in = [eid, pid, n1, n2, n3, n4] #bigNodes = [n5, n6, n7, n8, n9, n10] #if sum(bigNodes) > 0: #elem = CTETRA10(data_in + bigNodes) #else: #elem = CTETRA4(data_in) nbytes = nbytes_per_id * nelements + 12 # 12 comes from the keys nvalues = nbytes // 4 op2.write(pack('3i', *[4, nvalues, 4])) op2.write(pack('i', nbytes)) #values, nbtyes)) #key = (4501, 45, 1) op2.write(pack('3i', *key)) op2_ascii.write(str(key) + '\n') spack = Struct(b(endian + '12i')) for eid in sorted(eids): elem = obj.elements[eid] nids = elem.node_ids pid = elem.pid assert None not in nids, nids data = [eid, pid] + nids op2.write(spack.pack(*data)) op2_ascii.write(' eid=%s pid=%s nids=%s\n' % (eid, pid, str(nids))) op2.write(pack('i', nbytes)) #------------------------------------- data = [4, -4, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 3, 4, 12, 1, 2, 3, 12] op2.write(pack('3i 5i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -5, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 0, 4, #4, 2, 4 ] op2.write(pack('3i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- if ncoords: #(1701, 17, 6): ['CORD1C', self._read_cord1c], #(1801, 18, 5): ['CORD1R', self._read_cord1r], #(1901, 19, 7): ['CORD1S', self._read_cord1s], #(2001, 20, 9): ['CORD2C', self._read_cord2c], #(2101, 21, 8): ['CORD2R', self._read_cord2r], #(2201, 22, 10): ['CORD2S', self._read_cord2s], #(14301,143,651): ['CORD3G', self._read_cord3g], pass _write_markers(op2, op2_ascii, [2, 4])
def write_op2(self, op2_outname, is_mag_phase=False, delete_objects=True): """ Writes an OP2 file based on the data we have stored in the object :param self: the F06 object :param op2_outname: the name of the F06 file to write :param is_mag_phase: should complex data be written using Magnitude/Phase instead of Real/Imaginary (default=False; Real/Imag) Real objects don't use this parameter. :param delete_objects: should objects be deleted after they're written to reduce memory (default=True) """ assert op2_outname != 'ctria3.op2' print('writing %s' % op2_outname) if isinstance(op2_outname, str): op2 = open(op2_outname, 'wb') op2_ascii = open(op2_outname + '.txt', 'wb') else: assert isinstance(op2_outname, file), 'type(op2_outname)= %s' % op2_outname op2 = op2_outname op2_outname = op2.name print('op2_outname =', op2_outname) #op2_ascii.write('writing [3, 7, 0] header\n') #if markers == [3,]: # PARAM, POST, -1 #self.read_markers([3]) #data = self.read_block() #self.read_markers([7]) #data = self.read_block() #data = self._read_record() #self.read_markers([-1, 0]) #elif markers == [2,]: # PARAM, POST, -2 if 1: #_write_markers(op2, op2_ascii, [3, 0, 7]) op2.write(pack('3i', *[4, 3, 4,])) tape_code = b'NASTRAN FORT TAPE ID CODE - ' op2.write(pack('7i 28s i', *[4, 1, 4, 4, 7, 4, 28, tape_code, 28])) nastran_version = b'NX8.5 ' if self.is_nx else b'XXXXXXXX' op2.write(pack(b'4i 8s i', *[4, 2, 4, #4, 2, 4, #4, 1, 4, #4, 8, 4, 8, nastran_version, 8])) op2.write(pack(b'6i', *[4, -1, 4, 4, 0, 4,])) else: _write_markers(op2, op2_ascii, [2, 4]) if self.grid_point_weight.reference_point is not None: if has_attr(result, 'write_op2'): print("grid_point_weight") self.grid_point_weight.write_op2(op2, page_stamp, self.page_num) else: print("*op2 - grid_point_weight not written") #is_mag_phase = False # eigenvalues are written first for ikey, result in sorted(iteritems(self.eigenvalues)): header #print('%-18s SUBCASE=%i' % (result.__class__.__name__, isubcase)) if has_attr(result, 'write_op2'): result.write_op2(op2, op2_ascii) if delete_objects: del result else: print("*op2 - %s not written" % result.__class__.__name__) asdf # then eigenvectors # has a special header for isubcase, result in sorted(iteritems(self.eigenvectors)): (subtitle, label) = self.iSubcaseNameMap[isubcase] if hasattr(result, 'write_op2'): print('%-18s SUBCASE=%i' % (result.__class__.__name__, isubcase)) result.write_op2(op2, op2_ascii, is_mag_phase=is_mag_phase) if delete_objects: del result else: print("*op2 - %s not written" % result.__class__.__name__) asdf # finally, we writte all the other tables # nastran puts the tables in order of the Case Control deck, # but we're lazy so we just hardcode the order #if markers == [3,]: # PARAM, POST, -2 #self.read_markers([3]) #data = self.read_block() #self.read_markers([7]) #data = self.read_block() ##self.show(100) #data = self._read_record() oef = [ # OEF - forces # alphabetical order... self.cbar_force, # beam #self.cbeam_forces, #self.cbar100_forces, #self.cbend_forces, self.cbeam_force, self.cbush_force, self.celas1_force, self.celas2_force, self.celas3_force, self.celas4_force, self.cdamp1_force, self.cdamp2_force, self.cdamp3_force, self.cdamp4_force, #self.plateForces, # centroidal elements #self.plateForces2, # bilinear elements self.conrod_force, self.cquad4_force, self.cquad8_force, self.crod_force, self.cshear_force, self.ctria3_force, self.ctria6_force, self.ctube_force, # other #self.cgap_force, #self.solidPressureForces, ] oes1x1 = [ # cbars/cbeams self.cbar_stress, self.cbeam_stress, # bush self.cbush_stress, self.cbush1d_stress_strain, # rods #self.nonlinearRodStress, self.celas1_stress, self.celas2_stress, self.celas3_stress, self.celas4_stress, self.chexa_stress, self.conrod_stress, self.cpenta_stress, self.cquad4_stress, self.cquad8_stress, self.cquadr_stress, self.crod_stress, self.cshear_stress, self.ctetra_stress, self.ctria3_stress, self.ctria6_stress, self.ctriar_stress, self.ctube_stress, ] oes1c = [ self.cquad4_composite_stress, self.cquad8_composite_stress, self.cquadr_composite_stress, self.ctria3_composite_stress, self.ctria6_composite_stress, self.ctriar_composite_stress, #self.nonlinearPlateStress, self.ctriax_stress, #self.hyperelasticPlateStrain, ] #stress = oes1x1 + oes1c strain = [ # bars/beams self.cbar_strain, self.cbeam_strain, # springs, self.celas1_strain, self.celas2_strain, self.celas3_strain, self.celas4_strain, # plates self.ctria3_strain, self.cquad4_strain, self.cshear_strain, self.cquad4_composite_strain, self.cquad8_composite_strain, self.cquadr_composite_strain, self.ctria3_composite_strain, self.ctria6_composite_strain, self.ctriar_composite_strain, #self.nonlinearPlateStrain, #self.ctriax_strain, self.hyperelasticPlateStress, # solids self.ctetra_strain, self.cpenta_strain, self.chexa_strain, # rods #self.nonlinearRodStrain, # non-vectorized self.chexa_strain, self.conrod_strain, self.cpenta_strain, self.cquad4_strain, self.cquad8_strain, self.cquadr_strain, self.crod_strain, self.cshear_strain, self.ctetra_strain, self.ctria3_strain, self.ctria6_strain, self.ctriar_strain, self.ctube_strain, # bush self.cbush_strain, ] oug = [ self.accelerations, self.displacements, self.displacementsPSD, self.displacementsATO, self.displacementsRMS, self.scaledDisplacements, # ??? self.temperatures, self.velocities, self.eigenvectors, ] oqg_mpc = [self.mpc_forces,] oqg_spc = [self.spc_forces,] ogs = [self.grid_point_stresses, self.grid_point_volume_stresses, ] ogp = [self.grid_point_forces,] other = [ #self.forceVectors, #self.loadVectors, self.thermal_load_vectors, ] isubcases = sorted(self.iSubcaseNameMap.keys()) #title = self.Title res_categories = [ ('OUG', oug), ('OQG_SPC', oqg_spc), ('OQG_MPC', oqg_mpc), ('OEF', oef), ('OES1X', oes1x1), ('OES1C', oes1c), ('OSTR', strain), ('OGS', ogs), ('OGP', ogp), ('other', other) ] res_outs = {} # TODO: this may need to be reworked such that all of subcase 1 #is printed before subcase 2 for res_name, res_category in res_categories: print("res_name = %s" % res_name) for res_type in res_category: res_keys = isubcases itable = -1 for res_key in res_keys: isubcase = res_key if isubcase in res_type: #(subtitle, label) = self.iSubcaseNameMap[isubcase] result = res_type[isubcase] element_name = '' if hasattr(result, 'element_name'): element_name = ' - ' + result.element_name if hasattr(result, 'write_op2'): print(' %s - isubcase=%i%s' % (result.__class__.__name__, isubcase, element_name)) result.write_op2(op2, op2_ascii, itable, self.date, is_mag_phase=False) else: print(" *op2 - %s not written" % result.__class__.__name__) footer = [4, 0, 4] op2.write(pack(b'3i', *footer)) #footer = [4, 0, 4] op2.write(pack(b'3i', *footer)) op2.close()
def write_geom1(self, op2, op2_ascii, obj): #if not hasattr(obj, 'nodes'): #return nnodes = len(obj.nodes) ncoords = len(obj.coords) if nnodes or ncoords: data = [4, 2, 4, #4, 2,4, 8, b'GEOM1 ', 8, 4, -1, 4, #4, 1, 4, #4, 0, 4, ] op2.write(pack('4i 8s i 3i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 7, 4, 28, 1, 2, 3, 4, 5, 6, 7, 28, ] op2.write(pack('3i 9i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -2, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ #4, 0, 4, 4, 2, 4, 8, 1, 2, 8, ] op2.write(pack('3i 4i', *data)) op2_ascii.write(str(data) + '\n') #data = [8, 1, 2, 8] #op2.write(pack('4i', *data)) #------------------------------------- data = [4, -3, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') if nnodes: #nvalues = nnodes * 8 #nbytes = nvalues * 4 #nnodes = 72 bytes_per_id = 32 assert nnodes == 72, nnodes nbytes = bytes_per_id * nnodes + 12 # 12 comes from the keys nvalues = nbytes // 4 assert nbytes == 2316, nbytes op2.write(pack('3i', *[4, nvalues, 4])) op2.write(pack('i', nbytes)) #values, nbtyes)) #op2.write(pack('3i', *[4, 0, 4])) #op2_ascii.write(str([4, 0, 4])) #values, nbtyes)) #(4501, 45, 1): ['GRID', self._read_grid], key = (4501, 45, 1) op2.write(pack('3i', *key)) op2_ascii.write(str(key) + '\n') spack = Struct('ii 3f 3i') for nid, node in sorted(iteritems(obj.nodes)): xyz = node.xyz ps = node.ps if ps == '': psi = 0 else: psi = int(ps) seid = node.seid if seid == '': seidi = 0 else: seidi = int(seid) nid = node.nid nid * 10 + 1 data = [node.nid, node.Cp(), xyz[0], xyz[1], xyz[2], node.Cd(), psi, seidi] op2.write(spack.pack(*data)) op2_ascii.write(' nid=%s cp=%s xyz=(%s, %s, %s) cd=%s ps=%s seid=%s\n' % tuple(data)) op2.write(pack('i', nbytes)) #------------------------------------- data = [4, -4, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 3, 4, 12, 1, 2, 3, 12] op2.write(pack('3i 5i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -5, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 0, 4, #4, 2, 4 ] op2.write(pack('3i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- if ncoords: #(1701, 17, 6): ['CORD1C', self._read_cord1c], #(1801, 18, 5): ['CORD1R', self._read_cord1r], #(1901, 19, 7): ['CORD1S', self._read_cord1s], #(2001, 20, 9): ['CORD2C', self._read_cord2c], #(2101, 21, 8): ['CORD2R', self._read_cord2r], #(2201, 22, 10): ['CORD2S', self._read_cord2s], #(14301,143,651): ['CORD3G', self._read_cord3g], pass _write_markers(op2, op2_ascii, [2, 4])
def write_geom2(self, op2, op2_ascii, obj): #if not hasattr(obj, 'nodes'): #return nelements = len(obj.elements) if nelements: data = [4, 2, 4, #4, 2,4, 8, b'GEOM2 ', 8, 4, -1, 4, #4, 1, 4, #4, 0, 4, ] op2.write(pack('4i 8s i 3i', *data)) op2_ascii.write(str(data) + '\n') data = [ 4, 7, 4, 28, 1, 2, 3, 4, 5, 6, 7, 28, ] op2.write(pack('3i 9i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -2, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [ #4, 0, 4, 4, 2, 4, 8, 1, 2, 8, ] op2.write(pack('3i 4i', *data)) op2_ascii.write(str(data) + '\n') #data = [8, 1, 2, 8] #op2.write(pack('4i', *data)) #------------------------------------- data = [4, -3, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') if nelements: out = obj.get_card_ids_by_card_types(['CTETRA', 'CHEXA', 'CPENTA']) for name, eids in out: nelements = len(eids) if name == 'CTETRA': key = (5508, 55, 217) nbytes_per_id = 48 else: raise NotImplementedError(name) #if name in ['CTETRA', 'CHEXA', 'CPENTA']: #data_in = [eid, pid, n1, n2, n3, n4] #bigNodes = [n5, n6, n7, n8, n9, n10] #if sum(bigNodes) > 0: #elem = CTETRA10(data_in + bigNodes) #else: #elem = CTETRA4(data_in) nbytes = nbytes_per_id * nelements + 12 # 12 comes from the keys nvalues = nbytes // 4 op2.write(pack('3i', *[4, nvalues, 4])) op2.write(pack('i', nbytes)) #values, nbtyes)) #key = (4501, 45, 1) op2.write(pack('3i', *key)) op2_ascii.write(str(key) + '\n') spack = Struct(b(endian + '12i')) for eid in sorted(eids): elem = obj.elements[eid] nids = elem.node_ids pid = elem.pid assert None not in nids, nids data = [eid, pid] + nids op2.write(spack.pack(*data)) op2_ascii.write(' eid=%s pid=%s nids=%s\n' % (eid, pid, str(nids))) op2.write(pack('i', nbytes)) #------------------------------------- data = [4, -4, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 3, 4, 12, 1, 2, 3, 12] op2.write(pack('3i 5i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- data = [4, -5, 4, 4, 1, 4, 4, 0, 4] op2.write(pack('9i', *data)) op2_ascii.write(str(data) + '\n') data = [4, 0, 4, #4, 2, 4 ] op2.write(pack('3i', *data)) op2_ascii.write(str(data) + '\n') #------------------------------------- if ncoords: #(1701, 17, 6): ['CORD1C', self._read_cord1c], #(1801, 18, 5): ['CORD1R', self._read_cord1r], #(1901, 19, 7): ['CORD1S', self._read_cord1s], #(2001, 20, 9): ['CORD2C', self._read_cord2c], #(2101, 21, 8): ['CORD2R', self._read_cord2r], #(2201, 22, 10): ['CORD2S', self._read_cord2s], #(14301,143,651): ['CORD3G', self._read_cord3g], pass _write_markers(op2, op2_ascii, [2, 4])