文章目录

NCC有关源码

在 OpenFOAM-dev(通常指 OpenFOAM Foundation 版本,如 v10、v11、v12)源码中,NCC (Non-Conformal Coupling) 是一项用于替代 AMI (Arbitrary Mesh Interface) 的现代技术,专门处理非匹配网格接口之间的数据传递。
以下是 NCC 的主要源码位置与功能介绍:


1. 源码位置

NCC 的核心逻辑分布在库(src)和实用工具(applications)中:

  • 核心类与接口:
    • src/OpenFOAM/meshes/polyMesh/polyMeshStitcher/:包含 NCC 核心的网格缝合(Stitching)逻辑,负责在运行时动态识别和连接非匹配面。
    • src/finiteVolume/fields/fvPatchFields/constraint/nonConformalCyclic/:定义了 nonConformalCyclic 边界条件类型,这是 NCC 专用的补丁(Patch)类型。
  • 实用工具:
    • applications/utilities/mesh/manipulation/createNonConformalCouples/:该工具用于在预处理阶段创建 NCC 耦合接口。它会读取 system/createNonConformalCouplesDict 字典文件并生成必要的补丁信息。
  • 配置范例:
    • etc/caseDicts/annotated/createNonConformalCouplesDict:包含该功能的详细配置注释和示例。

2. 功能介绍

NCC 被设计为一种比传统 AMI 更健壮且严格保守(Conservative)的替代方案。

  • 严格守恒性: 与基于插值的 AMI 不同,NCC 旨在提供更好的质量保证和守恒性,特别适用于旋转机械(如叶轮、涡轮)和滑动网格案例。
  • 动态耦合: 在仿真运行期间,NCC 会动态计算交界面的重叠区域。它在 constant/polyMesh/boundary 中创建初始面数为零的 nonConformalCyclic 补丁,然后在计算时通过 fvMeshStitcher 填充面信息。
  • 替代旧技术: 它完全取代了不再维护的 ACMI(Area Constrained AMI)和 Repeat AMI 功能。
  • 易用性: 用户通常只需要将原本的 cyclicAMI 接口定义为普通补丁(如墙或滑移面),然后运行 createNonConformalCouples 即可自动完成耦合配置。

3. 核心流程

使用 NCC 的一般步骤通常涉及:

  • 准备网格:生成具有重合界面的独立网格区域。
  • 定义字典:在 system/createNonConformalCouplesDict 中指定需要耦合的两个补丁名称及运动类型(如 rotation 或 translation)。
  • 执行命令:运行 createNonConformalCouples -overwrite。
  • 设置边界:在 0/ 文件夹的场文件中,为新生成的 nonConformalCouple… 补丁包含设置约束的宏(通常使用 #includeEtc “caseDicts/setConstraintTypes”)。
    您是否需要针对特定物理模型(如旋转机械或动网格)的 createNonConformalCouplesDict 字典配置示例?

NCC示例(旋转机械/动网格平移)

在 OpenFOAM-dev (Foundation 版) 中,NCC 特别适合处理旋转机械(MRF/AMI 替代)和滑移网格(Sliding Mesh)。

其核心逻辑是通过 createNonConformalCouples 工具将原本独立的两个 Patch 关联起来,并在运行时动态计算耦合面。


1. 旋转机械配置示例 (Rotational)

假设你有一个叶轮区域 impeller 和一个静止区域 volute,它们之间的交界面补丁分别命名为 ami_inner 和 ami_outer。
在 system/createNonConformalCouplesDict 中配置如下:

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           |
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    format      ascii;
    class       dictionary;
    object      createNonConformalCouplesDict;
}

// 定义耦合对
couples
{
    // 自定义名称
    impellerToVolute
    {
        // 旋转面上的两个补丁名称
        patches         (ami_inner ami_outer);
        
        // 运动类型:旋转
        motion          rotation;
        
        // 旋转轴线与原点
        axis            (0 0 1);
        origin          (0 0 0);
    }
}


