4
from math import fabs,sqrt
8
class epsilon(Callback):
10
Callback.__init__(self)
11
def double_vec(self,r):
17
p.set_direction(X, p.x() + 1.0)
19
p.set_direction(X, p.x() - 1.0)
21
p.set_direction(Y, p.y() + 1.0)
23
p.set_direction(Y, p.y() - 1.0)
24
if (p.x()*p.x() + p.y()*p.y() < 0.3):
29
class sigma(Callback):
30
def __init__(self, sig):
31
Callback.__init__(self)
34
def double_vec(self,r):
39
set_EPS_Callback(rods.__disown__())
43
if (fabs(a-b) > fabs(b)*1e-5):
44
master_printf("%s differs by\t%g out of\t%g\n", n, a-b, b)
45
master_printf("This gives a fractional error of %g\n", fabs(a-b)/fabs(b))
48
master_printf("Completed %s \n", n)
51
def using_pml_ez(v, eps):
53
s= structure(v, eps, pml(dpml))
55
f.add_point_source(Ez, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
56
while (f.time() < ttot):
59
f.get_point(p, v.center())
60
return p.get_component(Ez).real
63
def x_periodic_y_pml(v, eps):
65
s= structure(v, eps, pml(dpml, Y))
67
f.add_point_source(Ez, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
69
while (f.time() < ttot):
72
f.get_point(p, v.center())
73
return p.get_component(Ez).real
75
def x_periodic(v,eps):
79
f.add_point_source(Ez, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
81
while (f.time() < ttot):
84
f.get_point(p, v.center())
85
return p.get_component(Ez).real
87
def periodic_ez(v, eps):
91
f.add_point_source(Ez, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
103
while (f.time() < ttot):
106
f.get_point(p, v.center())
107
return p.get_component(Ez).real
109
def metallic_ez(v,eps):
111
s = structure(v, eps)
112
f = fields_complex(s)
113
f.add_point_source(Ez, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
114
while (f.time() < ttot):
117
f.get_point(p, v.center())
118
return p.get_component(Ez).real
122
def polariton_ex(v, eps):
127
set_DBL1_Callback(pol1.__disown__())
129
s.add_polarizability(DBL1, 0.3, 0.1)
132
f.add_point_source(Ex, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
133
while (f.time() < ttot):
136
f.get_point(p, v.center())
138
return p.get_component(Ex).real
140
def polariton_energy(v, eps):
145
set_DBL1_Callback(pol1.__disown__())
146
s.add_polarizability(DBL1, 0.3, 0.1)
148
#s.add_polarizability(one, 0.3, 0.1, 7.63)
149
f=fields_complex(s, 0, 1)
150
f.add_point_source(Ex, 0.2, 3.0, 0.0, 2.0, v.center(), complex(0,-2*pi*0.2))
151
while (f.time() < ttot):
155
return f.total_energy()
157
def saturated_polariton_ex(v, eps):
162
set_DBL1_Callback(pol1.__disown__())
163
s.add_polarizability(DBL1, 0.3, 0.1)
165
# thep = s.add_polarizability(one, 0.3, 0.1, -0.063, 0.1)
168
f.add_point_source(Ex, 0.2, 3.0, 0.0, 2.0, v.center(), 1/sqrt(4*pi) * complex(0,-2*pi*0.2))
169
while (f.time() < ttot):
172
f.get_point(p, v.center())
175
return p.get_component(Ex).real * sqrt(4*pi)
177
master_printf("Testing with some known results...\n")
179
compare(-0.0894851, polariton_ex(volone(1.0, a), ONE), "1D polariton")
180
compare(0.32617294, polariton_energy(volone(1.0, a), ONE), "1D polariton energy")
181
compare(5.20605, metallic_ez(voltwo(1.0, 1.0, a), ONE), "1x1 metallic 2D TM")
182
compare(0.883776, using_pml_ez(voltwo(1.0+2*dpml, 1.0+2*dpml, a), ONE), "1x1 PML 2D TM")
183
compare(0.110425, x_periodic(voltwo(1.0, 1.0, a), ONE), "1x1 X periodic 2D TM")
184
compare(-4.78767, periodic_ez(voltwo(1.0, 3.0, a), EPS),"1x1 fully periodic 2D TM rods")
185
compare(1.12502, periodic_ez(voltwo(1.0, 3.0, a), ONE), "1x1 fully periodic 2D TM")
186
compare(0.608815, x_periodic_y_pml(voltwo(1.0, 1.0+2*dpml, a), ONE), "1x1 X periodic Y PML 2D TM")
187
compare(-41.8057, metallic_ez(vol3d(1.0, 1.0, 1.0, a), ONE), "1x1x1 metallic 3D")
188
compare(-100.758, x_periodic(vol3d(1.0, 1.0, 1.0, a), ONE), "1x1x1 X periodic 3D")
189
compare(-101.398, x_periodic_y_pml(vol3d(1.0, 1.0+2*dpml, 1.0, a), ONE), "1x1x1 X periodic Y PML 3D")
190
compare(-103.844, periodic_ez(vol3d(1.0, 1.0, 1.0, a), EPS), "1x1x1 fully periodic 3D rods")
191
compare(-99.1618, periodic_ez(vol3d(1.0, 1.0, 1.0, a), ONE), "1x1x1 fully periodic 3D")