Load custom data in DPF#

This tutorial shows how to represent your custom data in DPF data storage structures.

To import your custom data in DPF, you must create a DPF data structure to store it. DPF uses Field and FieldsContainer objects to handle data. The Field is a homogeneous array and a FieldsContainer is a labeled collection of Field objects. For more information on DPF data structures, see the DPF data structures tutorials section.

Define the data#

Create Python lists with the data to be stored in the Fields.

# Data for the scalar Fields (lists with 1 and 2 dimensions)
data_1 = [6.0, 5.0, 4.0, 3.0, 2.0, 1.0]
data_2 = [[12.0, 7.0, 8.0], [9.0, 31.0, 1.0]]

# Data for the vector Fields (lists with 1 and 2 dimensions)
data_3 = [4.0, 1.0, 8.0, 5.0, 7.0, 9.0]
data_4 = [6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 9.0, 7.0, 8.0, 10.0]
data_5 = [[8.0, 4.0, 3.0], [31.0, 5.0, 7.0]]

# Data for the matrix Fields
data_6 = [3.0, 2.0, 1.0, 7.0]
data_7 = [15.0, 3.0, 9.0, 31.0, 1.0, 42.0, 5.0, 68.0, 13.0]
data_8 = [[12.0, 7.0, 8.0], [1.0, 4.0, 27.0], [98.0, 4.0, 6.0]]

Create Python lists with the data to be appended to the Fields.

# Data for the scalar Fields
data_9 = [24.0]

# Data for the vector Fields
data_10 = [47.0, 33.0, 5.0]

# Data for the matrix Fields
data_11 = [8.0, 2.0, 4.0, 64.0, 32.0, 47.0, 11.0, 23.0, 1.0]

Import the PyDPF-Core library#

Import the ansys.dpf.core module.

from ansys.dpf import core as dpf

Define the Fields sizing#

A Field must always be given:

Define the number of entities for scalar, vector, and matrix Fields.

# Scalar Fields: 6 entities with 1 component each
num_entities_1 = 6

# Vector Fields: 2 entities with 3 or 5 components each
num_entities_2 = 2

# Matrix Fields: 1 entity
num_entities_3 = 1

Create scalar Fields#

Create a scalar Field by instantiating the Field object

The default nature of the Field object is 'vector'. Use the nature argument or the Field.dimensionality method to create a scalar Field.

# Instantiate the Field with a scalar nature
field_11 = dpf.Field(nentities=num_entities_1, nature=dpf.common.natures.scalar)

# Set the scoping ids
field_11.scoping.ids = range(num_entities_1)

# Print the Field
print("Scalar Field: ", "\n", field_11, "\n")
Scalar Field:
 DPF  Field
  Location: Nodal
  Unit:
  6 entities
  Data: 1 components and 0 elementary data

Instantiate the Field and use the dimensionality method to set scalar nature.

field_12 = dpf.Field(nentities=num_entities_1)
field_12.dimensionality = dpf.Dimensionality([1])
field_12.scoping.ids = range(num_entities_1)
print("Scalar Field: ", "\n", field_12, "\n")
Scalar Field:
 DPF  Field
  Location: Nodal
  Unit:
  6 entities
  Data: 1 components and 0 elementary data

Create a scalar Field using the fields_factory module

Use the create_scalar_field() function. Its default nature is 'scalar' with a '1D' dimensionality.

field_13 = dpf.fields_factory.create_scalar_field(num_entities=num_entities_1)
field_13.scoping.ids = range(num_entities_1)
print("Scalar Field: ", "\n", field_13, "\n")
Scalar Field:
 DPF  Field
  Location: Nodal
  Unit:
  6 entities
  Data: 1 components and 0 elementary data

Use the field_from_array() function, which takes the data directly as input.

field_14 = dpf.fields_factory.field_from_array(arr=data_1)
field_14.scoping.ids = range(num_entities_1)
print("Scalar Field from array: ", "\n", field_14, "\n")
Scalar Field from array:
 DPF  Field
  Location: Nodal
  Unit:
  6 entities
  Data: 1 components and 6 elementary data

  IDs                   data
  ------------          ----------
  0                     6.000000e+00

  1                     5.000000e+00

  2                     4.000000e+00

  ...

Create vector Fields#

Create vector Fields by instantiating the Field object

The default nature is 'vector' and the default dimensionality is '3D'. Use the Field.dimensionality method to set a different dimensionality (here '5D').

