4
from math import fabs,sqrt, atan2, cos, sin, modf
9
wlo = nhi / (nlo + nhi)
13
class eps_nlo(Callback):
15
Callback.__init__(self)
17
def double_vec(self,v):
18
return self.nlo*self.nlo
20
class eps_bragg(Callback):
22
Callback.__init__(self)
25
def double_vec(self,v):
29
z = v.z() - zsize * 0.5
30
if (fabs(z)*2 > Nperiods):
53
m[0][0] = m00 * td + m01 * tod
54
m[0][1] = m00 * tod + m01 * td
55
m[1][0] = m10 * td + m11 * tod
56
m[1][1] = m10 * tod + m11 * td
60
p = cmath.exp(complex(0, n * w * dz))
73
def bragg_transmission_analytic(freq_min, freq_max, nfreq, T, R):
74
for i in range (0,nfreq):
75
omega = 2*pi * (freq_min + i * (freq_max - freq_min) / (nfreq - 1))
76
Tm = [ [ 1, 0 ], [ 0, 1 ] ]
77
for j in range (0, Nperiods):
80
byP(Tm, nhi, omega, 1 - wlo)
82
byP(Tm, nlo, omega, wlo)
84
refl = - Tm[1][0] / Tm[1][1];
85
T[i] = abs2(Tm[0][0] + refl * Tm[0][1]);
90
def bragg_transmission(a, freq_min, freq_max, nfreq, T, R, use_hdf5):
93
s=structure(v, MU, pml(0.5))
98
s0=structure(v, EPS, pml(0.5))
103
Tfluxpt=volume(vec(zsize - 0.1))
104
Rfluxpt=volume(vec(0.1))
106
src=gaussian_src_time((freq_min + freq_max) * 0.5, 0.5 / fabs(freq_max - freq_min), 0, 5 / fabs(freq_max - freq_min))
107
f.add_point_source(Ex, src, srcpt)
108
f0.add_point_source(Ex, src, srcpt)
110
ft = f.add_dft_flux_plane(Tfluxpt,freq_min, freq_max, nfreq)
111
fr = f.add_dft_flux_plane(Rfluxpt,freq_min, freq_max, nfreq)
112
ft0 = f0.add_dft_flux_plane(Tfluxpt, freq_min, freq_max, nfreq)
113
fr0 = f0.add_dft_flux_plane(Rfluxpt, freq_min, freq_max, nfreq)
115
while (f0.time() < nfreq / fabs(freq_max - freq_min) / 2):
119
fr0.save_hdf5(f, "flux", "reflection")
120
fr.load_hdf5(f, "flux", "reflection")
123
ff = f.open_h5file("flux", h5file.READONLY)
128
# operator -= cannot be wrapped !
129
# use subtract() function as shown below
131
while (f.time() < nfreq / fabs(freq_max - freq_min) / 2):
135
flux0 = get_flux(ft0)
137
for i in range(0,nfreq):
138
T[i] = flux[i] / flux0[i]
141
for i in range (0,nfreq):
142
R[i] = -flux[i] / flux0[i]
146
return a if (a > b) else b
149
return a if (a < b) else b
152
return max2(abs(a), abs(b))
157
def distance_from_curve(n, dx, ys, x, y):
159
for i in range (1, n):
160
theta = atan2(ys[i] - ys[i-1], dx)
161
L = sqrt(sqr(dx) + sqr(ys[i]-ys[i-1]))
164
x0p = x0 * cos(theta) + y0 * sin(theta)
165
y0p = y0 * cos(theta) - x0 * sin(theta)
168
d = min2(sqrt(sqr(x0) + sqr(y0)), d)
170
d = min2(sqrt(sqr(x-i*dx) + sqr(y-ys[i])), d)
172
d = min2(abs(y0p), d)
185
bragg_transmission(40.0, freq_min, freq_max, nfreq, T, R, use_hdf5)
188
bragg_transmission_analytic(freq_min, freq_max, nfreq, T0, R0)
190
dfreq = (freq_max - freq_min) / (nfreq - 1)
195
for i in range(0,nfreq):
196
errT = distance_from_curve(nfreq, dfreq, T0, i * dfreq, T[i])
197
errR = distance_from_curve(nfreq, dfreq, R0, i * dfreq, R[i])
202
if (errT * sqr(freq_min / (freq_min + i*dfreq)) > 0.01):
203
abort("large error %g at freq = %g: T = %g instead of %g\n", errT, freq_min + i*dfreq, T[i], T0[i])
204
if (errR * sqr(freq_min / (freq_min + i*dfreq)) > 0.01):
205
abort("large error %g at freq = %g: R = %g instead of %g\n", errR, freq_min + i*dfreq, R[i], R0[i])
208
master_printf("Done (max. err in T = %e, in R = %e)\n", maxerrT, maxerrR)
212
set_EPS_Callback(ep.__disown__())
215
set_MU_Callback(mu.__disown__())