Skip to content

Commit

Permalink
@add test file
Browse files Browse the repository at this point in the history
  • Loading branch information
du2693742095 committed Mar 22, 2023
1 parent a35386b commit 0a8b6fa
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 53 deletions.
30 changes: 29 additions & 1 deletion CFD学习/CFD专业名词含义解释.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,35 @@ CFD是计算流体动力学(Computational Fluid Dynamics)的英文缩写,



格心格式和格点格式各有其优缺点。格心型格式的优点是控制体形状简单,容易通过参数变换的方法进行各种数值积分,这对于发展高精度格式十分有利。此外,计算域边界为格心格式的边,边界条件的实施比较容易。其主要缺点是与格点格式相比,控制体数量比较多,存储量比较大。格点型格式的主要优点是控制体数量比较少;例如在二维三角形和三维四面体背景网格上,对偶网格控制体大约为背景网格控制体的1/2或者1/6;这也导致了内存消耗较低。其缺点是控制体形状复杂,二维时是多边形,三维时则为形状非常复杂的多面体(其面数往往多达几十个,且每个控制体面数可能不同),因此数值积分的计算量很大,难以构造高效的高精度格式。在边界处,对偶网格控制体不能完整地包围中心格点,使边界处计算误差增加。
## 执行仿真

**“稳态仿真”(Steady State Simulation)** - 忽略时间的影响。瞬态进程 (例如:离心叶轮) 近似于时间平均值,稳态进程则采用移动参考框。当您将**“时间定义”(Time Definition)** 设置为**“稳态仿真”(Steady State Simulation)** 时,以下设置在“属性”(Properties) 面板中可用。

**“迭代数”(Number of Iterations)** - 代码将停止 (稳态) 或移至下一个时间步长 (瞬态) 的点。“迭代数”应当足够大,以满足所有模块的**“收敛条件”(Converge Criterion)**

**“时间定义”(Time Definition)** - 可以将仿真设置为**“稳态仿真”(Steady State Simulation)**

**“结果保存频率”(Result Saving Frequency)** - 当运行完成时生成结果文件 Filename.sres。根据**“结果保存频率”(Result Saving Frequency)** 的值,相同的结果文件会被覆盖。

**“网格更新频率(迭代)”(Mesh Update Frequency(Iterations))** - 确定更新网格的频率 (迭代数)。

**“其他输出文件”(Additional Output Files)** - 为**“无其他输出”(No Other Outputs)** 提供选项,或者使用**“Ensight 格式”(Ensight format)** 输出。

**“瞬态”(Transient)** 仿真 - 包括时间的影响。瞬态问题的示例是随时间变化的边界条件、移动的零件或不稳定性,这些问题只能使用“瞬态”(Transient) 选项来解决。当您将**“时间定义”(Time Definition)** 设置为**“瞬态”(Transient)** 时,以下设置在“属性”(Properties) 面板中可用。

**“迭代数”(Number of Iterations)** - 代码将停止 (稳态) 或移至下一个时间步长 (瞬态) 的点。“迭代数”应当足够大,以满足所有模块的**“收敛条件”(Converge Criterion)**

**“时间定义”(Time Definition)** - 可以将仿真设置为**“瞬态”(Transient)** 并提供以下选项:

**“仿真时间 (持续时间)”(Simulation Time (Duration))** - 瞬态仿真的持续时间,单位为秒。仿真时间与时间步长数量可确定时间步长的大小。

**“时间步长数”(Number of Time Steps)**

**“结果保存频率”(Result Saving Frequency)** - 确定结果文件 .sres 的输出频率,并控制**“其他输出文件”(Additional Output Files)** 的输出频率。

**“循环计算间隔”(Cycle Computation Interval)** - 确定更新网格的频率 (时间步长)。

**“其他输出文件”(Additional Output Files)** - 为**“无其他输出”(No Other Outputs)** 提供选项,或者使用**“Ensight 格式”(Ensight format)** 输出。



Expand Down
92 changes: 40 additions & 52 deletions CFD学习/CGNS介绍.md → CFD学习/CGNS/CGNS介绍.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


# CGNS简介

## 概述
Expand Down Expand Up @@ -126,7 +124,7 @@ cmake -D CMAKE_BUILD_TYPE=Debug \
## CGNS的版本及兼容性问题

- 3.1.0版本: 这个版本新增了64位支持, 可以实现超大文件读取, 需要HDF5也是64位支持. 构建 64 位代码时,ADF 文件格式会发生变化, 所有维度都存储为 64 位整数,HDF5 接口也会受到维度大小的影响。3.1 版的 32 位编译也能够读取 64 位 CGNS 文件,但如果大小超过 32 位最大尺度则失败。采用32位模式编译,ADF版本和HDF5接口不变,无论 3.1 版软件如何编译,它都向后兼容早期版本的 CGNS 文件。
- 3.3.0版本: 为Fortran调用做了可移植性适配, 需要使用Fortran的必须编译3.3.0以上版本
- 3.3.0版本: 为Fortran调用做了可移植性适配, 需要使用Fortran的必须编译3.3.0以上版本. 不支持混合单元的读取

