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



在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)。但是我找不到任何方法来做到这一点,所有我发现的是,如果对象是一个哈希表,那么有一个erase方法,通过它的键删除元素。

我该如何从我的时间tlist列表中删除前两个元素?或者至少我要如何把这个列表转换成另一个数据结构,让我可以这样做?

谢谢

编辑:

下面是OpenFOAM中List定义的链接: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类获取原始列表的视图。在此基础上,您可以选择是使用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;
}

如果您考虑string::substr(),那么SubList构造函数的参数顺序可能会有点混乱,但本质上是:

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

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

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

你也可以使用labelRange来选择东西。例如,

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等。

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

#if (OPENFOAM >= 2112)
Info<< "Selected times: " << allTimes.slice(2) << nl;
#endif

最新更新