Example #1
0
def _recover_strain_bar(f06_file,
                        op2,
                        model: BDF,
                        dof_map,
                        isubcase,
                        xb,
                        eids_str,
                        element_name,
                        fdtype='float32',
                        title: str = '',
                        subtitle: str = '',
                        label: str = '',
                        page_num: int = 1,
                        page_stamp='PAGE %s') -> None:
    """recovers static rod strain"""
    neids, irod, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids
    strains = np.full((neids, 15), np.nan, dtype=fdtype)

    if element_name == 'CBAR':
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            #[s1a, s2a, s3a, s4a, axial, smaxa, smina, MS_tension,
            # s1b, s2b, s3b, s4b,        sminb, sminb, MS_compression] - 15
            strains[ieid, :] = _recover_straini_cbar(model, xb, dof_map, elem,
                                                     elem.pid_ref)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    data = strains.reshape(1, *strains.shape)
    table_name = 'OSTR1'

    strain_obj = RealBarStrainArray.add_static_case(table_name,
                                                    element_name,
                                                    eids,
                                                    data,
                                                    isubcase,
                                                    is_stress=False,
                                                    is_sort1=True,
                                                    is_random=False,
                                                    is_msc=True,
                                                    random_code=0,
                                                    title=title,
                                                    subtitle=subtitle,
                                                    label=label)

    if element_name == 'CBAR':
        op2.cbar_strain[isubcase] = strain_obj
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    strain_obj.write_f06(f06_file,
                         header=None,
                         page_stamp=page_stamp,
                         page_num=page_num,
                         is_mag_phase=False,
                         is_sort1=True)
    return neids
Example #2
0
def _recover_stress_celas(f06_file,
                          op2,
                          model: BDF,
                          dof_map,
                          isubcase,
                          xg,
                          eids_str,
                          element_name: str,
                          fdtype='float32',
                          title: str = '',
                          subtitle: str = '',
                          label: str = '',
                          page_num: int = 1,
                          page_stamp='PAGE %s') -> None:
    """recovers static spring stress"""
    neids, ielas, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids

    write_f06_stress = True
    stress = np.full((neids, 1), np.nan, dtype=fdtype)
    if element_name == 'CELAS1':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            pid_ref = elem.pid_ref
            ki = pid_ref.K()
            si = pid_ref.s
            stress[ieid] = _recover_stressi_celas12(xg, dof_map, elem, ki, si)
    elif element_name == 'CELAS2':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            si = elem.s
            stress[ieid] = _recover_stressi_celas12(xg, dof_map, elem, ki, si)
    elif element_name == 'CELAS3':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            pid_ref = elem.pid_ref
            ki = pid_ref.K()
            si = pid_ref.s
            stress[ieid] = _recover_stressi_celas34(xg, dof_map, elem, ki, si)
    elif element_name == 'CELAS4':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            si = 1.0  # TODO: is this right?
            #si = elem.s
            stress[ieid] = _recover_stressi_celas34(xg, dof_map, elem, ki, si)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    _save_spring_stress(op2, f06_file, page_num, page_stamp, element_name,
                        stress, eids, write_f06_stress, isubcase, title,
                        subtitle, label)
    return neids
Example #3
0
def _recover_force_celas(f06_file,
                         op2,
                         model: BDF,
                         dof_map,
                         isubcase,
                         xg,
                         eids_str,
                         element_name: str,
                         fdtype='float32',
                         title: str = '',
                         subtitle: str = '',
                         label: str = '',
                         page_num: int = 1,
                         page_stamp='PAGE %s') -> None:
    """recovers static spring force"""
    neids, ielas, eids, forces = get_ieids_eids(model,
                                                element_name,
                                                eids_str,
                                                fdtype=fdtype)
    if not neids:
        return neids
    for ieid, eid in zip(ielas, eids):
        elem = model.elements[eid]
        ki = elem.K()
        force = _recover_forcei_celas12(xg, dof_map, elem, ki)
        forces[ieid] = force

    data = forces.reshape(1, *forces.shape)
    table_name = 'OEF1'
    spring_force = RealSpringForceArray.add_static_case(table_name,
                                                        element_name,
                                                        eids,
                                                        data,
                                                        isubcase,
                                                        is_sort1=True,
                                                        is_random=False,
                                                        is_msc=True,
                                                        random_code=0,
                                                        title=title,
                                                        subtitle=subtitle,
                                                        label=label)
    if element_name == 'CELAS1':
        op2.celas1_force[isubcase] = spring_force
    elif element_name == 'CELAS2':
        op2.celas2_force[isubcase] = spring_force
    else:  # pragma: no cover
        raise NotImplementedError(element_name)
    spring_force.write_f06(f06_file,
                           header=None,
                           page_stamp=page_stamp,
                           page_num=page_num,
                           is_mag_phase=False,
                           is_sort1=True)
    return neids
