Mesh plane and line#

It is sometimes necessary to get the coordinates of points, which are equally spaced on a line. Those values can then be used for sampling fields. In discretisedfield, this can be obtained using line.

line takes 3 input arguments:

  • points p1 and p2 between which the line spans,

  • the number of points on the line n.

The mesh we are going to use as an example is:

[1]:
import discretisedfield as df

p1 = (0, 0, 0)
p2 = (100e-9, 50e-9, 20e-9)
n = (20, 10, 4)

region = df.Region(p1=p1, p2=p2)
mesh = df.Mesh(region=region, n=n)

Let us say we want to get the coordinates of 11 (n=11) points on the line, which spans between \((0, 0, 0)\) and \((100\,\text{nm}, 0, 20\,\text{nm})\).

[2]:
# NBVAL_IGNORE_OUTPUT
mesh.line(p1=(0, 0, 0), p2=(100e-9, 0, 20e-9), n=11)
[2]:
<generator object Mesh.line at 0x7f856491c970>

This method returns a generator, which we can use as an iterator (for instance, in for loops). The coordinates of points are:

[3]:
line = mesh.line(p1=(0, 0, 0), p2=(100e-9, 0, 20e-9), n=11)
list(line)
[3]:
[(0.0, 0.0, 0.0),
 (1e-08, 0.0, 2e-09),
 (2e-08, 0.0, 4e-09),
 (3.0000000000000004e-08, 0.0, 6.000000000000001e-09),
 (4e-08, 0.0, 8e-09),
 (5e-08, 0.0, 1e-08),
 (6.000000000000001e-08, 0.0, 1.2000000000000002e-08),
 (7e-08, 0.0, 1.4000000000000001e-08),
 (8e-08, 0.0, 1.6e-08),
 (9e-08, 0.0, 1.8000000000000002e-08),
 (1e-07, 0.0, 2e-08)]

When asking for a mesh to give us the points on a line, both points p1 and p2 must belong to the mesh. For instance, if we ask for the following line:

[4]:
p1 = (0, 0, 0)
p2 = (100e-9, 100e-9, 100e-9)

try:
    list(mesh.line(p1=p1, p2=p2, n=10))
except ValueError:
    print("Exception raised.")
Exception raised.

This is because point p2 does not belong to the mesh region (mesh.region):

[5]:
p2 in mesh.region
[5]:
False

Plane mesh#

Similar to the line, we usually need to extract a plane-mesh. This method we later use for slicing fields and extracting the values of a field on the plane.

Plane mesh is obtained using sel method. The planes allowed must be perpendicular to the geometrical axes. Therefore, to extract a plane, we need to define the axis to which the plane is perpendicular to as well as the point at which the plane intersects the axis. For example, for a three-dimensional geometry, we want to extract the plane perpendicular to the z-axis (in the xy-plane), which intersects it at \(2.5\,\text{nm}\):

[6]:
mesh.sel(z=2.5e-9)
[6]:
Mesh
  • Region
    • pmin = [0.0, 0.0]
    • pmax = [1e-07, 5e-08]
    • dims = ['x', 'y']
    • units = ['m', 'm']
  • n = [20, 10]

This method returns a mesh object, which consists no cells in the z-direction and keeps the same number of cells in x and y directions:

[7]:
mesh.sel(z=2.5e-9).n
[7]:
array([20, 10])

In other words, the discretisation cell in the plane mesh is actually two-dimensional with the same x and y dimensions of the cell in the original mesh.

The edge lengths of the resulting mesh region is:

[8]:
mesh.sel(z=2.5e-9).region.edges
[8]:
array([1.e-07, 5.e-08])

This means that the plane mesh keeps the original dimensions in x and y directions and has no “thickness”.

Another way for asking for a plane mesh is simply by passing a string 'x', 'y', or 'z', without specifying the point. In that case, the mesh is sliced through the middle of the sample:

[9]:
plane_mesh = mesh.sel("x")

plane_mesh.region.centre
[9]:
array([2.5e-08, 1.0e-08])

which is the same as the centre of the original mesh on the yz-plane:

[10]:
mesh.region.centre[1:]
[10]:
array([2.5e-08, 1.0e-08])