# 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:

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

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

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)

mins, maxs and origin are given as tuples/lists

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

half space pml

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

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)

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 = None, dims2: object = None)

tensor product of two pml transformations

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.