2. 动网格平移配置示例 (Translational)

适用于活塞运动或直线滑道的平移耦合。

couples
{
    pistonSliding
    {
        patches         (pistonSide wallSide);
        
        // 运动类型:平移
        motion          translation;
        
        // 平移方向矢量
        direction       (1 0 0);
    }
}


3. 关键配套设置

仅仅配置字典是不够的,你还需要确保以下文件同步更新:

A. 运行命令

在生成网格后执行:

createNonConformalCouples -overwrite

该工具会在 constant/polyMesh/boundary 中自动创建类型为 nonConformalCyclic 的新补丁。

B. 初始场文件 (0/U, 0/p 等)

NCC 补丁属于 Constraint(约束)类型。为了简洁,建议在场文件中使用宏定义。例如在 0/U 中:

boundaryField
{
    // 包含标准约束设置,它会自动识别 nonConformalCyclic 并应用正确条件
    #includeEtc "caseDicts/setConstraintTypes"

    "(ami_inner|ami_outer)"
    {
        type            nonConformalCyclic;
    }
    
    // 其他边界...
}

C. 动态网格控制 (constant/dynamicMeshDict)

如果你使用的是 Function Object 驱动的旋转(如 v11+),需确保 dynamicMeshDict 中的运动定义与 NCC 的轴线/原点一致。


4. 为什么选择 NCC 而非 AMI?

  • 鲁棒性:在面片极度扭曲或重叠区域不完全匹配时,NCC 的缝合算法 (Stitcher) 比传统的基于投影的 AMI 更不容易报错。
  • 源码位置提示:如果你想修改其物理行为,请查阅 src/finiteVolume/fvMeshStitcher/。

需要为你提供一个针对特定求解器(如 pimpleFoam 或 simpleFoam)的完整 dynamicMeshDict 配合示例吗?


Stitcher缝合逻辑解析

在 OpenFOAM-dev 源码中,polyMeshStitcher 是 NCC 技术的灵魂。它不再像 AMI 那样依赖复杂的几何投影和权重插值,而是通过几何缝合(Stitching)在底层将两个非匹配的面组动态地耦合在一起。
以下是基于 src/OpenFOAM/meshes/polyMesh/polyMeshStitcher/ 的核心逻辑与几何算法解析:

1. 拓扑识别与面重构 (Topological Identification)

Stitcher 的第一步是确定两个 Patch 之间哪些面是真正“接触”的。

  • 候选筛选(Candidate Selection): 算法首先利用轴对齐包围盒(AABB Tree)快速剔除距离较远的面,只保留潜在重叠的面对。
  • 多边形裁剪(Polygon Clipping):
    • 这是 NCC 的核心几何操作。Stitcher 会对重叠的源面(Source)和目标面(Target)进行多边形布尔交集运算。
    • 几何实现: 源码中使用了类似于 Sutherland-Hodgman 裁剪算法 的变体。它将一个 Patch 的面作为裁剪器,去切割另一个 Patch 的面,生成一系列新的、更小的临时中间多边形(Intermediate Polygons)。

2. 动态面生成 (Dynamic Face Generation)

与 AMI 只是计算插值系数不同,Stitcher 在内存中“真正”地构建了交界面的连接关系:

  • 计算重叠面积: 通过裁剪算法生成的每一个中间多边形都有明确的面积。这些面积被用来确保通量的严格守恒。
  • 点融合(Point Merging): 为了处理浮点数精度带来的“间隙”或“重叠”问题,源码在 polyMeshStitcher 中包含了容差判断逻辑(Tolerance-based matching),确保微小的几何不匹配不会导致拓扑断裂。

3. 运动补偿逻辑 (Motion Compensation)

