学习心得:使用 Comsol 5.6 with Matlab 构建自动仿真模型

学习心得:使用 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格式)。导出的数据类型及格式需要根据自己的需求进行修改。

  1. 计算表达式修改代码如下:
model.result.export('data1').set('expr', {'es.Ex' 'es.Ey' 'es.Ez'});
  1. 结果导出的文件名字修改代码如下:
 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 数据集的生成操作。

  • 32
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值