OpenFOAM非定常三维计算如何实时输出一个面上的速度场?
-
用OpenFOAM输出一个面上点的物理量
使用
OpenFOAM
中functionObject
的功能,输出采样坐标点上的物理量值,只不过这里的采样点是大量的,是一个面的点集合(点云),骨把点云构造出来,使用采样功能即可输出面上点云的每个点的物理量值。步骤一:构造面上的点云坐标集
方法一:
先使用
blockMesh
生成网格然后用Paraview
或Tecplot
打开,在计算域内建立一个平面或计算域的截面,输出平面上的坐标值。首先导出计算域平面的坐标点数据,保证前三列是
x,y,z
坐标值,运行下面python
程序组成坐标点,import pandas as pd def read_xlsx_and_format(file_path): # 读取 Excel 文件 df = pd.read_excel(file_path, usecols=[0, 1, 2],header=None) # 提取前三列数据 x = df.iloc[:, 0].values y = df.iloc[:, 1].values z = df.iloc[:, 2].values # 将数据转换为所需格式 formatted_data = [f"({x[i]} {y[i]} {z[i]})" for i in range(len(x))] return formatted_data def save_to_csv(formatted_data, output_file_path): # 创建一个 DataFrame 来保存格式化后的数据 df = pd.DataFrame({'Formatted Data': formatted_data}) #df = pd.DataFrame(formatted_data) # 保存为 CSV 文件 df.to_csv(output_file_path, index=False, header=False) # 示例文件路径 input_file_path = 'test_data_pred_velocityU_Point_output-U000000.xlsx' output_file_path = 'xoy_plane_points.csv' # 调用函数并保存结果 formatted_data = read_xlsx_and_format(input_file_path) save_to_csv(formatted_data, output_file_path) print(f"Data has been saved to {output_file_path}")
假设你的 Excel 文件内容如下:
X轴 Y轴 Z轴 1 2 3 4 5 6 7 8 9 调用上述
Python
程序的输出将会是一个名为xoy_plane_points.csv
的文件,内容如下:(1 2 3) (4 5 6) (7 8 9)
方法二
使用
Python
或MtaLab
等软件构建点云集,这样可以自己定义采样点的多少,不必与网格点的数量保持一致。如果想自定义平面点云的分布,不按照划分的网格坐标点来输出,可以使用如下
python
程序生成坐标点:示例:以下程序生成XOY平面点云,X轴范围(0,0.1)均布10个点,Y轴范围(0,0.1)均布20个点。
import numpy as np # 定义 x 和 y 的范围和点数 x_min, x_max = 0, 0.1 y_min, y_max = 0, 0.1 num_x_points = 10 num_y_points = 20 # 生成 x 和 y 的坐标 x = np.linspace(x_min, x_max, num_x_points) y = np.linspace(y_min, y_max, num_y_points) # 生成点云 points = [] for xi in x: for yi in y: points.append((xi, yi, 0.0)) # z 坐标为 0 # 将点云保存到 CSV 文件 with open('xoy_plane_points.csv', 'w') as f: #f.write("Points:0,Points:1,Points:2\n") # 写入表头 for point in points: f.write(f"({point[0]} {point[1]} {point[2]})\n") print("点云文件已生成:xoy_plane_points.csv")
步骤二:在OpenFOAM中定义functions内容
以2.4.x版本的
OpenFOAM
为例,在controlDict
字典文件中加入如下内容:functions { internalVelocity { type sets; // 必须指定类型 functionObjectLibs ("libutilityFunctionObjects.so"); enabled true; outputControl timeStep; outputInterval 1; // 指定要输出的字段 fields ( U ); setFormat csv; // 输出格式,可以选择 raw, vtk, etc. // 指定要使用的点集 sets ( interpolatedData { type cloud; // 必须指定类型 points ( #include "xoy_plane_points.csv"// 加载点集文件,若不在constant文件夹内需指定点(集)云文件路径 ); axis xyz; // 指定点集的轴 } ); // 插值方案 interpolationScheme cellPoint; } }
注意:点云文件应该放
system
文件夹下,保证和controlDict
在同一个文件夹内(2.4.x版本的OpenFOAM
默认和controlDict
在同一个文件夹内,即system
文件夹内),不然要在#include "xoy_plane_points.csv"
语句中加入文件的绝对路径,如果xoy_plane_points.csv
放在constant
文件夹内,则:#include "../constant/xoy_plane_points.csv"
。步骤三:调用求解器运行程序
程序运行结束后会生成一个
postProcessing
文件夹,包含internalVelocity
文件夹,internalVelocity
文件夹内是各个时刻的文件夹。
每个时刻的文件夹内有
interpolatedData_U.csv
文件,里面存储了每个点的物理量值(比如:速度)。打开
interpolatedData_U.csv
文件,前三列是坐标点数据,其余列是对应坐标点的物理量值数据。