Source code for pyNastran.op2.tables.oug.oug_eigenvectors

from pyNastran.op2.result_objects.table_object import RealTableArray, ComplexTableArray
from pyNastran.f06.f06_formatting import write_floats_13e


[docs] class ComplexEigenvectorArray(ComplexTableArray): def __init__(self, data_code, is_sort1, isubcase, dt): ComplexTableArray.__init__(self, data_code, is_sort1, isubcase, dt)
[docs] def write_f06(self, f06_file, header=None, page_stamp: str='PAGE %s', page_num: int=1, is_mag_phase: bool=False, is_sort1: bool=True): if header is None: header = [] words = [] #freq = self.eigrs[i] #freq = 0.0 #words.append('%16s = %12E\n' % ('EIGENVALUE', freq)) #words.append('%%16s = %%12E\n') has_cycle = False if hasattr(self, 'cycles'): has_cycle = True #if has_cycle: #words.append('%s = %s C O M P L E X E I G E N V E C T O R N O. %s\n' % ('%16s', '%12E', '%10i')) #msg.append('%16s = %12E C O M P L E X E I G E N V E C T O R N O . %10i\n \n' % ('CYCLES', self.mode_cycle, imode)) #else: words.append(' COMPLEX EIGENVALUE = %s, %s\n' % ('%12E', '%12E')) words.append(' C O M P L E X E I G E N V E C T O R NO. %s\n' % '%10i') #msg.append(' C O M P L E X E I G E N V E C T O R N O . %10i\n \n' % (imode)) #msg.append(' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n') #words += self.get_table_marker() return self._write_f06_transient_block(words, header, page_stamp, page_num, f06_file, is_mag_phase, is_sort1)
[docs] class RealEigenvectorArray(RealTableArray): def __init__(self, data_code, is_sort1, isubcase, dt, f06_flag=False): RealTableArray.__init__(self, data_code, is_sort1, isubcase, dt)
[docs] def get_phi(self): """ gets the eigenvector matrix Returns ------- phi : (ndof, nmodes) the eigenvector matrix TODO: doesn't consider SPOINTs/EPOINTs """ nmodes, nnodes = self.data.shape[:2] ndof = nnodes * 6 phi_transpose = self.data.reshape(nmodes, ndof) return phi_transpose.T
[docs] @classmethod def phi_to_data(self, phi): """(ndof, nmodes) -> (nmodes, nnodes, 6)""" ndof, nmodes = phi.shape nnodes = ndof // 6 assert ndof % 6 == 0 phi2 = phi.T # nmodes, ndof data = phi2.reshape(nmodes, nnodes, 6) return data
[docs] def set_phi(self, phi): """(ndof, nmodes) -> (nmodes, nnodes, 6)""" self.data = self.phi_to_data(phi)
[docs] def write_f06(self, f06_file, header=None, page_stamp='PAGE %s', page_num: int=1, is_mag_phase: bool=False, is_sort1: bool=True): if header is None: header = [] #if self.nonlinear_factor not in (None, np.nan): #return self._write_f06_transient(header, page_stamp, page_num, f06_file, #is_mag_phase=is_mag_phase, is_sort1=is_sort1) # modes get added words = ' R E A L E I G E N V E C T O R N O . %10i\n \n' \ ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n' #if not len(header) >= 3: #header.append('') for itime in range(self.ntimes): node = self.node_gridtype[:, 0] gridtype = self.node_gridtype[:, 1] t1 = self.data[itime, :, 0] t2 = self.data[itime, :, 1] t3 = self.data[itime, :, 2] r1 = self.data[itime, :, 3] r2 = self.data[itime, :, 4] r3 = self.data[itime, :, 5] dt = self._times[itime] #if isinstance(dt, float): #header[1] = ' %s = %10.4E\n' % (self.data_code['name'], dt) #else: #header[1] = ' %s = %10i\n' % (self.data_code['name'], dt) f06_file.write(''.join(header + [words % dt])) for node_id, gridtypei, t1i, t2i, t3i, r1i, r2i, r3i in zip(node, gridtype, t1, t2, t3, r1, r2, r3): sgridtype = self.recast_gridtype_as_string(gridtypei) vals = [t1i, t2i, t3i, r1i, r2i, r3i] vals2 = write_floats_13e(vals) (dx, dy, dz, rx, ry, rz) = vals2 f06_file.write( '%14i %6s %-13s %-13s %-13s %-13s %-13s %s\n' % ( node_id, sgridtype, dx, dy, dz, rx, ry, rz)) f06_file.write(page_stamp % page_num) page_num += 1 return page_num - 1