Python¶
The Python interface has four callable subroutines:
Laplace wrappers: Fast multipole implementation (lfmm3d) and direct evaluation (l3ddir) for Laplace N-body interactions
Helmholtz wrappers: Fast multipole implementation (hfmm3d) and direct evaluation (h3ddir) for Helmholtz N-body interactions
Stokes wrappers: Fast multipole implementation (stfmm3d) and direct evaluation (st3ddir) for Stokes N-body interactions
Maxwell wrappers: Fast multipole implementation (emfmm3d) and direct evaluation (em3ddir) for Maxwell N-body interactions
Laplace wrappers¶
This subroutine computes the N-body Laplace interactions and its gradients in three dimensions where the interaction kernel is given by \(1/r\)
where \(c_{j}\) are the charge densities \(v_{j}\) are the dipole orientation vectors, and \(x_{j}\) are the source locations. When \(x=x_{j}\), the term corresponding to \(x_{j}\) is dropped from the sum.
def lfmm3d(*,eps,sources,charges=None,dipvec=None,targets=None,pg=0,pgt=0,nd=1)
Wrapper for fast multipole implementation for Laplace N-body interactions.
Args:
- eps: double
precision requested
- sources: double(3,n)
source locations, \(x_{j}\)
- charges: double(n,) or double(nd,n)
charge densities, \(c_{j}\)
- dipvec: double(3,n) or double(nd,3,n)
dipole orientation vectors, \(v_{j}\)
- nd: integer
number of charge/dipole vectors
- pg: integer
- source eval flagpotential at sources evaluated if pg = 1potenial and gradient at sources evaluated if pg=2
- targets: double(3,nt)
target locations (\(t_{i}\)) (optional)
- pgt: integer
- target eval flag (optional)potential at targets evaluated if pgt = 1potenial and gradient at targets evaluated if pgt=2
Returns: The subroutine returns an object out of type Output with the following variables
out.pot: potential at source locations, if requested, \(u(x_{j})\)
out.grad: gradient at source locations, if requested, \(\nabla u(x_{j})\)
out.pottarg: potential at target locations, if requested, \(u(t_{i})\)
out.gradtarg: gradient at target locations, if requested, \(\nabla u(t_{i})\)
Wrapper for direct evaluation of Laplace N-body interactions. Note that this wrapper only returns potentials and gradients at the target locations.
def l3ddir(*,sources,charges=None,dipvec=None,targets=None,pgt=0,nd=1)
Example:
see
lfmm3d_example.py
Helmholtz wrappers¶
This subroutine computes the N-body Helmholtz interactions and its gradients in three dimensions where the interaction kernel is given by \(e^{ikr}/r\)
where \(c_{j}\) are the charge densities \(v_{j}\) are the dipole orientation vectors, and \(x_{j}\) are the source locations. When \(x=x_{j}\), the term corresponding to \(x_{j}\) is dropped from the sum.
def hfmm3d(*,eps,zk,sources,charges=None,dipvec=None,targets=None,pg=0,pgt=0,nd=1)
Wrapper for fast multipole implementation for Helmholtz N-body interactions.
Args:
- eps: double
precision requested
- zk: complex
Helmholtz parameter, k
- sources: double(3,n)
source locations, \(x_{j}\)
- charges: complex(n,) or complex(nd,n)
charge densities, \(c_{j}\)
- dipvec: complex(3,n) or complex(nd,3,n)
dipole orientation vectors, \(v_{j}\)
- nd: integer
number of charge/dipole vectors
- pg: integer
- source eval flagpotential at sources evaluated if pg = 1potenial and gradient at sources evaluated if pg=2
- targets: double(3,nt)
target locations, \(t_{i}\) (optional)
- pgt: integer
- target eval flag (optional)potential at targets evaluated if pgt = 1potenial and gradient at targets evaluated if pgt=2
Returns: The subroutine returns an object out of type Output with the following variables
out.pot: potential at source locations, if requested, \(u(x_{j})\)
out.grad: gradient at source locations, if requested, \(\nabla u(x_{j})\)
out.pottarg: potential at target locations, if requested, \(u(t_{i})\)
out.gradtarg: gradient at target locations, if requested, \(\nabla u(t_{i})\)
Wrapper for direct evaluation of Helmholtz N-body interactions. Note that this wrapper only returns potentials and gradients at the target locations.
def h3ddir(*,zk,sources,charges=None,dipvec=None,targets=None,pgt=0,nd=1)
Example:
see
hfmm3d_example.py
Stokes wrappers¶
Let \(\mathcal{G}^{\textrm{stok}}(x,y)\) denote the Stokeslet given by
and \(\mathcal{T}^{\textrm{stok}}(x,y)\) denote the Stresslet whose action on a vector \(v\) is given by
This subroutine computes the N-body Stokes interactions, its gradients and the corresponding pressure in three dimensions given by
where \(\sigma_{j}\) are the Stokeslet densities, \(\nu_{j}\) are the stresslet orientation vectors, \(\mu_{j}\) are the stresslet densities, and \(x_{j}\) are the source locations. When \(x=x_{j}\), the term corresponding to \(x_{j}\) is dropped from the sum.
def stfmm3d(*,eps,sources,stoklet=None,strslet=None,strsvec=None,targets=None,ifppreg=0,ifppregtarg=0,nd=1)
Wrapper for fast multipole implementation for Stokes N-body interactions.
Args:
- eps: double
precision requested
- sources: float(3,n)
source locations
- stoklet: float(nd,3,n) or float(3,n)
Stokeslet charge strengths (\(\sigma_{j}\) above)
- strslet: float(nd,3,n) or float(3,n)
stresslet strengths (\(\mu_{j}\) above)
- strsvec: float(nd,3,n) or float(3,n)
stresslet orientations (\(\nu_{j}\) above)
- targets: float(3,nt)
target locations (x)
- ifppreg: integer
- flag for evaluating potential, gradient, and pressure at sourcespotential at sources evaluated if ifppreg = 1potential and pressure at sources evaluated if ifppreg=2potential, pressure and gradient at sources evaluated if ifppreg=3
- ifppregtarg: integer
- flag for evaluating potential, gradient, and pressure at targetspotential at targets evaluated if ifppregtarg = 1potential and pressure at targets evaluated if ifppregtarg = 2potential, pressure and gradient at targets evaluated if ifppregtarg = 3
Returns:
out.pot: velocity at source locations if requested
out.pre: pressure at source locations if requested
out.grad: gradient of velocity at source locations if requested
out.pottarg: velocity at target locations if requested
out.pretarg: pressure at target locations if requested
out.gradtarg: gradient of velocity at target locations if requested
Wrapper for direct evaluation of Stokes N-body interactions. Note that this wrapper only returns potentials and gradients at the target locations.
def st3ddir(*,eps,sources,stoklet=None,strslet=None,strsvec=None,targets=None,ifppreg=0,ifppregtarg=0,nd=1,thresh=1e-16):
Example:
see
stfmm3d_example.py
Maxwell wrappers¶
This subroutine computes the N-body Maxwell interactions, its curl and its divergence in three dimensions given by
where \(M_{j}\) are the magnetic current densities, \(J_{j}\) are the electric current densities, \(\rho_{j}\) are the electric charge densities, and \(x_{j}\) are the source locations. When \(x=x_{j}\), the term corresponding to \(x_{j}\) is dropped from the sum.
def emfmm3d(*,eps,zk,sources,h_current=None,e_current=None,e_charge=None,targets=None,ifE=0,ifcurlE=0,ifdivE=0,nd=1):
Wrapper for fast multipole implementation for Maxwell N-body interactions. Note that this wrapper only returns fields, divergences, and curls at the target locations.
Args:
- eps: double
precision requested
- zk: complex
Wavenumber, k
- sources: float(3,n)
source locations
- h_current: complex(3,n) or complex(nd,3,n)
Magnetic currents, \(M_{j}\)
- e_current: complex(3,n) or complex(nd,3,n)
Electric currents, \(J_{j}\)
- e_charge: complex(n,) or complex(nd,n)
Electric charges, \(\rho_{j}\)
- targets: float(3,nt)
target locations, \(t_{i}\)
- ifE: integer
E is returned at the target locations if ifE = 1
- ifcurlE: integer
curl E is returned at the target locations if ifcurlE = 1
- ifdivE: integer
div E is returned at the target locations if ifdivE = 1
Returns:
out.E: E field defined above at target locations if requested \((E(t_{j}))\)
out.curlE: curl of E field at target locations if requested \((\nabla \times E(t_{j}))\)
out.divE: divergence of E at target locations if requested \((\nabla \cdot E(t_{j}))\)
Wrapper for direct evaluation of Maxwell N-body interactions. Note that this wrapper only returns fields, divergences, and curls at the target locations.
def em3ddir(*,eps,zk,sources,h_current=None,e_current=None,e_charge=None,targets=None,ifE=0,ifcurlE=0,ifdivE=0,nd=1,thresh=1e-16):
Example:
see
emfmm3d_example.py