OpenFOAM与libtorch的数据对应
-
因为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
看起来吧,也能写,就是挺麻烦 有点像是硬植入。我在用PINN算顶盖驱动流的时候,把libtorch的数据转换成OpenFOAM的时候,处理的就挺麻烦。
不知道其他人有没有什么更简单的方法
-
假设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]; } }
-
@李东岳 在 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就是我写的公式了,我和大佬想一起了,真是英雄所见略同
(。・`ω´・)