Example #4
0
def _recover_force_cbar(f06_file,
                        op2,
                        model: BDF,
                        dof_map,
                        isubcase,
                        xb,
                        eids_str,
                        element_name,
                        fdtype='float32',
                        title: str = '',
                        subtitle: str = '',
                        label: str = '',
                        page_num: int = 1,
                        page_stamp='PAGE %s') -> None:
    """
    Recovers static CBAR force.

    .. todo:: doesn't support CBAR-100

    """
    neids, irod, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids
    forces = np.full((neids, 8), np.nan, dtype=fdtype)

    for ieid, eid in zip(irod, eids):
        elem = model.elements[eid]
        forces[ieid, :] = _recover_forcei_cbar(model, xb, dof_map, elem,
                                               elem.pid_ref)

    data = forces.reshape(1, *forces.shape)
    table_name = 'OEF1'
    force_obj = RealCBarForceArray.add_static_case(table_name,
                                                   eids,
                                                   data,
                                                   isubcase,
                                                   is_sort1=True,
                                                   is_random=False,
                                                   is_msc=True,
                                                   random_code=0,
                                                   title=title,
                                                   subtitle=subtitle,
                                                   label=label)

    op2.cbar_force[isubcase] = force_obj

    force_obj.write_f06(f06_file,
                        header=None,
                        page_stamp=page_stamp,
                        page_num=page_num,
                        is_mag_phase=False,
                        is_sort1=True)
    return neids
Example #5
0
def _recover_strain_energy_celas(f06_file,
                                 op2,
                                 model: BDF,
                                 dof_map,
                                 isubcase,
                                 xg,
                                 eids_str,
                                 element_name: str,
                                 fdtype='float32',
                                 title: str = '',
                                 subtitle: str = '',
                                 label: str = '',
                                 page_num: int = 1,
                                 page_stamp='PAGE %s') -> None:
    """recovers static spring strain energy"""
    neids, ielas, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids

    write_f06_ese = True
    strain_energies = np.full((neids, 1), np.nan, dtype=fdtype)
    if element_name in {'CELAS1', 'CELAS2'}:
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            strain_energies[ieid] = _recover_strain_energyi_celas12(
                xg, dof_map, elem, ki)
    elif element_name in {'CELAS3', 'CELAS4'}:
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            strain_energies[ieid] = _recover_strain_energyi_celas34(
                xg, dof_map, elem, ki)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    _save_spring_strain_energy(op2, f06_file, page_num, page_stamp,
                               element_name, strain_energies, eids,
                               write_f06_ese, isubcase, title, subtitle, label)
    return neids
Example #6
0
def _recover_stress_rod(f06_file,
                        op2,
                        model: BDF,
                        dof_map,
                        isubcase,
                        xb,
                        eids_str,
                        element_name,
                        fdtype='float32',
                        title: str = '',
                        subtitle: str = '',
                        label: str = '',
                        page_num: int = 1,
                        page_stamp='PAGE %s') -> None:
    """recovers static rod stress"""
    neids, irod, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids
    stresses = np.full((neids, 4), np.nan, dtype=fdtype)
    if element_name == 'CONROD':
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            stresses[ieid, :] = _recover_stressi_rod(xb, dof_map, elem, elem)
    elif element_name == 'CROD':
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            stresses[ieid, :] = _recover_stressi_rod(xb, dof_map, elem,
                                                     elem.pid_ref)
    elif element_name == 'CTUBE':
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            stresses[ieid, :] = _recover_stressi_ctube(xb, dof_map, elem,
                                                       elem.pid_ref)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    data = stresses.reshape(1, *stresses.shape)
    table_name = 'OSTR1'
    stress_obj = RealRodStressArray.add_static_case(table_name,
                                                    element_name,
                                                    eids,
                                                    data,
                                                    isubcase,
                                                    is_stress=True,
                                                    is_sort1=True,
                                                    is_random=False,
                                                    is_msc=True,
                                                    random_code=0,
                                                    title=title,
                                                    subtitle=subtitle,
                                                    label=label)

    if element_name == 'CONROD':
        op2.conrod_stress[isubcase] = stress_obj
    elif element_name == 'CROD':
        op2.crod_stress[isubcase] = stress_obj
    elif element_name == 'CTUBE':
        op2.ctube_stress[isubcase] = stress_obj
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    stress_obj.write_f06(f06_file,
                         header=None,
                         page_stamp=page_stamp,
                         page_num=page_num,
                         is_mag_phase=False,
                         is_sort1=True)
    return neids
