学习心得:使用 Comsol 5.6 with Matlab 构建自动仿真模型
文章目录
前言
随着机器学习和深度学习等技术的不断发展,传统学科与 AI 的交叉融汇也越来越多,例如用AI计算复杂的数学物理方程、用AI筛选最优的材料配方、用AI优化器件结构等等。本文将介绍如何使用 Comsol with Matlab 构建用于AI训练的数据集。个人水平有限,请看客多多指教。
一、Comsol 5.6 with Matlab 是什么?
Comsol 是一款功能强大的多物理场仿真软件,其广泛应用于不同工程领域的设备、结构件、工艺流程等的仿真模拟,对学术研究、公司的降本增效等起到重要的作用。但是Comsol 对于数量众多的模型构建及计算则显得不太方便,尤其是当需要构建数量庞大的数据集,更不可能由人工机械地逐一完成。因此该公司推出了Comsol with Matlab 联合仿真工具,它允许两者进行无缝集成,用户可以使用一些常用的API完成各种任务,并且也可在 matlab 中设置自动调参、建模、计算等步骤,极大方便用户的使用。
二、操作步骤
1.Comsol模型构建
我们仿真的对象是墨水屏上的一个像素单元,其具体叠层结构包括:衬底层、TFT像素电极、介电层、微封装层、公共电极层等。我们要仿真的内容是像素单元不同结构参数、材料参数以及驱动方式对电场变化的影响关系。因此“研究”选项选择的是静电场,“研究步骤”选择“稳态”即可。下图展示使用Comsol自带的几何功能绘制的像素单元模型。
选择用Comsol自带的几何功能绘制模型的好处是:后续在 matlab 中代码的可读性,以及修改起来会更加方便。如果导入CAD 的 dxf 文件则不能那么随意地修改模型的结构参数。
然后接下来的“材料”“静电”模块则根据自己的需求进行参数的设置及修改,这里将不再赘述。
下图展示了仿真出来的电势分布
然后在“结果”——“导出”选项导出“数据”,导出数据的表达式和输出类型根据自己的需求修改。
至此,便完成了使用Comsol构建一个像素单元仿真模型的全部步骤。
2.导入Matlab
将由 Comsol 构建的模型文件导入 matlab 中:选择“文件”——“另存为”,保存类型选择.m文件。这一步骤可以快捷地实现模型文件与 matlab 代码的转换,对于初学者比较友好。
打开 LiveLink for Matlab (具体步骤可自行百度),然后打开由上一步骤生成的.m文件(打不开是因为LiveLink没有正常启动)。稍微阅读一下,会发现 Matlab 中的代码是和由 Comsol 构建的模型保持一致的。
往下拖动代码,至 out = model; 出。调用model.param函数,然后定义参数(这里我以参数“a”为例),设置其参数变化范围(例如10:5:80),然后遍历以上参数范围进行自动计算,并导出仿真结果(csv格式)。导出的数据类型及格式需要根据自己的需求进行修改。
- 计算表达式修改代码如下:
model.result.export('data1').set('expr', {'es.Ex' 'es.Ey' 'es.Ez'});
- 结果导出的文件名字修改代码如下:
model.result.export('data1').set('filename',sprintf('E_%d.csv', parameterValues(ii)));
全部代码展示如下:
filepath='E:\20231024Journal paper_2\comsol with matlab test';
mphsave(model,'test_9.mph'); %保存为mph模型文件
model.hist.disable; %压缩历史痕迹
%----------------------matlab修改comsol参数部分-----------------------------------------
% Load or create the model
model = mphload('test_9.mph');
% Get the parameter object
param = model.param();%调用model.param函数,并赋值给param
% Define the parameter
parameter = 'a';
parameterValues = 10:5:80; %设置参数范围:(起始:步长:终止)
parameterName = 'cross_length';
% model.param.set('a', '5[um]', 'cross_width');
% Loop through parameter values and export results
for ii = 1:length(parameterValues)
% Set parameter value
param.set(parameter, parameterValues(ii),parameterName);
% Solve the model
model.study('std1').run();
model.result.export('data1').set('expr', {'es.Ex' 'es.Ey' 'es.Ez'});
model.result.export('data1').set('unit', {'V/m' 'V/m' 'V/m'});
model.result.export('data1').set('descr', {[native2unicode(hex2dec({'75' '35'}), 'unicode') native2unicode(hex2dec({'57' '3a'}), 'unicode') native2unicode(hex2dec({'ff' '0c'}), 'unicode') 'x ' native2unicode(hex2dec({'52' '06'}), 'unicode') native2unicode(hex2dec({'91' 'cf'}), 'unicode') ] [native2unicode(hex2dec({'75' '35'}), 'unicode') native2unicode(hex2dec({'57' '3a'}), 'unicode') native2unicode(hex2dec({'ff' '0c'}), 'unicode') 'y ' native2unicode(hex2dec({'52' '06'}), 'unicode') native2unicode(hex2dec({'91' 'cf'}), 'unicode') ] [native2unicode(hex2dec({'75' '35'}), 'unicode') native2unicode(hex2dec({'57' '3a'}), 'unicode') native2unicode(hex2dec({'ff' '0c'}), 'unicode') 'z ' native2unicode(hex2dec({'52' '06'}), 'unicode') native2unicode(hex2dec({'91' 'cf'}), 'unicode') ]});
model.result.export('data1').set('filename',sprintf('E_%d.csv', parameterValues(ii)));
model.result.export('data1').set('location', 'grid');
model.result.export('data1').set('gridx3', 'range(0,1,100)');
model.result.export('data1').set('gridy3', 'range(0,1,100)');
model.result.export('data1').set('gridz3', 'range(4,1,44)');
model.result.export('data1').set('separator', ',');
model.result.export('data1').run;
disp(['已完成:', num2str(ii/length(parameterValues) * 100), '%']); %提示完成百分比
end
至此,便完成了 Comsol with Matlab 模型的自动调参、计算及结果导出。
3.使用Python进行数据格式修改
由 Comsol with Matlab 导出的数据格式需要进行适当的修改,我们可以用Python写一小段代码完成。这里我对其中的单位进行了统一,然后增加了将x,y,z的电场模分量进行了平方和开根号,然后在第一列增加了一行标签。使用者也可以根据自己的需求,对csv数据进行任意的修改。
相关python带码展示如下:
import pandas as pd
import numpy as np
import os
from glob import glob
"""
这部分代码的工作内容是:将从comsol自动生成的csv仿真数据,转换成合适的格式,供particle_motion_simulation模块调用
注意:使用os.remove 后文件将不会保留,不会进入回收站
"""
def process_csv(input_file, output_file):
# # 读取CSV文件
# with open(input_file, 'r', encoding='utf-8') as f:
# for i in range(9):
# line = f.readline()
# print(f"Line {i + 1}: {line}")
df = pd.read_csv(input_file, encoding='utf-8', skiprows=range(9))
print(f'成功读取csv')
# 删除1-8行
# df = df.iloc[8:,0:6]
df[7] = np.sqrt(df.iloc[:, 3] ** 2 + df.iloc[:, 4] ** 2 + df.iloc[:, 5] ** 2)
# 对x,y,z坐标除以1e6,换算成单位m
df.iloc[:, 0:3] /= 1e6
# 在第一行插入新的列名
df.columns = ['x', 'y', 'z', 'es.Ex (V/m)', 'es.Ey (V/m)', 'es.Ez (V/m)', 'E(V/m)']
# 保存处理后的数据到新的CSV文件
df.to_csv(output_file, index=False, encoding='utf-8')
def process_folder(folder_path):
# 获取文件夹中所有以'E_'开头且以'.csv'结尾的文件
files = glob(os.path.join(folder_path, 'E_*.csv'))
for file in files:
# 构造输出文件名,例如,将 E_1.csv 转换为 output_E_1.csv
output_file = file.replace('E_', 'output_E_')
# 执行处理
process_csv(file, output_file)
os.remove(file) # 注意:使用os.remove 后文件将不会保留,不会进入回收站!
# 指定包含csv文件的文件夹路径
folder_path = r'E:\20231024Journal paper_2\IPS-EPD_simulation_model'
# 执行处理文件夹中的所有文件
process_folder(folder_path)
总结
以上就是关于 Comsol 5.6 with Matlab 构建仿真模型的内容了。Comsol with matlab 联合仿真软件可以用来实现大批量重复性的仿真工作,使用者可以根据自己需求修改其中的参数、计算内容、结果导出等内容。并且 matlab 的.m文件与 Comsol 导出的.mph文件是一一对应的,使用者可以通过另存为.m文件,减少代码部分的编写工作,并学习.m文件的修改操作。最后,使用者可以通过 Python 对matlab 导出的数据根据自己的需求进行批量修改,以用于下一步骤AI 数据集的生成操作。