Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. Coupled level set-VOF方法

Coupled level set-VOF方法

已定时 已固定 已锁定 已移动 OpenFOAM
10 帖子 5 发布者 5.8k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Z 离线
    Z 离线
    Zhujh
    写于 最后由 李东岳 编辑
    #1

    各位大佬们好,我是研究波浪与结构物相互作用的,之前看到了下面这篇文章 https://www.sciencedirect.com/science/article/pii/S0301932206001832?via%3Dihub ,因为用VOF捕捉自由液面会存在钝化的问题,特别是想研究破碎波的时候,水气交界面的网格需要非常细,于是就想用一下这个方法。

    ae8a8d4d-90d6-4702-a0b3-2fded1619f11-image.png

    根据这篇文章网上有公开的一部分代码,我就照着植入到了interFoam里面,取了个名字叫clsinterFoam,下面几张是我完成后对比两个求解器气泡上升的结果,可以看到clsinterFoam确实对交界面的捕捉更到位(左边是interFoam,右边是clsinterFoam)。

    72aa53d8-7890-48af-9176-ddbec5952d3a-image.png
    3e7dcaaf-8c2b-4df9-8d63-f18acf57a2c7-image.png
    4617006d-99d1-4499-9603-3b426f84ef57-image.png
    但是当我换到溃坝的算例的时候,出现了奇怪的问题,后处理结果来看,水体好像变得不连续了,最后会扩散到整个计算域。看上去像是没有了重力,但是算例里面我是加了的,想请教一下各位大佬,看看问题出在哪儿。
    1635111b-c932-47b4-a78b-16eb6c7cecd5-image.png 6fd36484-cc7d-4e10-b0ac-e8f6052c7e45-image.png
    以下是在interFoam上改的部分代码:

    	#include "mappingPsi.H"
    	#include "solveLSFunction.H"
    	#include "calcNewCurvature.H"
    
        turbulence->validate();
    
        if (!LTS)
        {
            #include "CourantNo.H"
            #include "setInitialDeltaT.H"
        }
    
        Info<< "\nStarting time loop\n" << endl;
    
        while (runTime.run())
        {
            #include "readDyMControls.H"
    
            if (LTS)
            {
                #include "setRDeltaT.H"
            }
            else
            {
                #include "CourantNo.H"
                #include "alphaCourantNo.H"
                #include "setDeltaT.H"
            }
    
            runTime++;
    
            Info<< "Time = " << runTime.timeName() << nl << endl;
    
            // --- Pressure-velocity PIMPLE corrector loop
            while (pimple.loop())
            {
                if (pimple.firstIter() || moveMeshOuterCorrectors)
                {
                    mesh.update();
    
                    if (mesh.changing())
                    {
                        // Do not apply previous time-step mesh compression flux
                        // if the mesh topology changed
                        if (mesh.topoChanging())
                        {
                            talphaPhi1Corr0.clear();
                        }
    
                        gh = (g & mesh.C()) - ghRef;
                        ghf = (g & mesh.Cf()) - ghRef;
    
                        MRF.update();
    
                        if (correctPhi)
                        {
                            // Calculate absolute flux
                            // from the mapped surface velocity
                            phi = mesh.Sf() & Uf();
    
                            #include "correctPhi.H"
    
                            // Make the flux relative to the mesh motion
                            fvc::makeRelative(phi, U);
    
                            mixture.correct();
                        }
    
                        if (checkMeshCourantNo)
                        {
                            #include "meshCourantNo.H"
                        }
                    }
                }
    
                #include "alphaControls.H"
                #include "alphaEqnSubCycle.H"
    
    			#include "mappingPsi.H"
    			#include "solveLSFunction.H"
    			#include "calcNewCurvature.H"
    			#include "updateFlux.H"
    
    			mixture.correct();
    
                if (pimple.frozenFlow())
                {
                    continue;
                }
    
                #include "UEqn.H"
    
                // --- Pressure corrector loop
                while (pimple.correct())
                {
                    #include "pEqn.H"
                }
    
                if (pimple.turbCorr())
                {
                    turbulence->correct();
                }
            }
    
    		// reInitialise the alpha equation 
    		if (runTime.outputTime())
    		{
    			Info << "Overwriting alpha" << nl << endl;
    			alpha1 = H;
    			volScalarField& alpha10 = const_cast<volScalarField&>(alpha1.oldTime());
    			alpha10 = H.oldTime();
    			//const_cast<volScalarField&>(alpha1.storeOldTime()()) = H.oldTime();
    		}
    
            runTime.write();
    
            runTime.printExecutionTime(Info);
        }
    
        Info<< "End\n" << endl;
    
        return 0;
    
    //mappingPsi.H
    // mapping alpha value to psi0
       psi0 == (double(2.0)*alpha1-double(1.0))*gamma;
    
    //solvevelSFunction.H
    // solve Level-Set function as the re-initialization equation
       Info<< "solve the reinitialization equation"     
           << nl << endl;
    
       psi == psi0;
    
       for (int corr=0; corr<int(epsilon.value()/deltaTau.value()); corr++)
       {
          psi = psi + psi0/mag(psi0)*(double(1)-mag(fvc::grad(psi)*dimChange))*deltaTau;
          psi.correctBoundaryConditions();
       }
    
    
    // update Dirac function
       forAll(mesh.cells(),celli)
       {
          if(mag(psi[celli]) > epsilon.value())
             delta[celli] = double(0);
          else
             delta[celli] = double(1.0)/(double(2.0)*epsilon.value())*(double(1.0)+Foam::cos(M_PI*psi[celli]/epsilon.value()));
       };
    
    // update Heaviside function
       forAll(mesh.cells(),celli)
       {
          if(psi[celli] < -epsilon.value())
             H[celli] = double(0);
          else if(epsilon.value() < psi[celli])
             H [celli] = double(1);
          else
             H[celli] = double(1.0)/double(2.0)*(double(1.0)+psi[celli]/epsilon.value()+Foam::sin(M_PI*psi[celli]/epsilon.value())/M_PI);
       };
    
    //calcNewCurvature.H
    // calculate normal vector
    volVectorField gradPsi(fvc::grad(psi));
    surfaceVectorField gradPsif(fvc::interpolate(gradPsi));
    surfaceVectorField nVecfv(gradPsif/(mag(gradPsif)+scalar(1.0e-6)/dimChange));
    surfaceScalarField nVecf(nVecfv & mesh.Sf());
    
    // calculate new curvature based on psi (LS function)
       C == -fvc::div(nVecf);
    
    //updataFlux.H
    {
        word alphaScheme("div(phi,alpha)");
        word alpharScheme("div(phirb,alpha)");
    	// Standard face-flux compression coefficient
        surfaceScalarField phic(mixture.cAlpha()*mag(phi/mesh.magSf()));
    	surfaceScalarField::Boundary& phicBf = phic.boundaryFieldRef();
        //surfaceScalarField phic(mag(phi/mesh.magSf()));
    
        // Add the optional isotropic compression contribution
        if (icAlpha > 0)
        {
            phic *= (1.0 - icAlpha);
            phic += (mixture.cAlpha()*icAlpha)*fvc::interpolate(mag(U));
        }
    
        // Do not compress interface at non-coupled boundary faces
        // (inlets, outlets etc.)
        forAll(phic.boundaryField(), patchi)
        {
            fvsPatchScalarField& phicp = phicBf[patchi];
    
            if (!phicp.coupled())
            {
                phicp == 0;
            }
        }
    
        surfaceScalarField phir(phic*nVecf);
    
        surfaceScalarField phiAlpha
        (
            fvc::flux
            (
                phi,
                alpha1,
                alphaScheme
            )
          + fvc::flux
            (
                -fvc::flux(-phir, scalar(1) - alpha1, alpharScheme),
                alpha1,
                alpharScheme
            )
        );
    
            MULES::explicitSolve(alpha1, phi, phiAlpha, 1, 0);
    
            rhoPhi = phiAlpha*(rho1 - rho2) + phi*rho2;
    }
    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 Zhujh 最后由 编辑
    #2

    @zhujh 看起来非常有意思。你那个算的比VOF强很多。不过我要收拾行李去杭州了。只能国庆回来能详细看看了。但愿其他大佬能帮到你。比如 @队长别开枪

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    Z 1 条回复 最后回复
  • Z 离线
    Z 离线
    Zhujh
    在 中回复了 李东岳 最后由 编辑
    #3

    @李东岳 谢谢谢谢李老师!!这个是我20年的暑假整的,但是当时没整出来,今年才发了小论文,下午注册的账号,我可太激动了!马上就发了一贴。
    补充一下就是气泡那个模拟,两个求解器是用的同一套网格。

    1 条回复 最后回复
  • S 离线
    S 离线
    Shihang Chen
    写于 最后由 编辑
    #4

    @Zhujh 您好,也采用了与您基本相同的CLSVOF方法进行计算,然而对于毛细张力主导的问题,这个方法表现出了更强的虚假流动(寄生流动)的问题,如无重力状态下的水滴。请问您遇到过类似的问题么?同时我也参考fluent里面的两种抑制虚假流动方法(密度和H函数),但是收效甚微,想问下您有什么建议吗

    C 1 条回复 最后回复
  • E 离线
    E 离线
    EricLiu
    写于 最后由 编辑
    #5

    @Zhujh @Shihang-Chen 两位大佬好,请问你们用到的CLSVOF 方法有相关的代码资源吗,我最近也打算结合CLS和VOF方法,但是没有找到合适的切入点,openfoam这块属于刚开始学

    S 1 条回复 最后回复
  • S 离线
    S 离线
    Shihang Chen
    在 中回复了 EricLiu 最后由 编辑
    #6

    @EricLiu 不是大佬。这个讨论顶部文章附带一些代码,或者直接github搜索clsvof也能有很多收获。

    1 条回复 最后回复
  • E 离线
    E 离线
    EricLiu
    写于 最后由 编辑
    #7

    @Shihang-Chen 十分感谢,我去查一下

    1 条回复 最后回复
  • C 在线
    C 在线
    capillaryFix
    在 中回复了 Shihang Chen 最后由 编辑
    #8

    @Shihang-Chen 关于spurious currents/velocities,我们此前在OpenFOAM里植入了一个非常简单但是可行的方法,代码量与植入难度不大,具体请参考:https://www.sciencedirect.com/science/article/pii/S1877750323002557

    S 李东岳李 2 条回复 最后回复
  • S 离线
    S 离线
    Shihang Chen
    在 中回复了 capillaryFix 最后由 编辑
    #9

    @capillaryFix 太好了,感谢感谢,我会好好看看。我目前一直使用的消除寄生流的方法是基于sharpen surface model来的,这个效果也是很好。

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 capillaryFix 最后由 编辑
    #10

    @capillaryFix 这个流弊,老铁

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]