Euler-Lagrange的一些解析,sprayFoam
-
@vbcwl
dsmcFoam吧
我搜了一下,希望有所帮助,如果有条件请尽量使用某G搜材料,百度太废物下面是有人写的解析
https://zhulianhua.github.io/2016/10/07/of-dsmcFoam/这还有一片代尔夫特大学的硕士毕业论文
https://repository.tudelft.nl/islandora/object/uuid:b0922fd5-9472-4037-9b9c-80af46736ad9/datastream/OBJ/download -
@星星星星晴 我尝试着调用dsmc的cloud,但是在UEqn.H中加入粒子对流体的作用力时无法成功添加,图片上传一直失败,我手打一下报错信息。如果参考GOFUN那个,直接 +invrhoInfdsmcCloud.SU(U) 报错为:expect primary-expression before'.' token +invrhoInfdsmcCloud.SU(U) ,如果吧dsmcCloud改为dsmc 在UEqn后面加+invrhoInf*dsmc.SU(U),报错为has no member named 'SU',请问您知道该怎么把粒子力加到UEqn.H里么
-
@vbcwl 添加该项主要是为了2-way coupling,另外可能调用dsmccloud并不是这样的,请参考之前给你的那个解析,每个cloud调用的方法可能不一样,你可以参考一下其他的cloud是怎么被调用的。
看看其他求解器Info<< nl << "Constructing dsmcCloud " << endl; dsmcCloud dsmc("dsmc", mesh); Info<< "\nStarting time loop\n" << endl; while (runTime.loop()) { Info<< "Time = " << runTime.timeName() << nl << endl; dsmc.evolve(); //<<------ 这里是演化步 dsmc.info(); //<<------ dump到屏幕一些基本信息 runTime.write(); //<<------- 这里很关键,到底写的是什么 Info<< nl << "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; } Info<< "End\n" << endl;
-
@星星星星晴 您好,您推荐的2. 输出文件方法我基本弄明白了,特别适合输出一个平面上不同时刻的统计数据,然后用python数据处理。
我遇到的问题主要是输出三维规则网格空间点上的水滴质量,把这个数据导入到别的程序中。我尝试过用paraview输出粒子所在空间点数据,因为很不规则,所以之后用python三维插值,但是效果很差。
所以我觉得您提出的1. 将拉格朗日场转到EULER场比较适合我的情况。但是关于这个代码使用还想请教您几个问题:
1.template<class CloudType> Foam::volScalarField& Foam::IVT8_StochasticCollisionModel_2022<CloudType>::PPC() { if (!PPCPtr_.valid() ) { const fvMesh& mesh = this->owner().mesh(); PPCPtr_.reset ( new volScalarField ( IOobject ( this->owner().name() + ":PPC", mesh.time().timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), mesh, dimensionedScalar ("zero", dimless, 0.0), zeroGradientFvPatchScalarField::typeName ) ); } return PPCPtr_(); }
这段代码应该是定义了一个函数,应该放在求解器的哪个文件中呢?
或者是自己重新定义一个头文件?-
这个函数中的PPC应该是一个通用模板吧?比如我想输出 p.mass()质量的数据到EULER场,这个PPC直接用mass替换?
-
调用的时候您说用下面的代码,我想知道这段代码又是放在对应的哪个文件中呢?
scalar& PPC = PPCPtr_->primitiveFieldRef() [cellI]; PPC += 1.0;
-
-
@chengan-wang
同样可以放到cloudfunction中,对应的改名什么的
第一步写这个function
第二步在constructor里面调用,生成这个field
第三步在你需要的地方调用这个方法比较复杂,需要多个地方定义,我这仅仅是提供一个思路,可以在任何地方生成这个field,只要在计算的时候能够赋值即可,你也可以在你的solver里面生成这个field,只要在拉格朗日部分能调用到这个field就行。
为什么要插值?我没get到你的点。插值也有很多方法的,另外当你的数据量不够的时候自然会存在很大的误差,这是统计学的问题了。
方法一天然的会损失位置信息,因为网格中储存的数据都是在网格中心,如果做复杂的运算的话,这样会损失掉很多信息,anyway这是你的计算,你可以试试。
我个人觉得方法二足矣应对所有的统计问题,无非就是后处理计算复杂一点,无法paraview中直接连续性的可视化
-
@chengan-wang 这也简单啊,同理,你不需要判断是否碰到面,而是做一个判断是否在你的区域内即可,比如你需要判断在两个面之间,z-dir
if(p.position(2)<1 & p.position(2)>0) { 输出 }
但是这种方法会出现什么问题,比如一个parcel在这个区域待了3个$\Delta t_L$, 那就输出3次,就是你的输出文件几何倍数的增长。。
-
@星星星星晴 在 Euler-Lagrange的一些解析,sprayFoam 中说:
@chengan-wang 这也简单啊,同理,你不需要判断是否碰到面,而是做一个判断是否在你的区域内即可,比如你需要判断在两个面之间,z-dir
if(p.position(2)<1 & p.position(2)>0) { 输出 }
但是这种方法会出现什么问题,比如一个parcel在这个区域待了3个$\Delta t_L$, 那就输出3次,就是你的输出文件几何倍数的增长。。
您好,如果加判断条件的话应该是在particleCollector代码中加,然后编译,对吧?这个圆柱面或者矩形面的定义就无所谓了。也就是说单独命名一个输出文件。
还有,我的网格数量挺大,200x100x100,我得定义好多个长方体区域,采用循环的办法,判断粒子与每一个区域的相对位置,如果符合条件就保存数据,跳出循环。但如果我的计算时间很长,每个时间点都保存数据,数据量肯定很大,能否只保存最后一个时间步的数据?也就是说我需要传递controlDict的参数,比如startFrom startTime; startTime 0; stopAt endTime; endTime 5; deltaT 0.01;
-
-
-
@chengan-wang 自然可以 这就需要你自己研究啦,也有许多其他的方法,比如你获得你要查的目标的cell number,然后只搞这部分就行。
-
@chengan-wang
不能给你我的code,这个不是我自己的私产,我只能大致的说一下方法。
祝你好运。 -
@chengan-wang
正如我前面所说的,你可以在任何Euler/Lagrange场的计算的地方建立这个field,solver部分也可以。
然后在任何Lagrange计算的地方对这个field进行操作。
只要是这个计算的方法是符合你的要求的,Euler 时间步还是Lagrange 时间步。
你可以参考具体下面的拉格朗日部分的流程图,在你需要的地方放置计算即可。