把代码输入COMSOL软件,并且修修正3个小错误,然后把几何尺寸修改成了30*30*30 um3,颗粒最大个数改成了500个。运行程序,生成了三维随机颗粒几何模型。
但是,实际生成的几何模型无法达到目标孔隙率,把颗粒最大个数修改成更大,实际孔隙率越接近目标值,但是生成过程耗时非常长。因为生成过程中颗粒的坐标位置也是随机取值,比较难形成密集堆积,需要更多的小颗粒去填充大颗粒之间的空隙。这个程序应该还有改进的可能,尽可能让颗粒坐标位置密集堆积的形式去排布。
程序代码(生成几何模型操作方法见用Deepseek做了一个随机生成锂离子电池二维多孔电极COMSOL模型):
// ========== 3D参数定义部分 ==========
// 模型参数
double ELECTRODE_WIDTH = 30; // 电极宽度 (μm)
double ELECTRODE_HEIGHT = 30; // 电极高度 (μm)
double ELECTRODE_DEPTH = 30; // 电极厚度 (μm) 新增第三维参数
double RIND = 0.5; // 边界保护层厚度 (μm)
double POROSITY = 0.3; // 目标孔隙率
// 颗粒参数
double MIN_RADIUS = 1; // 最小颗粒半径 (μm)
double MAX_RADIUS = 12.5; // 最大颗粒半径 (μm)
int number_particle = 500; // 最大颗粒数(三维需要更多颗粒)
// ========== 几何初始化部分 ==========
model.component("comp1").geom("geom1").lengthUnit("um");
// ========== 基底创建部分 ==========
// 创建三维电极基底
model.component("comp1").geom("geom1").create("base", "Block");
with(model.component("comp1").geom("geom1").feature("base"));
set("size", new double[]{ELECTRODE_WIDTH, ELECTRODE_HEIGHT, ELECTRODE_DEPTH});
// ========== 颗粒生成部分 ==========
int successCount = 0;
double totalVolume = ELECTRODE_WIDTH*ELECTRODE_HEIGHT*ELECTRODE_DEPTH;
double targetSolidVolume = totalVolume*(1-POROSITY);
double currentSolidVolume = 0;
while (successCount < number_particle && currentSolidVolume < targetSolidVolume) {
// 生成随机半径(正态分布)
double rand1 = Math.random();
double r = MIN_RADIUS+(MAX_RADIUS-MIN_RADIUS)*rand1;
r = Math.max(MIN_RADIUS, Math.min(MAX_RADIUS, r));
// 计算球体体积
double volume = (4.0/3.0)*Math.PI*r*r*r;
// 跳过超出剩余空间的颗粒
if (currentSolidVolume+volume > targetSolidVolume) continue;
// 生成随机位置(考虑三维边界保护)
double randx = Math.random();
double randy = Math.random();
double randz = Math.random();
double x = RIND+r+(ELECTRODE_WIDTH-2*(RIND+r))*randx;
double y = RIND+r+(ELECTRODE_HEIGHT-2*(RIND+r))*randy;
double z = RIND+r+(ELECTRODE_DEPTH-2*(RIND+r))*randz;
// 三维碰撞检测
boolean collision = false;
for (int i = 0; i < successCount; i++) {
String ftName = "part"+i;
double[] existPos = model.component("comp1").geom("geom1").feature(ftName).getDoubleArray("pos");
double existR = model.component("comp1").geom("geom1").feature(ftName).getDouble("r");
double dx = x-existPos[0];
double dy = y-existPos[1];
double dz = z-existPos[2];
double dist = Math.sqrt(dx*dx+dy*dy+dz*dz);
if (dist < (r+existR)) {
collision = true;
break;
}
}
// 创建三维球体颗粒
if (!collision) {
String ftName = "part"+successCount;
model.component("comp1").geom("geom1").create(ftName, "Sphere");
with(model.component("comp1").geom("geom1").feature(ftName));
set("r", r);
set("pos", new double[]{x, y, z});
successCount++;
currentSolidVolume += volume;
}
}
// ========== 后处理部分 ==========
// 计算实际孔隙率
double actualPorosity = 1-(currentSolidVolume/totalVolume);
model.param().set("actual_porosity", actualPorosity);
// 生成几何
model.component("comp1").geom("geom1").run();
按照以上操作即可生成对应的程序,此模型只适合研究几何模型生成方法,不适合直接用于做模拟计算,孔隙率离目标值差比较多。大家可以根据自己的需要修改程序。