Read mesh from file (vtu or xdmf) into pyvista mesh#

from ogstools import examples

To read your own data as a mesh series you can do:

from ogstools.meshlib import MeshSeries
mesh_series = MeshSeries("filepath/filename_pvd_or_xdmf")

MeshSeries takes as mandatory argument a str OR pathlib.Path that represents the location of the pvd or xdmf file. Here, we load example data:

ms = examples.load_meshseries_HT_2D_XDMF()
ms  # print MeshSeries meta information
MeshSeries:
filepath:       /builds/ogs/tools/ogstools/ogstools/examples/meshseries/2D_single_fracture_HT_2D_single_fracture.xdmf
spatial_unit:   m
data_type:      xdmf
timevalues:     0.0s to 0.0s in 97 steps
reader:         <ogstools.meshlib.xdmf_reader.XDMFReader object at 0x7cebde6dd990>
rawdata_file:   /builds/ogs/tools/ogstools/ogstools/examples/meshseries/2D_single_fracture_HT.h5

Accessing time values#

All time value (in seconds) are within a range (e.g. can be converted to list) Python slicing is supported.

print(f"First 3 time values are: {ms.timevalues()[:3]}.")

# Accessing a specific time step

timestep = 10

print(f"Time value at step {timestep} is {ms.timevalues()[timestep]} s.")
First 3 time values are: [   0.  900. 1800.].
Time value at step 10 is 9000.0 s.

To get a single mesh at a specified timestep. Read data is cached.

mesh_ts10 = ms.mesh(timestep)

# The mesh taken from a specific time step of the mesh series is a pyvista mesh
# Here we use pyvista functionality plot.

mesh_ts10.plot(show_edges=True)
plot meshseries

You can select a time steps with the [] operator This example shows the last time step (result) and shows meta information about the mesh.

print(ms[-1])
Mesh (0x7cebde66ed40)
  N Cells:    171
  N Points:   190
  X Bounds:   0.000e+00, 1.000e+01
  Y Bounds:   0.000e+00, 2.000e+01
  Z Bounds:   0.000e+00, 0.000e+00
  N Arrays:   4

MeshSeries from PVD file#

ms = examples.load_meshseries_THM_2D_PVD()
ms.mesh(0).plot()
plot meshseries

Accessing Variables#

A MeshSeries provides access to all values of variable at all time steps.

  1. mesh - Get a PyVista mesh at a specific time step and use PyVista functions (e.g., cell_data). - Efficient for a small set of timesteps, but all data is needed. - ogstools.meshlib.mesh_series.MeshSeries.mesh - ogstools.meshlib.mesh_series.MeshSeries.__getitem__

  2. data[] - Get a specific variable over a specific time range. - Efficient (only XDMF) for a large set of timesteps , but a small amount of cells / points is needed. - ogstools.meshlib.mesh_series.MeshSeries.data

#
# Indexing with data()
# --------------------
# `MeshSeries.data("<variable_name>")`` returns an object, that behaves like a
# `Numpy ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_.
# It allows `multidimensional indexing on ndarrays <https://numpy.org/doc/stable/user/basics.indexing.html>`_
# beyond `Python slicing <https://www.geeksforgeeks.org/python-list-slicing/>`_.

# Typically, the first dimension is the time step, second dimension is the number of points/cells,
# and the last dimension is the number of components of the variable.
#
# Be aware that dimensions of length 1 are omitted, obeying to the rules of
# `Indexing on ndarrays <https://numpy.org/doc/stable/user/basics.indexing.html>`_.
# Data does not work for geometry/points or topology/cells).

ms = examples.load_meshseries_HT_2D_XDMF()
# This mesh series has 97 time steps and 190 points.
# Temperature is a scalar, Darcy velocity is a vector with 2 components. Both are defined at points.

# 1. No range for a dimension (just single time step) -> this dimension gets omitted
ms.data("temperature")[1, :]  # shape is (190,)
# 2. Select range with length for a dimension to keep dimension
ms.data("temperature")[1:2, :]  # shape is (1, 190)
# 3. Select all values for all dimensions
ms.data("temperature")[:]  # shape is (97,190)
# 4. Negative indices are allow - here we select last 2 steps
ms.data("darcy_velocity")[-2:, 1:4, :]  # shape is(2, 3, 2)
# 5. Use select to get a specific range of time steps
temp_on_some_point = ms.data("temperature")[1:3, 2:5]  # shape is (2,3)
print(
    f"Temperature at time steps 1 and 2 for points 2, 3 and 4: {temp_on_some_point}"
)
Temperature at time steps 1 and 2 for points 2, 3 and 4: [[353.00036868 303.         353.        ]
 [353.00012081 303.         353.        ]]

Values function#

Convenience function to get all values of a variable. See ogstools.meshlib.mesh_series.MeshSeries.values.

dv_all = ms.values("darcy_velocity")
print(
    f"Shape of darcy_velocity (time steps, num of points, x and y): {dv_all.shape}"
)
# temperature is a scalar - the last dimension of length 1 is omitted
t_all = ms.values("temperature")
print(f"Shape of temperature (time steps, num of points): {t_all.shape}")
Shape of darcy_velocity (time steps, num of points, x and y): (97, 190, 2)
Shape of temperature (time steps, num of points): (97, 190)

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