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. Meshy
  3. snappyHexMesh的网格加密问题。

snappyHexMesh的网格加密问题。

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

    我尝试使用snappyHexMesh对网格进行进一步的细化,但是我不理解为什么我的网格在运算完之后没有大小的变化。下面是我的snappyHexMeshdict,我是一个新手,我是按照案例修改的。我不知道目前是否正确,请问懂行的大佬问题出在了哪里。图片展示了我其中一次的生成效果,下面是在图片效果之后修改的。但实际上没有什么本质区别,我只是加多了blockMeshDict里面的网格大小。我不理解的点事为什么网格靠近建筑之后没有像其他案例中一层一层的加密就如同图2一样。@李东岳
    5a716988-7368-4906-b093-e6fd40a6ef55-aff66b0c98b57abe340265e2c8be7ed.jpg
    826aaa0d-82c1-41cc-ab20-06cd73c3a976-image.png

    
    /*--------------------------------*- C++ -*----------------------------------*\
    | =========                 |                                                 |
    | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
    |  \\    /   O peration     | Version:  2.2.0                                 |
    |   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
    |    \\/     M anipulation  |                                                 |
    \*---------------------------------------------------------------------------*/
    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        object      snappyHexMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    // Which of the steps to run
    castellatedMesh true;    // make basic mesh ?
    snap            true;    // decide to snap back to surface ?
    addLayers       false;   // decide to add viscous layers ?
    
    geometry // 录入STL文件
    {
        
        side_mesh_0_45.stl {type triSurfaceMesh; name side_0;}
        side_mesh_45_90.stl {type triSurfaceMesh; name side_1;}
        side_mesh_90_135.stl {type triSurfaceMesh; name side_2;}
        side_mesh_135_180.stl {type triSurfaceMesh; name side_3;}
        side_mesh_180_225.stl {type triSurfaceMesh; name side_4;}
        side_mesh_225_270.stl {type triSurfaceMesh; name side_5;}
        side_mesh_270_315.stl {type triSurfaceMesh; name side_6;}
        side_mesh_315_360.stl {type triSurfaceMesh; name side_7;}
    
    
    
        top_mesh.stl {type triSurfaceMesh; name top;}
    
        building.stl {type triSurfaceMesh; name building;}
        grassland.stl {type triSurfaceMesh; name grassland;}
        ground.stl {type triSurfaceMesh; name ground;}
        water.stl {type triSurfaceMesh; name water;}
    
        tree.stl {type triSurfaceMesh; name tree;}
    
        refinementBox {type searchableBox; min (-1500 -1500 -5); max (2200 2200 600);}
        // 建筑加密搜索盒
        refinementBox_building
        {
            type searchableBox;
    
            min ( 740 -610 15);
            max ( 2250  860 280);
        }
    
        // 树木加密搜索盒
        refinementBox_tree
        {
            type searchableBox;
            // 同理,这里改成包围你的植被群
            min (720 -600 15);
            max (2250 860 80);
        }
    };
    
    castellatedMeshControls
    {
        maxLocalCells 2000000;  // 每个 CPU 核心允许使用的最大网格单元数,避免某个核心负载过重
        maxGlobalCells 20000000; // 全局允许的最大网格单元数,在细化阶段如果超过这个数量,系统将触发删除操作,防止内存溢出
        maxRefinementIterations 5; // 有效地限制整体迭代次数
        minRefinementCells 10; // 提高触发终止的阈值  maxLoadUnbalance 0.10;  // 允许的最大负载不平衡度,表示各个 CPU 核心之间的工作负载差异最多为 10%,确保负载均衡
        nCellsBetweenLevels 3;  // 不同细化等级之间的网格扩展因子,设置为 1 表示高细化区域与低细化区域之间的过渡最平滑
        maxShellRefinementIter 10;
        // 边缘特征细化程度
        features
        (
            {file "building.eMesh"; level 2;}
            {file "tree.eMesh"; level 0;}
    
            {file "side_mesh_0_45.eMesh"; level 0;}
            {file "side_mesh_45_90.eMesh"; level 0;}
            {file "side_mesh_90_135.eMesh"; level 0;}
            {file "side_mesh_135_180.eMesh"; level 0;}
            {file "side_mesh_180_225.eMesh"; level 0;}
            {file "side_mesh_225_270.eMesh"; level 0;}
            {file "side_mesh_270_315.eMesh"; level 0;}
            {file "side_mesh_315_360.eMesh"; level 0;}
    
            {file "top_mesh.eMesh"; level 0;}
            {file "grassland.eMesh"; level 0;}
            {file "ground.eMesh"; level 0;}
            {file "water.eMesh"; level 0;}
        );
    
        refinementSurfaces
        {
            building {
                level (2 3);
                patchInfo
                {
                    type wall; 
                    inGroups (building);
                }
            }
            
            side_0 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_1 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_2 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_3 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_4 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_5 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_6 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
            side_7 {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (side);
                }
            }
    
            top {
                level (1 1);
                patchInfo
                {
                    type patch;
                    inGroups (top);
                }
            }
    
            grassland {
                level (1 2);
                patchInfo
                {
                    type wall;
                    inGroups (ground);
                }
            }
            ground {
                level (1 2);
                patchInfo
                {
                    type wall;
                    inGroups (ground);
                }
            }
            water {
                level (1 2);            
                patchInfo
                {
                    type wall;
                    inGroups (ground);
                }
            }
    
        }
    
        resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
        refinementRegions {
             tree
         {
            mode inside;
             levels ((0 1));
             cellZone treeZone;
         }
        }
        // {wholeDomain {mode inside; levels ((1 1));}} // 细化区域,mode 为细化模式,levels 为细化等级
        // {building {mode distance; levels ((1 2) (3 1));}} // 细化区域,mode 为细化模式,levels 为细化等级mode 为细化模式(包括inside对内部网格进行细化 outside distance根据距表面网格距离进行细化),levels 为细化等级
        locationInMesh (100 100 100); //规定哪边网格是流域
        allowFreeStandingZoneFaces true; // 允许自由区域面
    }
    
    snapControls
    {
        nSmoothPatch 3; // 平滑次数
        tolerance 0.5; // 两个网格点之间的最大距离
        nSolveIter 50; // 迭代次数
        nRelaxIter 8; // 松弛次数
        nFeatureSnapIter 10; // 特征边缘迭代次数
        implicitFeatureSnap true; // 隐式特征边缘
        explicitFeatureSnap true; // 显式特征边缘
        multiRegionFeatureSnap false; // 多区域特征边缘
    }
    
    addLayersControls
    {
        relativeSizes false; // 相对大小/绝对大小
        layers
        {
            building {nSurfaceLayers 1;}
        }
    
        expansionRatio 1; // 扩展比例
        finalLayerThickness 0.3; // 最外层厚度
        minThickness 1; // 最小厚度
        nGrow 0; // 增长层数
    
        // 高级设置:
        
        featureAngle 80;  // 表面层生成的特征角度。0 表示平面,90 表示直角。如果几何表面的角度超过 80 度,则停止挤出层。
        nRelaxIter 5;  // 层生成过程中,最大允许的松弛迭代次数。用于平滑网格,防止扭曲或变形。
        nSmoothSurfaceNormals 1;  // 对表面法线的平滑处理次数,用于减少表面网格的尖锐突变。
        nSmoothNormals 5;  // 对网格内部运动方向的平滑处理迭代次数,确保网格平滑地向外扩展。
        nSmoothThickness 10;  // 平滑表面层厚度的迭代次数,数值越大,厚度分布越均匀。
        maxFaceThicknessRatio 0.5;  // 如果网格面太过扭曲(厚度超过此比值),则停止层生长。防止生成变形严重的网格。
        maxThicknessToMedialRatio 0.3;  // 层厚度与中线距离的比值,防止厚度过大时停止层的生长。
        minMedianAxisAngle 130;  // 中线轴的最小角度。如果角度过小,可能会跳过层生成。通常用于复杂几何体的细化。
        nBufferCellsNoExtrude 0;  // 用于新层终止时创建的缓冲区单元数,防止层过度扩展。
        nLayerIter 50;  // 添加层的最大迭代次数,限制网格生成过程中层生长的迭代次数
    }
    // 控制网格质量的设置。任何无法处理的阶段将根据这些设置回退操作。
    meshQualityControls
    {
        maxNonOrtho 65;  // 允许的最大非正交角(度数),控制网格的正交性。
        maxBoundarySkewness 4;  // 网格边界倾斜度的最大允许值。
        maxInternalSkewness 4;  // 内部网格单元的最大倾斜度。
        maxConcave 80;  // 允许的最大凹角(度数),控制网格单元的形状。
        maxFaceDiff 2;
        minFlatness 0.5;  // 允许的最小平面度,确保网格面不过于扭曲。
        minVol 5e-11;  // 允许的最小单元体积,避免生成过小的网格单元。
        minTetQuality 1e-8;  // 四面体网格单元的最小质量。
        minArea -1;  // 最小网格面面积,-1 表示忽略此限制。
        minTwist 0.02;  // 网格单元的最小扭曲度,确保网格质量。
        minDeterminant 0.001;  // 网格最小行列式值,衡量网格形状的质量。
        minFaceWeight 0.02;  // 网格面权重的最小值,用于衡量网格面质量。
        minVolRatio 0.01;  // 最小网格体积比,衡量相邻单元的体积差异。
        minTriangleTwist -1;  // 最小三角形扭曲度,-1 表示忽略此限制。
    
        // 高级设置:
        nSmoothScale 5;  // 控制网格平滑的比例,数值越大,网格越平整。
        errorReduction 0.75;  // 错误减少系数,控制每次迭代中如何减少网格问题。
    }
    
    // 高级设置:是否启用调试信息
    debug 0;  // 设置为 0 表示关闭调试信息。
    
    // 网格合并容差。相邻网格单元如果在此容差范围内,将被合并。
    // 容差值是初始网格边界框尺寸的一个分数。
    mergeTolerance 1E-6;  // 合并容差,值越大,网格越容易被合并。
    
    // ************************************************************************* //
    
    
    
    I 1 条回复 最后回复
  • I 在线
    I 在线
    ice_flow
    在 中回复了 Gengxiaotian 最后由 编辑
    #2

    @Gengxiaotian 逐层加密可以通过refinementRegions下面的distance模式实现

    G 2 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    在 中回复了 ice_flow 最后由 编辑
    #3

    @ice_flow 谢谢大佬

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    在 中回复了 ice_flow 最后由 编辑
    #4

    @ice_flow 538da608-28d7-47ee-9628-a8f0b97e7cbd-image.png
    我用foamToVTK导出了网格,这个图片是internal.vtu但是仍然好像每个网格都是等大的。我设置了refinementRegions的mode distance,但是好像没有预想的那样。请问大佬我有地方出错了吗,下面是我的snappyHexMeshDict。
    /--------------------------------- C++ -----------------------------------
    | ========= | |
    | \ / F ield | OpenFOAM: The Open Source CFD Toolbox |
    | \ / O peration | Version: 2.2.0 |
    | \ / A nd | Web: www.OpenFOAM.org |
    | \/ M anipulation | |
    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    object snappyHexMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    // Which of the steps to run
    castellatedMesh true; // make basic mesh ?
    snap true; // decide to snap back to surface ?
    addLayers false; // decide to add viscous layers ?

    geometry // 录入STL文件
    {

    side_mesh_0_45.stl {type triSurfaceMesh; name side_0;}
    side_mesh_45_90.stl {type triSurfaceMesh; name side_1;}
    side_mesh_90_135.stl {type triSurfaceMesh; name side_2;}
    side_mesh_135_180.stl {type triSurfaceMesh; name side_3;}
    side_mesh_180_225.stl {type triSurfaceMesh; name side_4;}
    side_mesh_225_270.stl {type triSurfaceMesh; name side_5;}
    side_mesh_270_315.stl {type triSurfaceMesh; name side_6;}
    side_mesh_315_360.stl {type triSurfaceMesh; name side_7;}
    
    
    
    top_mesh.stl {type triSurfaceMesh; name top;}
    
    building.stl {type triSurfaceMesh; name building;}
    grassland.stl {type triSurfaceMesh; name grassland;}
    ground.stl {type triSurfaceMesh; name ground;}
    water.stl {type triSurfaceMesh; name water;}
    
    tree.stl {type triSurfaceMesh; name tree;}
    
    refinementBox {type searchableBox; min (-1500 -1500 -5); max (2200 2200 600);}
    // 建筑加密搜索盒
    refinementBox_building
    {
        type searchableBox;
    
        min ( 740 -610 15);
        max ( 2250  860 280);
    }
    
    // 树木加密搜索盒
    refinementBox_tree
    {
        type searchableBox;
        // 同理,这里改成包围你的植被群
        min (720 -600 15);
        max (2250 860 80);
    }
    

    };

    castellatedMeshControls
    {
    maxLocalCells 1500000; // 每个 CPU 核心允许使用的最大网格单元数,避免某个核心负载过重
    maxGlobalCells 15000000; // 全局允许的最大网格单元数,在细化阶段如果超过这个数量,系统将触发删除操作,防止内存溢出
    maxRefinementIterations 3; // 有效地限制整体迭代次数
    minRefinementCells 10; // 提高触发终止的阈值 maxLoadUnbalance 0.10; // 允许的最大负载不平衡度,表示各个 CPU 核心之间的工作负载差异最多为 10%,确保负载均衡
    nCellsBetweenLevels 2; // 不同细化等级之间的网格扩展因子,设置为 1 表示高细化区域与低细化区域之间的过渡最平滑
    maxShellRefinementIter 10;
    // 边缘特征细化程度
    features
    (
    {file "building.eMesh"; level 2;}
    {file "tree.eMesh"; level 0;}

        {file "side_mesh_0_45.eMesh"; level 0;}
        {file "side_mesh_45_90.eMesh"; level 0;}
        {file "side_mesh_90_135.eMesh"; level 0;}
        {file "side_mesh_135_180.eMesh"; level 0;}
        {file "side_mesh_180_225.eMesh"; level 0;}
        {file "side_mesh_225_270.eMesh"; level 0;}
        {file "side_mesh_270_315.eMesh"; level 0;}
        {file "side_mesh_315_360.eMesh"; level 0;}
    
        {file "top_mesh.eMesh"; level 0;}
        {file "grassland.eMesh"; level 0;}
        {file "ground.eMesh"; level 0;}
        {file "water.eMesh"; level 0;}
    );
    
    refinementSurfaces
    {
        building {
            level (2 3);
            patchInfo
            {
                type wall; 
                inGroups (building);
            }
        }
        
        side_0 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_1 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_2 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_3 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_4 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_5 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_6 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_7 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
    
        top {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (top);
            }
        }
    
        grassland {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        ground {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        water {
            level (1 2);            
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
    
    }
    
    resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
    refinementRegions {
        building
        {
            mode distance;
            levels ((5.0 3) (10.0 2) (30.0 1));
        }
         tree
     {
        mode inside;
         levels ((0 1));
         cellZone treeZone;
     }
    }
    // {wholeDomain {mode inside; levels ((1 1));}} // 细化区域,mode 为细化模式,levels 为细化等级
    // {building {mode distance; levels ((1 2) (3 1));}} // 细化区域,mode 为细化模式,levels 为细化等级mode 为细化模式(包括inside对内部网格进行细化 outside distance根据距表面网格距离进行细化),levels 为细化等级
    locationInMesh (100 100 100); //规定哪边网格是流域
    allowFreeStandingZoneFaces true; // 允许自由区域面
    

    }

    snapControls
    {
    nSmoothPatch 3; // 平滑次数
    tolerance 0.5; // 两个网格点之间的最大距离
    nSolveIter 50; // 迭代次数
    nRelaxIter 8; // 松弛次数
    nFeatureSnapIter 10; // 特征边缘迭代次数
    implicitFeatureSnap true; // 隐式特征边缘
    explicitFeatureSnap true; // 显式特征边缘
    multiRegionFeatureSnap false; // 多区域特征边缘
    }

    addLayersControls
    {
    relativeSizes false; // 相对大小/绝对大小
    layers
    {
    building {nSurfaceLayers 1;}
    }

    expansionRatio 1; // 扩展比例
    finalLayerThickness 0.3; // 最外层厚度
    minThickness 0.001; // 最小厚度
    nGrow 0; // 增长层数
    
    // 高级设置:
    
    featureAngle 80;  // 表面层生成的特征角度。0 表示平面,90 表示直角。如果几何表面的角度超过 80 度,则停止挤出层。
    nRelaxIter 5;  // 层生成过程中,最大允许的松弛迭代次数。用于平滑网格,防止扭曲或变形。
    nSmoothSurfaceNormals 1;  // 对表面法线的平滑处理次数,用于减少表面网格的尖锐突变。
    nSmoothNormals 5;  // 对网格内部运动方向的平滑处理迭代次数,确保网格平滑地向外扩展。
    nSmoothThickness 10;  // 平滑表面层厚度的迭代次数,数值越大,厚度分布越均匀。
    maxFaceThicknessRatio 0.5;  // 如果网格面太过扭曲(厚度超过此比值),则停止层生长。防止生成变形严重的网格。
    maxThicknessToMedialRatio 0.3;  // 层厚度与中线距离的比值,防止厚度过大时停止层的生长。
    minMedianAxisAngle 130;  // 中线轴的最小角度。如果角度过小,可能会跳过层生成。通常用于复杂几何体的细化。
    nBufferCellsNoExtrude 0;  // 用于新层终止时创建的缓冲区单元数,防止层过度扩展。
    nLayerIter 50;  // 添加层的最大迭代次数,限制网格生成过程中层生长的迭代次数
    

    }
    // 控制网格质量的设置。任何无法处理的阶段将根据这些设置回退操作。
    meshQualityControls
    {
    maxNonOrtho 65; // 允许的最大非正交角(度数),控制网格的正交性。
    maxBoundarySkewness 4; // 网格边界倾斜度的最大允许值。
    maxInternalSkewness 4; // 内部网格单元的最大倾斜度。
    maxConcave 80; // 允许的最大凹角(度数),控制网格单元的形状。
    maxFaceDiff 2;
    minFlatness 0.5; // 允许的最小平面度,确保网格面不过于扭曲。
    minVol 1e-13; // 允许的最小单元体积,避免生成过小的网格单元。
    minTetQuality 1e-8; // 四面体网格单元的最小质量。
    minArea -1; // 最小网格面面积,-1 表示忽略此限制。
    minTwist 0.02; // 网格单元的最小扭曲度,确保网格质量。
    minDeterminant 0.001; // 网格最小行列式值,衡量网格形状的质量。
    minFaceWeight 0.02; // 网格面权重的最小值,用于衡量网格面质量。
    minVolRatio 0.01; // 最小网格体积比,衡量相邻单元的体积差异。
    minTriangleTwist -1; // 最小三角形扭曲度,-1 表示忽略此限制。

    // 高级设置:
    nSmoothScale 5;  // 控制网格平滑的比例,数值越大,网格越平整。
    errorReduction 0.75;  // 错误减少系数,控制每次迭代中如何减少网格问题。
    

    }

    // 高级设置:是否启用调试信息
    debug 0; // 设置为 0 表示关闭调试信息。

    // 网格合并容差。相邻网格单元如果在此容差范围内,将被合并。
    // 容差值是初始网格边界框尺寸的一个分数。
    mergeTolerance 1E-5; // 合并容差,值越大,网格越容易被合并。

    // ************************************************************************* //

    1 条回复 最后回复
  • I 在线
    I 在线
    ice_flow
    写于 最后由 编辑
    #5

    这个参数是需要根据你的网格尺寸调整的,我看这里需要加密的网格之间间距很小,或许是这个原因。我有几个问题
    1.看之前的贴图,好像区域加密也没有实现。就是refinementBox的这块代码。或许可以截取一个全景看下。
    2.在refinementSurfaces里面我看到你设置了很多边界加密,为什么在refinementRegions只设置了building和tree,而且这两者似乎也没有统一。在refinementSurfaces里building是加密到2,而refinementRegions里是3-2-1.这里可能也是一个问题。
    建议可以根据现在的背景网格和部分内部元素设置合理的加密模式,例如只有背景网格和tree。根据refinementBox-refinementSurfaces- refinementRegions递进式实现加密。
    网格质量这一块的代码建议尝试下面这种宽松的形式试一下
    meshQualityControls
    {
    //- Maximum non-orthogonality allowed. Set to 180 to disable.
    maxNonOrtho 180;

    //- Max skewness allowed. Set to <0 to disable.
    maxBoundarySkewness 20;
    maxInternalSkewness 4;
    
    //- Max concaveness allowed. Is angle (in degrees) below which concavity
    //  is allowed. 0 is straight face, <0 would be convex face.
    //  Set to 180 to disable.
    maxConcave 180;
    
    //- Minimum pyramid volume. Is absolute volume of cell pyramid.
    //  Set to a sensible fraction of the smallest cell volume expected.
    //  Set to very negative number (e.g. -1E30) to disable.
    minVol 1e-30;
    
    //- Minimum quality of the tet formed by the face-centre
    //  and variable base point minimum decomposition triangles and
    //  the cell centre.  Set to very negative number (e.g. -1E30) to
    //  disable.
    //     <0 = inside out tet,
    //      0 = flat tet
    //      1 = regular tet
    minTetQuality 1e-30;
    
    //- Minimum face area. Set to <0 to disable.
    minArea -1;
    
    //- Minimum face twist. Set to <-1 to disable. dot product of face normal
    //  and face centre triangles normal
    minTwist -2;
    
    //- Minimum normalised cell determinant
    //  1 = hex, <= 0 = folded or flattened illegal cell
    minDeterminant 1e-30;
    
    //- minFaceWeight (0 -> 0.5)
    minFaceWeight 1e-30;
    
    //- minVolRatio (0 -> 1)
    minVolRatio 1e-30;
    
    //must be >0 for Fluent compatibility
    minTriangleTwist -1;
    
    
    // Advanced
    
    //- Number of error distribution iterations
    nSmoothScale 4;
    //- Amount to scale back displacement at error points
    errorReduction 0.75;
    

    }

    G 2 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    在 中回复了 ice_flow 最后由 编辑
    #6

    @ice_flow
    我多截了几个图,像下面这样。
    bb228655-b473-4a9d-9137-c172e1ae8fe4-image.png 3a386e7d-f38b-48c9-bffe-2ab8b6ef61dd-image.png
    928f2689-ecb4-4cda-a909-5df0d01a1134-image.png
    “为什么在refinementRegions只设置了building和tree,而且这两者似乎也没有统一。”
    我是根据GPT的回答和一些示例设置的,我不知道这样设置是否正确。我这两天删除了refinementBox也是一样的效果。也许是您说的refinementSurfaces和refinementRegions设置不一致导致的吗。我只是希望靠近building和tree附近的网格按照距离逐层加密,所以才只设置了这两个。

    1 条回复 最后回复
  • C 在线
    C 在线
    chenboyao
    写于 最后由 编辑
    #7

    这个是已经snappyHexMesh -overwrite的结果了吗?看着属实不太行

    G 1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    在 中回复了 chenboyao 最后由 编辑
    #8

    @chenboyao 这个是我上一个代码删除了Box的结果,我现在尝试下面的参数代码,正在跑。我现在有点不清楚具体是什么样的配置会产生不同距离不同网格大小的网格。我希望越靠近建筑网格越小

    /--------------------------------- C++ -----------------------------------
    | ========= | |
    | \ / F ield | OpenFOAM: The Open Source CFD Toolbox |
    | \ / O peration | Version: 2.2.0 |
    | \ / A nd | Web: www.OpenFOAM.org |
    | \/ M anipulation | |
    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    object snappyHexMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    // Which of the steps to run
    castellatedMesh true; // make basic mesh ?
    snap true; // decide to snap back to surface ?
    addLayers false; // decide to add viscous layers ?

    geometry // 录入STL文件
    {

    side_mesh_0_45.stl {type triSurfaceMesh; name side_0;}
    side_mesh_45_90.stl {type triSurfaceMesh; name side_1;}
    side_mesh_90_135.stl {type triSurfaceMesh; name side_2;}
    side_mesh_135_180.stl {type triSurfaceMesh; name side_3;}
    side_mesh_180_225.stl {type triSurfaceMesh; name side_4;}
    side_mesh_225_270.stl {type triSurfaceMesh; name side_5;}
    side_mesh_270_315.stl {type triSurfaceMesh; name side_6;}
    side_mesh_315_360.stl {type triSurfaceMesh; name side_7;}
    
    
    
    top_mesh.stl {type triSurfaceMesh; name top;}
    
    building.stl {type triSurfaceMesh; name building;}
    grassland.stl {type triSurfaceMesh; name grassland;}
    ground.stl {type triSurfaceMesh; name ground;}
    water.stl {type triSurfaceMesh; name water;}
    
    tree.stl {type triSurfaceMesh; name tree;}
    
    //refinementBox {type searchableBox; min (-1500 -1500 -5); max (2200 2200 600);}
    // 建筑加密搜索盒
    

    // refinementBox_building
    //{
    // type searchableBox;
    //
    // min ( 740 -610 15);
    // max ( 2250 860 280);
    //}

    // 树木加密搜索盒
    

    // refinementBox_tree
    //{
    // type searchableBox;
    // // 同理,这里改成包围你的植被群
    // min (720 -600 15);
    // max (2250 860 80);
    //}
    };

    castellatedMeshControls
    {
    maxLocalCells 1500000; // 每个 CPU 核心允许使用的最大网格单元数,避免某个核心负载过重
    maxGlobalCells 15000000; // 全局允许的最大网格单元数,在细化阶段如果超过这个数量,系统将触发删除操作,防止内存溢出
    maxRefinementIterations 3; // 有效地限制整体迭代次数
    minRefinementCells 10; // 提高触发终止的阈值 maxLoadUnbalance 0.10; // 允许的最大负载不平衡度,表示各个 CPU 核心之间的工作负载差异最多为 10%,确保负载均衡
    nCellsBetweenLevels 2; // 不同细化等级之间的网格扩展因子,设置为 1 表示高细化区域与低细化区域之间的过渡最平滑
    maxShellRefinementIter 10;
    // 边缘特征细化程度
    features
    (
    {file "building.eMesh"; level 2;}
    {file "tree.eMesh"; level 0;}

        {file "side_mesh_0_45.eMesh"; level 0;}
        {file "side_mesh_45_90.eMesh"; level 0;}
        {file "side_mesh_90_135.eMesh"; level 0;}
        {file "side_mesh_135_180.eMesh"; level 0;}
        {file "side_mesh_180_225.eMesh"; level 0;}
        {file "side_mesh_225_270.eMesh"; level 0;}
        {file "side_mesh_270_315.eMesh"; level 0;}
        {file "side_mesh_315_360.eMesh"; level 0;}
    
        {file "top_mesh.eMesh"; level 0;}
        {file "grassland.eMesh"; level 0;}
        {file "ground.eMesh"; level 0;}
        {file "water.eMesh"; level 0;}
    );
    
    refinementSurfaces
    {
        building {
            level (1 1);
            patchInfo
            {
                type wall; 
                inGroups (building);
            }
        }
        
        side_0 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_1 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_2 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_3 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_4 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_5 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_6 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_7 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
    
        top {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (top);
            }
        }
    
        grassland {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        ground {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        water {
            level (1 2);            
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
    
    }
    
    resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
    refinementRegions {
        building
        {
            mode distance;
            levels ((5.0 3) (15.0 2) (30.0 1));
        }
         tree
     {
        mode inside;
         levels ((0 1));
         cellZone treeZone;
     }
    }
    // {wholeDomain {mode inside; levels ((1 1));}} // 细化区域,mode 为细化模式,levels 为细化等级
    // {building {mode distance; levels ((1 2) (3 1));}} // 细化区域,mode 为细化模式,levels 为细化等级mode 为细化模式(包括inside对内部网格进行细化 outside distance根据距表面网格距离进行细化),levels 为细化等级
    locationInMesh (100 100 100); //规定哪边网格是流域
    allowFreeStandingZoneFaces true; // 允许自由区域面
    

    }

    snapControls
    {
    nSmoothPatch 3; // 平滑次数
    tolerance 0.5; // 两个网格点之间的最大距离
    nSolveIter 50; // 迭代次数
    nRelaxIter 8; // 松弛次数
    nFeatureSnapIter 10; // 特征边缘迭代次数
    implicitFeatureSnap true; // 隐式特征边缘
    explicitFeatureSnap true; // 显式特征边缘
    multiRegionFeatureSnap false; // 多区域特征边缘
    }

    addLayersControls
    {
    relativeSizes false; // 相对大小/绝对大小
    layers
    {
    building {nSurfaceLayers 1;}
    }

    expansionRatio 1; // 扩展比例
    finalLayerThickness 0.3; // 最外层厚度
    minThickness 0.001; // 最小厚度
    nGrow 0; // 增长层数
    
    // 高级设置:
    
    featureAngle 80;  // 表面层生成的特征角度。0 表示平面,90 表示直角。如果几何表面的角度超过 80 度,则停止挤出层。
    nRelaxIter 5;  // 层生成过程中,最大允许的松弛迭代次数。用于平滑网格,防止扭曲或变形。
    nSmoothSurfaceNormals 1;  // 对表面法线的平滑处理次数,用于减少表面网格的尖锐突变。
    nSmoothNormals 5;  // 对网格内部运动方向的平滑处理迭代次数,确保网格平滑地向外扩展。
    nSmoothThickness 10;  // 平滑表面层厚度的迭代次数,数值越大,厚度分布越均匀。
    maxFaceThicknessRatio 0.5;  // 如果网格面太过扭曲(厚度超过此比值),则停止层生长。防止生成变形严重的网格。
    maxThicknessToMedialRatio 0.3;  // 层厚度与中线距离的比值,防止厚度过大时停止层的生长。
    minMedianAxisAngle 130;  // 中线轴的最小角度。如果角度过小,可能会跳过层生成。通常用于复杂几何体的细化。
    nBufferCellsNoExtrude 0;  // 用于新层终止时创建的缓冲区单元数,防止层过度扩展。
    nLayerIter 50;  // 添加层的最大迭代次数,限制网格生成过程中层生长的迭代次数
    

    }
    // 控制网格质量的设置。任何无法处理的阶段将根据这些设置回退操作。
    meshQualityControls
    {
    maxNonOrtho 180;
    maxBoundarySkewness 20;
    maxInternalSkewness 4;
    maxConcave 180;
    minVol 1e-30;
    minTetQuality 1e-30;
    minArea -1;
    minTwist -2;
    minDeterminant 1e-30;
    minFaceWeight 1e-30;
    minVolRatio 1e-30;
    minTriangleTwist -1;
    nSmoothScale 4;
    errorReduction 0.75;
    }

    // 高级设置:是否启用调试信息
    debug 0; // 设置为 0 表示关闭调试信息。

    // 网格合并容差。相邻网格单元如果在此容差范围内,将被合并。
    // 容差值是初始网格边界框尺寸的一个分数。
    mergeTolerance 1E-5; // 合并容差,值越大,网格越容易被合并。

    // ************************************************************************* //

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    在 中回复了 ice_flow 最后由 编辑
    #9

    @ice_flow
    f91f783c-2f93-4110-b8e1-55ff896f7367-image.png
    38a2172a-b4f1-4ea3-a733-ed8dc34ed181-image.png
    目前我生成了结果如图片所示,但似乎没有逐层加密,能看到紧贴着轮廓有小的网格,但我不知道这样的做法是否正确。
    下面是我的配置代码,我放上了snappyHexMeshDict和blockMeshDict
    /--------------------------------- C++ -----------------------------------
    | ========= | |
    | \ / F ield | OpenFOAM: The Open Source CFD Toolbox |
    | \ / O peration | Version: 2.2.0 |
    | \ / A nd | Web: www.OpenFOAM.org |
    | \/ M anipulation | |
    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    object snappyHexMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    // Which of the steps to run
    castellatedMesh true; // make basic mesh ?
    snap true; // decide to snap back to surface ?
    addLayers false; // decide to add viscous layers ?

    geometry // 录入STL文件
    {

    side_mesh_0_45.stl {type triSurfaceMesh; name side_0;}
    side_mesh_45_90.stl {type triSurfaceMesh; name side_1;}
    side_mesh_90_135.stl {type triSurfaceMesh; name side_2;}
    side_mesh_135_180.stl {type triSurfaceMesh; name side_3;}
    side_mesh_180_225.stl {type triSurfaceMesh; name side_4;}
    side_mesh_225_270.stl {type triSurfaceMesh; name side_5;}
    side_mesh_270_315.stl {type triSurfaceMesh; name side_6;}
    side_mesh_315_360.stl {type triSurfaceMesh; name side_7;}
    
    
    
    top_mesh.stl {type triSurfaceMesh; name top;}
    
    building.stl {type triSurfaceMesh; name building;}
    grassland.stl {type triSurfaceMesh; name grassland;}
    ground.stl {type triSurfaceMesh; name ground;}
    water.stl {type triSurfaceMesh; name water;}
    
    tree.stl {type triSurfaceMesh; name tree;}
    
    //refinementBox {type searchableBox; min (-1500 -1500 -5); max (2200 2200 600);}
    // 建筑加密搜索盒
    

    // refinementBox_building
    //{
    // type searchableBox;
    //
    // min ( 740 -610 15);
    // max ( 2250 860 280);
    //}

    // 树木加密搜索盒
    

    // refinementBox_tree
    //{
    // type searchableBox;
    // // 同理,这里改成包围你的植被群
    // min (720 -600 15);
    // max (2250 860 80);
    //}
    };

    castellatedMeshControls
    {
    maxLocalCells 1500000; // 每个 CPU 核心允许使用的最大网格单元数,避免某个核心负载过重
    maxGlobalCells 15000000; // 全局允许的最大网格单元数,在细化阶段如果超过这个数量,系统将触发删除操作,防止内存溢出
    maxRefinementIterations 3; // 有效地限制整体迭代次数
    minRefinementCells 10; // 提高触发终止的阈值 maxLoadUnbalance 0.10; // 允许的最大负载不平衡度,表示各个 CPU 核心之间的工作负载差异最多为 10%,确保负载均衡
    nCellsBetweenLevels 2; // 不同细化等级之间的网格扩展因子,设置为 1 表示高细化区域与低细化区域之间的过渡最平滑
    maxShellRefinementIter 10;
    // 边缘特征细化程度
    features
    (
    {file "building.eMesh"; level 2;}
    {file "tree.eMesh"; level 0;}

        {file "side_mesh_0_45.eMesh"; level 0;}
        {file "side_mesh_45_90.eMesh"; level 0;}
        {file "side_mesh_90_135.eMesh"; level 0;}
        {file "side_mesh_135_180.eMesh"; level 0;}
        {file "side_mesh_180_225.eMesh"; level 0;}
        {file "side_mesh_225_270.eMesh"; level 0;}
        {file "side_mesh_270_315.eMesh"; level 0;}
        {file "side_mesh_315_360.eMesh"; level 0;}
    
        {file "top_mesh.eMesh"; level 0;}
        {file "grassland.eMesh"; level 0;}
        {file "ground.eMesh"; level 0;}
        {file "water.eMesh"; level 0;}
    );
    
    refinementSurfaces
    {
        building {
            level (1 1);
            patchInfo
            {
                type wall; 
                inGroups (building);
            }
        }
        
        side_0 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_1 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_2 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_3 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_4 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_5 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_6 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
        side_7 {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (side);
            }
        }
    
        top {
            level (1 1);
            patchInfo
            {
                type patch;
                inGroups (top);
            }
        }
    
        grassland {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        ground {
            level (1 2);
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
        water {
            level (1 2);            
            patchInfo
            {
                type wall;
                inGroups (ground);
            }
        }
    
    }
    
    resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
    refinementRegions {
        building
        {
            mode distance;
            levels ((5.0 3) (15.0 2) (30.0 1));
        }
         tree
     {
        mode inside;
         levels ((0 1));
         cellZone treeZone;
     }
    }
    // {wholeDomain {mode inside; levels ((1 1));}} // 细化区域,mode 为细化模式,levels 为细化等级
    // {building {mode distance; levels ((1 2) (3 1));}} // 细化区域,mode 为细化模式,levels 为细化等级mode 为细化模式(包括inside对内部网格进行细化 outside distance根据距表面网格距离进行细化),levels 为细化等级
    locationInMesh (100 100 100); //规定哪边网格是流域
    allowFreeStandingZoneFaces true; // 允许自由区域面
    

    }

    snapControls
    {
    nSmoothPatch 3; // 平滑次数
    tolerance 0.5; // 两个网格点之间的最大距离
    nSolveIter 50; // 迭代次数
    nRelaxIter 8; // 松弛次数
    nFeatureSnapIter 10; // 特征边缘迭代次数
    implicitFeatureSnap true; // 隐式特征边缘
    explicitFeatureSnap true; // 显式特征边缘
    multiRegionFeatureSnap false; // 多区域特征边缘
    }

    addLayersControls
    {
    relativeSizes false; // 相对大小/绝对大小
    layers
    {
    building {nSurfaceLayers 1;}
    }

    expansionRatio 1; // 扩展比例
    finalLayerThickness 0.3; // 最外层厚度
    minThickness 0.001; // 最小厚度
    nGrow 0; // 增长层数
    
    // 高级设置:
    
    featureAngle 80;  // 表面层生成的特征角度。0 表示平面,90 表示直角。如果几何表面的角度超过 80 度,则停止挤出层。
    nRelaxIter 5;  // 层生成过程中,最大允许的松弛迭代次数。用于平滑网格,防止扭曲或变形。
    nSmoothSurfaceNormals 1;  // 对表面法线的平滑处理次数,用于减少表面网格的尖锐突变。
    nSmoothNormals 5;  // 对网格内部运动方向的平滑处理迭代次数,确保网格平滑地向外扩展。
    nSmoothThickness 10;  // 平滑表面层厚度的迭代次数,数值越大,厚度分布越均匀。
    maxFaceThicknessRatio 0.5;  // 如果网格面太过扭曲(厚度超过此比值),则停止层生长。防止生成变形严重的网格。
    maxThicknessToMedialRatio 0.3;  // 层厚度与中线距离的比值,防止厚度过大时停止层的生长。
    minMedianAxisAngle 130;  // 中线轴的最小角度。如果角度过小,可能会跳过层生成。通常用于复杂几何体的细化。
    nBufferCellsNoExtrude 0;  // 用于新层终止时创建的缓冲区单元数,防止层过度扩展。
    nLayerIter 50;  // 添加层的最大迭代次数,限制网格生成过程中层生长的迭代次数
    

    }
    // 控制网格质量的设置。任何无法处理的阶段将根据这些设置回退操作。
    meshQualityControls
    {
    maxNonOrtho 180;
    maxBoundarySkewness 20;
    maxInternalSkewness 4;
    maxConcave 180;
    minVol 1e-30;
    minTetQuality 1e-30;
    minArea -1;
    minTwist -2;
    minDeterminant 1e-30;
    minFaceWeight 1e-30;
    minVolRatio 1e-30;
    minTriangleTwist -1;
    nSmoothScale 4;
    errorReduction 0.75;
    }

    // 高级设置:是否启用调试信息
    debug 0; // 设置为 0 表示关闭调试信息。

    // 网格合并容差。相邻网格单元如果在此容差范围内,将被合并。
    // 容差值是初始网格边界框尺寸的一个分数。
    mergeTolerance 1E-5; // 合并容差,值越大,网格越容易被合并。

    // ************************************************************************* //

    /--------------------------------- C++ -----------------------------------
    | ========= | |
    | \ / F ield | OpenFOAM: The Open Source CFD Toolbox |
    | \ / O peration | Version: 2.0.1 |
    | \ / A nd | Web: www.OpenFOAM.com |
    | \/ M anipulation | |
    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    object blockMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    scale 1; // 单位为米

    vertices // (x, y, z) 坐标,需要比实际模型略大。需要注意的是边角点的编辑需要按照立方体的编写顺序,与下面保持一致

    (
    // 略大于截图中的 range
    (-720 -2080 0) // 0
    (3680 -2080 0) // 1
    (3680 2320 0) // 2
    (-720 2320 0) // 3
    (-720 -2080 760) // 4
    (3680 -2080 760) // 5
    (3680 2320 760) // 6
    (-720 2320 760) // 7
    );
    edges // 没有曲线可以空着
    (
    );

    blocks
    (
    // 一个六面体:0-1-2-3 + 4-5-6-7
    // 你可以调节 (200 200 200) 改变每个方向网格数
    hex (0 1 2 3 4 5 6 7)
    (880 880 152)
    simpleGrading (1 1 3)
    );

    boundary
    (
    front
    {
    type patch;
    faces
    (
    (0 4 7 3)
    );
    }

    back
    {
        type patch;
        faces
        (
            (1 2 6 5)
        );
    }
    
    leftAndRight
    {
        type patch;
        faces
        (
            (2 3 7 6)  // 右侧面
            (0 1 5 4)  // 左侧面
        );
    }
    
    top
    {
        type patch;
        faces
        (
            (4 5 6 7)
        );
    }
    
    bottom
    {
        type patch;
        faces
        (
            (0 3 2 1)
        );
    }
    

    );

    mergePatchPairs
    (
    );

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    写于 最后由 编辑
    #10

    求大佬解答,或者发一个已经有逐层加密的示例代码也成。

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    写于 最后由 编辑
    #11

    会和toposet有关吗,我为了将树冠设置为多孔介质,设置了这个代码。另外我使用foamToVTK -latestTime生成的vtk查看了文件,这是对的吗。求大佬解答
    /--------------------------------- C++ -----------------------------------\

    \ / F ield OpenFOAM: The Open Source CFD Toolbox
    \ / O peration Website: https://openfoam.org
    \ / A nd Version: 6
    \/ M anipulation

    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    location "system";
    object topoSetDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    actions
    (
    {
    name treeCellSet;
    type cellSet;
    action new;
    source surfaceToCell;
    sourceInfo
    {
    file "constant/triSurface/tree.stl";
    outsidePoints ((2000 2000 200)); // 确保该点在 STL 外部
    nearDistance 5; // 选取距离表面 5m 内的单元
    includeCut true;
    includeInside true;
    includeOutside false;
    curvature 0; // 加入 curvature 参数,避免报错
    }
    }

    {
        name    treeZone;
        type    cellZoneSet;
        action  new;
        source  setToCellZone;
        sourceInfo
        {
            set treeCellSet;
        }
    }
    

    );

    // ************************************************************************* //

    1 条回复 最后回复
  • C 在线
    C 在线
    chenboyao
    写于 最后由 编辑
    #12

    我看了你的snappyHexMesh,你在加密过程中你的level基本上是0、1、2,这几个参数建议你在设置refineMeshRegions时候增大一些,不然你snappyHexMesh后的网格就咋加密,建议你可以设置成levers( 2 3)这样

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    写于 最后由 编辑
    #13

    我进行了修改,只加密了建筑,以及设置了Box,图片是目前的结果,看上去实现了部分局部加密,但是我不太理解为什么会有条曲线。
    image.png
    /--------------------------------- C++ -----------------------------------
    | ========= | |
    | \ / F ield | OpenFOAM: The Open Source CFD Toolbox |
    | \ / O peration | Version: 2.2.0 |
    | \ / A nd | Web: www.OpenFOAM.org |
    | \/ M anipulation | |
    *---------------------------------------------------------------------------*/
    FoamFile
    {
    version 2.0;
    format ascii;
    class dictionary;
    object snappyHexMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

    // Which of the steps to run
    castellatedMesh true; // make basic mesh ?
    snap true; // decide to snap back to surface ?
    addLayers false; // decide to add viscous layers ?

    geometry // 录入STL文件
    {

    side_mesh_0_45.stl {type triSurfaceMesh; name side_0;}
    side_mesh_45_90.stl {type triSurfaceMesh; name side_1;}
    side_mesh_90_135.stl {type triSurfaceMesh; name side_2;}
    side_mesh_135_180.stl {type triSurfaceMesh; name side_3;}
    side_mesh_180_225.stl {type triSurfaceMesh; name side_4;}
    side_mesh_225_270.stl {type triSurfaceMesh; name side_5;}
    side_mesh_270_315.stl {type triSurfaceMesh; name side_6;}
    side_mesh_315_360.stl {type triSurfaceMesh; name side_7;}
    
    
    
    top_mesh.stl {type triSurfaceMesh; name top;}
    
    building.stl {type triSurfaceMesh; name building;}
    grassland.stl {type triSurfaceMesh; name grassland;}
    ground.stl {type triSurfaceMesh; name ground;}
    water.stl {type triSurfaceMesh; name water;}
    
    tree.stl {type triSurfaceMesh; name tree;}
    
    refinementBox_building
    {
        type searchableBox;
    
        min ( 740 -610 15);
        max ( 2250  860 280);
    }
    

    };

    castellatedMeshControls
    {
    maxLocalCells 1500000; // 每个 CPU 核心允许使用的最大网格单元数,避免某个核心负载过重
    maxGlobalCells 15000000; // 全局允许的最大网格单元数,在细化阶段如果超过这个数量,系统将触发删除操作,防止内存溢出
    maxRefinementIterations 3; // 有效地限制整体迭代次数
    minRefinementCells 10; // 提高触发终止的阈值 maxLoadUnbalance 0.10; // 允许的最大负载不平衡度,表示各个 CPU 核心之间的工作负载差异最多为 10%,确保负载均衡
    nCellsBetweenLevels 2; // 不同细化等级之间的网格扩展因子,设置为 1 表示高细化区域与低细化区域之间的过渡最平滑
    maxShellRefinementIter 10;
    // 边缘特征细化程度
    features
    (
    {file "building.eMesh"; level 1;}
    );

    refinementSurfaces
    {
        building {
            level (3 3);
            patchInfo
            {
                type wall; 
                inGroups (building);
            }
        }
    
    }
    
    resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
    refinementRegions 
    {
        refinementBox_building
        {
            mode inside;
            levels ((1 2));
        }
    }
    // {wholeDomain {mode inside; levels ((1 1));}} // 细化区域,mode 为细化模式,levels 为细化等级
    // {building {mode distance; levels ((1 2) (3 1));}} // 细化区域,mode 为细化模式,levels 为细化等级mode 为细化模式(包括inside对内部网格进行细化 outside distance根据距表面网格距离进行细化),levels 为细化等级
    locationInMesh (100 100 100); //规定哪边网格是流域
    allowFreeStandingZoneFaces true; // 允许自由区域面
    

    }

    snapControls
    {
    nSmoothPatch 3; // 平滑次数
    tolerance 0.5; // 两个网格点之间的最大距离
    nSolveIter 50; // 迭代次数
    nRelaxIter 8; // 松弛次数
    nFeatureSnapIter 10; // 特征边缘迭代次数
    implicitFeatureSnap true; // 隐式特征边缘
    explicitFeatureSnap false; // 显式特征边缘
    multiRegionFeatureSnap false; // 多区域特征边缘
    }

    addLayersControls
    {
    relativeSizes false; // 相对大小/绝对大小
    layers
    {
    building {nSurfaceLayers 1;}
    }

    expansionRatio 1; // 扩展比例
    finalLayerThickness 0.3; // 最外层厚度
    minThickness 0.001; // 最小厚度
    nGrow 0; // 增长层数
    
    // 高级设置:
    
    featureAngle 80;  // 表面层生成的特征角度。0 表示平面,90 表示直角。如果几何表面的角度超过 80 度,则停止挤出层。
    nRelaxIter 5;  // 层生成过程中,最大允许的松弛迭代次数。用于平滑网格,防止扭曲或变形。
    nSmoothSurfaceNormals 1;  // 对表面法线的平滑处理次数,用于减少表面网格的尖锐突变。
    nSmoothNormals 5;  // 对网格内部运动方向的平滑处理迭代次数,确保网格平滑地向外扩展。
    nSmoothThickness 10;  // 平滑表面层厚度的迭代次数,数值越大,厚度分布越均匀。
    maxFaceThicknessRatio 0.5;  // 如果网格面太过扭曲(厚度超过此比值),则停止层生长。防止生成变形严重的网格。
    maxThicknessToMedialRatio 0.3;  // 层厚度与中线距离的比值,防止厚度过大时停止层的生长。
    minMedianAxisAngle 130;  // 中线轴的最小角度。如果角度过小,可能会跳过层生成。通常用于复杂几何体的细化。
    nBufferCellsNoExtrude 0;  // 用于新层终止时创建的缓冲区单元数,防止层过度扩展。
    nLayerIter 50;  // 添加层的最大迭代次数,限制网格生成过程中层生长的迭代次数
    

    }
    // 控制网格质量的设置。任何无法处理的阶段将根据这些设置回退操作。
    meshQualityControls
    {
    maxNonOrtho 65; // 允许的最大非正交角(度数),控制网格的正交性。
    maxBoundarySkewness 4; // 网格边界倾斜度的最大允许值。
    maxInternalSkewness 4; // 内部网格单元的最大倾斜度。
    maxConcave 80; // 允许的最大凹角(度数),控制网格单元的形状。
    maxFaceDiff 2;
    minFlatness 0.5; // 允许的最小平面度,确保网格面不过于扭曲。
    minVol 1e-13; // 允许的最小单元体积,避免生成过小的网格单元。
    minTetQuality 1e-8; // 四面体网格单元的最小质量。
    minArea -1; // 最小网格面面积,-1 表示忽略此限制。
    minTwist 0.02; // 网格单元的最小扭曲度,确保网格质量。
    minDeterminant 0.001; // 网格最小行列式值,衡量网格形状的质量。
    minFaceWeight 0.02; // 网格面权重的最小值,用于衡量网格面质量。
    minVolRatio 0.01; // 最小网格体积比,衡量相邻单元的体积差异。
    minTriangleTwist -1; // 最小三角形扭曲度,-1 表示忽略此限制。

    // 高级设置:
    nSmoothScale 5;  // 控制网格平滑的比例,数值越大,网格越平整。
    errorReduction 0.75;  // 错误减少系数,控制每次迭代中如何减少网格问题。
    

    }

    // 高级设置:是否启用调试信息
    debug 0; // 设置为 0 表示关闭调试信息。

    // 网格合并容差。相邻网格单元如果在此容差范围内,将被合并。
    // 容差值是初始网格边界框尺寸的一个分数。
    mergeTolerance 1E-5; // 合并容差,值越大,网格越容易被合并。

    // ************************************************************************* //

    C 1 条回复 最后回复
  • C 在线
    C 在线
    chenboyao
    在 中回复了 Gengxiaotian 最后由 编辑
    #14

    @Gengxiaotian 那些乱七八糟的曲线也算正常,有些时候就是显示的问题,这个不影响计算的

    1 条回复 最后回复
  • G 在线
    G 在线
    Gengxiaotian
    写于 最后由 编辑
    #15

    我想进一步加上距离建筑逐步加密
    building
    {
    mode distance;
    levels ((5.0 3) (15.0 2) (30.0 1));
    }
    我添加了
    refinementRegions
    {
    building
    {
    mode distance;
    levels ((5.0 3) (15.0 2) (30.0 1));
    }
    refinementBox_building
    {
    mode inside;
    levels ((1 2));
    }
    }
    目前还在运行,我有一个困惑,我想要同时对建筑与植被加密,我是否应该设置refinementBox_building同时包含建筑和植被,还是说建筑一个Box,植被一个box。而且我的植被网格是通过toposet设置的,我有点不清楚是否应该在snappyHexMesh中设置。
    还有一个我不清楚的点,我想要做的是用圆形作为边界,目前还是以blockMesh的矩形构成的比阿姐。这里面我是要将side_0-7,top, ground等都放到refinementSurfaces对吗,还是说refinementRegions 也要加上,我现在对这两个部分有点混淆。

    I 1 条回复 最后回复
  • I 在线
    I 在线
    ice_flow
    在 中回复了 Gengxiaotian 最后由 编辑
    #16

    @Gengxiaotian
    1.建议使用同一个box,如果距离不远
    2.案例可以参考自带算例OpenFOAM-v2206\tutorials\incompressible\pimpleFoam\RAS\wingMotion
    3.加密边界是根据所加密的结构外形进行外延的,具体形状和网格密度有关。如果是背景网格自然是自己设置的形状。
    4.我理解refinementSurfaces更多是为了保持形状,粗糙的网格会导致几何失真。

    1 条回复 最后回复

  • 登录

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