首页 > 其他分享 >反距离空间插值

反距离空间插值

时间:2025-01-09 11:29:09浏览次数:3  
标签:node 插值 self 距离 parts file 空间 path save

参考这里进行 

【数字孪生】Fluent模型仿真结果在Unity当中展示_unity fluent-CSDN博客

 借助gpt学习法完成了一个空间插值

 仿真找不到了,看之前的ppt里的,将就一下(假设这是我们的仿真)

主要是通过ansys仿真,输出仿真的数据,但是这个数据量太大了(十万行)。

处理之后保存为excel文件,给降低了一个数量级

ansys仿真默认已经完成了,接下来是将ansys中建立的三维模型(流体域 实体模型都行),导出为.sat文件格式,通过hypermesh重构网格(多重构几次找到合适的就行了)。

我采用KD树查询附近6个空间节点,进行反距离空间插值。

yterlker/IDWicon-default.png?t=O83Ahttps://github.com/yterlker/IDWGitHub链接中有对应的一些数据和代码,对你有帮助的话,可以点击star

import os
import concurrent.futures
import numpy as np
import pandas as pd
from scipy.spatial import cKDTree

class Vector3:
    def __init__(self, x, y, z, nodeID):
        self.x = x
        self.y = y
        self.z = z
        self.nodeID = nodeID

    def to_tuple(self):
        return (self.x, self.y, self.z)


class NodeData:
    def __init__(self, nodeID=0, origX=0.0, origY=0.0, origZ=0.0, value=0.0):
        self.nodeID = nodeID
        self.origX = origX
        self.origY = origY
        self.origZ = origZ
        self.value = value


class DataParser:
    def __init__(self, file_path):
        self.file_path = file_path
        self.fluent_data = []

    def parse_file(self):
        start_parse = False
        if not os.path.exists(self.file_path):
            raise FileNotFoundError(f"文件 {self.file_path} 不存在。")
        with open(self.file_path, 'r', encoding='utf-8') as file:
            for line_number, line in enumerate(file, 1):
                line = line.strip()
                if 'nodenumber' in line:
                    start_parse = True
                    continue
                if start_parse and line:
                    parts = line.split()
                    if len(parts) == 9:
                        try:
                            node = NodeData(int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]),
                                            float(parts[8]))
                            self.fluent_data.append(node)
                        except ValueError as e:
                            print(f"数据转换错误在行 {line_number}: {e}")


def read_positions(file_path):
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"文件 {file_path} 不存在。")
    positions = []
    with open(file_path, 'r', encoding='utf-8') as file:
        for line_number, line in enumerate(file):
            parts = line.strip().split()
            if len(parts) >= 4:
                nodeID, x, y, z = int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3])
                positions.append(Vector3(x, y, z, nodeID))
    return positions


def inverse_distance_weighted_interpolation(position, nodes, values, k=6):
    if len(nodes) < k:
        k = len(nodes)
    kdtree = cKDTree(nodes)
    distances, indices = kdtree.query(position.to_tuple(), k=k)
    if isinstance(distances, float):  # 当k=1时返回的是单个值而不是数组
        distances = [distances]
        indices = [indices]

    numerator = 0.0
    denominator = 0.0
    for dist, idx in zip(distances, indices):
        if dist < 1e-6:
            return values[idx] if values[idx] >= 0.001 else 0  # 如果非常接近某个节点,返回该节点的值(如果大于0.001)
        weight = 1.0 / dist
        numerator += weight * values[idx]
        denominator += weight
    interpolated_value = numerator / denominator if denominator != 0 else 0
    return interpolated_value if interpolated_value >= 0.001 else 0  # 如果插值结果小于0.001,则取值为0


def interpolate_values(file_path, positions, k=4):
    print(f"正在处理文件: {file_path}")
    node_parser = DataParser(file_path)
    node_parser.parse_file()
    nodes = [(node.origX, node.origY, node.origZ) for node in node_parser.fluent_data]
    values = [node.value for node in node_parser.fluent_data]

    results = []
    for pos in positions:
        interpolated_value = inverse_distance_weighted_interpolation(pos, nodes, values, k)
        results.append((pos.nodeID, pos.x, pos.y, pos.z, interpolated_value))
    return results


def save_results_to_excel(results, file_name, save_path):
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    df = pd.DataFrame(results,
                      columns=['Node ID', 'X Coordinate', 'Y Coordinate', 'Z Coordinate', 'Interpolated Value'])
    file_base_name = os.path.splitext(os.path.basename(file_name))[0]
    file_path = os.path.join(save_path, f'{file_base_name}_results.xlsx')
    df.to_excel(file_path, index=False)
    print(f"结果已保存至: {file_path}")


def process_and_save(file_path, positions, save_path):
    results = interpolate_values(file_path, positions)
    save_results_to_excel(results, file_path, save_path)


