Skip to content
Snippets Groups Projects
grating3D_postplot_Mmatrix.py 7.35 KiB
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
plt.rcParams.update({"text.usetex": True, "font.family": "serif"})

def add_colorbar(mappable):
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    import matplotlib.pyplot as plt
    last_axes = plt.gca()
    ax = mappable.axes
    fig = ax.figure
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%", pad=0.05)
    cbar = fig.colorbar(mappable, cax=cax)
    plt.sca(last_axes)
    return cbar

def load_getdp_integral(fname):
    temp = np.loadtxt(fname)
    if len(temp.shape)==1:
        return temp[1]+1j*temp[2]
    else:
        return temp[:,1]+1j*temp[:,2]

nb_lam = 100
nb_phi = 60
FLAG_TOT = 0
respath  = 'res_Matrix_nb_lam100_nb_phi59_total0/'
rpp = np.zeros((nb_lam,nb_phi),dtype=complex)
rps = np.zeros((nb_lam,nb_phi),dtype=complex)
rsp = np.zeros((nb_lam,nb_phi),dtype=complex)
rss = np.zeros((nb_lam,nb_phi),dtype=complex)
efft1_pin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
efft2_pin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
effr1_pin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
effr2_pin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
Qscat_pin = np.zeros((nb_lam,nb_phi))
efft1_sin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
efft2_sin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
effr1_sin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
effr2_sin = np.zeros((9,nb_lam,nb_phi),dtype=complex)
Qscat_sin = np.zeros((nb_lam,nb_phi))


tab_lam = np.linspace(350,800,nb_lam)
tab_phi = np.linspace(0,360,nb_phi)
M = np.zeros((4,4,len(tab_lam),len(tab_phi)),dtype=complex)


### Convention used e.g. in https://doi.org/10.1364/JOSAB.36.000E78
# [Ep]      [ rpp    rps ] [Ep]    
# [  ]    = [            ] [  ]    
# [Es]ref   [ rsp    rss ] [Es]inc
# where Ep  (resp. Es) are the plane wave electric field components 
# that are parallel (resp. perpendicular) to the plane of incidence
# rps : send Es_inc (s-in), project the reflected field along p (p-out)

for i in range(nb_lam):
    for j in range(nb_phi-1):
        print(i,j)
        rpp[i,j] = load_getdp_integral(respath+'r_pin_pout_lam%g_phi%g.out'%(i,j))
        rss[i,j] = load_getdp_integral(respath+'r_sin_sout_lam%g_phi%g.out'%(i,j))
        rps[i,j] = load_getdp_integral(respath+'r_sin_pout_lam%g_phi%g.out'%(i,j))
        rsp[i,j] = load_getdp_integral(respath+'r_pin_sout_lam%g_phi%g.out'%(i,j))
        efft1_pin[:,i,j] = load_getdp_integral(respath+'eff_t1_lam%g_phi%g_psi0.out'%(i,j))
        efft2_pin[:,i,j] = load_getdp_integral(respath+'eff_t2_lam%g_phi%g_psi0.out'%(i,j))
        effr1_pin[:,i,j] = load_getdp_integral(respath+'eff_r1_lam%g_phi%g_psi0.out'%(i,j))
        effr2_pin[:,i,j] = load_getdp_integral(respath+'eff_r2_lam%g_phi%g_psi0.out'%(i,j))
        Qscat_pin[i,j]   = np.real(load_getdp_integral(respath+'Q_scat_lam%g_phi%g_psi0.out'%(i,j)))
        efft1_sin[:,i,j] = load_getdp_integral(respath+'eff_t1_lam%g_phi%g_psi1.out'%(i,j))
        efft2_sin[:,i,j] = load_getdp_integral(respath+'eff_t2_lam%g_phi%g_psi1.out'%(i,j))
        effr1_sin[:,i,j] = load_getdp_integral(respath+'eff_r1_lam%g_phi%g_psi1.out'%(i,j))
        effr2_sin[:,i,j] = load_getdp_integral(respath+'eff_r2_lam%g_phi%g_psi1.out'%(i,j))
        Qscat_sin[i,j]   = np.real(load_getdp_integral(respath+'Q_scat_lam%g_phi%g_psi1.out'%(i,j)))

## replicate data for phi=2\pi from phi=0 
rpp[:,-1] = rpp[:,0]
rss[:,-1] = rss[:,0]
rps[:,-1] = rps[:,0]
rsp[:,-1] = rsp[:,0]

T1_sin = np.sum(efft1_sin,axis=0)
T2_sin = np.sum(efft2_sin,axis=0)
R1_sin = np.sum(effr1_sin,axis=0)
R2_sin = np.sum(effr2_sin,axis=0)
T1_pin = np.sum(efft1_pin,axis=0)
T2_pin = np.sum(efft2_pin,axis=0)
R1_pin = np.sum(effr1_pin,axis=0)
R2_pin = np.sum(effr2_pin,axis=0)
TOT1_pin = T1_pin+R1_pin+Qscat_pin
TOT2_pin = T2_pin+R2_pin+Qscat_pin
TOT1_sin = T1_sin+R1_sin+Qscat_sin
TOT2_sin = T2_sin+R2_sin+Qscat_sin

