Field normalisation#

Apart from setting the value of a field, it is sometimes necessary to normalise it to a certain value. Also sometimes in the case of vector fields, it is required to set the value of certain points in the mesh to be zero. This can be achieved using discretisedfield.Field.norm.

[1]:
import discretisedfield as df

p1 = (-50, -50, -50)
p2 = (50, 50, 50)
cell = (5, 5, 5)
mesh = df.Mesh(p1=p1, p2=p2, cell=cell)

value = (1, 1, 1)
field = df.Field(mesh, nvdim=3, value=value)

Asking for a norm of the field returns a scalar field with norm values.

[2]:
field.norm
[2]:
Field
  • Mesh
    • Region
      • pmin = [-50, -50, -50]
      • pmax = [50, 50, 50]
      • dims = ['x', 'y', 'z']
      • units = ['m', 'm', 'm']
    • n = [20, 20, 20]
  • nvdim = 1
[3]:
field.nvdim
[3]:
3
[4]:
field.norm(field.mesh.region.random_point())
[4]:
array([1.73205081])

If we want to normalise the field with a new value, we write

[5]:
field.norm = 1

The new value of the field is

[6]:
field(field.mesh.region.random_point())
[6]:
array([0.57735027, 0.57735027, 0.57735027])

and the norm is

[7]:
field.norm(field.mesh.region.random_point())
[7]:
array([1.])

If we now change the value of the field, the norm is not valid anymore

[8]:
field.update_field_values((-1, -1, 10))
field.norm(field.mesh.region.random_point())
[8]:
array([10.09950494])

Instead of a constant, a Pyhton function or another field object can be used to set up the norm. Let us say we want to define a sphere inside the mesh of radius 50. This means that the norm of the field outside the sphere is zero and inside it is 1.

[9]:
def norm_function(pos):
    x, y, z = pos
    if x**2 + y**2 + z**2 <= 50**2:
        return 1
    else:
        return 0


sphere_field = df.Field(mesh, nvdim=3, value=(10, 0, 0), norm=norm_function)

If we sample the value of the field outside the sphere we get

[10]:
sphere_field((-50, -50, -50))
[10]:
array([0., 0., 0.])
[11]:
sphere_field((0, 0, 0))
[11]:
array([1., 0., 0.])