开源CAE实战系列(七):用Code_Aster分析非线性问题
1 结构分析中的非线性问题
当线弹性假设不再适用时,我们就需要使用非线性分析方法。
静力非线性分析有3类主要的非线性因素:几何非线性、材料非线性、接触非线性。三类非线性问题可以同时出现。

1.1 材料非线性
材料的非线性体现在以下两方面:
(1)材料的应力/应变曲线为非线性(塑性变形、非线性弹性等)

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

1.2 几何非线性
例如大转动、大位移的杆:

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

2 非线性问题的求解
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法收敛需要更多的迭代步数,但是每个迭代步的计算量小
- 使用弹性矩阵可以保证收敛,但是要求的迭代步数多;弹性矩阵计算快速
- 弹性矩阵对于卸载的情况是很好的选择
3 使用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,),)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)