COMSOL干热岩-地热THM耦合
COMSOL桌面突然弹出一个未保存的模型——这已经是我这周第三次遇到岩层裂缝扩展不收敛的问题了。盯着屏幕上红彤彤的报错提示,突然意识到搞干热岩THM耦合仿真就像在虚拟地底玩俄罗斯方块,得把热力场(T)、渗流场(H)、应力场(M)三个模块严丝合缝地拼在一起。
先看几何建模这个基础操作。在COMSOL里建双井系统时,代码往往长得像这样:
geo = model.geom.create("geo", 3) geo.create("inj_well", "Cylinder").set("r", 0.15) geo.create("prod_well", "Cylinder").set({"r":0.15, "pos":[200,0,0]})这两个直径0.15米、间距200米的圆柱体,实际项目中可能需要微调位置参数十几次才能避开天然裂隙带。有次我把Z轴坐标多打了个零,直接造出个"穿越地心"的井筒,被导师调侃说这是要开发地核能源。
材料参数设定才是真正的重头戏。花岗岩的热膨胀系数经常让新手栽跟头:
granite = model.material.create("granite") granite.property("thermal_expansion", "3.5e-5[1/K]") # 关键参数! granite.property("youngs_modulus", "55[GPa]")这个3.5e-5要是手滑写成3.5e-6,整个应力场计算结果会像漏气的皮球完全撑不起来。有次组会汇报,某师弟的应力云图呈现诡异的蓝色,原来是把杨氏模量单位错标为MPa,相当于用橡皮泥代替花岗岩做模型。
耦合设置环节最考验物理直觉。当把达西定律模块拖进工作区时,记得打开双向耦合开关:
model.physics("SinglePhaseFlow").feature("spf1").set("thm_coupling", "on") model.physics("SolidMechanics").feature("sml1").set("thermal_strain", "on")这就像同时按下微波炉的加热和转盘开关——孔隙压力变化会影响岩石变形,而变形又会反过来改变渗透率。某次忘记勾选热应变选项,得到的温度场分布规律居然和教科书案例完全相反,害得我通宵排查才发现这个隐藏选项。
求解器配置藏着魔鬼细节。当看到控制台跳出"Maximum number of Newton iterations reached"时,别急着砸键盘,试试调整:
model.solver("s1").feature("st1").set("maxiter", 50) model.solver("s1").feature("st1").set("damping", "adaptive")这相当于给数值计算加了缓冲气垫。记得去年做注水压力敏感性分析,默认的20次迭代根本不够用,把maxiter调到100后,原先震荡的发散曲线突然变得比德芙还丝滑。
后处理阶段总能发现惊喜。用切割线功能提取井间路径上的温度数据时:
model.result().dataset("csw1").set("genpoints", 500) model.result().numerical("eval1").set("expr", "T")500个采样点能清晰捕捉到热锋面的突进过程。有组数据特别有趣:当注入水温从80℃升到120℃时,热应力引发的裂缝扩展速度呈现先加速后骤降的过山车曲线,后来查文献发现这是岩石发生了脆-延转变。
保存模型时突然跳出内存不足的警告——得,又该去实验室给工作站清灰了。THM耦合仿真正如现实中的干热岩开发,每个参数都牵一发而动全身,但当你看到渗流场与温度场的流线图完美交织时,那种满足感堪比在数模世界里找到了新能源的圣杯。