感谢大佬,我解决了问题,但似乎又出现了新的问题。起因是我希望用snap来加密多孔介质,但是我不知道为什么突然多了stl中不存在的部分。如下图,第一张图是cellZone,第二个是用来生成cellZone的stl文件。我在最下面贴出了我的snap设置。这让我十分困惑,我不理解为什么会出现这种情况。
image.png
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 ( 720 -600 15);
max ( 2250 860 280);
}
};
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 1;}
);
refinementSurfaces
{
building {
level (2 3);
patchInfo
{
type wall;
inGroups (building);
}
}
tree
{
// level (minLevel maxLevel)
level (2 3); // 例:最少细 3 级、必要时再细 1 级
faceZone treeFZ; // 可省;若想留出面区可保留
cellZone treeZone; // 关键:让 snappy 直接生成 treeZone
cellZoneInside inside; // inside = STL 内部全进 cellZone
patchInfo{
type patch;
inGroups (treeSurf);
}
}
side_0 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_1 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_2 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_3 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_4 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_5 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_6 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
side_7 {
level (0 0);
patchInfo{
type patch;
inGroups (side);
}
}
top {
level (0 0);
patchInfo
{
type patch;
inGroups (top);
}
}
grassland {
level (0 1);
patchInfo
{
type wall;
inGroups (ground);
}
}
ground {
level (0 1);
patchInfo
{
type wall;
inGroups (ground);
}
}
water {
level (0 1);
patchInfo
{
type wall;
inGroups (ground);
}
}
}
resolveFeatureAngle 60; // 特征边缘角度,小于这个角度的边缘将被忽略
refinementRegions
{
refinementBox_building
{
mode inside;
levels ((1 2));
}
tree
{
mode inside; // STL 内部
levels ((2 3)); // 在 level 3–4 的基础上再加 1 级
}
}
// {wholeDomain {mode inside; levels ((0 0));}} // 细化区域,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; // 合并容差,值越大,网格越容易被合并。
// ************************************************************************* //