FFTW based One Dimensional Serial Poisson Solver
! Rupak, IPR, 02.06.2017
! Discussion.
! This is an One Dimensional FFTW based Serial Poisson Solver.
!
program poisson1d
integer ( kind = 4 ), parameter :: N = 1024
include "fftw3.f"
double precision:: x, rho, phi
dimension x(N), rho(N), phi(N)
double precision:: rho_k_mod
dimension rho_k_mod(N/2+1)
double complex:: rho_k
dimension rho_k(N/2+1)
double precision:: L,dx
double precision, parameter:: pi=3.14159265358979323846
integer:: i
integer*8:: plan
open(unit=10,file='FFT.dat',status='unknown')
open(unit=12,file='DATA.dat',status='unknown')
L = 2.0d0*pi
dx = L/dfloat(N)
do i=1,N
x(i) = 0.0d0 + dfloat(i-1)*dx
rho(i)= - 1.0d0 + dsin(x(i))
enddo
call dfftw_plan_dft_r2c_1d(plan,N,rho,rho_k,FFTW_ESTIMATE)
call dfftw_execute_dft_r2c(plan,rho,rho_k)
call dfftw_destroy_plan(plan)
do i=1,N/2+1
rho_k_mod(i) = abs(rho_k(i))/dfloat(N/2+1)
write(10,*) i-1, rho_k_mod(i)
enddo
do i= 2,N/2+1
k = 2.0d0*pi*dfloat(i-1)/L
rho_k(i) = - rho_k(i)/(k*k)
rho_k(i) = rho_k(i)
enddo
call dfftw_plan_dft_c2r_1d(plan,N,rho_k,phi,FFTW_ESTIMATE)
call dfftw_execute_dft_c2r(plan,rho_k,phi)
call dfftw_destroy_plan(plan)
do i=1,N
phi(i) = phi(i)/dfloat(N)
write(12,*) x(i), rho(i), phi(i)
enddo
close(10)
close(12)
end program poisson1d