Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

流

流星飞宏

@流星飞宏
关于
帖子
5
主题
2
群组
0
粉丝
0
关注
2

帖子

最新

  • OpenFOAM非定常三维计算如何实时输出一个面上的速度场?
    流 流星飞宏

    @李东岳 谢谢东岳老师。


  • 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文件夹内是各个时刻的文件夹。
    9c980ed0-0d9e-4358-b1b2-59e8b8d21658-image-20241021113407476.png

    每个时刻的文件夹内有interpolatedData_U.csv文件,里面存储了每个点的物理量值(比如:速度)。

    02d8c58c-e4c4-45bd-ad05-0d8c0f0164c4-image-20241021113950856-17294819924402.png

    打开interpolatedData_U.csv文件,前三列是坐标点数据,其余列是对应坐标点的物理量值数据。


  • OpenFOAM非定常三维计算如何实时输出一个面上的速度场?
    流 流星飞宏

    @学流体的小明 在 OpenFOAM非定常三维计算如何实时输出一个面上的速度场? 中说:

    function object surfaces
    实时输出就用

    writeControl timeStep;
    writeInterval 1;
    

    谢谢,探索明白了一个方法!


  • OpenFOAM非定常三维计算如何实时输出一个面上的速度场?
    流 流星飞宏

    4e81ac2c-f5b1-43a4-976a-69d451ae499c-图片.png
    能否在OpenFOAM中定义一个计算域的横截面,在计算过程中实时输出这个截面上的速度?


  • openfoam中如何用blockMesh将一个六面体块切分成两部分加密?
    流 流星飞宏

    cdc55d2b-44d3-422d-b228-f51416d7d378-无标题.png

    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        object      blockMeshDict;
    }
    
    // 全局设置
    convertToMeters 1;
    
    // 顶点定义
    vertices
    (
        (0 0 0)
        (1 0 0)
        (1 1 0)
        (0 1 0)
        (0 0 1)
        (1 0 1)
        (1 1 1)
        (0 1 1)
        // 添加新的顶点用于切分
        (0 0 0.5)
        (1 0 0.5)
        (1 1 0.5)
        (0 1 0.5)
    );
    
    // 块定义(切分成两个块)
    blocks
    (
        hex (0 1 2 3 8 9 10 11) (20 20 10) simpleGrading (1 1 1) // 下面的块
        hex (8 9 10 11 4 5 6 7) (40 40 10) simpleGrading (1 1 1) // 上面的块
    );
    
    // 边界定义
    boundary
    (
        front
        {
            type patch;
            faces
            (
                (4 5 6 7)
            );
        }
        back
        {
            type patch;
            faces
            (
                (0 1 2 3)
            );
        }
        left
        {
            type patch;
            faces
            (
                (0 4 7 3)
            );
        }
        right
        {
            type patch;
            faces
            (
                (1 2 6 5)
            );
        }
        bottom
        {
            type patch;
            faces
            (
                (0 1 5 4)
                (8 9 5 4)
            );
        }
        top
        {
            type patch;
            faces
            (
                (3 2 6 7)
                (11 10 6 7)
            );
        }
        middle // 添加中间的边界
        {
            type patch;
            faces
            (
                (8 9 10 11)
            );
        }
    );
    
    // 网格划分方法
    mergePatchPairs
    (
    );
    
    

    这样多定义出4个顶点(8 9 10 11),但是运行blockMesh的时候报错,如下:(以icoFoam中cavity算例为基础)
    --> FOAM FATAL ERROR:
    face 0 in patch 2 does not have neighbour cell face: 4(0 4 7 3)
    大家之道该怎么调节吗?


    具体想实现的功能就是在计算的时候输出一个平面的速度,想用functionObject功能,但是需要指定一个面,所以上述想在画网格的时候把面指定出来。

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]