QPMS
Electromagnetic multiple scattering library and toolkit.
Functions | Variables
qpms.qpms_p Namespace Reference

Functions

def cart2sph (cart, axis=-1, allow2d=False)
 
def sph2cart (sph, axis=-1)
 
def sph_loccart2cart (loccart, sph, axis=-1)
 
def sph_loccart_basis (sph, sphaxis=-1, cartaxis=None)
 
def nelem2lMax (nelem)
 
def lMax2nelem (lMax)
 
def lpy (nmax, z)
 
def lpy1 (nmax, z)
 
def vswf_yr (pos_sph, lMax, J=1)
 
def zJn (n, z, J=1)
 
def π̃_zerolim (nmax)
 
def π̃_pilim (nmax)
 
def τ̃_zerolim (nmax)
 
def τ̃_pilim (nmax)
 
def get_π̃τ̃_y1 (θ, nmax)
 
def vswf_yr1 (pos_sph, nmax, J=1)
 
def zplane_pq_y (nmax, betap=0)
 
def plane_pq_y (nmax, kdir_cart, E_cart)
 
def ε_drude (ε_inf, ω_p, γ_p, ω)
 
def mie_coefficients (a, nmax, k_i, k_e, μ_i=1, μ_e=1, J_ext=1, J_scat=3)
 
def G_Mie_scat_precalc_cart_new (source_cart, dest_cart, RH, RV, a, nmax, k_i, k_e, μ_i=1, μ_e=1, J_ext=1, J_scat=3)
 
def Grr_Delga (nmax, a, r, k, ε_m, ε_b)
 
def G0_dip_1 (r_cart, k)
 
def G0_analytical (r, k)
 
def G0L_analytical (r, k)
 
def G0T_analytical (r, k)
 
def G0_sum_1_slow (source_cart, dest_cart, k, nmax)
 
def loadWfile (fileName, lMax=None, fatForm=True, nparticles=2)
 
def processWfiles_sameKs (freqfilenames, destfilename, nparticles=2, lMax=None, f='npz')
 
def loadWfile_info (fileName, lMax=None, midk_halfwidth=None, freqlimits=None)
 
def loadWfile_processed (fileName, lMax=None, fatForm=True, midk_halfwidth=None, midk_index=None, freqlimits=None, iteratechunk=None)
 

Variables

 ň = np.newaxis
 
 eV = e
 

Detailed Description

This file contains mostly legacy code, but is still kept for reference. Avoid using this.

Function Documentation

◆ G0_dip_1()

def qpms.qpms_p.G0_dip_1 (   r_cart,
  k 
)
Free-space dyadic Green's function in terms of the spherical vector waves.
FIXME

◆ G_Mie_scat_precalc_cart_new()

