Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 12111

Problems performing 1D-FDTD for dispersive dielectric uisng lorentz model in Julia

$
0
0

So I am trying to model a dispersive dielectric using the Lorentz model in Julia, more specifically I am trying to obtain the frequency-dependent reflectivity of the material. I am ultimately trying to replicate the results in this paper. I have the set of update equations:Update equationsalong with the coefficients:coefficientsI am trying to implement this system but the numerical result I obtain is different than the analytical one. For reference:Results from my current implementationFor some context, my source is a Gaussian pulse with central frequency 26 THz and bandwidth 6 THz. I also use the parameters fmax, nmax, d (the thickness of the slab) to determine the minimum wavelength I want to be able to resolve with my cell size through the relations lambda=c/(fmax*nmax), dzi=lambda/20,N = ceil(d/dzi), dz = d/N. Now I obtain the result above when I put in fmax=10,nmax=1, and d=304.8 which are not the expected values. When I put in the actual values fmax=32 (as the maximum freqeuncy in the source), nmax=16 (since the analtical result gives n=16+16i near the resonance), d=38.1 I get the following:Wrong? result for the right values

Now the solution for the actual values results in a sin^2 pattern just as in the case with no dispersion. The distance between the peaks for a linear material can be found analytically to be c/(2nmaxd) and here the peculiar thing is that the distance between the peaks is the same as the mean of this expression for all the different frequencies (as nmax is a function of frequency now since the material is dispersive). I remain dumbfounded by these results and can't figure out why my implementation is not working.

I have my code written in julia below:

#Initialisation    #Units    ps = 1e-12 #sμm = 1e-6 #m    THz = 1e12 #Hz    F_per_m = ps^-4*μm^3 #(ps⁴*A²)/(kg*μm³)    H_per_m = ps^2/μm #(kg*μm)/(ps²*A²)    #Grid Resolution (Wavelength)    c = 299792458*ps/μm #μm/psλₘᵢₙ = c/(nₘₐₓ*fₘₐₓ) #μm    Nₗ = 20 #number of points per wavelengthΔₗ = λₘᵢₙ/Nₗ #μm    #Grid Resolution (Structure)    Nₛ = 4Δₛ = d/Nₛ #μm    #Initial Grid Resolution (Overall)Δzᵢ = min(Δₗ,Δₛ) #μm    #Snap Grid to Critical Dimension(s)    dᵣ = d #μm    N = ceil(dᵣ/Δzᵢ)Δz = dᵣ/N #μm    #Determine Size of the Grid    Nᵣ = Int64(N+23) #number of total cells    z = (1:Nᵣ)*Δz    #Compute Position of Materials    n₁ = 13 #first cell of the material    n₂ = Int64(n₁+round(d/Δz)-1) #last cell of the material    #Add Materials to the Gridμᵣ = 1 #relative permeability of materialμₛ = 1 #relative permeability of sourceεₛ = 1 #relative permittivity of source    nₛ = sqrt(μₛ*εₛ) #refractive index of source    UR=fill(μₛ,Nᵣ) #relative permeability across the grid    UR[n₁:n₂].=μᵣ    #Calculate Time Step    nb = 1 #refractive index of the boundaryΔt = (nb*Δz)/(2c) #psτ = 1/(2*6) #1/(2fₘₐₓ) #ps    t₀ = 6τ #ps    tₚᵣₒₚ = (nₘₐₓ*Nᵣ*Δz)/c #ps    T = 12τ+tc*tₚᵣₒₚ #ps    Steps = Int64(ceil(T/Δt)) #number of total time steps    #Compute the Source Functionsω = 26*2π #THz    t = (0:Steps-1)*Δt #psδt = (nₛ*Δz)/(2c)+Δt/2 #ps    Eₛ = exp.(-((t.-t₀)./τ).^2).*exp.(im*ω.*(t.-t₀)) #located at source    Hₛ = -sqrt(εₛ/μₛ).*exp.(-((t.-t₀.+δt)./τ).^2).*exp.(im*ω.*(t.-t₀.+δt)) #located at source-1    #Parameters for Equation of Motionμ₀ = 4π*1e-7*H_per_m #H/mϵ₀ = 1/(c^2*μ₀) #F/mε₀, εₓ = ones(Nᵣ), ones(Nᵣ)Γ, Ω, α, β = zeros(Nᵣ), zeros(Nᵣ), zeros(Nᵣ), zeros(Nᵣ)ε₀[n₁:n₂].= 9.66εₓ[n₁:n₂].= 6.52Γ[n₁:n₂].= 0.2 #THzΩ[n₁:n₂].= 24.9 #THzΩ₀ = sqrt(ε₀[n₁]/εₓ[n₁]*Ω[n₁]^2) #THz    #Compute Update Coefficients    #UR *= nb/(2*ri) .*(sin.(π*fₘₐₓ*ri*Δz/c))./(sin.(π*fₘₐₓ*Δt))    #ε₀ *= nb/(2*ri) .*(sin.(π*fₘₐₓ*ri*Δz/c))./(sin.(π*fₘₐₓ*Δt))    #εₓ *= nb/(2*ri) .*(sin.(π*fₘₐₓ*ri*Δz/c))./(sin.(π*fₘₐₓ*Δt))    meh = nb./(2*UR)    mjj = (2 .-Γ.*Δt)./(2 .+Γ.*Δt)    mqj = (2 .*Ω.^2 .*Δt)./(2 .+Γ.*Δt)    mej = (2*Ω.*sqrt.((ε₀.-εₓ)).*Δt)./(2 .+Γ.*Δt)    mhd = nb/2    mde = 1./(εₓ)    mqe = (Ω .*sqrt.((ε₀.-εₓ)))./(εₓ)    #Initialize fields and Boundary Terms    E, H, J, Q, D             =zeros(ComplexF64,Nᵣ),zeros(ComplexF64,Nᵣ),zeros(ComplexF64,Nᵣ),zeros(ComplexF64,Nᵣ),zeros(ComplexF64,Nᵣ)    e₁, e₂ = 0,0    h₁, h₂ = 0,0    #Initialize Reflected and Transmitted Fields    Er = zeros(ComplexF64,Steps)    Et = zeros(ComplexF64,Steps)    #Setup Fourier Transforms    Freq = fftshift(fftfreq(Steps,1/Δt))    Esf = fftshift(fft(Eₛ))    #Main FDTD Loop    for T in 1:Steps        #Record H at Boundary        h₂ = h₁        h₁ = H[1]        #Update H from E        for nz in 1:Nᵣ-1            H[nz] = H[nz] + meh[nz]*(E[nz+1] - E[nz])        end        H[Nᵣ] = H[Nᵣ] + meh[Nᵣ]*(e₂-E[Nᵣ])        #H Source        H[1] = H[1] - meh[1]*Eₛ[T]        #Update J from Q and E        for nz in 1:Nᵣ            J[nz] = mjj[nz]*J[nz] - mqj[nz]*Q[nz] + mej[nz]*E[nz]         end        #Update Q from J        for nz in 1:Nᵣ            Q[nz] = Q[nz] +Δt*J[nz]        end        #Update D from H        D[1] = D[1] + mhd*(H[1] - h₂)        for nz in 2:Nᵣ            D[nz] = D[nz] + mhd*(H[nz] - H[nz-1])        end        #D Source        D[2] = D[2] - mhd*Hₛ[T]        #Record E at Boundary        e₂ = e₁        e₁ = E[Nᵣ]        #Update E from D and Q        for nz in 1:Nᵣ            E[nz] = mde[nz]*D[nz]-mqe[nz]*Q[nz]        end        #Update reflected and transmitted fields        Er[T] = E[1]        Et[T] = E[Nᵣ]    end    #Determine optical properties from FDTD values    Erf = fftshift(fft(Er))    Etf = fftshift(fft(Et))    r = Erf./Esf    tr = Etf./Esf    Ref = abs.(r).^2    Trn = abs.(tr).^2    Con = Ref.+Trn    n = (1 .-r)./(1 .+r)ε₁ = real(n).^2-imag(n).^2ε₂ = 2*real(n).*imag(n)    #Determine optical properties from analytical solution    if matεₜₑₛₜ = εₓ[n₁].+(Ω[n₁]^2*(ε₀[n₁]-εₓ[n₁]))./(Ω[n₁]^2 .-Freq.^2 .-im.*Γ[n₁]*Freq)    end    if !matεₜₑₛₜ = fill(εₓ[n₁],Steps)    end     nₜₑₛₜ = sqrt.(εₜₑₛₜ)    Rₜₑₛₜ=abs.((1 .-nₜₑₛₜ)./(1 .+nₜₑₛₜ)).^2 

I would appreciate any help in fixing my code asap as I have not been able to fix this issue for almost a month now.

As mentioned above I tried changing the values of fmax, nmax, and d to get more accurate results and did manage to except at the wrong values.


Viewing all articles
Browse latest Browse all 12111

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>