黄金法则

将有限元方法应用于实际工程问题并不总是一件容易的事。特别是实现非线性应用(大变形、非线性材料行为、接触)的收敛可能相当棘手。然而,遵守几个简单的规则可以使工作变得更容易。根据我的经验,以下准则非常有用:

  1. 检查网格质量。使用CalculiX GraphiX或任何其他好的前处理器检查网格质量。

  2. 如果您正在处理非线性问题,首先运行线性化版本:消除大变形(删除NLGEOM),使用线弹性材料,并删除所有其他非线性(如接触)。如果线性版本不运行,非线性问题也无法运行。线性版本可以让您轻松检查边界条件是否正确(无未约束的刚体模式)、载荷是否按预期施加等。此外,您可以了解解决方案应该是什么样子。

  3. 使用二次单元(C3D10、C3D15、C3D20(R)、S8、CPE8、CPS8、CAX8、B32),显式动态计算除外。二次单元的标准形函数非常好。大多数有限元程序使用这些标准函数。对于线性单元情况并非如此:线性单元表现出各种奇怪的行为,如剪切锁定和体积锁定。因此,大多数有限元程序修改线性单元的标准形函数来缓解这些问题。然而,没有标准的做法,因此每个供应商都创建了自己的修改方案,而这些修改方案未必公开发表。这导致如果使用线性单元,结果会有更大的差异。由于CalculiX在线性单元中也使用标准形函数,因此必须谨慎处理结果。

  4. 如果您使用壳单元或梁单元,请在CalculiX的*NODE FILE卡上使用OUTPUT=3D选项(这是默认设置)。这样,您可以在.frd文件中获得这些单元的展开形式。您可以轻松验证指定的厚度是否正确。此外,您还可以获得3D应力分布。这是1D/2D应力分布和内部梁力的基础。如果前者不正确,后者也会不正确。

  5. 如果您在计算中包含接触并且使用二次单元,请使用面对面惩罚接触方法或mortar方法(默认情况下是面对面方法)。一般来说,对于面与面之间的接触,面对面惩罚方法和mortar方法比节点-面方法收敛好得多。接触类型必须在*CONTACT PAIR卡上声明。请注意,CalculiX中的mortar方法只能用于静态计算。

  6. 如果执行显式动态计算,请使用:

  7. 如果没有足够的空间运行问题,请检查编号。运行问题所需的内存取决于最大节点和单元编号(但计算时间不是如此)。因此,如果您注意到编号中有很大的间隙,请消除它们,这样您就需要更少的内存。在某些问题中,您可以通过选择迭代求解方法来节省内存。迭代缩放方法(参见*STATIC)比迭代Cholesky方法需要更少的内存,后者比SPOOLES或PARDISO需要更少的内存。

如果您遇到问题,您可以:

  1. 查看屏幕输出。特别非线性计算的收敛信息可以指示问题的来源。

  2. 查看.sta文件。此文件包含每个增量获得收敛所需的迭代次数信息。

  3. 查看.cvg文件。此文件是屏幕输出的摘要:它可以让您快速了解接触单元的数量、每次迭代中的残差力和解的最大变化(无论是否收敛)。

  4. 使用*NODE FILE或类似卡上的"last iterations"选项。这将生成一个名为ResultsForLastIterations.frd的文件,包含所有非收敛迭代(从最后一个收敛增量之后开始)的变形(对于机械计算)和温度(对于热计算)。

  5. 如果输入卡中有接触定义,您可以使用*NODE FILE或类似卡上的"contact elements"选项。这将生成一个名为jobname.cel的文件,包含该选项激活的增量中所有迭代的所有接触单元。通过在CalculiX GraphiX中读取此文件,您可以可视化每次迭代中的所有接触单元,也许能找到问题的根源。

  6. 如果遇到段错误,您可以通过在终端窗口中输入"export CCX_LOG_ALLOC=1"将环境变量CCX_LOG_ALLOC设置为1。运行CalculiX后,您将获得有关代码中哪些字段在哪些行被分配、重新分配或释放的信息(默认为0)。

  7. 这是专家级别的:如果遇到不同方程之间的依赖问题,您可以通过删除ccx_2.22.c中writeboun调用前的注释并重新编译,在每个步骤开始时打印SPC;您可以通过在cascade.c中writempc被调用的循环处取消注释并在每次设置MPC时打印它们,然后重新编译。