def _get_op2_stats_full(model: OP2, table_types: List[str], log): """helper for get_op2_stats(...)""" msg = [] for table_type in table_types: table = model.get_result(table_type) if table_type == 'params': msg.extend(_write_params(model.params)) continue elif table_type in ['gpdt', 'bgpdt', 'eqexin']: obj = model.get_result(table_type) if obj is None: continue elif isinstance(obj, dict): print(obj) stats = obj.get_stats(short=False) msg.extend(f'op2_results.{table_type}: ' + stats) # TODO: a hack...not quite right... continue table_type_print = 'op2_results.' + table_type if '.' in table_type else table_type try: for isubcase, subcase in sorted(table.items(), key=_compare): class_name = subcase.__class__.__name__ if hasattr(subcase, 'get_stats'): try: stats = subcase.get_stats() # short=short except: msgi = 'errored reading %s %s[%s]\n\n' % ( class_name, table_type_print, isubcase) msg.append(msgi) raise else: msg.append('%s[%s]\n' % (table_type_print, isubcase)) msg.extend(stats) msg.append('\n') else: msgi = 'skipping %s %s[%s]\n\n' % ( class_name, table_type_print, isubcase) msg.append(msgi) raise RuntimeError(msgi) except: log.warning('type(table)=%s' % type(table)) log.warning(table) raise return msg
def _get_op2_stats_short(model: OP2, table_types: List[str], log) -> List[str]: """helper for get_op2_stats(...)""" msg = [] no_data_classes = [ 'RealEigenvalues', 'ComplexEigenvalues', 'BucklingEigenvalues' ] for table_type in table_types: #table_type_print = '' if table_type in ['params']: msg.extend(_write_params(model.params)) continue elif table_type in ['gpdt', 'bgpdt', 'eqexin']: obj = model.get_result(table_type) if obj is None: continue stats = obj.get_stats(short=True) msg.extend(f'op2_results.{table_type}: ' + stats) # TODO: a hack...not quite right... continue table_type_print = 'op2_results.' + table_type if '.' in table_type else table_type table = model.get_result(table_type) for isubcase, subcase in sorted(table.items(), key=_compare): class_name = subcase.__class__.__name__ if class_name in no_data_classes: msg.append('%s[%r]\n' % (table_type_print, isubcase)) elif hasattr(subcase, 'data'): #data = subcase.data #shape = [int(i) for i in subcase.data.shape] #headers = subcase.get_headers() #headers_str = str(', '.join(headers)) #msg.append('%s[%s]; %s; %s; [%s]\n' % ( #table_type, isubcase, class_name, shape, headers_str)) msg.append('%s[%s]\n' % (table_type_print, isubcase)) elif table_type == 'params': # TODO: remove msgi = str(subcase) elif hasattr(subcase, 'get_stats'): msgi = '%s[%s] # unvectorized\n' % (table_type_print, isubcase) msg.append(msgi) else: msgi = 'skipping %r %s[%s]\n' % (class_name, table_type_print, isubcase) msg.append(msgi) #raise RuntimeError(msgi) return msg
def _write_result_tables(obj: OP2, fop2, fop2_ascii, struct_3i, endian, skips: Set[str]): """writes the op2 result tables""" date = obj.date res_categories2 = defaultdict(list) table_order = [ 'OUGV1', 'OPHIG', 'BOUGV1', 'BOPHIG', 'BOPHIGF', 'OUPV1', 'OUXY1', 'OUXY2', 'OPHSA', 'OUGF1', 'BOUGF1', 'TOUGV1', 'OTEMP1', 'OUG1', 'OUGV1PAT', 'BOPG1', 'OPHIG', 'OQG1', 'OQGV1', 'OQP1', 'OQMG1', 'OQGCF1', 'OQGGF1', 'OPGV1', 'OPG1', 'OPNL1', # --------------- # random displacement-style tables 'OUGATO1', 'OUGCRM1', 'OUGNO1', 'OUGPSD1', 'OUGRMS1', # disp/vel/acc/eigenvector 'OUGATO2', 'OUGCRM2', 'OUGNO2', 'OUGPSD2', 'OUGRMS2', 'OVGATO1', 'OVGCRM1', 'OVGNO1', 'OVGPSD1', 'OVGRMS1', # velocity 'OVGATO2', 'OVGCRM2', 'OVGNO2', 'OVGPSD2', 'OVGRMS2', 'OAGATO1', 'OAGCRM1', 'OAGNO1', 'OAGPSD1', 'OAGRMS1', # acceleration 'OAGATO2', 'OAGCRM2', 'OAGNO2', 'OAGPSD2', 'OAGRMS2', 'OQGATO1', 'OQGCRM1', 'OQGNO1', 'OQGPSD1', 'OQGRMS1', # spc/mpc forces 'OQGATO2', 'OQGCRM2', 'OQGNO2', 'OQGPSD2', 'OQGRMS2', 'OQMATO1', 'OQMCRM1', 'OQMNO1', 'OQMPSD1', 'OQMRMS1', # mpc forces 'OQMATO2', 'OQMCRM2', 'OQMNO2', 'OQMPSD2', 'OQMRMS2', 'OPGATO1', 'OPGCRM1', 'OPGNO1', 'OPGPSD1', 'OPGRMS1', # load vector 'OPGATO2', 'OPGCRM2', 'OPGNO2', 'OPGPSD2', 'OPGRMS2', 'RADCONS', 'RADEATC', 'RADEFFM', # --------------- # force/heat flux 'DOEF1', 'HOEF1', 'OEF1', 'OEF1X', 'OEF2', 'OEFATO1', 'OEFCRM1', 'OEFNO1', 'OEFPSD1', 'OEFRMS1', 'OEFATO2', 'OEFCRM2', 'OEFNO2', 'OEFPSD2', 'OEFRMS2', # --------------- # stress 'OESNLXD', 'OESNLXR', 'OESNL1X', 'OES1', 'OES1X', 'OES1X1', 'OES1C', 'OESVM1', 'OES2', 'OESVM2', 'OESCP', 'OESNL1', 'OCRPG', 'OCRUG', 'OESATO1', 'OESCRM1', 'OESNO1', 'OESPSD1', 'OESRMS1', 'OESXNO1', 'OESXRMS1', 'OESATO2', 'OESCRM2', 'OESNO2', 'OESPSD2', 'OESRMS2', # --------------- #strain 'OSTR1', 'OSTR1X', 'OSTR1C', 'OSTRVM1', 'OSTR2', 'OESTRCP', 'OSTRATO1', 'OSTRCRM1', 'OSTRNO1', 'OSTRPSD1', 'OSTRRMS1', 'OSTRATO2', 'OSTRCRM2', 'OSTRNO2', 'OSTRPSD2', 'OSTRRMS2', 'OSTRVM2', # --------------- 'OGPFB1', 'ONRGY', 'ONRGY1', 'OGS1', 'OEFIT', ] skip_results = ['gpdt', 'bgpdt', 'eqexin', 'psds', 'monitor1', 'monitor3'] for table_type in obj.get_table_types(): if table_type in skip_results or table_type in skips or table_type.startswith( 'responses.'): continue res_dict = obj.get_result(table_type) if not isinstance(res_dict, dict): raise TypeError(table_type) for unused_key, res in res_dict.items(): if hasattr(res, 'table_name_str'): # params #print(table_type) res_categories2[res.table_name_str].append(res) for table_name, results in sorted(res_categories2.items()): assert table_name in table_order, table_name total_case_count = 0 pretables = [ 'LAMA', 'BLAMA', ] # 'CLAMA' if 'eigenvalues' not in skips: for unused_title, eigenvalue in obj.eigenvalues.items(): res_categories2[eigenvalue.table_name].append(eigenvalue) if 'eigenvalues_fluid' not in skips: for unused_title, eigenvalue in obj.eigenvalues_fluid.items(): res_categories2[eigenvalue.table_name].append(eigenvalue) for table_name in pretables + table_order: if table_name not in res_categories2: continue results = res_categories2[table_name] itable = -1 case_count = 0 for result in results: element_name = '' new_result = True if hasattr(result, 'element_name'): element_name = ' - ' + result.element_name #print(element_name) if hasattr(result, 'write_op2'): fop2_ascii.write('-' * 60 + '\n') #if hasattr(result, 'is_bilinear') and result.is_bilinear(): #obj.log.warning(" *op2 - %s (%s) not written" % ( #result.__class__.__name__, result.element_name)) #continue isubcase = '' if hasattr(result, 'isubcase'): # no for eigenvalues isubcase = result.isubcase try: #print(' %-6s - %s - isubcase=%s%s; itable=%s %s' % ( #table_name, result.__class__.__name__, #isubcase, element_name, itable, new_result)) itable = result.write_op2(fop2, fop2_ascii, itable, new_result, date, is_mag_phase=False, endian=endian) except: print( f' {result.__class__.__name__} - isubcase={isubcase}{element_name}' ) raise elif hasattr(result, 'element_name'): if result.element_name in ['CBAR', 'CBEND']: obj.log.warning('skipping:\n%s' % result) continue else: raise NotImplementedError( f' *op2 - {result.__class__.__name__} not written') obj.log.warning( f' *op2 - {result.__class__.__name__} not written') #continue case_count += 1 header = [ 4, itable, 4, 4, 1, 4, 4, 0, 4, ] #print('writing itable=%s' % itable) assert itable is not None, '%s itable is None' % result.__class__.__name__ fop2.write(pack(b'9i', *header)) fop2_ascii.write('footer2 = %s\n' % header) new_result = False #assert case_count > 0, case_count if case_count: #print(result.table_name, itable) #print('res_category_name=%s case_count=%s' % (res_category_name, case_count)) # close off the result footer = [4, 0, 4] fop2.write(struct_3i.pack(*footer)) fop2_ascii.write('close_a = %s\n' % footer) fop2_ascii.write('---------------\n') total_case_count += case_count total_case_count += case_count #if total_case_count == 0: #raise FatalError('total_case_count = 0') # close off the op2 footer = [4, 0, 4] fop2.write(struct_3i.pack(*footer)) fop2_ascii.write('close_b = %s\n' % footer) fop2.close() fop2_ascii.close() return total_case_count