

把代码输入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();
按照以上操作即可生成对应的程序,此模型只适合研究几何模型生成方法,不适合直接用于做模拟计算,孔隙率离目标值差比较多。大家可以根据自己的需要修改程序。