结构分析中的非线性问题

当线弹性假设不再适用时,我们就需要使用非线性分析方法。

静力非线性分析有3类主要的非线性因素:几何非线性、材料非线性、接触非线性。三类非线性问题可以同时出现。

1.1 材料非线性

材料的非线性体现在以下两方面:

(1)材料的应力/应变曲线为非线性(塑性变形、非线性弹性等)

(2)材料的响应依赖于加载历程(加载、卸载、加载……)

1.2 几何非线性

例如大转动、大位移的杆:

1.3 接触和摩擦

接触和摩擦是比较困难的非线性问题。

非线性问题的求解

2.1 求解方法的差异

线性问题和非线性问题求解方法不同,线弹性静力问题可以通过一次线性代数方程组一步完成求解,非线性静力问题则需要划分多个时间步(Increments)进行求解,即加载逐步增大,基于上一个时间步的结果计算下一个时间步的结果。

2.2 非线性静力分析中的“时间”

下图中时间t用于刻画加载过程中逐渐变化的载荷幅值,并非物理意义上的时间。不同的时间步可对应不同加载幅值和类型。

2.3 Newton法简介

以一维非线性方程F(x) = 0为例,预估-修正的方法,已知x^(n-1),求x^n。

F(x)的一阶泰勒展开为

更新的解

Newton法的性质:

  • 在收敛范围内拥有二次收敛率
  • 切线项F’(x^(n-1)),计算开销大
  • 需要满足F’(x^(n-1))≠0

2.4 非线性问题的时间步离散

非线性方程的一般形式:

  • 内力:隐式取决于时间t(通过问题的解)
  • 外力:显式取决于时间t (边界条件和载荷)或者隐式取决于时间t(如跟随力)

时间步的离散,用k表示:

2.5 非线性问题的Newton迭代

时间步k的平衡方程:

迭代步n的内力:

迭代步n的外力:

迭代步n的解的增量:

切线刚度矩阵:

残差向量:

收敛准则:

  • 绝对误差准则 (RESI_GLOB_MAXI)

  • 相对误差准则 (RESI_GLOB_RELA)

  • 参考应力准则 (RESI_REFE_RELA)

2.6 图解非线性问题的求解

问题描述:已知F*,求u*

首先设置两个时间步减小问题的非线性程度,计算(u1, F1)和(u2, F2)

计算第一个时间步第n个迭代步的切线刚度K1n

计算解的增量

更新解

计算内力Lint(u1n)和残差R = F1 - Lint(u1n),判断收敛。如不收敛,则进行下一次迭代。

2.7 使用不同的Newton法进行矩阵计算

全Newton法:Kin每个时间步的每个迭代步均重新计算切线矩阵

拟Newton法:Kin可以设置时间步中和迭代步中矩阵更新的频率,如每隔n个时间步和i个迭代步更新一次刚度矩阵

拟Newton法可以使用非切线矩阵的矩阵(如弹性矩阵等)

为什么使用拟Newton法?

  • 每个迭代步计算切线刚度矩阵需要大量的计算开销
  • 拟Newton法收敛需要更多的迭代步数,但是每个迭代步的计算量小
  • 使用弹性矩阵可以保证收敛,但是要求的迭代步数多;弹性矩阵计算快速
  • 弹性矩阵对于卸载的情况是很好的选择

使用Code_Aster分析非线性问题

3.1 定义非线性材料曲线

以钢材为例,我们通过文件输入材料拉伸应力-塑性应变曲线

FSIGM = LIRE_FONCTION(UNITE=21,PARA='EPSI')

STEEL = DEFI_MATERIAU(ELAS=_F(YOUNG=210.E9,NU=0.3),
                      TRACTION=_F(SIGM=FSIGM))

3.2 定义弹塑性材料模型

各向同性强化塑性模型,小应变:

RESUN = STAT_NON_LINE(...
                      CHAM_MATER   = CHMA,
                      COMPORTEMENT = _F(
                               TOUT        ='OUI',
                               RELATION    ='VMIS_ISOT_TRAC',
                               DEFORMATION ='PETIT'),
                      ...)

