示例#1
0
def fun(cd,D,d,yx,θ,E,mo,Xs,Ys,F,ff1,canvas1,ff2,canvas2):
    def a_ij(x,y,b,a):
    
        f1 = lambda x, y: x + np.sqrt(x**2 + y**2)
    
        return (x+b) * np.log(f1(y+a,x+b)/f1(y-a,x+b)) + \
               (y+a) * np.log(f1(x+b,y+a)/f1(x-b,y+a)) + \
               (x-b) * np.log(f1(y-a,x-b)/f1(y+a,x-b)) + \
               (y-a) * np.log(f1(x-b,y-a)/f1(x+b,y-a))
    
    #材料1
    E_1 = E   # MPa
    mu_1 = mo
    
    #材料2
    E_2 = E# MPa
    mu_2 = mo
    
    k = ( (1 - mu_1**2)/E_1 + (1 - mu_2**2)/E_2) / np.pi
    
    E_d = 1/(k*np.pi)
    
    # x的界限
    x1 = -(cd/2)
    x2 = cd/2
    x_yx = yx/2
    
    y1 = -1
    y2 = 1
    # x方向网格数
    x_grid_number = Xs
    # y方向网格数
    y_grid_number = Ys
    # 网格大小
    x_grid_size = (x2 - x1) / (2 * x_grid_number)   # nuit:mm
    y_grid_size = (y2 - y1) / (2 * y_grid_number)  # nuit:mm
    
    def influence_coefficient_matrix(x_number, y_number, x_size, y_size):
        Matrix_mother = np.zeros([2 * x_number - 1, 2 * y_number - 1])
        for i in range(2 * x_number - 1):
            for j in range(2 * y_number - 1):
                Matrix_mother[i, j] = a_ij(np.abs(i - x_number+1) * 2 * x_size, np.abs(j - y_number+1) * 2 * y_size, x_size, y_size)
    
        n = 0
        P = np.zeros([x_number*y_number, x_number * y_number])
        for i in range(x_number):
            for j in range(y_number):
                t1 = Matrix_mother[(x_number-1-i):(x_number-1-i+x_number),(y_number-1-j):(y_number-1-j+y_number)]
                P[n,:] = t1.reshape(1,-1)
                n = n + 1
    
        return P
    
    P = influence_coefficient_matrix(x_grid_number, y_grid_number, x_grid_size, y_grid_size)
    
    
    ###
    
    # 圆柱的表面坐标
    D1=d
    D2=D
    theta=θ*(2*np.pi/360)
    F_ext = F
    
    
    R=(D1+D2)/4
    
    xa = [x1 +  (2*i + 1)* x_grid_size for i in range(x_grid_number)]
    ya = [y1 +  (2*i + 1)* y_grid_size for i in range(y_grid_number)]
    
    #xx, yy = np.meshgrid(xa, ya)#, sparse=True)
    
    #曲率半径
    def Ri(x):
        Di=(1-(x-x1)/(2*x2))*D1+(x-x1)/(2*x2)*D2
        Ri=Di/(2*np.cos(theta))
        return Ri
    
    #对数曲线
    def duishu(x_n):
        ds = (F_ext/(np.pi*2*x_yx*E_d))*np.log(1/(1-(2*x_n/(2*x_yx))**2))
        R_r = Ri(x_n) - ds
        return R_r
    
    
    z = np.zeros([x_grid_number, y_grid_number])
    for i in range(x_grid_number):
        for j in range(y_grid_number):
            if np.logical_and(np.logical_and(xa[i] <x_yx, xa[i] >-x_yx), np.logical_and(ya[j]<y2, ya[j] > -y2)):
                z[i,j] = np.sqrt(duishu(xa[i])**2 - ya[j]**2)
    
    Ri_M=np.zeros(x_grid_number)
    Ri_M.shape=x_grid_number,1
    for i in range(x_grid_number):
        Ri_M[i,0]=Ri(xa[i])
    
    shape = z
    #shape= np.zeros_like(z)
    #shape = np.zeros([x_grid_number, y_grid_number])
    #positon = np.logical_and(np.logical_and(xx < 1, xx > -1), np.logical_and(yy<1.5, yy > -1.5))
    #shape[positon] = z[positon]
    
    n=0
    
    d_test = 0.003
    # 确定位移下限
    
    while True:
        alpha = shape - Ri_M + d_test
        b = alpha.reshape(1,-1)
        # plt.plot(b[0,:])
        for i in range(b.size):
            if b[0,i] < 0:
                b[0,i] = 0
        c = np.linalg.solve(P,b.T/k)
    
        F_calculate = 0
        for i in range(c.shape[0]):
            if(c[i,0]>0):
                F_calculate += c[i,0] * 4 * x_grid_size * y_grid_size
    
        #print(F_calculate)
    
        if(F_ext < F_calculate):
            d_test = 0.5 * d_test
        else:
            break
    d_low = d_test
    
    # 确定位移上限
    d_test = 0.01
    while True:
        alpha = shape - Ri_M  + d_test
        b = alpha.reshape(1,-1)
        b[b<0] = 0
        # plt.plot(b[0,:])
    
        c = np.linalg.solve(P, b.T/k)
    
        c[c<0] = 0
    
        F_calculate = (c * 4 * x_grid_size * y_grid_size).sum()
    
        #print(F_calculate)
    
        if(F_ext > F_calculate):
            d_test = 2 * d_test
        else:
            break
    
    d_up = d_test
    
    d_test = 0.5 * (d_up + d_low)
    
    while np.abs(d_up - d_low) > 1e-8:
    
        alpha = shape - Ri_M  + d_test
        b = alpha.reshape(1,-1)
        b[b<0] = 0
        # plt.plot(b[0,:])
    
        c = np.linalg.solve(P, b.T/k)
    
        c[c<0] = 0
    
        F_calculate = (c * 4 * x_grid_size * y_grid_size).sum()
    
        #print(F_calculate)
    
    
        if(F_ext > F_calculate):
            d_low = d_test
            d_test = 0.5 * (d_up + d_low)
    
        else:
            d_up = d_test
            d_test = 0.5 * (d_up + d_low)
    
        #print(d_low,d_up)
    
    
        n = n+1
        if(n>20000):
            break
    
    
    #
    #d.max()
    #
    #a1 = (1 - mu_1**2)/E_1
    #a2 = (1 - mu_2**2)/E_2
    #
    #np.sqrt(6 * F_ext * (1/(a1+a2))**2)/np.pi
    
    Hz_s1 = 0.388 * (F_ext * (2*E_1*E_2/(E_1 + E_2))**2 / R**2)**(1/3)
    
    #0.388 * (10000 * (2*E_1*E_2/(E_1 + E_2))**2)**(1/3)
    #
    #0.388 * (10000 * E_1**2)**(1/3)
    #1.231 * (10000**2 / E_1**2)**(1/3)
    #d_test
    Hz_d1 = 1.231 * (F_ext**2 / E_1**2/R)**(1/3)
    
