OpenFOAM 如何从列表中删除一些元素?

OpenFOAM how to remove some elements from a List?

在OpenFOAM中,我可以访问我的模拟次数列表,如下:

const auto& tlist = mesh.time().times(); //or runTime.times();

只要在自定义函数对象的上下文中考虑这一点,您就可以在其中访问时间列表。

当我打印该列表时:

Foam::Info << tlist << Foam::endl;

然后通过 postProcess 命令 运行 函数对象,我得到:

9
(
0   constant
0   0
0.001   0.001
0.002   0.002
0.003   0.003
0.004   0.004
0.005   0.005
0.006   0.006
0.007   0.007
)

End

我想从该列表中删除前两个元素,即 (0 constant)(0 0)。但是我找不到任何方法来做到这一点,我所发现的是,如果对象是一个 HashTable,那么有一个 erase 方法可以通过它的键删除元素。

关于如何从我的时间列表中删除前两个元素的任何想法 tlist?或者至少我怎样才能将该列表转换为另一个允许我这样做的数据结构?

谢谢

编辑:

这里是 OpenFOAM 上下文中 List 定义的link:https://cpp.openfoam.org/v9/classFoam_1_1List.html

免责声明,我从未使用过 OpenFOAM。 看起来 List 有迭代器。 https://cpp.openfoam.org/v9/classFoam_1_1UList.html。 所以你可以尝试这样的事情(假设迭代器像我在其他库中习惯的那样工作):

  const auto& tlist = mesh.time().times(); //or runTime.times();

  // assuming operator+ available on iterator. this will copy data
  auto sublist = List<instant>(tlist.begin()+2,tlist.end());

  Foam::Info << sublist << Foam::endl;

  // or you could try to loop over the elements manually, this won't copy data
  for (auto it = tlist.begin()+2; it != tlist.end(); ++it )
  {
      std::cout << *it << "\n";
  }
  std::cout << std::endl;

与其使用迭代器,不如使用特定于 OpenFOAM 的习惯用法更有意义。获取第一个列表,您可以使用 SubList class 获取原始列表的视图。从那里,您可以选择是要使用子列表,还是要深入复制到另一个列表中。

编辑(第一部分是我的 phone 潦草写的):

这是一个简单的例子,说明如何使用 SubList:

instantList allTimes(runTime.times());

Info<< "I have " << allTimes.size() << " times:" << nl
    << allTimes << nl;

if (allTimes.size() > 2)
{
    SubList<instant> someTimes(allTimes, allTimes.size()-2, 2);

    Info<< "Subset of times: " << someTimes << nl;
}

SubList构造函数的参数顺序如果你想到string::substr()可能会有点混乱,但本质上:

  • 原始列表
  • 子集大小
  • 偏移量(缺失为0)

请注意,此 SubList 是一个非常轻量级的 view 现有列表,您可以使用它来修改列表的子部分等。如果您有分支情况,您可以在哪里可能想要统一处理事情,你可以简单地加入一个三元组。例如,

const SubList<instant>& myTimes =
(
    (allTimes.size() > 2)
  ? SubList<instant>(allTimes, allTimes.size()-2, 2)
  : SubList<instant>(allTimes)
);

您也可以使用 labelRange 来 select 东西。例如,

labelRange myslice(0, allTimes.size());
if (allTimes.size() > 2)
{
    myslice.reset(2, allTimes.size()-2);
}

// Now
Info<< "Selected times: "
    << SubList<instant>(allTimes, myslice) << nl;

由于 SubList 也是列表的一种类型,您可以在其上使用 range-for 等。

请注意,在下一个版本(2021 年 12 月)中,您还可以直接获取视图。例如,

#if (OPENFOAM >= 2112)

Info<< "Selected times: " << allTimes.slice(2) << nl;

#endif