Esempio n. 1
0
def get_spring_stress_strains(eids, cases, model: OP2, times, key, icase,
                              form_dict, header_dict, keys_map, is_stress):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    subcase_id = key[0]
    results = model
    if is_stress:
        springs = [
            results.celas1_stress, results.celas2_stress,
            results.celas3_stress, results.celas4_stress]
        word = 'Stress'
    else:
        springs = [
            results.celas1_strain, results.celas2_strain,
            results.celas3_strain, results.celas4_strain]
        word = 'Strain'

    spring_cases = []
    spring_ieids = []
    for result in springs:
        if key not in result:
            continue
        case = result[key]

        eidsi = case.element

        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (spring)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        spring_cases.append(case)
        spring_ieids.append(i)
    if not spring_ieids:
        return icase

    spring_ieids = np.hstack(spring_ieids)
    ieid_max = len(eids)

    case = spring_cases[0]
    case_headers = case.get_headers()
    if is_stress:
        method_map = {
            'spring_stress' : 'σxx',
        }
        data_format = '%.3f'
    else:
        method_map = {
            'spring_strain' : 'ϵxx',
        }
        data_format = '%.3e'
    methods = [method_map[headeri] for headeri in case_headers]

    #headersi = case.get_headers()
    #print('headersi =', headersi)

    scalars_array = []
    for case in spring_cases:
        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)
        scalars = case.data
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, spring_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Spring ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Spring')
    return icase
Esempio n. 2
0
def get_beam_stress_strains(eids, cases, model: OP2, times, key, icase,
                            form_dict, header_dict, keys_map, is_stress):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    #print("***stress eids=", eids)
    subcase_id = key[0]
    if is_stress:
        beams = [model.cbeam_stress]
        word = 'Stress'
    else:
        beams = [model.cbeam_strain]
        word = 'Strain'

    #titles = []
    beam_cases = []
    beam_ieids = []
    for result in beams:
        if key not in result:
            continue
        case = result[key]

        eidsi = np.unique(case.element_node[:, 0])
        print(eidsi)
        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (beam)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue

        i2 = np.hstack([i, i + 1]).T.flatten()
        print('i =', i)
        print('i2 =', i2)
        #aa
        #print('i =', i, i.max())
        #print('eids =', eids, len(eids))
        #print('eidsi =', eidsi, eids)
        #print(f'------------adding i={i} for {case.element_name}-----------')
        beam_cases.append(case)
        beam_ieids.append(i2)
    if not beam_ieids:
        return icase

    beam_ieids = np.hstack(beam_ieids)
    #inid_max = len(nids)
    ieid_max = len(eids)
    print('ieid_max =', ieid_max)

    case = beam_cases[0]
    case_headers = case.get_headers()
    #print(case_headers)
    if is_stress:
        #sigma = 'σ'
        method_map = {
            'sxc' : 'σxx C',
            'sxd' : 'σxx D',
            'sxe' : 'σxx E',
            'sxf' : 'σxx F',
            #'torsion' : 'τxy',
            'MS_tension' : 'MS_tension',
            'MS_compression' : 'MS_compression',
            'smax' : 'σmax',
            'smin' : 'σmin',
            #'von_mises' : 'σ von Mises',
        }
    else:
        #sigma = 'ϵ'
        method_map = {
            'sxc' : 'ϵxx C',
            'sxd' : 'ϵxx D',
            'sxe' : 'ϵxx E',
            'sxf' : 'ϵxx F',

            'exc' : 'ϵxx C',
            'exd' : 'ϵxx D',
            'exe' : 'ϵxx E',
            'exf' : 'ϵxx F',
            #'torsion' : 'τxy',
            'MS_tension' : 'MS_tension',
            'MS_compression' : 'MS_compression',
            'smax' : 'ϵmax',
            'smin' : 'ϵmin',
            #'von_mises' : 'ϵ von Mises',
        }
    methods = [method_map[headeri] for headeri in case_headers]
    return icase
    #if 'Mises' in methods:
        #methods.append('Max shear')
    #else:
        #methods.append(f'{sigma} von Mises')

    #if case.is_von_mises:
        #vm_word = 'vonMises'
    #else:
        #vm_word = 'maxShear'

    #headersi = case.get_headers()
    #print('headersi =', headersi)

    scalars_array = []
    for case in beam_cases:
        if case.is_complex:
            model.log.warning(f'skipping complex Beam {word}')
            continue

        #ntimes, nelements, nresults = case.data.shape
        #self.data[self.itime, self.itotal, :] = [fd, oxx, oyy,
        #                                         txy, angle,
        #                                         majorP, minorP, ovm]

        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)

        #nnodes_per_element = case.nnodes
        #nelements_nnodes = nnodes_nlayers // 2
        #nelements = nelements_nnodes // nnodes_per_element
        #nlayers = 2
        scalars = case.data
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    #titles = []  # legend title
    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, beam_ieids, ieid_max, scalars_array, methods,
        data_formats=None,
        colormap='jet', location='node', uname='Beam ' + word)

    times = case._times
    for itime, dt in enumerate(times):
        #dt = case._times[itime]
        header = _get_nastran_header(case, dt, itime)
        header_dict[(key, itime)] = header

        formi = []
        form = form_dict[(key, itime)]
        form.append(('Beam ' + word, None, formi))
        # formi = form[0][2]

        for imethod, method in enumerate(methods):
            #cases[icase] = (res, (subcase_id, header))
            cases[icase] = (res, (subcase_id, (itime, imethod, header)))
            formi.append((method, icase, []))
            icase += 1
    return icase
