CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    Euler-Lagrange的一些解析,sprayFoam

    OpenFOAM
    6
    62
    4093
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 星
      星星星星晴 最后由 编辑

      因为要写给project partner关于我的一部分工作,所以写了这个东西,仅涉及了默认的OpenFOAM的一些东西,不能说是本着开源精神,毕竟自己做的东西并没有involve,但是希望能对论坛里做欧拉拉格朗日的小伙伴们一些帮助,尤其是新手。此贴会长期更新,一点一点来。

      本人也是资历有限,在OF里一番摸爬滚打,不免会有理解错误,望见谅~
      因为工作不涉及到thermo部分,所以这部分基本不会。。哈哈
      :chitang:

      This document is just for the explaination of the sprayFoam.pdf

      m.sui20@foxmail.com

      星 1 条回复 最后回复 回复 引用
      • 星
        星星星星晴 @星星星星晴 最后由 编辑

        默认的Lagrangian solver

        particleFoam, rhoParticleFoam 这两个是不解流场的,所以在使用这个solver的时候,需要有一个frozen的流场或者如果单纯解拉格朗日的话,就不用考虑流场的东西了

        所以只有one-way coupling对应之前版本icoUncoupledKinematicParcelFoam和uncoupledKinematicParcelFoam

        其他几个solver是解流场的,除了sprayFoam是用过的,其他的就不献丑了

        m.sui20@foxmail.com

        vbcwl 香柏树 2 条回复 最后回复 回复 引用
        • 星
          星星星星晴 最后由 编辑

          aachanbomb_sprayFoam设置解析.pdf

          m.sui20@foxmail.com

          chengan.wang 1 条回复 最后回复 回复 引用
          • 星
            星星星星晴 最后由 编辑

            Parcel和Particle的区别,两者并不相同

            在使用Parcel概念的时候一定要注意Parcel 和Particle 是有区别的
            Parcel是Particle的合集,所以diameter和velocity是相同的,但是质量是所有particle的和

            $m_{parcel} = \sum m_{particles}= \rho_p V * np$

            所以再考虑到parcel质量的时候一定别忘了np
            在考虑mass的时候也别忘了体积和直径是立方关系。
            再做统计的时候一定要考虑好到底是做parcel的统计还是particle的统计。

            统计某一个平面的parcel的相关信息

            因为of里是单独将lagrangianfield 拿出来的,所以说,再paraview中是无法使用plot over line查看拉格朗日场的。于是解决方法通常有两种

            1. 将拉格朗日场转到Euler场

            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_();
            }
            
            然后再调用的时候这么调用即可
            scalar& PPC = PPCPtr_->primitiveFieldRef() [cellI];
            PPC += 1.0;
            

            2. 输出文件

            然后用python或者什么后处理。
            具体可以参阅ParticleCollector,再particleCollector下的postMove中添加如下code, 具体参数就根据自己的具体要求添加把。

                 forAll (hitFaceIDs_, i) {
                        std::ofstream outfile;
                        outfile.setf (ios_base::fixed, ios_base::floatfield);
                        outfile.precision (8);
                        outfile.open ("output.txt", ios_base::app);
                        outfile << this->owner().db().time().timeName() << tab
                                << p.origId()                       << tab
                                << p.typeId()                       << tab
                                << p.age()                          << tab
                                << p.position().component (0)       << tab
                                << p.position().component (1)       << tab
                                << p.position().component (2)       << tab
                                << p.U().component (0)              << tab
                                << p.U().component (1)              << tab
                                << p.U().component (2)              << tab
                                << p.d()                            << tab
                                << p.Rep()                          << tab
                                << p.nParticle()                    << tab
                                << p.mass() * 1e18                  << tab
                                << nl;
                    }
            

            两种方法利弊:
            方法1,
            pro: 简单快捷,不需要大量的算力,会吃一些内存,但是完全取决于你的cell,可以再parview中简单直接的看到随时间的变化
            con: 当你需要进行一些统计学的运算的话,需要建立一些fields,而且无法精确统计每个parcel, 另外如果需要做时均的话,会损失一些信息。。(血与泪的教训)

            方法2,
            pro: 每一条输出就是一条数据,你可以输出任何你想要的数据,做任何统计学上的后处理
            con: 需要后处理,可能会输出几十上百G的file,python或者matlab等后处理,需要一定的时间。

            m.sui20@foxmail.com

            李东岳 chengan.wang 2 条回复 最后回复 回复 引用
            • chengan.wang
              chengan.wang @星星星星晴 最后由 编辑

              @星星星星晴 您好,请教您个小问题,coupled是否引⼊1way 还是2way,这个指的是啥意思呢?还有newFormat yes;干啥用的呢?

              星 1 条回复 最后回复 回复 引用
              • 星
                星星星星晴 @chengan.wang 最后由 编辑

                @chengan-wang 1-way 就是 parcel收到流场的影响,2way的话就是流场也收到parcel的影响
                newFormat 就是chemkin库,具体这部分你要去thermo查,
                如何计算某个温度下的表面张力和粘度什么的 polynomial 还是什么的,具体参数都是什么,都需要你自己查的。 这玩意是有标准库的。
                chemkin不是很熟,我平时都不用这个,文件里面写了

                m.sui20@foxmail.com

                chengan.wang 1 条回复 最后回复 回复 引用
                • chengan.wang
                  chengan.wang @星星星星晴 最后由 编辑

                  @星星星星晴 非常感谢帮忙,我就是输出水雾就行,不用考虑化学反应,我感觉newFormat没啥用,就注释掉了。目前能生成水雾了,正在琢磨怎么提取质量分布的数据等等。
                  paraview 处理Lagrangian数据

                  星 1 条回复 最后回复 回复 引用
                  • 星
                    星星星星晴 @chengan.wang 最后由 编辑

                    @chengan-wang 上面已写具体做法

                    m.sui20@foxmail.com

                    1 条回复 最后回复 回复 引用
                    • 李东岳
                      李东岳 管理员 @星星星星晴 最后由 编辑

                      @星星星星晴 :146: :146: :146:

                      CFD高性能服务器 http://dyfluid.com/servers.html

                      1 条回复 最后回复 回复 引用
                      • chengan.wang
                        chengan.wang 最后由 编辑

                        @星星星星晴 您好,我参考了GOFUN2017_ParticleSimulations_slides.pdf ,建立一个文件夹,并把文件拷过来。

                        mkdir lagrangian
                        cp -r $FOAM_SRC/lagrangian/intermediate/ lagrangian/
                        

                        采用输出文件方法2,修改particleCollector,然后编译也成功了,
                        但是输出文件中没有看到output.txt文件,
                        Screenshot from 2022-08-22 17-30-43.png Screenshot from 2022-08-22 17-28-46.png
                        我还需要在算例中设置什么命令才能调用particleCollector?
                        谢谢

                        星 1 条回复 最后回复 回复 引用
                        • 星
                          星星星星晴 @chengan.wang 最后由 编辑

                          @chengan-wang 这个是cloudfunction,在sprayproperties里面添加cloudfunction。

                          m.sui20@foxmail.com

                          chengan.wang vbcwl 2 条回复 最后回复 回复 引用
                          • chengan.wang
                            chengan.wang @星星星星晴 最后由 编辑

                            @星星星星晴 谢谢指点!
                            我这两天大概改了一下cloudfunction,似乎能运行了,但是从重新编译的求解器log文件上看,应该有一些问题,我好像重复调用了一些库函数:

                            Duplicate entry facePostProcessing in runtime selection table CloudFunctionObject
                            #0	/home/chengan/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64GccDPOpt/lib/libOpenFOAM.so(_ZN4Foam5error14safePrintStackERSo+0x3e) [0x7f28ae2ae0ae]
                            #1	/home/chengan/OpenFOAM/chengan-2.4.0/platforms/linux64GccDPOpt/lib/libstatisticslagrangianIntermediate.so(_ZN4Foam19CloudFunctionObjectINS_14KinematicCloudINS_5CloudINS_15KinematicParcelINS_8particleEEEEEEEE31adddictionaryConstructorToTableINS_18FacePostProcessingIS7_EEEC1ERKNS_4wordE+0xfb) [0x7f28b4ff288b]
                            #2	/home/chengan/OpenFOAM/chengan-2.4.0/platforms/linux64GccDPOpt/lib/libstatisticslagrangianIntermediate.so(+0x2410f5) [0x7f28b4fbe0f5]
                            #3	/lib64/ld-linux-x86-64.so.2(+0x108d3) [0x7f28b55618d3]
                            #4	/lib64/ld-linux-x86-64.so.2(+0x10ca) [0x7f28b55520ca]
                            Duplicate entry particleCollector in runtime selection table CloudFunctionObject
                            #0	/home/chengan/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64GccDPOpt/lib/libOpenFOAM.so(_ZN4Foam5error14safePrintStackERSo+0x3e) [0x7f28ae2ae0ae]
                            #1	/home/chengan/OpenFOAM/chengan-2.4.0/platforms/linux64GccDPOpt/lib/libstatisticslagrangianIntermediate.so(_ZN4Foam19CloudFunctionObjectINS_14KinematicCloudINS_5CloudINS_15KinematicParcelINS_8particleEEEEEEEE31adddictionaryConstructorToTableINS_17ParticleCollectorIS7_EEEC2ERKNS_4wordE+0xfb) [0x7f28b4ff29cb]
                            #2	/home/chengan/OpenFOAM/chengan-2.4.0/platforms/linux64GccDPOpt/lib/libstatisticslagrangianIntermediate.so(+0x24115c) [0x7f28b4fbe15c]
                            #3	/lib64/ld-linux-x86-64.so.2(+0x108d3) [0x7f28b55618d3]
                            #4	/lib64/ld-linux-x86-64.so.2(+0x10ca) [0x7f28b55520ca]
                            Duplicate entry particleErosion in runtime selection table CloudFunctionObject
                            #0	/home/chengan/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64GccDPOpt/lib/libOpenFOAM.so(_ZN4Foam5error14safePrintStackERSo+0x3e) [0x7f28ae2ae0ae]
                            #1	/home/chengan/OpenFOAM/chengan-2.4.0/platforms/linux64GccDPOpt/lib/libstatisticslagrangianIntermediate.so(_ZN4Foam19CloudFunctionObjectINS_14KinematicCloudINS_5CloudINS_15KinematicParcelINS_8particleEEEEEEEE31adddictionaryConstructorToTableINS_15ParticleErosionIS7_EEEC1ERKNS_4wordE+0xfb) [0x7f28b4ff2b0b]
                            

                            我又看了一下求解器Make文件夹的options文件:

                            EXE_INC = \
                                -Ilagrangian/intermediate/lnInclude \
                                -I$(LIB_SRC)/finiteVolume/lnInclude \
                                -I${LIB_SRC}/meshTools/lnInclude \
                                -I${LIB_SRC}/sampling/lnInclude \
                                -I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \
                                -I$(LIB_SRC)/lagrangian/basic/lnInclude \
                                -I$(LIB_SRC)/lagrangian/spray/lnInclude \
                                -I$(LIB_SRC)/lagrangian/distributionModels/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/properties/liquidProperties/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/properties/liquidMixtureProperties/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/properties/solidProperties/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/properties/solidMixtureProperties/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/thermophysicalFunctions/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/SLGThermo/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
                                -I$(LIB_SRC)/thermophysicalModels/radiationModels/lnInclude \
                                -I$(LIB_SRC)/ODE/lnInclude \
                                -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
                                -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
                                -I$(LIB_SRC)/fvOptions/lnInclude \
                                -I$(LIB_SRC)/combustionModels/lnInclude
                            
                            
                            EXE_LIBS = \
                                -L$(FOAM_USER_LIBBIN) \
                                -lstatisticslagrangianIntermediate \
                                -lfiniteVolume \
                                -lmeshTools \
                                -lsampling \
                                -lcompressibleTurbulenceModel \
                                -lcompressibleRASModels \
                                -lcompressibleLESModels \
                                -llagrangian \
                                -llagrangianTurbulence \
                                -llagrangianSpray \
                                -lspecie \
                                -lfluidThermophysicalModels \
                                -lliquidProperties \
                                -lliquidMixtureProperties \
                                -lsolidProperties \
                                -lsolidMixtureProperties \
                                -lthermophysicalFunctions \
                                -lreactionThermophysicalModels \
                                -lSLGThermo \
                                -lchemistryModel \
                                -lradiationModels \
                                -lODE \
                                -lregionModels \
                                -lsurfaceFilmModels \
                                -lfvOptions \
                                -lcombustionModels
                            

                            没看出来我编译的intermediate文件夹跟哪个冲突。(我在求解器文件夹中建立lagrangian文件夹,然后把原始的intermediate文件夹拷进去,修改particleCollector,然后编译,编译过程中没有报错)。
                            麻烦您啦!

                            星 1 条回复 最后回复 回复 引用
                            • 星
                              星星星星晴 @chengan.wang 最后由 编辑

                              @chengan-wang 看来你这个是祖传代码,我也看不出来你这个问题到底在哪。。虽然of的基础变化不大,但是你还用的是2.4。。

                              你这个编译方法看起来是可以使用的,但是你只编译了intermediate这个文件夹是么,你确定其他关联到intermediate的库的都关联这个了么?

                              建议你自己一点一点查吧

                              m.sui20@foxmail.com

                              chengan.wang 1 条回复 最后回复 回复 引用
                              • chengan.wang
                                chengan.wang @星星星星晴 最后由 编辑

                                @星星星星晴 谢谢,我一直用2.4.0,所以用sprayFoam就没有换版本。另外请教您修改cloudfunction之后,采用的是是啥编译方法?能推荐一下么?

                                星 1 条回复 最后回复 回复 引用
                                • 星
                                  星星星星晴 @chengan.wang 最后由 编辑

                                  @chengan-wang 就是普通的 教程上的方法。。。一板一眼

                                  m.sui20@foxmail.com

                                  1 条回复 最后回复 回复 引用
                                  • chengan.wang
                                    chengan.wang @星星星星晴 最后由 编辑

                                    @星星星星晴 您好,我这次直接在OpenFOAM-2.4.0下面的ParticleCollector.C文件修改,wclean, wmake libso,编译成功,避免了冲突问题。

                                    // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
                                    
                                    template<class CloudType>
                                    void Foam::ParticleCollector<CloudType>::postMove
                                    (
                                        parcelType& p,
                                        const label cellI,
                                        const scalar dt,
                                        const point& position0,
                                        bool& keepParticle
                                    )
                                    {
                                        if ((parcelType_ != -1) && (parcelType_ != p.typeId()))
                                        {
                                            return;
                                        }
                                    
                                        // slightly extend end position to avoid falling within tracking tolerances
                                        const point position1 = position0 + 1.0001*(p.position() - position0);
                                    
                                        hitFaceIDs_.clear();
                                    
                                        switch (mode_)
                                        {
                                            case mtPolygon:
                                            {
                                                collectParcelPolygon(position0, position1);
                                                break;
                                            }
                                            case mtConcentricCircle:
                                            {
                                                collectParcelConcentricCircles(position0, position1);
                                                break;
                                            }
                                            default:
                                            {
                                            }
                                        }
                                    
                                    
                                        forAll(hitFaceIDs_, i)
                                        {
                                            label faceI = hitFaceIDs_[i];
                                            scalar m = p.nParticle()*p.mass();
                                    
                                            if (negateParcelsOppositeNormal_)
                                            {
                                                vector Uhat = p.U();
                                                Uhat /= mag(Uhat) + ROOTVSMALL;
                                                if ((Uhat & normal_[faceI]) < 0)
                                                {
                                                    m *= -1.0;
                                                }
                                            }
                                    
                                            // add mass contribution
                                            mass_[faceI] += m;
                                    
                                            if (nSector_ == 1)
                                            {
                                                mass_[faceI + 1] += m;
                                                mass_[faceI + 2] += m;
                                                mass_[faceI + 3] += m;
                                            }
                                    
                                            if (removeCollected_)
                                            {
                                                keepParticle = false;
                                            }
                                        }
                                    
                                        //******add by myself******
                                        forAll(hitFaceIDs_, i) 
                                        {
                                            std::ofstream outfile;
                                            outfile.setf(ios_base::fixed, ios_base::floatfield);
                                            outfile.precision(8);
                                            outfile.open("output.txt", ios_base::app);
                                            outfile << this->owner().db().time().timeName() << tab
                                                        << p.origId()                       << tab
                                                        << p.typeId()                       << tab
                                                        << p.age()                          << tab
                                                        << p.position().component(0)        << tab
                                                        << p.position().component(1)        << tab
                                                        << p.position().component(2)        << tab
                                                        << p.U().component(0)               << tab
                                                        << p.U().component(1)               << tab
                                                        << p.U().component(2)               << tab
                                                        << p.d()                            << tab
                                                        << p.nParticle()                    << tab
                                                        << p.mass()*1e18                    << tab
                                                        << nl;
                                        }
                                        //******add by myself******
                                    
                                    }
                                    
                                    

                                    之后,我在sprayCloudProperties文件中定义(用的是ParticleCollector.H自带例子)

                                    cloudFunctions
                                    {
                                        particleCollector2
                                        {
                                            type            particleCollector;
                                    
                                            mode            polygon;
                                            polygons
                                            (
                                                (
                                                    (-0.01 0.05 -0.01)
                                                    (-0.01 0.05 0.01)
                                                    (0.01 0.05 0.01)
                                                    (0.01 0.05 -0.01)
                                                )
                                            );
                                            normal          (0 0 1);
                                    
                                            negateParcelsOppositeNormal no;
                                            removeCollected no;
                                            surfaceFormat   vtk;
                                            resetOnWrite    no;
                                            log             yes;
                                        }
                                    }
                                    

                                    运行至第一个时间步长就报错了

                                    [2] --> FOAM FATAL IO ERROR: [13] 
                                    [13] 
                                    [13] --> FOAM FATAL IO ERROR: 
                                    [13] wrong token type - expected Scalar, found on line 0 the punctuation token '-'
                                    [13] 
                                    [13] file: /home/chengan/OpenFOAM/chengan-2.4.0/run/sprayFoam/watermist/processor13/0/uniform/lagrangian/sprayCloud/sprayCloudOutputProperties.cloudFunctionObject.particleCollector2.massFlowRate at line 0.
                                    [13] 
                                    [13]     From function operator>>(Istream&, Scalar&)
                                    [13]     in file lnInclude/Scalar.C at line 93.
                                    [13] 
                                    FOAM parallel run exiting
                                    [13] 
                                    
                                    [2] wrong token type - expected Scalar, found on line 0 the punctuation token '-'
                                    [2] 
                                    [2] file: /home/chengan/OpenFOAM/chengan-2.4.0/run/sprayFoam/watermist/processor2/0/uniform/lagrangian/sprayCloud/sprayCloudOutputProperties.cloudFunctionObject.particleCollector2.massFlowRate at line 0.
                                    [2] 
                                    [2]     From function operator>>(Istream&, Scalar&)
                                    [2]     in file lnInclude/Scalar.C at line 93.
                                    [2] 
                                    FOAM parallel run exiting
                                    [2] 
                                    
                                    particleCollector output:
                                    --------------------------------------------------------------------------
                                    MPI_ABORT was invoked on rank 2 in communicator MPI_COMM_WORLD
                                    with errorcode 1.
                                    
                                    NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
                                    You may or may not see output from other processes, depending on
                                    exactly when Open MPI kills them.
                                    --------------------------------------------------------------------------
                                    [chengan-MS-7C80:26316] 1 more process has sent help message help-mpi-api.txt / mpi-abort
                                    [chengan-MS-7C80:26316] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages
                                    

                                    如果不用particleCollector,直接使用cloudFunctions{}算例可以运行。

                                    我没有搞明白到底什么地方出了问题

                                    星 1 条回复 最后回复 回复 引用
                                    • 星
                                      星星星星晴 @chengan.wang 最后由 编辑

                                      这部分你可以删掉,particlecollector总是有些问题,我也遇到过,后来不必要的东西全删掉了

                                      
                                          forAll(hitFaceIDs_, i)
                                          {
                                              label faceI = hitFaceIDs_[i];
                                              scalar m = p.nParticle()*p.mass();
                                      
                                              if (negateParcelsOppositeNormal_)
                                              {
                                                  vector Uhat = p.U();
                                                  Uhat /= mag(Uhat) + ROOTVSMALL;
                                                  if ((Uhat & normal_[faceI]) < 0)
                                                  {
                                                      m *= -1.0;
                                                  }
                                              }
                                      
                                              // add mass contribution
                                              mass_[faceI] += m;
                                      
                                              if (nSector_ == 1)
                                              {
                                                  mass_[faceI + 1] += m;
                                                  mass_[faceI + 2] += m;
                                                  mass_[faceI + 3] += m;
                                              }
                                      
                                              if (removeCollected_)
                                              {
                                                  keepParticle = false;
                                              }
                                          }
                                      
                                      

                                      m.sui20@foxmail.com

                                      chengan.wang 1 条回复 最后回复 回复 引用
                                      • vbcwl
                                        vbcwl @星星星星晴 最后由 编辑

                                        @星星星星晴 前辈您好,我也是参考了这个教程(GOFUN2018)在pimpleFoam的基础上添加了求解粒子的部分,想请教您一下,这个教程里的方法是不是 流体对粒子,粒子对流体,粒子之间,粒子与壁面的相互作用都可以考虑,只需要在kinematicCloudProperties调整相关的设置就可以了?

                                        LBE

                                        星 2 条回复 最后回复 回复 引用
                                        • 星
                                          星星星星晴 @vbcwl 最后由 编辑

                                          @vbcwl 这个也要看你用的是什么of版本,我记得好像在4之前 turbulence dispersion model是有问题的,kinematic parcel好像不做这步,忘了 不确定,需要你自己查一下,粒子之间好像kinematic parcel也没有吧,需要你确认,因为有的时候是有这个模型,但是他只是一个空函数,壁面就是简单的 stick,rebound, escape。

                                          然后drag 还有lift的cd cl好像也是有问题的,具体你需要根据你的需求来看,都得查code

                                          m.sui20@foxmail.com

                                          vbcwl 1 条回复 最后回复 回复 引用
                                          • vbcwl
                                            vbcwl @星星星星晴 最后由 编辑

                                            @星星星星晴 感谢前辈:146:

                                            LBE

                                            1 条回复 最后回复 回复 引用
                                            • 星
                                              星星星星晴 @vbcwl 最后由 编辑

                                              @vbcwl
                                              在kinematicparcel.C中

                                              流体对粒子判断受力是通过Fcp.Sp()和Fncp.Su()这两项,显性隐性的区别,calcVelocity方程计算新速度。
                                              calcDispersion方程是dispersionmodel里计算新流场速度,OF自带是基于k-e的

                                              粒子对流体:UTrans这一项传递的

                                              粒子之间:kinematicCloud中的 stochasticCollision().update(td, solution_.trackTime());这一项

                                              粒子与壁面:hitFace, hitpatch这个方程等,具体调用哪个 这部分我不是很熟悉
                                              OpenFOAM-8/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/ 具体模型是在这个部分

                                              具体你用了某个模型的话一定要看好code,有的模型kicematicparcel是没有的

                                              m.sui20@foxmail.com

                                              vbcwl 1 条回复 最后回复 回复 引用
                                              • vbcwl
                                                vbcwl @星星星星晴 最后由 编辑

                                                @星星星星晴 多谢提醒,一定在了解code以及公式之后在使用模型

                                                LBE

                                                1 条回复 最后回复 回复 引用
                                                • chengan.wang
                                                  chengan.wang @星星星星晴 最后由 编辑

                                                  @星星星星晴 您好,谢谢回复

                                                  [2] file: /home/chengan/OpenFOAM/chengan-2.4.0/run/sprayFoam/watermist/processor2/0/uniform/lagrangian/sprayCloud/sprayCloudOutputProperties.cloudFunctionObject.particleCollector2.massFlowRate at line 0.
                                                  [2] 
                                                  [2]     From function operator>>(Istream&, Scalar&)
                                                  [2]     in file lnInclude/Scalar.C at line 93.
                                                  [2] 
                                                  FOAM parallel run exiting
                                                  [2] 
                                                  
                                                  particleCollector output:
                                                  --------------------------------------------------------------------------
                                                  MPI_ABORT was invoked on rank 2 in communicator MPI_COMM_WORLD
                                                  with errorcode 1.
                                                  

                                                  这个问题我大概知道怎么回事了,当resetOnWrite no;如果我采用单核计算,这个错误问题就没有出现;resetOnWrite yes;才能用多核并行,但我不知道有没有啥影响。

                                                  第二个问题,我直接在OpenFOAM-2.4.0下面的ParticleCollector.C文件修改,然后在intermediate文件夹下编译,wclean; wmake libso。其它没有动。但是运行结束后在postProcessing文件夹里面没有找到output.txt文件,感觉是没有调用新编译的库文件函数?您的编译方法参考教程能方便发一下么?
                                                  Screenshot from 2022-08-27 16-26-52.png
                                                  Screenshot from 2022-08-27 16-30-31.png

                                                  第三个问题,我用polygon做了一个切片,

                                                      particleCollector2
                                                      {
                                                          type            particleCollector;
                                                  
                                                          mode            polygon;
                                                          polygons
                                                          (
                                                              (
                                                                  (-0.01 0.06 -0.01)
                                                                  (-0.01 0.06 0.01)
                                                                  (0.01 0.06 0.01)
                                                                  (0.01 0.06 -0.01)
                                                              )
                                                          );
                                                          normal          (0 0 1);
                                                  
                                                          negateParcelsOppositeNormal no;
                                                          removeCollected no;
                                                          surfaceFormat   vtk;
                                                          resetOnWrite    yes; 
                                                          log             yes;
                                                      }
                                                  
                                                  

                                                  Screenshot from 2022-08-27 16-43-54.png

                                                  很明显,粒子已经通过我设计的多边形,但是质量流量等于0,这又是什么原因呢?

                                                  1 条回复 最后回复 回复 引用
                                                  • 星
                                                    星星星星晴 最后由 编辑

                                                    @chengan-wang

                                                    1. 我没有试过resetOnWrite 这部分,所以我也不知道你这么弄有没有问题。我仅仅是使用output的文件作后处理,套用了particlecollector这个cloudfunction而已,对于其他的东西我并不在意,而且之前总出错,与其用一个无法确定是否正确的东西,不如原始一点自己处理。

                                                    2. 编译教程你可以在google上找很多,最主要的是你编译了一个东西以后,要对其重命名,然后相关引用到该lib的都要引用你新编译的模型,仔细看了一下,你在solver部分是有问题的,但是你编译了spray这个文件了么?编译的新spray有没有用到新的intermediate?solver没有引用新的spray。

                                                    3.如果你像我说的删除掉那部分code的话,自然没有质量的计算啊,所以后处理就是自己写个python script或者你用matlab或者什么后处理文件,因为你文件里面包含了所有hitpatch的数据。

                                                    m.sui20@foxmail.com

                                                    chengan.wang 1 条回复 最后回复 回复 引用
                                                    • chengan.wang
                                                      chengan.wang @星星星星晴 最后由 编辑

                                                      @星星星星晴 谢谢

                                                      1. 我直接改原始文件内容,然后在原始的安装包编译,也不用改名,我的理解是既然动态链接,不改文件名,就自然调用了,所以spray这个文件没有重新编译。原始的安装包2.4就是一系列文件编译,我改了其中一个文件内容,相当于安装包版本升级了一下编译,这种理解不对么?
                                                      2. 我没有删除掉code,没有质量的计算,所以觉得很奇怪。
                                                      星 1 条回复 最后回复 回复 引用
                                                      • 星
                                                        星星星星晴 @chengan.wang 最后由 编辑

                                                        @chengan-wang

                                                        1. 额,这我就不是很了解了,我也不是code大神,仅仅是使用推荐的方法进行编译,这肯定不会错,正常情况下,建议无论更改了 什么,最好是重新编译一下相关的东西,以免发生错误。有些东西没办法解释。。。就是这么做,也不会思考为什么。

                                                        你修改原始包也没问题,但是不用重新命名。
                                                        但是如果有些东西你自己编译错了,很可能会引发连锁反应,这也是为什么人家推荐用的是

                                                        $USER_LIB_SRC
                                                        
                                                        $LIB_SRC
                                                        

                                                        不是在人家原始的包里面做修改的原因,这样用以区别你自己的东西和原始的东西。
                                                        另外并不是所有人都有root的权限的。
                                                        我个人觉得还是人家推荐的方式比较好。

                                                        1. 这我就不是很清楚了。

                                                        m.sui20@foxmail.com

                                                        chengan.wang 2 条回复 最后回复 回复 引用
                                                        • chengan.wang
                                                          chengan.wang @星星星星晴 最后由 编辑

                                                          @星星星星晴 谢谢哈,麻烦您这么久

                                                          1 条回复 最后回复 回复 引用
                                                          • chengan.wang
                                                            chengan.wang @星星星星晴 最后由 编辑

                                                            @星星星星晴 您好,第三个错误我找到了,normal之前设置不对 改成(0 1 0);就可以了。搞不懂为啥坐标都给了,自己还要定义面的法线方向。

                                                            通过和您交流和自己实践理解,感觉对这个后处理问题最好还是用“2. 输出文件”方法,“1. 将拉格朗日场转到EULER场”这种方法我没有尝试,但是感觉应该属于空间插值,准确行应该是不如直接统计自己指定特定位置上的数据。

                                                            还有两个小疑问,如果我统计某一条线上的数据,实际上粒子很难碰到这条线,所以我应该设置一个很细长的面或者是圆柱吧?

                                                            另外就是有什么比较快捷的方式在polygons设置很多个平面吗?比如20个切面,或者50个。我可以提前编辑好,累加粘贴,但是感觉太麻烦了

                                                                    polygons
                                                                    (
                                                                        (
                                                                            (-0.01 0.06 -0.01)
                                                                            (-0.01 0.06 0.01)
                                                                            (0.01 0.06 0.01)
                                                                            (0.01 0.06 -0.01)
                                                                        )
                                                                    );
                                                            
                                                            星 1 条回复 最后回复 回复 引用
                                                            • 星
                                                              星星星星晴 @chengan.wang 最后由 编辑

                                                              @chengan-wang 在 Euler-Lagrange的一些解析,sprayFoam 中说:

                                                              第三个错误我找到了,normal之前设置不对 改成(0 1 0);就可以了。搞不懂为啥坐标都给了,自己还要定义面的法线方向。
                                                              通过和您交流和自己实践理解,感觉对这个后处理问题最好还是用“2. 输出文件”方法,“1. 将拉格朗日场转到EULER场”这种方法我没有尝试,但是感觉应该属于空间插值,准确行应该是不如直接统计自己指定特定位置上的数据。

                                                              1. 个人认为,定义法向是因为平面可以正面接受parcel 或者背面接受parcel

                                                              2. 不属于空间差值,就相当于一个cell不停的累加数据,比如你想要这个cell内平均的拉格朗日颗粒的直径,通过方法1可以这样,cell内不停的积累数据,然后做一个时间平均,也可以统计cell内通过多少parcel,统计数量等,最大的问题在于不能精确到每个parcel但是可以相对简洁的做统计,比后处理要快,而且是可以可视化的。最大的问题在于如何平均,时间平均还是数目平均,有的时候平均会消除一些统计学数据,见仁见智吧,每个方法都有其相对的好处。

                                                              3. 我不用polygons 所以没对这个部分看,我直接是circle做一个截面。

                                                              m.sui20@foxmail.com

                                                              1 条回复 最后回复 回复 引用
                                                              • vbcwl
                                                                vbcwl @星星星星晴 最后由 编辑

                                                                @星星星星晴 前辈您好,想向您请教一下,openFoam如何调用硬球模型呢?

                                                                LBE

                                                                星 1 条回复 最后回复 回复 引用
                                                                • 星
                                                                  星星星星晴 @vbcwl 最后由 编辑

                                                                  @vbcwl 硬球模型?碰撞?

                                                                  默认是这个弹簧模型
                                                                  OpenFOAM-8/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairModel/PairSpringSliderDashpot/

                                                                  默认的话是这个在kinematiccloud里面,不同的cloud调用的一些模型是不一样的,你要具体看你用的是什么cloud,具体看吧,

                                                                  m.sui20@foxmail.com

                                                                  vbcwl 1 条回复 最后回复 回复 引用
                                                                  • vbcwl
                                                                    vbcwl @星星星星晴 最后由 编辑

                                                                    @星星星星晴 前辈您好,我是参考的GOFUN在pimpleFoam上加的粒子。然后这里只有那个PairSpringSliderDashPot软求模型,请问您知道怎么才能调用src/lagrangian/DSMC/submodels/bindaryCollisionModel/LarsenBorgnakkeVariableHardSphere这个可变硬球模型么?

                                                                    LBE

                                                                    星 2 条回复 最后回复 回复 引用
                                                                    • 星
                                                                      星星星星晴 @vbcwl 最后由 编辑

                                                                      @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

                                                                      m.sui20@foxmail.com

                                                                      1 条回复 最后回复 回复 引用
                                                                      • 星
                                                                        星星星星晴 @vbcwl 最后由 编辑

                                                                        @vbcwl 理论上gofun那个方法引入所有的cloud都没问题,只要提供cloud需要的相关field就行,所以你可以尝试在gofun的基础上修改kinematiccloud为dsmccloud 或者你可以修改dsmcfoam 加上pimple 计算即可

                                                                        m.sui20@foxmail.com

                                                                        vbcwl 李东岳 3 条回复 最后回复 回复 引用
                                                                        • vbcwl
                                                                          vbcwl @星星星星晴 最后由 编辑

                                                                          @星星星星晴 感谢前辈:146:

                                                                          LBE

                                                                          1 条回复 最后回复 回复 引用
                                                                          • 李东岳
                                                                            李东岳 管理员 @星星星星晴 最后由 编辑

                                                                            @星星星星晴 感谢分享 大佬大佬 :duang: 恨不得送你3个本子

                                                                            CFD高性能服务器 http://dyfluid.com/servers.html

                                                                            星 1 条回复 最后回复 回复 引用
                                                                            • 星
                                                                              星星星星晴 @李东岳 最后由 编辑

                                                                              @李东岳 想找个工作啊

                                                                              m.sui20@foxmail.com

                                                                              1 条回复 最后回复 回复 引用
                                                                              • vbcwl
                                                                                vbcwl @星星星星晴 最后由 编辑

                                                                                @星星星星晴 我尝试着调用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里么

                                                                                LBE

                                                                                星 1 条回复 最后回复 回复 引用
                                                                                • 星
                                                                                  星星星星晴 @vbcwl 最后由 编辑

                                                                                  @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;
                                                                                  
                                                                                  

                                                                                  m.sui20@foxmail.com

                                                                                  chengan.wang 1 条回复 最后回复 回复 引用
                                                                                  • chengan.wang
                                                                                    chengan.wang @星星星星晴 最后由 编辑

                                                                                    @星星星星晴 您好,您推荐的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_();
                                                                                    }
                                                                                    

                                                                                    这段代码应该是定义了一个函数,应该放在求解器的哪个文件中呢?
                                                                                    Screenshot from 2022-09-08 15-46-58.png
                                                                                    或者是自己重新定义一个头文件?

                                                                                    1. 这个函数中的PPC应该是一个通用模板吧?比如我想输出 p.mass()质量的数据到EULER场,这个PPC直接用mass替换?

                                                                                    2. 调用的时候您说用下面的代码,我想知道这段代码又是放在对应的哪个文件中呢?

                                                                                    scalar& PPC = PPCPtr_->primitiveFieldRef() [cellI];
                                                                                    PPC += 1.0;
                                                                                    
                                                                                    星 1 条回复 最后回复 回复 引用
                                                                                    • 星
                                                                                      星星星星晴 @chengan.wang 最后由 编辑

                                                                                      @chengan-wang
                                                                                      同样可以放到cloudfunction中,对应的改名什么的
                                                                                      第一步写这个function
                                                                                      第二步在constructor里面调用,生成这个field
                                                                                      第三步在你需要的地方调用

                                                                                      这个方法比较复杂,需要多个地方定义,我这仅仅是提供一个思路,可以在任何地方生成这个field,只要在计算的时候能够赋值即可,你也可以在你的solver里面生成这个field,只要在拉格朗日部分能调用到这个field就行。

                                                                                      为什么要插值?我没get到你的点。插值也有很多方法的,另外当你的数据量不够的时候自然会存在很大的误差,这是统计学的问题了。

                                                                                      方法一天然的会损失位置信息,因为网格中储存的数据都是在网格中心,如果做复杂的运算的话,这样会损失掉很多信息,anyway这是你的计算,你可以试试。

                                                                                      我个人觉得方法二足矣应对所有的统计问题,无非就是后处理计算复杂一点,无法paraview中直接连续性的可视化

                                                                                      m.sui20@foxmail.com

                                                                                      chengan.wang 1 条回复 最后回复 回复 引用
                                                                                      • chengan.wang
                                                                                        chengan.wang @星星星星晴 最后由 编辑

                                                                                        @星星星星晴 谢谢回复,方法2我倒是能用了,只是我需要输出不仅仅是几个面上的数据,而是统计200x100x100这样的网格节点上的数据,不知道该怎么弄了

                                                                                        星 1 条回复 最后回复 回复 引用
                                                                                        • 星
                                                                                          星星星星晴 @chengan.wang 最后由 编辑

                                                                                          @chengan-wang 这也简单啊,同理,你不需要判断是否碰到面,而是做一个判断是否在你的区域内即可,比如你需要判断在两个面之间,z-dir

                                                                                          if(p.position(2)<1 & p.position(2)>0)
                                                                                          {
                                                                                          输出
                                                                                          }
                                                                                          

                                                                                          但是这种方法会出现什么问题,比如一个parcel在这个区域待了3个$\Delta t_L$, 那就输出3次,就是你的输出文件几何倍数的增长。。

                                                                                          m.sui20@foxmail.com

                                                                                          chengan.wang 2 条回复 最后回复 回复 引用
                                                                                          • chengan.wang
                                                                                            chengan.wang @星星星星晴 最后由 编辑

                                                                                            @星星星星晴 在 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;
                                                                                            
                                                                                            星 1 条回复 最后回复 回复 引用
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • Referenced by  李东岳 李东岳 
                                                                                            • 星
                                                                                              星星星星晴 @chengan.wang 最后由 编辑

                                                                                              @chengan-wang 自然可以 这就需要你自己研究啦,也有许多其他的方法,比如你获得你要查的目标的cell number,然后只搞这部分就行。

                                                                                              m.sui20@foxmail.com

                                                                                              chengan.wang 1 条回复 最后回复 回复 引用
                                                                                              • chengan.wang
                                                                                                chengan.wang @星星星星晴 最后由 编辑

                                                                                                @星星星星晴 我仔细想了一下,输出文件的方法可能数据量很大,感觉还是转换的方法更合适,
                                                                                                但还是有点没有搞清楚。

                                                                                                您之前告诉我可以放到cloudfunction中,我想知道您具体是放在哪个文件中了,能提供个思路么?我想看看安装包的原始文件,然后再比较一下您的代码,这样可能就清楚该怎么改和调用了。

                                                                                                另外,IVT8_StochasticCollisionModel_2022,PPC这是随便取得名字么?我在使用的时候是不是得改动呢?

                                                                                                星 1 条回复 最后回复 回复 引用
                                                                                                • 星
                                                                                                  星星星星晴 @chengan.wang 最后由 编辑

                                                                                                  @chengan-wang
                                                                                                  不能给你我的code,这个不是我自己的私产,我只能大致的说一下方法。
                                                                                                  祝你好运。

                                                                                                  m.sui20@foxmail.com

                                                                                                  chengan.wang 1 条回复 最后回复 回复 引用
                                                                                                  • chengan.wang
                                                                                                    chengan.wang @星星星星晴 最后由 编辑

                                                                                                    @星星星星晴 不是要您的code,就是想知道应该改哪个文件而已,您误会了

                                                                                                    星 1 条回复 最后回复 回复 引用
                                                                                                    • 星
                                                                                                      星星星星晴 @chengan.wang 最后由 编辑

                                                                                                      @chengan-wang
                                                                                                      正如我前面所说的,你可以在任何Euler/Lagrange场的计算的地方建立这个field,solver部分也可以。
                                                                                                      然后在任何Lagrange计算的地方对这个field进行操作。
                                                                                                      只要是这个计算的方法是符合你的要求的,Euler 时间步还是Lagrange 时间步。
                                                                                                      你可以参考具体下面的拉格朗日部分的流程图,在你需要的地方放置计算即可。

                                                                                                      51407930-774c-41c8-84d4-a35ece7fe83c-image.png

                                                                                                      m.sui20@foxmail.com

                                                                                                      chengan.wang 1 条回复 最后回复 回复 引用
                                                                                                      • chengan.wang
                                                                                                        chengan.wang @星星星星晴 最后由 编辑

                                                                                                        @星星星星晴 非常感谢,我再仔细研究一下。我在google以及源代码中没有查到IVT8_StochasticCollisionModel_2022,PPC,它们代表的意思您方便告诉我么?感觉这个PPC应该是粒子的相关信息,又感觉直接用这个名字不对

                                                                                                        星 1 条回复 最后回复 回复 引用
                                                                                                        • First post
                                                                                                          Last post