首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算CFD网格中点间距离的方法

计算CFD网格中点间距离的方法
EN

Stack Overflow用户
提问于 2018-06-28 09:25:04
回答 1查看 333关注 0票数 1

我有一个结构化的网格,它围绕着3e+6点

请查看图片:https://i.stack.imgur.com/eUUkQ.jpg

物理域中的每个点(欧几里德)在计算域中都有一个索引(i、j和k)。

我需要迭代计算域索引,并使用相应的点进行计算。

例如,给定索引方向I的长度为(伪码):length =vec_len(点(i+1,j,k) -点(i,j,k))

此外,重要的是要找出长度的比率在一个给定的点。例如,我计算两个附近的长度在方向i和除以它们之间。

我想出的东西花费了太多的时间,而且可能没有充分利用NumPy必须提供的全部潜力。

我制作了一个包含所有网格XYZ坐标的零的ndarray。

代码语言:javascript
复制
block_data =numpy.zeros((i_dim,  j_dim, k_dim, 3), dtype='float')

数字3对应于3个元素,x,y和z。

因此,如果我希望i=3,j=7,k=10的z值是:

代码语言:javascript
复制
Z = block_data[3][7][10][2]

欧几里德空间中的一个点是(1,3) ndarray:

代码语言:javascript
复制
point = block_data[i][j][k]

我计算两点之间的长度的方法是:

代码语言:javascript
复制
numpy.linalg.norm(point2 - point1)

只有长度计算大约需要1.5ms,我想计算所有点和所有方向的距离: 3e+6 * 3。

我认为构造主块ndarray (block_data)的方法有一个问题,因为它限制了我一次只计算两个点,即只有两个小的(1,3) ndarray。如果我没记错的话,对小数组进行计算就不那么有效了。

我如何处理这个问题并使运行时间更快?有书推荐这类问题吗?谢谢:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-28 15:21:30

要计算这种大小的数组中的欧几里德距离,我建议使用矢量化方法:

代码语言:javascript
复制
def euclid_dist(array, direction):
    if direction == 'i':  # make shifted views depending on the direction
        p1 = array[:-1, :, :]
        p2 = array[1:, :, :]
    elif direction == 'j':
        p1 = array[:, :-1, :]
        p2 = array[:, 1:, :]
    elif direction == 'k':
        p1 = array[:, :, :-1]
        p2 = array[:, :, 1:]
    else:
        raise ValueError('direction ' + direction + ' not known.')

    # get euclidean distance for all points in direction:
    euc_dist = (((p1 - p2)*(p1 - p2)).sum(axis=3))**0.5

    return euc_dist

使用一个小的测试数组:

代码语言:javascript
复制
arr = np.random.randint(-20, 20, 5*5*5*3).reshape(5, 5, 5, 3)
eu_i = euclid_dist(arr, 'i')
eu_j = euclid_dist(arr, 'j')
# test some values:
print(eu_i[2, 1, 2] == np.linalg.norm(arr[2, 1, 2] - arr[3, 1, 2]))
# Out 64: True
print(eu_j[1, 1, 1] == np.linalg.norm(arr[1, 1, 1] - arr[1, 2, 1]))
# Out 65: True

一些具有8e6点和24e6值的大数组的计时:

代码语言:javascript
复制
big_arr = np.random.rand(200, 200, 200, 3)
%timeit euclid_dist(big_arr, 'i')
# 644 ms ± 57.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

对于这样大小的数组来说,Imho是相当快的。)如果我正确地读取了您的时间,这大约比您的代码快19000倍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51079247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档