CoupledElectricMagneticDipoles.PostProcessing.compute_cross_sections_e
— Methodcompute_cross_sections_e(knorm,kr,e_inc,alpha_e_dl,input_field;explicit_scattering=true,verbose=true)
Computes the extinction, absorbtion and scattering cross section $\sigma_{ext}$, $\sigma_{abs}$, $\sigma_{sca}$ of a system made out of electric dipoles, illuminated by a plane wave. Note that it should follow the optical theorem, i.e.
\[\sigma_{ext}=\sigma_{abs}+\sigma_{sca}\]
Arguments
knorm
: wave number in the medium.kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.e_inc
: 2D complex array of size $N\times 3$ containing the total incident electric field $\mathbf{E}_{i}$ on each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 3$ containing the input field $\mathbf{E}_0(\mathbf{r}_i)$ at the position of each dipole. Note that it must be a plane wave.explicit_scattering
: boolean that says whether to compute scttering cross section explicitely (true
) or to deduce it from the optical theorem (false
). By default set totrue
.verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- a float array of length 3 containing in order: extinction, absorption and scattering cross section. Cross sections are given in units of
knorm
^{-2}
`.
CoupledElectricMagneticDipoles.PostProcessing.compute_cross_sections_e_m
— Methodcompute_cross_sections_e_m(knorm,kr,phi_inc,alpha_dl,input_field;explicit_scattering=true,verbose=true)
Same as compute_cross_sections_e_m(knorm,kr,phi_inc,alpha_e_dl,alpha_m_dl,input_field;explicit_scattering=true,verbose=true)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.compute_cross_sections_e_m
— Methodcompute_cross_sections_e_m(knorm,kr,phi_inc,alpha_e_dl,alpha_m_dl,input_field;explicit_scattering=true,verbose=true)
Computes the extinction, absorbtion and scattering cross section $\sigma_{ext}$, $\sigma_{abs}$, $\sigma_{sca}$ of a system made out of electric and magnetic dipoles, illuminated by a plane wave. Note that it should follow the optical theorem, i.e.
\[\sigma_{ext}=\sigma_{abs}+\sigma_{sca}\]
Arguments
knorm
: wave number in the medium.kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.phi_inc
: 2D complex array of size $N\times 6$ containing the total incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 6$ containing the electric and magnetic input field $\mathbf{\Phi}_0=(\mathbf{E}_0(\mathbf{r}_i),\mathbf{H}_0(\mathbf{r}_i))$ at the position of each dipole. Note that it should be a plane wave.explicit_scattering
: boolean that says whether to compute scttering cross section explicitely (true
) or to deduce it from the optical theorem (false
). By default set totrue
.verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- a float array of length 3 containing in order: extinction, absorption and scattering cross section. Cross sections are given in units of
knorm
^{-2}
`.
CoupledElectricMagneticDipoles.PostProcessing.compute_dipole_moment
— Methodcompute_dipole_moment(alpha,phi_inc)
Computes the dipole moment (magnetic or electric) of a dipole with polarizability alpha
under an incident field phi_inc
. alpha
can be:
- a complex scalar
- a 1D complex array of size $N$
- a $3\times 3$ or $6\times 6$ complex matrix.
- a 3D complex array of size $N\times 3\times 3$ or $N\times 6\times 6$
CoupledElectricMagneticDipoles.PostProcessing.diff_scattering_cross_section_e
— Methoddiff_scattering_cross_section_e(knorm,kr,e_inc,alpha_e_dl,input_field,ur;verbose=true)
Computes the differential scattering cross section $d \sigma_{sca}/ d\Omega$ of a system made out of electric dipoles in direction(s) ur
.
Arguments
knorm
: wave number in the medium.kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.e_inc
: 2D complex array of size $N\times 3$ containing the total incident electric field $\mathbf{E}_{i}$ on each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 3$ containing the electric input field $\mathbf{E}_0(\mathbf{r}_i)$ at the position of each dipole. Note that it should be a plane waveur
: 1D float vector of length 3 (only one direction) or 2D float array of size $Nu\times 3$ (more thant 1 directions) containing the directions $\mathbf{u_r}$ where the diffrential scattering cross section is computed. Note that these directions vectors are normalized to 1 in the function.verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- an array containing the differential cross section in each direction. Cross sections are given in units of
knorm
^{-2}
`.
CoupledElectricMagneticDipoles.PostProcessing.diff_scattering_cross_section_e_m
— Methoddiff_scattering_cross_section_e_m(knorm,kr,phi_inc,alpha_dl,input_field,ur;verbose=true)
Same as diff_scattering_cross_section_e_m(knorm,kr,phi_inc,alpha_e_dl,alpha_m_dl,input_field,ur;verbose=true)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.diff_scattering_cross_section_e_m
— Methoddiff_scattering_cross_section_e_m(knorm,kr,phi_inc,alpha_e_dl,alpha_m_dl,input_field,ur;verbose=true)
Computes the differential scattering cross section $d \sigma_{sca}/ d\Omega$ of a system made out of electric and magnetic dipoles in direction(s) ur
.
Arguments
knorm
: wave number in the medium.kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.phi_inc
: 2D complex array of size $N\times 6$ containing the total incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 6$ containing the electric and magnetic input field $\mathbf{\Phi}_0=(\mathbf{E}_0(\mathbf{r}_i),\mathbf{H}_0(\mathbf{r}_i))$ at the position of each dipole. Note that it should be a plane wave.ur
: 1D float vector of length 3 (only one direction) or 2D float array of size $Nu\times 3$ (more thant 1 directions) containing the dimensionless positions $\mathbf{u_r}$ where the diffrential scattering cross section is computed. Note that these directions vectors are normalized to 1 in the function.verbose
: whether to output pieces of information to the standard output during at runtime or not. By default set totrue
.
Outputs
- an array containing the differential cross section in each direction. Cross sections are given in units of
knorm
^{-2}
`.
CoupledElectricMagneticDipoles.PostProcessing.emission_pattern_e
— Methodemission_pattern_e(kr,e_inc,alpha_e_dl,ur,krd,dip;verbose=true)
Computes the emission pattern $d P/ d\Omega$ (differential power emitted in a given direction) of a system made out of electric dipoles in direction(s) of position(s) krf
.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.e_inc
: 2D complex array of size $N\times 3$ containing the total incident electric field $\mathbf{E}_{i}$ on each dipole. The user is required to first solve the DDA problem fore_inc
in the presence of a point dipole source placed atkrd
.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.ur
: 1D float vector of length 3 (only one direction) or 2D float array of size $Nu\times 3$ (more thant 1 directions) containing the dimensionless positions $\mathbf{u_r}$ where the diffrential scattering cross section is computed. Note that these directions vectors are normalized to 1 in the function.krd
: float vector of length 3 containing the dimensionless position of the point electric dipole source.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively)
or complex array of size 3 with the components for the electric dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- an array containing the differential emitted power in directions
ur
in units of the power emitted by the emitter $P_0$ without any scatterers.
CoupledElectricMagneticDipoles.PostProcessing.emission_pattern_e_m
— Methodemission_pattern_e_m(kr,phi_inc,alpha_dl,ur,krd,dip;verbose=true)
Same as emission_pattern_e_m(kr,phi_inc,alpha_e_dl,alpha_m_dl,ur,krd,dip;verbose=true)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.emission_pattern_e_m
— Methodemission_pattern_e_m(kr,phi_inc,alpha_e_dl,alpha_m_dl,ur,krd,dip;verbose=true)
Computes the emission pattern $d \P/ d\Omega$ of a system made out of electric and magnetic dipoles in direction(s) of position(s) krf
.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.phi_inc
: 2D complex array of size $N\times 6$ containing the total incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.ur
: 1D float vector of length 3 (only one direction) or 2D float array of size $Nu\times 3$ (more thant 1 directions) containing the dimensionless positions $\mathbf{u_r}$ where the diffrential scattering cross section is computed. Note that these directions vectors are normalized to 1 in the function.krd
: float vector of length 3 containing the dimensionless position of the point electric and/or magnetic dipole source.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively anddip = 4,5,6
is a magnetic dipole along x,y,z respectively)
or complex array of size 6 with the first 3 components for the electric dipole moment and the last 3 components for the magnetic dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- an array containing the differential emitted power in directions
ur
in units of the power emitted by the emitter $P_0$ without any scatterers.
CoupledElectricMagneticDipoles.PostProcessing.far_field_sca_e
— Methodfunction far_field_sca_e(kr,e_inc,alpha_e_dl,krf)
Computes the scattered field from a system made out of electric dipoles in the far field approximation. Note that the term $e^{ikr}/kr$ is retained, so krf
has to be finite.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole. Note that these positions have to be far away from the dipoles positions.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.e_inc
: 2D complex array of size $N\times 3$ containing the incident electric field $\mathbf{E}_{i}$ on each dipole.krf
: 1D float vector of length 3 (only one position) or 2D float array of size $Nu\times 3$ (more thant 1 position) containing the dimensionless positions $k\mathbf{r}_f$ at which the scattered field is computed.
Outputs
field_r
: 2D complex array of size $Nf\times 6$ containing the scattered field by the dipoles at every $k\mathbf{r_f}$. Note that the term $e^{ikr}/kr$ is retained, sokrf
has to be finite.
CoupledElectricMagneticDipoles.PostProcessing.far_field_sca_e_m
— Methodfunction far_field_sca_e_m(kr,e_inc,alpha_dl,krf)
Same as far_field_sca_e_m(kr, alpha_e_dl, alpha_m_dl, phi_inc, krf)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.far_field_sca_e_m
— Methodfunction far_field_sca_e_m(kr,e_inc,alpha_e_dl,alpha_m_dl,krf)
Computes the scattered field from a system made out of electric and magnetic dipoles in the far field approximation. Note that the term $e^{ikr}/kr$ is retained, so krf
has to be finite.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole. Note that these positions have to be far away from the dipoles positions.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.phi_inc
: 2D complex array of size $N\times 6$ containing the incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.krf
: 1D float vector of length 3 (only one position) or 2D float array of size $Nu\times 3$ (more thant 1 position) containing the dimensionless positions $k\mathbf{r}_f$ at which the scattered field is computed.
Outputs
field_r
: 2D complex array of size $Nf\times 6$ containing the scattered field by the dipoles at every $k\mathbf{r_f}$. Note that the term $e^{ikr}/kr$ is retained, sokrf
has to be finite.
CoupledElectricMagneticDipoles.PostProcessing.field_sca_e
— Methodfunction field_sca_e(kr, alpha_e_dl, e_inc, krf)
Computes the scattered field from a system made out of electric dipoles. Note that the term $e^{ikr}/kr$ is retained, so krf
has to be finite.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.e_inc
: 2D complex array of size $N\times 3$ containing the total incident electric field $\mathbf{E}_{i}$ on each dipole.krf
: 1D float vector of length 3 (only one position) or 2D float array of size $Nu\times 3$ (more thant 1 position) containing the dimensionless positions $k\mathbf{r}_f$ at which the scattered field is computed.verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
field_r
: 2D complex array of size $Nf\times 6$ containing the scattered electric and magnetic fields by the dipoles at every $k\mathbf{r_f}$. Note that the term $e^{ikr}/kr$ is retained, sokrf
has to be finite.
CoupledElectricMagneticDipoles.PostProcessing.field_sca_e_m
— Methodfield_sca_e_m(kr, alpha_dl, phi_inc, krf)
Same as field_sca_e_m(kr, alpha_e_dl, alpha_m_dl, phi_inc, krf)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.field_sca_e_m
— Methodfield_sca_e_m(kr, alpha_e_dl, alpha_m_dl, phi_inc, krf; verbose=true)
Computes the scattered field from a system made out of electric and magnetic dipoles.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.phi_inc
: 2D complex array of size $N\times 6$ containing the total incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.krf
: 1D float vector of length 3 (only one position) or 2D float array of size $Nu\times 3$ (more thant 1 position) containing the dimensionless positions $k\mathbf{r}_f$ at which the scattered field is computed.verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
field_r
: 2D complex array of size $Nf\times 6$ containing the scattered electric and magnetic fields by the dipoles at every $k\mathbf{r_f}$.
CoupledElectricMagneticDipoles.PostProcessing.ldos_e
— Methodldos_e(kr, alpha_e_dl, Ainv, krd; dip=nothing, verbose=true)
It Computes local density of states (LDOS) of a system made out of electric dipoles normalized by the LDOS in the host medium without scatterers.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.Ainv
: (inverse) DDA matrix.krd
: 2D float array of size $Nd\times 3$ containing the dimentionless positions $k\mathbf{r_d}$ where the LDOS is calculated.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively)
or complex array of size 3 with the components for the electric dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
LDOS
: float array with the LDOS normalized by the LDOS in the host medium without scatterers.
CoupledElectricMagneticDipoles.PostProcessing.ldos_e_m
— Methodldos_e_m(kr, alpha_dl, Ainv, krd; dip=nothing, verbose=true)
Same as ldos_e_m(kr, alpha_e_dl, alpha_m_dl, Ainv, krd; dip=nothing, verbose=true)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.PostProcessing.ldos_e_m
— Methodldos_e_m(kr, alpha_e_dl, alpha_m_dl, Ainv, krd; dip=nothing, verbose=true)
Computes local density of states (LDOS) of a system made out of electric and magnetic dipoles normalized by the LDOS in the host medium without scatterers.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.Ainv
: (inverse) CEMD matrix.krd
: 2D float array of size $Nd\times 3$ containing the dimentionless positions $k\mathbf{r_d}$ where the LDOS is calculated.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively anddip = 4,5,6
is a magnetic dipole along x,y,z respectively)
or complex array of size 6 with the first 3 components for the electric dipole moment and the last 3 components for the magnetic dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
LDOS
: float array with the LDOS normalized by the LDOS in the host medium without scatterers.
CoupledElectricMagneticDipoles.PostProcessing.nonrad_ldos_e
— Methodnonrad_ldos_e(p,e_inc,dip;verbose=true)
Computes the non-radiative part of the LDOS of a system of electric point dipoles scatterers normalized by the LDOS in the host medium without scatterers. Note that the scattering problem has to be solved previously using a point dipole source as input field.
Arguments
p
: 2D complex array of size$Nd\times 3$ containing the electric dipole moments of the dipoles. It has to be previously computed by one of the DDACore functions andcompute_dipole_moment
.e_inc
: 2D complex array of size $N\times 3$ containing the total incident electric field $\mathbf{E}_{i}$ on each dipole. It has to be previously computed by one of the DDACore functions, setting the input field to be a point dipole source.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively)
or complex array of size 3 with the components for the electric dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- float array containing the normalized non-radiative LDOS at everey position of
krd
.
CoupledElectricMagneticDipoles.PostProcessing.nonrad_ldos_e_m
— Methodnonrad_ldos_e_m(p,m,phi_inc,dip;verbose=true)
Computes the non-radiative part of the LDOS of a system of electric and magnetic point dipoles scatterers normalized by the LDOS in the host medium without scatterers. Note that the scattering problem has to be solved previously using a point dipole source as input field.
Arguments
p
: 2D complex array of size$Nd\times 3$ containing the electric dipole moments of the dipoles. It has to be previously computed by one of the DDACore functions andcompute_dipole_moment
.m
: 2D complex array of size$Nd\times 3$ containing the magnetic dipole moments of the dipoles. It has to be previously computed by one of the DDACore functions, setting the input field to be a point dipole source.phi_inc
: 2D complex array of size $N\times 6$ containing the total incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively anddip = 4,5,6
is a magnetic dipole along x,y,z respectively)
or complex array of size 6 with the first 3 components for the electric dipole moment and the last 3 components for the magnetic dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- 1D float array containing the normalized non-radiative LDOS at everey position of
krd
.
CoupledElectricMagneticDipoles.PostProcessing.poynting_vector
— Methodpoynting_vector(phi)
Computes the poynting vector of an electromagnetic field. Input is an electric and magnetic field phi
(1D complex Array of length 6). Outputs a 1D float array of length 3 in units of electriqc field squared.
CoupledElectricMagneticDipoles.PostProcessing.rad_ldos_e
— Methodrad_ldos_e(kr,krd,p,dip;verbose=true)
Computes the radiative part of the LDOS of a system of electric point dipoles scatterers normalized by the LDOS in the host medium without scatterers.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.krd
: float array of size 3 containing the dimentionless position $k\mathbf{r_d}$ where the radiative part of the LDOS is calculated.p
: 2D complex array of size$Nd\times 3$ containing the electric dipole moments of the dipoles.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively)
or complex array of size 3 with the components for the electric dipole moment.
verbose
: whether to output pieces of information to the standard output during running or not. By default set totrue
.
Outputs
- float containing the normalized (by the LDOS in the host medium without scatterers) radiative LDOS at the position
krd
.
CoupledElectricMagneticDipoles.PostProcessing.rad_ldos_e_m
— Methodrad_ldos_e_m(kr,krd,p,m,dip;verbose=true)
Computes the radiative part of the LDOS of a system of electric and magnetic point dipoles scatterers normalized by the LDOS in the host medium without scatterers.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.krd
: float array of size 3 containing the dimentionless position $k\mathbf{r_d}$ where the LDOS is calculated.p
: 2D complex array of size$Nd\times 3$ containing the electric dipole moments of the dipoles.m
: 2D complex array of size$Nd\times 3$ containing the magnetic dipole moments of the dipoles.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively anddip = 4,5,6
is a magnetic dipole along x,y,z respectively)
or complex array of size 6 with the first 3 components for the electric dipole moment and the last 3 components for the magnetic dipole moment.
verbose
: whether to output pieces of information to the standard output at runtime or not. By default set totrue
.
Outputs
- float containing the normalized (by the LDOS in the host medium without scatterers) radiative LDOS at the position
krd
.
CoupledElectricMagneticDipoles.Geometries.discretize_cube
— Methoddiscretize_cube(L,N)
Discretizes the volume of a cube of edge L
in small cubes of edge dx=L/N
. Let $N_d$ be the obtained number of cubes, the output is a tuple with an $N_d \times 4$ array containing the 3D position of the centers of the cubes (first three entries) and their filling fraction (fourth entry), as well as the size of the edge of the cubes dx
.
CoupledElectricMagneticDipoles.Geometries.discretize_sphere
— Methoddiscretize_sphere(a,N;N_sub=10)
Discretizes the volume of a sphere of radius a
in small cubes of edge dx=2*a/N
. N_sub
is a parameter to set the super sampling anti-aliasing accuracy of the discretization. It is by default set to 10. Let $N_d$ be the obtained number of cubes, the output is a tuple with an $N_d \times 4$ array containing the 3D position of the centers of the cubes (first three entries) and their filling fraction (fourth entry), as well as the size of the edge of the cubes dx
.
CoupledElectricMagneticDipoles.GreenTensors.G_e_renorm
— MethodG_e_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric Green's tensor between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.G_em_far_field_renorm
— MethodG_em_far_field_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric and magnetic Green's in the far field approximation tensors between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
.Note that is is only valid for $kr_1>>kr_2$ and $kr_1>>1$. The outputs are two dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.GreenTensors.G_em_renorm
— MethodG_em_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric and magnetic Green's tensors between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The outputs are two dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.GreenTensors.G_m_renorm
— MethodG_m_renorm(kr1,kr2)
Computes the renormalized (dimensionless) magnetic Green's tensor between two position r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.denormalize_G_e
— Methoddenormalize_G_e(Ge,knorm)
Passes from a dimensionless electric Green's tensor Ge
to a Green's tensor with units of length⁻¹ by multiplying by a factor $k/(4\pi)$. knorm
is the wavenumber in the host medium $k$.
CoupledElectricMagneticDipoles.GreenTensors.denormalize_G_m
— Methoddenormalize_G_m(Gm,knorm)
Passes from a dimensionless magnetic Green's tensor Gm
to a Green's tensor with units of length⁻² by multiplying by a factor $k^2/(4\pi)$. knorm
is the wavenumber in the host medium $k$.
CoupledElectricMagneticDipoles.GreenTensors.dxG_e_renorm
— MethoddxG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the kx
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.dxG_em_renorm
— MethoddxG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the `kx` component of `kr1` between two positions (multiplied by the host medium wavenumber) `kr1` and `kr2`.
The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.GreenTensors.dxG_m_renorm
— MethoddxG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the kx
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.dyG_e_renorm
— MethoddyG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.dyG_em_renorm
— MethoddyG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.GreenTensors.dyG_m_renorm
— MethoddyG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.dzG_e_renorm
— MethoddzG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.GreenTensors.dzG_em_renorm
— MethoddzG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.GreenTensors.dzG_m_renorm
— MethoddzG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.Forces.force_e
— Methodforce_e(kr,alpha_e_dl, Ainv, e_0, dxe_0, dye_0, dze_0)
Computes the optical forces on a system made out of electric dipoles for deterministic input fields. The output force has units of the input electric field squared. To get unit of forces, it is necessary to multiply by a factor $\epsilon_0\epsilon_h 4\pi/k^2$, taking care that the units of the field, the vacuum permittivity and the wavevector are in accordance.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.Ainv
: (inverse) DDA matrix.e_0
: 2D complex array of size $N\times 3$ containing the external input field.dxe_0
: 2D complex array of size $N\times 3$ containing the derivative with regard to the $k*x$ argument of the external input field.dye_0
: 2D complex array of size $N\times 3$ containing the derivative with regard to the $k*y$ argument of the external input field.dze_0
: 2D complex array of size $N\times 3$ containing the derivative with regard to the $k*z$ argument of the external input field.
Outputs
fx
: float array of Size $N$ with the value of the force along the $x$-axis at each dipole.fy
: float array of Size $N$ with the value of the force along the $y$-axis at each dipole.fz
: float array of Size $N$ with the value of the force along the $z$-axis at each dipole.
CoupledElectricMagneticDipoles.Forces.force_e_m
— Methodforce_e_m(kr,alpha_dl, Ainv, e_0, dxe_0, dye_0, dze_0)
Same as force_e_m(knorm,kr,alpha_e_dl, alpha_m_dl, Ainv, e_0, dxe_0, dye_0, dze_0)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats. The output force has units of the input electric field squared. To get unit of forces, it is necessary to multiply by a factor $\epsilon_0\epsilon_h 4\pi/k^2$, taking care that the units of the field, the vacuum permittivity and the wavevector are in accordance.
CoupledElectricMagneticDipoles.Forces.force_e_m
— Methodforce_e_m(kr,alpha_e_dl, alpha_m_dl, Ainv, e_0, dxe_0, dye_0, dze_0)
Computes the optical forces on a system made out of electric and magnetic dipoles for deterministic input fields. The output force has units of the input electric field squared. To get unit of forces, it is necessary to multiply by a factor $\epsilon_0\epsilon_h 4\pi/k^2$, taking care that the units of the field, the vacuum permittivity and the wavevector are in accordance.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.Ainv
: (inverse) DDA matrix.e_0
: 2D complex array of size $N\times 6$ containing the external input field.dxe_0
: 2D complex array of size $N\times 6$ containing the derivative with regard to the $k*x$ argument of the external input field.dye_0
: 2D complex array of size $N\times 6$ containing the derivative with regard to the $k*y$ argument of the external input field.dze_0
: 2D complex array of size $N\times 6$ containing the derivative with regard to the $k*z$ argument of the external input field.
Outputs
fx
: float array of Size $N$ with the value of the force along the $x$-axis at each dipole.fy
: float array of Size $N$ with the value of the force along the $y$-axis at each dipole.fz
: float array of Size $N$ with the value of the force along the $z$-axis at each dipole.
CoupledElectricMagneticDipoles.Forces.force_factor_gaussianbeams
— Methodforce_factor_gaussianbeams(kbw0,power,eps_h;n=0,m=0,,kind="hermite", e0 = 1, paraxial=true, kmax = nothing, maxe=Int(1e4), int_size = 5)
Computes the proportionality factor to get the forces in units of Newtons when the forces are calculated using the Gaussian beams (Hermite and Laguerre) implemented in the library. By default, the factor is calculated for a Gaussian Beam in the paraxial approximation.
Arguments
kbw0
: float with the dimensionless beam waist radius ($kw_0$, where $w_0$ is the beam waist radius).power
: float with the power of the beam.eps_h
: float with the relative permittivity of the host medium.n
: non-negative integer with the radial order of the beam.m
: integer with the azimuthal order of the beam.e0
: float with the modulus of the electric field used in the calculation of the beam profile.kind
: string with the kind of beam ("hermite" or "laguerre"). By default set to "hermite".paraxial
: boolean setting if the calculation is done in the paraxial approximation.kmax
: float setting the limit of the radial integration (it should bekmax < 1
).maxe
: maximum number of evaluations in the adaptative integral (see Cubature.jl for more details).int_size
: size of the integration area in units ofkbw0
. For high-order beams this parameter should be adjusted.
Outputs
force_factor
: proportionality factor to get the forces in units of Newtons.
CoupledElectricMagneticDipoles.MieCoeff.mie_ab1
— Methodmie_ab1(ka, eps, eps_h; mu=1, mu_h=1)
Computes the first mie coefficient $a_1$ and $b_1$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. Returns a tuple with two complex scalar, $a_1$ and $b_1$, respectively.
CoupledElectricMagneticDipoles.MieCoeff.mie_absorption
— Methodmie_absorption(ka,eps,eps_h;mu=1,mu_h=1,cutoff=20)
Computes the extinction efficiency $Q_{abs}$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. For this, we use:
\[Q_{abs} =Q_{ext}-Q_{sca}\]
where corresponding sums are cut to cutoff
which is set to 20 by default.
Returns a float.
CoupledElectricMagneticDipoles.MieCoeff.mie_an
— Methodmie_an(ka, eps, eps_h; mu=1, mu_h=1, n=1)
Computes the n
-th mie coefficient $a_n$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. Returns a complex scalar.
CoupledElectricMagneticDipoles.MieCoeff.mie_bn
— Methodmie_bn(ka, eps, eps_h; mu=1, mu_h=1, n=1)
Computes the n
-th mie coefficient $b_n$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. Returns a complex scalar.
CoupledElectricMagneticDipoles.MieCoeff.mie_extinction
— Methodmie_extinction(ka,eps,eps_h;cutoff=20)
Computes the extinction efficiency $Q_{ext}$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. For this, we use the finite sum:
\[Q_{ext} =\frac{2}{(ka)^2}\sum^{\text{cutoff}}_{n=1}\left(2n+1\right)Re\left(a_n+b_n\right)\]
where cutoff
is set to 20 by default.
Returns a float.
CoupledElectricMagneticDipoles.MieCoeff.mie_scattering
— Methodmie_scattering(ka,eps,eps_h;mu=1, mu_h=1, cutoff=20)
Computes the scattering efficiency $Q_{sca}$ of a sphere with size parameter ka
, dielectric permittivity eps
and magnetic permeability mu
, in a host medium with dielectric permittivity eps_h
and magnetic permeability mu_h
. For this, we use the finite sum:
\[Q_{sca} =\frac{2}{ka^2}\sum^{\text{cutoff}}_{n=1}\left(2n+1\right)\left(|a_n|^2+|b_n|^2\right)\]
where cutoff
is set to 20 by default.
Returns a float.
CoupledElectricMagneticDipoles.Alphas.alpha0_cube
— Methodalpha0_cube(L,eps,eps_h)
Computes the quasistatic polarizability tensor of a cube of side L
and permittivity eps
in a host medium with permittivity eps_h
. Permittivities can be scalars or $3\times 3$ tensors. Outputs a $3\times 3$ float matrix with units of volume.
CoupledElectricMagneticDipoles.Alphas.alpha0_sphere
— Methodalpha0_sphere(a,eps,eps_h)
Computes the quasistatic polarizability of a sphere of radius a
and permittivity eps
in a host medium with permittivity eps_h
. Permittivities can be scalars or $3\times 3$ tensors. Outputs a float with units of volume.
CoupledElectricMagneticDipoles.Alphas.alpha0_volume
— Methodalpha0_volume(V,eps,eps_h)
Computes the quasistatic polarizability of any isotropic object with volume V
and permittivity eps
in a host medium with permittivity eps_h
. Permittivities can be scalars or $3\times 3$ tensors. Outputs a float with units of volume.
CoupledElectricMagneticDipoles.Alphas.alpha_e_m_mie
— Methodalpha_e_m_mie(ka,eps,eps_h)
Computes the electric and magnetic polarizabilities from the mie coefficients $a_1$ and $b_1$ of a particle with size parameter ka
(wave number times radius), and permittivity eps
, in a host medium with permittivity eps_h
. Outputs two dimensionless scalars that are respectively the electric and the magnetic polarizability.
CoupledElectricMagneticDipoles.Alphas.alpha_radiative
— Methodalpha_radiative(alpha0,knorm)
Applies the radiative correction to the polarizability matrix or scalar alpha0
(with units of volume). Outputs a complex dimensionless scalar or a (3x3) complex dimensionless matrix.
CoupledElectricMagneticDipoles.Alphas.denorm_alpha
— Methoddenorm_alpha(knorm,alpha)
Denormalizes any dimensionless polarizability alpha
in a polarizability with units of volume by multiplying by $4\pi /k^3$. knorm
is the wave number in the medium.
CoupledElectricMagneticDipoles.Alphas.dispatch_e
— Methoddispatch_e(alpha_e_dl,n_particles)
Creates an iterable with the polarizability of all particles in order to facilitate the syntax for multuplying a Green's tensor by polarizability of a particle.
Arguments
alpha_e_dl
: electric polarizability, see the Alphas module's documentation for the accepted formats.n_particles
: number of particles (integer)
Outputs
alp_e
: iterable electric polarizability
CoupledElectricMagneticDipoles.Alphas.dispatch_e_m
— Methoddispatch_e_m(alpha_e_dl,alpha_m_dl,n_particles)
Creates an iterable with the polarizability of all particles in order to facilitate the syntax for multuplying a Green's tensor by the polarizability of a particle.
Arguments
alpha_e_dl
: electric polarizability, see the Alphas module's documentation for the accepted formats.alpha_m_dl
: magnetic polarizability, see the Alphas module's documentation for the accepted formats.n_particles
: number of particles (integer)
Outputs
alp_e
: iterable electric polarizabilityalp_m
: iterable magnetic polarizability
CoupledElectricMagneticDipoles.Alphas.dispatch_e_m
— Methoddispatch_e_m(alpha_dl,n_particles)
Creates an iterable with the polarizability of all particles in order to facilitate the syntax for multuplying a Green's tensor by the polarizability of a particle.
Arguments
alpha_dl
: polarizability 6x6 complex matrix, see the Alphas module's documentation for the accepted formats.n_particles
: number of particles (integer)
Outputs
alp
: iterable polarizability
CoupledElectricMagneticDipoles.Alphas.renorm_alpha
— Methodrenorm_alpha(knorm,alpha)
Renormalizes any polarizability alpha
with units of volume in a dimensionless polarizability by multiplying by $k^3/4\pi$. knorm
is the wave number in the medium.
CoupledElectricMagneticDipoles.InputFields.create_f_gauss_kind
— Methodcreate_f_gauss_kind(kbw0,n,m,kind)
Create the function to calculate the fourier transform components for the specific beam (gaussian, hermite-gaussian or legendre-gaussian) used in the functions that calculate the field and the derivatives.
Arguments
kbw0
: float with the dimensionless beam waist radius ($k\omega_0$, where $\omega_0$ is the beam waist radius).n
: int with the order of the beam.m
: int with the degree of the beam.kind
: string with the kind of beam ("hermite" or "laguerre").
Outputs
lp
: generalized Laguerre polynomials of argument $x$ and order $n$ and $a$.
CoupledElectricMagneticDipoles.InputFields.d_gaussian_beam_e
— Methodd_gaussian_beam_e(krf, kbw0; n = 0, m = 0, kind = "hermite", e0 = 1, kmax = nothing, maxe=Int(5e3))
Computes the spatial derivatives of an electric field generated with gaussian_beam_e
(the arguments are the same as for gaussian_beam_e_m
). Outputs three 2D arrays of size $N\times 3$ containing the electric field derivatives with respect k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.d_gaussian_beam_e_m
— Methodd_gaussian_beam_e_m(krf, kbw0; n = 0, m = 0, kind = "hermite", e0 = 1, kmax = nothing, maxe=Int(5e3))
Computes the spatial derivatives of an electromagnetic field generated with gaussian_beam_e_m
(the arguments are the same as for gaussian_beam_e_m
). Outputs three 2D arrays of size $N\times 6$ containing the electric and magnetic field derivatives with respect of k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.d_plane_wave_e
— Methodd_plane_wave_e(kr;khat=[0,0,1],e0=[1,0,0])
Computes the spatial derivatives of an electric field generated with plane_wave_e
(the arguments are the same as for plane_wave_e
). Outputs three 2D arrays of size $N\times 3$ containing the electric field derivatives with respect k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.d_plane_wave_e_m
— Methodd_plane_wave_e_m(kr;khat=[0,0,1],e0=[1,0,0])
Computes the spatial derivatives of an electromagnetic field generated with plane_wave_e_m
(the arguments are the same as for plane_wave_e_m
). Outputs three 2D arrays of size $N\times 6$ containing the electric and magnetic fields derivatives with respect of k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.d_point_dipole_e
— Methodd_point_dipole_e(krf, krd, dip, e0=1)
Computes the spatial derivatives of an electric field generated with point_dipole_e
(the arguments are the same as for point_dipole_e
). Outputs three 2D arrays of size $N\times 3$ containing the electric field derivatives with respect k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.d_point_dipole_e_m
— Methodd_point_dipole_e_m(krf, krd, dip, e0=1)
Computes the spatial derivatives of an electromagnetic field generated with point_dipole_e_m
(the arguments are the same as for point_dipole_e_m
). Outputs three 2D arrays of size $N\times 6$ containing the electric and magnetic fields derivatives with respect of k*x
, k*y
and k*z
.
CoupledElectricMagneticDipoles.InputFields.gaussian_beam_e
— Methodgaussian_beam_e(krf, kbw0,n,m; n = 0, m = 0, kind = "hermite", e0 = 1, kmax = nothing, maxe=Int(5e3))
Computes the electric field distribution of a Gaussian, Hermite-Gaussian and Laguerre-Gaussian beam that propagates along the z-axis and where the electric field is polarized along the x-axis (polarized electric). By default, the Gaussian beam profile is calculated. For another polarization just rotate the field in the xy-plane. Also, for a polarized magnetic field, exchange E with ZH and H with -E.
Arguments
krf
: 2D float array of size $N\times 3$ containing the dimensionless positions $k\mathbf{r}$ where the field is computed.kbw0
: float with the dimensionless beam waist radius ($k\omega_0$, where $\omega_0$ is the beam waist radius).n
: int with the order of the beam.m
: int with the degree of the beam.kind
: string with the kind of beam ("hermite" or "laguerre").e0
: float with the modulus of the electric field at the origin of coordinates of the theoretical field (including evanescent waves).kmax
: float setting the limit of the radial integration (it should bekmax < 1
).maxe
: maximum number of evaluations in the adaptive integral (see Cubature.jl for more details).
Outputs
e_gauss
: 2D complex array of size $N\times 3$ with the value of the electric field at each positions.
CoupledElectricMagneticDipoles.InputFields.gaussian_beam_e_m
— Methodgaussian_beam_e_m(krf, kbw0,n,m; n = 0, m = 0, kind = "hermite", e0 = 1, kmax = nothing, maxe=Int(5e3))
Computes the electromagnetic field distribution of a Gaussian, Hermite-Gaussian and Laguerre-Gaussian beam that propagates along the z-axis and where the electric field is polarized along the x-axis (polarized electric). By default, the Gaussian beam profile is calculated. For another polarization just rotate the field in the xy-plane. Also, for a polarized magnetic field, exchange E with ZH and H with -E.
Arguments
krf
: 2D float array of size $N\times 3$ containing the dimensionless positions $k\mathbf{r}$ where the field is computed.kbw0
: float with the dimensionless beam waist radius ($k\omega_0$, where $\omega_0$ is the beam waist radius).n
: int with the order of the beam.m
: int with the degree of the beam.kind
: string with the kind of beam ("hermite" or "laguerre").e0
: float with the modulus of the electric field at the origin of coordinates of the theoretical field (including evanescent waves).kmax
: float setting the limit of the radial integration (it should bekmax < 1
).maxe
: maximum number of evaluations in the adaptive integral (see Cubature.jl for more details).
Outputs
phi_gauss
: 2D complex array of size $N\times 6$ with the value of the electric and magnetic fields at each positions.
CoupledElectricMagneticDipoles.InputFields.ghermite_amp
— Methodghermite_amp(kbw0,n,m; kmax = nothing, maxe=Int(1e4), int_size = 5)
Computes the integral of the field amplitude (|E|^2) of the Hermite-Gaussian beam at the focal plane.
Arguments
kbw0
: float with the dimensionless beam waist radius ($k\omega_0$, where $\omega_0$ is the beam waist radius).n
: non-negative int with the radial order of the beam.m
: int with the azimuthal order of the beam.kmax
: float setting the limit of the radial integration (it should bekmax < 1
).maxe
: maximum number of evaluations in the adaptive integral (see Cubature.jl for more details).int_size
: size of the integration area in units of $kbw0$. For high-order beams this parameter should be adjusted.
Outputs
int_amplitude
: integral of the field amplitude (|E|^2) in the area defined by intsize (x = [-kbw0*intsize, kbw0int_size], y = [-kbw0intsize, kbw0*intsize]).
CoupledElectricMagneticDipoles.InputFields.glaguerre_amp
— Methodglaguerre_amp(kbw0,n,m; kmax = nothing, maxe=Int(1e4), int_size = 5)
Computes the integral of the field amplitude (|E|^2) of the Laguerre-Gaussian beam at the focal plane.
Arguments
kbw0
: float with the dimensionless beam waist radius ($k\omega_0$, where $\omega_0$ is the beam waist radius).n
: non-negative int with the radial order of the beam.m
: int with the azimuthal order of the beam.kmax
: float setting the limit of the radial integration (it should bekmax < 1
).maxe
: maximum number of evaluations in the adaptive integral (see Cubature.jl for more details).int_size
: size of the integration area in units of $kbw0$. For high-order beams this parameter should be adjusted.
Outputs
int_amplitude
: integral of the field amplitude (|E|^2) in the area defined by intsize (x = [-kbw0*intsize, kbw0int_size], y = [-kbw0intsize, kbw0*intsize]).
CoupledElectricMagneticDipoles.InputFields.hermite_e_pol
— Methodhermite_e_pol(x,n)
Computes probabilist's Hermite polynomials.
Arguments
x
: float with the argument.n
: int with the order.
Outputs
hp
: probabilist's Hermite polynomials of argument $x$ and order $n$.
CoupledElectricMagneticDipoles.InputFields.laguerre_pol
— Methodlaguerre_pol(x,n,a)
Computes generalized Laguerre polynomials.
Arguments
x
: float with the argument.n
: int with the order.a
: int with the second order.
Outputs
lp
: generalized Laguerre polynomials of argument $x$ and order $n$ and $a$.
CoupledElectricMagneticDipoles.InputFields.plane_wave_e
— Methodplane_wave_e(krf;khat=[0,0,1],e0=[1,0,0])
Computes the electric field of a monochromatic plane wave evaluated at a set of dimensionless positions krf
. khat
is the direction of propagation and e0
is the polarization. The user is responsible for using physical inputs. krf
is a $N\times 3$ float array. The output is a $N\times 3$ complex array representing the electric field at each of the positions in the krf
array.
CoupledElectricMagneticDipoles.InputFields.plane_wave_e_m
— Methodplane_wave_e_m(krf;khat=[0,0,1],e0=[1,0,0])
Computes the electric and magnetic fields of a monochromatic plane wave evaluated at a set of dimensionless positions krf
. khat
is the direction of propagation and e0
is the polarization. The user is responsible for using physical inputs. krf
is a $N\times 3$ float array. The output is a $N\times 6$ complex array representing the electric and magnetic fields at each of the positions in the krf
array.
CoupledElectricMagneticDipoles.InputFields.point_dipole_e
— Methodpoint_dipole_e(krf, krd, dip, e0_const=1)
Computes the electric field emitted by an electric point dipole.
Arguments
krf
: 2D float array of size $N\times 3$ containing the dimensionless positions $k\mathbf{r}$ where the field is computed.krd
: 1D float array of size 3 containing the dimensionless position $k\mathbf{r_d}$ where the source is located.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively)
or complex array of size 3 with the components for the electric dipole moment.
e0
: float with the modulus ofdip
.
Outputs
e_dipole
: 2D $N\times 3$ complex array with the electromagnetic field.
CoupledElectricMagneticDipoles.InputFields.point_dipole_e_m
— Methodpoint_dipole_e_m(krf, krd, dip, e0=1)
Computes the electric and magnetic fields emitted by an electric and/or magnetic point dipole.
Arguments
krf
: 2D float array of size $N\times 3$ containing the dimensionless positions $k\mathbf{r}$ where the field is computed.krd
: 1D float array of size 3 containing the dimensionless position $k\mathbf{r_d}$ where the source is located.dip
: integer defining the dipole moment (dip = 1,2,3
is an electric dipole along x,y,z respectively anddip = 4,5,6
is a magnetic dipole along x,y,z respectively)
or complex array of size 6 with the first 3 components for the electric dipole moment and the last 3 components for the magnetic dipole moment.
e0
: float with the modulus ofdip
.
Outputs
phi_dipole
: 2D $N\times 6$complex array with the electromagnetic fields at each position.
CoupledElectricMagneticDipoles.DDACore.load_dda_matrix_e
— Method load_dda_matrix_e(kr,alpha_e_dl,verbose)
Builds the electric only DDA matrix $A=[I-G\alpha]$ with dimensionless positions kr
(2D array of size $N\times3$) and dimensionless polarizabilities alpha_e_dl
(see format rules in the Alphas module documentation). Returns $3N\times 3N$ complex DDA matrix.
CoupledElectricMagneticDipoles.DDACore.load_dda_matrix_e_m
— Method load_dda_matrix_e_m(kr,alpha_e_dl,alpha_m_dl,verbose)
Builds the electric and magnetic CEMD matrix $A=[I-G\alpha]$ with dimensionless positions kr
(2D array of size $N\times 3$) and dimensionless electric and magnetic polarizabilities alpha_e_dl
and alpha_m_dl
(see format rules in the Alphas module documentation). Returns the $6N\times 6N$ complex CEMD matrix.
CoupledElectricMagneticDipoles.DDACore.load_dda_matrix_e_m
— Method load_dda_matrix_e_m(kr,alpha_dl,verbose)
Builds the electric and magnetic CEMD matrix $A=[I-G\alpha]$ with dimensionless positions kr
(two dimensional arrays of size $N\times 3$) and dimensionless polarizability alpha_dl
(see format rules in the Alphas module documentation). Return $6N\times 6N$ complex DDA matrix
CoupledElectricMagneticDipoles.DDACore.solve_DDA_e
— Methodsolve_DDA_e(kr,alpha_e_dl;input_field=nothing,solver="CPU",verbose=true)
Builds and solves the DDA equations under a given input field for a group of $N$ only electric dipoles and returns the total incident field on each of the dipoles.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 3$ containing the electric input field $\mathbf{E}_0(\mathbf{r}_i)$ at the position of each dipole. It can also be a 3D array of size $N_f\times N\times 3$, allowing to solve the problem for several input fields without re-inverting the matrix. This is a keyword argument. Ifinput_field=nothing
, the output of the function will be the inverse of the DDA matrix.solver
: string that contains the name of the solver to be used. For this, check theDDACore.solve_system
function documentation. By default set to "CPU".verbose
: whether to output informations to the standard output during runtime or not. By default set totrue
.
Outputs
Depending on the value of input field
, it can be:
e_inc
: 2D complex array of size $N\times 3$ containing the incident electric field $\mathbf{E}_{i}$ on each dipole. ifinput_field
is a 2D array.e_inc
: 3D complex array of size $N_f\times N\times 3$ containing the incident electric field $\mathbf{E}_{i}$ on each dipole for each input field, ifinput_field
is a 3D array.Ainv
: complex matrix of size $3N\times 3N$, ifinput_field=nothing
.
CoupledElectricMagneticDipoles.DDACore.solve_DDA_e_m
— Methodsolve_DDA_e_m(kr,alpha_e_dl,alpha_m_dl;input_field=nothing,solver="CPU",verbose=true)
Builds and solves the CEMD equations with dimensionless inputs under a given input field for a group of $N$ electric and magnetic dipoles and return the total incident field on every dipole.
Arguments
kr
: 2D float array of size $N\times 3$ containing the dimensionless position $k\mathbf{r}$ of each dipole.alpha_e_dl
: complex dimensionless electric polarizability of each dipole. See the Alphas module documentation for accepted formats.alpha_m_dl
: complex dimensionless magnetic polarizability of each dipole. See the Alphas module documentation for accepted formats.input_field
: 2D complex array of size $N\times 6$ containing the electric and magnetic input field $\mathbf{\Phi}_0=(\mathbf{E}_0(\mathbf{r}_i),\mathbf{H}_0(\mathbf{r}_i))$ at the position of each dipole. It can also be a 3D array of size $N_f\times N\times 6$, allowing to solve the problem for several input fields without re-inverting the matrix. This is a keyword argument. Ifinput_field=nothing
(default value), the output of the function will be the inverse of the CEMD matrix.solver
:string that contains the name of the solver to be used. For this, check theDDACore.solve_system
function documentation. By default set to "CPU".verbose
: whether to output pieces of information to the standard output during runtime or not. By default set totrue
.
Outputs
Depending on the value of input field
, it can be:
phi_inc
: 2D complex array of size $N\times 6$ containing the incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole, ifinput_field
is a 2D array.phi_inc
: 3D complex array of size $N_f\times N\times 6$ containing the incident electric and magnetic field $\mathbf{\Phi}_i=(\mathbf{E}_i,\mathbf{H}_i)$ on each dipole for each input field, ifinput_field
is a 3D array.Ainv
: complex matrix of size $6N\times 6N$, ifinput_field=nothing
.
CoupledElectricMagneticDipoles.DDACore.solve_DDA_e_m
— Methodfunction solve_DDA_e_m(kr,alpha_dl;input_field=nothing,solver="CPU",verbose=true)
Same as solve_DDA_e_m(kr,alpha_e_dl,alpha_m_dl;input_field=nothing,solver="CPU",verbose=true)
, but the electric and magnetic polarizabilities of each dipole are given by a single 6x6 complex matrix. See the Alphas module documentation for accepted formats.
CoupledElectricMagneticDipoles.DDACore.solve_system
— Method solve_system(A,b,solver,verbose)
Solves a system of equations of the type $Ax=b$ using the method solver
and returns x
. x
can be a 1D column vector or a 2D matrix. In this second case, the function is going to solve for each column of the matrix as a different problem (without re-inverting A
). The solver
flag can be set to
CPU
: In this case, the system is solved using LAPACK on the CPU.GPU
: In this case, the system is solved using CUSOLVE on the GPU (if available).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.G_e_renorm
— MethodG_e_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric Green's tensor between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.G_em_far_field_renorm
— MethodG_em_far_field_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric and magnetic Green's in the far field approximation tensors between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
.Note that is is only valid for $kr_1>>kr_2$ and $kr_1>>1$. The outputs are two dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.G_em_renorm
— MethodG_em_renorm(kr1,kr2)
Computes the renormalized (dimensionless) electric and magnetic Green's tensors between two positions r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The outputs are two dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.G_m_renorm
— MethodG_m_renorm(kr1,kr2)
Computes the renormalized (dimensionless) magnetic Green's tensor between two position r1
and r2
, where the inputs are the positions multiplied by the host medium wave number kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.denormalize_G_e
— Methoddenormalize_G_e(Ge,knorm)
Passes from a dimensionless electric Green's tensor Ge
to a Green's tensor with units of length⁻¹ by multiplying by a factor $k/(4\pi)$. knorm
is the wavenumber in the host medium $k$.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.denormalize_G_m
— Methoddenormalize_G_m(Gm,knorm)
Passes from a dimensionless magnetic Green's tensor Gm
to a Green's tensor with units of length⁻² by multiplying by a factor $k^2/(4\pi)$. knorm
is the wavenumber in the host medium $k$.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dxG_e_renorm
— MethoddxG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the kx
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dxG_em_renorm
— MethoddxG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the `kx` component of `kr1` between two positions (multiplied by the host medium wavenumber) `kr1` and `kr2`.
The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dxG_m_renorm
— MethoddxG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the kx
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dyG_e_renorm
— MethoddyG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dyG_em_renorm
— MethoddyG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dyG_m_renorm
— MethoddyG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the ky
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dzG_e_renorm
— MethoddzG_e_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric Green's tensor with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dzG_em_renorm
— MethoddzG_em_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) electric and magnetic Green's tensors with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix (electric and magnetic Green's tensor respectively).
CoupledElectricMagneticDipoles.InputFields.GreenTensors.dzG_m_renorm
— MethoddzG_m_renorm(kr1,kr2)
Computes the derivative of the renormalized (dimensionless) magnetic Green's tensor with respect to the kz
component of kr1
between two positions (multiplied by the host medium wavenumber) kr1
and kr2
. The output is a dimensionless 3x3 complex matrix.