예제 #1
0
def BiCalculateCracklength(a, b, dk, t, w, pmax, r, accu=0.001):
    # 对于CT试件,依据E647标准,已知SIF时利用二分法计算裂纹长度
    # 裂纹自高载后的扩展长度+循环塑性区尺寸是已知值,但循环区尺寸是扩展长度的函数且不易解,故采用二分法求解
    # 求解的方程可表示为求解长度a使方程:
    # dk(a) - dk(输入值) = 0
    # input arguments:
    # a, b: 二分法的左右两端(裂纹长度可能存在的范围)
    # dk:已知的SIF值
    # t, w: 试件的thickness、width,可由类读取
    # pmax, r:试验中循环载荷峰值和应力比,可由类读取
    # accu:二分法精度,默认为0.001
    # return arguments:
    # result: 数组,第0位为解的值x,第1位为此时函数的值
    i = 0  # 计数器
    # 计算二分法左端的函数值
    ya = mts_analysis.DeltaKCalculating(
        b=t, w=w, a=a, pmax=pmax, pmin=pmax * r) - dk
    # 计算二分法右端的函数值
    yb = mts_analysis.DeltaKCalculating(
        b=t, w=w, a=b, pmax=pmax, pmin=pmax * r) - dk
    result = []
    # 若两端为0的情况:
    if ya == 0:
        result.append(a)
        result.append(ya)
    elif yb == 0:
        result.append(b)
        result.append(yb)
    else:
        # 若两端不为零->进入二分法
        while i >= 0:
            c = (a + b) / 2
            # 计算中点的函数值
            yc = mts_analysis.DeltaKCalculating(
                b=t, w=w, a=c, pmax=pmax, pmin=pmax * r) - dk
            # 判断解的范围精度是否满足accu的设定
            if np.abs(b - a) < accu:
                result.append(c)
                result.append(yc)
                print('Find Zero_point due to tolrance at c=' + str(c))
                break
            if yc == 0:
                result.append(c)
                result.append(yc)
                print('Find Zero_point due to Midpoint_value=0 at c=' + str(c))
                break
            elif yc * ya < 0:
                b = c
                i = i + 1
                continue
            elif yc * yb < 0:
                i = i + 1
                a = c
                continue
            else:
                print(
                    'ERROR: Unexpected situation come across.Check the process.'
                )
                break
    return result
예제 #2
0
def WheelerCalculatingBaseParis(a_wheeler,
                                b,
                                w,
                                ys,
                                pmax,
                                r,
                                aol,
                                rol,
                                plasticzonefactor,
                                m1,
                                c,
                                m,
                                eta=0):
    # usage: 以裂纹长度a指定计算范围,计算基于Paris公式的Wheeler模型
    # NOTE:数据的起始点必须是高载后!
    # input parameter:
    # alist:输入需要计算的裂纹长度数组
    # b, w, ys:试件基本参数thickness,width和yield strength
    # pmax,r:加载基本参数循环载荷峰值pmax和应力比r
    # aol,rol:高载时裂纹长度aol及其对应的塑性区尺寸rol
    # plasticzonefactor:塑性区尺寸计算时的塑性区尺寸系数,若plasticzonefactor='Xiaoping',则采用Xiaoping模型计算
    # m1:由WheelerFitting函数拟合得到的Wheeler迟滞参数的指数系数,表征迟滞恢复的快慢
    # c,m:基础Paris公式参数
    # eta:裂纹长度修正,相当于延长裂纹的长度(即等效裂纹概念),作用于Wheeler系数的分母,默认不修正
    # return parameter:
    # dadn_wheeler, dk_wheeler, a_wheeler,cp_wheeler模型计算结果对应的dadn,SIF变幅dk和裂纹长度a,及迟滞系数cp
    dk_wheeler = mts_analysis.DeltaKCalculating(b=b,
                                                w=w,
                                                a=a_wheeler,
                                                pmax=pmax,
                                                pmin=pmax * r)
    kmax_wheeler = np.array([dk / (1 - r) for dk in dk_wheeler])
    rm_wheeler = PlasticZoneWithFactor(kmax=kmax_wheeler,
                                       ys=ys,
                                       factor=plasticzonefactor,
                                       t=b)
    left_wheeler = a_wheeler + rm_wheeler + eta
    right_wheeler = aol + rol
    # 迟滞计算参数和数据准备,由裂纹长度a出发

    cp = []
    for seq, _ in enumerate(a_wheeler):
        if left_wheeler[seq] < right_wheeler:
            cpi = (rm_wheeler[seq] / (aol + rol - a_wheeler[seq] - eta))**m1
        else:
            cpi = 1
        cp.append(cpi)
    cp = np.array(cp)
    # 迟滞系数cp计算

    dadn_wheeler = []
    for seq, _ in enumerate(dk_wheeler):
        dadn = cp[seq] * (c * dk_wheeler[seq]**m)
        try:
            dadn_wheeler.append(dadn[0])
        except IndexError:
            dadn_wheeler.append(dadn)
    dadn_wheeler = np.array(dadn_wheeler)
    # Wheeler模型 拟合函数计算
    return dadn_wheeler, dk_wheeler, a_wheeler, cp
