コード例 #1
0
def psi_minus_linear_elasticity_model_C(epsilon, lamda, mu):
    sqrt_delta = fe.conditional(
        fe.gt(fe.tr(epsilon)**2 - 4 * fe.det(epsilon), 0),
        fe.sqrt(fe.tr(epsilon)**2 - 4 * fe.det(epsilon)), 0)
    eigen_value_1 = (fe.tr(epsilon) + sqrt_delta) / 2
    eigen_value_2 = (fe.tr(epsilon) - sqrt_delta) / 2
    tr_epsilon_minus = fe.conditional(fe.lt(fe.tr(epsilon), 0.),
                                      fe.tr(epsilon), 0.)
    eigen_value_1_minus = fe.conditional(fe.lt(eigen_value_1, 0.),
                                         eigen_value_1, 0.)
    eigen_value_2_minus = fe.conditional(fe.lt(eigen_value_2, 0.),
                                         eigen_value_2, 0.)
    return lamda / 2 * tr_epsilon_minus**2 + mu * (eigen_value_1_minus**2 +
                                                   eigen_value_2_minus**2)
コード例 #2
0
ファイル: mfem.py プロジェクト: tianjuxue/crack
def ratio_function_ufl(ratio, map_type):
    if map_type == 'linear':
        return fe.conditional(
            fe.lt(ratio, -1. / 2.), 3. / 2. * ratio + 1. / 2.,
            fe.conditional(fe.gt(ratio, 1. / 2.), 3. / 2. * ratio - 1. / 2.,
                           1. / 2. * ratio))
    elif map_type == 'power':
        return ratio**(2.)
    elif map_type == 'identity':
        return ratio
    elif map_type == 'smooth':
        return fe.conditional(fe.lt(ratio, -1./2.), -6*ratio**3 - 14*ratio**2 - 9*ratio - 2, \
               fe.conditional(fe.gt(ratio, 1./2.), -6*ratio**3 + 14*ratio**2 - 9*ratio + 2, 1./2.* ratio))
    else:
        raise NotImplementedError("To be implemented")
コード例 #3
0
ファイル: mfem.py プロジェクト: tianjuxue/crack
def distance_function_segments_ufl(P, control_points, impact_radii):
    if len(control_points) == 1:
        return distance_function_point_ufl(P,
                                           control_points[0]), impact_radii[0]
    else:
        rho1 = impact_radii[0]
        rho2 = impact_radii[1]
        df, xi = distance_function_line_segement_ufl(P, control_points[0],
                                                     control_points[1])
        for i in range(len(control_points) - 1):
            tmp_df, tmp_xi = distance_function_line_segement_ufl(
                P, control_points[i], control_points[i + 1])
            xi = fe.conditional(fe.lt(tmp_df, df), tmp_xi, xi)
            rho1 = fe.conditional(fe.lt(tmp_df, df), impact_radii[i], rho1)
            rho2 = fe.conditional(fe.lt(tmp_df, df), impact_radii[i + 1], rho2)
            df = ufl.Min(tmp_df, df)
        return df, (1 - xi) * rho1 + xi * rho2
コード例 #4
0
ファイル: mfem.py プロジェクト: tianjuxue/crack
def distance_function_line_segement_ufl(P, A=[-1, 0], B=[1, 0]):
    AB = [None, None]
    AB[0] = B[0] - A[0]
    AB[1] = B[1] - A[1]

    BP = [None, None]
    BP[0] = P[0] - B[0]
    BP[1] = P[1] - B[1]

    AP = [None, None]
    AP[0] = P[0] - A[0]
    AP[1] = P[1] - A[1]

    AB_BP = AB[0] * BP[0] + AB[1] * BP[1]
    AB_AP = AB[0] * AP[0] + AB[1] * AP[1]

    y = P[1] - B[1]
    x = P[0] - B[0]
    df1 = fe.sqrt(x**2 + y**2)
    xi1 = 1

    y = P[1] - A[1]
    x = P[0] - A[0]
    df2 = fe.sqrt(x**2 + y**2)
    xi2 = 0

    x1 = AB[0]
    y1 = AB[1]
    x2 = AP[0]
    y2 = AP[1]
    mod = fe.sqrt(x1**2 + y1**2)
    df3 = np.absolute(x1 * y2 - y1 * x2) / mod
    xi3 = fe.conditional(fe.gt(x2**2 + y2**2 - df3**2, 0),
                         fe.sqrt(x2**2 + y2**2 - df3**2) / mod, 0)

    df = fe.conditional(fe.gt(AB_BP, 0), df1,
                        fe.conditional(fe.lt(AB_AP, 0), df2, df3))
    xi = fe.conditional(fe.gt(AB_BP, 0), xi1,
                        fe.conditional(fe.lt(AB_AP, 0), xi2, xi3))

    return df, xi
コード例 #5
0
ファイル: mfem.py プロジェクト: tianjuxue/crack
def inverse_ratio_function_ufl(ratio, map_type):
    if map_type == 'linear':
        return fe.conditional(
            fe.lt(ratio, -1. / 4.), 2. / 3. * ratio - 1. / 3.,
            fe.conditional(fe.gt(ratio, 1. / 4.), 2. / 3. * ratio + 1. / 3.,
                           2. * ratio))
    elif map_type == 'power':
        return ratio**(0.5)
    elif map_type == 'identity':
        return ratio
    else:
        raise NotImplementedError("To be implemented")
コード例 #6
0
def psi_minus_Borden(F, mu, kappa):
    J = fe.det(F)
    U, Wbar = psi_aux_Borden(F, mu, kappa)
    return fe.conditional(fe.lt(J, 1), U, 0)