4
from math import fabs,sqrt
6
class epsilon(Callback):
8
Callback.__init__(self)
9
def double_vec(self,vec):
13
r = v.x()*v.x() + v.y()*v.y()
23
if (fabs(a-b) > fabs(b)*1.3e-14):
24
master_printf("%s differs by\t%g out of\t%g\n", n, a-b, b)
25
master_printf("This gives a fractional error of %g\n", fabs(a-b)/fabs(b))
31
def compare_point(f1, f2, p):
33
m_test=monitor_point()
35
f1.get_point(m_test, p)
40
if (f1.gv.has_field(c)):
41
v1 = m_test.get_component(c)
42
v2 = m1.get_component(c)
44
if (abs(v1 - v2) > 0.0*2e-15*abs(v2)):
45
master_printf("%s differs: %g %g out of %g %g\n", component_name(c), (v2-v1).real, (v2-v1).imag, v2.real, v2.imag)
46
master_printf("This comes out to a fractional error of %g\n", abs(v1 - v2)/abs(v2))
47
master_printf("Right now I'm looking at %g %g, time %g\n", p.x(), p.y(), f1.time())
53
def test_pml(epsilon,splitting):
55
v = voltwo(3.0, 2.0, a)
57
s1=structure(v, epsilon, pml(1.0, X) + pml(1.0, Y, High))
58
s=structure(v, epsilon, pml(1.0, X) + pml(1.0, Y, High), identity(), splitting)
60
master_printf( "Testing pml while splitting into %d chunks...\n", splitting)
63
f.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.5,0.5), 1.0);
64
f.add_point_source(Ez, 0.8, 1.6, 0.0, 4.0, vec(1.299,0.401), 1.0);
66
f1.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.5,0.5), 1.0);
67
f1.add_point_source(Ez, 0.8, 1.6, 0.0, 4.0, vec(1.299,0.401), 1.0);
71
total_energy_check_time = deltaT;
73
while (f.time() < f.last_source_time()):
75
while (f1.time() < f1.last_source_time()):
78
last_energy = f.total_energy()
80
while (f.time() < ttot):
84
if (f.time() >= total_energy_check_time):
85
if not compare_point(f, f1, vec(0.5 , 0.01)):
87
if not compare_point(f, f1, vec(0.46 , 0.33)):
89
if not compare_point(f, f1, vec(1.0 , 1.0 )):
91
new_energy = f.total_energy()
93
if not compare(new_energy, f1.total_energy()," total energy"):
96
if new_energy > last_energy*1e-6:
97
master_printf("Energy decaying too slowly: from %g to %g (%g)\n", last_energy, new_energy, new_energy/last_energy)
100
#print 'Energies:', new_energy, last_energy, new_energy/last_energy
101
master_printf("Got newE/oldE of %g\n", new_energy/last_energy);
103
total_energy_check_time += deltaT;
108
def test_pml_tm(epsilon,splitting):
110
v = voltwo(3.0, 3.0, a)
112
s1=structure(v, epsilon, pml(1.0))
113
s=structure(v, epsilon, pml(1.0), identity(), splitting)
114
master_printf("Testing TM pml while splitting into %d chunks...\n", splitting);
117
f.add_point_source(Ez, 0.8, 1.6, 0.0, 4.0, vec(1.299,1.401), 1.0)
119
f1.add_point_source(Ez, 0.8, 1.6, 0.0, 4.0, vec(1.299,1.401), 1.0)
123
total_energy_check_time = deltaT;
125
while (f.time() < f.last_source_time()):
127
while (f1.time() < f1.last_source_time()):
130
last_energy = f.total_energy()
132
while (f.time() < ttot):
136
if (f.time() >= total_energy_check_time):
137
if not compare_point(f, f1, vec(0.5 , 0.01)):
139
if not compare_point(f, f1, vec(0.46 , 0.33)):
141
if not compare_point(f, f1, vec(1.0 , 1.0 )):
143
new_energy = f.total_energy()
145
if not compare(new_energy, f1.total_energy()," total energy"):
148
if new_energy > last_energy*4e-6:
149
master_printf("Energy decaying too slowly: from %g to %g (%g)\n", last_energy, new_energy, new_energy/last_energy)
152
#print 'Energies:', new_energy, last_energy, new_energy/last_energy
153
master_printf("Got newE/oldE of %g\n", new_energy/last_energy);
155
total_energy_check_time += deltaT;
161
def test_pml_te(epsilon,splitting):
163
v = voltwo(3.0, 3.0, a)
165
s1=structure(v, epsilon, pml(1.0))
166
s=structure(v, epsilon, pml(1.0), identity(), splitting)
168
master_printf("Testing TE pml while splitting into %d chunks...\n", splitting);
171
f.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.5,1.5), 1.0)
172
f.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.37,1.27), 1.0)
175
f1.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.5,1.5), 1.0)
176
f1.add_point_source(Hz, 0.7, 1.5, 0.0, 4.0, vec(1.37,1.27), 1.0)
180
total_energy_check_time = deltaT;
182
while (f.time() < f.last_source_time()):
184
while (f1.time() < f1.last_source_time()):
187
last_energy = f.total_energy()
189
while (f.time() < ttot):
193
if (f.time() >= total_energy_check_time):
194
if not compare_point(f, f1, vec(0.5 , 0.01)):
196
if not compare_point(f, f1, vec(0.46 , 0.33)):
198
if not compare_point(f, f1, vec(1.0 , 1.0 )):
200
new_energy = f.total_energy()
202
if not compare(new_energy, f1.total_energy()," total energy"):
205
if new_energy > last_energy*1.1e-6:
206
master_printf("Energy decaying too slowly: from %g to %g (%g)\n", last_energy, new_energy, new_energy/last_energy)
209
master_printf("Got newE/oldE of %g\n", new_energy/last_energy);
211
total_energy_check_time += deltaT;
215
def test_metal(epsilon,splitting):
218
v = voltwo(3.0, 3.0, a)
219
#no_pml = boundary_region()
221
s1=structure(v, epsilon)
222
s=structure(v, epsilon, no_pml(), identity(), splitting)
223
master_printf("Metal test using %d chunks...\n", splitting)
226
f.add_point_source(Hz, 0.7, 2.5, 0.0, 4.0, vec(0.3,0.5), 1.0)
227
f.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
229
f1.add_point_source(Hz, 0.7, 2.5, 0.0, 4.0, vec(0.3,0.5), 1.0)
230
f1.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
232
total_energy_check_time = 8.0
234
while (f.time() < ttot):
237
if not compare_point(f, f1, vec(0.5 , 0.01)):
239
if not compare_point(f, f1, vec(0.46 , 0.33)):
241
if not compare_point(f, f1, vec(1.0 , 1.0 )):
244
if (f.time() >= total_energy_check_time):
245
if not compare(f.total_energy(), f1.total_energy()," total energy"):
247
if not compare(f.electric_energy_in_box(v.surroundings()), f1.electric_energy_in_box(v.surroundings()), "electric energy"):
249
if not compare(f.magnetic_energy_in_box(v.surroundings()), f1.magnetic_energy_in_box(v.surroundings()), "magnetic energy"):
252
total_energy_check_time += 5.0
256
def test_periodic(epsilon,splitting):
259
v = voltwo(3.0, 2.0, a)
260
#no_pml = boundary_region()
262
s1=structure(v, epsilon)
263
s=structure(v, epsilon, no_pml(), identity(), splitting)
264
master_printf("Periodic test using %d chunks...\n", splitting);
267
f.use_bloch(vec(0.1,0.7))
268
f.add_point_source(Hz, 0.7, 2.5, 0.0, 4.0, vec(0.3,0.5), 1.0)
269
f.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
270
f1=fields_complex(s1)
271
f1.use_bloch(vec(0.1,0.7))
272
f1.add_point_source(Hz, 0.7, 2.5, 0.0, 4.0, vec(0.3,0.5), 1.0)
273
f1.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
275
total_energy_check_time = 8.0
277
while (f.time() < ttot):
280
if not compare_point(f, f1, vec(0.5 , 0.01)):
282
if not compare_point(f, f1, vec(0.46 , 0.33)):
284
if not compare_point(f, f1, vec(1.0 , 1.0 )):
287
if (f.time() >= total_energy_check_time):
288
if not compare(f.total_energy(), f1.total_energy()," total energy"):
290
if not compare(f.electric_energy_in_box(v.surroundings()), f1.electric_energy_in_box(v.surroundings()), "electric energy"):
292
if not compare(f.magnetic_energy_in_box(v.surroundings()), f1.magnetic_energy_in_box(v.surroundings()), "magnetic energy"):
295
total_energy_check_time += 5.0
299
def test_periodic_tm(epsilon,splitting):
302
v = voltwo(3.0, 2.0, a)
303
#no_pml = boundary_region()
305
s1=structure(v, epsilon)
306
s=structure(v, epsilon, no_pml(), identity(), splitting)
307
master_printf("Periodic 2D TM test using %d chunks...\n", splitting);
310
f.use_bloch(vec(0.1,0.7))
311
f.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
312
f1=fields_complex(s1)
313
f1.use_bloch(vec(0.1,0.7))
314
f1.add_point_source(Ez, 0.8, 0.6, 0.0, 4.0, vec(1.299,0.401), 1.0)
316
total_energy_check_time = 8.0
318
while (f.time() < ttot):
321
if not compare_point(f, f1, vec(0.5 , 0.01)):
323
if not compare_point(f, f1, vec(0.46 , 0.33)):
325
if not compare_point(f, f1, vec(1.0 , 1.0 )):
328
if (f.time() >= total_energy_check_time):
329
if not compare(f.total_energy(), f1.total_energy()," total energy"):
331
if not compare(f.electric_energy_in_box(v.surroundings()), f1.electric_energy_in_box(v.surroundings()), "electric energy"):
333
if not compare(f.magnetic_energy_in_box(v.surroundings()), f1.magnetic_energy_in_box(v.surroundings()), "magnetic energy"):
336
total_energy_check_time += 5.0
342
master_printf('Testing 2D ....\n')
346
if not test_pml(EPS,s):
347
abort("error in test_pml vacuum\n")
350
if not test_pml_tm(EPS,s):
351
abort("error in test_pml TM vacuum\n")
354
if not test_pml_te(EPS,s):
355
abort("error in test_pml TE vacuum\n")
358
if not test_metal(EPS,s):
359
abort("error in test_metal vacuum\n")
362
set_EPS_Callback(trg.__disown__())
365
if not test_metal(EPS,s):
366
abort("error in test_metal targets \n")
369
if not test_periodic(EPS,s):
370
abort("error in test_periodic targets \n")
375
if not test_periodic_tm(EPS,s):
376
abort("error in test_periodic TM targets \n")