在旋转机械场景下,polyMeshStitcher 必须处理面与面之间的相对位移:

  • 变换映射: 源码通过 pointTransformer 类将目标 Patch 的坐标变换到源 Patch 的局部坐标系中(例如旋转一个角度 θ \theta θ)。
  • 周期性处理: 如果是循环边界(Cyclic),Stitcher 会自动计算平移或旋转周期。这意味着它在裁剪前会先进行“几何对齐”,确保即使物体转动了,裁剪逻辑依然能找到正确的重叠区域。

4. 矩阵组装与约束 (Matrix Coupling)

在 fvMeshStitcher 层级(src/finiteVolume/fvMeshStitcher/),几何信息被转化为线性方程组的系数:

  • 非正交修正: 当交界面的面法线与网格单元中心连线不一致时,Stitcher 会引入类似 nonOrthoCorrection 的几何项。
  • 权重计算: 每一个生成的中间多边形面积与其所属的原始父面面积的比值,被用作矩阵中的耦合权重。

5. 源码关键类解析

  • polyMeshStitcher: 基类,负责底层的点、面索引管理和基本几何变换。
  • fvMeshStitcher: 负责将几何缝合结果桥接到有限体积法的矩阵操作中(处理 phi 通量等)。
  • stitching 算法: 主要是为了寻找补丁间的拓扑一致性,确保在 nonConformalCyclic 边界上满足 U s r c = U t g t U_{src}=U_{tgt} Usrc=Utgt p s r c = p t g t p_{src}=p_{tgt} psrc=ptgt

核心优势总结
相比 AMI,polyMeshStitcher 的逻辑更接近于直接物理连接。它通过几何裁剪确保了:
完美质量: 避免了 AMI 在极端扭曲网格下的权重分配失败。
严格守恒: 每一个流入源面的通量都被精确地分配到了对应的目标面,没有任何面积损失。


子面裁剪逻辑

在 OpenFOAM-dev 源码中,Sutherland-Hodgman 算法及其变体主要用于处理非匹配网格接口(NCC/AMI)的重叠面积计算。


1. 核心源码位置

裁剪算法并没有被硬编码在 polyMeshStitcher 中,而是调用了 OpenFOAM 的核心几何库。最关键的实现位于:

  • src/OpenFOAM/primitives/Geom/polygon/ 这里包含了多边形裁剪(Clipping)和相交(Intersection)的基础算法。
  • 具体类:Foam::polygonIntersection 该类实现了两个多边形在三维空间(经投影到二维)的相交逻辑。

2. 关键函数实现解析

在 NCC 的缝合逻辑中,系统需要计算两个多边形 P 1 P_{1} P1 P 2 P_{2} P2的交集。其核心步骤对应的函数如下:

  • A. 面投影与平面对齐
    由于 Sutherland-Hodgman 是二维算法,OpenFOAM 首先将三维面投影到局部坐标平面。
    • 函数:polygonIntersection::clipPolygon
    • 逻辑:它会根据面的法线方向,选择一个最佳投影面(XY, YZ 或 ZX),将三维坐标转化为二维处理,计算后再还原。
  • B. 边的迭代裁剪 (核心算法)
    标准的 Sutherland-Hodgman 逻辑在代码中体现为顺序裁剪:使用“剪裁多边形”(Clipper)的每一条边作为半平面,去截断“被剪裁多边形”(Subject)。
// 遍历剪裁多边形的所有边
forAll(clipperEdges, i)
{
    const linePointRef edge = clipperEdges[i];
    // 调用基础裁剪函数
    subjectPolygon = clipPolygonWithPlane(subjectPolygon, edge, planeNormal);
}

判定逻辑:代码中通过 point::operator& (点积) 来判断顶点是在裁剪边的“内部”还是“外部”

  • C. 鲁棒性处理:微小间距与容差

在 src/OpenFOAM/meshes/polyMesh/polyMeshStitcher/ 中,为了应对数值误差,OpenFOAM 引入了:
SMALL 或 GREAT 容差:在判定点是否在边上时,代码使用了 mag(dist) < SMALL 的判断。
点融合(Point Merging):裁剪后生成的极其微小的碎片多边形会被 mergePoints 逻辑合并,以防止产生病态的矩阵系数。