- 4.3.0版本: 解决了4.2.0版本中stat类型与Windows中变量冲突的问题

Expand Down Expand Up @@ -638,20 +636,21 @@ CGNS 支持八种单元形状: 点、[线](http:https://cgns.github.io/CGNS_docs_curre

# 边界条件BocoData

边界条件BC: Boundary Condition
边界条件BCBoundary Condition),是指在求解区域边界上所求解的变量或其导数随时间和地点的变化规律。通常有固体壁面条件,来流、出流条件,周期性条件,对称条件等。边界条件通常依赖于控制方程,如在固体壁面上,欧拉方程要求采用不可穿透条件,而纳维-斯托克斯方程则要求满足无滑移条件。

## 结构网格

尽管本节标题为*结构网格*,但上述方法也可以用于*非结构网格*只是后者有[更简单的方法](#非结构网格)
尽管本节标题为*结构网格*,但上述方法也可以用于*非结构网格*只是后者可以更简单的用Element_t来附加边界条件信息

**层级结构**

```c
Zone
└── ZoneBC_t
└── BC_t
├── IndexRange_t
└── IndexRange_t
├── ZoneBC_t
│ └── BC_t
│ ├── IndexRange_t
│ └── IndexRange_t
└── ZoneType // 表示边界条件的类型
```

- 每个 `BC_t` 对象都含有一个 `IndexRange_t``IndexRange_t` 子对象。
Expand All @@ -660,24 +659,17 @@ Zone

两种 BC 表示方法:

- `PointRange` 适用于**结构网格的矩形边界**

- `PointList` 适用于**所有边界** , 除 `PointRange` 外的点都应该用其补充表示。


- `PointRange` 是在一个逻辑矩形区域的面上确定最大点和最小点,适用于**结构网格的矩形边界**

![单一边界条件的 CGNS 层次结构](http:https://cgns.github.io/CGNS_docs_current/sids/bc.figs/bctree.gif)


- `PointList` 适用于**所有边界**, 存储的是所有的点列表 , 除 `PointRange` 外的点都应该用其补充表示。

**对应库函数**

```c
// Write boundary condition type and data:
ier = cg_boco_write(int i_file, int i_base, int i_zone,
char *boco_name, BCType_t boco_type/* CGNS_ENUMV(BCType_t) */,
PointSetType_t point_set_type/* CGNS_ENUMV(PointRange) | CGNS_ENUMV(PointList) */,
cgsize_t n_point, cgsize_t *point_set,
PointSetType_t ptset_type/* CGNS_ENUMV(PointRange) | CGNS_ENUMV(PointList) */, cgsize_t npnts, cgsize_t *point_set,
/* output: */int *i_boco);

// Get number of boundary condition in zone:
Expand All @@ -687,7 +679,7 @@ ier = cg_nbocos(int i_file, int i_base, int i_zone,
// Get boundary condition info:
ier = cg_boco_info(int i_file, int i_base, int i_zone, int i_boco,
/* output: */char *boco_name, BCType_t *boco_type,
PointSetType_t *point_set_type, cgsize_t *n_point,
PointSetType_t *ptset_type, cgsize_t *npnts,
int *NormalIndex,
cgsize_t *NormalListSize,
DataType_t *NormalDataType,
Expand All @@ -707,38 +699,21 @@ ier = cg_family_read(int fn, int B, int Fam,

| 变量名 | 功能 |
| -------------- | ------------------------------------------------------------ |
| bocotype | 边界条件的类型. 特殊的,如果是FamilySpecified, 是为边界所属的family指定类型 |
| point_set_type | 边界条件中点的类型, 分别有`PointRange``PointList` |
| n_point | 定义边界条件区域的顶点或单元数。对于`PointRange`来说 `npnts`始终为两个。而对于`PointList` 为列表中顶点或单元的数量 |
| NormalIndex | 边界条件face的法线向量上的索引 |
| bocotype | 边界条件的类型. 特殊的,如果是FamilySpecified, 就要为边界所属的族规定边界条件的类型 |
| ptset_type | 可利用点或单元的范围, 分别有`PointRange` (表示采用点或单元的范围)`PointList`(表示采用点或单元的离散列表) |
| npnts | 定义边界条件区域的顶点或单元数。对于`PointRange`来说 `npnts`始终为两个。而对于`PointList` 为列表中顶点的数量。当要在点以外的任何地方应用边界条件时,必须使用`BC_t`节点下的`GridLocation_t`来指示这一点。`GridLocation_t`的值可以由`cg_boco_gridlocation_read``cg_boco_gridlocation_write`读取或写入 。 |
| NormalIndex | 边界条件补块法向量的计算坐标方向的索引矢量 |
| NormalListSize | 如果法线在`NormalList`中定义, 则`NormalListSize`是面片中的点数乘以`phys_dim`,即在场中定义矢量所需的坐标数。如果法线未在`NormalList`中定义,则 `NormalListSize`为 0 |
| NormalDataType | 发现 |
| ndataset | |
| point_set | |
| normal_list | |
| location | |
| | |

边界条件的范围可以使用PointRange使用点或单元的范围来定义,或者使用`PointList`使用边界条件应用的所有点或元素的离散列表来定义。当要在点以外的任何地方应用边界条件时,必须使用`BC_t`节点下的`GridLocation_t来指示这一点。``GridLocation_t`的值可以由`cg_boco_gridlocation_read``cg_boco_gridlocation_write`读取或写入 。与以前版本的库一样,这也可以通过首先使用[`cg_goto来完成`](http:https://cgns.github.io/CGNS_docs_current/midlevel/navigating.html#goto)````````[``](http:https://cgns.github.io/CGNS_docs_current/midlevel/navigating.html#goto) 访问`BC_t`节点,然后使用 [`cg_gridlocation_read`](http:https://cgns.github.io/CGNS_docs_current/midlevel/location.html#gridlocation)[`cg_gridlocation_write`](http:https://cgns.github.io/CGNS_docs_current/midlevel/location.html#gridlocation)



| | `npnts` | | 定义边界条件区域的点数或元素数。对于`PointRange``ptset_type``npnts`始终为两个。对于`PointList``ptset_type``npnts`是列表中点或元素的数量。`````````` |
| ---- | -------------- | ---- | ------------------------------------------------------------ |
| | `积分` | | 定义边界条件区域的点或元素索引数组。应该有`npnts`值,每个维度 [`IndexDimension`](http:https://cgns.github.io/CGNS_docs_current/sids/cgnsbase.html#IndexDimension) (即,非结构化网格为 1,具有 2-D 或 3-D 元素的结构化网格分别为 2 或 3)。 |
| | `正常指数` | | 指示边界条件面片法线的计算坐标方向的索引向量。 |
| | `普通列表标志` | | 指示法线是否在`NormalList`中定义 并且要写出的标志;如果已定义则为 1,如果未定义则为 0。 |
| | `正常列表大小` | | 如果法线在`NormalList`中定义, 则`NormalListSize`是面片中的点数乘以`phys_dim`,即在场中定义矢量所需的坐标数。如果法线未在`NormalList`中定义,则 `NormalListSize`为 0。 |
| | `普通数据类型` | | 法线定义中使用的数据类型。法线可接受的数据类型是`RealSingle``RealDouble`|
| | `普通列表` | | 垂直于指向区域内部的边界条件面片的向量列表。 |
| | `n数据集` | | 当前边界条件的边界条件数据集数。 |
| | `地点` | | 点集定义中使用的网格位置。当前允许的位置是`Vertex`(如果未指定,则为默认位置)和`CellCenter``CellCenter`的解释 以及网格位置的其他允许值取决于基本单元维度。对于`CellDim` =1, `CellCenter`指的是线元素。`CellDim` =2 时, `CellCenter`指面元,允许附加值`EdgeCenter 。`对于`CellDim` =3, `CellCenter`指的是体积元素,除了 `EdgeCenter` ,可以使用 `FaceCenter``IfaceCenter``JFaceCenter``KFaceCenter`的值。 |
| | `` | | 错误状态。 |
| NormalDataType | 定义法向量的数据精度类型。分为单精度和双精度 |
| ndataset | 本边界条件数据组的数据 |
| point_set | 定义边界条件范围的点数据, 即PointList或PointRange的数据,长度应该等于npnts |
| normal_list | 指向块内部的边界条件补块的矢量列表法向量 |
| location | 点列表使用的网格位置 |

其中

- `cg_boco_write()` 用于创建一个表示具体边界条件的 `BC_t` 对象。
- `boco_type` 的取值必须是枚举类型 `BCType_t` 的有效值,例如 `BCWallInviscid | BCInflowSupersonic | BCOutflowSubsonic`,完整列表参见《[Boundary Condition Type Structure Definition](https://cgns.github.io/CGNS_docs_current/sids/bc.html#BCType)》。
- `boco_type` 的取值必须是枚举类型 `BCType_t` 的有效值, 用来表示边界条件的类型,例如 `BCWallInviscid | BCInflowSupersonic | BCOutflowSubsonic`,完整列表参见《[Boundary Condition Type Structure Definition](https://cgns.github.io/CGNS_docs_current/sids/bc.html#BCType)》。
- 二维数组 `point_set` 用于指定顶点编号,其行数(至少)为 `n_point`
- 对于结构网格,`point_set` 的列数为*空间维数*,而 `n_point`
-`2`,若 `point_set_type``CGNS_ENUMV(PointRange)`。此时 `point_set` 的第一、二行分别表示编号的下界、上界。
Expand Down Expand Up @@ -778,6 +753,12 @@ ier = cg_gridlocation_read(GridLocation_t *grid_location);

# 流场数据

对于流场数据有三种表示方式,**格心型****格点型****格心型加外层单元**

- **格心型**:未知量位于单元中心,控制体取为网格单元本身,数值通量需要在网格单元的面上进行计算,因此格心型离散对应着基于面的数据结构
- **格点型**:未知量位于单元节点,控制体通常通过连接节点周围的单元中心和边的中点来构建,数值通量需要在由原网格的边构建的面上进行计算,因此格点型离散对应着基于边的数据结构。
- **格心型加外层单元**: 未知量位于单元中心, 但还有一层外部的ring节点也会参与计算, 这个只在结构网格中存在, 非结构网格中外层单元无效

## `FlowSolution_t`

**层级结构**
Expand Down Expand Up @@ -806,7 +787,11 @@ FlowSolution_t
DataSize += RindSize */
```
## `Vertex` 顶点数据
## `Vertex` 格点型
顶点处的流场数据与网格点处在相同的位置. 读取和写入的类似单区网格坐标, 需要先用 `cg_sol_*` 读取 `FlowSolution_t` 节点的数据, 获得流场个数和名字等信息, 然后再用 `cg_field_*` 等函数读取具体的流场数据
<img src="../Picture/image-20230316100310486.png" alt="image-20230316100310486" style="zoom:50%;" />
**对应库函数**
Expand Down Expand Up @@ -862,16 +847,19 @@ ier = cgp_field_general_read_data(int i_file, int i_base, int i_zone, int i_soln
- `cg_field_write()` 用于在 `FlowSolution_t` 对象下创建一个表示*单个物理量*的对象,例如 `DataArray_t` 对象、`Rind_t` 对象。
- `field_name` 应当取自《[SIDS-standard names](https://cgns.github.io/CGNS_docs_current/sids/dataname.html)》,例如 `Density | Pressure`

## `CellCenter` 单元数据
## `CellCenter` 格心形

`CellCenter`所用 API 与`Vertex` 的几乎完全相同,只需注意:
格心形流场数位于单元中心, 2D情况下由4个环绕的点确定网格的单元中心; 3D情况下通过8个环绕的网格点确. `CellCenter`所用 API 与`Vertex` 的几乎完全相同,只需注意:

- 在调用 `cg_sol_write()` 时,将 `location` 的值由 `CGNS_ENUMV(Vertex)` 改为 `CGNS_ENUMV(CellCenter)`

- 在结构网格的各逻辑方向上,用于存放数据的多维数组的长度必须与单元数量协调。

## `rind data` 表皮数据
<img src="../Picture/image-20230316100404536.png" alt="image-20230316100404536" style="zoom:50%;" />

## `rind data` 格心型加外层单元

**表皮数据 (rind data)** 是指存储在网格表面的一层或多层**影子单元 (ghost cells)** 上的数据
**表皮数据 (rind data)** 是指存储在网格表面的一层或多层**影子单元 (ghost cells)** 上的数据, 在CGNS中, 外层单元处的流场数据并不是单独的实体, 而是将流场的范围延申到包括外层单元的位置, 这时候访问对应的外层单元, 需要用goto函数定位到对应位置再去读取

```
┌───╔═══╦═══╦═══╗───┬───┐ ═══ 网格单元
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
13 changes: 13 additions & 0 deletions CFD学习/非结构网格理论.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# 非结构网格理论

## 网格数据结构

非结构网格的数据以面的拓扑信息为基础,具体包括:点的数目,面的数目,单元的数目,点的坐标,面的顶点序列,面的左右单元序列,边界面信息,分区对界面信息(interface),分区对接单元(overlap cell)信息等,具体数据如表1:

| 数据名 | 数据类型 | 数据长度 | 描述 |
| ---------- | -------- | -------- | ------ |
| nodeNumber | int | 1 | 点数目 |
| faceNumber | int | 1 | 面数目 |
| cellNumber | int | 1 | 体数目 |

网格分区可以采用两种分区方式:**面对接****单元对接**
Binary file added Picture/image-20230316100310486.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Picture/image-20230316100404536.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 0a8b6fa

Please sign in to comment.