Я пытаюсь найти магнитную энергию в трехмерной коробке размером 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))