Perfectly Matched Layers

Perfectly Matched Layers are now implemented in NGSolve via a complex mesh deformation. All pre-implemented PMLs are of the form

\[\hat x(x):=x+i\alpha d(x)\]

where \(d(x)\) is some distance function and \(\alpha\) is the scaling parameter.

Creating a PML Transformation

A PML transformation is a mesh independent object, which can be created using its generator function defined in the python module comp.pml.

class ngsolve.comp.pml.PML

Base PML object

can only be created by generator functions. Use PML(x, [y, z]) to evaluate the scaling.

property Det_CF

the determinant of the jacobian as coefficient function

property JacInv_CF

the inverse of the jacobian as coefficient function

property Jac_CF

the jacobian of the PML as coefficient function

property PML_CF

the scaling as coefficient function

call_jacobian(*args) → ngsolve.bla.MatrixC

evaluate PML jacobian at point x, [y, z]

property dim

dimension

Pre-implemented scalings

The following scalings are available by default:

ngsolve.comp.pml.Radial(origin: object, rad: float = 1, alpha: complex = 1j) → ngsolve.comp.pml.PML

radial pml transformation

origin is a list/tuple with as many entries as dimenson

ngsolve.comp.pml.Cartesian(mins: object, maxs: object, alpha: complex = 1j) → ngsolve.comp.pml.PML

cartesian pml transformation

mins and maxs are tuples/lists determining the dimension

ngsolve.comp.pml.BrickRadial(mins: object, maxs: object, origin: object = (0.0, 0.0, 0.0), alpha: complex = 1j) → ngsolve.comp.pml.PML

radial pml on a brick

mins, maxs and origin are given as tuples/lists

ngsolve.comp.pml.HalfSpace(point: object, normal: object, alpha: complex = 1j) → ngsolve.comp.pml.PML

half space pml

scales orthogonal to specified plane in direction of normal point and normal are given as tuples/lists determining the dimension

Creating your own scaling

Aside from the pre-implemented scalings, one can also create scalings using coefficient functions or combine available PMLs.

ngsolve.comp.pml.Custom(trafo: ngsolve.fem.CoefficientFunction, jac: ngsolve.fem.CoefficientFunction) → ngsolve.comp.pml.PML

custom pml transformation

trafo and jac are coefficient functions of the scaling and the jacobian

ngsolve.comp.pml.Compound(pml1: ngsolve.comp.pml.PML, pml2: ngsolve.comp.pml.PML, dims1: object = <ngsolve.ngstd.DummyArgument>, dims2: object = <ngsolve.ngstd.DummyArgument>) → ngsolve.comp.pml.PML

tensor product of two pml transformations

dimensions are optional, given as tuples/lists and start with 1

PML transformations can be added using the + operator.

Applying the Transformation to a Mesh

A PML object pmlobj can be applied to a mesh m on domain domain using

m.SetPML(pmlobj,'domain')

After this is done all (symbolic) integrators will respect the additional complex transformation. Note that right now PMLs are tested on H1 spaces only.

Caution

Evaluating coordinate coefficient functions on complex mapped integration points will result only in evaluation of their real part. Thus, using non constant coefficient functions in the PML domain should be handled with caution.