Esempio n. 3
0
def get_solid_stress_strains(eids, cases, model: OP2, times, key, icase,
                             form_dict, header_dict, keys_map, is_stress):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    #print("***stress eids=", eids)
    subcase_id = key[0]
    results = model
    if is_stress:
        solids = [
            results.ctetra_stress, results.cpenta_stress, results.chexa_stress, # results.cpyram_stress,
        ]
        word = 'Stress'
    else:
        solids = [
            results.ctetra_strain, results.cpenta_strain, results.chexa_strain, # results.cpyram_strain,
        ]
        word = 'Strain'

    #titles = []
    solid_cases = []
    solid_ieids = []
    for result in solids:
        if key not in result:
            continue
        case = result[key]

        #print(case)
        nnodes = case.nnodes_per_element
        all_eidsi = case.element_node[:, 0]
        nall_eidsi = len(all_eidsi)
        nelementsi = nall_eidsi // nnodes
        eidsi = all_eidsi.reshape(nelementsi, nnodes)[:, 0]

        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (solid)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        #print('i =', i, i.max())
        #print('eids =', eids, len(eids))
        #print('eidsi =', eidsi, eids)
        #print(f'------------adding i={i} for {case.element_name}-----------')
        solid_cases.append(case)
        solid_ieids.append(i)
    if not solid_ieids:
        return icase

    solid_ieids = np.hstack(solid_ieids)
    ieid_max = len(eids)
    #print('ieid_max =', ieid_max)

    case = solid_cases[0]
    case_headers = case.get_headers()
    if is_stress:
        #sigma = 'σ'
        method_map = {
            'oxx' : 'σxx',
            'oyy' : 'σyy',
            'ozz' : 'σzz',
            'txy' : 'τxy',
            'tyz' : 'τyz',
            'txz' : 'τxz',

            'omax' : 'σmax',
            'omin' : 'σmin',
            'omid' : 'σmid',
            'von_mises' : 'σ von Mises',
        }
        data_format = '%.3f'
    else:
        #sigma = 'ϵ'
        method_map = {
            'exx' : 'ϵxx',
            'eyy' : 'ϵyy',
            'ezz' : 'ϵzz',
            'exy' : 'ϵxy',
            'eyz' : 'ϵyz',
            'exz' : 'ϵxz',

            'emax' : 'ϵmax',
            'emin' : 'ϵmin',
            'emid' : 'ϵmid',
            'von_mises' : 'ϵ von Mises',
        }
        data_format = '%.3e'
    methods = [method_map[headeri] for headeri in case_headers]
    #if 'Mises' in methods:
        #methods.append('Max shear')
    #else:
        #methods.append(f'{sigma} von Mises')

    #if case.is_von_mises:
        #vm_word = 'vonMises'
    #else:
        #vm_word = 'maxShear'

    #headersi = case.get_headers()
    #print('headersi =', headersi)

    scalars_array = []
    for case in solid_cases:
        #if case.is_complex:
            #model.log.warning(f'skipping complex Rod {word}')
            #continue

        #ntimes, nelements, nresults = case.data.shape
        #self.data[self.itime, self.itotal, :] = [fd, oxx, oyy,
        #                                         txy, angle,
        #                                         majorP, minorP, ovm]

        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)

        #nnodes_per_element = case.nnodes
        #nelements_nnodes = nnodes_nlayers // 2
        #nelements = nelements_nnodes // nnodes_per_element
        #nlayers = 2
        nnodes = case.nnodes_per_element
        scalars = case.data
        #print('scalars.shape', scalars.shape)
        ntimes, nall, nresults = scalars.shape
        nelements = nall // nnodes
        scalars_save = scalars.reshape(ntimes, nelements, nnodes, nresults)
        scalars_array.append(scalars_save[:, :, 0, :])

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    #titles = []  # legend title
    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, solid_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Solid ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Solid')
    return icase
