123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- from scipy.special import hankel2 as H2n
- import matplotlib.pyplot as plt
- import numpy as np
- import os
- import scipy.io
- c = 299792458.0
- eps_0 = 8.854187817e-12
- pi = np.pi
- r = 800e-9
- debug = False
- verbose = 6
- def read_data_mat(fname):
-
-
- mat = scipy.io.loadmat(fname)
-
- lambd = np.reshape(mat["lambda"],(-1))
- dippower = np.reshape(mat["dippower"],(-1))
- vacpower = np.reshape(mat["vacpower"],(-1))
- z = np.reshape(mat["z"],(-1))
- n_Au = np.reshape(mat["n_fdtd"],(-1))
- onez = np.ones((len(z)))
- data1 = {}
- r1 = mat["mon1_E"][0,0][4][0,0]
- E1 = mat["mon1_E"][0,0][0]
- H1 = mat["mon1_H"][0,0][0]
- data2 = {}
- r2 = mat["mon2_E"][0,0][4][0,0]
- E2 = mat["mon2_E"][0,0][0]
- H2 = mat["mon2_H"][0,0][0]
- for i in range(len(lambd)):
- fdata = np.vstack(( z.astype(np.complex128), dippower[i]*onez.astype(np.complex128)
- ,E1[:,0,i], E1[:,1,i], E1[:,2,i]
- ,H1[:,0,i], H1[:,1,i], H1[:,2,i]
- ,n_Au[i]*onez.astype(np.complex128), dippower[i]*onez.astype(np.complex128)
- ))
- data1[lambd[i]]=fdata
- fdata = np.vstack(( z.astype(np.complex128), dippower[i]*onez.astype(np.complex128)
- ,E2[:,0,i], E2[:,1,i], E2[:,2,i]
- ,H2[:,0,i], H2[:,1,i], H2[:,2,i]
- ,n_Au[i]*onez.astype(np.complex128), dippower[i]*onez.astype(np.complex128)
- ))
- data2[lambd[i]]=fdata
- if debug: break
- return ((r1,data1),(r2,data2))
- def read_data(dirname):
- data = {}
- WLs = []
- for r,d,f in os.walk(dirname):
- for fname in f:
- WLs.append(fname)
- for fname in WLs:
- fdata = np.transpose(
- np.genfromtxt(dirname+"/"+fname, delimiter=", ",skip_header=1
- ,dtype=None, encoding = None
- , converters={0: lambda s: complex(s),
- 1: lambda s: complex(s),
- 2: lambda s: complex(s.replace('i', 'j')),
- 3: lambda s: complex(s.replace('i', 'j')),
- 4: lambda s: complex(s.replace('i', 'j')),
- 5: lambda s: complex(s.replace('i', 'j')),
- 6: lambda s: complex(s.replace('i', 'j')),
- 7: lambda s: complex(s.replace('i', 'j')),
- 8: lambda s: complex(s.replace('i', 'j'))
- }
- )
- )
- data[float(fname[2:-4])]=fdata
- if debug: break
- return data
- def find_nearest(array,value):
- idx = (np.abs(array-value)).argmin()
- return array[idx],idx
- def get_WLs_idx(WLs, data):
- dist = 1
- mmedia = 1
- shift = 1
- WLs_idx = []
- for wl in WLs:
- val, idx = find_nearest(data[dist][mmedia][shift][0,:],wl*1e-9)
- WLs_idx.append(idx)
- return WLs_idx
- def cross(a, b):
- c = [a[1]*b[2] - a[2]*b[1],
- a[2]*b[0] - a[0]*b[2],
- a[0]*b[1] - a[1]*b[0]]
- return c
- def analyze(data,wl):
-
-
-
- lambd = wl
- omega = 2*pi*c/lambd
- eps_d = complex(1)
- eps_m = data[8,0]**2
- dip_power = data[1,0]
- vac_power = data[9,0]
- z = data[0,:]
- idx_d = np.nonzero(z>1e-10)
- idx_0 = np.nonzero(np.logical_and(z<=1e-10, z>=-1e-10))
- idx_m = np.nonzero(z<-1e-10)
- z_d = z[idx_d]
- z_0 = z[idx_0]
- z_m = z[idx_m]
- if (not np.array_equal(np.hstack((z_m, z_0, z_d)), z)):
- print("ERROR! loosing z values!")
- raise
-
- Ex_m = data[2,idx_m][0]
- Ey_m = data[3,idx_m][0]
- Ez_m = data[4,idx_m][0]
- Hx_m = data[5,idx_m][0]
- Hy_m = data[6,idx_m][0]
- Hz_m = data[7,idx_m][0]
- E_m = np.transpose(np.array([Ex_m,Ey_m,Ez_m]))
- H_m = np.transpose(np.array([Hx_m,Hy_m,Hz_m]))
-
- Ex_d = data[2,idx_d][0]
- Ey_d = data[3,idx_d][0]
- Ez_d = data[4,idx_d][0]
- Hx_d = data[5,idx_d][0]
- Hy_d = data[6,idx_d][0]
- Hz_d = data[7,idx_d][0]
- E_d = np.transpose(np.array([Ex_d,Ey_d,Ez_d]))
- H_d = np.transpose(np.array([Hx_d,Hy_d,Hz_d]))
-
- k_0 = omega/c
- k_sp = k_0*np.sqrt(eps_d*eps_m/(eps_d+eps_m))
- chi_d = np.sqrt( eps_d*k_0**2 - k_sp**2 )
- chi_m = np.sqrt( eps_m*k_0**2 - k_sp**2 )
-
-
-
- mul = -1
- h_sp_d = np.exp(mul*1j*chi_d*z_d)
- e_sp_x_d = chi_d/(omega*eps_0*eps_d)*np.exp(mul*1j*chi_d*z_d)
- e_sp_z_d = -k_sp/(omega*eps_0*eps_d)*np.exp(mul*1j*chi_d*z_d)
- h_sp_m = np.exp(1j*-chi_m*z_m)
- e_sp_x_m = -chi_m/(omega*eps_0*eps_m)*np.exp(1j*-chi_m*z_m)
- e_sp_z_m = -k_sp/(omega*eps_0*eps_m)*np.exp(1j*-chi_m*z_m)
- if verbose > 8:
- print("WL =",1e9*wl)
-
- print(1j*1e9/chi_d)
- print(1j*1e9/chi_m)
- print("_d")
- print(1e9*z_d)
- print(h_sp_d)
- print("_m")
- print(1e9*z_m)
- print(h_sp_m)
- zero_m = np.zeros(len(h_sp_m))
- zero_d = np.zeros(len(h_sp_d))
- E_minus_sp_0_m = np.transpose([1j*H2n(1,k_sp*r)*e_sp_x_m,
- zero_m,
- H2n(0,k_sp*r)*e_sp_z_m])
- H_minus_sp_0_m = np.transpose([zero_m,
- 1j*H2n(1,k_sp*r)*h_sp_m,
- zero_m])
- E_minus_sp_0_d = np.transpose([1j*H2n(1,k_sp*r)*e_sp_x_d,
- zero_d,
- H2n(0,k_sp*r)*e_sp_z_d])
- H_minus_sp_0_d = np.transpose([zero_d,
- 1j*H2n(1,k_sp*r)*h_sp_d,
- zero_d])
-
- N_sp_0 = ( ((-1)**0) * (4.0j / (omega*eps_0*k_sp))
- * (eps_d**2 - eps_m**2) / ((eps_m*eps_d)**(3/2)) )
-
- tmp_m = np.cross(E_minus_sp_0_m,H_m) - np.cross(E_m, H_minus_sp_0_m)
-
- radail_pojeciton_m = np.transpose(tmp_m)[0]
- integrand_m = (2*pi/N_sp_0)*radail_pojeciton_m*r
-
-
-
-
-
-
- tmp_d = np.cross(E_minus_sp_0_d,H_d) - np.cross(E_d, H_minus_sp_0_d)
-
- radail_pojeciton_d = np.transpose(tmp_d)[0]
- integrand_d = (2*pi/N_sp_0)*radail_pojeciton_d*r
-
- A_sp_0_m = np.trapz(integrand_m, z_m)
- A_sp_0_d = np.trapz(integrand_d, z_d)
- A_sp_0 = A_sp_0_m + A_sp_0_d
- return np.absolute(A_sp_0)**2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- file_ext="pdf"
- def main (monitor_index):
-
-
-
-
- filename="bg-Au-sub-dipole-W.fsp.1D.mat"
- data2 = read_data_mat(filename)
- r,data = data2[monitor_index]
- if verbose > 5:
- print("r =",r)
- WLs = []
- A2 = []
- for wl in data:
- WLs.append(wl)
- A2.append(analyze(data[wl],wl))
- WLs1 = np.array(WLs)
- A21 = np.array(A2)
-
-
-
-
- filename = 'bg-Au-sub-Au-dipole-W.fsp.1D.mat'
-
- data2 = read_data_mat(filename)
- r,data = data2[monitor_index]
- WLs = []
- A2 = []
- for wl in data:
- WLs.append(wl)
- A2.append(analyze(data[wl],wl))
-
- WLs2 = np.array(WLs)
- A22 = np.array(A2)
-
-
-
-
- plt.plot(WLs1*1e9, A22/A21, color="black",label="eff.")
-
-
- plt.legend()
- plt.xlabel(r'$\lambda$, nm')
-
-
-
-
-
- plt.ylabel(r'$^{|A^{ant}_{sp}|^2}/_{|A^0_{sp}|^2}$',labelpad=1,size=14)
- plt.title("r = %4.1f nm"%(r*1e9))
- plt.savefig(filename+str(monitor_index)+"_A2."+file_ext)
- plt.clf()
- plt.close()
- main(0)
- main(1)
|