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中文网

  1. CFD中文网
  2. OpenFOAM
  3. OpenFOAM与libtorch的数据对应

OpenFOAM与libtorch的数据对应

已定时 已固定 已锁定 已移动 OpenFOAM
10 帖子 3 发布者 4.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年6月21日 06:29 最后由 编辑
    #1

    因为OpenFOAM的编号类似一个数组,是类似下图这种编号。在这种情况下,比如上边界对应的网格编号就是4 9 14 19 20这种。规律是有,这我知道,但是明显就麻烦好多。

    libtorch下面因为主要处理图像识别,那面是按照二维数组来存储。比如下图就是长5宽5的数组。OpenFOAM编号4 9 14 19 20的网格单元,在libtorch里面就简单很多:00 01 02 03 04。

    现在打算把OpenFOAM数据输入到libtorch里面。这个一一对应关系花了我好长时间来搞。比如对于上边界:

    4  -> 00
    9  -> 01
    14  -> 02
    19  -> 03
    20 -> 04
    

    看起来吧,也能写,就是挺麻烦 :136: 有点像是硬植入。我在用PINN算顶盖驱动流的时候,把libtorch的数据转换成OpenFOAM的时候,处理的就挺麻烦。

    不知道其他人有没有什么更简单的方法

    微信图片_20240621082337.jpg

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • B 离线
    B 离线
    bestucan 版主 大神
    写于2024年6月21日 17:39 最后由 bestucan 编辑 2024年6月22日 01:40
    #2

    假设libtorch的数组为 lib[i][j],OpenFOAM的数组为op[25]

    那么,按照libtorch的位置坐标i,j,OpenFOAM对应位置的坐标表达式为

    op[4-i+j*5]
    

    测试两个边界

    
    (i,j) | 对应坐标下OpenFOAM的索引
          |
    (0,0) | op[4]
    (0,1) | op[9]
    (0,2) | op[14]
    (0,3) | op[19]
    (0,4) | op[24]
          |
    (0,0) | op[4]
    (1,0) | op[3]
    (2,0) | op[2]
    (3,0) | op[1]
    (4,0) | op[0]
    
    

    如果想要重新排序二维数组

    for (i=0; i<5; i++) {
    for (j=0; j<5; j++) {
    new[i][j] = op[4-i+j*5];
    }
    }

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年6月22日 14:04 最后由 编辑
    #3

    我之前就是这么搞的。我想换一种方法。有点像是一个普适性的接口。目前想的还比较迷糊:

    1. libtorch矩阵那面不存在网格位置信息。定义一个新的class,其包含libtorch那面的矩阵,同时包含网格位置信息

    2. 把libtorch的矩阵每个附加位置信息,比如A[0][0]有个位置信息是(2,3,0)

    3. 寻找A[0][0]距离openfoam最近的网格,有可能找出来就是mesh()[34]

    4. 然后建立一个map,建立libtorch矩阵与openfoam网格单元的互相对应的表,以后查表调用

    但感觉也挺麻烦。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • B 离线
    B 离线
    bestucan 版主 大神
    写于2024年6月22日 15:50 最后由 编辑
    #4

    OpenFOAM的网格就是这么存的。每个网格都有一个id,然后分别有文件记录:对于每一个id的网格,该网格的相邻网格的id、属于该网格的面id,等等。

    不过这个复杂度高些,是为非结构网格准备的。如果是结构化的,应该更简洁些。

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年6月22日 18:03 最后由 编辑
    #5

    感觉继续搞深了,一套基于openfoam+libtorch的软件的底层就出来了,起码是数据接口方面

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年7月5日 14:21 最后由 李东岳 编辑 2024年7月5日 22:37
    #6

    libtorchTensor[i][j] = U[pixel - 1 - i + j*pixel].x() << endl;

    大佬写的这个确实比我写的简单。屌。网格是这种Pixel*Pixel的正方形这种赋值可以。


    我刚试了一下,如果是140*140的网格,总共19600个单元。pixel - 1 - i + j*pixel最大编号干到140-1 - 139 + 139*140是19460?

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    B 1 条回复 最后回复 2024年7月5日 14:54
  • B 离线
    B 离线
    bestucan 版主 大神
    在 2024年7月5日 14:54 中回复了 李东岳 最后由 bestucan 编辑 2024年7月5日 23:01
    #7

    @李东岳 在 OpenFOAM与libtorch的数据对应 中说:

    我刚试了一下,如果是140140的网格,总共19600个单元。pixel - 1 - i + jpixel最大编号干到140-1 - 139 + 139*140是19460?

    由李老师的第一贴里的图片可知OpenFOAM方格里,最大索引数字是24,在右上角。

    右上角在libtorch里的坐标是(0, pixel)

    所以应该是

    pixel - 1 - i + j*pixel = 140-1-0+139*140=19599

    这个公式不只是二维数组切换成一维数组(二维数组写成一维很简单,乘以行长加一起就行了)

    这个公式还完成了一个“旋转”。旋转的是“递增索引”的方向。OpenFOAM是竖着从下往上。libtorch是横着从左往右。所以有点绕。

    pixel = 5就是我写的公式了,我和大佬想一起了,真是英雄所见略同(。・`ω´・)

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年7月5日 14:57 最后由 编辑
    #8

    屌!!:wolaile: :wolaile: :wolaile: :wolaile:

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年10月16日 11:23 最后由 李东岳 编辑 2024年10月16日 19:42
    #9

    之前我还是思维定势了,比如5×5的网格,我把libtorch那面的网格处理成{5,5}的,就有对应这个问题。目前有一个更好的方式,把libtorch那面的网格处理成{25,1,2}的tensor,会简单很多。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 小 离线
    小 离线
    小菜鸟
    写于2025年4月14日 08:40 最后由 编辑
    #10

    我用的python,用fulidFOAM库和自己写的代码,可以读openfoam网格,可以带编号。然后用pyg的graph存,也能保存网格与网格之间的连通属性。是可以 迁移到C++上面,达到想要的效果的。

    1 条回复 最后回复
2024年6月21日 06:29

6/10

2024年7月5日 14:21

未读 4
2025年4月14日 08:40
  • 登录

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