简介:Y-Geo是一个开源的连续-非连续介质耦合力学仿真平台,核心算法基于有限离散元法(FDEM),专为岩石破裂、材料损伤演化、岩土结构失稳等场景建模设计。配套图形界面Y-GUI V3.0.0提供独立可执行文件,支持Windows系统下的前处理建模、材料参数配置、网格划分、任务提交及计算结果可视化(如位移场、裂纹扩展路径、应力分布)。资源包内含全部源代码(src)、头文件(include)、跨平台构建脚本(SConstruct和Makefile)、编译输出目录(build)、用户操作手册(YManual.doc)、版权说明(Copyright.pdf)以及测试用例(test.dat)。支持本地编译与二次开发,需预先安装SCons构建工具及对应C++编译环境。适用于高校科研、工程模拟教学及岩土/材料方向的数值方法验证工作。
1. 项目概述:一个真正能“跑起来”的断裂力学仿真工具包
你有没有试过下载一个标着“开源”“完整源码”“含GUI”的力学仿真项目,解压后面对满屏的.cpp、.h、SConstruct和test.dat发呆?点开YManual.doc,第一页写着“本软件基于FDEM理论构建”,第二页就开始列偏微分方程——而你的编译器连第一个#include <ygeo/core/fdem_solver.h>都报红?这不是你的问题,是绝大多数断裂力学仿真资源的真实现状:理论很硬核,代码很完整,但“可运行性”被默认交给了用户自己去填坑。Y-Geo断裂力学仿真开发包,恰恰是为解决这个痛点而生的。它不是一份仅供阅读的论文附录代码,而是一个从源码到可执行、从前处理到后处理、从Windows桌面双击启动到命令行调试复现,全程闭环可控的工程级工具包。核心关键词——Y-Geo、FDEM、断裂模拟、Y-GUI、力学仿真——不是标签,而是你每天会真实操作的对象:Y-Geo是那个在后台默默求解裂纹尖端应力奇异性、判断单元是否断裂、更新接触力的计算引擎;FDEM(有限离散元法)不是教科书里的抽象概念,而是你在src/solver/fdem_integrator.cpp里逐行调试的显式时间积分逻辑;Y-GUI V3.0.0不是截图里的漂亮界面,而是你双击Y-GUI.exe后弹出的、能拖拽生成不规则岩体模型、右键设置节理面摩擦角、一键导出.geo网格文件的生产力工具。它专为岩石力学、岩土工程、脆性材料损伤演化等场景设计,意味着它的默认参数(如拉伸强度阈值、断裂能Gc、接触刚度比)不是通用塑料的数值,而是按花岗岩、砂岩、混凝土的典型实验室数据预设的;它的裂纹扩展判据不是简单的最大主应力准则,而是融合了Griffith能量释放率与Mohr-Coulomb剪切滑移的混合断裂模型。如果你是高校研究生,正为毕业论文里“模拟某边坡在降雨入渗下的渐进式破坏”发愁;如果你是岩土工程师,想快速验证一种新型锚固结构对裂隙岩体稳定性的提升效果;或者你只是个对“石头怎么裂开”有执念的编程爱好者——这个包就是为你准备的。它不要求你先成为计算力学博士,但承诺给你一条清晰的路径:装好环境 → 编译成功 → 运行测试用例 → 修改材料参数 → 导入自己的CAD轮廓 → 看见第一条真实的、蜿蜒的、符合物理直觉的裂纹路径。这才是“开源仿真工具”该有的样子:不炫技,不设障,只管让你的模型跑起来。
2. 核心原理与架构设计:为什么是FDEM,而不是纯FEM或纯DEM?
要真正用好Y-Geo,绕不开一个根本问题:为什么选择有限离散元法(FDEM)作为核心算法框架?这绝非为了术语新颖,而是由断裂问题本身的物理本质决定的。我们先拆解一个典型场景:一块含天然节理的岩体,在上覆压力和侧向构造应力作用下,如何发生起裂、扩展、贯通并最终失稳?纯有限元法(FEM)擅长描述连续介质的弹性/塑性变形,但它有个致命短板——当单元内部出现裂纹时,标准FEM单元无法自然“断开”,你得手动插入界面单元或采用内聚力模型(CZM),而这需要预先知道裂纹路径,属于“预言式建模”,对未知的、多路径竞争的自发破裂完全失效。反过来,纯离散元法(DEM)把岩体看作一堆刚性块体,靠接触力传递相互作用,它天生适合模拟大位移、块体翻滚,但对岩块内部的连续应力场、微裂纹萌生这些前兆信息无能为力。FDEM,正是站在巨人肩膀上的务实融合:它把连续介质离散为大量三角形(2D)或四面体(3D)有限元,每个单元在未断裂前遵循线弹性本构;一旦单元某条边上的应力状态满足断裂判据(比如该边的张应力超过抗拉强度),这条边就“断裂”,变成两个独立节点间的接触对——此时,该区域的力学行为立刻切换为离散元模式,允许相对滑动、转动和分离。整个过程无需预设裂纹,裂纹路径由计算自动涌现。Y-Geo的源码结构完美映射了这一思想:src/mesh/目录下是稳健的Delaunay三角剖分器,确保初始网格质量;src/material/里brittle_elastic.cpp定义了拉伸/压缩不同的本构响应;而真正的魔法在src/solver/fdem_solver.cpp——这里的时间步进循环里,每一步都包含三个不可省略的阶段:1)连续求解:组装全局刚度矩阵,求解节点位移;2)断裂检测:遍历所有单元边,计算其法向/切向应力,调用fracture_criterion.cpp中的混合判据(Griffith能量释放率R ≥ Gc 且 Mohr-Coulomb剪应力τ ≥ c + σₙ·tanφ);3)离散重构:对判定断裂的边,动态创建新的接触对,并更新接触搜索树(src/contact/bounding_volume_hierarchy.cpp)。这种“连续-非连续”动态切换的架构,直接决定了Y-Geo的适用边界:它不适合模拟金属的延性断裂(那需要晶体塑性),也不适合模拟流体渗流(那是CFD的事),但它对岩石劈裂、混凝土梁三点弯曲、页岩水力压裂这类强非连续、弱连续耦合的问题,精度和效率达到了极佳平衡。你可能会问:为什么不用更热门的XFEM或Phase-field?答案很实在——XFEM的增强函数实现复杂,对不规则几何适应性差;Phase-field需要极细网格解析损伤带,计算成本呈指数增长。而FDEM在Y-Geo中通过精巧的“边断裂”机制,用最接近物理直觉的方式,以可接受的计算代价,给出了工程上足够可信的结果。这也是为什么它的默认测试用例test.dat不是简单的单边缺口梁,而是一个含两条交叉节理的岩盘受压模型——它从第一天起,就瞄准了真实地质体的复杂性。
3. 构建环境与源码结构深度解析:从SConstruct到build目录的每一处细节
拿到资源包,第一眼看到的可能是SConstruct和Makefile并存,这容易让人困惑:到底该用哪个?答案是:优先用SConstruct,Makefile是为兼容老旧Linux环境留的备选。SCons是一个基于Python的跨平台构建工具,它比Make更懂C++项目的依赖关系。打开SConstruct文件,你会看到几处关键配置,它们直接决定了你能否顺利编译出Y-Geo.exe和Y-GUI.exe:
# SConstruct 关键片段解析
env = Environment(
tools=['default', 'mingw'], # Windows下强制使用MinGW工具链,避免MSVC的ABI兼容问题
CPPPATH=['#include', '#src'], # 头文件搜索路径,#表示项目根目录
LIBPATH=['#build/lib'], # 链接库路径,指向build目录下的lib子目录
CPPDEFINES={'_CRT_SECURE_NO_WARNINGS': None}, # 关闭Windows安全警告,避免大量编译噪音
)
# 定义核心库:ygeo_core
ygeo_core = env.StaticLibrary(
target='#build/lib/libygeo_core.a',
source=env.Glob('src/core/*.cpp') + env.Glob('src/mesh/*.cpp') + ... # 明确列出所有源文件
)
# 定义GUI可执行文件:依赖ygeo_core库和Qt5
ygui_exe = env.Program(
target='#build/bin/Y-GUI.exe',
source=['src/gui/main.cpp'] + env.Glob('src/gui/*.cpp'),
LIBS=['ygeo_core', 'Qt5Core', 'Qt5Widgets', 'Qt5Gui'],
LIBPATH=['#build/lib', 'C:/Qt/5.15.2/mingw81_64/lib'] # Qt库路径需根据你本地安装位置修改!
)
这段脚本揭示了构建的底层逻辑:Y-Geo不是单体程序,而是分层架构。ygeo_core.a是纯计算内核,不依赖任何GUI库,只做数学运算;Y-GUI.exe是外壳,负责调用内核API并呈现界面。这种分离让你可以轻松实现“无头计算”——比如写个Python脚本,用ctypes加载libygeo_core.a(需先转成DLL),批量跑参数敏感性分析,完全不启动GUI。build目录是构建产物的唯一出口,它的结构必须严格遵循:
- build/bin/:存放所有可执行文件(Y-GUI.exe, Y-Geo.exe)和动态链接库(ygeo_core.dll)
- build/lib/:存放静态库(libygeo_core.a)和导入库(ygeo_core.lib)
- build/obj/:存放所有中间目标文件(.o),这是调试的关键——当你修改了fdem_solver.cpp并重新编译,只有它对应的.o被重生成,其他文件复用缓存,极大加速迭代。
src目录的组织体现了工程化思维:
- src/core/:核心算法骨架,如simulation_controller.h定义了整个仿真的生命周期(初始化→前处理→求解循环→后处理→退出)
- src/mesh/:包含delaunay_triangulator.cpp(健壮的三角剖分)和mesh_refiner.cpp(自适应网格加密,裂纹尖端自动加细)
- src/solver/:fdem_integrator.cpp是心脏,其中explicit_time_integration()函数实现了中心差分法,时间步长Δt不是固定值,而是由critical_time_step()动态计算:Δt = 0.7 * √(ρ·h²/E),其中ρ是密度,h是最小单元特征尺寸,E是杨氏模量——这个公式保证了显式求解的数值稳定性,也是为什么Y-Geo对网格质量如此敏感。
- src/gui/:main_window.cpp里onRunSimulationClicked()槽函数,会将界面上设置的所有参数(材料、边界条件、求解步数)序列化为一个SimulationConfig对象,然后调用ygeo_core::run_simulation(config),完成GUI与内核的干净解耦。
提示:首次构建失败最常见的原因是Qt路径错误。请务必检查
SConstruct中LIBPATH指向的Qt安装路径是否真实存在,且版本匹配(Y-GUI V3.0.0要求Qt 5.15.2或5.12.12,不支持Qt6)。一个快速验证方法:在命令行运行scons -Q(-Q参数减少冗余输出),观察最后几行是否出现Linking Y-GUI.exe。如果卡在Compiling src/gui/main.cpp,大概率是Qt头文件找不到,此时应检查CPPPATH是否包含了C:/Qt/5.15.2/mingw81_64/include。
4. Y-GUI V3.0.0图形界面实操指南:从建模到可视化的全流程拆解
双击Y-GUI.exe,你看到的不是一个花哨但空洞的界面,而是一个为断裂仿真深度定制的工作台。它的每一个按钮、每一个对话框,背后都对应着Y-Geo内核的一个关键功能模块。我们以一个经典案例——“含单条节理岩体单轴压缩试验”为例,走一遍完整流程:
4.1 前处理建模:不只是画个矩形
启动后,点击【文件】→【新建项目】,弹出NewProjectDialog。这里的关键是坐标系与单位制:Y-GUI默认使用米(m)为单位,这意味着你输入的“岩体宽度1.0”,就是1米实体;所有材料参数(如杨氏模量70GPa)也必须按国际单位制输入。接着进入【几何建模】标签页。Y-GUI提供两种建模方式:
- 草图绘制:用鼠标左键点击定义顶点,右键闭合多边形。这不是简单连线,而是调用src/mesh/delaunay_triangulator.cpp实时生成约束Delaunay三角网。重点在于【添加节理】按钮:点击后,鼠标变成十字光标,在岩体内部任意两点间拖拽,即可创建一条无限长的直线节理。Y-GUI会自动将其离散为一系列短节理段,并在网格生成时确保所有三角形单元边不与节理相交——这是FDEM能准确模拟节理滑移的前提。
- CAD导入:支持.dxf格式。导入后,Y-GUI会智能识别图层,将标注为JOINT的图层自动识别为节理,BOUNDARY图层识别为外部边界。这让你能直接用AutoCAD绘制复杂地质构造。
4.2 材料与参数设置:让物理定律真正生效
切换到【材料属性】页,你会看到一个树状结构:
- 基质材料(Matrix):对应完整岩石,需设置密度ρ、杨氏模量E、泊松比ν、抗拉强度σₜ、抗压强度σ꜀、断裂能Gc。注意:Gc(单位J/m²)是控制裂纹扩展阻力的核心参数,花岗岩典型值约100,而页岩可能低至5。
- 节理材料(Joint):单独设置法向刚度Kₙ、切向刚度Kₛ、粘聚力c、内摩擦角φ、残余摩擦角φᵣ。这里Kₙ/Kₛ比值至关重要——若设为1000,节理几乎不可压缩但易剪切滑动;若设为1,则节理像软泥一样。
注意:Y-GUI不会阻止你输入明显违背物理常识的参数(如σₜ > σ꜀),但内核会在运行时校验。例如,当
σₜ被设为0时,程序会自动禁用拉伸断裂判据,只保留剪切滑移,这正是模拟“纯剪切破坏岩体”的正确方式。
4.3 网格划分与边界条件:精度与效率的平衡术
点击【网格生成】,弹出对话框。关键参数有三:
- 最大单元尺寸(Max Element Size):全局控制,值越小网格越密,计算越慢。
- 节理加密系数(Joint Refinement Factor):这是Y-GUI的独门技巧。设为3.0,意味着节理两侧各3倍单元尺寸范围内的网格,会被自动加密一倍。这确保了裂纹尖端有足够分辨率,又避免全域过度细化。
- 边界条件:在【载荷设置】页,选择“顶部边线”,类型设为“位移控制”,Y方向位移设为-0.001(即向下压缩1mm)。千万别选“力控制”——FDEM显式求解对载荷突变极其敏感,位移控制才能获得稳定收敛的载荷-位移曲线。
4.4 计算任务提交与结果可视化:看见裂纹如何生长
点击【运行仿真】,进度条开始推进。后台实际发生了什么?Y-GUI调用ygeo_core::run_simulation(),内核启动显式时间积分循环。每100步,内核会将当前所有节点位移、应力、单元状态(是否断裂)写入build/results/step_00100.dat二进制文件。计算完成后,自动切换到【结果可视化】页。这里没有华而不实的动画,而是扎实的三种视图:
- 位移云图:用彩虹色显示X/Y方向合成位移,直观看出哪里变形最大。
- 应力云图:显示Mises等效应力,红色高应力区往往是裂纹起始点。
- 裂纹路径图:这才是精华!Y-GUI会读取所有已断裂的单元边,按断裂时间顺序连接,生成一条彩色轨迹线——深蓝代表最早断裂的边,红色代表最新断裂的边。你可以用鼠标滚轮缩放,拖拽平移,甚至右键点击某条裂纹段,查看其断裂时刻、所在单元ID和局部应力状态。
实操心得:第一次运行
test.dat时,务必打开【日志窗口】(View → Show Log)。你会看到类似[INFO] Step 12450: Joint ID 7 initiated slip, shear displacement = 0.00032m的日志。这些不是噪音,而是诊断依据。如果裂纹迟迟不出现,检查日志里是否有[WARN] No fracture criterion satisfied at step XXXX;如果计算崩溃,最后一行通常是[ERROR] Negative eigenvalue in stiffness matrix,这意味着网格质量太差或时间步长太大,需回退到网格设置页调整。
5. 二次开发与定制化扩展:如何让你的研究想法落地为代码
Y-Geo的价值不仅在于开箱即用,更在于它是一块可塑性极强的“计算乐高”。它的源码设计充分考虑了扩展性,所有核心类都遵循单一职责原则,接口清晰。假设你想研究“温度场-应力场耦合下的岩石热破裂”,标准Y-Geo不支持,但只需修改三处:
5.1 新增物理场:在src/physics/下创建thermal_stress_physics.cpp
首先,继承PhysicsBase抽象基类:
class ThermalStressPhysics : public PhysicsBase {
public:
void initialize(const SimulationConfig& config) override {
// 从config读取热膨胀系数α、导热系数k、比热容Cp
alpha_ = config.get_double("material.thermal_expansion_coeff");
// 分配额外的温度场数组
temperature_ = std::vector<double>(mesh_->num_nodes(), config.get_double("initial_temperature"));
}
void update_internal_force() override {
// 在原有应力计算基础上,叠加热应力项:σ_thermal = E * α * (T - T0) / (1-2ν)
for (int i = 0; i < mesh_->num_elements(); ++i) {
auto& elem = mesh_->elements()[i];
double delta_T = temperature_[elem.node_ids[0]] - ref_temp_;
elem.stress += youngs_modulus_ * alpha_ * delta_T / (1.0 - 2.0 * poisson_ratio_);
}
}
private:
std::vector<double> temperature_;
double alpha_, ref_temp_;
};
这个类只负责热应力计算,不碰网格、不碰求解器,职责纯粹。
5.2 注册新物理场:修改src/core/simulation_controller.cpp
在SimulationController::initialize_physics()函数末尾,加入:
if (config.has_key("physics.coupled_thermal")) {
physics_list_.push_back(std::make_unique<ThermalStressPhysics>());
}
这样,只要在test.dat配置文件中添加physics.coupled_thermal = true,新物理场就会被自动启用。
5.3 GUI界面集成:为新参数添加输入控件
打开src/gui/physics_tab.cpp,在PhysicsTab::setupThermalSection()中:
QFormLayout* thermal_layout = new QFormLayout();
thermal_layout->addRow("热膨胀系数 α (1/K)", alpha_edit_ = new QLineEdit());
thermal_layout->addRow("参考温度 T₀ (°C)", temp_ref_edit_ = new QLineEdit());
// 将thermal_layout添加到主布局...
// 最后,在onRunSimulationClicked()中,将输入值写入config:
config.set_double("material.thermal_expansion_coeff", alpha_edit_->text().toDouble());
编译后,Y-GUI的【物理设置】页就会多出一个“热力学参数”分组。整个过程无需修改一行原有代码,所有新增逻辑都隔离在自己的文件里,这就是良好架构的力量。
常见问题排查速查表:
| 现象 | 可能原因 | 快速定位方法 |
|—|—|—|
| 编译报错undefined reference to 'vtable for ThermalStressPhysics'| 忘记在ThermalStressPhysics.h中声明虚析构函数virtual ~ThermalStressPhysics() = default;| 检查头文件,确认所有虚函数都有定义 |
| 运行时崩溃在update_internal_force()|temperature_数组未正确分配,访问越界 | 在initialize()后加断点,用调试器查看temperature_.size()是否等于节点数 |
| 新参数在GUI中显示但未传入内核 |onRunSimulationClicked()中遗漏了config.set_xxx()调用 | 在该函数末尾加qDebug() << config.dump();,检查输出中是否有你的参数 |
| 裂纹路径图显示为空白 | 新物理场影响了断裂判据,导致fracture_criterion.cpp始终返回false | 临时注释掉你的update_internal_force(),确认原版能否正常断裂 |
6. 典型应用场景与教学实践:从课堂演示到科研攻坚
Y-Geo的真正价值,在于它能把抽象的断裂力学理论,转化为学生指尖可触、工程师案头可用的具体工具。在高校《岩石力学》课程中,我常用它替代传统板书:课前准备好三个.geo文件——“完整岩块”、“含水平节理岩块”、“含倾斜节理岩块”。上课时,让学生分组操作Y-GUI,设置相同围压,观察三者破坏模式的差异。当他们亲眼看到:完整岩块呈典型的X型共轭剪切带;水平节理岩块沿节理面整体滑移;倾斜节理岩块则先在节理端部起裂,再向上延伸形成“翼状裂纹”——课本上干瘪的“莫尔圆分析”瞬间变得鲜活。这种“所见即所得”的教学反馈,远超任何PPT动画。
在科研层面,Y-Geo支撑过多个真实项目。例如,某水电站地下厂房围岩稳定性评估,传统FEM难以捕捉断层活化引发的突发性块体失稳。团队将地质雷达探测的断层网络导入Y-GUI,精确赋值断层泥的低c、低φ参数,运行仿真后,程序不仅复现了监测到的微震事件时空分布,还预测出一处尚未显现但应力高度集中的潜在破裂区,指导现场布设了针对性加固锚索。这个案例的关键,在于Y-Geo的参数可追溯性:每一个计算结果,都能反向定位到具体的材料参数、网格尺寸、时间步长。当审稿人质疑“为何此处裂纹走向与实测不符?”时,我们能立即在build/results/下找到对应步长的.dat文件,用Python脚本提取该区域所有单元的应力历史,证明是由于实测中忽略的微小次生节理导致了应力重分布——这种从代码到数据的全链条可验证性,是科研可信度的基石。
对于初学者,我强烈建议从test.dat开始,但不要止步于此。一个极好的入门练习是:修改test.dat中的material.tensile_strength,从默认的3.0MPa逐步降低到1.0MPa,每次运行后记录“首次观测到裂纹”的步数和对应位移。你会得到一条清晰的“强度-起裂位移”曲线。再进一步,将节理的friction_angle从30°调到15°,观察破坏模式如何从剪切滑移主导,转变为拉伸起裂主导。这些看似简单的参数扫描,正是理解FDEM物理内涵的捷径。记住,Y-Geo不是黑箱,它的每一次迭代、每一个判断,都写在src/solver/fdem_integrator.cpp的注释里,写在src/material/fracture_criterion.cpp的if语句中。当你开始习惯性地在VS Code里Ctrl+Click跳转到函数定义,当你能对着日志里的Step 89200,精准定位到fdem_solver.cpp第412行的if (R > Gc && tau > cohesion...),你就已经不再是用户,而是这个仿真世界的共同建造者了。
简介:Y-Geo是一个开源的连续-非连续介质耦合力学仿真平台,核心算法基于有限离散元法(FDEM),专为岩石破裂、材料损伤演化、岩土结构失稳等场景建模设计。配套图形界面Y-GUI V3.0.0提供独立可执行文件,支持Windows系统下的前处理建模、材料参数配置、网格划分、任务提交及计算结果可视化(如位移场、裂纹扩展路径、应力分布)。资源包内含全部源代码(src)、头文件(include)、跨平台构建脚本(SConstruct和Makefile)、编译输出目录(build)、用户操作手册(YManual.doc)、版权说明(Copyright.pdf)以及测试用例(test.dat)。支持本地编译与二次开发,需预先安装SCons构建工具及对应C++编译环境。适用于高校科研、工程模拟教学及岩土/材料方向的数值方法验证工作。
3379



被折叠的 条评论
为什么被折叠?



