一、矩形网格单元的生成

矩形网格单元

如上图所示,黑色数字表示的是节点,蓝色数字表示的是element的位置,每个节点对应一个黑色数字,每一个element有四个节点与之对应,基于Python的编程,我们可以得到节点的位置列表,储存着所有节点的位置坐标,且列表的索引即为节点的索引,同时对遍历所有的element可以得到element的节点索引列表,列表中存储着每个element对应的四个节点的索引,element列表的索引即为element的编号。

二、三角网格单元的生成

在有限元算法中,多是基于三角网格的算法,我们可以从矩形网格中得到标准的三角网格单元,对于矩形网格中的每一个矩形单元可以将其按对角线进行剖分成两个三角形单元,并重新进行编号。
进过剖分之后,element的数量变成原来的两倍,每个element对应三个节点。据此我们得到了下面的三角网格单元“

三角网格单元 matplotlib中提供了基于非规则三角网格的绘图工具,我们生成的三角网格也是可以使用的,使用其中的tri库我们可以绘制出以下结果:

matplotlib.tri 绘制

三、参考代码

# -*- coding: utf-8 -*-
'''
该程序用于创建二维有限元标准三角网格程序,其中利用了四角网格的剖分
来建立三角网格,计算得到代表网格node坐标列表,列表的索引为node 的
索引,得到element节点索引列表。
@作者:fm
'''
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtridef creat_mesh(x, y, nx, ny, e_type):'''x:x方向上的距离x:y方向上的距离nx:x方向上的element的数量ny:y方向上的element的数量e_type:SQ表示是矩形单元,TR表示三角单元'''# 矩形单元的四角坐标q = np.array([[0., 0.], [x, 0.], [0, y], [x, y]])# node的数量numN = (nx+1)*(ny+1)# element的数量numE = nx*ny# 矩形element的角NofE = 4# 二维坐标D = 2# nodes 坐标NC = np.zeros([numN, D])# dx,dy的计算dx = q[1, 0]/nxdy = q[2, 1]/ny# nodes 坐标计算n = 0for i in range(1, ny+2):for j in range(1, nx+2):NC[n, 0] = q[0, 0] + (j-1)*dxNC[n, 1] = q[0, 1] + (i-1)*dyn += 1# element 索引,一个element由四个角的节点进行索引EI = np.zeros([numE, NofE])for i in range(1, ny+1):for j in range(1, nx+1):# 从底层开始类推if j == 1:EI[(i-1)*nx+j-1, 0] = (i-1)*(nx+1) + 1EI[(i-1)*nx+j-1, 1] = EI[(i-1)*nx+j-1, 0] + 1EI[(i-1)*nx+j-1, 3] = EI[(i-1)*nx+j-1, 0] + (nx+1)EI[(i-1)*nx+j-1, 2] = EI[(i-1)*nx+j-1, 3] + 1else:EI[(i-1)*nx+j-1, 0] = EI[(i-1)*nx+j-2, 1]EI[(i-1)*nx+j-1, 3] = EI[(i-1)*nx+j-2, 2]EI[(i-1)*nx+j-1, 1] = EI[(i-1)*nx+j-1, 0] + 1EI[(i-1)*nx+j-1, 2] = EI[(i-1)*nx+j-1, 3] + 1# 至此完成了矩形单元的划分工作# 三角形单元需要将每一个矩形单元进行拆分,即一分二成两个三角形if e_type == 'TR':# 三角形的三个角NofE_new = 3# 单元数量numE_new = numE * 2# 新的三角单元索引EI_new = np.zeros([numE_new, NofE_new])# 对矩形单元进行逐个剖分for i in range(1, numE+1):EI_new[2*(i-1), 0] = EI[i-1, 0]EI_new[2*(i-1), 1] = EI[i-1, 1]EI_new[2*(i-1), 2] = EI[i-1, 2]EI_new[2*(i-1)+1, 0] = EI[i-1, 0]EI_new[2*(i-1)+1, 1] = EI[i-1, 2]EI_new[2*(i-1)+1, 2] = EI[i-1, 3]EI = EI_newEI = EI.astype(int)return NC, EIx, y = 1, 1
nx = 5
ny = 4
element_type = 'TR'
NC, EI = creat_mesh(x, y, nx, ny, element_type)
numN = np.size(NC, 0)
numE = np.size(EI, 0)
plt.figure(1)
count = 1
# plot nodes num
for i in range(numN):plt.annotate(count, xy=(NC[i, 0], NC[i, 1]))count += 1if element_type == 'SQ':count2 = 1for i in range(numE):# 计算中点位置plt.annotate(count2, xy=((NC[EI[i, 0]-1, 0]+NC[EI[i, 1]-1, 0])/2,(NC[EI[i, 0]-1, 1]+NC[EI[i, 3]-1, 1])/2),c='blue')count2 += 1# plot linesx0, y0 = NC[EI[i, 0]-1, 0], NC[EI[i, 0]-1, 1]x1, y1 = NC[EI[i, 1]-1, 0], NC[EI[i, 1]-1, 1]x2, y2 = NC[EI[i, 2]-1, 0], NC[EI[i, 2]-1, 1]x3, y3 = NC[EI[i, 3]-1, 0], NC[EI[i, 3]-1, 1]plt.plot([x0, x1], [y0, y1], c='red', linewidth=3)plt.plot([x0, x3], [y0, y3], c='red', linewidth=3)plt.plot([x1, x2], [y1, y2], c='red', linewidth=3)plt.plot([x2, x3], [y2, y3], c='red', linewidth=3)if element_type == 'TR':count2=1for i in range(numE):# 计算中点位置plt.annotate(count2, xy=((NC[EI[i, 0]-1, 0]+NC[EI[i, 1]-1, 0]+NC[EI[i, 2]-1, 0])/3,(NC[EI[i, 0]-1, 1]+NC[EI[i, 1]-1, 1]+NC[EI[i, 2]-1, 1])/3),c='blue')count2 += 1x0, y0 = NC[EI[i, 0]-1, 0], NC[EI[i, 0]-1, 1]x1, y1 = NC[EI[i, 1]-1, 0], NC[EI[i, 1]-1, 1]x2, y2 = NC[EI[i, 2]-1, 0], NC[EI[i, 2]-1, 1]plt.plot([x0, x1], [y0, y1], c='red', linewidth=3)plt.plot([x1, x2], [y1, y2], c='red', linewidth=3)plt.plot([x0, x2], [y0, y2], c='red', linewidth=3)
# plt.xlim(0, x)
# plt.ylim(0, y)
plt.axis("equal")
plt.show()plt.figure(2)
x=np.squeeze(NC[:,0])
y=np.squeeze(NC[:,1])
tri=EI-1
triang = mtri.Triangulation(x,y,tri)
plt.tricontourf(triang,np.zeros_like(x))
plt.triplot(triang,'go-')
plt.show()

