Photonic crystal slab#

Metasurface with holes.

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

import nannos as nn

We will study a benchmark of hole in a dielectric surface similar to those studied in [Fan2002].

Define the lattice

lattice = nn.Lattice([[1.0, 0], [0, 1.0]], discretization=(2**9, 2**9))

Define the layers

sup = lattice.Layer("Superstrate", epsilon=1)
ms = lattice.Layer("Metasurface", thickness=0.5)
sub = lattice.Layer("Substrate", epsilon=1)

Define the pattern and add it to the metasurface layer

ms.epsilon = lattice.ones() * 12.0
circ = lattice.circle(center=(0.5, 0.5), radius=0.2)
ms.epsilon[circ] = 1

Visualize the permittivity

plt.figure()
cmap = mpl.colors.ListedColormap(["#ffe7c2", "#232a4e"])
bounds = [1, 12]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
ims = ms.plot(cmap=cmap, ax=plt.gca())
plt.axis("scaled")
plt.colorbar(ims[0], ticks=bounds)
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.title(r"permittitivity $\varepsilon(x,y)$")
plt.tight_layout()
plt.show()
permittitivity $\varepsilon(x,y)$

Out:

/builds/nannos/nannos.gitlab.io/nannos/examples/basic/plot_hole.py:64: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

Define the incident plane wave

pw = nn.PlaneWave(wavelength=1 / 1.4, angles=(0, 0, 0))

Define the simulation

stack = [sup, ms, sub]
sim = nn.Simulation(stack, pw, nh=100)

Compute diffraction efficiencies

Compute diffraction efficiencies per order

Ri, Ti = sim.diffraction_efficiencies(orders=True)
nmax = 5
print("Ri = ", Ri[:nmax])
print("Ti = ", Ti[:nmax])
print("R = ", R)
print("T = ", T)
print("R+T = ", R + T)

Out:

Ri =  [-1.52465931e-20 -1.18584613e-20 -1.01643954e-20  3.38813179e-21
 -2.14552178e-21]
Ti =  [ 5.08219768e-21  6.77626358e-21 -1.99052743e-20 -8.25857124e-21
  7.31156725e-22]
R =  0.5255529342259978
T =  0.4744470657740085
R+T =  1.0000000000000062

Plot

fig, (axR, axT) = plt.subplots(1, 2, figsize=(4, 2))
labels = [f"({g[0]},{g[1]})" for g in (sim.harmonics[:, :nmax]).T]
axR.bar(range(nmax), Ri[:nmax], color=["#e69049"])
axR.set_xticks(range(nmax))
axR.set_xticklabels(labels=labels)
axR.set_xlabel("order")
axR.set_ylabel("reflection $R_{i,j}$")
axR.annotate(
    r"$R = \sum_i\,\sum_j\, R_{i,j}=$" + f"{sum(Ri[:nmax]):0.4f}",
    (0.5, 0.9),
    xycoords="axes fraction",
)

axT.bar(range(nmax), Ti[:nmax], color=["#4a77ba"])
axT.set_xticks(range(nmax))
axT.set_xticklabels(labels=labels)
axT.set_xlabel("order")
axT.set_ylabel("transmission $T_{i,j}$")
axT.annotate(
    r"$T =\sum_i\,\sum_j\, T_{i,j}=$" + f"{sum(Ti[:nmax]):0.4f}",
    (0.5, 0.9),
    xycoords="axes fraction",
)
plt.suptitle(f"Diffraction efficiencies: $R+T=${sum(Ri[:nmax] + Ti[:nmax]):0.4f}")
plt.tight_layout()
plt.show()
Diffraction efficiencies: $R+T=$-0.0000

Out:

/builds/nannos/nannos.gitlab.io/nannos/examples/basic/plot_hole.py:124: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  plt.show()

Fig 12 (c) from [Fan2002].

def compute_transmission(fn):
    pw = nn.PlaneWave(wavelength=1 / fn, angles=(0, 0, 0))
    sim = nn.Simulation(stack, pw, 100)
    R, T = sim.diffraction_efficiencies()
    print(f"f = {fn} (normalized)")
    print("T = ", T)
    return T


freqs_norma = np.linspace(0.25, 0.6, 100)
freqs_adapted, transmission = nn.adaptive_sampler(
    compute_transmission,
    freqs_norma,
)


