四维空间中的交叉积,假想的人工制品出现

时间:2018-02-26 13:55:32

标签: python numpy fft

我正在编写一个代码来模拟周期性立方体中的湍流。 为此,我开始使用形状[64,64,64,3]的速度矢量场,这意味着每个方向(x,y,z)有64个网格点,并且在这个空间的每个点都有3个速度分量(ux,uy ,UZ)。 要计算下一个时间步,必须从速度场计算涡量场,此处出现问题。

我们举个例子来考虑所谓的ABC形式的流程

form

在这种情况下,速度场的旋转保持不变,即速度场 u 和涡度场 omega 相等。为了计算涡度场外的速度场,可以使用如下等式

follows

为了计算导数,我使用了伪谱方法,使得方程式如下所示

this

u_k和omega_k是傅立叶空间中的速度和涡度场。

我试着编写一个代码来计算傅里叶空间中ABC流速场的涡度,然后从涡度场计算出速度场。 。 速度和涡度场在实际空间中应该看起来相同,但正如你在这里看到的那样,它们没有。

here

图片显示了真实中傅立叶空间中单个层的第一个矢量分量的实部和开始时(前)的速度的傅里叶空间,涡度(后)计算出的涡度和速度。 正如您所看到的,速度场看起来与预期的相似,而真实空间中的涡度场呈现出类似条纹的图案,尽管看起来应该是相同的。

看一下真实空间中涡度场的虚部,可以看到一个类似于条纹的图案,它适合于你在这里看到的真实部分之一。

here

我现在的问题是找到构建该模式的原因。 涡度应该看起来像速度场,但它没有,我无法弄清楚为什么。 解决这个问题对于避免在计算下一个时间步骤时丢失信息非常重要。

我的代码如下所示:

import numpy as np
import matplotlib.pyplot as plt

xx = np.arange(64)                 #creating 1D x coordinate
x,y,z = np.meshgrid(xx,xx,xx)      #calculating 3D x,y,z coordinates
a = np.zeros(shape=(64,64,64,3))   #creating 3D vector field 'a'
A, B, C = 3., 3., 3.               #setting values A,B,C
a[:,:,:,0] = A*np.cos(y/(2.*np.pi)) + B*np.sin(z/(2.*np.pi))  
a[:,:,:,1] = B*np.cos(z/(2.*np.pi)) + C*np.sin(x/(2.*np.pi))
a[:,:,:,2] = C*np.cos(x/(2.*np.pi)) + A*np.sin(y/(2.*np.pi))


k = np.zeros(shape=a.shape)                   # creating k array
k_sqr = np.zeros(shape=a.shape)               # creating k^2 array
k_lin = np.fft.fftfreq(64)*2.*np.pi           # calculating 1D k coordinate
k[:,:,:,0], k[:,:,:,1], k[:,:,:,2] = 
np.meshgrid(k_lin,k_lin,k_lin,indexing='xy')  # calculating 3D kx,ky,kz 
k_sqr[:,:,:,0] =  k[:,:,:,0]**2 + k[:,:,:,1]**2 + k[:,:,:,2]**2
k_sqr[:,:,:,1] =  k_sqr[:,:,:,0]
k_sqr[:,:,:,2] =  k_sqr[:,:,:,0]
k_sqr[0,0,0,:] += 1.      # set zero of k_sqr = 1. to avoide division by 0 

a_fft = np.fft.fftn(a,axes=(0,1,2))              # calculate FFT of a (=uk)

wk = np.cross(1j*k,a_fft)        # calculating vorticity wk by wk = ik x uk

w = np.fft.ifftn(wk,axes = (0,1,2))         # calculating iFFT von wk (w(x))

uk = np.cross(1j*k,wk)/k_sqr        # calculating uk by uk = (ik x wk)/k^2
uk[0,0,0,:] = a_fft[0,0,0,:]                                                        
# set value of position of 0-Division to the value it was before

u = np.fft.ifftn(uk,axes = (0,1,2))        # calculating iFFT of uk (u(x))

我还没有找到有关此问题的任何信息。 如果这个问题已经存在,我很抱歉。 如果不是,我很感激任何想法。

0 个答案:

没有答案