解决MSC.Marc的收敛性问题

  • Posted on
  • by

MSC.Marc可以求解很多类型的物理问题,因此可能发生的状况也很多。本文我们将探讨收敛性问题及如何克服这些问题。

介绍

求解线性有限元模型很简单----为了求解我们只需:

  • 合理的网格(网格不能过于扭曲)
  • 合理的材料参数和几何参数
  • 足够的约束以去除刚体位移

这些是求解的条件,不是正确答案的条件。

对于非线性分析,问题进一步变化,导致更可能出错。

最常见的问题之一是模型不收敛:有限元分析求解器不断迭代。其不会在允许的迭代次数内收敛。然后求解器会尝试更小的步长。仍然不收敛。如此持续多次直到载荷变化太小以致求解器达到最小的步长自动停止或者用户忍无可忍停止进程。

在长达十年的调试自己和客户的非线性模型经历中,我发现排在收敛性问题第一位的是请求求解器所做的工作有问题。一些关键的物理部分没有包含在模型中。这可能包括丢失约束,没有包含接触,没有考虑摩擦或者屈服曲线不稳定。

对不收敛模型的典型反应是减少允许的最小时间步长或者放松收敛公差。前者增加运行时间且不收敛。后者明显减小计算精度且不能解决潜在的问题。接下来,用户为了达到收敛会尝试让求解器做更多的迭代。这种方法有时管用,有时不管用。接触设置被改变。材料设置被改变。约束被改变。

可以想象,这种为了让模型继续计算所进行的随意尝试很没有效率。特别是当问题可能是丢失了物理条件的时候。

本文,我们将讨论一些不收敛的原因。更重要地,我们将讨论系统调试非线性有限元模型的方法。一些内容对有限元方法很普遍,但本文首当其冲的是针对调试Marc模型。

载荷增量

在非线性分析中,我们经常"慢慢地"增加作用载荷。对于每一预期载荷步,求解器会持续迭代直到满足收敛准则。这时结果会写到文件,并开始下一步尝试。更小的载荷步增加经常明显接近更容易收敛的线性。

需要注意的是接触是一种可能的例外,我们将在稍后进行讨论。

在Marc/Mentat,任意载荷都有使用表格按比例设置成时间的函数的选项。如果你对Marc里的时间和表格还不熟悉,可以尝试阅读包含在Marc/Mentat标准文档中的Mar101培训材料。

如果用户不将载荷与表格关联就可能产生一个麻烦的问题:根据载荷步格式(自适应或固定步长),求解器可能认为你想用一步施加载荷。我们可以想象一些载荷会大到不能只在单独的一步加上去。如果尝试将载荷用一步加上去,求解器就会不收敛。求解器会减小时间步长。如果求解器认为你要把载荷马上加上去(因为你没有指定一个表格),全部的载荷会在一个更小的时间步施加。这不是求解器的问题:用户选择用一种非常激进的指定载荷的方式,所以求解器被允许按要求进行解释以满足要求。

将表格和以时间为函数的载荷比例系数关联完全消除了歧义。Marc没可能误解你的载荷是如何加载的。

简而言之,总是对Marc指定的每一个载荷使用表格。这么做可能会增加30秒设置模型的时间,但可以节省你一整天的调试时间。

收敛准则

收敛准则定义在什么情况下近似结果足够好。"近似结果"是因为只有线性模型能达到完美的收敛。对于结构载荷工况,Marc允许三种类型的收敛准则:

  • 位移 当迭代步之间的最大位移变化足够小的时候能够达到收敛。
  • 残值(比如不平衡力/位移) 任意点的施加载荷和反作用力的最大差别足够小的时候能达到收敛。
  • 能量 迭代步之间的最大应变能变化足够小的时候能够达到收敛。

收敛准则可以基于绝对值或相对值。相对值趋于更有意义因为允许的误差和施加载荷成比例。在工程上:如果最大的载荷是1N,10N的不平衡力是不可接受的。而如果最大的载荷是100000N,10N的不平衡力是非常精确的。

我们倾向忽略能量准则,因为Marc允许结合位移和残值收敛准则,但不允许能量收敛和其它准则结合。

有时候以下某些情况无法通过相对收敛检查:

  • 如果连续的载荷步之间载荷保持不变,计算得到的位移是一样的。第二步的残值收敛检查自动通过,因为前一步已经满足收敛要求。相对位移收敛基本上不可能,因为位移的变化为0,分子和分母都是0。零除零是任意可能值。
  • 如果施加的载荷完美平衡,反作用力为0。相对残值除以反作用力,我们又遇到了零除零的情况。

换句话说,即使某一准则得到不同的结论,模型也可能是收敛的。因为所遇到问题的收敛准则不是针对特殊情况的有效性检查。

很容易就定位到这些信息:检查log文件。该文件记录了收敛的值和比例。以下例子显示了一个迭代步的信息。循环编号"cycle number"是迭代的编号。再循环"Recycled"意味着由于不收敛额外的迭代(循环)会被执行。本例中,残值检查和位移检查的收敛比例都是0.001。

对于残值检查,残余力除以反作用力,得到残余收敛率。因此残值是收敛的。

对于位移检查,位移改变(前一迭代步到当前迭代步的位移变化)除以位移增量(当前载荷步所有迭代的位移变化)得到位移收敛率。本例中不收敛。

