OpenFOAM中如何删除List类型时间列表的前两个元素?
OpenFOAM List类型时间列表删除前两个元素实现方法
首先明确两个核心前提:
- 你通过
mesh.time().times()拿到的是const引用类型的全局时间列表,本身不允许直接修改,官方设计也不建议对这个全局对象做修改,避免影响求解器/后处理的基础逻辑 - OpenFOAM的基础
List模板没有提供erase方法,但可以通过子列表构造、转动态列表两种方式实现你要的效果
方案1:直接构造截断后的新List(最推荐,性能开销最小)
利用List自带的subList方法提取从第2个索引开始的所有元素,直接构造新的过滤后列表,代码如下:
const auto& tlist = mesh.time().times(); // subList参数说明:第一个是子列表长度,第二个是起始索引 // 删前2个元素,所以起始索引为2,长度为总长度减2 Foam::List<Foam::instant> filteredTlist(tlist.subList(tlist.size() - 2, 2)); // 测试打印 Foam::Info << filteredTlist << Foam::endl;
这个方法不需要额外的动态结构开销,适合不需要后续再修改列表的场景。
方案2:转为DynamicList后删除(适合需要后续动态增删元素的场景)
如果后续还需要对时间列表做增、删、改操作,可以先转为支持动态操作的DynamicList类型,调用内置的范围删除方法即可:
const auto& tlist = mesh.time().times(); // 直接用List构造DynamicList Foam::DynamicList<Foam::instant> dynTlist(tlist); // removeRange参数说明:第一个是删除起始索引,第二个是删除元素个数 dynTlist.removeRange(0, 2); // 如果后续需要转回普通List,直接赋值即可 Foam::List<Foam::instant> filteredTlist(std::move(dynTlist));
额外说明
你打印出的时间列表前两个元素分别对应constant目录、初始0时刻目录,后处理场景下过滤这两个元素是通用操作,上述两种方案都可以稳定运行在所有OpenFOAM v7+版本中。
内容的提问来源于stack exchange,提问作者Iyach tharwa nambarek
相关产品推荐
相关产品推荐

