% 功能:建立奶酪模型,在奶酪中添加一组随机分布的小孔,其半径在上限值和下限
% 值之间随机浮动。奶酪用圆柱体表示,小孔用球体表示
% 编者:小钰钰
% 日期:2020.11.23
char NUMBER_OF_HOLES = 100; % 初始化并定义奶酪内的小孔总数。
CHEESE_HEIGHT = 20.0; % 初始化并定义用于后续步骤的索引计数器。
CHEESE_RADIUS = 40.0; % 定义圆柱体奶酪的半径
RIND_THICKNESS = 0.2; % 定义奶酪最外层坚硬外皮的厚度
HOLE_MIN_RADIUS = 0.1; % 小孔的最大半径
HOLE_MAX_RADIUS = 1.0; % 小孔的最小半径
ind = 0;
hx = ones(1,1000);
hy = ones(1,1000);
hz = ones(1,1000);
hr = ones(1,1000); % 以上四步提前为变量创建空间,节省计算效率
% 将几何的长度设置为cm
model.component('comp1').geom('geom5').lengthUnit('cm');
% 创建一个新选择集,并添加标签‘Pt_surface5’和名称‘CumulativeSelection’
% 注意:若在COMSOL同一个文件中反复运行该方法,则每次运行前都要修改标签名
model.component('comp1').geom('geom5').selection().create('Pt_surface5', 'CumulativeSelection');
% 运用循环创建指定数量的孔
for ind = 1:100
% 以下三步通过调用随机方法和缩放输出来定义小孔的 xyz 坐标,使小孔的 xyz 坐标位于奶酪模型的笛卡尔坐标的外部界限之内。
hx(ind) = (2.0*rand()-1.0)*CHEESE_RADIUS;
hy(ind) = (2.0*rand()-1.0)*CHEESE_RADIUS;
hz(ind) = rand()*CHEESE_HEIGHT;
% 在规定的限值范围内定义小孔半径。
% 具体设置方法可参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
% 该网址介绍了如何得到一个两数之间的随机数
hr(ind) = rand()*(HOLE_MAX_RADIUS-HOLE_MIN_RADIUS)+HOLE_MIN_RADIUS;
% 以下使用两个if的作用:检查小孔的位置和尺寸是否会使其脱离奶酪。
% 如果是,继续执行for循环的下一次迭代,停止执行循环中的剩余代码。
if (sqrt(hx(ind)*hx(ind)+hy(ind)*hy(ind))+hr(ind)) > (CHEESE_RADIUS-RIND_THICKNESS)
continue;
end
if (hz(ind)-hr(ind)) < RIND_THICKNESS || (hz(ind)+hr(ind)) > (CHEESE_HEIGHT-RIND_THICKNESS)
continue;
end
sph = ['sph',num2str(ind)]; % 这一步很关键,将double类型的ind转化为字符型的sph
model.component('comp1').geom('geom5').create(sph, 'Sphere'); % 创建一个球体,使其名称基于当前的索引值
% 以下三步用来指定新创建球体的半径和位置。半径可以通过一个双精度数直接传递,位置必须使用双精度数组。
model.component('comp1').geom('geom5').feature(sph).set('r', hr(ind));
model.component('comp1').geom('geom5').feature(sph).set('pos',[hx(ind), hy(ind), hz(ind)]);
model.component('comp1').geom('geom5').feature(sph).set('contributeto', 'Pt_surface5');
end
% % 创建一个代表圆盘奶酪的圆柱体。并设置其半径和高度
model.component('comp1').geom('geom5').create('cyl1', 'Cylinder');
model.component('comp1').geom('geom5').feature('cyl1').set('r', CHEESE_RADIUS);
model.component('comp1').geom('geom5').feature('cyl1').set('h', CHEESE_HEIGHT);
% 建立一个布尔差集运算。要添加的对象是圆柱体,要减去的对象是所有球体的选择。
model.component('comp1').geom('geom5').create('dif1', 'Difference');
model.component('comp1').geom('geom5').feature('dif1').selection('input').set('cyl1');
model.component('comp1').geom('geom5').feature('dif1').selection('input2').named('Pt_surface5');
% 运行整个几何序列,将所有球体从圆柱体中切除,最终形成圆盘奶酪。
model.component('comp1').geom('geom5').run();
- 1
- 2
前往页