plt.figure()
plt.plot(freqs_adapted, transmission, c="#be4c83")
plt.xlim(freqs_norma[0], freqs_norma[-1])
plt.ylim(0, 1)
plt.xlabel(r"frequency ($2\pi c / a$)")
plt.ylabel("Transmission")
plt.tight_layout()
plot hole

Out:

f = 0.25 (normalized)
T =  0.5871769954230752
f = 0.25353535353535356 (normalized)
T =  0.6127114048067447
f = 0.25707070707070706 (normalized)
T =  0.6397742448919852
f = 0.2606060606060606 (normalized)
T =  0.6682915971742556
f = 0.2641414141414141 (normalized)
T =  0.6981339912260881
f = 0.2676767676767677 (normalized)
T =  0.7291034540110939
f = 0.27121212121212124 (normalized)
T =  0.7609202977021434
f = 0.27474747474747474 (normalized)
T =  0.7932109710789556
f = 0.2782828282828283 (normalized)
T =  0.8254988935998291
f = 0.2818181818181818 (normalized)
T =  0.8572007710494626
f = 0.28535353535353536 (normalized)
T =  0.8876312892712322
f = 0.28888888888888886 (normalized)
T =  0.9160190597314984
f = 0.2924242424242424 (normalized)
T =  0.9415359815185088
f = 0.295959595959596 (normalized)
T =  0.9633405904476248
f = 0.2994949494949495 (normalized)
T =  0.9806334964446102
f = 0.30303030303030304 (normalized)
T =  0.9927200164792644
f = 0.30656565656565654 (normalized)
T =  0.9990723232834864
f = 0.3101010101010101 (normalized)
T =  0.9993818119993924
f = 0.3136363636363636 (normalized)
T =  0.9935927797983377
f = 0.31717171717171716 (normalized)
T =  0.981911211918918
f = 0.3207070707070707 (normalized)
T =  0.9647869524753505
f = 0.3242424242424242 (normalized)
T =  0.9428725796644558
f = 0.3277777777777778 (normalized)
T =  0.9169664379766029
f = 0.33131313131313134 (normalized)
T =  0.887949416577758
f = 0.33484848484848484 (normalized)
T =  0.8567249036441423
f = 0.3383838383838384 (normalized)
T =  0.8241693979993577
f = 0.3419191919191919 (normalized)
T =  0.7910985213762437
f = 0.34545454545454546 (normalized)
T =  0.7582507389777274
f = 0.34898989898989896 (normalized)
T =  0.7262899225643783
f = 0.3525252525252525 (normalized)
T =  0.6958289506392488
f = 0.3560606060606061 (normalized)
T =  0.6674815940092106
f = 0.3595959595959596 (normalized)
T =  0.6419638910047986
f = 0.36313131313131314 (normalized)
T =  0.6203051632381926
f = 0.36666666666666664 (normalized)
T =  0.604353173442804
f = 0.3702020202020202 (normalized)
T =  0.5982443206164031
f = 0.3737373737373737 (normalized)
T =  0.6140718049659988
f = 0.37727272727272726 (normalized)
T =  0.7070360917221264
f = 0.3808080808080808 (normalized)
T =  0.560611398296694
f = 0.3843434343434343 (normalized)
T =  0.19219542508044374
f = 0.3878787878787879 (normalized)
T =  0.2776103455526897
f = 0.39141414141414144 (normalized)
T =  0.29591420578275507
f = 0.39494949494949494 (normalized)
T =  0.29453642282877424
f = 0.39848484848484844 (normalized)
T =  0.2832518340317043
f = 0.402020202020202 (normalized)
T =  0.26282012209163097
f = 0.40555555555555556 (normalized)
T =  0.22625940242322082
f = 0.40909090909090906 (normalized)
T =  0.13915732809125006
f = 0.4126262626262626 (normalized)
T =  0.6120190949992304
f = 0.4161616161616162 (normalized)
T =  0.5306604288003659
f = 0.4196969696969697 (normalized)
T =  0.4126728834534448
f = 0.4232323232323232 (normalized)
T =  0.3706403031847789
f = 0.4267676767676768 (normalized)
T =  0.34804481739834
f = 0.4303030303030303 (normalized)
T =  0.33347468601918245
f = 0.4338383838383838 (normalized)
T =  0.32317042487057956
f = 0.43737373737373736 (normalized)
T =  0.315539006112249
f = 0.4409090909090909 (normalized)
T =  0.3097922563567886
f = 0.4444444444444444 (normalized)
T =  0.30549769883135885
f = 0.447979797979798 (normalized)
T =  0.3024008721651917
f = 0.45151515151515154 (normalized)
T =  0.30034554026178223
f = 0.45505050505050504 (normalized)
T =  0.29923438228639215
f = 0.45858585858585854 (normalized)
T =  0.2990082582368208
f = 0.4621212121212121 (normalized)
T =  0.2996347399215052
f = 0.46565656565656566 (normalized)
T =  0.30110159626718147
f = 0.46919191919191916 (normalized)
T =  0.30341307827113784
f = 0.4727272727272727 (normalized)
T =  0.30658781261383683
f = 0.4762626262626263 (normalized)
T =  0.31065747512691266
f = 0.4797979797979798 (normalized)
T =  0.3156652943484796
f = 0.4833333333333333 (normalized)
T =  0.32166250094015497
f = 0.4868686868686869 (normalized)
T =  0.32869767420881474
f = 0.4904040404040404 (normalized)
T =  0.33678308365847004
f = 0.4939393939393939 (normalized)
T =  0.3457790155199453
f = 0.49747474747474746 (normalized)
T =  0.35491609328672125
f = 0.501010101010101 (normalized)
T =  0.35986977435694684
f = 0.5045454545454545 (normalized)
T =  0.2864929408183835
f = 0.5080808080808081 (normalized)
T =  0.48234252821543805
f = 0.5116161616161616 (normalized)
T =  0.4924842958832934
f = 0.5151515151515151 (normalized)
T =  0.5433840623044983
f = 0.5186868686868686 (normalized)
T =  0.6468899018460269
f = 0.5222222222222221 (normalized)
T =  0.8888740203167635
f = 0.5257575757575758 (normalized)
T =  0.398994493619639
f = 0.5292929292929293 (normalized)
T =  0.024336861768169273
f = 0.5328282828282829 (normalized)
T =  0.10000592162384916
f = 0.5363636363636364 (normalized)
T =  0.0700708655975533
f = 0.5398989898989899 (normalized)
T =  0.3370577264481189
f = 0.5434343434343434 (normalized)
T =  0.8421352324110036
f = 0.5469696969696969 (normalized)
T =  0.7055844894302065
f = 0.5505050505050505 (normalized)
T =  0.6833101068338221
f = 0.554040404040404 (normalized)
T =  0.6940404245552698
f = 0.5575757575757576 (normalized)
T =  0.7184230399653446
f = 0.5611111111111111 (normalized)
T =  0.7498154939251978
f = 0.5646464646464646 (normalized)
T =  0.7850997838538
f = 0.5681818181818181 (normalized)
T =  0.822299258307555
f = 0.5717171717171716 (normalized)
T =  0.859783979128855
f = 0.5752525252525252 (normalized)
T =  0.8959690636966224
f = 0.5787878787878787 (normalized)
T =  0.9292125956991794
f = 0.5823232323232324 (normalized)
T =  0.9578207136846917
f = 0.5858585858585859 (normalized)
T =  0.9801232109557109
f = 0.5893939393939394 (normalized)
T =  0.9945939623390236
f = 0.5929292929292929 (normalized)
T =  0.9999858948058037
f = 0.5964646464646464 (normalized)
T =  0.9954428166730104
f = 0.6 (normalized)
T =  0.9805477501576573
f = 0.37550505050505045 (normalized)
T =  0.6422751427020237
f = 0.37904040404040407 (normalized)
T =  0.8746179191979707
f = 0.38611111111111107 (normalized)
T =  0.25052794505123027
f = 0.3896464646464647 (normalized)
T =  0.29052496742823103
f = 0.4037878787878788 (normalized)
T =  0.24752526999829222
f = 0.4108585858585858 (normalized)
T =  0.034036135668678996
f = 0.4143939393939394 (normalized)
T =  0.7362427632798598
f = 0.42146464646464643 (normalized)
T =  0.3877945022490697
f = 0.49924242424242427 (normalized)
T =  0.3586124826236137
f = 0.5063131313131313 (normalized)
T =  0.5720382224157476
f = 0.5133838383838384 (normalized)
T =  0.5134913358947603
f = 0.5169191919191919 (normalized)
T =  0.5854679438714769
f = 0.5204545454545454 (normalized)
T =  0.7415878112612978
f = 0.523989898989899 (normalized)
T =  0.9920637788855383
f = 0.531060606060606 (normalized)
T =  0.07203741413487909
f = 0.5381313131313131 (normalized)
T =  0.004924185312206399
f = 0.5416666666666666 (normalized)
T =  0.9964957065437625
f = 0.5452020202020201 (normalized)
T =  0.7479809307027423
f = 0.5487373737373737 (normalized)
T =  0.6879413253464899
f = 0.3763888888888889 (normalized)
T =  0.6677203725163781
f = 0.37815656565656564 (normalized)
T =  0.7702811331982761
f = 0.38257575757575757 (normalized)
T =  0.05778525641985492
f = 0.3869949494949495 (normalized)
T =  0.26652064265677866
f = 0.4073232323232323 (normalized)
T =  0.19414626426243273
f = 0.41174242424242424 (normalized)
T =  0.01121212821557044
f = 0.413510101010101 (normalized)
T =  0.958834852767838
f = 0.41792929292929293 (normalized)
T =  0.4528982735939827
f = 0.5027777777777778 (normalized)
T =  0.35251987032702026
f = 0.5071969696969697 (normalized)
T =  0.4997958150845564
f = 0.5098484848484849 (normalized)
T =  0.48004357033978173
f = 0.5178030303030303 (normalized)
T =  0.6130961310457238
f = 0.519570707070707 (normalized)
T =  0.6888413297412361
f = 0.5213383838383838 (normalized)
T =  0.8080437936735542
f = 0.5231060606060606 (normalized)
T =  0.9712916887011251
f = 0.5275252525252525 (normalized)
T =  0.009357592205242057
f = 0.5345959595959596 (normalized)
T =  0.1019485335349833
f = 0.5390151515151516 (normalized)
T =  0.028943268359372824
f = 0.5407828282828282 (normalized)
T =  0.8743753145987251
f = 0.5425505050505051 (normalized)
T =  0.9208016480483421
f = 0.5443181818181817 (normalized)
T =  0.785964575443081
f = 0.5460858585858586 (normalized)
T =  0.72251179027635
f = 0.3777146464646465 (normalized)
T =  0.7347561942062026
f = 0.37859848484848485 (normalized)
T =  0.8161176693168859
f = 0.37992424242424244 (normalized)
T =  0.9980264765671917
f = 0.3816919191919192 (normalized)
T =  0.005722699085149107
f = 0.38345959595959594 (normalized)
T =  0.13842413907142592
f = 0.3852272727272727 (normalized)
T =  0.2271633153851464
f = 0.4082070707070707 (normalized)
T =  0.17080529450988563
f = 0.40997474747474744 (normalized)
T =  0.09466771883876811
f = 0.411300505050505 (normalized)
T =  0.005453530403979276
f = 0.41306818181818183 (normalized)
T =  0.9771548039715023
f = 0.4139520202020202 (normalized)
T =  0.8391308654106036
f = 0.4152777777777778 (normalized)
T =  0.6047136674040412
f = 0.41704545454545455 (normalized)
T =  0.48439090250074057
f = 0.4188131313131313 (normalized)
T =  0.43005489896821847
f = 0.5036616161616161 (normalized)
T =  0.3372400595697269
f = 0.505429292929293 (normalized)
T =  0.08279924215562087
f = 0.507638888888889 (normalized)
T =  0.4883993583824158
f = 0.5235479797979798 (normalized)
T =  0.9970731029640137
f = 0.5248737373737373 (normalized)
T =  0.8011552478760773
f = 0.5266414141414142 (normalized)
T =  0.10706549548265239
f = 0.5284090909090908 (normalized)
T =  0.0031184758910725217
f = 0.5372474747474747 (normalized)
T =  0.03856671596062357
f = 0.5385732323232324 (normalized)
T =  0.0009424699568740222
f = 0.540340909090909 (normalized)
T =  0.6302686912306864
f = 0.5412247474747474 (normalized)
T =  0.9853500471918836
f = 0.5421085858585859 (normalized)
T =  0.9642865803400692
f = 0.5447601010101009 (normalized)
T =  0.7650909815618169
f = 0.38036616161616166 (normalized)
T =  0.9278162484813981
f = 0.3821338383838384 (normalized)
T =  0.014295425440699535
f = 0.38301767676767673 (normalized)
T =  0.10153275638688519
f = 0.38390151515151516 (normalized)
T =  0.16825019537570285
f = 0.3847853535353535 (normalized)
T =  0.2114956090406648
f = 0.4121843434343434 (normalized)
T =  0.16140822389609225
f = 0.41284722222222225 (normalized)
T =  0.8490751144293655
f = 0.4137310606060606 (normalized)
T =  0.8997061981751802
f = 0.4148358585858586 (normalized)
T =  0.6603651969383124
f = 0.415719696969697 (normalized)
T =  0.5629234916043993
f = 0.41660353535353534 (normalized)
T =  0.5051016977847752
f = 0.5041035353535352 (normalized)
T =  0.32032300692971877
f = 0.5049873737373738 (normalized)
T =  0.1996434752875483
f = 0.5067550505050504 (normalized)
T =  0.5219944666445048
f = 0.5226641414141413 (normalized)
T =  0.9319463803860942
f = 0.5244318181818182 (normalized)
T =  0.9327263507611344
f = 0.5253156565656565 (normalized)
T =  0.6079068528678278
f = 0.526199494949495 (normalized)
T =  0.22477793761490866
f = 0.5279671717171717 (normalized)
T =  0.0001518052759711346
f = 0.5394570707070707 (normalized)
T =  0.127164431354283
f = 0.5410037878787878 (normalized)
T =  0.9461737538806879
f = 0.541445707070707 (normalized)
T =  0.9994265222676049
f = 0.3794823232323232 (normalized)
T =  0.9437635404693895
f = 0.3801452020202021 (normalized)
T =  0.9909240447883788
f = 0.38125 (normalized)
T =  0.14666227009773145
f = 0.41152146464646466 (normalized)
T =  2.1291413134980012e-05
f = 0.412405303030303 (normalized)
T =  0.35258010235059717
f = 0.4132891414141414 (normalized)
T =  0.9975694732682803
f = 0.5047664141414141 (normalized)
T =  0.2547700045753129
f = 0.5058712121212121 (normalized)
T =  0.7362801443619359
f = 0.5069760101010101 (normalized)
T =  0.5089497098198105
f = 0.5242108585858586 (normalized)
T =  0.9706828547576163
f = 0.5246527777777777 (normalized)
T =  0.8762395517816444
f = 0.5250946969696969 (normalized)
T =  0.7099931960746508
f = 0.5259785353535353 (normalized)
T =  0.30536769084970944
f = 0.5270833333333333 (normalized)
T =  0.040357514870221066
f = 0.5392361111111111 (normalized)
T =  0.06623771442320893
f = 0.5396780303030303 (normalized)
T =  0.21706904854748776
f = 0.5405618686868686 (normalized)
T =  0.7670261931036065
f = 0.3797032828282828 (normalized)
T =  0.976552326558321
f = 0.38058712121212124 (normalized)
T =  0.781989603688514
f = 0.38147095959595956 (normalized)
T =  0.045921433869538425
f = 0.38191287878787883 (normalized)
T =  0.0011485472412329158
f = 0.4119633838383838 (normalized)
T =  0.05606638121712119
f = 0.5056502525252525 (normalized)
T =  0.9784311810534048
f = 0.5060921717171717 (normalized)
T =  0.6257693718252332
f = 0.5065340909090909 (normalized)
T =  0.5413660384547608
f = 0.5268623737373738 (normalized)
T =  0.06824499393802466
f = 0.5273042929292929 (normalized)
T =  0.02135821732485371
f = 0.3810290404040404 (normalized)
T =  0.3255195343358359
f = 0.5052083333333334 (normalized)
T =  0.09214826033947458
f = 0.5264204545454546 (normalized)
T =  0.1587694037374489

Total running time of the script: ( 0 minutes 35.890 seconds)

Estimated memory usage: 9 MB

Gallery generated by Sphinx-Gallery