《An introduction to programming Physics-Informed Neural Network-based computational solid mechanics》
几何模型:
载荷条件:
边界条件:
材料属性:
该PINN模型采用多个独立的前馈神经网络来近似位移场。
| 模型输入 | |
| 模型输出 | |
| 网络架构 | 三个独立 |
| 单个FNN结构 | |
| 激活函数 | tanh 函数(在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)
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_b, U_x, s1_t 等)被重新赋值,旧对象的引用计数归零