def main(data_path, position_file, save_path):
    files = [os.path.join(data_path, f) for f in os.listdir(data_path) if
             f.startswith('VandCh4-') and f.endswith('.txt')]
    files.sort()
    positions = read_positions(position_file)

    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        futures = [executor.submit(process_and_save, file, positions, save_path) for file in files]
        concurrent.futures.wait(futures)


if __name__ == "__main__":
    data_path = '原始文件路径'
    position_file = '重构模型空间节点数据'
    save_path = '保存插值路径'
    main(data_path, position_file, save_path)

 大概就这样,原理的话就是一个公式很简单:

标签:node,插值,self,距离,parts,file,空间,path,save
From: https://blog.csdn.net/qq_54220687/article/details/145011421

相关文章

  • 切比雪夫距离(oiwiki学习)
    oiwiki——距离切比雪夫距离(Chebyshevdistance):对于两个\(n\)维向量\(\vec{x}=(x_1,x_2,...,x_n)\)与\(\vec{y}=(y_1,y_2,...,y_n)\),定义它们之间的切比雪夫距离为\(\max{|x_i-y_i|}\)。切比雪夫距离与曼哈顿距离的联系以二维情况讨论:\((i)\)将每一个点\((x,y)\)......
  • C++程序编译的过程及命名空间
    C++程序编译的过程:预处理-> 编译(优化、汇编)->链接 目录 1.预处理一、包含头文件二、宏定义指令三、条件编译2、编译和链接一、源代码的组织二、编译预处理三、编译四、链接五、更多细节3、命名空间一、语法二、使用命名空间三、注意事项四、代码示例 1......
  • 世界模型和空间智能
    空间思考:多模态大型语言模型如何看待、记忆和回忆空间VSI-Bench:我们引入了一个高质量的基准,用于评估MLLM的3D、基于视频的视觉空间智能评估:我们在开源和闭源MLLM上对VSI-Bench进行了评估,发现MLLM表现出有竞争力的(尽管不如人类)视觉空间智能。语言分析:我们将VSI-......
  • UNET改进61:添加LFE模块|高效长距离注意力网络
    本文内容:在不同位置添加LFE模块目录论文简介1.步骤一2.步骤二3.步骤三4.步骤四论文简介最近,基于Transformer的方法在各种视觉任务中取得了令人印象深刻的结果,包括通过利用自注意力(SA)进行特征提取的图像超分辨率(SR)。然而,在大多数现有的基于Transformer的模型中,SA......
  • 面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现
    循环状态空间模型(RecurrentStateSpaceModels,RSSM)最初由DanijarHafer等人在论文《LearningLatentDynamicsforPlanningfromPixels》中提出。该模型在现代基于模型的强化学习(Model-BasedReinforcementLearning,MBRL)中发挥着关键作用,其主要目标是构建可靠的环境动态......
  • 【Linux】【进程】进程的地址空间 虚拟地址 物理地址
    【Linux】【进程】进程的地址空间虚拟地址物理地址32位系统 a.32位操作系统可以访问4GB内存 b.cpu有八位位线每次访问8bit1字节 c.cpu有32根地址线每次访问2^32 d.因此是2^32字节-->4GB分为1GB的内核空间和3GB的用户空间内核空间1GB用户空间3GB64位系统......
  • CentOS 8 系统中添加 4G 大小的swap(交换空间)
    步骤一:检查磁盘空间可用情况 首先,使用df-h命令查看磁盘各分区的使用情况,确保有足够的磁盘空间来创建swap文件。一般建议选择有充足剩余空间的分区(比如/分区或者有较大空闲容量的其他数据分区等)来存放swap文件。步骤二:创建交换文件 使用dd命令来创建一个大小为4G(4*1024......
  • AI的下一个主战场 —— “空间智能” —— 是否依然可以依靠堆算力和数据来实现呢?
    相关:3个月估值10亿,李飞飞空间智能首个模型诞生!一张图生成3D世界,视频游戏要变天Cosmos模型已经公开发布,下面是相关地址:英伟达API目录:https://build.nvidia.com/explore/simulationHuggingFace:https://huggingface.co/collections/nvidia/cosmos-6751e884dc10e013a0a0d8e6......
  • Python 中的迭代器与生成器、列表与元组的区别、作用域与命名空间的关系、异常处理机
    引言在Python的面试中,除了基础知识,还经常会涉及到一些稍微复杂的概念与问题。这篇文章将继续为大家分析一些高频Python面试题,帮助你更好地准备面试,提升自己的技术能力。......
  • 如何解决虚拟主机空间不足并升级空间的问题
    问题描述:用户报告其虚拟主机站点提示空间不足,导致网站无法正常运行。用户希望了解如何排查原因并升级空间,确保网站能够继续稳定运行。解决方案:确认当前空间使用情况:首先,确认当前虚拟主机的空间使用情况。可以通过控制面板或FTP客户端查看文件夹大小和占用情况。例如,用户报告......