Ejemplo n.º 1
0
def _recover_straini_rod(xb, dof_map, elem, prop):
    """get the static rod strain"""
    nid1, nid2 = elem.nodes

    # axial
    i11 = dof_map[(nid1, 1)]
    i12 = i11 + 1
    i13 = i11 + 2

    i21 = dof_map[(nid2, 1)]
    i22 = i21 + 1
    i23 = i21 + 2

    # torsion
    i14 = i11 + 3
    i15 = i11 + 4
    i16 = i11 + 5

    i24 = i21 + 3
    i25 = i21 + 4
    i26 = i21 + 5

    q_axial = np.array([
        xb[i11],
        xb[i12],
        xb[i13],
        xb[i21],
        xb[i22],
        xb[i23],
    ])
    q_torsion = np.array([
        xb[i14],
        xb[i15],
        xb[i16],
        xb[i24],
        xb[i25],
        xb[i26],
    ])
    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]
    #headers = ['axial', 'SMa', 'torsion', 'SMt']

    C = prop.c

    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    L = np.linalg.norm(dxyz12)

    axial_strain = du_axial / L
    torsional_strain = du_torsion * C / L

    return axial_strain, np.nan, torsional_strain, np.nan
Ejemplo n.º 2
0
def _recover_forcei_rod(xb, dof_map, elem, prop):  # pragma: no cover
    """get the static rod force"""
    nid1, nid2 = elem.nodes

    # axial
    i11 = dof_map[(nid1, 1)]
    i12 = dof_map[(nid1, 2)]
    i13 = dof_map[(nid1, 3)]

    i21 = dof_map[(nid2, 1)]
    i22 = dof_map[(nid2, 2)]
    i23 = dof_map[(nid2, 3)]

    # torsion
    i14 = dof_map[(nid1, 4)]
    i15 = dof_map[(nid1, 5)]
    i16 = dof_map[(nid1, 6)]

    i24 = dof_map[(nid2, 4)]
    i25 = dof_map[(nid2, 5)]
    i26 = dof_map[(nid2, 6)]

    q_axial = np.array([xb[i11], xb[i12], xb[i13], xb[i21], xb[i22], xb[i23]])
    q_torsion = np.array(
        [xb[i14], xb[i15], xb[i16], xb[i24], xb[i25], xb[i26]])
    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]
    #headers = ['axial', 'SMa', 'torsion', 'SMt']

    #C = prop.c
    mat = prop.mid_ref

    L = np.linalg.norm(dxyz12)
    G = mat.G()
    J = elem.J()
    A = elem.Area()
    E = elem.E()

    axial_strain = du_axial / L
    #torsional_strain = du_torsion * C / L

    axial_stress = E * axial_strain
    #torsional_stress = G * torsional_strain
    axial_force = axial_stress * A
    torsional_moment = du_torsion * G * J / L

    return axial_force, torsional_moment
Ejemplo n.º 3
0
def _recover_straini_rod(xb, dof_map, elem, prop):
    """get the static rod strain"""
    nid1, nid2 = elem.nodes

    # axial
    i1 = dof_map[(nid1, 1)]
    i2 = dof_map[(nid2, 1)]

    q_axial = np.array([
        xb[i1],
        xb[i1 + 1],
        xb[i1 + 2],
        xb[i2],
        xb[i2 + 2],
        xb[i2 + 2],
    ])
    q_torsion = np.array([
        xb[i1 + 3],
        xb[i1 + 4],
        xb[i1 + 5],
        xb[i2 + 3],
        xb[i2 + 4],
        xb[i2 + 5],
    ])
    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]
    #headers = ['axial', 'SMa', 'torsion', 'SMt']

    C = prop.c

    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    L = np.linalg.norm(dxyz12)

    axial_strain = du_axial / L
    torsional_strain = du_torsion * C / L

    return axial_strain, np.nan, torsional_strain, np.nan
Ejemplo n.º 4
0
def _recover_forcei_rod(xb, dof_map, elem, prop):
    """get the static rod force"""
    nid1, nid2 = elem.nodes

    i1 = dof_map[(nid1, 1)]
    i2 = dof_map[(nid2, 1)]

    q_axial = np.array(
        [xb[i1], xb[i1 + 1], xb[i1 + 2], xb[i2], xb[i2 + 1], xb[i2 + 2]])
    q_torsion = np.array([
        xb[i1 + 3], xb[i1 + 4], xb[i1 + 5], xb[i2 + 3], xb[i2 + 4], xb[i2 + 5]
    ])
    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]
    #headers = ['axial', 'SMa', 'torsion', 'SMt']

    #C = prop.c
    mat = prop.mid_ref

    L = np.linalg.norm(dxyz12)
    G = mat.G()
    J = elem.J()
    A = elem.Area()
    E = elem.E()

    axial_strain = du_axial / L
    #torsional_strain = du_torsion * C / L

    axial_stress = E * axial_strain
    #torsional_stress = G * torsional_strain
    axial_force = axial_stress * A
    torsional_moment = du_torsion * G * J / L

    return axial_force, torsional_moment