예제 #3
0
def FCGRandDKbyOriginalData(b, w, a, n, pmax, pmin, ys, r, kclosure=[], fop=[], threshold=0):
    # usage: 依据标准E647-11由载荷峰谷值、裂纹长度、循环次数计算FCGR并进行有效性检查
    # input parameter:
    # b:试件厚度thickness,mm
    # w:试件宽度Width,mm
    # a:裂纹长度数组,mm
    # n:循环次数数组
    # pmax:载荷峰值数组,N
    # pmin:载荷谷值数组,N
    # ys:材料屈服强度,GPa
    # r:应力比
    # kclosure:裂纹闭合时应力强度因子,默认为空数组(不输出)
    # fop:裂纹闭合载荷,默认不输出
    # threshold:DeltaK阈值筛选,将删去小于阈值的数据,默认为0(不筛选)
    # return parameter:
    # dadn_ligament_valid:裂纹扩展速率
    # n_ligament_valid:循环次数
    # dk_ligament_valid:SIF变幅
    # a_ligament_valid:裂纹长度
    dk = mts_analysis.DeltaKCalculating(b=b, w=w, a=a, pmax=pmax, pmin=pmin)
    # 由裂纹长度依标准计算SIF变幅
    dadn_poly, a_poly, n_poly, dk_poly = mts_analysis.FCGRateByPolynomial(a=a, n=n, dk=dk, num=4)
    # 由裂纹长度和循环次数依多项式法计算FCGR
    n_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=n_poly, r=r)
    a_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=a_poly, r=r)
    dadn_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=dadn_poly, r=r)
    dk_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=dk_poly, r=r)
    if len(kclosure) != 0:
        kc_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=kclosure, r=r)
    if len(fop) != 0:
        fop_ligament_valid = mts_analysis.DataSelectByLigament(w=w, a=a_poly, dk=dk_poly, ys=ys, data=fop, r=r)
    #print("Data Deleted by Ligament Check:", str(len(a_poly) - len(a_ligament_valid)))
    # 依据标准进行韧带长度有效性筛选
    n_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=n_ligament_valid)
    a_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=a_ligament_valid)
    dadn_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=dadn_ligament_valid)
    dk_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=dk_ligament_valid)
    if len(kclosure) != 0:
        kc_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=kc_ligament_valid)
    if len(fop) != 0:
        fop_valid = mts_analysis.DataSelectByThreshold(threshold=threshold, parameter=dk_ligament_valid, data=fop_ligament_valid)
    # 依据DeltaK阈值进行筛选(可用于筛去DeltaK小于Paris区域的值)
    if len(kclosure) == 0:
        if len(fop) == 0:   # Kop,Fop均未输入的情况
            return np.array(dadn_valid), np.array(n_valid), np.array(dk_valid), np.array(a_valid)
        else:               # Kop未输入,Fop输入的情况
            return np.array(dadn_valid), np.array(n_valid), np.array(dk_valid), np.array(a_valid), np.array(fop_valid)
    else:
        if len(fop) == 0:   # Kop输入,Fop未输入的情况
            return np.array(dadn_valid), np.array(n_valid), np.array(dk_valid), np.array(a_valid), np.array(kc_valid)
        else:               # Kop,Fop均输入的情况
            return np.array(dadn_valid), np.array(n_valid), np.array(dk_valid), np.array(a_valid), np.array(kc_valid), np.array(fop_valid)