3. 在 NCC 中的调用链路

当你运行 createNonConformalCouples 或进行动态模拟时,调用栈大致如下:

  • fvMeshStitcher::update(): 触发接口更新。
  • polyMeshStitcher::stitch(): 执行几何缝合。
  • intersections::polygonPolygonIntersection: 查找重叠多边形。
  • polygon::clip: 执行具体的 Sutherland-Hodgman 裁剪过程,返回中间重叠面(Intermediate faces)。

4. 几何算法的数学特征

凸多边形优化:OpenFOAM 的实现假设大多数单元面是凸多边形。对于凹多边形,算法性能会下降或需要先进行三角化处理。
面积积分:裁剪完成后,利用 Shoelace Formula (鞋带公式) 计算重叠面积,作为 nonConformalCyclic 矩阵耦合的权重系数。

如果你想在代码中实时查看裁剪过程,可以在 src/OpenFOAM/primitives/Geom/polygon/ 相关的 .C 文件中开启 debug 开关:

// 在源文件顶部设置
#define DEBUG_POLYGON_INTERSECTION 1


中间子面内部数据组织和通量计算

在 OpenFOAM-dev 的 NCC 实现中,中间子面(Intermediate faces)的设计核心是轻量化与映射一致性。它们并不作为完整的 face 存储在 polyMesh 中,而是作为临时几何对象存在于内存中。

1. 内部数据结构:intersectedFace

子面在源码中通常由 intersectedFace 或类似的结构体表示。其核心数据结构包含:

  • 顶点列表 (pointField):记录裁剪后生成的子面顶点坐标(通常是临时生成的投影点)。
  • 双向父面索引 (Parent Mapping):
    • label index0_: 对应 Source Patch(源补丁)中的原始面 ID。
    • label index1_: 对应 Target Patch(目标补丁)中的原始面 ID。
  • 几何属性:存储计算出的 area(面积)和 centre(形心)。
    这种结构允许算法通过 O ( 1 ) O(1) O(1)的复杂度直接定位到两侧的父面。

2. 快速查找逻辑

在 polyMeshStitcher 进行 stitch() 操作后,会生成一个耦合映射表:

  • 数据结构:List<stitching::faceIntersection>。
  • 查找机制:该列表按顺序存储了所有有效的子面。每个 faceIntersection 对象直接持有 faceI0 和 faceI1 指针。
  • 空间索引:在每一时间步更新时,利用 ADBB (Axis-aligned Bounding Box) 树快速筛选潜在重叠父面,从而避免全量搜索,实现子面的快速重构。

3. 通量计算与矩阵组装 (FVM Coupling)

子面的处理最终要落实到 fvMatrix 的系数上。其逻辑位于 src/finiteVolume/fvMeshStitcher/ 下的 fvMeshStitcher.C。

A. 通量 (Flux) 计算

对于子面 k k k,其通量 ϕ k \phi_{k} ϕk基于两侧父面单元(Cell P 和 Cell N)的物理量:
ϕ k = S k ⋅ U f \phi_{k}=S_{k}\cdot \mathbf{U}_{f} ϕk=SkUf
其中 S k S_{k} Sk 是子面的面积矢量(方向由源指向目标)。由于子面与父面共面,子面通量直接按面积比例分配:
ϕ k = ϕ p a r e n t × Area s u b Area p a r e n t \phi _{k}=\phi _{parent}\times \frac{\text{Area}_{sub}}{\text{Area}_{parent}} ϕk=ϕparent×AreaparentAreasub

B. 矩阵系数 (Matrix Coefficients) 注入

