# conturpy
**Repository Path**: wangfun/conturpy
## Basic Information
- **Project Name**: conturpy
- **Description**: No description available
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-12
- **Last Updated**: 2024-04-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [github.com](https://github.com/noahess/conturpy)
> Sivells Contur 特性喷嘴设计代码方法 - noahess/conturpy
ConturPy:Python 高超音速喷嘴设计
========================
[](#conturpy-python-hypersonic-nozzle-design)
介绍
--
[](#introduction)
ConturPy 是一个 Python 库,为 JC Sivells 的 CONTUR 程序提供接口,用于超音速和高超音速喷嘴设计。
该存储库提供了适用于 Windows x86 和 Apple Silicon 的编译二进制文件,并在 MacOS 上的 AMD Ryzen R3900XT 和 Apple M1 上进行了测试。其他体系结构需要从 src 编译 Fortran 代码,并通过`executable`的关键字参数提供可执行文件的显式路径`ContourApplication`。
背景
--
[](#background)
该代码很大程度上依赖于由 F.-L 移植到现代 Fortran 的 Sivells CONTUR 代码。 Zavalan[在这里](https://github.com/aldorona/contur),非常感谢 F. Zavalan 和 A. Rona。然而,axis.f 源文件已从其端口进行了修改:S. Schneider 在 [NASA CR 197286](https://ntrs.nasa.gov/api/citations/19950015019/downloads/19950015019.pdf)中指出 ,当 ETAD 不是 60 时,Sivells 的代码不会产生流线型。Schneider 通过复制第 111 行修改 AXIAL 子例程来修复该问题和第 43 行上方的 112。对 axis.f 源文件进行了相同的更改。
依赖关系
----
[](#dependencies)
* numpy >~ 1.22
* matplotlib >~ 3.5
用法
--
[](#usage)
ConturPy 旨在完成 4 件事:
1. 为 CONTUR 创建输入卡
2. 包装 CONTUR 可执行文件
3. 解释 CONTUR 结果
4. 为所有 CONTUR 输出创建图像和表格
### 创建输入卡
[](#creating-input-cards)
ConturPy 提供了`ConturSettings`以 CONTUR 接受的格式生成输入卡的类。首先,创建该类的一个实例`ConturSettings`:
```
from conturpy import ConturSettings
cs = ConturSettings()
```
`ConturSettings`接受多个关键字参数,此处未介绍。创建对象后,为每个输入字段分配值并将文件保存到方便的位置:
```
从 conturpy 导入 ConturSettings
cs = ConturSettings()
dmach = 6.0 # 设计马赫
throat_radius = 0.65 / 2 # 英寸
# 卡1:模拟的标题
cs[ "ITLE" ] = f "Mach {dmach}"
# 卡 2 包含气体属性。由于空气是假定的工作流体,因此不需要进行任何更改
# 卡 3:关键设计参数
cs[ "ETAD" ] = 60 # D 点角度
cs[ "RC" ] = 6.0 # 喉部曲率半径 [喉部半径的倍数]
cs[ "CMC" ] = dmach # 设计马赫
cs[ "SF" ] = throat_radius
# 卡 6 (B):停滞和传热特性
cs[ "PPQ" ] = 120 # 停滞压力 [psia]
cs[ "TO" ] = 1000 # 停滞温度 [R]
cs[ "TWT" ] = 540 # 壁温度 [R]
cs[ "TWAT" ] = 540 # 水冷温度 [R] (建议设置为 TWT,因为不假设水冷)
# 卡 7 (D):插补参数
cs[ "XLOW" ] = 0 # 插补轮廓开始点 [in]
cs[ "XEND" ] = 20 # 插补轮廓结束点 [in]
cs[ "XINC" ] = .1 # 插值增量 [in]
# 创建输入文本文件并将其保存到文件夹“inputcards”中的“m5.0.txt”
# !重要的 ! output_directory 的文件夹必须已存在
cs.print_to_input(file_name=f'm{dmach:.1f}.txt', output_directory='inputcards')
```
### 运行 CONTUR
[](#running-contur)
创建输入卡后,`ConturApplication`包装 CONTUR 并可以处理输入卡,生成 CONTUR 输出文本文件和类的实例`ConturResult`。 ConturApplication 提供了三种运行 CONTUR 的方法:
1. `ConturApplication.run()`在当前工作目录中运行 CONTUR:`input.txt`被读取并被`output.txt`创建。`True`如果 CONTUR 未超时则返回,否则返回`False`。
2. `ConturApplication.batch_input_files(file_list, output_dir=os.getcwd(), refine_amt=21)`获取 中的每个文件名 ,在本地目录中运行 CONTUR,并通过附加 到原始输入文件名将`file_list`输出保存到该目录。这会返回每个成功输入的列表,并在坐标之间插入许多点。`output_dir``_result.txt``ConturResults``refine_amt`
3. `ConturApplication.batch_input_folder(folder, output_dir=os.getcwd(), refine_amt=21)`获取 中的每个文件 ,在本地目录中运行 CONTUR,并通过附加 到原始输入文件名将`folder`输出保存到该目录。这会返回每个成功输入的列表,并在坐标之间插入许多点。`output_dir``_result.txt``ConturResults``refine_amt`
如果在 Windows x86_64 或 Apple Silicon ARM_64 以外的体系结构上运行,则必须从目录中的文件编译 CONTUR `src/`,并且`ConturApplication`必须使用参数创建`executable=path_to_executable`。
继续上面的例子:
```
from conturpy import ConturApplication
ca = ConturApplication()
res = ca.batch_input_folder( 'inputcards' , output_dir= 'outputs' )
print(res)
>> [ConturResult:
4317 raw lines
76 output sections]
```
### 读取 CONTUR 的输出
[](#reading-conturs-output)
`ConturResult`ConturPy 通过调用创建类 的实例来读取 CONTUR 的输出,`ConturResult(filename, refine_amt=21)`其中`filename`是 CONTUR 生成的文件的文件名,`refine_amt`是要在输出文件中定义的墙壁轮廓上的每个点之间创建的插值点的数量。
`ConturResult`提供以下属性:
1. `ConturResult.title`:来自输入卡“ITLE”的模拟标题
2. `ConturResult.nozzle_length`:喷嘴从喉部到出口的长度,以英寸为单位
3. `ConturResult.design_mach`:设计马赫数
4. `ConturResult.coordinates`:墙坐标,如果`refine_amt > 1`
5. `ConturResult.sections`:输出中所有已识别部分的列表
6. `ConturResult.characteristics`:所有已识别特征的列表
7. `ConturResult.contours`:所有已识别轮廓的列表
8. `ConturResult.bl_calculations`:所有已识别边界层计算的列表
`ConturResult`还提供了为每个识别的表`ConturResult.save_all(directory)`生成文件和为每个绘图函数生成文件的方法。`.csv``.png`
中的每个部分`ConturResult.sections`都是派生自`BaseConturOutput`并提供原始文本、所有已识别的参数(转换为 Python 数字类型)以及所有已识别的表的类。例如:
```
r =res[0]
print(r.sections[1])
>> ConturInviscidContour:
64 lines
8 parameter groups
1 tables
print(r.sections[1].parameters[0])
>> [('CMACH', 6.0), ('BMACH', 6.0), ('EPSI/ETA', 0.0), ('(N)', 41.0), ('(M)', 61.0)]
print(r.sections[1].tables[0])
>> ConturTable(POINT X X_IN Mach DM_over_DX D2M_over_DX2 D3M_over_DX3 W_Q_over_Astar DW_over_DX D2W_over_DX2 D3W_over_DX3
1 18.8308 6.12002 7 3.83627e-16 2.07123e-1 7 0.014919 2.33333 1.18404e-17 6.39269e- 19 0.000460461
2 18.2311 5.92512 6.99948 0.00261014 -0.00858423 0.0137102 2.33332 8.05763e-05 -0.000265081 0.000424048
3 17.6361 5.73172 6.99593 0.0100753 -0.0163861 0.0125107 2.33321 0.000311459 -0.000507767 0.000392708
4 17.0456 5.53984 6.98671 0.0218612 -0.0234213 0.0113207 2.33292 0.000678228 -0.000732403 0.000369841
5 16.46 5.3495 6.96952 0.0374515 - 0.0297055 0.0101402 2.33239 0.00116972 -0.000944884 0.000357716
6 15.8792 5.16075 6.94244 0.0563482 -0.0352548 0.00896961 2.33154 0.00177865 -0.00115207 0.000357903
7 15.3034 4.97361 6.90387 0.0780716 -0.0400855 0.00780897 2.33031 0.00250193 -0.00136143 0.000371642
...
39 0.68614 0.22299 1.24954 0.449063 0.0611029 -0.021654 1.19489 0.327238 -0.039429 -0.0443235
40 0.46225 0.15023 1.15057 0.434836 0.0660015 -0.0221053 1.12072 0.334891 -0.0286535 -0.0518158
41 0.30914 0.10047 1.08478 0.4 2447 0.0694097 -0.0224139 1.06915 0.338652 -0.0203596 -0.0564415 )
```
该`ConturTable`对象还提供`.to_numpy()`将`.to_pandas()`表转换为其他格式的方法。必须安装 Pandas 才能调用`.to_pandas()`
### 报告生成
[](#report-generation)
ConturPy 可以`.csv`为所有实例生成文件`ConturTable`,并创建各种绘图。每个单独的图和表都可以保存,但是`ConturResult.save_all(directory)`速度足够快并且结果足够小,因此建议简单地调用该`save_all`方法。
下面是马赫数 5.0 喷嘴的一些示例图:
[](/noahess/conturpy/blob/master/assets/Nozzle_Characteristics.png)
> 已识别的特征,按马赫数着色,叠加在喷嘴轮廓和边界层厚度上。
[](/noahess/conturpy/blob/master/assets/Throat_Characteristics.png)
> 喉部特征的特写,包括弯曲的声线。
[![]https://gitee.com/wangfun/conturpy/raw/master/assets/Boundary_Layer_Thickness.png)](/noahess/conturpy/blob/master/assets/Boundary_Layer_Thickness.png)
> 边界层厚度随流向站的变化。
[](/noahess/conturpy/blob/master/assets/Boundary_Layer_Temperature.png)
> 壁面和边界层温度作为流向站的函数。
[](/noahess/conturpy/blob/master/assets/Contours.png)
> 流动轮廓。
[](/noahess/conturpy/blob/master/assets/Flow_Angles.png)
> 根据特征线计算的流动角。径向流清晰可见。
[](/noahess/conturpy/blob/master/assets/Flow_Angles_At_Throat.png)
> 喉部流动角度的特写。
输入卡默认值
------
[](#input-card-defaults)
### 卡1
[](#card-1)
关键字 | 默认值 | 作者注释 |
ITLE | “title” | 标题。最大长度为 10 个字符。 ConturSettings 标题居中对齐。 |
JD | 0 | 轴对称或平面喷嘴。对于轴对称设置为 0,对于平面喷嘴设置为 -1。 |
### 卡2
[](#card-2)
关键字 | 默认 | 作者注释 |
GAM | 1.4 | 比热比。 |
增强现实 | 1716.563 | 气体常数,单位为 ft^2/sec^2 * R |
佐 | 1 | 轴对称喷嘴的压缩系数。未经测试:墙之间的距离(英寸)的一半,假设压缩系数为 1 |
反渗透 | 0.896 | 湍流边界层恢复因子(参见 Sivells 的论文) |
视觉系统控制中心 | 2.27E-08 | 粘度定律常数(参见 Sivells 的论文) |
视觉系统管理 | 198.72 | 粘度定律常数(参见 Sivells 的论文) |
SFOA | 0 | 如果为零:第三或第四度速度分布取决于 IX。如果为负:绝对值为从喉部到点 G 的距离(参见 Sivells 的论文)。如果为正:从喉部到 A 点的距离(参见 Sivells 的论文)。 |
XBL | 1000 | 从哪里开始插值。如果为 1000,则使用样条拟合在墙壁轮廓上获得均匀分布的点。 |
### 卡3
[](#card-3)
关键字 | 默认 | 作者注释 |
---|
埃塔德 | 60 | 径向流的拐角。如果ETAD=60,则指定整个中心线速度分布;卡 4 上 IQ=1 且 IX=0。 |
RC | 6 | 喉部曲率半径:喉部半径的倍数。建议5.5-6.0左右 |
FMACH | 0 | 如果 ETAD 不是 60,F 点的马赫数(参见 Sivells 的论文) |
巴马奇 | 0 | 如果 ETAD 不是 60,则 B 点的马赫数(参见 Sivells 的论文) |
羧甲基纤维素钠 | 0 | C 点的设计马赫数(参见 Sivells 的论文)。这应该是喷嘴的设计马赫数。如果 ETAD 不为 0,请检查 Sivells 的论文,因为此参数很重要。 |
顺丰 | -3 | 如果为正值,则喷嘴将其作为喉部半径(或半高度),以英寸为单位。如果为 0,则喷嘴的半径(或半高)为 1 英寸。如果为负值,则喷嘴将其作为出口半径(或半高度)(以英寸为单位)。 |
聚丙烯 | 0 | A 点的位置(参见 Sivells 的论文)。强烈建议设置为 0(驱动尺寸),除非用户确定要指定位置 A。 |
XC | 0 | 从径向源到 C 点的无量纲距离(参见 Sivells 的论文)。建议 0(四度速度分布)。 |
### 卡4
[](#card-4)
关键字 | 默认 | 作者注释 |
---|
公吨 | 61 | 如果 ETAD=60,则特征 CD 上的点数;如果 ETAD 不是 60,则特征 CD 上的点数(请参阅 Sivells 的论文)。一定是奇数。 |
新台币 | 41 | IE 轴上的点数(参见 Sivells 的论文)。确保abs(LR) + abs(NT) extless{}= 149。必须是奇数。 |
九 | 0 | 不确定该参数的影响(参见 Sivells 的论文)。 |
在 | 10 | 如果非零,则 B 点速度二阶导数的下游值为 0.1 * IN 乘以跨音速值(如果 ETAD=60)或 0.1 * abs(IN) 乘以径向值(如果 ETAD 不为 60)。仅对喉道使用 0。建议10。 |
智商 | 0 | 如果 ETAD 不是 60,则 0 表示完整轮廓,1 仅表示喉部,-1 仅表示下游。 |
医学博士 | 61 | 特征 AB 上的点数(参见 Sivells 的论文)。不超过 125。必须是奇数。 |
ND | 69 | BC 轴上的点数(参见 Sivells 的论文)。不超过150。 |
核因子 | -61 | 如果 ETAD 不是 60,则特征 CD 上的点数。如果使用,请参阅 Sivells 的论文。 |
国会议员 | 0 | 如果 FMACH 不等于 BMACH,则 GA 部分上的点数(参见 Sivells 的论文)。西维尔斯指出“通常不知道初始计算” |
MQ | 0 | 如果需要平行轮廓,则 D 点下游的点数。消极地阻止无粘性打印输出。 |
柔佛州 | 1 | 如果为正:样条拟合之前边界层计算的数量。负面影响尚不清楚,请参阅西维尔斯的论文。建议1。 |
剑侠 | 0 | 正数计算流线。如果 XBL = 1000,如果 JX=0,则在 invisid 计算后进行样条拟合;如果为负,则重复计算。如果 XBL 不是 1000,则重复计算。 |
杰成 | 1 | 如果不为零,则打印出每个 JC 特性的无粘特性。上游为正,下游为负。 |
它 | 0 | 不确定。 |
LR | -25 | 喉部特征的点数。负片打印出跨音速溶液。如果 0,则在 I 点处 M=1。参见 NT。 |
NX | 13 | 上游等值线的对数间距。 10 是更近的间距,20 是更远的间距。 10 到 20 之间。建议 13。 |
### 卡A
[](#card-a)
关键字 | 默认 | 作者注释 |
---|
诺普 | 50 | 不确定。 |
鼻咽癌 | 85 | 不确定。 |
诺多 | 50 | 不确定。 |
### 卡B
[](#card-b)
关键字 | 默认 | 作者注释 |
---|
PPQ | 90 | PSIA 的停滞压力 |
到 | 1030 | 兰金的停滞温度 |
行波管 | 540 | 兰金的喉壁温度 |
TWAT | 540 | D点壁温 |
QFUN | 0 | 如果指定,喉部的传热函数(参见 Sivells 的论文) |
阿尔法 | 0 | 请参阅 Sivells 的论文:边界层中的温度分布(0 或 1)。建议抛物线分布为 0。 |
IHT | 0 | 没用过。 |
红外 | 0 | 不确定。 |
ID | 1 | 如果为 1,则边界层参数中包含轴对称效应。负值抑制边界层计算的打印输出。 |
左室 | 5 | 边界层解的迭代次数。西维尔斯推荐 5。 |
### 卡C
[](#card-c)
关键字 | 默认 | 作者注释 |
---|
埃塔德 | 60 | 不确定。 |
质量管理 | 0 | 不确定。 |
徐继 | 0 | 不确定。 |
### 卡D
[](#card-d)
关键字 | 默认 | 作者注释 |
---|
XST | 1000 | 喉咙该放在哪里。如果是1000,则用PP放置A点。 |
超低 | 0 | 从哪里开始对墙壁轮廓进行插值(英寸)。喉咙之前的任何东西都会给出不好的数据。 |
XEND | 50 | 墙壁轮廓插值的结束位置(英寸)。如果为零,则不确定。 |
欣克 | 2 | 插值墙轮廓的增量 (in) |
北京 | 0 | 不确定。 |
XMID | 0 | 不确定。 |
XINC2 | 0 | 不确定。 |
中国 | 0 | 不确定。 |