Palabos程序代码解读 | particle应用externalFlowAroundObstacle.cpp | 如何绘制流线图
externalFlowAroundObstacle.cpp
这个算例里,particle是不影响流体的,文中注释表明该算例的particles仅仅是可视化的作用,用于绘制流线图。
主要内容为:
使用的是DenseParticleField3D。
typedef DenseParticleField3D<T,DESCRIPTOR> ParticleFieldT;
定义参数。
int particleTimeFactor; // If the particle time factor is 2, then the integration time step// for the particles is twice that of the fluid.T particleProbabilityPerCell; // Probability of injection of a particle at an injection cell at each time step.T cutOffSpeedSqr; // Criterion to eliminate particles with very small velocity.int maxNumParticlesToWrite; // Maximum number of particles in the output VTK files.
定义MultiParticleField3D,particleArg,particleFluidArg,particleArg与cutOffSpeedSqr一起集成到AdvanceParticlesEveryWhereFunctional3D中,用于更新particles位置,数据处理器level为0,particleFluidArg与particleTimeFactor一起集成到FluidToParticleCoupling3D,用于更新particles速度,数据处理器level为1。
定义injectionDomain,用于后续输出particles时使用。
定义PointParticle3D至模板particleTemplate,从src源码来看,第一个是tag,第二个是坐标,第三个是速度,该particleTemplate用于后续输出particles时使用。
定义particleInjectionArg,与particleTemplate,particleProbabilityPerCell,injectionDomain一起被集成到InjectRandomParticlesFunctional3D里,数据处理器level为0。
定义出口Box3D absorbtionDomain(param.outlet);
,这里直接用了流场的出口位置,集成到数据处理器AbsorbParticlesFunctional3D上,level为0。
执行数据处理器particles->executeInternalProcessors();
。
MultiParticleField3D<ParticleFieldT>* particles = 0;particles = new MultiParticleField3D<ParticleFieldT> (lattice->getMultiBlockManagement(),defaultMultiBlockPolicy3D().getCombinedStatistics() );std::vector<MultiBlock3D*> particleArg;particleArg.push_back(particles);std::vector<MultiBlock3D*> particleFluidArg;particleFluidArg.push_back(particles);particleFluidArg.push_back(lattice);// Functional that advances the particles to their new position at each predefined time step.integrateProcessingFunctional (new AdvanceParticlesEveryWhereFunctional3D<T,DESCRIPTOR>(param.cutOffSpeedSqr),lattice->getBoundingBox(), particleArg, 0);// Functional that assigns the particle velocity according to the particle's position in the fluid.integrateProcessingFunctional (new FluidToParticleCoupling3D<T,DESCRIPTOR>((T) param.particleTimeFactor),lattice->getBoundingBox(), particleFluidArg, 1 );// Definition of a domain from which particles will be injected in the flow field.Box3D injectionDomain(0, 0, centerLB[1]-0.25*param.ny, centerLB[1]+0.25*param.ny,centerLB[2]-0.25*param.nz, centerLB[2]+0.25*param.nz);// Definition of simple mass-less particles.Particle3D<T,DESCRIPTOR>* particleTemplate=0;particleTemplate = new PointParticle3D<T,DESCRIPTOR>(0, Array<T,3>(0.,0.,0.), Array<T,3>(0.,0.,0.));// Functional which injects particles with predefined probability from the specified injection domain.std::vector<MultiBlock3D*> particleInjectionArg;particleInjectionArg.push_back(particles);integrateProcessingFunctional (new InjectRandomParticlesFunctional3D<T,DESCRIPTOR>(particleTemplate, param.particleProbabilityPerCell),injectionDomain, particleInjectionArg, 0 );// Definition of an absorbtion domain for the particles.Box3D absorbtionDomain(param.outlet);// Functional which absorbs the particles which reach the specified absorbtion domain.integrateProcessingFunctional (new AbsorbParticlesFunctional3D<T,DESCRIPTOR>, absorbtionDomain, particleArg, 0 );particles->executeInternalProcessors();
循环时,用于输出vtk文件。
if (i % param.vtkIter == 0) {pcout << "Writing VTK at time t = " << i*param.dt << endl;writeVTK(*boundaryCondition, i);if (param.useParticles) {writeParticleVtk<T,DESCRIPTOR> (*particles, createFileName(outputDir+"particles_", i, PADDING) + ".vtk",param.dx, param.maxNumParticlesToWrite );}}
在lattice进行碰撞迁移循环的时候,对particles也进行数据处理器的执行。
lattice->executeInternalProcessors();lattice->incrementTime();if (param.useParticles && i % param.particleTimeFactor == 0) {particles->executeInternalProcessors();}
小总结
如果想在流场中定义一个仅用于绘制流线图的particles,首先需要定义必须的参数,接着定义particleArg用于更新位置,particleFluidArg用于更新速度,particleInjectionArg用于生产particles,其次还需要particleTemplate来决定生产何种种类的particles,injectionDomain和absorbtionDomain用于决定生成和消除particles的区域位置。集成完毕后在lattice碰撞迁移后面增加particles->executeInternalProcessors();即可。
Palabos程序代码解读 | particle应用externalFlowAroundObstacle.cpp | 如何绘制流线图相关推荐
- 【GNSS】GREAT多频多系统GREAT-UPD开源代码-第4.1章 代码解读之gnss.h/gnss.cpp
GREAT多频多系统GREAT-UPD开源代码-第4.1章 代码解读之gnss.h/gnss.cpp 第4.1章 代码解读之gnss.h/gnss.cpp 1. GNSS系统设定 ///< GN ...
- LOAM论文和程序代码的解读
目的 LOAM是KITTI测试中排名第一的状态估计和激光建图方法,知名度很高,在它的基础上衍生出了很多改进版本,例如LEGO-LOAM.LLOAM.ALOAM.Inertial-LOAM等等. 本文对 ...
- VINS-Mono代码解读——状态估计器流程 estimator 写在初始化和非线性优化前
前言 本文主要介绍VINS的状态估计器模块(estimator),主要在代码中/vins_estimator节点的相关部分实现. 这个模块可以说是VINS的最核心模块,从论文的内容上来说,里面的内容包 ...
- 200行代码解读TDEngine背后的定时器
作者 | beyondma来源 | CSDN博客 导读:最近几周,本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响,原以为C语言已经是昨日黄花,不过从读 ...
- matlab绘制频散曲线,Matlab绘制频散曲线程序代码.docx
Matlab绘制频散曲线程序代码.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...
- vins 解读_代码解读 | VINS 视觉前端
AI 人工智能 代码解读 | VINS 视觉前端 本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接:代码解读 | VINS 视觉前端 v ...
- jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector
Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张s ...
- 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)
一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 ...
- softmax理论及代码解读——UFLDL
前言 看了各种softmax以后迷迷糊糊的,还是研究一下UFLDL的教程稳点.当然还是得参考挺多教程的:UFLDL-softmax .Softmax的理解与应用 .Logistic 分类器与 soft ...
最新文章
- codevs 2879 堆的判断
- 双击打开excel时提示:向程序发送命令时出现问题
- 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识
- 最短路(hdu4725)(建点巧妙)
- Java动态代理一览笔录
- 比尔盖茨:若新冠病毒疫苗有效 富裕国家在2021年底恢复正常
- c++ 优先队列_数据结构 | TencentOStiny中队列、环形队列、优先级队列的实现及使用...
- 吴恩达机器学习(十五)大规模机器学习(Batch、Stochastic、Mini-batch gradient descent、MapReduce)
- Linux基金会要“下田”了!开源技术在农业领域能做什么?
- ansible 小试身手
- 前端每日实战:98# 视频演示如何用纯 CSS 创作一只愤怒小鸟中的绿猪
- MATLAB--求解矩阵方程
- 前端点击按钮下载图片
- 双11,立减¥3554!戴尔官网撩客服砍价带走高性能电脑,速来!
- 上海自考计算机应用基础实践,2001年4月份全国高教自考计算机应用基础试题及答案...
- 适用于 Windows 操作系统的远程服务器管理工具 (RSAT)
- 使用pyecharts绘制各个3D图表代码示例整理和分享
- imshow 显示图像(Matlab)
- asp.net基于net的小美果蔬批发网-蔬菜商城系统-计算机毕业设计
- 《Smart Contract Development: Challenges and Opportunities》论文笔记