基于Python的三角网格划分相关推荐

  1. 如何用python制作动画_如何基于Python Matplotlib实现网格动画

    -1- 如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看.第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一次就正常了. 这篇文章虽然不是篇典型的数据科学类文章,不过 ...

  2. python画函数图像网格_如何基于Python Matplotlib实现网格动画

    -1- 如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看.第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一次就正常了. 这篇文章虽然不是篇典型的数据科学类文章,不过 ...

  3. HyperMesh网格划分简要流程小试

    HyperMesh三角网格划分小试 模型导入 将在CAD软件中建好导出的IGS格式模型导入HM. 拓扑检查和修复 查看模型拓扑关系. 图片来源:HyperMesh 实用教程(四)几何_Hulunbui ...

  4. python划分有限元网格_有限元网格划分和细化

    工程师和研究人员使用有限元分析(FEA)软件,来建立现实世界场景的预测计算模型.在使用有限元分析软件时,我们通常从表征需要模拟的物质部分的计算机辅助设计(CAD)模型.材料属性.外加载荷及约束等相关信 ...

  5. 三角网格模型及基于RBF隐曲面方程求解的曲面重建

    资料来源:径向基函数和神经网络技术在逆向工程中的应用研究(博士论文:王宏涛) RBF神经网络模型 RBF神经网络起源于数值分析中多变量插值的RBF方法,1988年Broomhead等人首先将该算法应用 ...

  6. python划分有限元网格_关于有限元网格划分

    首先,研究和分析有限元网格划分的基本原则:其次,对当前典型网格划分方法进行科学地分类,结合实例,系统地分析各种网格划分方法的机理.特点及其适用范围,如映射法.基于栅格法.节点连元法.拓扑分解法.几何分 ...

  7. python网格划分_五、网格划分篇-SnappyHexMesh(之二)

    5.2背景网格(blockMesh) 背景网格(blockMesh)功能简介 blockMesh是结构化的六面体网格生成器.一般用于生成简单几何模型的结构网格,随着几何图形复杂性的增加,需要设置参数的 ...

  8. python划分有限元网格_有限元网格划分的基本原则及通用方法(有限元科技内参)...

    的划分一方面要考虑对各物体几何形状的准确描述,另一方面也要考虑变形梯度的准确描述.为正确.合理地建立有限元模型,这里介绍划分网格时应考虑的一些基本原则. (1)网格数量 网格数量直接影响计算精度和计算 ...

  9. python划分有限元网格_有限元网格划分应该考虑些什么

    我们知道有限元算法的精髓是划分网格,网格对结果有非常大的影响.目前市面上软件对复杂几何模型进行网格划分非常简单,但是用户却不得不问自己:我如何知道网格是否真的好?我需要多少单元呢?网格密度对结果会产生 ...