NCC 通过修改 fvMatrix 的非对角项实现强耦合:

  • 非对角项 (Upper/Lower):子面的存在建立了两侧单元 C P C_{P} CP C N C_{N} CN的直接连接。
  • 系数计算:
    • 根据子面面积计算扩散项或对流项的贡献。
    • 将子面的贡献分别累加到 matrix.upper()[i] 和 matrix.lower()[j] 中,其中 i , j i,j i,j是两侧父面单元的全局索引。
  • 非正交修正 (Non-orthogonal Correction):
    • 如果两单元中心连线不垂直于子面,Stitcher 会计算非正交矢量,并将修正值加到 源项 (Source term/matrix.source()) 中。

C. 守恒性保障

∑ k ∈ Parent Coeff k = Coeff T o t a l \sum _{k\in \text{Parent}}\text{Coeff}_{k}=\text{Coeff}_{Total} kParentCoeffk=CoeffTotal
因为所有子面面积之和严格等于重叠部分的物理面积,所以 NCC 在离散层面上实现了比 AMI 更精确的通量平衡。


4. 核心源码片段参考

在 fvMeshStitcher.C 中,关键的组装逻辑通常如下:

forAll(intersections, k)
{
    const auto& is = intersections[k];
    label cellI = faceCells0[is.index0()]; // 源端单元
    label cellJ = faceCells1[is.index1()]; // 目标端单元

    // 计算基于子面面积的权重
    scalar weight = is.area() / magS[is.index0()];
    
    // 注入矩阵系数
    am[cellI] -= weight * ...;
    au[cellI] += weight * ...;
    // 对称处理 cellJ
}

建议调试路径:

您可以深入阅读 OpenFOAM-dev/src/finiteVolume/fvMeshStitcher/fvMeshStitcher.C 中的 currect 或 makeWeights 函数,那里展示了子面几何信息如何转化为数值权重。
您是否想深入了解 NCC 在处理多处理器并行计算(Parallel Decomposition)时,子面数据是如何跨进程同步的?

下一步建议:

检查您的案例中 checkMesh 输出的 non-orthogonality,如果 NCC 交界处该值过高,可能需要调整 fvSolution 中的 nNonOrthogonalCorrectors。


NCC多分区并行处理逻辑

在 OpenFOAM-dev 的 NCC 实现中,处理并行计算(Parallel Decomposition)的核心挑战在于:交界面的两侧 Patch 可能分布在不同的处理器上。
与传统的 cyclic 边界类似,NCC 必须跨越进程边界(Processor Boundaries)进行几何裁剪和矩阵系数注入。以下是其内部实现机制:


1. 影子补丁与点同步 (Shadow Patches & Point Sync)

为了在 A 进程中裁剪位于 B 进程的面,OpenFOAM 利用了底层通信协议(基于 Pstream):

  • 全局坐标转换:在进行 polyMeshStitcher::stitch() 之前,NCC 会收集所有涉及耦合的 nonConformalCyclic 补丁的顶点数据。
  • 面数据收集:通过 globalIndex 类,系统识别出哪些面属于并行边界。相关面的顶点坐标、面索引和邻接单元信息会被打包发送到邻居处理器或进行全局同步,在每个处理器内存中创建对方补丁的“影子镜像”(Shadow/Proxy)。

2. 跨进程裁剪逻辑 (Cross-processor Clipping)

由于每个进程现在都持有了邻居补丁的几何副本,polygonIntersection 可以在本地执行:

  • 本地裁剪:进程 P0 将本地的面与接收到的 P1 的“影子面”进行 Sutherland-Hodgman 裁剪。
  • 归属判定:裁剪生成的“子面”(Intermediate faces)会被标记。如果一个子面由 F a c e P 0 Face_{P0} FaceP0 F a c e P 1 Face_{P1} FaceP1相交而成,则该子面信息在两个进程中都会被计算并保留。

3. 矩阵系数的并行注入 (Parallel Matrix Assembly)

