Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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