M[1-1,1-1,:,:] = 0.5*(np.abs(rpp)**2+np.abs(rsp)**2+np.abs(rps)**2+np.abs(rss)**2)
M[1-1,2-1,:,:] = 0.5*(np.abs(rpp)**2+np.abs(rsp)**2-np.abs(rps)**2-np.abs(rss)**2)
M[1-1,3-1,:,:] = np.real(rpp*np.conj(rps)+rsp*np.conj(rss))
M[1-1,4-1,:,:] = np.imag(rpp*np.conj(rps)+rsp*np.conj(rss))
M[2-1,1-1,:,:] = 0.5*(np.abs(rpp)**2-np.abs(rsp)**2+np.abs(rps)**2-np.abs(rss)**2)
M[2-1,2-1,:,:] = 0.5*(np.abs(rpp)**2-np.abs(rsp)**2-np.abs(rps)**2+np.abs(rss)**2)
M[2-1,3-1,:,:] = np.real(rpp*np.conj(rps)-rsp*np.conj(rss))
M[2-1,4-1,:,:] = np.imag(rpp*np.conj(rps)-rsp*np.conj(rss))
M[3-1,1-1,:,:] = np.real(rpp*np.conj(rsp)+rps*np.conj(rss))
M[3-1,2-1,:,:] = np.real(rpp*np.conj(rsp)-rps*np.conj(rss))
M[3-1,3-1,:,:] = np.real(rpp*np.conj(rss)+rps*np.conj(rsp))
M[3-1,4-1,:,:] = np.imag(rpp*np.conj(rss)-rps*np.conj(rsp))
M[4-1,1-1,:,:] =-np.imag(rpp*np.conj(rsp)+rps*np.conj(rss))
M[4-1,2-1,:,:] =-np.imag(rpp*np.conj(rsp)-rps*np.conj(rss))
M[4-1,3-1,:,:] =-np.imag(rpp*np.conj(rss)+rps*np.conj(rsp))
M[4-1,4-1,:,:] = np.real(rpp*np.conj(rss)-rps*np.conj(rsp))

# ### Energy balance
# fig, axes = plt.subplots(2, 2, figsize=(12,12))
# L,P = np.meshgrid(tab_lam,tab_phi,indexing='ij')
# for form in range(2):
#     for pol in range(2):
#         if form==0 and pol==0:
#             data=TOT1_pin
#             title = 'TOT1_pin'
#         if form==0 and pol==1:
#             data=TOT1_sin
#             title = 'TOT1_sin'
#         if form==1 and pol==0:
#             data=TOT2_pin
#             title = 'TOT2_pin'
#         if form==1 and pol==1:
#             data=TOT2_sin
#             title = 'TOT2_sin'
#         zplot = axes[form,pol].pcolormesh(L,P,data.real,vmin=0.99,vmax=1.01)
#         add_colorbar(zplot)
# plt.savefig('BALANCE_FLAG_TOT%g.jpg'%FLAG_TOT)

fig, axes = plt.subplots(4, 4, subplot_kw=dict(projection='polar') ,figsize=(12,12))
flag_lam = True
rlabel =  r"$\lambda_0$ (nm)"
which_r =  tab_lam
which_orig = 0  if not flag_lam else 350
for i in range(4):
    for j in range(4):
        ax=axes[i,j]
        if i!=0 or j!=0:
            sm=ax.contourf(tab_phi*np.pi/180,which_r,M[i,j]/M[0,0],cmap=plt.cm.bwr,levels=30)
            ax.text(0. , 1. , r"$M_{%d%d}$"%(i+1,j+1) , fontsize=16 , transform=ax.transAxes)
            ax.set_xticks([])
            ax.set_yticks([])
            cbar = plt.colorbar(sm, ax=ax, fraction=0.046, pad=0.04)
            cbar.ax.locator_params(nbins=5)
            cbar.ax.tick_params(labelsize=14)
        else:
            p00 = ax.contourf(tab_phi*np.pi/180,which_r,M[i,j]/M[0,0]-1,cmap=plt.cm.bwr,vmin=-1,vmax=1)
            ax.xaxis.label.set_color('C0')        #setting up X-axis label color to yellow
            ax.yaxis.label.set_color('C3')          #setting up Y-axis label color to blue
            ax.tick_params(axis='x', colors='C0')    #setting up X-axis tick color to red
            ax.tick_params(axis='y', colors='C3')  #setting up Y-axis tick color to black
            ax.set_rlabel_position(70)
            ax.tick_params(axis='both', which='major', labelsize=14)
            ax.text(np.radians(22.5),tab_lam.max()*1.03,r"$\varphi_0$",fontsize=16,color='C0')
            ax.text(np.radians(90),ax.get_rmax()/1.3,rlabel,
                    rotation=70,ha='center',va='center',fontsize=16,color='C3')
            norm = mpl.colors.Normalize(vmin=-1,vmax=1)
            sm = mpl.cm.ScalarMappable(cmap=plt.cm.bwr, norm=norm)
            sm.set_array([])
        ax.set_rorigin(which_orig)
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,wspace=0.35)
# plt.savefig('Mmatrix.jpg')
plt.savefig('Mmatrix.pdf',bbox_inches='tight',pad_inches=0)
plt.show()