OpenFOAM 如何从列表中删除一些元素?
Posted
技术标签:
【中文标题】OpenFOAM 如何从列表中删除一些元素?【英文标题】:OpenFOAM how to remove some elements from a List? 【发布时间】:2021-12-09 19:03:30 【问题描述】:在 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的定义链接:https://cpp.openfoam.org/v9/classFoam_1_1List.html
【问题讨论】:
你能显示更多的实际代码吗? tlist 的实际类型是什么?一个 std::list? @PepijnKramer:它是一个 Foam::List,这是一个返回时间的函数的链接:github.com/OpenFOAM/OpenFOAM-2.0.x/blob/… @PepijnKramer:或者这是最新版本:cpp.openfoam.org/v9/Time_8H_source.html 见第 334 行 【参考方案1】:免责声明,我从未使用过 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;
【讨论】:
让我看看它是否有效 我收到一个错误:In member function ‘error: no match for ‘operator+’ (operand types are ‘const Foam::instant’ and ‘int’)
还有一件事,在创建子列表之前,您应该添加一个检查列表是否至少为 3。【参考方案2】:
与使用迭代器相比,使用特定于 OpenFOAM 的习语更有意义。获取第一个列表,您可以使用 SubList 类获取原始列表的视图。从那里,您可以选择是要使用 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;
SubList
构造函数的参数顺序如果你想到 string::substr() 可能会有点混乱,但本质上是:
请注意,这个 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 等。
请注意,在下一个版本(2021 年 12 月)中,您还可以直接获取视图。例如,
#if (OPENFOAM >= 2112)
Info<< "Selected times: " << allTimes.slice(2) << nl;
#endif
【讨论】:
您能详细说明一下吗?我不清楚。 请查看更新后的评论以及使用 SubList 的代码示例。如果您尝试从两个迭代器构建 OpenFOAM 列表,也要格外小心。在几个版本中,这已被删除,因为它导致了无数的 32/64 歧义问题。例如,labelList foo(4, 8)
是一个包含 4 个元素的列表,统一初始化为 8,还是一个迭代器对。如果 OpenFOAM 已使用 64 位标签编译,您将解析为迭代器对而不是统一初始化!以上是关于OpenFOAM 如何从列表中删除一些元素?的主要内容,如果未能解决你的问题,请参考以下文章