Esempio n. 4
0
def get_bar_stress_strains(eids, cases, model: OP2, times, key, icase,
                           form_dict, header_dict, keys_map, is_stress):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    #print("***stress eids=", eids)
    subcase_id = key[0]
    if is_stress:
        bars = [model.cbar_stress]
        word = 'Stress'
    else:
        bars = [model.cbar_strain]
        word = 'Strain'

    #titles = []
    bar_cases = []
    bar_ieids = []
    for result in bars:
        if key not in result:
            continue
        case = result[key]

        eidsi = case.element
        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (bar)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        #print('i =', i, i.max())
        #print('eids =', eids, len(eids))
        #print('eidsi =', eidsi, eids)
        #print(f'------------adding i={i} for {case.element_name}-----------')
        bar_cases.append(case)
        bar_ieids.append(i)
    if not bar_ieids:
        return icase

    bar_ieids = np.hstack(bar_ieids)
    ieid_max = len(eids)
    #print('ieid_max =', ieid_max)

    case = bar_cases[0]
    case_headers = case.get_headers()
    #print(case_headers)
    if is_stress:
        #sigma = 'σ'
        method_map = {
             's1a' : 'σxx 1A',
             's2a' : 'σxx 2A',
             's3a' : 'σxx 3A',
             's4a' : 'σxx 4A',

             's1b' : 'σxx 1B',
             's2b' : 'σxx 2B',
             's3b' : 'σxx 3B',
             's4b' : 'σxx 4B',

            'axial' : 'σxx',
            'MS_tension' : 'MS_tension',
            'MS_compression' : 'MS_compression',
            'smaxa' : 'σmax A',
            'smina' : 'σmin A',
            'smaxb' : 'σmax B',
            'sminb' : 'σmin B',
            #'von_mises' : 'σ von Mises',
        }
        data_format = '%.3f'
    else:
        #sigma = 'ϵ'
        method_map = {
            'e1a' : 'ϵxx 1A',
            'e2a' : 'ϵxx 2A',
            'e3a' : 'ϵxx 3A',
            'e4a' : 'ϵxx 4A',

            'e1b' : 'ϵxx 1B',
            'e2b' : 'ϵxx 2B',
            'e3b' : 'ϵxx 3B',
            'e4b' : 'ϵxx 4B',


            'e1c': 'ϵxx 1C',
            'e1d': 'ϵxx 1D',
            'e2c': 'ϵxx 2C',
            'e2d': 'ϵxx 2D',

           'axial' : 'ϵxx',
           'MS_tension' : 'MS_tension',
           'MS_compression' : 'MS_compression',
           'emaxa' : 'ϵmax A',
           'emina' : 'ϵmin A',
           'emaxb' : 'ϵmax B',
           'eminb' : 'ϵmin B',
            #'emax' : 'ϵmax',
            #'emin' : 'ϵmin',
            #'von_mises' : 'ϵ von Mises',
        }
        data_format = '%.3e'
    methods = [method_map[headeri] for headeri in case_headers]
    #if 'Mises' in methods:
        #methods.append('Max shear')
    #else:
        #methods.append(f'{sigma} von Mises')

    #if case.is_von_mises:
        #vm_word = 'vonMises'
    #else:
        #vm_word = 'maxShear'

    #headersi = case.get_headers()
    #print('headersi =', headersi)

    scalars_array = []
    for case in bar_cases:
        #ntimes, nelements, nresults = case.data.shape
        #self.data[self.itime, self.itotal, :] = [fd, oxx, oyy,
        #                                         txy, angle,
        #                                         majorP, minorP, ovm]

        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)

        #nnodes_per_element = case.nnodes
        #nelements_nnodes = nnodes_nlayers // 2
        #nelements = nelements_nnodes // nnodes_per_element
        #nlayers = 2
        scalars = case.data
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    exclude_tension_margin = False
    exclude_compression_margin = False
    if 'MS_tension' in methods:
        # real
        itension = methods.index('MS_tension')
        icompression = methods.index('MS_compression')
        exclude_tension_margin = np.allclose(np.abs(scalars_array[:, :, itension]).max(), 0.0)
        exclude_compression_margin = np.allclose(np.abs(scalars_array[:, :, icompression]).max(), 0.0)
        iresults = list(range(len(methods)))
        if exclude_compression_margin:
            methods.pop(icompression)
            iresults.pop(icompression)
        if exclude_tension_margin:
            methods.pop(itension)
            iresults.pop(itension)

    if exclude_compression_margin or exclude_compression_margin:
        scalars_array = scalars_array[:, :, iresults]

    #titles = []  # legend title
    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, bar_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Bar ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Bar')
    return icase
