首页 > 编程语言 >计算力学|采用python进行有限元模拟

计算力学|采用python进行有限元模拟

时间:2024-10-17 09:49:38浏览次数:8  
标签:有限元 NoN python coords dot np n1 id 模拟

从abaqus输出的inp文件中读取节点和单元信息

import meshio

mesh = meshio.read('Job-3.inp')

coords = mesh.points###coords即为各个节点的坐标

Edof = mesh.cells_dict['triangle']#Edof为三角形单元的节点号

1.单元刚度矩阵

def element_stiffness(n1,coords,E,v,t):

    node1 = coords[n1[0]]

    node2 = coords[n1[1]]

    node3 = coords[n1[2]]

    xi = node1[0]

    yi = node1[1]

    xj = node2[0]

    yj = node2[1]

    xm = node3[0]

    ym = node3[1]

    A=abs((xi*(yj-ym)+xj*(ym-yi)+xm*(yi-yj))*0.5)

    bi=yj-ym

    bj=ym-yi

    bm=yi-yj

    ci=-xi+xm

    cj=-xm+xi

    cm=-xi+xj

B=np.array([[bi,0,bj,0,bm,0],[0,ci,0,cj,0,cm],[ci,bi,cj,bj,cm,bm]])/(2*A)

    BT=B.transpose()

    D=np.array([[1,v,0],[v,1,0],[0,0,(1-v)/2]])*E/(1-v*v)

    Ke=BT.dot(D).dot(B)*t*A

    return Ke

2.总体刚度矩阵

def assemble_stiffness(coords,edof,E,v,t):

    NoN = np.size(coords, 0)

    NoE = np.size(edof, 0)

    PD = np.size(coords, 1)

    NPE = np.size(edof, 1)

    K=np.zeros([NoN*PD,NoN*PD])

    for i in range(len(edof)):

        n1 = edof[i, 0:(NPE)]

        Ke=element_stiffness(i,n1,coords, E,v,t)

        for r in range(NPE):

            for p in range(NPE):

                K[2*n1[r] , 2*n1[p] ] = K[2*n1[r] - 0, 2*n1[p]-0] + Ke[2*r, 2*p]

                K[2*n1[r] , 2*n1[p]+1] = K[2*n1[r] , 2*n1[p]+1] + Ke[2*r, 2*p+1]

                K[2*n1[r] +1, 2*n1[p] ] = K[2*n1[r]+1, 2*n1[p] ] + Ke[2*r+1, 2*p]

                K[2*n1[r] +1, 2*n1[p]+1] = K[2*n1[r]+1 , 2*n1[p]+1] + Ke[2*r+1, 2*p+1]

    return K

3.施加载荷

在薄板的左右两端施加均布载荷,首先根据单元节点横坐标判断在左右两端,判断在左右两端的单元个数,然后在单元上设置近似的均布载荷。

def F(coords,NoN,PD,b,c):

    G = np.zeros([NoN , PD])

    U = np.zeros([NoN , PD])

    # 施加左侧载荷

    m=0

    for i in range(NoN):

        if int(coords[i,:][0]*10**2) == -(b/2)*10**2+1.:

            m=m+1

    p=c/m*689.5

    k = 0

    for i in range(NoN):

        if int(coords[i][0]*10**2) == -(b/2)*10**2+1.:

            print(i)

            k = k + 1           

            G[i][0]= (-p)

    # 施加右侧载荷

    n=0

    for i in range(NoN):

        if int(coords[i,0:][0]*10**2) == (b/2)*10**2-1.:

            n = n + 1

    p = c/ n*689.5

    for i in range(NoN):

        if int(coords[i,0:][0]*10**2) == (b/2)*10**2-1.:

            G[i][0] = p

    return G

4.求解位移

U = np.zeros([2*NoN , PD-1])

T= np.linalg.inv(K)#T为K(总体刚度矩阵)逆矩阵

U=np.dot(T,GT)#U=[K]-1[G]

U=U.reshape(2*NoN,PD-1)#把位移转化为一维数组

5.计算应力应变

epsilonx = np.zeros(NoE)

epsilony = np.zeros(NoE)

epsilonxy = np.zeros(NoE)

A = np.zeros([3,3])

for i in range(NoE):

      dot_id = Edof[i]

      dot1 = np.array(coords[int(Edof[i, 0])])

      dot2 = np.array(coords[int(Edof[i, 1])])

      dot3 = np.array(coords[int(Edof[i, 2])])

      beta1 = dot2[1] - dot3[1]

      beta2 = dot3[1] - dot1[1]

      beta3 = dot1[1] - dot2[1]

      gamma1 = -dot2[0] + dot3[0]

      gamma2 = -dot3[0] + dot1[0]

      gamma3 = -dot1[0] + dot2[0]

      B=np.array([[1, dot1[0], dot1[1]], [1, dot2[0], dot2[1]],[1, dot3[0], dot3[1]]]) / 2

      A = np.linalg.det(B)

      epsilonx[i - 1] = (beta1 * U[dot_id[0]] + beta2 * U[dot_id[1]] + beta3 * U[dot_id[2]]) / (2 * A)

      epsilony[i - 1] = (gamma1 * U[NoN + dot_id[0]] +

            gamma2 * U[NoN + dot_id[1]] + gamma3 * U[NoN + dot_id[2]]) / (2 * A)

      epsilonxy[i - 1] = (beta1 * U[NoN + dot_id[0]] +

             beta2 * U[NoN + dot_id[1]] + beta3 * U[NoN + dot_id[2]]

             + gamma1 * U[dot_id[0]] + gamma2 * U[dot_id[1]] + gamma3 * U[dot_id[2]]) / (2 *A)

      sigmax = (E / (1 - v ** 2)) * (epsilonx + v * epsilony)

      sigmay = (E / (1 - v ** 2)) * (epsilony + v * epsilonx)

      sigmaxy = (E / (2 * (1 + v))) * epsilonxy

