学习1:https://blog.csdn.net/jessica0307/article/details/105444407
学习2:https://blog.csdn.net/jessica0307/article/details/105451892
趁热打铁,继续用livelink for MATLAB生成随机几何。COMSOL官网博客上介绍了如何使用APP来构建奶酪的几何模型,基于Java脚本语言
http://cn.comsol.com/blogs/how-to-create-a-randomized-geometry-using-model-methods/
这里用MATLAB重新写一下
function out = cheese
%
% cheese.m
%
% Model created on Apr 11 2020, by COMSOL 5.5.
import com.comsol.model.*
import com.comsol.model.util.*
model = ModelUtil.create('Cheese');
model.component.create('comp1', true); % 生成组件1
model.component('comp1').geom.create('geom1', 3); % 生成3D几何
model.component('comp1').mesh.create('mesh1'); % 生成网格
%奶酪中的小孔初始化参数
number_of_hols = 10; %初始化并定义奶酪内的小孔总数
ind = 0; %初始化并定义用于后续步骤的索引计数器
Pos = zeros(1,3);
hr = 0.0; %每个小孔的 xyz 位置和半径。
%定义奶酪的高度、半径、环线粗细以及小孔的最大和最小半径
h_cheese = 20.0;
r_cheese = 40.0;
thickness = 0.2;
rmin_hole = 0.1;
rmax_hole = 1.0;
model.component('comp1').geom('geom1').lengthUnit('cm'); %将几何的长度单位设置为 cm
model.component('comp1').geom('geom1').selection().create('csel1', 'CumulativeSelection'); %创建一个新选择集,并添加标签 csel 和名称 CumulativeSelection。
while (ind < number_of_hols) %初始化 while 循环,创建指定数量的孔
Pos(1) = (2.0*rand-1.0)*r_cheese; %通过调用随机方法和缩放输出来定义小孔 坐标,使小孔位于奶酪模型的外部界限之内。
Pos(2) = (2.0*rand-1.0)*r_cheese;
Pos(3) = rand*h_cheese;
hr = rand*(rmax_hole-rmin_hole)+rmin_hole; %在规定的限值范围内定义小孔半径
if ((sqrt(Pos(1)^2+Pos(2)^2)+hr) > r_cheese-thickness)
continue;
end %检查小孔的位置和尺寸是否会使其脱离奶酪。
if (((Pos(3)-hr) < thickness) || ((Pos(3)+hr) > h_cheese-thickness))
continue;
end
sph = ['sph',num2str(ind)];
model.component('comp1').geom('geom1').create(sph, 'Sphere'); %创建一个球体,使其名称基于当前的索引值
model.component('comp1').geom('geom1').feature(sph).set('r', hr); %指定新创建球体的半径和位置。
model.component('comp1').geom('geom1').feature(sph).set('pos', Pos);
model.component('comp1').geom('geom1').feature(sph).set('contributeto', 'csel1'); %指定此球体特征属于名为 csel1 的选择集的一部分
ind = ind + 1;
end
model.component('comp1').geom('geom1').create('cyl1', 'Cylinder'); %创建一个代表圆盘奶酪的圆柱体
model.component('comp1').geom('geom1').feature('cyl1').set('r', r_cheese);
model.component('comp1').geom('geom1').feature('cyl1').set('h', h_cheese);
model.component('comp1').geom('geom1').create('dif1', 'Difference'); %建立一个布尔差集运算。要添加的对象是圆柱体,要减去的对象是所有球体的选择
model.component('comp1').geom('geom1').feature('dif1').selection('input').set('cyl1');
model.component('comp1').geom('geom1').feature('dif1').selection('input2').named('csel1');
model.component('comp1').geom('geom1').run(); %运行整个几何序列,将所有球体从圆柱体中切除,最终形成圆盘奶酪
model.component('comp1').view('view1').set('transparency', true);
mphgeom(model,'geom1');
mphsave(model,'cheese');
out = model;