Esempio n. 5
0
def get_rod_stress_strains(eids, cases, model: OP2, times, key, icase,
                           form_dict, header_dict, keys_map, is_stress):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    subcase_id = key[0]
    if is_stress:
        rods = [
            model.crod_stress, model.conrod_stress, model.ctube_stress,
        ]
        word = 'Stress'
    else:
        rods = [
            model.crod_strain, model.conrod_strain, model.ctube_strain,
        ]
        word = 'Strain'

    #titles = []
    rod_cases = []
    rod_ieids = []
    for result in rods:
        if key not in result:
            continue
        case = result[key]

        eidsi = case.element
        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (rod)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        #print('i =', i, i.max())
        #print('eids =', eids, len(eids))
        #print('eidsi =', eidsi, eids)
        #print(f'------------adding i={i} for {case.element_name}-----------')
        rod_cases.append(case)
        rod_ieids.append(i)
    if not rod_ieids:
        return icase

    rod_ieids = np.hstack(rod_ieids)
    ieid_max = len(eids)
    #print('ieid_max =', ieid_max)

    case = rod_cases[0]
    case_headers = case.get_headers()
    #print(case_headers)
    if is_stress:
        #sigma = 'σ'
        method_map = {
            'axial' : 'σxx',
            'torsion' : 'τxy',
            'SMa' : 'MS_axial',
            'SMt' : 'MS_torsion',
            #'omax' : 'σmax',
            #'omin' : 'σmin',
            #'von_mises' : 'σ von Mises',
        }
        data_format = '%.3f'
    else:
        #sigma = 'ϵ'
        method_map = {
            'axial' : 'ϵxx',
            'torsion' : 'ϵxy',
            'SMa' : 'MS_axial',
            'SMt' : 'MS_torsion',
            #'emax' : 'ϵmax',
            #'emin' : 'ϵmin',
            #'von_mises' : 'ϵ von Mises',
        }
        data_format = '%.3e'
    methods = [method_map[headeri] for headeri in case_headers]
    #if 'Mises' in methods:
        #methods.append('Max shear')
    #else:
        #methods.append(f'{sigma} von Mises')

    #if case.is_von_mises:
        #vm_word = 'vonMises'
    #else:
        #vm_word = 'maxShear'

    scalars_array = []
    for case in rod_cases:
        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)
        scalars = case.data
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, rod_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Rod ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Rod')
    return icase