예제 #4
0
def DeltaKPredict(w, thickness, start, final, load, r, step=1):
    """
    对于CT试件,根据试件几何尺寸和载荷参数,输入的需要计算的起止裂纹长度,按照一定的步长,输出计算得到的dk
    :param w: CT试件几何参数width
    :param thickness: CT试件几何参数
    :param start: 输入的需要计算的裂纹长度起点,单位mm,该长度含notch的长度
    :param final: 输入的需要计算的裂纹长度终点,单位mm,该长度含notch的长度
    :param load: 载荷峰值
    :param r: 应力比
    :param step: 计算的步长,默认为1mm
    :return: dk: 裂纹长度范围内对应的应力强度因子变幅
    """
    a = np.arange(start, final+step, step)
    pmin = load * r
    dk = mts_analysis.DeltaKCalculating(b=thickness, w=w, a=a, pmax=load, pmin=pmin)
    return dk
예제 #5
0
def CpCalculatingBaseParis(a, b, w, ys, pmax, r, aol, rol, plasticzonefactor,
                           m1):
    # usage: 计算裂纹长度a对应的Wheeler迟滞系数cp
    # NOTE:数据的起始点必须是高载后!
    # input parameter:
    # a: 裂纹长度
    # b, w, ys:试件基本参数thickness,width和yield strength
    # pmax,r:加载基本参数循环载荷峰值pmax和应力比r
    # aol,rol:高载时裂纹长度aol及其对应的塑性区尺寸rol
    # plasticzonefactor:塑性区尺寸计算时的塑性区尺寸系数
    # m1:由WheelerFitting函数拟合得到的Wheeler迟滞参数的指数系数,表征迟滞恢复的快慢
    # return parameter:
    # dadn_wheeler, dk_wheeler, a_wheeler,cp_wheeler模型计算结果对应的dadn,SIF变幅dk和裂纹长度a,及迟滞系数cp
    a_wheeler = a
    dk_wheeler = mts_analysis.DeltaKCalculating(b=b,
                                                w=w,
                                                a=a_wheeler,
                                                pmax=pmax,
                                                pmin=pmax * r)
    kmax_wheeler = np.array([dk / (1 - r) for dk in dk_wheeler])
    rm_wheeler = PlasticZoneWithFactor(kmax=kmax_wheeler,
                                       ys=ys,
                                       factor=plasticzonefactor)
    left_wheeler = a_wheeler + rm_wheeler
    right_wheeler = aol + rol
    # 迟滞计算参数和数据准备,由裂纹长度a出发

    cp = []
    for seq, _ in enumerate(a_wheeler):
        if left_wheeler[seq] < right_wheeler:
            cpi = (rm_wheeler[seq] / (aol + rol - a_wheeler[seq]))**m1
        else:
            cpi = 1
        cp.append(cpi)
    cp = np.array(cp)
    # 迟滞系数cp计算

    return cp
예제 #6
0
# 读取数据并完成基本的FCG处理
specimen, width, notch_length, thickness, elastic_modulus, yield_strength, precrack_length = \
    read_data.ReadTestInf(sequence=sequence[0])
cycles, cracklength, kmax, kmin, pmax, pmin, kclosure, closureload = \
    read_data.ReadOriginResult(sequence=sequence[0], closure=True, cod=False)
