Магнитная энергия трехмерной сетки в реальном пространстве и в пространстве Фурье должны быть равны? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь найти магнитную энергию в трехмерной коробке размером lx, ly и lz с nx, ny и nz точками сетки, в терминах векторного потенциала A, используя преобразование Фурье как E_magn = 0,5 * k ^ 2 * A ^ 2. Разве эта энергия не должна быть равна E_magn = 0,5 * B ^ 2 в реальном пространстве? Похоже, я что-то упустил в коде ниже. Любая помощь высоко ценится.

from numpy import newaxis as nna


def create_kgrid(nx, ny, nz, lx, ly, lz):
"""
Create a 3D k grid for Fourier space calculations
"""
kx = nf.fftshift(nf.fftfreq(nx))*nx*2*pi/lx
ky = nf.fftshift(nf.fftfreq(ny))*ny*2*pi/ly
kz = nf.fftshift(nf.fftfreq(nz))*nz*2*pi/lz

mg = np.meshgrid(kx,ky,kz)

km = np.sqrt(np.sum((m**2 for m in mg)))

return kx[:,nna,nna], ky[nna,:,nna], kz[nna,nna,:], km


def vecpot(arx,ary,arz, lx, ly, lz):
"""
Function to compute vector potential of a 3D array
"""
nx,ny,nz=arx.shape

#   COMPUTE THE ARRAY SIZE
kx, ky, kz, km = create_kgrid(*arx.shape, lx=lx, ly=ly, lz=lz)
k2=km**2
k2[nx/2,ny/2,nz/2]=1.

#  FOURIER TRANSFORM THE ARRAY
farx = nf.fftshift(nf.fftn(arx))
fary = nf.fftshift(nf.fftn(ary))
farz = nf.fftshift(nf.fftn(arz))

#  FIND THE CORRESPONDING VECTOR POTENTIAL A = -ik x B /k^2
axf = -1j*(ky*farz-kz*fary)/k2
ayf = -1j*(kz*farx-kx*farz)/k2
azf = -1j*(kx*fary-ky*farx)/k2

#  BACK TRANSFORM TO REAL SPACE
ax  = np.real(nf.ifftn(nf.ifftshift(axf)))
ay  = np.real(nf.ifftn(nf.ifftshift(ayf)))
az  = np.real(nf.ifftn(nf.ifftshift(azf)))
return ax,ay,az

E_magnetic= 0.5*np.mean((kx**2+ky**2+kz**2)*(ax**2+ay**2+az**2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...