这是 NCC 最关键的一步。当一个子面连接了单元 C l o c a l C_{local} Clocal(本地)和 C n e i g h b o r C_{neighbor} Cneighbor(邻居)时:

  • 非对角项处理:OpenFOAM 的 fvMatrix 无法直接存储指向其他进程单元的非对角系数。因此,NCC 借用了 coupled 接口机制(类似于 processorLduInterface)。
  • 接口字段 (Interface Fields):
    • 本地进程将贡献值计算好,存储在 nonConformalCyclicFvPatchField 的内部缓存中。
    • 通过 initInterfaceMatrixUpdate 和 updateInterfaceMatrix 两个阶段,利用 MPI 将耦合系数发送给邻居进程。
    • 邻居进程接收后,将其作为源项(Source term)或边界贡献加回到本地矩阵中,从而在迭代中实现隐式或半隐式的耦合。

4. 源码实现逻辑:fvMeshStitcher 的并行支持

在 src/finiteVolume/fvMeshStitcher/ 中,你可以观察到以下并行逻辑:

  • collectPatches():该函数负责处理并行边界。它会检查 polyPatch::parallel() 状态,并调用 UPstream::allToAll 来交换面数据。
  • sync 方法:在每一时间步(如果是滑动网格),Stitcher 都会调用同步函数,确保所有处理器对交界面的拓扑变化达成共识。

5. 并行分解建议 (Decomposition Strategy)

为了提升 NCC 的并行效率,建议在使用 decomposeParDict 时:

  • 保持耦合面完整性(可选):如果可能,尽量让耦合的一对 Patch 位于同一个处理器或相邻处理器。
  • 使用 distributed 模式:在 createNonConformalCouplesDict 中,NCC 有时可以配置为分布式模式以优化大规模计算的内存占用。

总结

NCC 的并行化实质上是将**“几何裁剪后的子面”转化为“虚拟的处理器间通信指令”**。它确保了即便网格在物理上被切分到不同核心,数学上的通量连续性依然通过跨进程的矩阵更新得以维持。


NCC处理多域独立网格耦合

是的,NCC (Non-Conformal Coupling) 非常适合用于多区域(Multi-zone/Multi-region)计算,例如固体域(Solid)与流体域(Fluid)的共轭传热(CHT)模拟。
它允许每个区域的网格完全独立生成,即便交界面的网格节点不匹配(Non-conformal),也能实现严格守恒的物理量传递


1. 核心优势

  • 独立建模:流体域和固体域可以使用最适合各自几何特征的网格(如流体用六面体,固体用四面体),无需在交界面强行匹配节点。
  • 严格守恒:相比传统的 cyclicAMI,NCC 提供了更好的质量保证和守恒性,有效避免了 CHT 模拟中常见的交界面能量损失问题。

2. 算例配置流程

在使用 chtMultiRegionFoam 等多区域求解器时,配置 NCC 的典型步骤如下:

第一步:合并网格 (mergeMeshes)

如果各区域网格是独立生成的,首先需要将它们合并到一个文件夹中:

mergeMeshes . <region1_dir> . <region2_dir> -overwrite

合并后,流体和固体交界处会存在两个重合但独立的 Patch(例如 fluid_to_solid 和 solid_to_fluid)。

第二步:配置 createNonConformalCouplesDict

在 system 目录下创建该文件,定义需要耦合的区域接口:

couples
{
    fluid_solid_interface
    {
        patches     (fluid_to_solid solid_to_fluid);
        motion      none; // 静态 CHT 设为 none
    }
}

第三步:执行耦合命令

运行该工具以在 polyMesh/boundary 中生成 nonConformalCyclic 类型的补丁信息:

createNonConformalCouples -overwrite

第四步:设置边界条件 (0/ 目录)

在各区域的场文件中(如 0/fluid/T 和 0/solid/T),将交界面类型设为 nonConformalCyclic。为了物理上的耦合(如温度连续、热流守恒),通常结合 comms 或专门的 CHT 映射条件。