最新文章

  1. amos看拟合度在哪里看_小程序开发公司哪里强?看这几点
  2. Java动态代理代码案例:使用jdk自带的Proxy只能对有接口的类进行动态代理
  3. 深度学习和目标检测系列教程 6-300:目标检测Fast-RCNN架构
  4. android版本10好不好,一加正式推送Android 10系统 流畅性怎么样
  5. php mysql mvc_超简洁PHPMVC
  6. 【多题合集】线段覆盖1、2、3
  7. boost::asio async_write也不能保证一次发完所有数据 一
  8. 数据库一对多做链接去重_数据库中一对多关系的数据,放到es中如何设计
  9. Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备
  10. Atitit.基于时间戳的农历日历历法日期计算
  11. 【正点原子MP157连载】第四十四章Linux SPI总线框架-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
  12. 直流电机双闭环调速系统matlab,双闭环直流调速系统的课程设计(MATLAB仿真).pdf
  13. 武田宣布美国FDA授予ALUNBRIG® (brigatinib)作为ALK+转移性非小细胞肺癌一线治疗的补充新药申请优先审理
  14. html在div中数字时钟,在JS+CSS中如何实现滚动数字时钟
  15. Scala教程-详细全部
  16. ubuntu ftp服务器上传文件,ubuntu ftp服务器上传文件
  17. python ip地址转换
  18. BJTU1940 铁憨憨骑士团的回文对称
  19. Linux目录一个点.和两个点..的区别
  20. python1234出栈_Python语句序列“nums=set([1,2,2,3,3,3,4]);print(len(nums))”的运行结果是()。 (2.0分)_学小易找答案...

热门文章

  1. 追赶ChatGPT,我们的差距在哪里?
  2. 运动学自行车模型和动力学自行车模型
  3. 使用gparted工具扩充vmware UBUNTU虚拟机磁盘空间
  4. excel设置单元格边框线, 自适应行高
  5. switch选择结构
  6. ERP中BOM变更操作的简单操作
  7. 大趋势!Mobileye呼唤全行业大整合
  8. atom遇到的问题及解决方法
  9. 关于cmd命令提示符的复制和粘贴
  10. scratch少儿编程航天主题:模拟空间站对接