.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "example_gallery/auto_examples/basic/face_area_vectors.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_example_gallery_auto_examples_basic_face_area_vectors.py: Inspect oriented face area vectors ================================== This tutorial computes oriented area vectors on a surface mesh and compares them with ``face_areas() * face_normals()``. It is a good first example when you want to understand what ``face_area_vectors()`` represents geometrically. .. GENERATED FROM PYTHON SOURCE LINES 11-13 Imports ------- .. GENERATED FROM PYTHON SOURCE LINES 13-20 .. code-block:: Python import numpy as np import pyvista as pv import torch import graphlow .. GENERATED FROM PYTHON SOURCE LINES 21-23 Step 1: Build a small volume mesh and extract its surface --------------------------------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 23-34 .. code-block:: Python def make_volume_grid() -> pv.UnstructuredGrid: """Create a small warped hexahedral grid.""" x = np.array([0.0, 1.0, 2.2, 3.5], dtype=np.float32) y = np.array([0.0, 0.8, 1.7], dtype=np.float32) z = np.array([0.0, 0.6, 1.4], dtype=np.float32) X, Y, Z = np.meshgrid(x, y, z, indexing="ij") Z = Z + 0.12 * X * Y grid = pv.StructuredGrid(X, Y, Z) return grid.cast_to_unstructured_grid() .. GENERATED FROM PYTHON SOURCE LINES 35-37 Step 2: Compute area vectors, normals, and areas ------------------------------------------------ .. GENERATED FROM PYTHON SOURCE LINES 37-77 .. code-block:: Python def main() -> None: """Run the tutorial.""" volume_mesh = graphlow.from_pyvista(make_volume_grid(), backend="torch") surface_mesh = volume_mesh.extract_surface() face_centroids = surface_mesh.geometry.face_centroids() face_area_vectors = surface_mesh.geometry.face_area_vectors() face_normals = surface_mesh.geometry.face_normals() face_areas = surface_mesh.geometry.face_areas() reconstructed = face_normals * face_areas print(f"Surface face count: {surface_mesh.n_cells}") print(f"face_area_vectors shape: {tuple(face_area_vectors.shape)}") print( "face_area_vectors == face_normals * face_areas: " f"{torch.allclose(face_area_vectors, reconstructed)}" ) print(f"First area vector: {face_area_vectors[0].tolist()}") plotter = pv.Plotter(window_size=[900, 700]) plotter.add_mesh( surface_mesh.pvmesh, show_edges=True, color="white", opacity=0.85, ) plotter.add_arrows( face_centroids.detach().cpu().numpy(), face_area_vectors.detach().cpu().numpy(), mag=0.35, color="tomato", ) plotter.show_bounds(mesh=surface_mesh.pvmesh, location="outer") plotter.camera_position = "iso" plotter.show() if __name__ == "__main__": main() .. image-sg:: /example_gallery/auto_examples/basic/images/sphx_glr_face_area_vectors_001.png :alt: face area vectors :srcset: /example_gallery/auto_examples/basic/images/sphx_glr_face_area_vectors_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none Surface face count: 32 face_area_vectors shape: (32, 3) face_area_vectors == face_normals * face_areas: True First area vector: [0.03840000182390213, 0.04800000041723251, -0.800000011920929] .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.202 seconds) .. _sphx_glr_download_example_gallery_auto_examples_basic_face_area_vectors.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: face_area_vectors.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: face_area_vectors.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: face_area_vectors.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_