# =============================================================================
#     print('赫兹接触应力 = %0.3f, \t 计算接触应力 = %0.3f ' % (Hz_s1, c.max()))
#     print('赫兹接触深度 = %0.3f, \t 计算接触深度 = %0.3f ' % (Hz_d1, d_test))
# =============================================================================
    #print('赫兹接触半径 = %0.3f' % r1)
    
    qjbl.set_v('De',c.reshape(x_grid_number, y_grid_number))
        ###图1
    ff1.clf()
    a1 = ff1.add_subplot(111)
    s1 = qjbl.get_v('De')[:,int((y_grid_number+1)/2)]
    a1.plot(s1)
    canvas1.show()
    #text1.set('图1 - 最大接触应力分布图'+'  F='+F_ext+'N')
    
    ###图2
    ff2.clf()
    a2 = ff2.gca(projection='3d')
    x = np.arange(0, x_grid_number)
    y = np.arange(0, y_grid_number)
    X, Y = np.meshgrid(x, y)
    Z = qjbl.get_v('De').T
    # Plot the surface.
    surf = a2.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                         linewidth=0,)
    ff2.colorbar(surf, shrink=0.5, aspect=10)
    canvas2.show()
def func6(win,tl):
    qjbl.set_v('Dd',0)

####绘图函数###################################################
    def hui1():
        f1.clf()
        a1 = f1.add_subplot(111)
        s1 = qjbl.get_v('Dd')[:,int((int(Ys.get())+1)/2)]
        a1.plot(s1)
        canvas1.show()
        text1.set('图1 - 最大接触应力分布图'+'  F='+F.get()+'N')
    
       
        
    def hui2():
        f2.clf()
        a2 = f2.gca(projection='3d')
        x = np.arange(0, int(Xs.get()))
        y = np.arange(0, int(Ys.get()))
        X, Y = np.meshgrid(x, y)
        Z = qjbl.get_v('Dd').T
        # Plot the surface.
        surf = a2.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                             linewidth=0,)
        f2.colorbar(surf, shrink=0.5, aspect=10)
        canvas2.show()
        text2.set('图2 - 滚子接触应力三维分布图'+'  F='+F.get()+'N')
    #####################################################    
    
    ########################################
    # =============================================================================
    # root2 = Tk()
    # root2.title('滚子修形计算')
    # =============================================================================
    
    #tl = Toplevel()
    #tl.title('圆锥直线型修形')
    Fr = Frame(tl)
    Fr.grid()
    f1 = Frame(Fr)
    f1.grid(row=0,column=0,sticky=N,pady=20,)
    
    f1_1 = Frame(f1)
    f1_1.grid(row=0,column=0,pady=2,padx=20,sticky=N+W)
    
    ll = Label(f1_1,text='参数设置',font=('黑体',15))
    ll.grid(row=0,column=0,padx=20,pady=2,sticky=W+N)
    
    l1 = Label(f1_1,text='滚子长度 L',font=(10))
    l1.grid(row=1,column=0,padx=20,pady=8,sticky=W)
    cd = StringVar()
    cd.set(20)
    e1 = Entry(f1_1,textvariable=cd,)
    e1.grid(row=1,column=1)
    l1_1 = Label(f1_1,text='mm',font=(10))
    l1_1.grid(row=1,column=2,pady=8,sticky=W)
    
    l2 = Label(f1_1,text='有效长度 Lw',font=(10))
    l2.grid(row=2,column=0,padx=20,pady=8,sticky=W)
    yx = StringVar()
    yx.set(18)
    e2 = Entry(f1_1,textvariable=yx)
    e2.grid(row=2,column=1)
    l2_2 = Label(f1_1,text='mm',font=(10))
    l2_2.grid(row=2,column=2,pady=8,sticky=W)
    
    l3 = Label(f1_1,text='滚子半径 R',font=(10))
    l3.grid(row=3,column=0,padx=20,pady=8,sticky=W)
    R = StringVar()
    R.set(16)
    e3 = Entry(f1_1,textvariable=R)
    e3.grid(row=3,column=1)
    l3_3 = Label(f1_1,text='mm',font=(10))
    l3_3.grid(row=3,column=2,pady=8,sticky=W)
    
    l6 = Label(f1_1,text='弹性模量 E',font=(10))
    l6.grid(row=6,column=0,padx=20,pady=8,sticky=W)
    E = StringVar()
    E.set(200000)
    e6 = Entry(f1_1,textvariable=E)
    e6.grid(row=6,column=1)
    l6_6 = Label(f1_1,text='Mpa',font=(10))
    l6_6.grid(row=6,column=2,pady=8,sticky=W)
    
    l7 = Label(f1_1,text='泊松比 μ',font=(10))
    l7.grid(row=7,column=0,padx=20,pady=8,sticky=W)
    mo = StringVar()
    mo.set(0.3)
    e7 = Entry(f1_1,textvariable=mo)
    e7.grid(row=7,column=1)
    
    l8 = Label(f1_1,text='滚子轴向网格数 Xs',font=(10))
    l8.grid(row=8,column=0,padx=20,pady=8,sticky=W)
    Xs = StringVar()
    Xs.set(60)
    e8 = Entry(f1_1,textvariable=Xs)
    e8.grid(row=8,column=1)
    
    l9 = Label(f1_1,text='滚子径向网格数 Ys',font=(10))
    l9.grid(row=9,column=0,padx=20,pady=8,sticky=W)
    Ys = StringVar()
    Ys.set(40)
    e9 = Entry(f1_1,textvariable=Ys)
    e9.grid(row=9,column=1)
    
    l10 = Label(f1_1,text='施加载荷 F',font=(10))
    l10.grid(row=10,column=0,padx=20,pady=8,sticky=W)
    F = StringVar()
    F.set(1000)
    e10 = Entry(f1_1,textvariable=F)
    e10.grid(row=10,column=1)
    l10_10 = Label(f1_1,text='N',font=(10))
    l10_10.grid(row=10,column=2,pady=8,sticky=W)
    
    
    b = Button(f1_1,text='开始计算',command=lambda :yzds.fun(float(cd.get()),float(R.get()),float(yx.get()),float(E.get())
                  ,float(mo.get()),int(Xs.get()),int(Ys.get()),float(F.get()),f1,canvas1,f2,canvas2),fg='red')
    b.grid(row=11,column=0,columnspan=2,padx=30,pady=5,ipadx=25,)
    
    
    
    
    f1_2 = Frame(Fr)
    f1_2.grid(row=1,column=0,sticky=N+W,padx=20)
    l9 = Label(f1_2,text='参数对应示意图',font=('黑体',15))
    l9.grid(row=0,column=0,padx=20,pady=8,sticky=W)
    c = Canvas(f1_2,bg='white',height=270,width=320)
    c.grid(row=1,column=0,padx=20,pady=40)
    img = PhotoImage(file = 'syt.gif')
    c.create_image(0,0,anchor='nw',image=img)
    
    
    
    
    #########  绘图   ###################################
    f2_1 = Frame(Fr)
    f2_1.grid(row=0,column=1,pady=20,sticky=W,padx=30)
    
    lr = Label(f2_1,text='计算结果',font=('黑体',15))
    lr.pack(anchor='w',pady=2)
