首页/文章/ 详情

pinn求解三维固体力学问题(pytorch)

4月前浏览871

pinn求解三维固体力学问题(pytorch)

论文名称

《An introduction to programming Physics-Informed Neural Network-based computational solid mechanics》

问题描述

  • 几何模型

    • 完整立方体边长       
    • 利用对称性,仅建模立方体的八分之一(如右图),以降低计算成本。
  • 载荷条件

    • 在立方体顶部和底部表面 (       和       ) 施加沿z方向的分布力       
    • 载荷函数为:      
  • 边界条件

    • 位移边界条件 (在对称面上施加):      
  • 材料属性

    • 杨氏模量       
    • 泊松比       
    • 为平面应力问题,Lamé常数        由        和        通过公式计算得到。

神经网络架构设计

该PINN模型采用多个独立的前馈神经网络来近似位移场。

设计要素      
具体配置      
模型输入
三维空间坐标               
模型输出
三个方向的位移分量               
网络架构三个独立      
的全连接前馈神经网络 (Fully Connected Neural Network, FNN)      
单个FNN结构
包含 4 层(输入层、隐藏层、输出层),每层有 20 个神经元      
激活函数
使用 tanh 函数(在FNN()函数中默认设置)      
参数初始化
使用 LeCun 初始化方案(在Input_Info()函数中定义)      
训练采样点
在计算域内生成 9261 个 均匀分布的样本点(间距          )      

物理信息嵌入与损失函数

  • 主要物理约束
    1. 平衡方程 (在计算域        内):       
    2. 力边界条件 (在力边界        上):       
    3. 位移边界条件 (在位移边界        上):       
  • 损失函数类型
    • 在此3D案例中,论文仅使用了配点损失函数 (Collocation Loss Function) 进行求解。
    • 能量基损失函数 (Energy-based Loss Function) 可以通过修改程序实现,但3D示例中未使用。
  • **损失函数构建 (Collocation)**:
    • 损失函数是平衡方程残差和力边界条件残差的均方误差 (MSE) 之和:      
    • 其中,       是域内样本点总数,       是力边界上的样本点数。
  • 边界条件精确施加
    • 对于固定的位移边界条件(如        ),采用了硬边界的方法来精确满足,而非将其作为损失项。这简化了损失函数,降低了训练复杂度。具体方法为:      ,其中        是原始FNN输出,       是固定边界位置。

数值实现流程一些关键问题

由于在三维问题下,采样点会指数增加,例如采用    ,不可避免有内存超限问题。

训练阶段

def closure(self):
    self.optimizer.zero_grad()
    x, x1u, x1b, x2u, x2b, x3u, x3b = self.x_train

    ### 第1段:平衡方程残差(内域点)
    Gex, Gey, Gez = self.pinn.forward_ge(x)
    l1 = Loss_GE(Gex, Gey, Gez)
    l1.backward()                    
    l1_val = l1.item()
    del Gex, Gey, Gez               

    ### 第2段:x面边界条件
    s11u, s121u, s131u, s121b, s131b = self.pinn.forward_bc_x(x1u, x1b)
    l_x = Loss_BC_x(s11u, s121u, s131u, s121b, s131b)
    l_x.backward()                  
    l_x_val = l_x.item()
    del s11u, s121u, s131u, s121b, s131b

    ### 第3段:y面边界条件
    s22u, s122u, s232u, s122b, s232b = self.pinn.forward_bc_y(x2u, x2b)
    l_y = Loss_BC_y(s22u, s122u, s232u, s122b, s232b)
    l_y.backward()
    l_y_val = l_y.item()
    del s22u, s122u, s232u, s122b, s232b

    ### 第4段:z面边界条件
    s33u, s133u, s233u, s133b, s233b = self.pinn.forward_bc_z(x3u, x3b)
    l_z = Loss_BC_z(s33u, s133u, s233u, s133b, s233b, self.y_train)
    l_z.backward()
    l_z_val = l_z.item()
    del s33u, s133u, s233u, s133b, s233b

    ### 汇总 loss 数值
    loss_val = l1_val + l_x_val + l_y_val + l_z_val
    return torch.tensor(loss_val)
  • 将一次大的 forward+backward 拆分为4段独立计算,每段算完立即 backward 释放计算图。由于 zero_grad() 只在开头调用一次,4次 backward() 的梯度自动累积,数学上完全等价。

后处理阶段

n = xyz.shape[0]
batch_size = 2000
s1_list, s2_list, s3_list = [], [], []
s12_list, s13_list, s23_list = [], [], []

for i in range(0, n, batch_size):
    xyz_b = torch.tensor(xyz[i:i+batch_size], dtype=torch.float32,
                         requires_grad=True).to(device)

    # 只需一组微分 + 一次 Material 调用
    U_x, U_y, U_z, U_xx, U_xy, U_xz, U_yy, U_yz, U_zz = pinn.dif_x(xyz_b)
    V_x, V_y, V_z, V_xx, V_xy, V_xz, V_yy, V_yz, V_zz = pinn.dif_y(xyz_b)
    W_x, W_y, W_z, W_xx, W_xy, W_xz, W_yy, W_yz, W_zz = pinn.dif_z(xyz_b)
    _, _, _, _, _, _, s1_t, s2_t, s3_t, s12_t, s23_t, s13_t, _, _, _ = Material(
        U_x, U_y, U_z, V_x, V_y, V_z, W_x, W_y, W_z,
        U_xx, U_xy, U_xz, U_yy, U_yz, U_zz,
        V_xx, V_xy, V_xz, V_yy, V_yz, V_zz,
        W_xx, W_xy, W_xz, W_yy, W_yz, W_zz, pinn.E, pinn.mu)

    # detach() 断开计算图,只保留数值
    s1_list.append(s1_t.detach().cpu().numpy())
    s2_list.append(s2_t.detach().cpu().numpy())