Esempio n. 6
0
    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    #titles = []  # legend title
    headers = []  # sidebar word
    assert scalars_array.shape[2] == len(
        methods
    ), f'shape={scalars_array.shape}; methods={methods} n={len(methods)}'
    res = SimpleTableResults(subcase_id,
                             headers,
                             solid_ieids,
                             ieid_max,
                             scalars_array,
                             methods,
                             data_format=data_format,
                             colormap='jet',
                             uname='Solid ' + word)
    icase = add_simple_methods_to_form(icase,
                                       cases,
                                       key,
                                       subcase_id,
                                       word,
                                       res,
                                       case,
                                       form_dict,
                                       header_dict,
                                       methods,
                                       name='Solid')
Esempio n. 7
0
def get_bar_force(eids, cases, model: OP2, times, key, icase,
                  form_dict, header_dict, keys_map):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    #print("***stress eids=", eids)
    subcase_id = key[0]
    bars = [model.cbar_force]

    #titles = []
    bar_cases = []
    bar_ieids = []
    for result in bars:
        if key not in result:
            continue
        case = result[key]

        eidsi = case.element
        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (bar)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        #print('i =', i, i.max())
        #print('eids =', eids, len(eids))
        #print('eidsi =', eidsi, eids)
        #print(f'------------adding i={i} for {case.element_name}-----------')
        bar_cases.append(case)
        bar_ieids.append(i)
    if not bar_ieids:
        return icase

    bar_ieids = np.hstack(bar_ieids)
    ieid_max = len(eids)
    #print('ieid_max =', ieid_max)

    case = bar_cases[0]
    case_headers = case.get_headers()
    #print(case_headers)

    word = 'Force'
    method_map = {
        # real
        'bending_moment_a1' : 'My Bending 1',
        'bending_moment_a2' : 'My Bending 2',
        'bending_moment_b1' : 'Mz Bending 1',
        'bending_moment_b2' : 'Mz Bending 2',

        # complex
        'bending_moment_1a' : 'My Bending 1',
        'bending_moment_2a' : 'My Bending 2',
        'bending_moment_1b' : 'Mz Bending 1',
        'bending_moment_2b' : 'Mz Bending 2',
        'shear1' : 'Fy Shear',
        'shear2' : 'Fz Shear',
        'axial' : 'Fx',
        'torque' : 'Torque',
    }
    data_format = '%.3f'
    methods = [method_map[headeri] for headeri in case_headers]

    scalars_array = []
    for case in bar_cases:
        #if case.is_complex:
            #model.log.warning(f'skipping complex Bar {word}')
            #continue

        #ntimes, nelements, nresults = case.data.shape
        #self.data[self.itime, self.itotal, :] = [fd, oxx, oyy,
        #                                         txy, angle,
        #                                         majorP, minorP, ovm]

        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)

        #nnodes_per_element = case.nnodes
        #nelements_nnodes = nnodes_nlayers // 2
        #nelements = nelements_nnodes // nnodes_per_element
        #nlayers = 2
        scalars = case.data
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    #include_tension_margin = True
    #include_compression_margin = True

    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, bar_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Bar ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Bar')
    return icase
