Dunavant 正交实施参考

计算科学 正交
2021-12-21 17:04:02

在我的软件中使用了 Dunavant 正交,特别是 John Burkardt 的这个文件最近,我想将代码转换为constexprC++ 中的代码。但这样做需要我了解代码的作用。我已经阅读了代码和论文,我对子订单感到困惑。我有具体的三个问题:

  1. 什么是子订单,它们与点和权重列表有什么关系?

  2. 为什么子订单显然是在三个维度上计算的,然后只使用其中两个?

  3. 为什么作者使用mod函数来计算像这段代码中的一些子订单?

    for (k = 0; k < 3; k++) {
       xy[0 + o * 2] = suborder_xyz[i4_wrap(k, 0, 2) + s * 3];
       xy[1 + o * 2] = suborder_xyz[i4_wrap(k + 1, 0, 2) + s * 3];
       w[o] = suborder_w[s];
       o = o + 1;
    }
    
1个回答

三角形的积分公式是根据三角形的三个面积坐标和一个权重来定义的。由于三个区域坐标之和必须等于 1,因此只有两个是独立的(可能这就是您所说的“在三个维度上计算然后只使用其中两个”时的意思)。

无论三角形的顶点如何排序,积分公式返回相同的值是很重要的,即积分点的坐标不应偏向特定顶点。三角形的质心就是所有三个区域坐标都相等的点。这将是大小为 1 的“子订单”。如果一个特定积分点的两个区域坐标相同,那么应该有两个额外的积分点是这些坐标的排列;这将是大小为 3 的子订单。最后,如果积分点处的所有三个区域坐标都不同,则它们将有六种排列;即大小六的子目。

mod 函数是计算这些不同排列的巧妙方法。但是,在这种情况下,由于它们只有三个或六个,因此简单地明确列出它们会更加明显,并且不是一种不合理的实现例程的方式。