# =============================================================================
#     b1 = Button(f2_1,text='绘图1',command=hui1,fg='blue')
#     b1.pack(anchor='w',ipadx=20)
# =============================================================================
    text1=StringVar()
    text1.set('图1 - 最大接触应力分布图')
    lr_1 = Label(f2_1,textvariable=text1,font=(10))
    lr_1.pack()
    
    f1 = Figure(figsize=(7, 3), dpi=100)
    canvas1 = FigureCanvasTkAgg(f1, master=f2_1)
    canvas1.show()
    canvas1.get_tk_widget().pack(pady=10,anchor='w')
    #工具按钮
    toolbar1 = NavigationToolbar2TkAgg(canvas1, f2_1)
    toolbar1.update()
    canvas1._tkcanvas.pack()
    
        
    f2_2 = Frame(Fr)
    f2_2.grid(row=1,column=1,pady=2,sticky=W,padx=30)
# =============================================================================
#     b2 = Button(f2_2,text='绘图2',command=hui2,fg='blue')
#     b2.pack(anchor='w',ipadx=20)
# =============================================================================
    text2=StringVar()
    text2.set('图2 - 滚子接触应力三维分布图')
    lr_2 = Label(f2_2,textvariable=text2,font=(10))
    lr_2.pack()
    
    f2 = Figure(figsize=(7, 3), dpi=100)
    canvas2 = FigureCanvasTkAgg(f2, master=f2_2)
    canvas2.show()
    canvas2.get_tk_widget().pack(pady=2,anchor='w')
    #工具按钮
    toolbar2 = NavigationToolbar2TkAgg(canvas2, f2_2)
    toolbar2.update()
    canvas2._tkcanvas.pack()
    #############################################
    win.mainloop()