dadn_Manual, n_Manual, dk_Manual, a_Manual, kc_Manual = \
    experiment_calculation.FCGRandDKbyOriginalData(b=thickness, w=width, n=cycles, pmax=pmax, pmin=pmin,
                                                   a=cracklength,
                                                   ys=yield_strength, r=r, kclosure=kclosure,
                                                   threshold=threshold)

# Kmax at Overload计算
k_max_ol = mts_analysis.DeltaKCalculating(b=thickness,
                                          w=width,
                                          a=aol_hold,
                                          pmax=pol,
                                          pmin=0)

# 塑性区系数及尺寸计算
factor = overload_analysis.FactorXiaoping(kmax=k_max_ol,
                                          t=thickness,
                                          ys=yield_strength)
r_ol = overload_analysis.PlasticZoneWithFactor(kmax=[k_max_ol],
                                               ys=yield_strength,
                                               factor=factor)

# 计算dK_eff
dkeff = []
dk_willenborg = []
for seq, value in enumerate(a_Manual):
예제 #7
0
specimen = OverloadSpecimen(name=sequence)
specimen.status_input_from_database()
specimen.basic_result_calculate()
#specimen.a_ol_applied -= 1.5
specimen.a_dadn_min = 13.8055
specimen.a_kc_max = specimen.a_alpha_end
specimen.a_alpha_end += 2.5
specimen.specimen_print()

# paris参数
c_ca, m_ca = paris_and_walker.ParisParameter(r=specimen.stress_ratio)

# Overload PLZ相关参数,塑性区系数为Irwin
kol = mts_analysis.DeltaKCalculating(b=specimen.thickness,
                                     w=specimen.width,
                                     a=specimen.a_ol_applied,
                                     pmax=specimen.overload,
                                     pmin=0)
plz_ol = overload_analysis.PlasticZoneWithFactor(kmax=np.array([kol]),
                                                 ys=specimen.yield_stress,
                                                 factor=plz_factor,
                                                 t=specimen.thickness)

# 数据筛选(筛选出dadn_min后的数据,标记为1)
dadn_1, dk_1, kc_1, n_1, a_1 = specimen.data_select_by_cracklength(
    lowerlimit=specimen.a_dadn_min, upperlimit=specimen.a_kc_max)
# 移动平均
if moving_average:
    print('Notice: moving average working!')
    dadn_ave, dk_ave = closureanalysis.DoubleDataSelectMovingAverage(
        data=specimen.dadn, reference=specimen.dk, ratio=0.2, numofaverage=7)