Esempio n. 8
0
def get_plate_force(eids, cases, model: OP2, times, key, icase,
                    form_dict, header_dict, keys_map):
    """
    helper method for _fill_op2_time_centroidal_stress.
    """
    #print("***stress eids=", eids)
    subcase_id = key[0]
    plates = [
        model.ctria3_force, model.ctria6_force, model.ctriar_force,
        model.cquad4_force, model.cquad8_force, model.cquadr_force,
    ]

    plate_cases = []
    plate_ieids = []
    for result in plates:
        if key not in result:
            continue
        case = result[key]

        nnodes = case.nnodes_per_element
        if nnodes > 1:
            # element_node.shape = (20, 2)
            # element type: QUAD144
            #RealPlateBilinearForceArray
            # 8=[mx, my, mxy, bmx, bmy, bmxy, tx, ty]

            all_eids = case.element_node[:, 0]
            nids = case.element_node[:, 1]
            if nids[-1] != 0:
                eidsi = all_eids[::nnodes]
                #print(nids[::nnodes])
                #print('nnodes =', nnodes)
        else:
            eidsi = case.element

        #print(case)
        #print(eids)
        #print(eidsi)
        i = np.searchsorted(eids, eidsi)
        if len(i) != len(np.unique(i)):
            #print(case.element_node)
            #print('element_name=%s nnodes_per_element=%s' % (case.element_name, nnodes_per_element))
            #print('iplate = %s' % i)
            #print('  eids = %s' % eids)
            #print('  eidsiA = %s' % case.element_node[:, 0])
            #print('  eidsiB = %s' % eidsi)
            msg = 'i%s (plate)=%s is not unique' % (case.element_name, str(i))
            #msg = 'iplate=%s is not unique' % str(i)
            model.log.warning(msg)
            continue
        if i.max() == len(eids):
            model.log.error('skipping because lookup is out of range...')
            continue
        #model.log.info('saving i%s (plate)' % (case.element_name))
        #print(f'------------adding i={i} for {case.element_name}-----------')
        plate_cases.append(case)
        plate_ieids.append(i)
    if not plate_ieids:
        return icase

    plate_ieids = np.hstack(plate_ieids)
    ieid_max = len(eids)
    #print('ieid_max =', ieid_max)

    case = plate_cases[0]
    case_headers = case.get_headers()
    #print(case_headers)

    word = 'Force'
    method_map = {
        # real
        'mx': 'Fx',
        'my': 'Fy',
        'mxy': 'Fxy',
        'bmx': 'Mx',
        'bmy': 'My',
        'bmxy': 'Mxy',
        'tx': 'Vx',
        'ty': 'Vy',

        # complex
        #'bending_moment_1a' : 'M bending 1A',
        #'bending_moment_2a' : 'M bending 2A',
        #'bending_moment_1b' : 'M bending 1B',
        #'bending_moment_2b' : 'M bending 2B',
        #'shear1' : 'F shear 1',
        #'shear2' : 'F shear 2',
        #'axial' : 'F axial',
        #'torque' : 'torque',
        #'s1a' : 'σxx 1A',
        #'e1a' : 'ϵxx 1A',
    }
    data_format = '%.3f'
    methods = [method_map[headeri] for headeri in case_headers]

    scalars_array = []
    for case in plate_cases:
        keys_map[key] = (case.subtitle, case.label,
                         case.superelement_adaptivity_index, case.pval_step)

        nnodes = case.nnodes_per_element
        if nnodes == 1:
            scalars = case.data
        else:
            scalars = case.data[:, ::nnodes, :]
        scalars_array.append(scalars)

    if len(scalars_array) == 0:
        return icase

    scalars_array = concatenate_scalars(scalars_array)

    headers = [] # sidebar word
    res = SimpleTableResults(
        subcase_id, headers, plate_ieids, ieid_max, scalars_array, methods,
        data_format=data_format,
        colormap='jet', uname='Plate ' + word)

    icase = add_simple_methods_to_form(icase, cases, key, subcase_id, word, res, case,
                                       form_dict, header_dict, methods,
                                       name='Plate')
    return icase