Example #7
0
def recover_celas(f06_file,
                  op2,
                  model: BDF,
                  dof_map,
                  isubcase,
                  xg,
                  eids_str,
                  element_name: str,
                  write_f06_strain: bool,
                  write_op2_strain: bool,
                  write_f06_stress: bool,
                  write_op2_stress: bool,
                  write_f06_force: bool,
                  write_op2_force: bool,
                  write_f06_ese: bool,
                  write_op2_ese: bool,
                  fdtype='float32',
                  title: str = '',
                  subtitle: str = '',
                  label: str = '',
                  page_num: int = 1,
                  page_stamp='PAGE %s') -> None:
    """recovers static spring strain"""
    neids, ielas, eids = get_ieids_eids(model, element_name, eids_str)
    if not neids:
        return neids

    get_strain = write_f06_strain or write_op2_strain
    get_stress = write_f06_stress or write_op2_stress
    get_force = write_f06_force or write_op2_force
    get_strain_energy = write_f06_ese or write_op2_ese

    force = None
    stress = None
    strain = None
    strain_energy = None

    if get_force:
        force = np.full((neids, 1), np.nan, dtype=fdtype)
    if get_stress:
        stress = np.full((neids, 1), np.nan, dtype=fdtype)
    if get_strain:
        strain = np.full((neids, 1), np.nan, dtype=fdtype)
    if get_strain_energy:
        strain_energy = np.full((neids, 1), np.nan, dtype=fdtype)

    if element_name == 'CELAS1':
        #strain_slot = 'celas1_strain'
        #stress_slot = 'celas1_stress'
        #force_slot = 'celas1_force'
        #ese_slot = 'celas1_strain_energy'

        celas1_mapper = {
            # get_strain, get_stress, get_force, get_strain_energy
            # 2^4 = 16
            # ostr, oes, oef,  ese
            (True, True, True, True):
            get_celas1_ostr_oes_oef_ese,
            (True, True, True, False):
            get_celas1_ostr_oes_oef,
            (True, True, False, True):
            get_celas1_ostr_oes_ese,
            (True, True, False, False):
            get_celas1_ostr_oes,
            (True, False, True, True):
            get_celas1_ostr_oef_ese,
            (True, False, True, False):
            get_celas1_ostr_oef,
            (True, False, False, True):
            get_celas1_ostr_ese,
            (True, False, False, False):
            get_celas1_ostr,

            #(False, True, True, True): get_celas1_ostr_oes_oef_ese[1:],
            #(False, True, True, False): get_celas1_ostr_oes_oef[1:],
            #(False, True, False, True): get_celas1_ostr_oes_ese[1:],
            #(False, True, False, False): get_celas1_ostr_oes[1:],
            #(False, False, True, True): get_celas1_ostr_oef_ese[1:],
            #(False, False, True, False): get_celas1_ostr_oef[1:],
            #(False, False, False, True): get_celas1_ostr_ese[1:],

            # ostr, oes, oef,  ese
            (False, True, True, True):
            get_celas1_oes_oef_ese,
            (False, True, True, False):
            get_celas1_oes_oef,
            (True, True, False, True):
            get_celas1_oes_ese,
            (False, True, False, False):
            get_celas1_oes,
            (False, False, True, True):
            get_celas1_oef_ese,
            (False, False, True, False):
            get_celas1_oef,
            (False, False, False, True):
            get_celas1_ese,
            #(False, False, False, False): passer,
        }
        celeas1_func = celas1_mapper[(get_strain, get_stress, get_force,
                                      get_strain_energy)]
        # --------------------------------------------------------------
        # strain
        for unused_key, celeas1_func in celas1_mapper.items():
            celeas1_func(model, ielas, eids, xg, dof_map, strain, stress,
                         force, strain_energy)

    elif element_name == 'CELAS2':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            si = elem.s
            strain[ieid] = _recover_straini_celas12(xg, dof_map, elem, si)
    elif element_name == 'CELAS3':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            si = elem.pid_ref.s
            strain[ieid] = _recover_straini_celas34(xg, dof_map, elem, si)
    elif element_name == 'CELAS4':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            si = 1.0  # TODO: is this right?
            strain[ieid] = _recover_straini_celas34(xg, dof_map, elem, si)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)
    _save_spring_strain(op2, f06_file, page_num, page_stamp, element_name,
                        strain, eids, write_f06_strain, isubcase, title,
                        subtitle, label)
    _save_spring_stress(op2, f06_file, page_num, page_stamp, element_name,
                        stress, eids, write_f06_stress, isubcase, title,
                        subtitle, label)
    _save_spring_force(op2, f06_file, page_num, page_stamp, element_name,
                       force, eids, write_f06_force, isubcase, title, subtitle,
                       label)
    _save_spring_strain_energy(op2, f06_file, page_num, page_stamp,
                               element_name, strain_energy, eids,
                               write_f06_ese, isubcase, title, subtitle, label)
    return neids