别忘了添加其他关键字,如载荷等。

3.3 定义载荷和边界条件

方法1:

定义载荷幅值与时间的关系:在FONC_MULT中使用Function

RAMPE = DEFI_FONCTION(PARA='INST',VALE=(0,0,2,2))
LOAD  = AFFE_CHAR_MECA(MODELE=MOD,
                       PRES_REP=_F(PRES=100.,
                                   GROUP_MA='TOTO'))
RESUN = STAT_NON_LINE(...
                      EXCIT=_F(CHARGE   =LOAD,
                               FONC_MULT=RAMPE)
                      ...)

方法2:

定义载荷幅值与时间的关系:直接在载荷定义命令中使用Function

RAMPE = DEFI_FONCTION(PARA='INST',VALE=(0,0,2,200))
LOAD  = AFFE_CHAR_MECA_F(MODELE=MOD,
                         PRES_REP=_F(PRES=RAMPE,
                                     GROUP_MA='TOTO'))
RESUN = STAT_NON_LINE(...
                      EXCIT=_F(CHARGE   =LOAD)
                      ...)

3.4 定义时间步

非线性计算在若干个时间步上进行:

L_INST=DEFI_LIST_REEL(     DEBUT=0.0,
                           INTERVALLE=(
                                 _F(JUSQU_A=1.0,NOMBRE=4,),
                                 _F(JUSQU_A=2.0,NOMBRE=3,),
                          ),)
RESUN = STAT_NON_LINE(...
                      INCREMENT=_F(LIST_INST=L_INST)
                      ...)

载荷和时间步的定义必须匹配:

可以在总的时间步的一部分时间点上进行计算:

RESUN = STAT_NON_LINE(...
                      INCREMENT=_F(LIST_INST=L_INST,
                                   INST_FIN =1.0)
                      ...)

3.5 设置自动时间步划分

自动时间步划分:根据收敛性自动设置时间步的步长

L_INST=DEFI_LIST_REEL(     DEBUT=0.0,
                           INTERVALLE=(_F(JUSQU_A=2.0,NOMBRE=1,),
                        ),)
DEFLIST = DEFI_LIST_INST(  DEFI_LIST = _F(
                                           METHODE    = 'AUTO',
                                           LIST_INST  = L_INST,
                                           PAS_MINI   = 1.E-6),)
RESUN = STAT_NON_LINE(...
                      INCREMENT=_F(LIST_INST=DEFLIST)
                      ...)

3.6 定义Newton求解方法

拟Newton法:每2个Newton迭代步重新计算矩阵

RESUN = STAT_NON_LINE(...
                      NEWTON=_F(REAC_ITER=2,),)

拟Newton法:每3个时间步重新计算矩阵

RESUN = STAT_NON_LINE(...
                      NEWTON=_F(REAC_INCR=3,),)

拟Newton法:使用弹性矩阵

RESUN = STAT_NON_LINE(...
                      NEWTON=_F(MATRICE='ELASTIQUE',),)

Code_Aster中缺省设置:

RESUN = STAT_NON_LINE(...
                      NEWTON=_F(   REAC_INCR=1,
                                   REAC_ITER=0,
                                   MATRICE='TANGENTE',),

3.7 定义收敛准则

谨慎地修改收敛准则的设置:

RESUN = STAT_NON_LINE(...
                      CONVERGENCE=_F(
                              RESI_GLOB_MAXI=1.E-6,
                              RESI_GLOB_RELA=1.E-6,),)

修改收敛准则可能会导致错误的结果。

最大迭代次数设置:

RESUN = STAT_NON_LINE(
             CONVERGENCE=_F(ITER_GLOB_MAXI=20,),)

使用弹性矩阵可能需要上千次Newton迭代。

Code_Aster中缺省设置:

RESUN = STAT_NON_LINE(...
                      CONVERGENCE=_F(
                                   ITER_GLOB_MAXI=10,
                                   RESI_GLOB_RELA=1.E-6,),)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