start of assembly cycle number is 5 wall time = 21.00

start of matrix solution wall time = 23.00

end of matrix solution wall time = 24.00

maximum residual force at node 167439 degree of freedom 1 is equal to 2.632E+01 maximum reaction force at node 163127 degree of freedom 1 is equal to 1.368E+05 residual convergence ratio 1.925E-04

maximum displacement change at node 172825 degree of freedom 2 is equal to 2.282E-01 maximum displacement increment at node 172798 degree of freedom 2 is equal to 1.241E+00 displacement convergence ratio 1.840E-01

increment will be recycled

如果最大反作用力或最大位移增量接近零就表明,要么收敛准则不合理,要么模型上还没有外载。

本例表明,模型已经接近力平衡(因为很低的残值率),迭代步之间的位移变化仍然很大。这说明以下任一情况:

  • 模型在某些方向刚度很小。否则,很小的位移会导致很大的反作用力或不平衡力。
  • 接触/摩擦还不平衡----模型的某些部位正滑向正确的位置。

需要注意的是Marc的默认容差比较大,达到0.1(也就是10%)。对于残值检查,这意味着如果任意点的不平衡力在最大反作用力的10%之内,将结果当作收敛。请将默认值仅当作验证模型(载荷顺序是正确的,等等)。

总之,对于收敛准则和公差:

  • 确认所选准则适用于分析的类型
  • 如果想得到合理的结果,确认公差的选择要比默认值小。这会让收敛更不容易得到,但不会隐藏不收敛的真正原因。

理想的情况下,使用残值和位移检查,除非某一项因为一些可解释的原因不适用。

另外,在检查log文件的收敛值和比例之前,不要改变不收敛模型的设置。这会显示最差的力不平衡节点,最不平衡的方向,有疑问迭代步的残值和位移检查是否合理,哪一个收敛准则距离收敛差距最大。这些会为解决问题提供线索。

接触和摩擦

接触和摩擦有两种典型的可能影响:大幅增加收敛所需要的迭代次数并且/或导致不可能收敛。

迭代次数的增加是因为接触导致的极度的非线性(没有接触时是零刚度,接触了就是无限刚度),并且需要找出发生接触的具体点。

对于接触的模型,有一些情况是不可能收敛的。这是物理问题,不是求解器问题。比如:

  • 一个部件只通过和另外一个部件的接触约束,当外载荷足够大到让两个物体分离的时候没有静态解:分离后,外载荷会导致其中一个物体需要瞬态计算的加速运动。
  • 类似的,一个部件和其它部件接触,如果没有摩擦就无法承受任意方向的载荷。即使有摩擦也要等到滑移开始才有合理的解。

可能会有类似如下的信息出现:

iterative penetration checking has reached 0.180175 of total increment

当迭代步之间的位移大到接触行为不合理的时候会发生这种情况。然后位移会被缩小到更合理的值(以上例子是期望增量的0.18倍)。这基本上不是接触问题,其表明模型在某个方向没有或者很低的刚度。

关于接触的详细介绍是另外的话题。

接触调试相当简单:

  1. 检查初始接触状态结果(发生接触的节点的值是1,不接触是0)。保证初始接触的节点发生接触,不该发生接触的范围不接触。
  2. 如果有应该接触而没接触上的区域,不要改变接触距离。这基本表明网格有问题。找出并改造问题网格。 将所有的接触改为粘结"glued",观察模型是否收敛。这是为了判断不收敛是否由接触引起的。

    • 如果模型仍然不收敛,那接触不是模型(唯一的)问题。将接触关系设为"glued"直到其它问题解决才将关系设为接触。
    • 如果模型现在可以计算了,逐步将接触体之间的关系设为接触以找出发生问题的接触对。记住问题很有可能是物理上的(比如不可能接触或需要使用摩擦)。
  3. 输出不收敛迭代步的结果,这在以下部分进行更详细的讨论。

迭代结果

这是很强大的调试工具:它会写出部分不收敛的结果到结果文件。只有位移、反作用力和接触结果可用。激活办法是在Mentat的结果输出面板打开"iterative results"。

该选项指出调试非线性模型的主要问题,亦即由于不收敛,所以没有可以用来找出问题的结果。不收敛的迭代步的位移经常可以找出问题所在。比如可以找出:

  • 不应该接触太多的面积
  • 由于太大的载荷步接触没有正确的探测到
  • 发生滑移,导致结构不稳定

记得如果模型正常的话关掉该功能----如果打开会让结果文件大一个数量级。

结论

如果不按照结构化的办法解析不收敛,解决问题就只能靠运气。而大部分时候是失败的。

建议的结构化的方法如下:

  • 保证所有的载荷和合理的表格关联。同时要保证载荷大小和期望值一致,单位正确。
  • 检查所有的材料参数和表格,保证数值合理
  • 检查收敛准则和值是合理的
  • 激活"iterative results"以观察不收敛迭代步
  • 对于接触模型,将接触关系用粘结替换接触

在模型计算若干个迭代步之后,停止计算,观察迭代结果。这经常可以找到问题的线索。日志文件的收敛值和收敛率也是调试不收敛问题的有用工具。

使用以上结构化调试办法可以明显的减少调试时间。

原文:Solving Convergence Problems in MSC Marc