当前位置: 首页 > backend >正文

Python读取comsol仿真导出数据并绘图

文章目录

    • comsol数据导出
    • python读取文件
    • python绘制云图
    • python进一步分析数据
  • 完整代码

当我们使用comsol,ansys等仿真工具进行仿真后,难免需要对仿真结果进行导出并进一步处理分析。

今天小姜以comsol的一个简单磁场仿真为例,详细介绍如何对comsol仿真数据进行导出并在python中处理,绘制云图:

comsol数据导出

以一个简单的矢量磁位预测为例,在导出模块右键新建“数据”项
在这里插入图片描述
选择相应导出内容和导出文件位置后导出数据为txt文本格式。博主选择导出数据为区域的矢量磁位Az,位置为D盘
在这里插入图片描述
导出后可以看到txt文件格式如下,前几行为描述文件信息的注释行。

在这里插入图片描述

python读取文件

得到如上格式的txt文件后,首先我们在读取时需要先跳过前面的注释行

    with open(path, 'r') as f:lines = f.readlines()# 过滤掉以%开头的行,并去掉空行data_lines = [line for line in lines if not line.startswith('%')  and line.strip()]# 转换为NumPy数组data = np.array([[float(num) for num in line.split()] for line in data_lines])

将坐标和对应Az读取到numpy格式的data变量中后还需要整理为x坐标y坐标,Az值三个变量,以便云图绘制

# 提取各列数据x = data[:, 0]y = data[:, 1]mf_az = data[:, 2]

由于导出数据可能存在计算的奇异点等错误数据,所以还需要排除掉值为NaN的点

# 去掉值为NaN的点valid_indices = ~np.isnan(mf_az)x = x[valid_indices]y = y[valid_indices]mf_az = mf_az[valid_indices]

当然这样的x,y和az并不能直接用matplotlib进行云图绘制,因为这些坐标点并不是规则的网格而是仿真软件的网格剖分得到的不规则点。我们使用scipy对这些网格进行插值,转化为规则的网格点后才能绘制。

# 创建规则网格xi = np.linspace(min(x), max(x), 300)yi = np.linspace(min(y), max(y), 300)Xi, Yi = np.meshgrid(xi, yi)# 插值到规则网格(Cubic表示三次多项式插值)zi = griddata((x, y), mf_az, (Xi, Yi), method='cubic')

python绘制云图

获得了规则网格和对应值,使用imshow即可画热力图

# 绘制热力图plt.imshow(zi, extent=[min(x), max(x), min(y), max(y)], origin='lower', cmap='jet')plt.colorbar(label='mf.AZ (Wb/m)')plt.xlabel('x (m)')plt.ylabel('y (m)')plt.title('Heatmap of mf.AZ')plt.show()

在这里插入图片描述

python进一步分析数据

我们导出的数据为矢量磁位,根据磁有关的基础知识,A的旋度为磁场,二维可以表示为

H x = ∂ A z ∂ y H_x= \frac{\partial A_z}{\partial y} Hx=yAz H y = − ∂ A z ∂ x H_y= -\frac{\partial A_z}{\partial x} Hy=xAz

使用numpy自带的求导功能求导并绘制矢量图:

    skip = 10 #避免箭头过密,设置绘制间隔#计算导数Zy, Zx = np.gradient(zi, yi, xi)# 绘制磁场矢量图plt.figure(figsize=(8, 6))quiver = plt.quiver(Xi[::skip, ::skip], Yi[::skip, ::skip], Zy[::skip, ::skip], -Zx[::skip, ::skip],cmap='rainbow')plt.colorbar(quiver, label='Magnetic Field Magnitude')plt.title('Magnetic Field Vector Plot')plt.xlabel('x')plt.ylabel('y')plt.grid()plt.show()

对应区域磁场

完整代码

def read_comsol(path):""":param path: 仿真导出数据文件的路径:return: 无输出"""with open(path, 'r') as f:lines = f.readlines()# 过滤掉以%开头的行,并去掉空行data_lines = [line for line in lines if not line.startswith('%')  and line.strip()]# 转换为NumPy数组data = np.array([[float(num) for num in line.split()] for line in data_lines])# 提取各列数据x = data[:, 0]y = data[:, 1]mf_az = data[:, 2]# 去掉值为NaN的点valid_indices = ~np.isnan(mf_az)x = x[valid_indices]y = y[valid_indices]mf_az = mf_az[valid_indices]# 创建规则网格xi = np.linspace(min(x), max(x), 300)yi = np.linspace(min(y), max(y), 300)Xi, Yi = np.meshgrid(xi, yi)# 插值到规则网格zi = griddata((x, y), mf_az, (Xi, Yi), method='cubic')# 绘制热力图plt.imshow(zi, extent=[min(x), max(x), min(y), max(y)], origin='lower', cmap='jet')plt.colorbar(label='mf.AZ (Wb/m)')plt.xlabel('x (m)')plt.ylabel('y (m)')plt.title('Heatmap of mf.AZ')plt.show()skip = 10#计算导数Zy, Zx = np.gradient(zi, yi, xi)# 绘制磁场矢量图plt.figure(figsize=(8, 6))quiver = plt.quiver(Xi[::skip, ::skip], Yi[::skip, ::skip], Zy[::skip, ::skip], -Zx[::skip, ::skip])plt.colorbar(quiver, label='Magnetic Field Magnitude')plt.title('Magnetic Field Vector Plot')plt.xlabel('x')plt.ylabel('y')plt.grid()plt.show()
http://www.xdnf.cn/news/3839.html

相关文章:

  • 【操作系统】哲学家进餐问题
  • 【前缀和】和为 K 的连续子数组
  • 软件检测价格受多种因素影响,你了解多少?
  • 【SAP】FISL的应用
  • 2023华为od机试C卷【跳格子3】
  • 高维亚空间超频物质变压缩技术 第27次CCF-CSP计算机软件能力认证
  • 《应用开发突围指南:敏捷开发的实战精髓》
  • 2001-2021年各城市平均风速数据(可作工具变量)
  • INP指标
  • 【C++贪心 图论】P7903兜心の顶|普及
  • 【算法刷题笔记day one】滑动窗口(定长基础版)
  • Java 反序列化
  • Mybatisplus:一些常用功能
  • ReentrantLock
  • C语言-回调函数
  • 大客户销售大客户营销50个常见概念及其英文表达。AI大客户销售B2B大客户营销关键概念集合
  • 全参数解读Qwen 3 系列模型 + 本地部署实操 + 多维度能力深度测评
  • 计算机总线系统入门:理解数据传输的核心
  • 动态功耗与静态功耗
  • 从零开始理解 C++ 后端编程中的分布式系统
  • Runnable组件重试机制降低程序错误率
  • 深度解析ComfyUI的使用
  • Linux常用命令29——delgroup删除组
  • Spring IoC 注解式开发全解析
  • Java面试资源获取
  • vmware diffy配置ollama 本机ip无法访问
  • AI 大模型常见面试题(及内容解析)
  • ip和域名
  • BUUCTF——禁止套娃
  • 【Hot 100】94. 二叉树的中序遍历