def qpms.qpms_p.G_Mie_scat_precalc_cart_new (   source_cart,
  dest_cart,
  RH,
  RV,
  a,
  nmax,
  k_i,
  k_e,
  μ_i = 1,
  μ_e = 1,
  J_ext = 1,
  J_scat = 3 
)
Implementation according to Kristensson, page 50
My (Taylor's) basis functions are normalized to n*(n+1), whereas Kristensson's to 1
TODO: check possible -1 factors (cf. Kristensson's dagger notation)

◆ get_π̃τ̃_y1()

def qpms.qpms_p.get_π̃τ̃_y1 (   θ,
  nmax 
)
(... TODO)

◆ loadWfile()

def qpms.qpms_p.loadWfile (   fileName,
  lMax = None,
  fatForm = True,
  nparticles = 2 
)
Load the translation operator lattice sums generated by hexlattice_ewald.c
fatForm has different indices (so that it can be easily multiplied with T-Matrix
and twice the size.

◆ loadWfile_info()

def qpms.qpms_p.loadWfile_info (   fileName,
  lMax = None,
  midk_halfwidth = None,
  freqlimits = None 
)
Returns all the relevant data from the W file except for the W values themselves

◆ loadWfile_processed()

def qpms.qpms_p.loadWfile_processed (   fileName,
  lMax = None,
  fatForm = True,
  midk_halfwidth = None,
  midk_index = None,
  freqlimits = None,
  iteratechunk = None 
)
midk_halfwidth: int
    if given, takes only the "middle" k-value by index nk//2 and midk_halfwidth values from both sides
midk_index: int
    if given, midk_index is taken as the "middle" value instad of nk//2
freqlimit: pair of doubles; 
    if given, only the values from the given frequency range (in Hz) are returned to save RAM
    N.B.: the frequencies in the processed file are expected to be sorted!
iteratechunk: positive int ; NI
    if given, this works as a generator with only iteratechunk frequencies processed and returned at each iteration to save memory

◆ lpy1()

def qpms.qpms_p.lpy1 (   nmax,
  z 
)
Associated legendre function and its derivatative at z in the 'y-indexing'.
(Without Condon-Shortley phase AFAIK.)
NOT THOROUGHLY TESTED

Parameters
----------

nmax: int
    The maximum order to which the Legendre functions will be evaluated..
    
z: float
    The point at which the Legendre functions are evaluated.
    
output: (P_y, dP_y) TODO
    y-indexed legendre polynomials and their derivatives

◆ mie_coefficients()

def qpms.qpms_p.mie_coefficients (   a,
  nmax,
  k_i,
  k_e,
  μ_i = 1,
  μ_e = 1,
  J_ext = 1,
  J_scat = 3 
)
FIXME test the magnetic case
TODO description
RH concerns the N ("electric") part, RV the M ("magnetic") part
#

Parameters
----------
a : float
    Diameter of the sphere.
    
nmax : int
    To which order (inc. nmax) to compute the coefficients.

ω : float
    Frequency of the radiation

ε_i, ε_e, μ_i, μ_e : complex
    Relative permittivities and permeabilities of the sphere (_i)
    and the environment (_e)
    MAGNETIC (μ_i, μ_e != 1)  CASE UNTESTED AND PROBABLY BUGGY

J_ext, J_scat : 1, 2, 3, or 4 (must be different)
    Specifies the species of the Bessel/Hankel functions in which
    the external incoming (J_ext) and scattered (J_scat) fields
    are represented. 1,2,3,4 correspond to j,y,h(1),h(2), respectively.
    The returned coefficients are always with respect to the decomposition
    of the "external incoming" wave.

Returns
-------
RV == a/p, RH == b/q, TV = d/p, TH = c/q
TODO 
what does it return on index 0???
FIXME permeabilities

◆ nelem2lMax()

def qpms.qpms_p.nelem2lMax (   nelem)
Auxiliary inverse function to nelem(lMax) = (lMax + 2) * lMax. Returns 0 if
it nelem does not come from positive integer lMax.

◆ plane_pq_y()

def qpms.qpms_p.plane_pq_y (   nmax,
  kdir_cart,
  E_cart 
)
The plane wave expansion coefficients for any direction kdir_cart
and amplitude vector E_cart (which might be complex, depending on
the phase and polarisation state). If E_cart and kdir_cart are
not orthogonal, the result should correspond to the k-normal part
of E_cart.

The Taylor's convention on the expansion is used; therefore,
the electric field is expressed as
E(r) = E_cart * exp(1j * k ∙ r)
     = -1j * ∑_y ( p_y * Ñ_y(|k| * r) + q_y * M̃_y(|k| * r))
(note the -1j factor).

Parameters
----------
nmax: int
    The order of the expansion.
kdir_cart: (...,3)-shaped real array
    The wave vector (its magnitude does not play a role).
E_cart: (...,3)-shaped complex array
    Amplitude of the plane wave

Returns
-------
p_y, q_y:
    The expansion coefficients for the electric (Ñ) and magnetic
    (M̃) waves, respectively.

◆ processWfiles_sameKs()

def qpms.qpms_p.processWfiles_sameKs (   freqfilenames,
  destfilename,
  nparticles = 2,
  lMax = None,
  f = 'npz' 
)
Processes translation operator data in different files; each file is supposed to contain one frequency.
The Ks in the different files are expected to be exactly the same and in the same order; 
the result is sorted by frequencies and saved to npz file;
The representation is always "thin", i.e. the elements which are zero due to z-symmetry are skipped
F is either 'npz' or 'd' 
'npz' creates npz archive, 'd' creates a directory with individual npy files, where the W-matrix data
are writen using memmap.

◆ sph_loccart2cart()

def qpms.qpms_p.sph_loccart2cart (   loccart,
  sph,
  axis = -1 
)
Transformation of vector specified in local orthogonal coordinates 
(tangential to spherical coordinates – basis r̂,θ̂,φ̂) to global cartesian
coordinates (basis x̂,ŷ,ẑ)
SLOW FOR SMALL ARRAYS

Parameters
----------
loccart: ... TODO
    the transformed vector in the local orthogonal coordinates
    
sph: ... TODO
    the point (in spherical coordinates) at which the locally
    orthogonal basis is evaluated
    
Returns
-------
output: ... TODO
    The coordinates of the vector in global cartesian coordinates

◆ sph_loccart_basis()

def qpms.qpms_p.sph_loccart_basis (   sph,
  sphaxis = -1,
  cartaxis = None 
)
Returns the local cartesian basis in terms of global cartesian basis.
sphaxis refers to the original dimensions
TODO doc

◆ vswf_yr()

def qpms.qpms_p.vswf_yr (   pos_sph,
  lMax,
  J = 1 
)
Normalized vector spherical wavefunctions $\widetilde{M}_{mn}^{j}$,
$\widetilde{N}_{mn}^{j}$ as in [1, (2.40)].

Parameters
----------

pos_sph : np.array(dtype=float, shape=(someshape,3))
    The positions where the spherical vector waves are to be
    evaluated. The last axis corresponds to the individual
    points (r,θ,φ). The radial coordinate r is dimensionless,
    assuming that it has already been multiplied by the
    wavenumber.

nmax : int
    The maximum order to which the VSWFs are evaluated.
    
Returns
-------

output : np.array(dtype=complex, shape=(someshape,nmax*nmax + 2*nmax,3))
    Spherical vector wave functions evaluated at pos_sph,
    in the local basis (r̂,θ̂,φ̂). The last indices correspond
    to m, n (in the ordering given by mnindex()), and basis 
    vector index, respectively.
    
[1] Jonathan M. Taylor. Optical Binding Phenomena: Observations and
Mechanisms.

◆ vswf_yr1()

def qpms.qpms_p.vswf_yr1 (   pos_sph,
  nmax,
  J = 1 
)
As vswf_yr, but evaluated only at single position (i.e. pos_sph has
to have shape=(3))

◆ zplane_pq_y()

def qpms.qpms_p.zplane_pq_y (   nmax,
  betap = 0 
)
The z-propagating plane wave expansion coefficients as in [1, (1.12)]

Taylor's normalization

(... TODO)

◆ π̃_pilim()

def qpms.qpms_p.π̃_pilim (   nmax)
lim_{θ→ π+} π̃(cos θ)

◆ π̃_zerolim()

def qpms.qpms_p.π̃_zerolim (   nmax)
lim_{θ→ 0-} π̃(cos θ)

◆ τ̃_pilim()

def qpms.qpms_p.τ̃_pilim (   nmax)
lim_{θ→  π+} τ̃(cos θ)

◆ τ̃_zerolim()

def qpms.qpms_p.τ̃_zerolim (   nmax)
lim_{θ→ 0-} τ̃(cos θ)