Example #8
0
def _recover_force_rod(f06_file,
                       op2,
                       model: BDF,
                       dof_map,
                       isubcase,
                       xb,
                       eids_str,
                       element_name,
                       fdtype='float32',
                       title: str = '',
                       subtitle: str = '',
                       label: str = '',
                       page_num: int = 1,
                       page_stamp='PAGE %s') -> None:
    """recovers static rod force"""
    neids, irod, eids, forces = get_ieids_eids(model,
                                               element_name,
                                               eids_str,
                                               ncols=2,
                                               fdtype=fdtype)
    if not neids:
        return neids
    if element_name == 'CONROD':
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            forces[ieid, :] = _recover_forcei_rod(xb, dof_map, elem, elem)
    else:
        for ieid, eid in zip(irod, eids):
            elem = model.elements[eid]
            forces[ieid, :] = _recover_forcei_rod(xb, dof_map, elem,
                                                  elem.pid_ref)

    data = forces.reshape(1, *forces.shape)
    table_name = 'OEF1'
    force_obj = RealRodForceArray.add_static_case(table_name,
                                                  element_name,
                                                  eids,
                                                  data,
                                                  isubcase,
                                                  is_sort1=True,
                                                  is_random=False,
                                                  is_msc=True,
                                                  random_code=0,
                                                  title=title,
                                                  subtitle=subtitle,
                                                  label=label)

    if element_name == 'CONROD':
        op2.conrod_force[isubcase] = force_obj
    elif element_name == 'CROD':
        op2.crod_force[isubcase] = force_obj
    elif element_name == 'CROD':
        op2.ctube_force[isubcase] = force_obj
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    force_obj.write_f06(f06_file,
                        header=None,
                        page_stamp=page_stamp,
                        page_num=page_num,
                        is_mag_phase=False,
                        is_sort1=True)
    return neids
Example #9
0
def _recover_stress_celas(f06_file,
                          op2,
                          model: BDF,
                          dof_map,
                          isubcase,
                          xg,
                          eids_str,
                          element_name: str,
                          fdtype='float32',
                          title: str = '',
                          subtitle: str = '',
                          label: str = '',
                          page_num: int = 1,
                          page_stamp='PAGE %s') -> None:
    """recovers static spring stress"""
    neids, ielas, eids, stresses = get_ieids_eids(model,
                                                  element_name,
                                                  eids_str,
                                                  fdtype=fdtype)
    if not neids:
        return neids
    if element_name == 'CELAS1':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            pid_ref = elem.pid_ref
            ki = pid_ref.K()
            si = pid_ref.s
            stresses[ieid] = _recover_stressi_celas12(xg, dof_map, elem, ki,
                                                      si)
    elif element_name == 'CELAS2':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            si = elem.s
            stresses[ieid] = _recover_stressi_celas12(xg, dof_map, elem, ki,
                                                      si)
    elif element_name == 'CELAS3':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            pid_ref = elem.pid_ref
            ki = pid_ref.K()
            si = pid_ref.s
            stresses[ieid] = _recover_stressi_celas34(xg, dof_map, elem, ki,
                                                      si)
    elif element_name == 'CELAS4':
        for ieid, eid in zip(ielas, eids):
            elem = model.elements[eid]
            ki = elem.K()
            si = 1.0  # TODO: is this right?
            #si = elem.s
            stresses[ieid] = _recover_stressi_celas34(xg, dof_map, elem, ki,
                                                      si)
    else:  # pragma: no cover
        raise NotImplementedError(element_name)

    data = stresses.reshape(1, *stresses.shape)
    table_name = 'OES1'
    spring_stress = RealSpringStressArray.add_static_case(table_name,
                                                          element_name,
                                                          eids,
                                                          data,
                                                          isubcase,
                                                          is_stress=True,
                                                          is_sort1=True,
                                                          is_random=False,
                                                          is_msc=True,
                                                          random_code=0,
                                                          title=title,
                                                          subtitle=subtitle,
                                                          label=label)
    if element_name == 'CELAS1':
        op2.celas1_stress[isubcase] = spring_stress
    elif element_name == 'CELAS2':
        op2.celas2_stress[isubcase] = spring_stress
    elif element_name == 'CELAS3':
        op2.celas3_stress[isubcase] = spring_stress
    elif element_name == 'CELAS4':
        op2.celas4_stress[isubcase] = spring_stress
    else:  # pragma: no cover
        raise NotImplementedError(element_name)
    spring_stress.write_f06(f06_file,
                            header=None,
                            page_stamp=page_stamp,
                            page_num=page_num,
                            is_mag_phase=False,
                            is_sort1=True)
    return neids