s1 = np.concatenate(s1_list)
# ... 拼接其余分量

每个批次中:

  • detach() 将结果从计算图断开,只保留纯数值
  • 下一轮循环中变量(xyz_bU_xs1_t 等)被重新赋值,旧对象的引用计数归零
  • Python 引用计数机制立即回收旧对象,关联的计算图跟随释放

二维物理问题描述

  • 模型
  • 几何与建模
    • 方板边长       
    • 利用几何对称性,仅建模方板的四分之一(如图12(b)),以降低计算成本
  • 载荷条件
    • 在板的右侧(      )施加沿x方向的分布力      
    • 载荷函数为:      
  • 边界条件
    • 位移边界条件 (在对称面上施加):      
    • 力(牵引力)边界条件:已由        在右侧边界施加
  • 材料属性
    • 杨氏模量       
    • 泊松比       
    • 为平面应力问题,Lamé常数        由以下公式计算:      
来源:我的博士日记
pythonUM材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-04-13
最近编辑:4月前
此生君子意逍遥
博士 签名征集中
获赞 62粉丝 130文章 153课程 0
点赞
收藏
作者推荐

GND直接关联各向同性硬化和运动硬化

参考文献:《Indentation size effects in spherical nanoindentation an alyzed by experiment and non-local crystal plasticity》 在微尺度金属塑性变形中,一个长期存在却又难以在传统模型中准确描述的现象是尺寸效应:随着构件尺度、晶粒尺寸或应变梯度的增大,材料表现出明显高于宏观预测的强度。这一现象的物理根源,普遍认为与几何必要位错(Geometrically Necessary Dislocations, GNDs)密切相关。 该文章围绕这一问题,构建了一套基于应变梯度的晶体塑性理论框架,通过在连续介质尺度中显式引入 GND 的产生、演化及其力学效应,实现了对微尺度强化行为的统一描述。 作者所提出与以往经典的GND模型的差异在于,文章系统地考虑了 GND 对塑性行为的两种关键影响: (1)局部强化效应(短程作用):GND 与统计存储位错(SSD)共同构成材料内部的位错网络。模型采用 Taylor 型关系,将 GND 密度引入滑移阻力中,从而自然解释了应变梯度增大时材料强度提升的现象。(2)长程内应力效应(非局部作用):由于 GND 本质上是具有空间分布的位错结构,其不均匀性会产生长程弹性应力场。模型通过引入高阶梯度项,等效构造位错线段,并利用解析位错力学解计算其诱导的内应力。这部分应力作为附加分解剪应力或背应力,直接参与滑移驱动力的计算。作者将上述两类应力直接引入经典的流动方程:由于同时计算了塑性变形梯度的一阶和二阶梯度,因此数值实现难度较大,作者建议使用基于谱方法的中心差分计算对应的梯度。将有限元高斯点上的塑性变形梯度映射至规则网格,在频域中高效计算其空间导数与平滑梯度,从而稳定、精确地获得 GND 相关量。这种方法在保证数值效率的同时,有效抑制了高阶梯度带来的数值噪声问题。作者使用该模型结合AFM和TEM研究了球形压痕的尺寸效应问题.作者的研究表明:(1)在小压痕载荷/小压痕深度下,材料的塑性区尺度受几何强烈约束,GND 密度较高;大压痕载荷下,塑性区持续扩展,SSD 累积占主导。(2)对于球形压头,接触曲率在加载过程中基本保持不变;这意味着由几何约束产生的应变梯度尺度是近似恒定的;因此,GND 密度及其引起的各向同性强化项在不同压痕深度下变化不大。相反,随着压痕加深:塑性应变不断累积;SSD 引起的传统加工硬化持续增强。(3)仅考虑 GND 引起的各向同性强化项,即可清晰再现 ISE;仅考虑 GND 的运动学背应力项,或完全忽略 GND,则尺寸效应显著减弱甚至消失。ISE 的主导机制并非位错长程内应力本身,而是 GND 对滑移阻力的统计强化作用。(4)非局部晶体塑性模型可以同时拟合:载荷–位移曲线,残余压痕形貌,硬度随载荷变化规律;计算得到的 GND/SSD 分布趋势,与 TEM 观察到的位错结构在定性上高度一致。这表明该模型不仅是“可用的”,而且在物理解释层面具有可信度。作者提出的这类方案便于数值实现,对于异质性结构诱导额外强化的分析也有一定的参考意义,使用作者提到的这种谱方法计算GND测试显示计算结果和FEM的MLS分布接近,数值大小会高一些,同时也会更平滑一些。使用FFT方案计算的案例如下:初始包含200个晶粒的多晶模型(拉伸变形2.0%,单元类型CPE4R)等效应力分布:变形结束后的GND分布: GND一阶效应的各向同性阻力:GND二阶效应的背应力 来源:我的博士日记

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