# 3D vector Field (default dimensionality)
field_21 = dpf.Field(nentities=num_entities_2)
field_21.scoping.ids = range(num_entities_2)
print("3D vector Field: ", "\n", field_21, "\n")

# 5D vector Field
field_31 = dpf.Field(nentities=num_entities_2)
field_31.dimensionality = dpf.Dimensionality([5])
field_31.scoping.ids = range(num_entities_2)
print("5D vector Field: ", "\n", field_31, "\n")
3D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 3 components and 0 elementary data


5D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 5 components and 0 elementary data

Create vector Fields using the fields_factory module

Use the create_vector_field() function with the num_comp argument to set the dimensionality.

field_22 = dpf.fields_factory.create_vector_field(num_entities=num_entities_2, num_comp=3)
field_22.scoping.ids = range(num_entities_2)
print("3D vector Field: ", "\n", field_22, "\n")

field_32 = dpf.fields_factory.create_vector_field(num_entities=num_entities_2, num_comp=5)
field_32.scoping.ids = range(num_entities_2)
print("5D vector Field: ", "\n", field_32, "\n")
3D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 3 components and 0 elementary data


5D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 5 components and 0 elementary data

Use the create_3d_vector_field() function to create a 3D vector Field directly.

field_25 = dpf.fields_factory.create_3d_vector_field(num_entities=num_entities_2)
field_25.scoping.ids = range(num_entities_2)
print("3D vector Field: ", "\n", field_25, "\n")
3D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 3 components and 0 elementary data

Create matrix Fields#

Use the create_matrix_field() function from the fields_factory module. Use the num_lines and num_col arguments to define the matrix dimensionality.

# (2, 2) matrix Field
field_41 = dpf.fields_factory.create_matrix_field(
    num_entities=num_entities_3, num_lines=2, num_col=2
)
field_41.scoping.ids = range(num_entities_3)
print("Matrix Field (2,2): ", "\n", field_41, "\n")

# (3, 3) matrix Fields
field_51 = dpf.fields_factory.create_matrix_field(
    num_entities=num_entities_3, num_lines=3, num_col=3
)
field_51.scoping.ids = range(num_entities_3)

field_52 = dpf.fields_factory.create_matrix_field(
    num_entities=num_entities_3, num_lines=3, num_col=3
)
field_52.scoping.ids = range(num_entities_3)

print("Matrix Field 1 (3,3): ", "\n", field_51, "\n")
print("Matrix Field 2 (3,3): ", "\n", field_52, "\n")
Matrix Field (2,2):
 DPF  Field
  Location: Nodal
  Unit:
  1 entities
  Data: 4 components and 0 elementary data


Matrix Field 1 (3,3):
 DPF  Field
  Location: Nodal
  Unit:
  1 entities
  Data: 9 components and 0 elementary data


Matrix Field 2 (3,3):
 DPF  Field
  Location: Nodal
  Unit:
  1 entities
  Data: 9 components and 0 elementary data

Set data to the Fields#

Use the Field.data attribute to set a data array to a Field. The data can be a 1D or 2D Numpy array or Python list.

# Set data to the scalar Field
field_11.data = data_1
print("Scalar Field: ", "\n", field_11, "\n")
print("Data scalar Field: ", "\n", field_11.data, "\n")
Scalar Field:
 DPF  Field
  Location: Nodal
  Unit:
  6 entities
  Data: 1 components and 6 elementary data

  IDs                   data
  ------------          ----------
  0                     6.000000e+00

  1                     5.000000e+00

  2                     4.000000e+00

  ...



Data scalar Field:
 [6. 5. 4. 3. 2. 1.]

Set data to the vector Fields.

field_21.data = data_3
print("3D vector Field: ", "\n", field_21, "\n")

field_31.data = data_4
print("5D vector Field: ", "\n", field_31, "\n")

# Set 2D data to a 3D vector Field
field_22.data = data_5
print("3D vector Field (from 2D list): ", "\n", field_22, "\n")
3D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 3 components and 2 elementary data

  IDs                   data
  ------------          ----------
  0                     4.000000e+00   1.000000e+00   8.000000e+00

  1                     5.000000e+00   7.000000e+00   9.000000e+00




5D vector Field:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 5 components and 2 elementary data

  IDs                   data
  ------------          ----------
  0                     6.000000e+00   5.000000e+00   4.000000e+00   3.000000e+00   2.000000e+00

  1                     1.000000e+00   9.000000e+00   7.000000e+00   8.000000e+00   1.000000e+01