五、结果及分析

编程结果:

X方向位移(Abaqus)

y方向位移(Abaqus)

应力:

数值比较:最大x方向位移

编程

Abaqus

1.79345518e-03

1.183e-03

数值比较:最大y方向位移

编程

Abaqus

8.84718366e-04

1.838e-04

数值比较:最大x方向应力

编程

Abaqus

2.82313695e+04

1.028e+04

分析:在用Abaqus求解时,将中间整个圆环边界位移设置为零,相当于减少了薄板的位移量,因此出现了编程位移数值大于Abaqus数值的问题。而在使用相同模型时,位移的大小决定了应变的大小,应力呈现与应变相同的变化趋势,所以编程的应力大于Abaqus的应力,但结果在同一个数量级,可以基本确定是以上原因。

标签:有限元,NoN,python,coords,dot,np,n1,id,模拟
From: https://blog.csdn.net/weixin_58187233/article/details/142998309

相关文章

  • Python join()函数使用详解
    在Python中,join()函数是字符串的一个方法,用于将一个可迭代对象(如列表)中的元素连接成一个字符串。join()函数的语法如下:string.join(iterable)其中,string是连接中的字符串,iterable是要连接的可迭代对象。下面是join()函数的使用示例:#连接列表中的元素my_list=['Hello',......
  • 使用Python解决化学问题的实用指南
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
    本文探讨了Python脚本与动态模态分解(DMD)的结合应用。我们将利用Python对从OpenFOAM模拟中提取的二维切片数据进行DMD计算。这种方法能够有效地提取隐藏的流动模式,深化对流体动力学现象的理解。使用开源CFD软件OpenFOAM,有两种方法可以对CFD数据进行DMD计算。第一种方法是直接......
  • MySQL(python开发)——(5)聚合操作
    MySQL(python开发)——(1)数据库概述及其MySQL介绍MySQL(python开发)——(2)数据库基本操作及数据类型MySQL(python开发)——(3)表数据的基本操作,增删改查MySQL(python开发)——(4)高级查询语句MySQL聚合操作聚合操作指的是在数据查找基础上对数据的进一步整理筛选行为,实际上聚合......
  • h3cne-rs+题库GB0-192新华三初级网络工程师认证模拟练习题限时领!
    很高兴你对H3CNE-RS+(GB0-192)新华三初级网络工程师认证感兴趣。为了帮助你备考,以下是一些模拟练习题及解析示例。请注意,这只是部分示例,并非完整的题库。真实的考试题目可能会涉及更多细节和实际应用场景。想要完整题库的,加老师。IP地址132.119.100.200的子网掩码是255.......
  • OpenCV基本操作(python开发)——(1) 读取图像、保存图像
    OpenCV一.OpenCV安装——linux执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。#安装opencv核心库pip3install--useropencv-python==3.4.2.16--index-urlhttps://pypi.tuna.tsinghua.edu.cn......
  • 基于python提取指定的子字符串
    文章目录一、提取子字符串的范例二、分析提取的子字符串在原始字符串中的位置特点三、提取步骤四、整体代码获取五、总结一、提取子字符串的范例原始表格A1.xlsx中Sheet1工作表中的A列具有以下内容,需要提取标红的子字符串二、分析提取的子字符串在原始字符串......
  • 10.16 CW 模拟赛 D. 迷宫(maze)
    题面传统T4找不到原题挂个pdf题面下载算法不容易想到把出发点,有被困同伴的人称作关键点那么只需要求出关键点之间,关键点到任意一个终点的最短距离,然后在搜索即可求解dijkstra算法求单源最短路\(n>10^3\),显然会T飞dijkstra算法求单源最短路\(\mathcal{O......
  • Python 代码实现了一个基于图卷积网络(GCN)和模型无关元学习(MAML)的模型,用于预测 circRNA
    importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataLoader,Dataset,Subsetfromsklearn.metricsimportf1_score,roc_auc_score,accuracy_score,average_precision_score,recall_scorefromsklearn.model_selecti......
  • 初始Python篇(3)—— 列表
     找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: Python目录列表相关概念 列表的创建与删除列表的遍历操作列表的相关方法 列表的排序 列表生成式二维列表 创建二维列表遍历二维列表列表生成式列表相关概念......