예제 #8
0
def AlphaModifiedCalculate(alpha_fade_rate, alpha_amplitude, pmax,
                           stress_ratio, thickness, width, a_amplitude, a_list,
                           c_ca, m_ca, a_start, a_end, dadn_start):
    # Modified Alpha模型计算函数
    # 该函数通过由已知起点(通常为a_kc_max_cal)和终点(通常为a_retard_end)的裂纹长度值和裂纹扩展速率
    # 采用直线拟合得到Kop的值,代入已知的Alpha模型参数值计算
    # 得到该段裂纹闭合效应主导的裂纹扩展速率模型
    # input parameters:
    # alpha_fade_rate: 模型衰减率参数
    # alpha_amplitude: 模型峰值参数,常取2/pi
    # pmax, stress_ratio: 载荷峰值,应力比
    # thickness, width: CT试件几何参数厚度和宽度
    # a_amplitude: 模型起点a0
    # a_list:要计算的裂纹长度值的数组
    # c_ca, m_ca:该应力比下的Paris公式参数
    # a_start, a_end: 要输出的裂纹长度起止点
    # dadn_start: 输入a0对应的dadn速率,通过反转Paris公式计算其dkeff
    # return parameters:
    # dk: 输入的a_list计算对应的dk
    # dkeff_alpha_e: 输入的a_list对应的alpha模型下的dkeff
    # dadn_alpha_e: 输入的a_list由alpha模型计算得到的dadn
    # alpha_e: a_list各值对应的alpha值
    # betas:a_list各值对应的无量纲裂纹长度参数值
    kmax = mts_analysis.DeltaKCalculating(b=thickness,
                                          w=width,
                                          a=a_list,
                                          pmax=pmax,
                                          pmin=0)
    kmin = mts_analysis.DeltaKCalculating(b=thickness,
                                          w=width,
                                          a=a_list,
                                          pmax=pmax * stress_ratio,
                                          pmin=0)
    dk = kmax - kmin
    # 计算无量纲量
    betas = (a_list - a_amplitude) / a_amplitude
    # 计算系数alpha
    alpha_e = []
    for beta in betas:
        if beta < 0:
            alpha_e.append(2 / np.pi)
        else:
            alpha_e.append(alpha_amplitude * np.exp(-alpha_fade_rate * beta))
    alpha_e = np.array(alpha_e)
    # 计算Kop
    dk_start = mts_analysis.DeltaKCalculating(b=thickness,
                                              w=width,
                                              a=a_start,
                                              pmax=pmax,
                                              pmin=pmax * stress_ratio)
    dk_end = mts_analysis.DeltaKCalculating(b=thickness,
                                            w=width,
                                            a=a_end,
                                            pmax=pmax,
                                            pmin=pmax * stress_ratio)
    dkeff_start = mts_analysis.ParisInverseCalculation(c=c_ca,
                                                       m=m_ca,
                                                       dadn=dadn_start)
    print("The Effective SIF when beta=0:" + str(dkeff_start))
    pi = np.pi
    kop_start = pi / 2 * (dk_start / (1 - stress_ratio) - dkeff_start -
                          (1 - 2 / pi) * dk_start * stress_ratio /
                          (1 - stress_ratio))
    print("The Open SIF when beta=0 based on Alpha Method:" + str(kop_start))
    kop_end = dk_end * (stress_ratio / (1 - stress_ratio))
    dk_fit = [dk_start[0], dk_end]
    kop_fit = [kop_start[0], kop_end]
    k_kopfit_cal, b_kopfit_cal = mixed_model.LogLinearFit(y=kop_fit, x=dk_fit)
    kop_cal = mixed_model.LogLinearFittedCalculate(k=k_kopfit_cal,
                                                   b=b_kopfit_cal,
                                                   x=dk)

    # 计算dKeff
    dkeff_alpha_e = kmax - alpha_e * kop_cal - (1 - alpha_e) * kmin
    # 计算dadn
    dadn_alpha_e = mts_analysis.ParisCalculating(c=c_ca,
                                                 m=m_ca,
                                                 dk=dkeff_alpha_e)

    return dk, dkeff_alpha_e, dadn_alpha_e, alpha_e, betas
예제 #9
0
ad = a_fcgr_min - a_fcgr_max  # retardation delay长度

# 实验数据读取和初步处理(本函数不能用BasicDataDispose封装API,因函数要调用细节数据)
specimen, width, notch_length, thickness, elastic_modulus, yield_strength, precrack_length = \
    read_data.ReadTestInf(sequence=sequence[0])
cycles, cracklength, kmax, kmin, pmax, pmin = read_data.ReadOriginResult(
    sequence[0], closure=False, cod=False)
dadn_Manual, n_Manual, dk_Manual, a_Manual = \
    experiment_calculation.FCGRandDKbyOriginalData(b=thickness, w=width, n=cycles, pmax=pmax, pmin=pmin,
                                                   a=cracklength,
                                                   ys=yield_strength, r=stress_ratio, threshold=threshold)

# 高载参数计算
kol = mts_analysis.DeltaKCalculating(b=thickness,
                                     w=width,
                                     a=a_ol,
                                     pmax=pol,
                                     pmin=0)
rol = overload_analysis.PlasticZoneWithFactor(kmax=np.array([kol]),
                                              ys=yield_strength,
                                              factor=1 / math.pi)

# 以高载时裂纹长度aol筛选出高载后的数据
dadn_ola, dk_ola, n_ola, a_ola = \
    mts_analysis.FCGDataSelectByThreshold(dadn=dadn_Manual, dk=dk_Manual, n=n_Manual, a=a_Manual,
                                          threshold=a_fcgr_min, target='a', keepbigger=1)

