49 lines
1.5 KiB
Python
Executable File
49 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Tests whether direct evaluation of VSWFs gives the same result as their
|
|
representation in terms of translation operators and regular electric dipole
|
|
waves at origin
|
|
"""
|
|
|
|
from qpms import Particle, CTMatrix, lorentz_drude, EpsMuGenerator, TMatrixGenerator, BaseSpec, FinitePointGroup, ScatteringSystem, TMatrixInterpolator, EpsMu, dbgmsg_enable, dbgmsg_disable, dbgmsg_active, BesselType,eV, hbar
|
|
from qpms.qpms_c import set_gsl_pythonic_error_handling
|
|
from qpms.symmetries import point_group_info
|
|
import numpy as np
|
|
eh = eV/hbar
|
|
np.random.seed(666)
|
|
dbgmsg_enable(2)
|
|
|
|
part_radius = 80e-9
|
|
p = 1580e-9
|
|
|
|
set_gsl_pythonic_error_handling()
|
|
|
|
sym = FinitePointGroup(point_group_info['D4h'])
|
|
bspec1 = BaseSpec(lMax=3)
|
|
medium=EpsMuGenerator(EpsMu(1.52**2))
|
|
t1 = TMatrixGenerator.sphere(medium, EpsMuGenerator(lorentz_drude['Au']), r=part_radius)
|
|
p1 = Particle((0,0,0),t1,bspec=bspec1)
|
|
ss, ssw = ScatteringSystem.create([p1], EpsMuGenerator(EpsMu(1.52**2)), 1.4*eh, sym)
|
|
|
|
|
|
points = np.random.random((100,3)) * p
|
|
points = points[np.linalg.norm(points, axis=-1) > part_radius]
|
|
t,l,m = bspec1.tlm()
|
|
|
|
fails=0
|
|
|
|
for i in range(ss.fecv_size):
|
|
fvc = np.zeros((ss.fecv_size,), dtype=complex)
|
|
fvc[i] = 1
|
|
|
|
E = ssw.scattered_E(fvc, points)
|
|
E_alt = ssw.scattered_E(fvc, points,alt=True)
|
|
diff = abs(E-E_alt)
|
|
reldiffavg = np.nanmean(diff/(abs(E)+abs(E_alt)))
|
|
fail = reldiffavg > 1e-3
|
|
fails += fail
|
|
|
|
print('E' if t[i] == 2 else 'M', l[i], m[i], np.amax(diff), reldiffavg, 'FAIL!' if fail else 'OK')
|
|
|
|
exit(fails)
|