3. 并行计算注意事项

  • 区域划分:使用 decomposePar 时,确保耦合的两个 Patch 尽可能分配在同一个处理器上,或者确保 decomposeParDict 正确处理了跨进程的 nonConformalCyclic 接口。

  • 求解器兼容性:NCC 是在 OpenFOAM-v10/v11+ (Foundation版) 中引入的。如果您使用的是 ESI 版本 (v2312 等),对应的功能可能被称为 nonConformal 并在 cyclic 补丁中通过特定设置开启。


NCC+CHT示例

chtMultiRegionFoam 中配合 NCC 使用时,温度场的配置核心在于利用 nonConformalCyclic 基础类型,并结合 compressible::turbulentTemperatureCoupledBaffleMixed 或类似的耦合宏来确保热流与温度的连续性。

以下是具体的配置示例:

1. 0/ 文件夹下的温度场配置

假设流体区域为 air,固体区域为 heater,交界面补丁分别为 to_heaterto_air

流体端:0/air/T

cpp

boundaryField
{
    to_heater
    {
        // 核心:指定类型为 NCC 专用的耦合条件
        type            compressible::turbulentTemperatureCoupledBaffleMixed;
        
        // 指向耦合的另一端(跨区域引用)
        neighborRegion  heater;
        neighborPatch   to_air;
        
        // 物理属性:热传导系数、热辐射等(视求解器版本而定)
        K               solidThermo; // 流体侧的热导率获取方式
        KName           none;
        
        // NCC 基础约束(必须包含)
        value           $internalField;
    }
}

请谨慎使用此类代码。

固体端:0/heater/T

cpp

boundaryField
{
    to_air
    {
        type            compressible::turbulentTemperatureCoupledBaffleMixed;
        
        neighborRegion  air;
        neighborPatch   to_heater;
        
        K               solidThermo;
        KName           none;
        
        value           $internalField;
    }
}

请谨慎使用此类代码。


2. 关键配置文件:constant/polyMesh/boundary

运行 createNonConformalCouples 后,你会发现 boundary 文件中这两个补丁的类型被自动修改或应手动确认。对于多区域,它必须表现为约束类型:

cpp

to_heater
{
    type            nonConformalCyclic; // NCC 核心类型
    nFaces          ...;
    startFace       ...;
    coupleGroup     fluid_solid_interface; // 对应的耦合组名
}

请谨慎使用此类代码。


3. 进阶:如何确保数值稳定?

在多区域独立网格下,由于交界面节点不对应,温度梯度计算可能会产生振荡。建议在 system/fvSchemes 中加强梯度限制:

  • 梯度方案:对温度梯度使用限制器。

    cpp

    gradSchemes
    {
        grad(T)       cellLimited Gauss linear 1;
    }
    

    请谨慎使用此类代码。

  • 非正交修正:由于独立网格交界面的单元中心连线往往不垂直于子面,必须在 system/air/fvSolutionsystem/heater/fvSolution 中设置非正交修正:

    cpp

    PIMPLE/PISO/SIMPLE
    {
        nNonOrthogonalCorrectors 2; // 至少设置为2,以处理非匹配网格带来的偏斜
    }
    

    请谨慎使用此类代码。

4. 常见问题排查

  • 网格间隙:如果两个区域的网格在几何上存在微小缝隙(Gap),createNonConformalCouples 可能会漏掉部分面。此时需在 createNonConformalCouplesDict 中增加 tolerance(容差)。
  • 权重检查:运行后检查输出日志中的 coverage 值。如果 coverage 小于 1.0,说明有部分面未能耦合,这会导致交界面出现死区(绝热)。

您当前的网格交界面是平直面还是复杂的弯曲几何面?这将决定是否需要额外的面平滑处理以防止 NCC 面积计算误差。

延伸阅读与资源:

  • OpenFOAM Foundation 官方文档:查看 v11/v12 中关于 fvMeshStitcher 的更新说明。
  • OpenFOAM Wiki - NCC:查阅底层的 C++ 类定义。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