# 高载段参数计算
kmax_ola = np.array([dk / (1 - stress_ratio) for dk in dk_ola])
rm_ola = overload_analysis.PlasticZoneWithFactor(kmax=kmax_ola,
                                                 ys=yield_strength,
예제 #10
0
def SalvatiWheelerCalculatingBaseParis(astart, afinal, b, w, ys, pmax, r, aol,
                                       rol, plasticzonefactor, m1, c, m, apre,
                                       rdol, delayfactor, m_mod):
    # usage: 以裂纹长度a指定计算范围,计算基于Paris公式的Wheeler模型
    # NOTE:数据的起始点必须是高载后!
    # input parameter:
    # astart, afinal: 计算的裂纹长度范围的起点和终点,起点推荐为高载时裂纹长度,终点建议为有效的最大值
    # b, w, ys:试件基本参数thickness,width和yield strength
    # pmax,r:加载基本参数循环载荷峰值pmax和应力比r
    # aol,rol:高载时裂纹长度aol及其对应的塑性区尺寸rol
    # plasticzonefactor:塑性区尺寸计算时的塑性区尺寸系数
    # m1:由WheelerFitting函数拟合得到的Wheeler迟滞参数的指数系数,表征迟滞恢复的快慢
    # c,m:基础Paris公式参数
    # apre:高载起点(dadN最高值)
    # rdol:采用延迟系数计算的延迟区rd,OL
    # delayfactor:Yuen等提出的延迟系数
    # m_mod:由Salvati延迟系数拟合得到的延迟指数
    # return parameter:
    # dadn_wheeler, dk_wheeler, a_wheeler,cp, cd:模型计算结果对应的dadn,SIF变幅dk和裂纹长度a,及迟滞和延迟系数cp,cd
    a_wheeler = np.arange(astart, afinal, 0.02)
    dk_wheeler = mts_analysis.DeltaKCalculating(b=b,
                                                w=w,
                                                a=a_wheeler,
                                                pmax=pmax,
                                                pmin=pmax * r)
    kmax_wheeler = np.array([dk / (1 - r) for dk in dk_wheeler])
    rm_wheeler = PlasticZoneWithFactor(kmax=kmax_wheeler,
                                       ys=ys,
                                       factor=plasticzonefactor)
    left_wheeler = a_wheeler + rm_wheeler
    right_wheeler = aol + rol
    rd_wheeler = PlasticZoneWithFactor(kmax=kmax_wheeler,
                                       ys=ys,
                                       factor=delayfactor)
    left_delay = a_wheeler + rd_wheeler
    right_delay = apre + rdol
    # 迟滞计算参数和数据准备,由裂纹长度a出发

    cp = []
    for seq, _ in enumerate(a_wheeler):
        if left_wheeler[seq] < right_wheeler:
            cpi = (rm_wheeler[seq] / (aol + rol - a_wheeler[seq]))**m1
        else:
            cpi = 1
        cp.append(cpi)
    cp = np.array(cp)
    # 迟滞系数cp计算

    cd = []
    for seq, _ in enumerate(a_wheeler):
        if left_delay[seq] < right_delay:
            cdi = ((apre + rdol - a_wheeler[seq]) / rd_wheeler[seq])**m_mod
        else:
            cdi = 1
        cd.append(cdi)
    cd = np.array(cd)

    dadn_salvati = []
    for seq, _ in enumerate(dk_wheeler):
        dadn = cd[seq] * cp[seq] * (c * dk_wheeler[seq]**m)
        dadn_salvati.append(dadn)
    dadn_salvati = np.array(dadn_salvati)
    # Wheeler模型 拟合函数计算
    return dadn_salvati, dk_wheeler, a_wheeler, cd, cp
# 计算塑性区大小
# 2018/10/15 Version 1.0
# Lu Yunchao

from FCGAnalysisLib import overload_analysis
from FCGAnalysisLib import mts_analysis
from FCGAnalysisLib import paris_and_walker
import numpy as np

sequence = ["yang-baoban_Lu-420-05"]
specimen_data = paris_and_walker.test_database2(specimen=sequence[0])
ys = 0.365          # GPa
a_ol = np.array([specimen_data["a_ol_applied"]])      # mm
p_ol = specimen_data["overload"]         # N
p_max = specimen_data["maxload"]
a_kc_max = specimen_data["a_kc_max"]
print('specimen:'+sequence[0]+',a_ol_applied:'+str(a_ol)+'mm,overload:'+str(p_ol)+'N, maxload:'+str(p_max))
b = 2.5             # mm
w = 40              # mm

k_ol = np.array([mts_analysis.DeltaKCalculating(b=b, w=w, a=a_ol, pmax=p_ol, pmin=0)])
k_kc_max = np.array([mts_analysis.DeltaKCalculating(b=b, w=w, a=a_kc_max, pmax=p_max, pmin=0)])
factor = overload_analysis.FactorXiaoping(kmax=k_ol, t=b, ys=ys)
print(factor)
print(str(1/np.pi))
r_ol = overload_analysis.PlasticZoneWithFactor(kmax=k_ol, ys=ys, factor='Xiaoping', t=b)
r_kc_max = overload_analysis.PlasticZoneWithFactor(kmax=k_kc_max, ys=ys, factor='Xiaoping', t=b)
print("r_ol:", r_ol)
print("r_kc_max:", r_kc_max)
예제 #12
0
def BiSelection(a,
                b,
                const,
                t,
                w,
                ys,
                a_ol_applied,
                pmax,
                plz_factor,
                accu=0.001):
    # 利用二分法计算主导位置变化
    # 裂纹自高载后的扩展长度+循环塑性区尺寸是已知值,但循环区尺寸是扩展长度的函数且不易解,故采用二分法求解
    # 求解的方程可表示为求解长度da使方程:
    # da + plz,reversing(da) - plz,ol * precentage(44% for OLR = 2, 80% for OLR = 1.5)= 0
    # input arguments:
    # a, b: 二分法的左右两端
    # const:高载塑性区尺寸乘比例(44% or 80%)
    # t, w, ys: 试件的thickness、width和yielding stress,可由类读取
    # a_ol_applied:试验高载时对应裂纹长度,可由类读取
    # pmax:试验中循环载荷峰值,可由类读取
    # plz_factor:塑性区尺寸,可输入常数或Xiaoping,若输入Xiaoping则会自动根据试件尺寸计算
    # accu:二分法精度,默认为0.001
    # return arguments:
    # result: 数组,第0位为解的值x,第1位为此时函数的值
    i = 0  # 计数器
    # 计算二分法左端的函数值
    ka = mts_analysis.DeltaKCalculating(b=t,
                                        w=w,
                                        a=a_ol_applied + a,
                                        pmax=pmax,
                                        pmin=0)
    plza = overload_analysis.PlasticZoneWithFactor(kmax=[ka],
                                                   factor=plz_factor,
                                                   ys=ys,
                                                   t=t)
    ya = a + plza - const
    # 计算二分法右端的函数值
    kb = mts_analysis.DeltaKCalculating(b=t,
                                        w=w,
                                        a=a_ol_applied + b,
                                        pmax=pmax,
                                        pmin=0)
    plzb = overload_analysis.PlasticZoneWithFactor(kmax=[kb],
                                                   factor=plz_factor,
                                                   ys=ys,
                                                   t=t)
    yb = b + plzb - const
    result = []
    # 若两端为0的情况:
    if ya == 0:
        result.append(a)
        result.append(ya)
    elif yb == 0:
        result.append(b)
        result.append(yb)
    else:
        # 若两端不为零->进入二分法
        while i >= 0:
            c = (a + b) / 2
            # 计算中点的函数值
            kc = mts_analysis.DeltaKCalculating(b=t,
                                                w=w,
                                                a=a_ol_applied + c,
                                                pmax=pmax,
                                                pmin=0)
            plzc = overload_analysis.PlasticZoneWithFactor(kmax=[kc],
                                                           factor=plz_factor,
                                                           ys=ys,
                                                           t=t)
            yc = c + plzc - const
            # 判断解的范围精度是否满足accu的设定
            if np.abs(b - a) < accu:
                result.append(c)
                result.append(yc)
                print('Find Zero_point due to tolrance at c=' + str(c))
                break
            if yc == 0:
                result.append(c)
                result.append(yc)
                print('Find Zero_point due to Midpoint_value=0 at c=' + str(c))
                break
            elif yc * ya < 0:
                b = c
                i = i + 1
                continue
            elif yc * yb < 0:
                i = i + 1
                a = c
                continue
            else:
                print(
                    'ERROR: Unexpected situation come across.Check the process.'
                )
                break
    return result
예제 #13
0
specimen = mixed_model.OverloadSpecimen(name=sequence)
specimen.status_input_from_database()
specimen.basic_result_calculate()
# specimen.a_ol_applied -= 1.5
# specimen.a_dadn_min = 12.3506
# specimen.a_kc_max = specimen.a_alpha_end
specimen.a_alpha_end += 2
specimen.specimen_print()
# paris参数读取
c_ca, m_ca = paris_and_walker.ParisParameter(r=specimen.stress_ratio)

'''
高载塑性区尺寸计算
'''
# Overload PLZ相关参数,塑性区系数由参数指定
kol = mts_analysis.DeltaKCalculating(b=specimen.thickness, w=specimen.width,
                                     a=specimen.a_ol_applied, pmax=specimen.overload, pmin=0)
plz_ol = overload_analysis.PlasticZoneWithFactor(kmax=np.array([kol]), ys=specimen.yield_stress,
                                                 factor=plz_factor, t=specimen.thickness)


'''
Try: 由塑性区比例特点计算Kop,代替实验实测值,进行Alpha模型计算
'''
# step1:数据筛选(拟合用4,计算用3,筛选出的数据上下限见参数lowerlimit和upperlimit)
dadn_3, dk_3, kc_3, n_3, a_3 = specimen.data_select_by_cracklength(lowerlimit=specimen.a_dadn_min-0.2,
                                                                   upperlimit=specimen.a_retard_end+1.5)
dadn_4, dk_4, kc_4, n_4, a_4 = specimen.data_select_by_cracklength(lowerlimit=specimen.a_kc_max,
                                                                   upperlimit=specimen.a_retard_end)

# step2:由比例采用二分法计算出主导位置交换的对应的裂纹长度a_kc_max的值
if specimen.overload != -1 and specimen.maxload != -1:
specimen.overload = 2000
specimen.a_ol_applied = 11.051
specimen.a_dadn_min = specimen.a_ol_applied + 0.537 - 0.2
specimen.a_retard_end = specimen.a_dadn_min + 2.270
specimen.specimen_print()

# paris参数拟合
c_ca = 4.7553e-10
m_ca = 3.6441
'''
高载塑性区尺寸计算
'''
# Overload PLZ相关参数,塑性区系数由参数指定
kol = mts_analysis.DeltaKCalculating(b=specimen.thickness,
                                     w=specimen.width,
                                     a=specimen.a_ol_applied,
                                     pmax=specimen.overload,
                                     pmin=0)
plz_ol = overload_analysis.PlasticZoneWithFactor(kmax=np.array([kol]),
                                                 ys=specimen.yield_stress,
                                                 factor=plz_factor,
                                                 t=specimen.thickness)
'''
Try: 由塑性区比例特点计算Kop,代替实验实测值,进行Alpha模型计算
'''
# step1:数据筛选(拟合用4,计算用3,筛选出的数据上下限见参数lowerlimit和upperlimit)
dk_dadn_min = mts_analysis.DeltaKCalculating(b=specimen.thickness,
                                             w=specimen.width,
                                             a=specimen.a_dadn_min,
                                             pmax=specimen.maxload,
                                             pmin=specimen.maxload *