3D vector Field (from 2D list):
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 3 components and 2 elementary data

  IDs                   data
  ------------          ----------
  0                     8.000000e+00   4.000000e+00   3.000000e+00

  1                     3.100000e+01   5.000000e+00   7.000000e+00

Set data to the matrix Fields.

field_41.data = data_6
print("Matrix Field (2,2): ", "\n", field_41.data, "\n")

field_51.data = data_7
print("Matrix Field 1 (3,3): ", "\n", field_51.data, "\n")

field_52.data = data_8
print("Matrix Field 2 (3,3): ", "\n", field_52.data, "\n")
Matrix Field (2,2):
 [[3. 2. 1. 7.]]

Matrix Field 1 (3,3):
 [[15.  3.  9. 31.  1. 42.  5. 68. 13.]]

Matrix Field 2 (3,3):
 [[12.  7.  8.  1.  4. 27. 98.  4.  6.]]

Append data to the Fields#

Use the append() method to add a new entity with data to the Field. You must provide the scopingid that this entity will have.

# Append data to the scalar Field
field_11.append(scopingid=6, data=data_9)
print("Scalar Field after append: ", "\n", field_11, "\n")
print("Data scalar Field: ", "\n", field_11.data, "\n")
Scalar Field after append:
 DPF  Field
  Location: Nodal
  Unit:
  7 entities
  Data: 1 components and 7 elementary data

  IDs                   data
  ------------          ----------
  0                     6.000000e+00

  1                     5.000000e+00

  2                     4.000000e+00

  ...



Data scalar Field:
 [ 6.  5.  4.  3.  2.  1. 24.]

Append data to a vector Field.

field_21.append(scopingid=2, data=data_10)
print("Vector Field after append: ", "\n", field_21, "\n")
Vector Field after append:
 DPF  Field
  Location: Nodal
  Unit:
  3 entities
  Data: 3 components and 3 elementary data

  IDs                   data
  ------------          ----------
  0                     4.000000e+00   1.000000e+00   8.000000e+00

  1                     5.000000e+00   7.000000e+00   9.000000e+00

  2                     4.700000e+01   3.300000e+01   5.000000e+00

Append data to a matrix Field.

field_51.append(scopingid=1, data=data_11)
print("Matrix Field after append: ", "\n", field_51, "\n")
Matrix Field after append:
 DPF  Field
  Location: Nodal
  Unit:
  2 entities
  Data: 9 components and 2 elementary data

  IDs                   data
  ------------          ----------
  0                     1.500000e+01   3.000000e+00   9.000000e+00   3.100000e+01   1.000000e+00   4.200000e+01   5.000000e+00   6.800000e+01   1.300000e+01

  1                     8.000000e+00   2.000000e+00   4.000000e+00   6.400000e+01   3.200000e+01   4.700000e+01   1.100000e+01   2.300000e+01   1.000000e+00

Create a FieldsContainer#

A FieldsContainer is a collection of Field objects ordered by labels. Each Field in the FieldsContainer has an ID for each label.

The most common FieldsContainer use the label 'time' with IDs corresponding to time sets.

Create a FieldsContainer by instantiating the object

After instantiation, set the labels and then add fields with their label space.

fc_1 = dpf.FieldsContainer()
fc_1.add_label(label="time")
fc_1.add_field(label_space={"time": 0}, field=field_21)
fc_1.add_field(label_space={"time": 1}, field=field_31)
print(fc_1)
DPF  Fields Container
  with 2 field(s)
  defined on labels: time

  with:
  - field 0 {time:  0} with Nodal location, 3 components and 3 entities.
  - field 1 {time:  1} with Nodal location, 5 components and 2 entities.

Create a FieldsContainer using the fields_container_factory module

Use the over_time_freq_fields_container() function to create a FieldsContainer with a predefined 'time' label.

fc_2 = dpf.fields_container_factory.over_time_freq_fields_container(fields=[field_21, field_31])
print(fc_2)
DPF  Fields Container
  with 2 field(s)
  defined on labels: time

  with:
  - field 0 {time:  1} with Nodal location, 3 components and 3 entities.
  - field 1 {time:  2} with Nodal location, 5 components and 2 entities.

Total running time of the script: (0 minutes 0.436 seconds)

Gallery generated by Sphinx-Gallery