MaterialMechanics ⚙️ 有限元分析框架

C++17 Eigen3 OpenMP VTK输出

一个完整的材料力学有限元分析C++库,提供弹性/塑性/损伤材料模型、多种单元类型、线性和非线性求解器、动力分析及后处理功能。

📖 概述

MaterialMechanics 是一个模块化的有限元分析框架,专为固体力学仿真设计。核心组件包括:

🧮 张量运算库

二阶/四阶张量、Voigt记号、应力/应变变换。

📊 材料模型

线弹性、J2塑性、损伤材料,支持热-力耦合。

📐 有限单元

三角形CST、四边形Q4,支持2D平面应力/应变。

⚙️ 求解器

线性静力、非线性静力(牛顿-拉夫森)、动力分析(Newmark)。

🔧 边界条件

位移/力/压力/接触/周期性/对称约束。

📊 后处理

VTK/CSV输出、应力云图、响应谱分析。

✨ 核心特性

⚡ 快速开始

悬臂梁线性静力分析示例:

#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
💡 可选依赖:OpenMP (并行加速)、GTest (单元测试)。

🏗️ 架构设计

库采用分层模块化设计,各模块职责清晰

🧮 张量库 (Tensor.hpp)

提供二阶张量 Tensor2<T> 和四阶张量 Tensor4<T> 的完整运算。

Tensor2 主要功能

Tensor4 主要功能

Tensor2<double> stress = stiffness.doubleDot(strain);

📊 材料模型 (Material.hpp)

所有材料模型继承自 MaterialModel 基类,支持工厂模式创建。

线弹性材料 (LinearElastic)

J2塑性材料 (J2Plasticity)

损伤材料 (DamageMaterial)

材料工厂: MaterialFactory::createMaterial("LinearElastic", {{"E",210e9},{"nu",0.3}})

📐 有限单元 (Element.hpp)

所有单元继承自 FiniteElement 基类。

三角形常应变单元 (TriangleCST)

四节点四边形单元 (QuadrilateralQ4)

auto Ke = element->computeStiffnessMatrix(node_coords, material, thickness);

🌐 网格系统 (Mesh.hpp)

FiniteElementMesh 管理节点、单元、面、边及拓扑关系。

核心功能

网格生成器 MeshGenerator 支持圆形、球形、带孔板、梁等专用网格。

⚙️ 求解器 (Solver.hpp)

线性静力求解器 (LinearStaticSolver)

非线性静力求解器 (NonlinearStaticSolver)

SolverConfig config; config.solver_type = SolverConfig::DIRECT_CHOLESKY;

🔄 动力分析 (Newmark.hpp)

Newmark-β时间积分方法,适用于瞬态动力学分析。

参数

功能

稳定性条件: γ ≥ 0.5, β ≥ γ/2 以保证无条件稳定。

📈 非线性求解 (NewtonRaphson.hpp)

牛顿-拉夫森求解器,适用于一般非线性方程和有限元非线性分析。

NewtonRaphsonSolver solver; solver.setMaxIterations(50); solver.setTolerance(1e-8); solver.enableLineSearch(true); bool converged = solver.solve(solution, residual_func, tangent_func);

🔧 边界条件 (BoundaryCondition.hpp)

支持多种边界条件类型,通过 BoundaryConditionManager 统一管理。

边界条件类型

📊 后处理 (StressCalculator, ResultWriter)

应力计算器 (StressCalculator)

结果输出 (VTKWriter, CSVWriter)

VTKWriter::writeSolution(mesh, displacement, nodal_stresses, "result.vtk");

🛠️ 工具模块 (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