from struct import unpack
from pyNastran.op2.op2_common import OP2Common
from pyNastran.op2.tables.oqg_constraintForces.oqg_spcForces import (
RealSPCForcesArray, ComplexSPCForcesArray,
RealSPCForces, ComplexSPCForces)
from pyNastran.op2.tables.oqg_constraintForces.oqg_mpcForces import (
RealMPCForcesArray, ComplexMPCForcesArray,
RealMPCForces, ComplexMPCForces)
from pyNastran.op2.tables.oqg_constraintForces.oqg_thermalGradientAndFlux import (
RealTemperatureGradientAndFlux, RealTemperatureGradientAndFluxArray)
[docs]class OQG(OP2Common):
def __init__(self):
OP2Common.__init__(self)
def _read_oqg1_3(self, data):
three = self.parse_approach_code(data)
self.words = [
'analysis_code', 'table_code', '???', 'isubcase',
'???', '???', '???', 'random_code'
'format_code', 'num_wide', '11', '???',
'acoustic_flag','???', '???', '???',
'???', '???', '???', '???',
'???', '???', 'thermal', '???',
'???', 'Title', 'subtitle', 'label']
## random code
self.random_code = self.add_data_parameter( data, 'random_code', 'i', 8, False)
## format code
self.format_code = self.add_data_parameter( data, 'format_code', 'i', 9, False)
## number of words per entry in record
self.num_wide = self.add_data_parameter(data, 'num_wide', 'i', 10, False)
## acoustic pressure flag
self.acoustic_flag = self.add_data_parameter(data, 'acoustic_flag', 'f', 13, False)
## thermal flag; 1 for heat ransfer, 0 otherwise
self.thermal = self.add_data_parameter(data, 'thermal', 'i', 23, False)
if not self.is_sort1():
raise NotImplementedError('sort2...')
#assert self.isThermal()==False,self.thermal
#self.print_block(data) # on
## assuming tCode=1
if self.analysis_code == 1: # statics / displacement / heat flux
## load set number
self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5, False)
self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn'])
self.setNullNonlinearFactor()
elif self.analysis_code == 2: # real eigenvalues
## mode number
self.mode = self.add_data_parameter(data, 'mode', 'i', 5)
## real eigenvalue
self.eigr = self.add_data_parameter(data, 'eigr', 'f', 6, False)
## mode or cycle .. todo:: confused on the type - F1???
self.mode_cycle = self.add_data_parameter(data, 'mode_cycle', 'f', 7, False)
self.dataNames = self.apply_data_code_value('dataNames', ['mode', 'eigr', 'mode_cycle'])
#elif self.analysis_code==3: # differential stiffness
#self.lsdvmn = self.get_values(data,'i',5) ## load set number
#self.dataNames = self.data_code['lsdvmn'] = self.lsdvmn
#elif self.analysis_code==4: # differential stiffness
#self.lsdvmn = self.get_values(data,'i',5) ## load set number
elif self.analysis_code == 5: # frequency
## frequency
self.freq = self.add_data_parameter(data, 'freq', 'f', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['freq'])
elif self.analysis_code == 6: # transient
## time step
self.dt = self.add_data_parameter(data, 'dt', 'f', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['dt'])
elif self.analysis_code == 7: # pre-buckling
## load set number
self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn'])
elif self.analysis_code == 8: # post-buckling
## load set number
self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5)
## real eigenvalue
self.eigr = self.add_data_parameter(data, 'eigr', 'f', 6, False)
self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn', 'eigr'])
elif self.analysis_code == 9: # complex eigenvalues
## mode number
self.mode = self.add_data_parameter(data, 'mode', 'i', 5)
## real eigenvalue
self.eigr = self.add_data_parameter(data, 'eigr', 'f', 6, False)
## imaginary eigenvalue
self.eigi = self.add_data_parameter(data, 'eigi', 'f', 7, False)
self.dataNames = self.apply_data_code_value('dataNames', ['mode', 'eigr', 'eigi'])
elif self.analysis_code == 10: # nonlinear statics
## load step
self.lftsfq = self.add_data_parameter(data, 'lftsfq', 'f', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['lftsfq'])
elif self.analysis_code == 11: # old geometric nonlinear statics
## load set number
self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn'])
elif self.analysis_code == 12: # contran ? (may appear as aCode=6) --> straight from DMAP...grrr...
## load set number
self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5)
self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn'])
else:
msg = 'invalid analysis_code...analysis_code=%s' % (self.analysis_code)
raise RuntimeError(msg)
#print self.code_information()
if self.debug:
self.binary_debug.write(' approach_code = %r\n' % self.approach_code)
self.binary_debug.write(' tCode = %r\n' % self.tCode)
self.binary_debug.write(' isubcase = %r\n' % self.isubcase)
self._read_title(data)
self._write_debug_bits()
def _read_oqg1_4(self, data):
result_name = 'constraint_forces'
if self._results.is_not_saved(result_name):
return len(data)
if self.table_code == 3: # SPC Forces
assert self.table_name in [b'OQG1', b'OQGV1', b'OQP1'], 'table_name=%s table_code=%s' % (self.table_name, self.table_code)
n = self._read_spc_forces(data)
elif self.table_code == 39: # MPC Forces
assert self.table_name in [b'OQMG1'], 'table_name=%s table_code=%s' % (self.table_name, self.table_code)
n = self._read_mpc_forces(data)
else:
msg = 'table_code=%s' % self.table_code
return self._not_implemented_or_skip(data, msg)
#else:
#self._not_implemented_or_skip('bad OQG table')
return n
def _read_spc_forces(self, data):
"""
table_code = 3
"""
if self.thermal == 0:
result_name = 'spc_forces'
storage_obj = self.spc_forces
if self._results.is_not_saved(result_name):
return len(data)
self._results._found_result(result_name)
n = self._read_table(data, result_name, storage_obj,
RealSPCForces, ComplexSPCForces,
RealSPCForcesArray, ComplexSPCForcesArray, 'node', random_code=self.random_code)
elif self.thermal == 1:
result_name = 'thermal_gradient_and_flux' #'finite element temperature gradients and fluxes'
storage_obj = self.thermal_gradient_and_flux
if self._results.is_not_saved(result_name):
return len(data)
self._results._found_result(result_name)
n = self._read_table(data, result_name, storage_obj,
RealTemperatureGradientAndFlux, None,
RealTemperatureGradientAndFluxArray, None, 'node', random_code=self.random_code)
else:
msg = 'thermal=%s' % self.thermal
return self._not_implemented_or_skip(data, msg)
return n
def _read_mpc_forces(self, data):
"""
table_code = 39
"""
result_name = 'mpc_forces'
storage_obj = self.mpc_forces
if self.thermal == 0:
if self._results.is_not_saved(result_name):
return len(data)
self._results._found_result(result_name)
n = self._read_table(data, result_name, storage_obj,
RealMPCForces, ComplexMPCForces,
RealMPCForcesArray, ComplexMPCForcesArray, 'node', random_code=self.random_code)
#elif self.thermal == 1:
#raise NotImplementedError(self.thermal)
#n = self._read_table(data, result_name, storage_obj,
#None, None,
#None, None, 'node')
else:
msg = 'thermal=%s' % self.thermal
return self._not_implemented_or_skip(data, msg)
return n