Ejemplo n.º 5
0
def _recover_stressi_ctube(xb, dof_map, elem, prop):
    """get the static ctube stress"""
    nid1, nid2 = elem.nodes

    # axial
    i11 = dof_map[(nid1, 1)]
    i12 = i11 + 1
    i13 = i11 + 2

    i21 = dof_map[(nid2, 1)]
    i22 = i21 + 1
    i23 = i21 + 2

    # torsion
    i14 = i11 + 3
    i15 = i11 + 4
    i16 = i11 + 5

    i24 = i21 + 3
    i25 = i21 + 4
    i26 = i21 + 5

    q_axial = np.array([
        xb[i11],
        xb[i12],
        xb[i13],
        xb[i21],
        xb[i22],
        xb[i23],
    ])
    q_torsion = np.array([
        xb[i14],
        xb[i15],
        xb[i16],
        xb[i24],
        xb[i25],
        xb[i26],
    ])
    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]
    #headers = ['axial', 'SMa', 'torsion', 'SMt']

    mat = prop.mid_ref

    L = np.linalg.norm(dxyz12)
    G = mat.G()
    E = elem.E()

    axial_strain = du_axial / L
    torsional_strain = du_torsion / L

    axial_stress = E * axial_strain
    torsional_stress = G * torsional_strain

    return axial_stress, np.nan, torsional_stress, np.nan
Ejemplo n.º 6
0
def _recover_straini_cbar(model: BDF,
                          xb: NDArrayNfloat,
                          dof_map,
                          elem: CBAR,
                          prop: Union[PBAR, PBARL],
                          fdtype='float64'):
    """get the static bar strain"""
    nid1, nid2 = elem.nodes

    # axial
    i1 = dof_map[(nid1, 1)]
    j1 = dof_map[(nid2, 1)]

    q_all = np.hstack([
        xb[i1:i1 + 6],
        xb[j1:j1 + 6],
    ])
    print(len(xb[i1:i1 + 3], ))
    q_axial = np.hstack([
        xb[i1:i1 + 3],
        xb[j1:j1 + 3],
    ])
    print(q_axial)
    q_torsion = np.hstack([
        xb[i1 + 3:i1 + 6],
        xb[j1 + 3:j1 + 6],
    ])
    #{F} = [K]{u}

    nid1, nid2 = elem.nodes
    is_passed, Ke = ke_cbar(model, elem, fdtype=fdtype)
    assert is_passed

    pid_ref = elem.pid_ref
    mat = pid_ref.mid_ref

    #is_passed, (wa, wb, ihat, jhat, khat) = elem.get_axes(model)
    #T = np.vstack([ihat, jhat, khat])
    #z = np.zeros((3, 3), dtype='float64')
    prop = elem.pid_ref
    #mat = prop.mid_ref
    I1 = prop.I11()
    I2 = prop.I22()
    A = prop.Area()
    J = prop.J()
    unused_I12 = prop.I12()

    Fe = Ke @ q_all
    (Fx1, Fy1, Fz1, Mx1, My1, Mz1, Fx2, Fy2, Fz2, Mx2, My2, Mz2) = Fe
    s_axial = Fx1 / A
    s_torsion = Mx1 / J

    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    #dxyz12 = xyz1 - xyz2
    #Lambda = lambda1d(dxyz12, debug=False)

    #u_axial = Lambda @ q_axial
    #u_torsion = Lambda @ q_torsion
    #du_axial = u_axial[0] - u_axial[1]
    #du_torsion = u_torsion[0] - u_torsion[1]

    xyz1 = elem.nodes_ref[0].get_position()
    xyz2 = elem.nodes_ref[1].get_position()
    dxyz12 = xyz1 - xyz2
    L = np.linalg.norm(dxyz12)
    Lambda = lambda1d(dxyz12, debug=False)

    u_axial = Lambda @ q_axial
    u_torsion = Lambda @ q_torsion
    du_axial = u_axial[0] - u_axial[1]
    du_torsion = u_torsion[0] - u_torsion[1]

    axial = du_axial / L

    # cdef = prop.get_cdef()
    if prop.type == 'PBARL':
        # these axes are backwards...
        #     ^ y
        # +---|---+
        # |   |   |
        # |   +------> z
        # |       |
        # +-------+
        if prop.Type in ['ROD', 'TUBE']:
            R = prop.dims[0]
            cdef = np.array([
                [R, 0.],
                [0., R],
                [-R, 0.],
                [0., -R],
            ],
                            dtype='float64')
        elif prop.Type in ['BAR', 'BOX']:
            height, width = prop.dims
            cdef = np.array([
                [width, height],
                [width, -height],
                [-width, -height],
                [-width, height],
            ],
                            dtype='float64') / 2.
        else:
            raise NotImplementedError(prop.Type)
    elif prop.type == 'PBAR':
        cdef = np.array([
            [prop.c1, prop.c2],
            [prop.d1, prop.d2],
            [prop.e1, prop.e2],
            [prop.f1, prop.f2],
        ],
                        dtype='float64')
    else:
        raise NotImplementedError(prop.get_stats())
    model.log.info(f'cdef: {cdef}\n')

    Iy = I1
    Iz = I2
    G = mat.G()
    E = mat.E()
    strains = []
    for (T, My, Mz) in [(Mx1, My1, Mz1), (Mx2, My2, Mz2)]:
        for yz in cdef:
            y, z = yz
            radius = np.linalg.norm(yz)
            unused_torsional_stress = (T * radius) / J
            unused_phi = (T * L) / (G * J)

            stress = My * y / Iy + Mz * z / Iy
            strain = stress / E
            strains.append(strain)

    s1a = strains[0]
    s2a = strains[1]
    s3a = strains[2]
    s4a = strains[3]
    s1b = strains[4]
    s2b = strains[5]
    s3b = strains[6]
    s4b = strains[7]
    smaxa = max(s1a, s2a, s3a, s4a)
    smaxb = max(s1b, s2b, s3b, s4b)

    smina = min(s1a, s2a, s3a, s4a)
    sminb = min(s1b, s2b, s3b, s4b)
    MS_tension = MS_compression = np.nan
    out = (s1a, s2a, s3a, s4a, axial, smaxa, smina, MS_tension, s1b, s2b, s3b,
           s4b, sminb, sminb, MS_compression)  # 15
    return out