对网格进行聚合操作,并生成polymesh文件?



  • 目标:调用GAMG-Agglomeration对网格进行聚合也就是加粗,并生成polymesh下的point、face等网格文件,最好是不覆盖原来的polymesh文件,最终能对新的网格进行计算。

    问题1:如何调用聚合网格的函数? 我发现application/test自带有一个Test-GAMGAgglomeration,但他只是在时间文件夹下生成一个volScalarField,没有生成实际的网格。

           // Write agglomeration
            {
                volScalarField scalarAgglomeration
                (
                    IOobject
                    (
                        "agglomeration",
                        runTime.timeName(),
                        mesh,
                        IOobject::NO_READ,
                        IOobject::AUTO_WRITE
                    ),
                    mesh,
                    dimensionedScalar(dimless, 0)
                );
                scalarField& fld = scalarAgglomeration.primitiveFieldRef();
                forAll(fld, celli)
                {
                    fld[celli] = cellToCoarse[celli];
                }
                if (normalise)
                {
                    fld /= max(fld);
                }
                scalarAgglomeration.correctBoundaryConditions();
                scalarAgglomeration.write();
            }
    

    问题2:如何生成新的polymesh文件,并且不覆盖原来的polymesh? 我在blockmesh源代码里面找write polymesh的代码,不知道是否mesh.write()就能实现。

    请各位前辈指导!



  • 简单查看了一下pairGAMGAgglomerate.C,看起来并没有对网格进行操作而是直接操作的矩阵系数,这样的话需要做一些工作才能从矩阵系数反推成离散的网格。



  • @东岳 东岳老师您好!
    我翻了一下资料,据说PairGAMGAgglomeration的pair是一种聚合算法,主要是根据face weights从网格交界面开始聚合。
    OpenFoam支持几何多重网格和代数多重网格(faceArea和algebraic),其中faceAreaPairGAMG的操作对象是meshmagSfmagSf处理一下好像就是所说的face weights。

    麻烦您看看聚合生成polymesh,是否可行,应该如何入手。

    faceAreaGAMGAgglomeration.C主要代码如下:

    Foam::faceAreaPairGAMGAgglomeration::faceAreaPairGAMGAgglomeration
    (
        const lduMesh& mesh,
        const dictionary& controlDict
    )
    :
        pairGAMGAgglomeration(mesh, controlDict)
    {
        const fvMesh& fvmesh = refCast<const fvMesh>(mesh);
    
        // agglomerate(mesh, sqrt(fvmesh.magSf().primitiveField()));
        agglomerate
        (
            mesh,
            mag
            (
                cmptMultiply
                (
                    fvmesh.Sf().primitiveField()
                   /sqrt(fvmesh.magSf().primitiveField()),
                    vector(1, 1.01, 1.02)
                    // vector::one
                )
            )
        );
    }
    
    
    Foam::faceAreaPairGAMGAgglomeration::faceAreaPairGAMGAgglomeration
    (
        const lduMesh& mesh,
        const scalarField& cellVolumes,
        const vectorField& faceAreas,
        const dictionary& controlDict
    )
    :
        pairGAMGAgglomeration(mesh, controlDict)
    {
        // agglomerate(mesh, sqrt(mag(faceAreas)));
        agglomerate
        (
            mesh,
            mag
            (
                cmptMultiply
                (
                    faceAreas
                   /sqrt(mag(faceAreas)),
                    vector(1, 1.01, 1.02)
                    // vector::one
                )
            )
        );
    


  • @东岳 东岳老师,您说的这个操作的矩阵系数是lduMesh吗?从矩阵系数反推成离散网格需要哪从哪方面入手呢?



  • 对,不过从矩阵系数反推成离散网格感觉不可能。从网格到矩阵倒是可以,又是有限体积法离散过程。反过来好像方程不封闭。:136: 你确认下


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2