MaterialMechanics ⚙️ 有限元分析框架
一个完整的材料力学有限元分析C++库,提供弹性/塑性/损伤材料模型、多种单元类型、线性和非线性求解器、动力分析及后处理功能。
📖 概述
MaterialMechanics 是一个模块化的有限元分析框架,专为固体力学仿真设计。核心组件包括:
🧮 张量运算库
二阶/四阶张量、Voigt记号、应力/应变变换。
📊 材料模型
线弹性、J2塑性、损伤材料,支持热-力耦合。
📐 有限单元
三角形CST、四边形Q4,支持2D平面应力/应变。
⚙️ 求解器
线性静力、非线性静力(牛顿-拉夫森)、动力分析(Newmark)。
🔧 边界条件
位移/力/压力/接触/周期性/对称约束。
📊 后处理
VTK/CSV输出、应力云图、响应谱分析。
✨ 核心特性
- 完整的数学建模 — 三维弹性力学、塑性力学(各向同性强化)、损伤力学。
- 多种有限元类型 — 常应变三角形(CST)、双线性四边形(Q4)。
- 多种材料模型 — 线弹性、J2塑性、损伤材料,支持工厂模式动态创建。
- 求解器 — 线性静力(直接/迭代求解器)、非线性静力(牛顿-拉夫森)、动力分析(Newmark)。
- 边界条件 — Dirichlet位移约束、Neumann力载荷、压力、接触、周期性、对称约束。
- 后处理 — 节点应力平均、冯·米塞斯应力、主应力、VTK/CSV导出。
- 高性能计算 — Eigen稀疏矩阵、OpenMP并行、多线程支持。
- 日志与计时 — 多级日志系统、性能计时器、进度条。
⚡ 快速开始
悬臂梁线性静力分析示例:
#include "MaterialMechanics/fem/Solver.hpp"
using namespace MaterialMechanics;
int main() {
// 创建网格
auto mesh = std::make_shared<FiniteElementMesh>();
auto steel = std::make_unique<LinearElastic>(210e9, 0.3, 7850);
auto quad = std::make_unique<QuadrilateralQ4>();
mesh->generateRectangularMesh(10.0, 1.0, 20, 4, quad, steel);
// 边界条件:左端固定
auto& nodes = mesh->getNodes();
for (auto& node : nodes) {
if (std::abs(node.coordinates.x()) < 1e-6)
node.setFixedDOF(true, true, false);
}
// 右端施加集中力
double total_force = -10000.0;
for (auto& node : nodes) {
if (std::abs(node.coordinates.x() - 10.0) < 1e-6)
node.force.y() = total_force / 5.0;
}
// 求解
LinearStaticSolver solver(mesh);
if (solver.solve()) {
auto disp = solver.getSolution();
std::cout << "Tip displacement: " << disp(disp.size()-2) << " m\n";
}
return 0;
}
📦 编译与依赖
Ubuntu/Debian 依赖安装
sudo apt update
sudo apt install build-essential cmake libeigen3-dev libgtest-dev
CMake 构建
git clone https://github.com/example/MaterialMechanics.git
cd MaterialMechanics
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
# 运行示例
./examples/cantilever_beam
./examples/plate_with_hole
./examples/plasticity_analysis
🏗️ 架构设计
库采用分层模块化设计,各模块职责清晰
🧮 张量库 (Tensor.hpp)
提供二阶张量 Tensor2<T> 和四阶张量 Tensor4<T> 的完整运算。
Tensor2 主要功能
- 基本运算: +, -, *, /, 点积, 双点积
- 几何运算: 转置、迹、行列式、逆、对称/反对称分解
- 力学应用: 偏量、von Mises应力、Tresca应力、主应力
- Voigt记号转换:
toVoigt()/fromVoigt()
Tensor4 主要功能
- 各向同性弹性张量:
Tensor4::isotropic(lambda, mu) - Voigt记号6x6矩阵转换
- 张量-张量双点积、张量-二阶张量双点积
📊 材料模型 (Material.hpp)
所有材料模型继承自 MaterialModel 基类,支持工厂模式创建。
线弹性材料 (LinearElastic)
- 参数: E(杨氏模量), nu(泊松比), density(密度)
- 各向同性本构,自动计算拉梅常数
J2塑性材料 (J2Plasticity)
- 参数: E, nu, yield_stress(屈服应力), hardening_modulus(硬化模量)
- 各向同性强化,径向返回算法,一致性切线模量
损伤材料 (DamageMaterial)
- 参数: E, nu, ultimate_stress(极限应力), fracture_energy(断裂能), characteristic_length(特征长度)
- Mazars损伤模型,基于等效应变
MaterialFactory::createMaterial("LinearElastic", {{"E",210e9},{"nu",0.3}})📐 有限单元 (Element.hpp)
所有单元继承自 FiniteElement 基类。
三角形常应变单元 (TriangleCST)
- 3节点,2D,每节点2自由度
- 常应变/常应力,适用于粗网格分析
四节点四边形单元 (QuadrilateralQ4)
- 4节点,2D,每节点2自由度
- 双线性形函数,2x2高斯积分
🌐 网格系统 (Mesh.hpp)
FiniteElementMesh 管理节点、单元、面、边及拓扑关系。
核心功能
- 网格生成:
generateRectangularMesh(),generateCubicMesh() - 拓扑构建: 节点-单元映射、节点-相邻节点映射
- 集合管理: NodeSet, ElementSet, FaceSet
- 边界提取:
extractBoundaryFaces() - 网格变换: 平移、旋转、缩放
- 网格质量检查: 纵横比、翘曲度、雅可比比
MeshGenerator 支持圆形、球形、带孔板、梁等专用网格。⚙️ 求解器 (Solver.hpp)
线性静力求解器 (LinearStaticSolver)
- 组装刚度矩阵 K 和力向量 F
- 支持直接求解器: Cholesky, LU, QR
- 支持迭代求解器: CG, BiCGSTAB (带预条件子)
- 输出: 位移、单元状态、反力、应变能
非线性静力求解器 (NonlinearStaticSolver)
- 牛顿-拉夫森迭代(Newton-Raphson)
- 线搜索(Line Search)增强收敛性
- 支持弧长法(Arc-Length)框架(预留)
- 荷载步控制和平衡路径输出
🔄 动力分析 (Newmark.hpp)
Newmark-β时间积分方法,适用于瞬态动力学分析。
参数
- β (beta): 影响加速度在时间步内的变化,β=0.25为平均加速度法(无条件稳定)
- γ (gamma): 影响速度变化,γ=0.5为无数值阻尼
- α (alpha): HHT-α数值阻尼参数
功能
- 质量矩阵和阻尼矩阵组装(Rayleigh阻尼)
- 模态分析: 固有频率和振型计算
- 响应谱分析: 模态叠加法
- 时间历史输出: 位移、速度、加速度
📈 非线性求解 (NewtonRaphson.hpp)
牛顿-拉夫森求解器,适用于一般非线性方程和有限元非线性分析。
- 支持用户自定义残差函数和切线刚度函数
- 线搜索提高全局收敛性
- 内置稀疏线性求解器(Eigen::SimplicialLDLT)
🔧 边界条件 (BoundaryCondition.hpp)
支持多种边界条件类型,通过 BoundaryConditionManager 统一管理。
边界条件类型
- DisplacementBC — 位移约束(Dirichlet),可固定或指定位移值
- ForceBC — 节点力载荷(Neumann)
- PressureBC — 面压力载荷
- SymmetryBC — 对称边界条件
- PeriodicBC — 周期性边界条件(拉格朗日乘子法/主从消去法)
- ContactBC — 接触边界条件(罚函数法)
- TemperatureBC — 温度边界条件(热-力耦合)
- MPC — 多点约束方程
📊 后处理 (StressCalculator, ResultWriter)
应力计算器 (StressCalculator)
computeNodalStresses()— 节点应力平均computeVonMisesStresses()— 冯·米塞斯等效应力computePrincipalStresses()— 主应力computeSafetyFactors()— 安全系数(冯·米塞斯/特雷斯卡准则)computeReactionForces()— 节点反力
结果输出 (VTKWriter, CSVWriter)
- VTK格式: 支持Paraview等可视化软件
- CSV格式: 节点/单元结果表格输出
- 文本报告: 汇总统计信息
🛠️ 工具模块 (Utils)
📐 Geometry
点线距离、三角形/四边形面积、法向、体积、点包含测试、线面相交。
🧮 MathUtils
数值积分(梯形/辛普森/Romberg)、数值微分、牛顿-拉夫森/二分法/割线法求根、统计、正交多项式。
📝 Logger
多级日志(DEBUG/INFO/WARNING/ERROR/CRITICAL)、控制台/文件输出、滚动文件、性能计时器、进度条。
⏱️ Timer
RAII计时器、全局计时统计、最小/最大/平均时间。
📁 IO
文件读写、矩阵/向量序列化(文本/二进制)、目录操作、路径处理。
💡 示例程序
| 示例文件 | 描述 |
|---|---|
cantilever_beam.cpp | 悬臂梁线性静力分析,与理论解对比。 |
plate_with_hole.cpp | 带孔板应力集中分析,计算应力集中系数。 |
plasticity_analysis.cpp | 弹塑性拉伸试样分析,力-位移曲线输出。 |
dynamic_analysis.cpp | 自由振动/强迫振动/响应谱分析。 |
examples/ 目录,编译后可执行。⚖️ 许可证
MIT License
Copyright (c) 2025 MaterialMechanics Contributors
本软件按“原样”提供,不提供任何明示或暗示的保证。允许自由使用、修改、分发,需保留版权声明。
📐 MaterialMechanics · 有限元分析库 · 文档生成于 2026-03-21