对网格进行聚合操作,并生成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()就能实现。
请各位前辈指导!
-
@东岳 东岳老师您好!
我翻了一下资料,据说PairGAMGAgglomeration的pair是一种聚合算法,主要是根据face weights从网格交界面开始聚合。
OpenFoam支持几何多重网格和代数多重网格(faceArea和algebraic),其中faceAreaPairGAMG的操作对象是mesh
和magSf
,magSf
处理一下好像就是所说的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吗?从矩阵系数反推成离散网格需要哪从哪方面入手呢?