From 6968e2c0608a65f52b2cdca0760e0be88f453031 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Fri, 4 Apr 2025 15:48:38 +0200 Subject: [PATCH 01/57] Move vtkUtils and multiblockInspectorTreeFunctions + update dependencies --- docs/geos_posp_docs/processing.rst | 8 ++++---- .../src/geos/mesh}/multiblockInpectorTreeFunctions.py | 0 .../processing => geos-mesh/src/geos/mesh}/vtkUtils.py | 0 geos-posp/src/PVplugins/PVSurfaceGeomechanics.py | 2 +- .../src/PVplugins/PVTransferAttributesVolumeSurface.py | 4 ++-- geos-posp/src/geos_posp/filters/GeosBlockExtractor.py | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) rename {geos-posp/src/geos_posp/processing => geos-mesh/src/geos/mesh}/multiblockInpectorTreeFunctions.py (100%) rename {geos-posp/src/geos_posp/processing => geos-mesh/src/geos/mesh}/vtkUtils.py (100%) diff --git a/docs/geos_posp_docs/processing.rst b/docs/geos_posp_docs/processing.rst index 9da336b9e..c67f34e55 100644 --- a/docs/geos_posp_docs/processing.rst +++ b/docs/geos_posp_docs/processing.rst @@ -36,18 +36,18 @@ geos_posp.processing.MohrCoulomb module :undoc-members: :show-inheritance: -geos_posp.processing.multiblockInpectorTreeFunctions module +geos.mesh.multiblockInpectorTreeFunctions module --------------------------------------------------------------- -.. automodule:: geos_posp.processing.multiblockInpectorTreeFunctions +.. automodule:: geos.mesh.multiblockInpectorTreeFunctions :members: :undoc-members: :show-inheritance: -geos_posp.processing.vtkUtils module +geos.mesh.vtkUtils module ---------------------------------------- -.. automodule:: geos_posp.processing.vtkUtils +.. automodule:: geos.mesh.vtkUtils :members: :undoc-members: :show-inheritance: diff --git a/geos-posp/src/geos_posp/processing/multiblockInpectorTreeFunctions.py b/geos-mesh/src/geos/mesh/multiblockInpectorTreeFunctions.py similarity index 100% rename from geos-posp/src/geos_posp/processing/multiblockInpectorTreeFunctions.py rename to geos-mesh/src/geos/mesh/multiblockInpectorTreeFunctions.py diff --git a/geos-posp/src/geos_posp/processing/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py similarity index 100% rename from geos-posp/src/geos_posp/processing/vtkUtils.py rename to geos-mesh/src/geos/mesh/vtkUtils.py diff --git a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py index cc91a2094..0c6392d24 100644 --- a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py +++ b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py @@ -34,7 +34,7 @@ ) from geos_posp.filters.SurfaceGeomechanics import SurfaceGeomechanics -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInpectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py index 26af9867c..01c3765e4 100644 --- a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py @@ -45,11 +45,11 @@ from geos_posp.filters.TransferAttributesVolumeSurface import ( TransferAttributesVolumeSurface, ) -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInpectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos_posp.processing.vtkUtils import getAttributeSet, mergeBlocks +from geos.mesh.vtkUtils import getAttributeSet, mergeBlocks from geos.utils.Logger import Logger, getLogger from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py index 26cab3bc0..a14f53eb5 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py @@ -6,10 +6,10 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInpectorTreeFunctions import ( getBlockIndexFromName, ) -from geos_posp.processing.vtkUtils import extractBlock +from geos.mesh.processing.vtkUtils import extractBlock from geos.utils.GeosOutputsConstants import ( GeosDomainNameEnum, OutputObjectEnum, From b2d635d836c153004f9944f3c5f345a9ac5f59ca Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:24:48 +0200 Subject: [PATCH 02/57] Update dependencies and correct typo in name --- docs/geos_posp_docs/processing.rst | 4 ++-- ...orTreeFunctions.py => multiblockInspectorTreeFunctions.py} | 0 geos-mesh/src/geos/mesh/vtkUtils.py | 2 +- geos-posp/src/PVplugins/PVAttributeMapping.py | 2 +- geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py | 4 ++-- geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py | 2 +- geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py | 2 +- .../src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py | 2 +- geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py | 2 +- geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py | 2 +- geos-posp/src/PVplugins/PVMohrCirclePlot.py | 2 +- geos-posp/src/PVplugins/PVSurfaceGeomechanics.py | 2 +- geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py | 2 +- .../src/geos_posp/filters/AttributeMappingFromCellCoords.py | 2 +- geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py | 2 +- geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py | 2 +- geos-posp/src/geos_posp/filters/GeosBlockExtractor.py | 2 +- geos-posp/src/geos_posp/filters/GeosBlockMerge.py | 4 ++-- geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py | 2 +- .../src/geos_posp/filters/TransferAttributesVolumeSurface.py | 2 +- geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py | 2 +- 21 files changed, 23 insertions(+), 23 deletions(-) rename geos-mesh/src/geos/mesh/{multiblockInpectorTreeFunctions.py => multiblockInspectorTreeFunctions.py} (100%) diff --git a/docs/geos_posp_docs/processing.rst b/docs/geos_posp_docs/processing.rst index c67f34e55..2a39993d4 100644 --- a/docs/geos_posp_docs/processing.rst +++ b/docs/geos_posp_docs/processing.rst @@ -36,10 +36,10 @@ geos_posp.processing.MohrCoulomb module :undoc-members: :show-inheritance: -geos.mesh.multiblockInpectorTreeFunctions module +geos.mesh.multiblockInspectorTreeFunctions module --------------------------------------------------------------- -.. automodule:: geos.mesh.multiblockInpectorTreeFunctions +.. automodule:: geos.mesh.multiblockInspectorTreeFunctions :members: :undoc-members: :show-inheritance: diff --git a/geos-mesh/src/geos/mesh/multiblockInpectorTreeFunctions.py b/geos-mesh/src/geos/mesh/multiblockInspectorTreeFunctions.py similarity index 100% rename from geos-mesh/src/geos/mesh/multiblockInpectorTreeFunctions.py rename to geos-mesh/src/geos/mesh/multiblockInspectorTreeFunctions.py diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index 09fa260c1..8ee8ad8f0 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -41,7 +41,7 @@ ) from vtkmodules.vtkFiltersExtraction import vtkExtractBlock -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/PVplugins/PVAttributeMapping.py b/geos-posp/src/PVplugins/PVAttributeMapping.py index e4532d303..ef244f1ff 100644 --- a/geos-posp/src/PVplugins/PVAttributeMapping.py +++ b/geos-posp/src/PVplugins/PVAttributeMapping.py @@ -16,7 +16,7 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.AttributeMappingFromCellCoords import ( AttributeMappingFromCellCoords, ) -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( fillPartialAttributes, getAttributeSet, getNumberOfComponents, diff --git a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py index e49c61e93..53bc3ad69 100644 --- a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py +++ b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py @@ -17,11 +17,11 @@ import vtkmodules.util.numpy_support as vnp from geos.utils.Logger import Logger, getLogger -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos_posp.processing.vtkUtils import isAttributeInObject +from geos.mesh.vtkUtils import isAttributeInObject from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py index 817d7762d..d92d5a22a 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py @@ -23,7 +23,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py index 22477abf2..3c5f4c381 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py @@ -23,7 +23,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py index 7aaabc5ae..bc55c69b7 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py @@ -23,7 +23,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py index 43882eacc..9e305a4de 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py @@ -26,7 +26,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py index bbbd96965..2804720fb 100644 --- a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py +++ b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py @@ -14,7 +14,7 @@ sys.path.append( parent_dir_path ) from geos.utils.Logger import Logger, getLogger -from geos_posp.processing.vtkUtils import mergeBlocks +from geos.mesh.vtkUtils import mergeBlocks from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVMohrCirclePlot.py b/geos-posp/src/PVplugins/PVMohrCirclePlot.py index 90693c3d2..e44176472 100644 --- a/geos-posp/src/PVplugins/PVMohrCirclePlot.py +++ b/geos-posp/src/PVplugins/PVMohrCirclePlot.py @@ -41,7 +41,7 @@ DEFAULT_FRICTION_ANGLE_RAD, DEFAULT_ROCK_COHESION, ) -from geos_posp.processing.vtkUtils import getArrayInObject, mergeBlocks +from geos.mesh.vtkUtils import getArrayInObject, mergeBlocks from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) from geos_posp.visu.PVUtils.DisplayOrganizationParaview import ( diff --git a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py index 85aa088fb..945aa59bf 100644 --- a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py +++ b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py @@ -19,7 +19,7 @@ DEFAULT_ROCK_COHESION, ) from geos_posp.filters.SurfaceGeomechanics import SurfaceGeomechanics -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py index 88ffc1b7f..6bd65d398 100644 --- a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py @@ -15,7 +15,7 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.TransferAttributesVolumeSurface import ( TransferAttributesVolumeSurface, ) -from geos.mesh.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py index 11332d1f5..296ac6b1b 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py @@ -22,7 +22,7 @@ vtkUnstructuredGrid, ) -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( computeCellCenterCoordinates, createEmptyAttribute, getVtkArrayInObject, diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py index 65cf46726..30e63ecf2 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py @@ -10,7 +10,7 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid -from geos_posp.processing.vtkUtils import createAttribute, getArrayInObject +from geos.mesh.vtkUtils import createAttribute, getArrayInObject __doc__ = """ AttributeMappingFromCellId module is a vtk filter that transfer a attribute from a diff --git a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py index cdd44a345..208b98462 100644 --- a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py +++ b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py @@ -31,7 +31,7 @@ ) from vtkmodules.vtkFiltersCore import vtkCellCenters -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( createAttribute, getArrayInObject, getComponentNames, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py index 99ece9b43..bfd2f57f7 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py @@ -11,7 +11,7 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet -from geos.mesh.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getBlockIndexFromName, ) from geos.mesh.vtkUtils import extractBlock diff --git a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py index cf87c650b..dbf4c7773 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py @@ -33,9 +33,9 @@ from vtkmodules.vtkFiltersGeometry import vtkDataSetSurfaceFilter from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane -from geos_posp.processing.multiblockInpectorTreeFunctions import ( +from geos.mesh.multiblockInspectorTreeFunctions import ( getElementaryCompositeBlockIndexes, ) -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( createConstantAttribute, extractBlock, fillAllPartialAttributes, diff --git a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py index 849b14e41..c2c47b8bc 100644 --- a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py +++ b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py @@ -33,7 +33,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( createAttribute, getArrayInObject, getAttributeSet, diff --git a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py index 1a2d911d6..5572a3456 100644 --- a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py +++ b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py @@ -19,7 +19,7 @@ from vtkmodules.vtkCommonDataModel import vtkPolyData, vtkUnstructuredGrid from geos_posp.filters.VolumeSurfaceMeshMapper import VolumeSurfaceMeshMapper -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py index 18d30d83c..79ee01bbd 100644 --- a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py +++ b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py @@ -32,7 +32,7 @@ vtkUnstructuredGrid, ) -from geos_posp.processing.vtkUtils import ( +from geos.mesh.vtkUtils import ( getArrayInObject, isAttributeInObject, ) From 21ae37e25683bafd4487ddadf7c1a3dab2e09b7e Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 9 Apr 2025 15:51:20 +0200 Subject: [PATCH 03/57] Add SplitMesh and MergeColocatedPoints filters --- geos-mesh/pyproject.toml | 15 +- .../mesh/processing/MergeColocatedPoints.py | 127 ++++++ .../src/geos/mesh/processing/SplitMesh.py | 387 ++++++++++++++++++ geos-mesh/tests/test_MergeColocatedPoints.py | 115 ++++++ geos-mesh/tests/test_SplitMesh.py | 244 +++++++++++ geos-pv/src/PVplugins/PVSplitMesh.py | 175 ++++++++ 6 files changed, 1057 insertions(+), 6 deletions(-) create mode 100644 geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py create mode 100644 geos-mesh/src/geos/mesh/processing/SplitMesh.py create mode 100644 geos-mesh/tests/test_MergeColocatedPoints.py create mode 100644 geos-mesh/tests/test_SplitMesh.py create mode 100644 geos-pv/src/PVplugins/PVSplitMesh.py diff --git a/geos-mesh/pyproject.toml b/geos-mesh/pyproject.toml index 03708863a..6c2ddb306 100644 --- a/geos-mesh/pyproject.toml +++ b/geos-mesh/pyproject.toml @@ -37,9 +37,12 @@ Repository = "https://github.com/GEOS-DEV/geosPythonPackages.git" "Bug Tracker" = "https://github.com/GEOS-DEV/geosPythonPackages/issues" [tool.pytest.ini_options] -addopts = [ - "--import-mode=importlib", -] -pythonpath = [ - "src", -] +addopts = "--import-mode=importlib" +console_output_style = "count" +pythonpath = ["src"] +python_classes = "Test" +python_files = "test*.py" +python_functions = "test*" +testpaths = ["tests"] +norecursedirs = "bin" +filterwarnings = [] \ No newline at end of file diff --git a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py new file mode 100644 index 000000000..d55c31d31 --- /dev/null +++ b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py @@ -0,0 +1,127 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +from typing_extensions import Self +from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase +from vtkmodules.vtkCommonCore import ( + vtkIntArray, + vtkInformation, + vtkInformationVector, + vtkPoints, + reference +) +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkIncrementalOctreePointLocator, +) + + +__doc__ = """ +MergeColocatedPoints module is a vtk filter that merges colocated points from input mesh. + +Filter input and output types are vtkUnstructuredGrid. + +.. Warning:: This operation uses geometrical tests that may not be accurate in case of very small cells. + + +To use the filter: + +.. code-block:: python + + from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints + + # filter inputs + input :vtkUnstructuredGrid + + # instanciate the filter + filter :MergeColocatedPoints = MergeColocatedPoints() + # set input data object + filter.SetInputDataObject(input) + # do calculations + filter.Update() + # get output object + output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) +""" + +class MergeColocatedPoints(VTKPythonAlgorithmBase): + def __init__(self: Self ): + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") + + def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestInformation. + + Args: + port (int): input port + info (vtkInformationVector): info + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + if port == 0: + info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") + + def RequestDataObject(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + outData = self.GetOutputData(outInfoVec, 0) + assert inData is not None + if outData is None or (not outData.IsA(inData.GetClassName())): + outData = inData.NewInstance() + outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfoVec, outInfoVec) + + def RequestData(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData: vtkUnstructuredGrid = vtkUnstructuredGrid.GetData( inInfoVec[ 0 ] ) + output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) + newPoints: vtkPoints = vtkPoints() + # use point locator to check for colocated points + merge_points = vtkIncrementalOctreePointLocator() + merge_points.InitPointInsertion(newPoints,inData.GetBounds()) + # create an array to count the number of colocated points + vertexCount: vtkIntArray = vtkIntArray() + vertexCount.SetName("Count") + ptId = reference(0) + countD: int = 0 + for v in range(inData.GetNumberOfPoints()): + inserted: bool = merge_points.InsertUniquePoint( inData.GetPoints().GetPoint(v), ptId) + if inserted: + vertexCount.InsertNextValue(1) + else: + vertexCount.SetValue( ptId, vertexCount.GetValue(ptId) + 1) + countD = countD + 1 + + output.SetPoints(merge_points.GetLocatorPoints()) + # copy point attributes + output.GetPointData().DeepCopy(inData.GetPointData()) + # add the array to points data + output.GetPointData().AddArray(vertexCount) + # copy cell attributes + output.GetCellData().DeepCopy(inData.GetCellData()) + return 1 \ No newline at end of file diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py new file mode 100644 index 000000000..0772de143 --- /dev/null +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -0,0 +1,387 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +import numpy as np +import numpy.typing as npt +from typing_extensions import Self +from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase +from vtkmodules.vtkCommonCore import ( + vtkPoints, + vtkIdTypeArray, +) +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellArray, + vtkCell, + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, +) + + +__doc__ = """ +SplitMesh module is a vtk filter that split cells of a mesh composed of Tetrahedra, pyramids, and hexahedra. + +Filter input and output types are vtkUnstructuredGrid. + +To use the filter: + +.. code-block:: python + + from geos.mesh.processing.SplitMesh import SplitMesh + + # filter inputs + input :vtkUnstructuredGrid + + # instanciate the filter + filter :SplitMesh = SplitMesh() + # set input data object + filter.SetInputDataObject(input) + # do calculations + filter.Update() + # get output object + output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) +""" + +class SplitMesh(VTKPythonAlgorithmBase): + + def __init__(self): + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") + + self.inData: vtkUnstructuredGrid + self.cells: vtkCellArray + self.points: vtkPoints + self.originalId: vtkIdTypeArray + self.cellTypes: list[int] + + def FillInputPortInformation(self, port, info): + if port == 0: + info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") + def RequestDataObject(self, request, inInfo, outInfo): + inData = self.GetInputData(inInfo, 0, 0) + outData = self.GetOutputData(outInfo, 0) + assert inData is not None + if outData is None or (not outData.IsA(inData.GetClassName())): + outData = inData.NewInstance() + outInfo.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfo, outInfo) + + def RequestData(self, request, inInfo, outInfo): + self.inData = self.GetInputData(inInfo, 0, 0) + output: vtkUnstructuredGrid = self.GetOutputData(outInfo, 0) + + assert self.inData is not None, "Input mesh is undefined." + assert output is not None, "Output mesh is undefined." + + nb_cells: int = self.inData.GetNumberOfCells() + nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad = self._get_cell_counts() + + self.points = vtkPoints() + self.points.DeepCopy(self.inData.GetPoints()) + self.points.Resize( self.inData.GetNumberOfPoints() + nb_hex *19 + nb_tet * 6 + nb_pyr * 9) + self.cells = vtkCellArray() + self.cells.AllocateExact(nb_hex*8+nb_tet*8+nb_pyr*10,8) + self.originalId = vtkIdTypeArray() + self.originalId.SetName("OriginalID") + self.originalId.Allocate(nb_hex*8+nb_tet*8+nb_pyr*10) + self.cellTypes = [] + for c in range(nb_cells): + cell: vtkCell = self.inData.GetCell(c) + cellType: int = cell.GetCellType() + if cellType == VTK_HEXAHEDRON: + self._split_hexahedron(cell, c) + elif cellType == VTK_TETRA: + self._split_tetrahedron(cell, c) + elif cellType == VTK_PYRAMID: + self._split_pyramid(cell, c) + elif cellType == VTK_TRIANGLE: + self._split_triangle(cell, c) + elif cellType == VTK_QUAD: + self._split_quad(cell, c) + else: + raise TypeError(f"Cell type {vtkCellTypes.GetClassNameFromTypeId(cellType)} is not supported.") + # add points and cells + output.SetPoints(self.points) + output.SetCells(self.cellTypes, self.cells) + # add attribute saving original cell ids + # cellArrays: vtkCellData = output.GetCellData() + # assert cellArrays is not None, "Cell data is undefined." + # cellArrays.AllocateArrays(1) + # cellArrays.AddArray(self.originalId) + return 1 + + def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: + """Get the number of cells of each type. + + Returns: + tuple[int, int, int, int, int]: tuple containing counts of + hexahedron, tetrahedron, pyramid, triangles, quads + """ + nb_cells: int = self.inData.GetNumberOfCells() + nb_hex: int = 0 + nb_tet: int = 0 + nb_pyr: int = 0 + nb_triangles: int = 0 + nb_quad: int = 0 + for c in range(nb_cells): + cell: vtkCell = self.inData.GetCell(c) + cellType = cell.GetCellType() + if cellType == VTK_HEXAHEDRON: + nb_hex = nb_hex + 1 + if cellType == VTK_TETRA: + nb_tet = nb_tet + 1 + if cellType == VTK_PYRAMID: + nb_pyr = nb_pyr + 1 + if cellType == VTK_TRIANGLE: + nb_triangles = nb_triangles + 1 + if cellType == VTK_QUAD: + nb_quad = nb_quad + 1 + return nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad + + def _addMidPoint( self: Self, ptA :int, ptB :int) ->int: + """Add a point at the center of the edge defined by input point ids. + + Args: + ptA (int): first point Id + ptB (int): second point Id + + Returns: + int: inserted point Id + """ + ptACoor: npt.NDArray[np.float64] = np.array(self.points.GetPoint(ptA)) + ptBCoor: npt.NDArray[np.float64] = np.array(self.points.GetPoint(ptB)) + center: npt.NDArray[np.float64] = (ptACoor + ptBCoor) / 2. + return self.points.InsertNextPoint(center[0], center[1], center[2]) + + def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: + r"""Split a tetrahedron. + + Let's suppose an input tetrahedron composed of nodes (0, 1, 2, 3), + the cell is splitted in 8 tetrahedra using edge centers. + + 2 + ,/|`\ + ,/ | `\ + ,6 '. `5 + ,/ 8 `\ + ,/ | `\ + 0--------4--'.--------1 + `\. | ,/ + `\. | ,9 + `7. '. ,/ + `\. |/ + `3 + + Args: + cell (vtkCell): cell to split + index (int): index of the cell + """ + pt0: int = cell.GetPointId(0) + pt1: int = cell.GetPointId(1) + pt2: int = cell.GetPointId(2) + pt3: int = cell.GetPointId(3) + pt4: int = self._addMidPoint(pt0,pt1) + pt5: int = self._addMidPoint(pt1,pt2) + pt6: int = self._addMidPoint(pt0,pt2) + pt7: int = self._addMidPoint(pt0,pt3) + pt8: int = self._addMidPoint(pt2,pt3) + pt9: int = self._addMidPoint(pt1,pt3) + + self.cells.InsertNextCell(4, [pt0,pt4,pt6,pt7]) + self.cells.InsertNextCell(4, [pt7,pt9,pt8,pt3]) + self.cells.InsertNextCell(4, [pt9,pt4,pt5,pt1]) + self.cells.InsertNextCell(4, [pt5,pt6,pt8,pt2]) + self.cells.InsertNextCell(4, [pt6,pt8,pt7,pt4]) + self.cells.InsertNextCell(4, [pt4,pt8,pt7,pt9]) + self.cells.InsertNextCell(4, [pt4,pt8,pt9,pt5]) + self.cells.InsertNextCell(4, [pt5,pt4,pt8,pt6]) + for i in range(8): + self.originalId.InsertNextValue(index) + self.cellTypes.extend([VTK_TETRA]*8) + + def _split_pyramid(self :Self, cell: vtkCell, index: int) -> None: + r"""Split a pyramid. + + Let's suppose an input pyramid composed of nodes (0, 1, 2, 3, 4), + the cell is splitted in 8 pyramids using edge centers. + + 4 + ,/|\ + ,/ .'|\ + ,/ | | \ + ,/ .' | `. + ,7 | 12 \ + ,/ .' | \ + ,/ 9 | 11 + 0--------6-.'----3 `. + `\ | `\ \ + `5 .'13 10 \ + `\ | `\ \ + `\.' `\` + 1--------8-------2 + + Args: + cell (vtkCell): cell to split + index (int): index of the cell + """ + pt0: int = cell.GetPointId(0) + pt1: int = cell.GetPointId(1) + pt2: int = cell.GetPointId(2) + pt3: int = cell.GetPointId(3) + pt4: int = cell.GetPointId(4) + pt5: int = self._addMidPoint(pt0,pt1) + pt6: int = self._addMidPoint(pt0,pt3) + pt7: int = self._addMidPoint(pt0,pt4) + pt8: int = self._addMidPoint(pt1,pt2) + pt9: int = self._addMidPoint(pt1,pt4) + pt10: int = self._addMidPoint(pt2,pt3) + pt11: int = self._addMidPoint(pt2,pt4) + pt12: int = self._addMidPoint(pt3,pt4) + pt13: int = self._addMidPoint(pt5,pt10) + + self.cells.InsertNextCell(5, [pt5,pt1,pt8,pt13,pt9]) + self.cells.InsertNextCell(5, [pt13,pt8,pt2,pt10,pt11]) + self.cells.InsertNextCell(5, [pt3,pt6,pt13,pt10,pt12]) + self.cells.InsertNextCell(5, [pt6,pt0,pt5,pt13,pt7]) + self.cells.InsertNextCell(5, [pt12,pt7,pt9,pt11,pt4]) + self.cells.InsertNextCell(5, [pt11,pt9,pt7,pt12,pt13]) + + self.cells.InsertNextCell(4, [pt7,pt9,pt5,pt13]) + self.cells.InsertNextCell(4, [pt9,pt11,pt8,pt13]) + self.cells.InsertNextCell(4, [pt11,pt12,pt10,pt13]) + self.cells.InsertNextCell(4, [pt12,pt7,pt6,pt13]) + for i in range(10): + self.originalId.InsertNextValue(index) + self.cellTypes.extend([VTK_PYRAMID]*8) + + def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: + r"""Split a hexahedron. + + Let's suppose an input hexahedron composed of nodes (0, 1, 2, 3, 4, 5, 6, 7), + the cell is splitted in 8 hexahedra using edge centers. + + 3----13----2 + |\ |\ + |15 24 | 14 + 9 \ 20 11 \ + | 7----19+---6 + |22 | 26 | 23| + 0---+-8----1 | + \ 17 25 \ 18 + 10| 21 12| + \| \| + 4----16----5 + + Args: + cell (vtkCell): cell to split + index (int): index of the cell + """ + + pt0: int = cell.GetPointId(0) + pt1: int = cell.GetPointId(1) + pt2: int = cell.GetPointId(2) + pt3: int = cell.GetPointId(3) + pt4: int = cell.GetPointId(4) + pt5: int = cell.GetPointId(5) + pt6: int = cell.GetPointId(6) + pt7: int = cell.GetPointId(7) + pt8: int = self._addMidPoint(pt0,pt1) + pt9: int = self._addMidPoint(pt0,pt3) + pt10: int = self._addMidPoint(pt0,pt4) + pt11: int = self._addMidPoint(pt1,pt2) + pt12: int = self._addMidPoint(pt1,pt5) + pt13: int = self._addMidPoint(pt2,pt3) + pt14: int = self._addMidPoint(pt2,pt6) + pt15: int = self._addMidPoint(pt3,pt7) + pt16: int = self._addMidPoint(pt4,pt5) + pt17: int = self._addMidPoint(pt4,pt7) + pt18: int = self._addMidPoint(pt5,pt6) + pt19: int = self._addMidPoint(pt6,pt7) + pt20: int = self._addMidPoint(pt9,pt11) + pt21: int = self._addMidPoint(pt10,pt12) + pt22: int = self._addMidPoint(pt9,pt17) + pt23: int = self._addMidPoint(pt11,pt18) + pt24: int = self._addMidPoint(pt14,pt15) + pt25: int = self._addMidPoint(pt17,pt18) + pt26: int = self._addMidPoint(pt22,pt23) + + self.cells.InsertNextCell(8, [pt10,pt21,pt26,pt22,pt4,pt16,pt25,pt17]) + self.cells.InsertNextCell(8, [pt21,pt12,pt23,pt26,pt16,pt5,pt18,pt25]) + self.cells.InsertNextCell(8, [pt0,pt8,pt20,pt9,pt10,pt21,pt26,pt22]) + self.cells.InsertNextCell(8, [pt8,pt1,pt11,pt20,pt21,pt12,pt23,pt26]) + self.cells.InsertNextCell(8, [pt22,pt26,pt24,pt15,pt17,pt25,pt19,pt7]) + self.cells.InsertNextCell(8, [pt26,pt23,pt14,pt24,pt25,pt18,pt6,pt19]) + self.cells.InsertNextCell(8, [pt9,pt20,pt13,pt3,pt22,pt26,pt24,pt15]) + self.cells.InsertNextCell(8, [pt20,pt11,pt2,pt13,pt26,pt23,pt14,pt24]) + for i in range(8): + self.originalId.InsertNextValue(index) + self.cellTypes.extend([VTK_HEXAHEDRON]*8) + + def _split_triangle(self :Self, cell: vtkCell, index: int) -> None: + r"""Split a triangle. + + Let's suppose an input triangle composed of nodes (0, 1, 2), + the cell is splitted in 3 triangles using edge centers. + + 2 + |\ + | \ + 5 4 + | \ + | \ + 0-----3----1 + + Args: + cell (vtkCell): cell to split + index (int): index of the cell + """ + pt0: int = cell.GetPointId(0) + pt1: int = cell.GetPointId(1) + pt2: int = cell.GetPointId(2) + pt3: int = self._addMidPoint(pt0,pt1) + pt4: int = self._addMidPoint(pt1,pt2) + pt5: int = self._addMidPoint(pt0,pt2) + + self.cells.InsertNextCell(3, [pt0,pt3,pt5]) + self.cells.InsertNextCell(3, [pt3,pt1,pt4]) + self.cells.InsertNextCell(3, [pt5,pt4,pt2]) + self.cells.InsertNextCell(3, [pt3,pt4,pt5]) + for i in range(4): + self.originalId.InsertNextValue(index) + self.cellTypes.extend([VTK_TRIANGLE]*4) + + def _split_quad(self :Self, cell: vtkCell, index: int) -> None: + r"""Split a quad. + + Let's suppose an input quad composed of nodes (0, 1, 2, 3), + the cell is splitted in 4 quads using edge centers. + + 3-----6-----2 + | | + | | + 7 8 5 + | | + | | + 0-----4-----1 + + Args: + cell (vtkCell): cell to split + index (int): index of the cell + """ + + pt0: int = cell.GetPointId(0) + pt1: int = cell.GetPointId(1) + pt2: int = cell.GetPointId(2) + pt3: int = cell.GetPointId(3) + pt4: int = self._addMidPoint(pt0,pt1) + pt5: int = self._addMidPoint(pt1,pt2) + pt6: int = self._addMidPoint(pt2,pt3) + pt7: int = self._addMidPoint(pt3,pt0) + pt8: int = self._addMidPoint(pt7,pt5) + + self.cells.InsertNextCell(4, [pt0,pt4,pt8,pt7]) + self.cells.InsertNextCell(4, [pt4,pt1,pt5,pt8]) + self.cells.InsertNextCell(4, [pt8,pt5,pt2,pt6]) + self.cells.InsertNextCell(4, [pt7,pt8,pt6,pt3]) + for i in range(4): + self.originalId.InsertNextValue(index) + self.cellTypes.extend([VTK_QUAD]*4) \ No newline at end of file diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py new file mode 100644 index 000000000..6f1a39d8e --- /dev/null +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -0,0 +1,115 @@ +# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import numpy as np +import numpy.typing as npt +import unittest +from typing_extensions import Self + +from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints + +import vtk +from vtkmodules.util.numpy_support import (numpy_to_vtk, numpy_to_vtkIdTypeArray, + vtk_to_numpy) + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellArray, +) + +from vtkmodules.vtkCommonCore import ( + vtkPoints, +) + +# create test mesh +ID_TYPE = np.int32 +if vtk.VTK_ID_TYPE == 12: + ID_TYPE = np.int64 + +offset = np.array([0, 4], np.int8) +cells = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8,]) +cell_type = np.array([vtk.VTK_TETRA, vtk.VTK_TETRA], np.int32) + +cell1 = np.array([[0, 0, 0], + [1, 0, 0], + [0, 0, 1], + [0, 1, 0]]) +cell2 = np.array([[1, 0, 0], + [1, 1, 0], + [0, 0, 1], + [0, 1, 0]]) + +points = np.vstack((cell1, cell2)).astype(np.float64) + +if offset.dtype != ID_TYPE: + offset = offset.astype(ID_TYPE) + +if cells.dtype != ID_TYPE: + cells = cells.astype(ID_TYPE) + +if not cells.flags['C_CONTIGUOUS']: + cells = np.ascontiguousarray(cells) + +if cells.ndim != 1: + cells = cells.ravel() + +if cell_type.dtype != np.uint8: + cell_type = cell_type.astype(np.uint8) + +# Get number of cells +ncells = cell_type.size + +# Convert to vtk arrays +cell_type = numpy_to_vtk(cell_type) +offset = numpy_to_vtkIdTypeArray(offset) + +vtkcells = vtk.vtkCellArray() +vtkcells.SetCells(ncells, numpy_to_vtkIdTypeArray(cells.ravel())) + +# Convert points to vtkPoints object +vtkpts = vtk.vtkPoints() +vtkpts.SetData(numpy_to_vtk(points)) + +inputMesh: vtkUnstructuredGrid = vtkUnstructuredGrid() +inputMesh.SetPoints(vtkpts) +inputMesh.SetCells(cell_type, offset, vtkcells) + + +class TestsMergeColocatedPoints( unittest.TestCase ): + + def test_init( self: Self ) -> None: + """Test init method.""" + filter :MergeColocatedPoints = MergeColocatedPoints() + input = filter.GetInputDataObject(0, 0) + self.assertIsNone(input, "Input mesh should be undefined.") + + + def test_SetInputDataObject( self: Self ) -> None: + """Test SetInputDataObject method.""" + filter :MergeColocatedPoints = MergeColocatedPoints() + filter.SetInputDataObject(inputMesh) + input = filter.GetInputDataObject(0, 0) + self.assertIsNotNone(input, "Input mesh is undefined.") + output = filter.GetOutputDataObject(0) + self.assertIsNone(output, "Output mesh should be undefined.") + + + def test_Update( self: Self ) -> None: + """Test Update method.""" + filter :MergeColocatedPoints = MergeColocatedPoints() + filter.SetInputDataObject(inputMesh) + filter.Update() + output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) + self.assertIsNotNone(output, "Output mesh is undefined.") + pointsOut: vtkPoints = output.GetPoints() + self.assertIsNotNone(pointsOut, "Points from output mesh are undefined.") + self.assertEqual(pointsOut.GetNumberOfPoints(), 5) + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print(pointCoords) + + cellsOut: vtkCellArray = inputMesh.GetCells() + self.assertIsNotNone(cellsOut, "Cells from output mesh are undefined.") + cellsPtIds: npt.NDArray[np.int8] = vtk_to_numpy(cellsOut.GetData()) + print(cellsPtIds) + self.assertTrue(False, "Manual fail") + diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py new file mode 100644 index 000000000..8522c5861 --- /dev/null +++ b/geos-mesh/tests/test_SplitMesh.py @@ -0,0 +1,244 @@ +# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +from dataclasses import dataclass +import numpy as np +import numpy.typing as npt +import pytest +from typing_extensions import Self +from typing import ( + Iterator, +) + +from geos.mesh.processing.SplitMesh import SplitMesh + +from vtkmodules.util.numpy_support import (numpy_to_vtk, + vtk_to_numpy) + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellArray, + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID +) + +from vtkmodules.vtkCommonCore import ( + vtkPoints, + vtkIdList, +) +#from vtkmodules.vtkFiltersSources import vtkCubeSource + +# create test meshes + +############################################################### +# create single tetra mesh # +############################################################### +tetra_cell_type: int = VTK_TETRA +tetra_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], + [1, 0, 0], + [0, 0, 1], + [0, 1, 0]], np.float64) +# expected results +tetra_points_out: npt.NDArray[np.float64] = np.array([[0., 0., 0. ], + [1., 0., 0. ], + [0., 0., 1. ], + [0., 1., 0. ], + [0.5, 0., 0. ], + [0.5, 0., 0.5], + [0., 0., 0.5], + [0., 0.5, 0. ], + [0., 0.5, 0.5], + [0.5, 0.5, 0. ]], np.float64) +tetra_cells_out: list[list[int]] = [[0, 4, 6, 7], + [7, 9, 8, 3], + [9, 4, 5, 1], + [5, 6, 8, 2], + [6, 8, 7, 4], + [4, 8, 7, 9], + [4, 8, 9, 5], + [5, 4, 8, 6]] + +############################################################### +# create single hexa mesh # +############################################################### +hexa_cell_type: int = VTK_HEXAHEDRON +hexa_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], + [1, 0, 0], + [1, 1, 0], + [0, 1, 0], + [0, 0, 1], + [1, 0, 1], + [1, 1, 1], + [0, 1, 1]], np.float64) +# expected results +hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0], [0.0, 1.0, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5], [1.0, 0.5, 0.0], [1.0, 0.0, 0.5], [0.5, 1.0, 0.0], [1.0, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 0.0, 1.0], [0.0, 0.5, 1.0], [1.0, 0.5, 1.0], [0.5, 1.0, 1.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [1.0, 0.5, 0.5], [0.5, 1.0, 0.5], [0.5, 0.5, 1.0], [0.5, 0.5, 0.5]], np.float64) +hexa_cells_out: list[list[int]] = [[10, 21, 26, 22, 4, 16, 25, 17], + [21, 12, 23, 26, 16, 5, 18, 25], + [0, 8, 20, 9, 10, 21, 26, 22], + [8, 1, 11, 20, 21, 12, 23, 26], + [22, 26, 24, 15, 17, 25, 19, 7], + [26, 23, 14, 24, 25, 18, 6, 19], + [9, 20, 13, 3, 22, 26, 24, 15], + [20, 11, 2, 13, 26, 23, 14, 24]] + +############################################################### +# create single pyramid mesh # +############################################################### +pyramid_cell_type: int = VTK_PYRAMID +pyramid_cell: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0], + [1.0, 0.0, 0], + [1.0, 1.0, 0], + [0.0, 1.0, 0], + [0.5, 0.5, 1]], np.float64) +# expected results +pyramid_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.5, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.25, 0.25, 0.5], [1.0, 0.5, 0.0], [0.75, 0.25, 0.5], [0.5, 1.0, 0.0], [0.75, 0.75, 0.5], [0.25, 0.75, 0.5], [0.5, 0.5, 0.0]], np.float64) +pyramid_cells_out: list[list[int]] = [[5, 1, 8, 13, 9], + [13, 8, 2, 10, 11], + [3, 6, 13, 10, 12], + [6, 0, 5, 13, 7], + [12, 7, 9, 11, 4], + [11, 9, 7, 12, 13], + [7, 9, 5, 13], + [9, 11, 8, 13], + [11, 12, 10, 13], + [12, 7, 6, 13]] + +############################################################### +# create single triangle mesh # +############################################################### +triangle_cell_type: int = VTK_TRIANGLE +triangle_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], + [1, 0, 0], + [0, 1, 0]], np.float64) +# expected results +triangle_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0]], np.float64) +triangle_cells_out: list[list[int]] = [[0, 3, 5], + [3, 1, 4], + [5, 4, 2], + [3, 4, 5]] + +############################################################### +# create single quad mesh # +############################################################### +quad_cell_type: int = VTK_QUAD +quad_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], + [1, 0, 0], + [1, 1, 0], + [0, 1, 0]], np.float64) +# expected results +quad_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0]], np.float64) +quad_cells_out: list[list[int]] = [[0, 4, 8, 7], + [4, 1, 5, 8], + [8, 5, 2, 6], + [7, 8, 6, 3]] + +############################################################### +# create multi cell mesh # +############################################################### +# TODO: add tests cases composed of multi-cell meshes of various types + + +cell_types_all = (tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type) +cell_all = (tetra_cell, hexa_cell, pyramid_cell, triangle_cell, quad_cell) +points_out_all = (tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out) +cells_out_all = (tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out) + +@dataclass( frozen=True ) +class TestCase: + """Test case""" + __test__ = False + #: VTK cell type + cellType: int + #: mesh + mesh: vtkUnstructuredGrid + #: expected new point coordinates + pointsExp: npt.NDArray[np.float64] + #: expected new cell point ids + cellsExp: list[int] + + + +def __create_single_cell_type_mesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtkUnstructuredGrid: + """Create a mesh that consists of a single cell. + + Args: + cellType (int): cell type + pts_coord (npt.NDArray[np.float64]): cell point coordinates + + Returns: + vtkUnstructuredGrid: output mesh + """ + nbPoints: int = ptsCoord.shape[0] + points: npt.NDArray[np.float64] = np.vstack((ptsCoord,)) + # Convert points to vtkPoints object + vtkpts: vtkPoints = vtkPoints() + vtkpts.SetData(numpy_to_vtk(points)) + + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for j in range( nbPoints ): + cellsID.InsertNextId(j) + + # add cell to mesh + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + mesh.SetPoints(vtkpts) + mesh.Allocate(1) + mesh.InsertNextCell(cellType, cellsID) + return mesh + +def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for cellType, ptsCoord, pointsExp, cellsExp in zip( + cell_types_all, cell_all, points_out_all, cells_out_all, + strict=True): + mesh: vtkUnstructuredGrid = __create_single_cell_type_mesh(cellType, ptsCoord) + yield TestCase( cellType, mesh, pointsExp, cellsExp ) + + +ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] +@pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) +def test_single_cell_split( test_case: TestCase ): + cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) + filter :SplitMesh = SplitMesh() + filter.SetInputDataObject(test_case.mesh) + filter.Update() + output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) + assert output is not None, "Output mesh is undefined." + pointsOut: vtkPoints = output.GetPoints() + assert pointsOut is not None, "Points from output mesh are undefined." + assert pointsOut.GetNumberOfPoints() == test_case.pointsExp.shape[0], f"Number of points is expected to be {test_case.pointsExp.shape[0]}." + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print("Points coords: ", cellTypeName, pointCoords.tolist()) + assert np.array_equal(pointCoords.ravel(), test_case.pointsExp.ravel()), "Points coordinates mesh are wrong." + + cellsOut: vtkCellArray = output.GetCells() + typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) + print("typesArray0", cellTypeName, typesArray0) + + assert cellsOut is not None, "Cells from output mesh are undefined." + assert cellsOut.GetNumberOfCells() == len(test_case.cellsExp), f"Number of cells is expected to be {len(test_case.cellsExp)}." + # check cell types + types: vtkCellTypes = vtkCellTypes() + output.GetCellTypes(types) + assert types is not None, "Cell types must be defined" + typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + + print("typesArray", cellTypeName, typesArray) + assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"All cells must be {cellTypeName}" + + for i in range(cellsOut.GetNumberOfCells()): + ptIds = vtkIdList() + cellsOut.GetCellAtId(i, ptIds) + cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] + nbPtsExp: int = len(test_case.cellsExp[i]) + print("cell type", cellTypeName, i, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(i))) + print("cellsOutObs: ", cellTypeName, i, cellsOutObs) + assert ptIds is not None, "Point ids must be defined" + assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." + assert cellsOutObs == test_case.cellsExp[i], "Cell point ids are wrong." + + #assert False \ No newline at end of file diff --git a/geos-pv/src/PVplugins/PVSplitMesh.py b/geos-pv/src/PVplugins/PVSplitMesh.py new file mode 100644 index 000000000..de70f3653 --- /dev/null +++ b/geos-pv/src/PVplugins/PVSplitMesh.py @@ -0,0 +1,175 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +# ruff: noqa: E402 # disable Module level import not at top of file +import os +import sys +from typing import Union +from typing_extensions import Self + +from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] + VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, +) + +from vtkmodules.vtkCommonCore import ( + vtkDataArraySelection, + vtkInformation, + vtkInformationVector, +) +from vtkmodules.vtkCommonDataModel import ( + vtkCompositeDataSet, + vtkDataObjectTreeIterator, + vtkDataSet, + vtkMultiBlockDataSet, + vtkUnstructuredGrid, +) + +from geos.mesh.processing.SplitMesh import SplitMesh + +__doc__ = """ +Slip each cell of input mesh to smaller cells. + +Input and output are vtkUnstructuredGrid. + +To use it: + +* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVSplitMesh. +* Select the input mesh. +* Apply the filter. + +""" + +@smproxy.filter( name="PVSplitMesh", label="Split Mesh" ) +@smhint.xml( '' ) +@smproperty.input( name="Input", port_index=0 ) +@smdomain.datatype( + dataTypes=[ "vtkUnstructuredGrid"], + composite_data_supported=True, +) +class PVSplitMesh(VTKPythonAlgorithmBase): + def __init__(self:Self): + """Split mesh cells.""" + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") + + def FillInputPortInformation(self :Self, port: int, info: vtkInformation) ->int: + """Inherited from VTKPythonAlgorithmBase::FillInputPortInformation. + + Args: + port (int): port index + info (vtkInformation): input port Information + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + if port == 0: + info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") + + def RequestDataObject( + self: Self, + request: vtkInformation, + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + outData = self.GetOutputData(outInfoVec, 0) + assert inData is not None + if outData is None or (not outData.IsA(inData.GetClassName())): + outData = inData.NewInstance() + outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfoVec, outInfoVec) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + try: + inputMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, + vtkCompositeDataSet ] = self.GetInputData( inInfoVec, 0, 0 ) + outputMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, + vtkCompositeDataSet ] = self.GetOutputData( outInfoVec, 0 ) + + assert inputMesh is not None, "Input server mesh is null." + assert outputMesh is not None, "Output pipeline is null." + + splittedMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, vtkCompositeDataSet ] + if isinstance( inputMesh, vtkUnstructuredGrid ): + splittedMesh = self.doSplitMesh(inputMesh) + elif isinstance( inputMesh, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): + splittedMesh = self.doSplitMeshMultiBlock(inputMesh) + else: + raise ValueError( "Input mesh data type is not supported. Use either vtkUnstructuredGrid or vtkMultiBlockDataSet" ) + assert splittedMesh is not None, "Splitted mesh is null." + outputMesh.ShallowCopy(splittedMesh) + print("Mesh was successfully splitted.") + except AssertionError as e: + print(f"Mesh split failed due to: {e}") + return 0 + except Exception as e: + print(f"Mesh split failed due to: {e}") + return 0 + return 1 + + def doSplitMesh( + self: Self, + inputMesh: vtkUnstructuredGrid, + ) -> vtkUnstructuredGrid: + """Split cells from vtkUnstructuredGrids. + + Args: + inputMesh (vtkUnstructuredGrid): input mesh + + Returns: + vtkUnstructuredGrid: mesh where cells where splitted. + """ + filter :SplitMesh = SplitMesh() + filter.SetInputDataObject(inputMesh) + filter.Update() + return filter.GetOutputDataObject( 0 ) + + def doSplitMeshMultiBlock( + self: Self, + inputMesh: vtkMultiBlockDataSet, + ) -> vtkMultiBlockDataSet: + """Split cells from vtkMultiBlockDataSet. + + Args: + inputMesh (vtkMultiBlockDataSet): input mesh + + Returns: + vtkMultiBlockDataSet: mesh where cells where splitted. + """ + outputMesh: vtkMultiBlockDataSet = vtkMultiBlockDataSet() + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( inputMesh ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + blockIndex: int = 0 + while iter.GetCurrentDataObject() is not None: + block: vtkUnstructuredGrid = vtkUnstructuredGrid.SafeDownCast( iter.GetCurrentDataObject() ) + splittedBlock: vtkUnstructuredGrid = self.doSplitMesh( block ) + outputMesh.SetBlock(blockIndex, splittedBlock) + blockIndex += 1 + iter.GoToNextItem() + return outputMesh From 5d426385b4c6023d5e476944457b03a723b04391 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Thu, 10 Apr 2025 17:59:16 +0200 Subject: [PATCH 04/57] Add array transfer from parent to child mesh and tests --- .../src/geos/mesh/processing/SplitMesh.py | 124 +++++++++++++++--- geos-mesh/tests/test_SplitMesh.py | 15 +++ geos-pv/src/PVplugins/PVSplitMesh.py | 10 +- 3 files changed, 130 insertions(+), 19 deletions(-) diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index 0772de143..99c1c5f13 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -8,15 +8,21 @@ from vtkmodules.vtkCommonCore import ( vtkPoints, vtkIdTypeArray, + vtkDataArray, + vtkInformation, + vtkInformationVector, ) from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCellArray, + vtkCellData, vtkCell, vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, ) +from vtkmodules.util.numpy_support import (numpy_to_vtk, + vtk_to_numpy) __doc__ = """ SplitMesh module is a vtk filter that split cells of a mesh composed of Tetrahedra, pyramids, and hexahedra. @@ -53,21 +59,59 @@ def __init__(self): self.originalId: vtkIdTypeArray self.cellTypes: list[int] - def FillInputPortInformation(self, port, info): + def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestInformation. + + Args: + port (int): input port + info (vtkInformationVector): info + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ if port == 0: info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - def RequestDataObject(self, request, inInfo, outInfo): - inData = self.GetInputData(inInfo, 0, 0) - outData = self.GetOutputData(outInfo, 0) + + def RequestDataObject(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + outData = self.GetOutputData(outInfoVec, 0) assert inData is not None if outData is None or (not outData.IsA(inData.GetClassName())): outData = inData.NewInstance() - outInfo.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfo, outInfo) + outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfoVec, outInfoVec) - def RequestData(self, request, inInfo, outInfo): - self.inData = self.GetInputData(inInfo, 0, 0) - output: vtkUnstructuredGrid = self.GetOutputData(outInfo, 0) + def RequestData(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + self.inData = self.GetInputData(inInfoVec, 0, 0) + output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) assert self.inData is not None, "Input mesh is undefined." assert output is not None, "Output mesh is undefined." @@ -77,12 +121,20 @@ def RequestData(self, request, inInfo, outInfo): self.points = vtkPoints() self.points.DeepCopy(self.inData.GetPoints()) - self.points.Resize( self.inData.GetNumberOfPoints() + nb_hex *19 + nb_tet * 6 + nb_pyr * 9) + nbNewPoints: int = 0 + volumeCellCounts = nb_hex + nb_tet + nb_pyr + if volumeCellCounts > 0: + nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 + else: + nbNewPoints = nb_triangles * 3 + nb_quad * 5 + nbNewCells: int = nb_hex * 8 + nb_tet * 8 + nb_pyr * 10 * nb_triangles * 4 + nb_quad * 4 + + self.points.Resize( self.inData.GetNumberOfPoints() + nbNewPoints) self.cells = vtkCellArray() - self.cells.AllocateExact(nb_hex*8+nb_tet*8+nb_pyr*10,8) + self.cells.AllocateExact(nbNewCells, 8) self.originalId = vtkIdTypeArray() self.originalId.SetName("OriginalID") - self.originalId.Allocate(nb_hex*8+nb_tet*8+nb_pyr*10) + self.originalId.Allocate(nbNewCells) self.cellTypes = [] for c in range(nb_cells): cell: vtkCell = self.inData.GetCell(c) @@ -103,10 +155,11 @@ def RequestData(self, request, inInfo, outInfo): output.SetPoints(self.points) output.SetCells(self.cellTypes, self.cells) # add attribute saving original cell ids - # cellArrays: vtkCellData = output.GetCellData() - # assert cellArrays is not None, "Cell data is undefined." - # cellArrays.AllocateArrays(1) - # cellArrays.AddArray(self.originalId) + cellArrays: vtkCellData = output.GetCellData() + assert cellArrays is not None, "Cell data is undefined." + cellArrays.AddArray(self.originalId) + # transfer all cell arrays + self._transferCellArrays(output) return 1 def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: @@ -384,4 +437,41 @@ def _split_quad(self :Self, cell: vtkCell, index: int) -> None: self.cells.InsertNextCell(4, [pt7,pt8,pt6,pt3]) for i in range(4): self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_QUAD]*4) \ No newline at end of file + self.cellTypes.extend([VTK_QUAD]*4) + + def _transferCellArrays(self :Self, + splittedMesh: vtkUnstructuredGrid + ) ->bool: + """Transfer arrays from input mesh to splitted mesh. + + Args: + splittedMesh (vtkUnstructuredGrid): splitted mesh + + Returns: + bool: True if arrays were successfully transfered. + """ + cellDataSplitted: vtkCellData = splittedMesh.GetCellData() + assert cellDataSplitted is not None, "Cell data of splitted mesh should be defined." + cellData: vtkCellData = self.inData.GetCellData() + assert cellData is not None, "Cell data of input mesh should be defined." + # for each array of input mesh + for i in range(cellData.GetNumberOfArrays()): + array: vtkDataArray = cellData.GetArray(i) + assert array is not None, "Array should be defined." + npArray: npt.NDArray[np.float64] = vtk_to_numpy(array) + # get number of components + dims: tuple[int,...] = npArray.shape + ny:int = 1 if len(dims) == 1 else dims[1] + # create new array with nb cells from splitted mesh and number of components from array to copy + newNpArray: npt.NDArray[np.float64] = np.full((splittedMesh.GetNumberOfCells(), ny), np.nan) + # for each cell, copy the values from input mesh + for c in range(splittedMesh.GetNumberOfCells()): + idParent: int = int(self.originalId.GetTuple1(c)) + newNpArray[c] = npArray[idParent] + # set array the splitted mesh + newArray: vtkDataArray = numpy_to_vtk(newNpArray) + newArray.SetName(array.GetName()) + cellDataSplitted.AddArray(newArray) + cellDataSplitted.Modified() + splittedMesh.Modified() + return True \ No newline at end of file diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index 8522c5861..7369321bd 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -18,6 +18,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCellArray, + vtkCellData, vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID ) @@ -25,6 +26,7 @@ from vtkmodules.vtkCommonCore import ( vtkPoints, vtkIdList, + vtkDataArray, ) #from vtkmodules.vtkFiltersSources import vtkCubeSource @@ -241,4 +243,17 @@ def test_single_cell_split( test_case: TestCase ): assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." assert cellsOutObs == test_case.cellsExp[i], "Cell point ids are wrong." + # test originalId array was created + cellData: vtkCellData = output.GetCellData() + assert cellData is not None, "Cell data should be defined." + array: vtkDataArray = cellData.GetArray("OriginalID") + assert array is not None, "OriginalID array should be defined." + + # test other arrays were transferred + cellDataInput: vtkCellData = test_case.mesh.GetCellData() + assert cellDataInput is not None, "Cell data from input mesh should be defined." + nbArrayInput: int = cellDataInput.GetNumberOfArrays() + nbArraySplited: int = cellData.GetNumberOfArrays() + assert nbArraySplited == nbArrayInput + 1, f"Number of arrays should be {nbArrayInput + 1}" + #assert False \ No newline at end of file diff --git a/geos-pv/src/PVplugins/PVSplitMesh.py b/geos-pv/src/PVplugins/PVSplitMesh.py index de70f3653..332e4a92b 100644 --- a/geos-pv/src/PVplugins/PVSplitMesh.py +++ b/geos-pv/src/PVplugins/PVSplitMesh.py @@ -12,18 +12,24 @@ ) from vtkmodules.vtkCommonCore import ( - vtkDataArraySelection, vtkInformation, vtkInformationVector, ) from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObjectTreeIterator, - vtkDataSet, vtkMultiBlockDataSet, vtkUnstructuredGrid, ) +dir_path = os.path.dirname( os.path.realpath( __file__ ) ) +root = os.path.dirname(os.path.dirname(os.path.dirname( dir_path ))) +print(root) +for m in ("geos-posp", "geos-mesh", "geos-pv"): + path = os.path.join(root, m, "src") + if path not in sys.path: + sys.path.append( path ) + from geos.mesh.processing.SplitMesh import SplitMesh __doc__ = """ From c2286b5e1de29d5f21ea6825cb0a4777c7c5a579 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Fri, 11 Apr 2025 17:01:44 +0200 Subject: [PATCH 05/57] add helpers to create mesh with multiple cells add tests of helpers add test data files --- geos-mesh/src/geos/mesh/processing/helpers.py | 133 ++++++++++++ geos-mesh/tests/data/hexa_cell.csv | 8 + geos-mesh/tests/data/hexa_mesh.csv | 64 ++++++ geos-mesh/tests/data/pyramid_cell.csv | 5 + geos-mesh/tests/data/pyramid_mesh.csv | 46 +++++ geos-mesh/tests/data/quad_cell.csv | 4 + geos-mesh/tests/data/tetra_cell.csv | 4 + geos-mesh/tests/data/tetra_mesh.csv | 32 +++ geos-mesh/tests/data/triangle_cell.csv | 3 + geos-mesh/tests/test_MergeColocatedPoints.py | 191 ++++++++++-------- geos-mesh/tests/test_SplitMesh.py | 96 +++------ .../test_helpers_createSingleCellMesh.py | 103 ++++++++++ .../tests/test_helpers_createVertices.py | 159 +++++++++++++++ 13 files changed, 692 insertions(+), 156 deletions(-) create mode 100644 geos-mesh/src/geos/mesh/processing/helpers.py create mode 100644 geos-mesh/tests/data/hexa_cell.csv create mode 100644 geos-mesh/tests/data/hexa_mesh.csv create mode 100644 geos-mesh/tests/data/pyramid_cell.csv create mode 100644 geos-mesh/tests/data/pyramid_mesh.csv create mode 100644 geos-mesh/tests/data/quad_cell.csv create mode 100644 geos-mesh/tests/data/tetra_cell.csv create mode 100644 geos-mesh/tests/data/tetra_mesh.csv create mode 100644 geos-mesh/tests/data/triangle_cell.csv create mode 100644 geos-mesh/tests/test_helpers_createSingleCellMesh.py create mode 100644 geos-mesh/tests/test_helpers_createVertices.py diff --git a/geos-mesh/src/geos/mesh/processing/helpers.py b/geos-mesh/src/geos/mesh/processing/helpers.py new file mode 100644 index 000000000..bf3f35786 --- /dev/null +++ b/geos-mesh/src/geos/mesh/processing/helpers.py @@ -0,0 +1,133 @@ +# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import numpy as np +import numpy.typing as npt +from typing import Sequence + +from vtkmodules.util.numpy_support import numpy_to_vtk + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkIncrementalOctreePointLocator +) + +from vtkmodules.vtkCommonCore import ( + vtkPoints, + vtkIdList, + reference, +) + +def getBounds(cellPtsCoord: list[npt.NDArray[np.float64]]) -> Sequence[float]: + """Compute bounding box coordinates of the list of points. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of points + + Returns: + Sequence[float]: bounding box coordinates (xmin, xmax, ymin, ymax, zmin, zmax) + """ + bounds: list[float] = [np.inf, -np.inf, np.inf, -np.inf, np.inf, -np.inf,] + for ptsCoords in cellPtsCoord: + mins: npt.NDArray[np.float64] = np.min(ptsCoords, axis=0) + maxs: npt.NDArray[np.float64] = np.max(ptsCoords, axis=0) + for i in range(3): + bounds[2 * i] = float(min(bounds[2 * i], mins[i])) + bounds[2 * i + 1] = float(max(bounds[2 * i + 1], maxs[i])) + return bounds + +def createSingleCellMesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtkUnstructuredGrid: + """Create a mesh that consists of a single cell. + + Args: + cellType (int): cell type + ptsCoord (1DArray[np.float64]): cell point coordinates + + Returns: + vtkUnstructuredGrid: output mesh + """ + nbPoints: int = ptsCoord.shape[0] + points: npt.NDArray[np.float64] = np.vstack((ptsCoord,)) + # Convert points to vtkPoints object + vtkpts: vtkPoints = vtkPoints() + vtkpts.SetData(numpy_to_vtk(points)) + + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for j in range( nbPoints ): + cellsID.InsertNextId(j) + + # add cell to mesh + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + mesh.SetPoints(vtkpts) + mesh.Allocate(1) + mesh.InsertNextCell(cellType, cellsID) + return mesh + +def createMultiCellMesh(cellTypes: list[int], + cellPtsCoord: list[npt.NDArray[np.float64]], + sharePoints: bool = True + ) ->vtkUnstructuredGrid: + """Create a mesh that consists of multiple cells. + + .. WARNING:: the mesh is not check for conformity. + + Args: + cellTypes (list[int]): cell type + cellPtsCoord (list[1DArray[np.float64]]): list of cell point coordinates + sharePoints (bool): if True, cells share points, else a new point is created fro each cell vertex + + Returns: + vtkUnstructuredGrid: output mesh + """ + assert len(cellPtsCoord) == len(cellTypes), "The lists of cell types of point coordinates must be of same size." + nbCells: int = len(cellPtsCoord) + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + points: vtkPoints + cellVertexMapAll: list[tuple[int, ...]] + points, cellVertexMapAll = createVertices(cellPtsCoord, sharePoints) + assert len(cellVertexMapAll) == len(cellTypes), "The lists of cell types of cell point ids must be of same size." + mesh.SetPoints(points) + mesh.Allocate(nbCells) + # create mesh cells + for cellType, ptsId in zip(cellTypes, cellVertexMapAll, strict=True): + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for ptId in ptsId: + cellsID.InsertNextId(ptId) + mesh.InsertNextCell(cellType, cellsID) + return mesh + +def createVertices(cellPtsCoord: list[npt.NDArray[np.float64]], + shared: bool = True + ) -> tuple[vtkPoints, list[tuple[int, ...]]]: + """Create vertices from cell point coordinates list. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of cell point coordinates + shared (bool, optional): If True, collocated points are merged. Defaults to True. + + Returns: + tuple[vtkPoints, list[tuple[int, ...]]]: tuple containing points and the + map of cell point ids + """ + # get point bounds + bounds: list[float] = getBounds(cellPtsCoord) + points: vtkPoints = vtkPoints() + # use point locator to check for colocated points + pointsLocator = vtkIncrementalOctreePointLocator() + pointsLocator.InitPointInsertion(points, bounds) + cellVertexMapAll: list[tuple[int, ...]] = [] + ptId: reference = reference(0) + ptsCoords: npt.NDArray[np.float64] + for ptsCoords in cellPtsCoord: + cellVertexMap: list[reference] = [] + pt: npt.NDArray[np.float64] # 1DArray + for pt in ptsCoords: + if shared: + pointsLocator.InsertUniquePoint( pt.tolist(), ptId) + else: + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1) + cellVertexMap += [ptId.get()] + cellVertexMapAll += [tuple(cellVertexMap)] + return points, cellVertexMapAll diff --git a/geos-mesh/tests/data/hexa_cell.csv b/geos-mesh/tests/data/hexa_cell.csv new file mode 100644 index 000000000..741fa4f78 --- /dev/null +++ b/geos-mesh/tests/data/hexa_cell.csv @@ -0,0 +1,8 @@ +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +1.0, 1.0, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +1.0, 0.0, 1.0 +1.0, 1.0, 1.0 +0.0, 1.0, 1.0 \ No newline at end of file diff --git a/geos-mesh/tests/data/hexa_mesh.csv b/geos-mesh/tests/data/hexa_mesh.csv new file mode 100644 index 000000000..cc55f5626 --- /dev/null +++ b/geos-mesh/tests/data/hexa_mesh.csv @@ -0,0 +1,64 @@ +0.0,0.0,0.5 +0.5,0.0,0.5 +0.5,0.5,0.5 +0.0,0.5,0.5 +0.0,0.0,1.0 +0.5,0.0,1.0 +0.5,0.5,1.0 +0.0,0.5,1.0 +0.5,0.0,0.5 +1.0,0.0,0.5 +1.0,0.5,0.5 +0.5,0.5,0.5 +0.5,0.0,1.0 +1.0,0.0,1.0 +1.0,0.5,1.0 +0.5,0.5,1.0 +0.0,0.0,0.0 +0.5,0.0,0.0 +0.5,0.5,0.0 +0.0,0.5,0.0 +0.0,0.0,0.5 +0.5,0.0,0.5 +0.5,0.5,0.5 +0.0,0.5,0.5 +0.5,0.0,0.0 +1.0,0.0,0.0 +1.0,0.5,0.0 +0.5,0.5,0.0 +0.5,0.0,0.5 +1.0,0.0,0.5 +1.0,0.5,0.5 +0.5,0.5,0.5 +0.0,0.5,0.5 +0.5,0.5,0.5 +0.5,1.0,0.5 +0.0,1.0,0.5 +0.0,0.5,1.0 +0.5,0.5,1.0 +0.5,1.0,1.0 +0.0,1.0,1.0 +0.5,0.5,0.5 +1.0,0.5,0.5 +1.0,1.0,0.5 +0.5,1.0,0.5 +0.5,0.5,1.0 +1.0,0.5,1.0 +1.0,1.0,1.0 +0.5,1.0,1.0 +0.0,0.5,0.0 +0.5,0.5,0.0 +0.5,1.0,0.0 +0.0,1.0,0.0 +0.0,0.5,0.5 +0.5,0.5,0.5 +0.5,1.0,0.5 +0.0,1.0,0.5 +0.5,0.5,0.0 +1.0,0.5,0.0 +1.0,1.0,0.0 +0.5,1.0,0.0 +0.5,0.5,0.5 +1.0,0.5,0.5 +1.0,1.0,0.5 +0.5,1.0,0.5 diff --git a/geos-mesh/tests/data/pyramid_cell.csv b/geos-mesh/tests/data/pyramid_cell.csv new file mode 100644 index 000000000..864deaf4f --- /dev/null +++ b/geos-mesh/tests/data/pyramid_cell.csv @@ -0,0 +1,5 @@ +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +1.0, 1.0, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 1.0 \ No newline at end of file diff --git a/geos-mesh/tests/data/pyramid_mesh.csv b/geos-mesh/tests/data/pyramid_mesh.csv new file mode 100644 index 000000000..c435d2e49 --- /dev/null +++ b/geos-mesh/tests/data/pyramid_mesh.csv @@ -0,0 +1,46 @@ +0.5,0.0,0.0 +1.0,0.0,0.0 +1.0,0.5,0.0 +0.5,0.5,0.0 +0.8,0.2,0.5 +0.5,0.5,0.0 +1.0,0.5,0.0 +1.0,1.0,0.0 +0.5,1.0,0.0 +0.8,0.8,0.5 +0.0,1.0,0.0 +0.0,0.5,0.0 +0.5,0.5,0.0 +0.5,1.0,0.0 +0.2,0.8,0.5 +0.0,0.5,0.0 +0.0,0.0,0.0 +0.5,0.0,0.0 +0.5,0.5,0.0 +0.2,0.2,0.5 +0.2,0.8,0.5 +0.2,0.2,0.5 +0.8,0.2,0.5 +0.8,0.8,0.5 +0.5,0.5,1.0 +0.8,0.8,0.5 +0.8,0.2,0.5 +0.2,0.2,0.5 +0.2,0.8,0.5 +0.5,0.5,0.0 +0.2,0.2,0.5 +0.8,0.2,0.5 +0.5,0.0,0.0 +0.5,0.5,0.0 +0.8,0.2,0.5 +0.8,0.8,0.5 +1.0,0.5,0.0 +0.5,0.5,0.0 +0.8,0.8,0.5 +0.2,0.8,0.5 +0.5,1.0,0.0 +0.5,0.5,0.0 +0.2,0.8,0.5 +0.2,0.2,0.5 +0.0,0.5,0.0 +0.5,0.5,0.0 diff --git a/geos-mesh/tests/data/quad_cell.csv b/geos-mesh/tests/data/quad_cell.csv new file mode 100644 index 000000000..ffca9522e --- /dev/null +++ b/geos-mesh/tests/data/quad_cell.csv @@ -0,0 +1,4 @@ +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +1.0, 1.0, 0.0 +0.0, 1.0, 0.0 \ No newline at end of file diff --git a/geos-mesh/tests/data/tetra_cell.csv b/geos-mesh/tests/data/tetra_cell.csv new file mode 100644 index 000000000..38b971aaf --- /dev/null +++ b/geos-mesh/tests/data/tetra_cell.csv @@ -0,0 +1,4 @@ +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 \ No newline at end of file diff --git a/geos-mesh/tests/data/tetra_mesh.csv b/geos-mesh/tests/data/tetra_mesh.csv new file mode 100644 index 000000000..2f3414b4a --- /dev/null +++ b/geos-mesh/tests/data/tetra_mesh.csv @@ -0,0 +1,32 @@ +0.0,0.0,0.0 +0.5,0.0,0.0 +0.0,0.0,0.5 +0.0,0.5,0.0 +0.0,0.5,0.0 +0.5,0.5,0.0 +0.0,0.5,0.5 +0.0,1.0,0.0 +0.5,0.5,0.0 +0.5,0.0,0.0 +0.5,0.0,0.5 +1.0,0.0,0.0 +0.5,0.0,0.5 +0.0,0.0,0.5 +0.0,0.5,0.5 +0.0,0.0,1.0 +0.0,0.0,0.5 +0.0,0.5,0.5 +0.0,0.5,0.0 +0.5,0.0,0.0 +0.5,0.0,0.0 +0.0,0.5,0.5 +0.0,0.5,0.0 +0.5,0.5,0.0 +0.5,0.0,0.0 +0.0,0.5,0.5 +0.5,0.5,0.0 +0.5,0.0,0.5 +0.5,0.0,0.5 +0.5,0.0,0.0 +0.0,0.5,0.5 +0.0,0.0,0.5 diff --git a/geos-mesh/tests/data/triangle_cell.csv b/geos-mesh/tests/data/triangle_cell.csv new file mode 100644 index 000000000..b8b70c271 --- /dev/null +++ b/geos-mesh/tests/data/triangle_cell.csv @@ -0,0 +1,3 @@ +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 \ No newline at end of file diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py index 6f1a39d8e..ea8db4c0a 100644 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -1,115 +1,134 @@ # SPDX-FileContributor: Alexandre Benedicto, Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file +import os +from dataclasses import dataclass import numpy as np import numpy.typing as npt -import unittest +import pytest from typing_extensions import Self +from typing import ( + Iterator, +) +from geos.mesh.processing.helpers import create_single_cell_mesh from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints -import vtk -from vtkmodules.util.numpy_support import (numpy_to_vtk, numpy_to_vtkIdTypeArray, - vtk_to_numpy) +from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCellArray, + vtkCellData, + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, ) from vtkmodules.vtkCommonCore import ( vtkPoints, + vtkIdList, + vtkDataArray, ) -# create test mesh -ID_TYPE = np.int32 -if vtk.VTK_ID_TYPE == 12: - ID_TYPE = np.int64 - -offset = np.array([0, 4], np.int8) -cells = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8,]) -cell_type = np.array([vtk.VTK_TETRA, vtk.VTK_TETRA], np.int32) - -cell1 = np.array([[0, 0, 0], - [1, 0, 0], - [0, 0, 1], - [0, 1, 0]]) -cell2 = np.array([[1, 0, 0], - [1, 1, 0], - [0, 0, 1], - [0, 1, 0]]) - -points = np.vstack((cell1, cell2)).astype(np.float64) - -if offset.dtype != ID_TYPE: - offset = offset.astype(ID_TYPE) - -if cells.dtype != ID_TYPE: - cells = cells.astype(ID_TYPE) -if not cells.flags['C_CONTIGUOUS']: - cells = np.ascontiguousarray(cells) +#from vtkmodules.vtkFiltersSources import vtkCubeSource -if cells.ndim != 1: - cells = cells.ravel() -if cell_type.dtype != np.uint8: - cell_type = cell_type.astype(np.uint8) +data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") -# Get number of cells -ncells = cell_type.size -# Convert to vtk arrays -cell_type = numpy_to_vtk(cell_type) -offset = numpy_to_vtkIdTypeArray(offset) -vtkcells = vtk.vtkCellArray() -vtkcells.SetCells(ncells, numpy_to_vtkIdTypeArray(cells.ravel())) +data_filename_all = (tetra_path, hexa_path, pyramid_path, triangle_path, quad_path) +cell_types_all = (tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type) +points_out_all = (tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out) +cells_out_all = (tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out) -# Convert points to vtkPoints object -vtkpts = vtk.vtkPoints() -vtkpts.SetData(numpy_to_vtk(points)) - -inputMesh: vtkUnstructuredGrid = vtkUnstructuredGrid() -inputMesh.SetPoints(vtkpts) -inputMesh.SetCells(cell_type, offset, vtkcells) - - -class TestsMergeColocatedPoints( unittest.TestCase ): - - def test_init( self: Self ) -> None: - """Test init method.""" - filter :MergeColocatedPoints = MergeColocatedPoints() - input = filter.GetInputDataObject(0, 0) - self.assertIsNone(input, "Input mesh should be undefined.") +@dataclass( frozen=True ) +class TestCase: + """Test case""" + __test__ = False + #: VTK cell type + cellType: int + #: mesh + mesh: vtkUnstructuredGrid + #: expected new point coordinates + pointsExp: npt.NDArray[np.float64] + #: expected new cell point ids + cellsExp: list[int] + +def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for cellType, data_path, pointsExp, cellsExp in zip( + cell_types_all, data_filename_all, points_out_all, cells_out_all, + strict=True): + ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, data_path), dtype=float, delimiter=',') + mesh: vtkUnstructuredGrid = create_single_cell_mesh(cellType, ptsCoord) + yield TestCase( cellType, mesh, pointsExp, cellsExp ) + + +ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] +@pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) +def test_single_cell_split( test_case: TestCase ): + """Test of SplitMesh filter with meshes composed of a single cell. + + Args: + test_case (TestCase): test case + """ + cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) + filter :MergeColocatedPoints = MergeColocatedPoints() + filter.SetInputDataObject(test_case.mesh) + filter.Update() + output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) + assert output is not None, "Output mesh is undefined." + pointsOut: vtkPoints = output.GetPoints() + assert pointsOut is not None, "Points from output mesh are undefined." + assert pointsOut.GetNumberOfPoints() == test_case.pointsExp.shape[0], f"Number of points is expected to be {test_case.pointsExp.shape[0]}." + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print("Points coords: ", cellTypeName, pointCoords.tolist()) + assert np.array_equal(pointCoords.ravel(), test_case.pointsExp.ravel()), "Points coordinates mesh are wrong." + + cellsOut: vtkCellArray = output.GetCells() + typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) + print("typesArray0", cellTypeName, typesArray0) + + assert cellsOut is not None, "Cells from output mesh are undefined." + assert cellsOut.GetNumberOfCells() == len(test_case.cellsExp), f"Number of cells is expected to be {len(test_case.cellsExp)}." + # check cell types + types: vtkCellTypes = vtkCellTypes() + output.GetCellTypes(types) + assert types is not None, "Cell types must be defined" + typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + + print("typesArray", cellTypeName, typesArray) + assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"All cells must be {cellTypeName}" - def test_SetInputDataObject( self: Self ) -> None: - """Test SetInputDataObject method.""" - filter :MergeColocatedPoints = MergeColocatedPoints() - filter.SetInputDataObject(inputMesh) - input = filter.GetInputDataObject(0, 0) - self.assertIsNotNone(input, "Input mesh is undefined.") - output = filter.GetOutputDataObject(0) - self.assertIsNone(output, "Output mesh should be undefined.") - - - def test_Update( self: Self ) -> None: - """Test Update method.""" - filter :MergeColocatedPoints = MergeColocatedPoints() - filter.SetInputDataObject(inputMesh) - filter.Update() - output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) - self.assertIsNotNone(output, "Output mesh is undefined.") - pointsOut: vtkPoints = output.GetPoints() - self.assertIsNotNone(pointsOut, "Points from output mesh are undefined.") - self.assertEqual(pointsOut.GetNumberOfPoints(), 5) - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print(pointCoords) - - cellsOut: vtkCellArray = inputMesh.GetCells() - self.assertIsNotNone(cellsOut, "Cells from output mesh are undefined.") - cellsPtIds: npt.NDArray[np.int8] = vtk_to_numpy(cellsOut.GetData()) - print(cellsPtIds) - self.assertTrue(False, "Manual fail") + for i in range(cellsOut.GetNumberOfCells()): + ptIds = vtkIdList() + cellsOut.GetCellAtId(i, ptIds) + cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] + nbPtsExp: int = len(test_case.cellsExp[i]) + print("cell type", cellTypeName, i, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(i))) + print("cellsOutObs: ", cellTypeName, i, cellsOutObs) + assert ptIds is not None, "Point ids must be defined" + assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." + assert cellsOutObs == test_case.cellsExp[i], "Cell point ids are wrong." + + # test originalId array was created + cellData: vtkCellData = output.GetCellData() + assert cellData is not None, "Cell data should be defined." + array: vtkDataArray = cellData.GetArray("OriginalID") + assert array is not None, "OriginalID array should be defined." + + # test other arrays were transferred + cellDataInput: vtkCellData = test_case.mesh.GetCellData() + assert cellDataInput is not None, "Cell data from input mesh should be defined." + nbArrayInput: int = cellDataInput.GetNumberOfArrays() + nbArraySplited: int = cellData.GetNumberOfArrays() + assert nbArraySplited == nbArrayInput + 1, f"Number of arrays should be {nbArrayInput + 1}" + diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index 7369321bd..7c5b28fcf 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -1,6 +1,7 @@ # SPDX-FileContributor: Alexandre Benedicto, Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file +import os from dataclasses import dataclass import numpy as np import numpy.typing as npt @@ -10,10 +11,10 @@ Iterator, ) +from geos.mesh.processing.helpers import createSingleCellMesh from geos.mesh.processing.SplitMesh import SplitMesh -from vtkmodules.util.numpy_support import (numpy_to_vtk, - vtk_to_numpy) +from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, @@ -30,27 +31,17 @@ ) #from vtkmodules.vtkFiltersSources import vtkCubeSource -# create test meshes + +data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") ############################################################### # create single tetra mesh # ############################################################### tetra_cell_type: int = VTK_TETRA -tetra_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], - [1, 0, 0], - [0, 0, 1], - [0, 1, 0]], np.float64) +tetra_path = "tetra_cell.csv" + # expected results -tetra_points_out: npt.NDArray[np.float64] = np.array([[0., 0., 0. ], - [1., 0., 0. ], - [0., 0., 1. ], - [0., 1., 0. ], - [0.5, 0., 0. ], - [0.5, 0., 0.5], - [0., 0., 0.5], - [0., 0.5, 0. ], - [0., 0.5, 0.5], - [0.5, 0.5, 0. ]], np.float64) +tetra_points_out: npt.NDArray[np.float64] = np.array([[0., 0., 0. ], [1., 0., 0. ], [0., 0., 1. ], [0., 1., 0. ], [0.5, 0., 0. ], [0.5, 0., 0.5], [0., 0., 0.5], [0., 0.5, 0. ], [0., 0.5, 0.5], [0.5, 0.5, 0. ]], np.float64) tetra_cells_out: list[list[int]] = [[0, 4, 6, 7], [7, 9, 8, 3], [9, 4, 5, 1], @@ -64,14 +55,8 @@ # create single hexa mesh # ############################################################### hexa_cell_type: int = VTK_HEXAHEDRON -hexa_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], - [1, 0, 0], - [1, 1, 0], - [0, 1, 0], - [0, 0, 1], - [1, 0, 1], - [1, 1, 1], - [0, 1, 1]], np.float64) +hexa_path = "hexa_cell.csv" + # expected results hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0], [0.0, 1.0, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5], [1.0, 0.5, 0.0], [1.0, 0.0, 0.5], [0.5, 1.0, 0.0], [1.0, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 0.0, 1.0], [0.0, 0.5, 1.0], [1.0, 0.5, 1.0], [0.5, 1.0, 1.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [1.0, 0.5, 0.5], [0.5, 1.0, 0.5], [0.5, 0.5, 1.0], [0.5, 0.5, 0.5]], np.float64) hexa_cells_out: list[list[int]] = [[10, 21, 26, 22, 4, 16, 25, 17], @@ -87,11 +72,8 @@ # create single pyramid mesh # ############################################################### pyramid_cell_type: int = VTK_PYRAMID -pyramid_cell: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0], - [1.0, 0.0, 0], - [1.0, 1.0, 0], - [0.0, 1.0, 0], - [0.5, 0.5, 1]], np.float64) +pyramid_path = "pyramid_cell.csv" + # expected results pyramid_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.5, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.25, 0.25, 0.5], [1.0, 0.5, 0.0], [0.75, 0.25, 0.5], [0.5, 1.0, 0.0], [0.75, 0.75, 0.5], [0.25, 0.75, 0.5], [0.5, 0.5, 0.0]], np.float64) pyramid_cells_out: list[list[int]] = [[5, 1, 8, 13, 9], @@ -109,9 +91,8 @@ # create single triangle mesh # ############################################################### triangle_cell_type: int = VTK_TRIANGLE -triangle_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], - [1, 0, 0], - [0, 1, 0]], np.float64) +triangle_path = "triangle_cell.csv" + # expected results triangle_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0]], np.float64) triangle_cells_out: list[list[int]] = [[0, 3, 5], @@ -123,10 +104,8 @@ # create single quad mesh # ############################################################### quad_cell_type: int = VTK_QUAD -quad_cell: npt.NDArray[np.float64] = np.array([[0, 0, 0], - [1, 0, 0], - [1, 1, 0], - [0, 1, 0]], np.float64) +quad_path = "quad_cell.csv" + # expected results quad_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0]], np.float64) quad_cells_out: list[list[int]] = [[0, 4, 8, 7], @@ -140,8 +119,8 @@ # TODO: add tests cases composed of multi-cell meshes of various types +data_filename_all = (tetra_path, hexa_path, pyramid_path, triangle_path, quad_path) cell_types_all = (tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type) -cell_all = (tetra_cell, hexa_cell, pyramid_cell, triangle_cell, quad_cell) points_out_all = (tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out) cells_out_all = (tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out) @@ -159,51 +138,28 @@ class TestCase: cellsExp: list[int] - -def __create_single_cell_type_mesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtkUnstructuredGrid: - """Create a mesh that consists of a single cell. - - Args: - cellType (int): cell type - pts_coord (npt.NDArray[np.float64]): cell point coordinates - - Returns: - vtkUnstructuredGrid: output mesh - """ - nbPoints: int = ptsCoord.shape[0] - points: npt.NDArray[np.float64] = np.vstack((ptsCoord,)) - # Convert points to vtkPoints object - vtkpts: vtkPoints = vtkPoints() - vtkpts.SetData(numpy_to_vtk(points)) - - # create cells from point ids - cellsID: vtkIdList = vtkIdList() - for j in range( nbPoints ): - cellsID.InsertNextId(j) - - # add cell to mesh - mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() - mesh.SetPoints(vtkpts) - mesh.Allocate(1) - mesh.InsertNextCell(cellType, cellsID) - return mesh - def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: """Generate test cases. Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, ptsCoord, pointsExp, cellsExp in zip( - cell_types_all, cell_all, points_out_all, cells_out_all, + for cellType, data_path, pointsExp, cellsExp in zip( + cell_types_all, data_filename_all, points_out_all, cells_out_all, strict=True): - mesh: vtkUnstructuredGrid = __create_single_cell_type_mesh(cellType, ptsCoord) + ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, data_path), dtype=float, delimiter=',') + mesh: vtkUnstructuredGrid = createSingleCellMesh(cellType, ptsCoord) yield TestCase( cellType, mesh, pointsExp, cellsExp ) ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] @pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) def test_single_cell_split( test_case: TestCase ): + """Test of SplitMesh filter with meshes composed of a single cell. + + Args: + test_case (TestCase): test case + """ cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) filter :SplitMesh = SplitMesh() filter.SetInputDataObject(test_case.mesh) diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py new file mode 100644 index 000000000..23c684764 --- /dev/null +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -0,0 +1,103 @@ +# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import os +from dataclasses import dataclass +import numpy as np +import numpy.typing as npt +import pytest +from typing import ( + Iterator, +) + +from geos.mesh.processing.helpers import createSingleCellMesh + +from vtkmodules.util.numpy_support import vtk_to_numpy + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellArray, + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID +) + +from vtkmodules.vtkCommonCore import ( + vtkPoints, + vtkIdList, + reference, +) + +# inputs +data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") + +data_filename_all: tuple[str,...] = ("triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", "hexa_cell.csv") +cell_type_all: tuple[int, ...] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON) + + +@dataclass( frozen=True ) +class TestCase: + """Test case""" + __test__ = False + #: VTK cell type + cellType: int + #: cell point coordinates + cellPoints: npt.NDArray[np.float64] + +def __generate_test_data() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for cellType, path in zip( + cell_type_all, data_filename_all, + strict=True): + cell: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + yield TestCase( cellType, cell ) + + +ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_type_all] +@pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) +def test_createSingleCellMesh( test_case: TestCase ): + """Test of createSingleCellMesh method. + + Args: + test_case (TestCase): test case + """ + cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) + output: vtkUnstructuredGrid = createSingleCellMesh(test_case.cellType, test_case.cellPoints) + + assert output is not None, "Output mesh is undefined." + pointsOut: vtkPoints = output.GetPoints() + nbPtsExp: int = len(test_case.cellPoints) + assert pointsOut is not None, "Points from output mesh are undefined." + assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print("Points coords: ", cellTypeName, pointCoords.tolist()) + assert np.array_equal(pointCoords.ravel(), test_case.cellPoints.ravel()), "Points coordinates are wrong." + + cellsOut: vtkCellArray = output.GetCells() + typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) + print("typesArray0", cellTypeName, typesArray0) + + assert cellsOut is not None, "Cells from output mesh are undefined." + assert cellsOut.GetNumberOfCells() == 1, "Number of cells is expected to be 1." + # check cell types + types: vtkCellTypes = vtkCellTypes() + output.GetCellTypes(types) + assert types is not None, "Cell types must be defined" + typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + + print("typesArray", cellTypeName, typesArray) + assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"Cell must be {cellTypeName}" + + ptIds = vtkIdList() + cellsOut.GetCellAtId(0, ptIds) + cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] + + print("cell type", cellTypeName, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(0))) + print("cellsOutObs: ", cellTypeName, cellsOutObs) + assert ptIds is not None, "Point ids must be defined" + assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." + assert cellsOutObs == list(range(nbPtsExp)), "Cell point ids are wrong." + diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py new file mode 100644 index 000000000..6044ce995 --- /dev/null +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -0,0 +1,159 @@ +# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import os +from dataclasses import dataclass +import numpy as np +import numpy.typing as npt +import pytest +from typing import ( + Iterator, +) + +from geos.mesh.processing.helpers import getBounds, createVertices, createMultiCellMesh + +from vtkmodules.util.numpy_support import vtk_to_numpy + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellArray, + vtkCellTypes, + VTK_TETRA, VTK_HEXAHEDRON, +) + +from vtkmodules.vtkCommonCore import ( + vtkPoints, + vtkIdList, +) + +# TODO: add case whith various cell types + +# inputs +data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") +data_filename_all: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") +celltypes_all: tuple[int] = (VTK_TETRA, VTK_HEXAHEDRON) +nbPtsCell_all: tuple[int] = (4, 8) + +# expected results if shared vertices +hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.0, 0.0, 1.0], [0.5, 0.0, 1.0], [0.5, 0.5, 1.0], [0.0, 0.5, 1.0], [1.0, 0.0, 0.5], [1.0, 0.5, 0.5], [1.0, 0.0, 1.0], [1.0, 0.5, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [1.0, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 1.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 0.5], [1.0, 1.0, 1.0], [0.5, 1.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0]], np.float64) +tetra_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.0, 1.0, 0.0], [0.5, 0.0, 0.5], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]], np.float64) +points_out_all = (tetra_points_out, hexa_points_out) + +tetra_cellPtsIdsExp = [(0, 1, 2, 3), (3, 4, 5, 6), (4, 1, 7, 8), (7, 2, 5, 9), (2, 5, 3, 1), (1, 5, 3, 4), (1, 5, 4, 7), (7, 1, 5, 2)] +hexa_cellPtsIdsExp = [(0, 1, 2, 3, 4, 5, 6, 7), (1, 8, 9, 2, 5, 10, 11, 6), (12, 13, 14, 15, 0, 1, 2, 3), (13, 16, 17, 14, 1, 8, 9, 2), (3, 2, 18, 19, 7, 6, 20, 21), (2, 9, 22, 18, 6, 11, 23, 20), (15, 14, 24, 25, 3, 2, 18, 19), (14, 17, 26, 24, 2, 9, 22, 18)] +cellPtsIdsExp_all = (tetra_cellPtsIdsExp, hexa_cellPtsIdsExp) + +@dataclass( frozen=True ) +class TestCase: + """Test case""" + __test__ = False + #: cell types + cellTypes: list[int] + #: cell point coordinates + cellPtsCoords: list[npt.NDArray[np.float64]] + #: share or unshare vertices + share: bool + #: expected points + pointsExp: npt.NDArray[np.float64] + #: expected cell point ids + cellPtsIdsExp: tuple[tuple[int]] + +def __generate_test_data() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for path, celltype, nbPtsCell, pointsExp0, cellPtsIdsExp0 in zip(data_filename_all, celltypes_all, nbPtsCell_all, points_out_all, cellPtsIdsExp_all, strict=True): + # all points coordinates + ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + # split array to get a list of coordinates per cell + cellPtsCoords = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] + nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) + cellTypes = nbCells * [celltype] + for shared in (False, True): + pointsExp: npt.NDArray[np.float64] = pointsExp0 if shared else ptsCoords + cellPtsIdsExp = cellPtsIdsExp0 if shared else [tuple(range(i*nbPtsCell, (i+1)*nbPtsCell, 1)) for i in range(nbCells)] + yield TestCase( cellTypes, cellPtsCoords, shared, pointsExp, cellPtsIdsExp ) + + +ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] +@pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) +def test_createVertices( test_case: TestCase ): + """Test of createVertices method. + + Args: + test_case (TestCase): test case + """ + pointsOut: vtkPoints + cellPtsIds: list[tuple[int, ...]] + pointsOut, cellPtsIds = createVertices(test_case.cellPtsCoords, test_case.share) + assert pointsOut is not None, "Output points is undefined." + assert cellPtsIds is not None, "Output cell point map is undefined." + nbPtsExp: int = test_case.pointsExp.shape[0] + assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print("Points coords Obs: ", pointCoords.tolist()) + assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." + print("Cell points coords: ", cellPtsIds) + assert cellPtsIds == test_case.cellPtsIdsExp, f"Cell point Ids are expected to be {test_case.cellPtsIdsExp}" + +ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] +@pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) +def test_createMultiCellMesh( test_case: TestCase ): + """Test of createMultiCellMesh method. + + Args: + test_case (TestCase): test case + """ + output: vtkUnstructuredGrid = createMultiCellMesh(test_case.cellTypes, test_case.cellPtsCoords, test_case.share) + assert output is not None, "Output mesh is undefined." + + # tests on points + pointsOut: vtkPoints = output.GetPoints() + assert pointsOut is not None, "Output points is undefined." + nbPtsExp: int = test_case.pointsExp.shape[0] + assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." + pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) + print("Points coords Obs: ", pointCoords.tolist()) + assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." + + # tests on cells + cellsOut: vtkCellArray = output.GetCells() + assert cellsOut is not None, "Cells from output mesh are undefined." + nbCells: int = len(test_case.cellPtsCoords) + assert cellsOut.GetNumberOfCells() == nbCells, f"Number of cells is expected to be {nbCells}." + + # check cell types + types: vtkCellTypes = vtkCellTypes() + output.GetCellTypes(types) + assert types is not None, "Cell types must be defined" + typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + print("typesArray.size ", typesArray.size) + assert (typesArray.size == 1) and (typesArray[0] == test_case.cellTypes[0]), f"Cell types are wrong" + + for cellId in range(output.GetNumberOfCells()): + ptIds = vtkIdList() + cellsOut.GetCellAtId(cellId, ptIds) + cellsOutObs: tuple[int] = tuple([ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())]) + print("cellsOutObs: ", cellsOutObs) + nbCellPts: int = len(test_case.cellPtsIdsExp[cellId]) + assert ptIds is not None, "Point ids must be defined" + assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." + assert cellsOutObs == test_case.cellPtsIdsExp[cellId], "Cell point ids are wrong." + +def test_getBounds( ): + """Test of getBounds method.""" + # input + cellPtsCoord: list[npt.NDArray[np.float64]] = [ + np.array([[5, 4, 3], [1, 8, 4], [2, 5, 7]], dtype=float), + np.array([[1, 4, 6], [2, 7, 9], [4, 5 ,6]], dtype=float), + np.array([[3, 7, 8], [5, 7, 3], [4, 7, 3]], dtype=float), + np.array([[1, 7, 2], [0, 1, 2], [2, 3, 7]], dtype=float), + ] + # expected output + boundsExp: list[float] = [0., 5., 1., 8., 2., 9.] + boundsObs: list[float] = getBounds(cellPtsCoord) + assert boundsExp == boundsObs, f"Expected bounds are {boundsExp}." + + \ No newline at end of file From 5544b5ff6ff2cefc8726205874fc2f9dc9c03129 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Mon, 14 Apr 2025 14:25:10 +0200 Subject: [PATCH 06/57] fix and add tests to MergeColocatedPoints --- .../mesh/processing/MergeColocatedPoints.py | 89 +++++++++-- .../src/geos/mesh/processing/SplitMesh.py | 66 ++++---- geos-mesh/src/geos/mesh/processing/helpers.py | 10 +- geos-mesh/tests/test_MergeColocatedPoints.py | 148 ++++++++---------- .../test_helpers_createSingleCellMesh.py | 15 +- .../tests/test_helpers_createVertices.py | 19 ++- 6 files changed, 194 insertions(+), 153 deletions(-) diff --git a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py index d55c31d31..d69c46d22 100644 --- a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py +++ b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay +import numpy as np from typing_extensions import Self from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase from vtkmodules.vtkCommonCore import ( @@ -8,11 +9,14 @@ vtkInformation, vtkInformationVector, vtkPoints, - reference + reference, + vtkIdList, ) from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkIncrementalOctreePointLocator, + vtkCellTypes, + vtkCell, ) @@ -44,7 +48,8 @@ """ class MergeColocatedPoints(VTKPythonAlgorithmBase): - def __init__(self: Self ): + def __init__(self: Self ) ->None: + """MergeColocatedPoints filter merge duplacted points of the input mesh.""" super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: @@ -60,7 +65,7 @@ def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> i if port == 0: info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - def RequestDataObject(self: Self, + def RequestDataObject(self: Self, request: vtkInformation, # noqa: F841 inInfoVec: list[ vtkInformationVector ], # noqa: F841 outInfoVec: vtkInformationVector, @@ -83,7 +88,7 @@ def RequestDataObject(self: Self, outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) return super().RequestDataObject(request, inInfoVec, outInfoVec) - def RequestData(self: Self, + def RequestData(self: Self, request: vtkInformation, # noqa: F841 inInfoVec: list[ vtkInformationVector ], # noqa: F841 outInfoVec: vtkInformationVector, @@ -100,28 +105,82 @@ def RequestData(self: Self, """ inData: vtkUnstructuredGrid = vtkUnstructuredGrid.GetData( inInfoVec[ 0 ] ) output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) + assert inData is not None, "Input mesh is undefined." + assert output is not None, "Output mesh is undefined." + vertexMap: list[int] = self.setMergePoints(inData, output) + self.setCells(inData, output, vertexMap) + return 1 + + def setMergePoints(self :Self, + input: vtkUnstructuredGrid, + output: vtkUnstructuredGrid + ) ->list[int]: + """Merge duplicated points and set new points and attributes to output mesh. + + Args: + input (vtkUnstructuredGrid): input mesh + output (vtkUnstructuredGrid): output mesh + + Returns: + list[int]: list containing new point ids. + """ + vertexMap: list[int] = [] newPoints: vtkPoints = vtkPoints() # use point locator to check for colocated points - merge_points = vtkIncrementalOctreePointLocator() - merge_points.InitPointInsertion(newPoints,inData.GetBounds()) + pointsLocator = vtkIncrementalOctreePointLocator() + pointsLocator.InitPointInsertion(newPoints,input.GetBounds()) # create an array to count the number of colocated points vertexCount: vtkIntArray = vtkIntArray() vertexCount.SetName("Count") ptId = reference(0) - countD: int = 0 - for v in range(inData.GetNumberOfPoints()): - inserted: bool = merge_points.InsertUniquePoint( inData.GetPoints().GetPoint(v), ptId) + countD: int = 0 # total number of colocated points + for v in range(input.GetNumberOfPoints()): + inserted: bool = pointsLocator.InsertUniquePoint( input.GetPoints().GetPoint(v), ptId) if inserted: vertexCount.InsertNextValue(1) else: vertexCount.SetValue( ptId, vertexCount.GetValue(ptId) + 1) countD = countD + 1 - - output.SetPoints(merge_points.GetLocatorPoints()) + vertexMap += [ptId.get()] + + output.SetPoints(pointsLocator.GetLocatorPoints()) # copy point attributes - output.GetPointData().DeepCopy(inData.GetPointData()) + output.GetPointData().DeepCopy(input.GetPointData()) # add the array to points data output.GetPointData().AddArray(vertexCount) + return vertexMap + + def setCells(self :Self, + input: vtkUnstructuredGrid, + output: vtkUnstructuredGrid, + vertexMap: list[int]) ->bool: + """Set cell point ids and attributes to output mesh. + + Args: + input (vtkUnstructuredGrid): input mesh + output (vtkUnstructuredGrid): output mesh + vertexMap (list[int)]): list containing new point ids + + Returns: + bool: True if calculation successfully ended. + """ + nbCells: int = input.GetNumberOfCells() + nbPoints: int = output.GetNumberOfPoints() + assert np.unique(vertexMap).size == nbPoints, "The size of the list of point ids must be equal to the number of points." + cellTypes: vtkCellTypes = vtkCellTypes() + input.GetCellTypes(cellTypes) + output.Allocate(nbCells) + # create mesh cells + for cellId in range(nbCells): + cell: vtkCell = input.GetCell(cellId) + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for ptId in range(cell.GetNumberOfPoints()): + ptIdOld: int = cell.GetPointId(ptId) + ptIdNew: int = vertexMap[ptIdOld] + cellsID.InsertNextId(ptIdNew) + output.InsertNextCell(cell.GetCellType(), cellsID) # copy cell attributes - output.GetCellData().DeepCopy(inData.GetCellData()) - return 1 \ No newline at end of file + assert output.GetNumberOfCells() == nbCells, "Output and input mesh must have the same number of cells." + output.GetCellData().DeepCopy(input.GetCellData()) + return True diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index 99c1c5f13..90cdaac52 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -13,7 +13,7 @@ vtkInformationVector, ) from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkCellArray, vtkCellData, vtkCell, @@ -21,7 +21,7 @@ VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, ) -from vtkmodules.util.numpy_support import (numpy_to_vtk, +from vtkmodules.util.numpy_support import (numpy_to_vtk, vtk_to_numpy) __doc__ = """ @@ -50,7 +50,8 @@ class SplitMesh(VTKPythonAlgorithmBase): - def __init__(self): + def __init__(self) ->None: + """SplitMesh filter split each cell using edge centers.""" super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") self.inData: vtkUnstructuredGrid @@ -72,7 +73,7 @@ def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> in if port == 0: info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - def RequestDataObject(self: Self, + def RequestDataObject(self: Self, request: vtkInformation, # noqa: F841 inInfoVec: list[ vtkInformationVector ], # noqa: F841 outInfoVec: vtkInformationVector, @@ -93,9 +94,9 @@ def RequestDataObject(self: Self, if outData is None or (not outData.IsA(inData.GetClassName())): outData = inData.NewInstance() outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) + return super().RequestDataObject(request, inInfoVec, outInfoVec) - def RequestData(self: Self, + def RequestData(self: Self, request: vtkInformation, # noqa: F841 inInfoVec: list[ vtkInformationVector ], # noqa: F841 outInfoVec: vtkInformationVector, @@ -112,21 +113,18 @@ def RequestData(self: Self, """ self.inData = self.GetInputData(inInfoVec, 0, 0) output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) - + assert self.inData is not None, "Input mesh is undefined." assert output is not None, "Output mesh is undefined." nb_cells: int = self.inData.GetNumberOfCells() nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad = self._get_cell_counts() - + self.points = vtkPoints() self.points.DeepCopy(self.inData.GetPoints()) nbNewPoints: int = 0 volumeCellCounts = nb_hex + nb_tet + nb_pyr - if volumeCellCounts > 0: - nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 - else: - nbNewPoints = nb_triangles * 3 + nb_quad * 5 + nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 if volumeCellCounts > 0 else nb_triangles * 3 + nb_quad * 5 nbNewCells: int = nb_hex * 8 + nb_tet * 8 + nb_pyr * 10 * nb_triangles * 4 + nb_quad * 4 self.points.Resize( self.inData.GetNumberOfPoints() + nbNewPoints) @@ -189,7 +187,7 @@ def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: if cellType == VTK_QUAD: nb_quad = nb_quad + 1 return nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad - + def _addMidPoint( self: Self, ptA :int, ptB :int) ->int: """Add a point at the center of the edge defined by input point ids. @@ -204,7 +202,7 @@ def _addMidPoint( self: Self, ptA :int, ptB :int) ->int: ptBCoor: npt.NDArray[np.float64] = np.array(self.points.GetPoint(ptB)) center: npt.NDArray[np.float64] = (ptACoor + ptBCoor) / 2. return self.points.InsertNextPoint(center[0], center[1], center[2]) - + def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: r"""Split a tetrahedron. @@ -238,7 +236,7 @@ def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: pt7: int = self._addMidPoint(pt0,pt3) pt8: int = self._addMidPoint(pt2,pt3) pt9: int = self._addMidPoint(pt1,pt3) - + self.cells.InsertNextCell(4, [pt0,pt4,pt6,pt7]) self.cells.InsertNextCell(4, [pt7,pt9,pt8,pt3]) self.cells.InsertNextCell(4, [pt9,pt4,pt5,pt1]) @@ -247,7 +245,7 @@ def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: self.cells.InsertNextCell(4, [pt4,pt8,pt7,pt9]) self.cells.InsertNextCell(4, [pt4,pt8,pt9,pt5]) self.cells.InsertNextCell(4, [pt5,pt4,pt8,pt6]) - for i in range(8): + for _ in range(8): self.originalId.InsertNextValue(index) self.cellTypes.extend([VTK_TETRA]*8) @@ -290,19 +288,19 @@ def _split_pyramid(self :Self, cell: vtkCell, index: int) -> None: pt11: int = self._addMidPoint(pt2,pt4) pt12: int = self._addMidPoint(pt3,pt4) pt13: int = self._addMidPoint(pt5,pt10) - + self.cells.InsertNextCell(5, [pt5,pt1,pt8,pt13,pt9]) self.cells.InsertNextCell(5, [pt13,pt8,pt2,pt10,pt11]) self.cells.InsertNextCell(5, [pt3,pt6,pt13,pt10,pt12]) self.cells.InsertNextCell(5, [pt6,pt0,pt5,pt13,pt7]) self.cells.InsertNextCell(5, [pt12,pt7,pt9,pt11,pt4]) self.cells.InsertNextCell(5, [pt11,pt9,pt7,pt12,pt13]) - + self.cells.InsertNextCell(4, [pt7,pt9,pt5,pt13]) self.cells.InsertNextCell(4, [pt9,pt11,pt8,pt13]) self.cells.InsertNextCell(4, [pt11,pt12,pt10,pt13]) self.cells.InsertNextCell(4, [pt12,pt7,pt6,pt13]) - for i in range(10): + for _ in range(10): self.originalId.InsertNextValue(index) self.cellTypes.extend([VTK_PYRAMID]*8) @@ -328,7 +326,6 @@ def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) pt1: int = cell.GetPointId(1) pt2: int = cell.GetPointId(2) @@ -356,7 +353,7 @@ def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: pt24: int = self._addMidPoint(pt14,pt15) pt25: int = self._addMidPoint(pt17,pt18) pt26: int = self._addMidPoint(pt22,pt23) - + self.cells.InsertNextCell(8, [pt10,pt21,pt26,pt22,pt4,pt16,pt25,pt17]) self.cells.InsertNextCell(8, [pt21,pt12,pt23,pt26,pt16,pt5,pt18,pt25]) self.cells.InsertNextCell(8, [pt0,pt8,pt20,pt9,pt10,pt21,pt26,pt22]) @@ -365,7 +362,7 @@ def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: self.cells.InsertNextCell(8, [pt26,pt23,pt14,pt24,pt25,pt18,pt6,pt19]) self.cells.InsertNextCell(8, [pt9,pt20,pt13,pt3,pt22,pt26,pt24,pt15]) self.cells.InsertNextCell(8, [pt20,pt11,pt2,pt13,pt26,pt23,pt14,pt24]) - for i in range(8): + for _ in range(8): self.originalId.InsertNextValue(index) self.cellTypes.extend([VTK_HEXAHEDRON]*8) @@ -375,12 +372,12 @@ def _split_triangle(self :Self, cell: vtkCell, index: int) -> None: Let's suppose an input triangle composed of nodes (0, 1, 2), the cell is splitted in 3 triangles using edge centers. - 2 - |\ - | \ - 5 4 - | \ - | \ + 2 + |\ + | \ + 5 4 + | \ + | \ 0-----3----1 Args: @@ -393,12 +390,12 @@ def _split_triangle(self :Self, cell: vtkCell, index: int) -> None: pt3: int = self._addMidPoint(pt0,pt1) pt4: int = self._addMidPoint(pt1,pt2) pt5: int = self._addMidPoint(pt0,pt2) - + self.cells.InsertNextCell(3, [pt0,pt3,pt5]) self.cells.InsertNextCell(3, [pt3,pt1,pt4]) self.cells.InsertNextCell(3, [pt5,pt4,pt2]) self.cells.InsertNextCell(3, [pt3,pt4,pt5]) - for i in range(4): + for _ in range(4): self.originalId.InsertNextValue(index) self.cellTypes.extend([VTK_TRIANGLE]*4) @@ -420,7 +417,6 @@ def _split_quad(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) pt1: int = cell.GetPointId(1) pt2: int = cell.GetPointId(2) @@ -430,16 +426,16 @@ def _split_quad(self :Self, cell: vtkCell, index: int) -> None: pt6: int = self._addMidPoint(pt2,pt3) pt7: int = self._addMidPoint(pt3,pt0) pt8: int = self._addMidPoint(pt7,pt5) - + self.cells.InsertNextCell(4, [pt0,pt4,pt8,pt7]) self.cells.InsertNextCell(4, [pt4,pt1,pt5,pt8]) self.cells.InsertNextCell(4, [pt8,pt5,pt2,pt6]) self.cells.InsertNextCell(4, [pt7,pt8,pt6,pt3]) - for i in range(4): + for _ in range(4): self.originalId.InsertNextValue(index) self.cellTypes.extend([VTK_QUAD]*4) - def _transferCellArrays(self :Self, + def _transferCellArrays(self :Self, splittedMesh: vtkUnstructuredGrid ) ->bool: """Transfer arrays from input mesh to splitted mesh. @@ -474,4 +470,4 @@ def _transferCellArrays(self :Self, cellDataSplitted.AddArray(newArray) cellDataSplitted.Modified() splittedMesh.Modified() - return True \ No newline at end of file + return True diff --git a/geos-mesh/src/geos/mesh/processing/helpers.py b/geos-mesh/src/geos/mesh/processing/helpers.py index bf3f35786..2122aedf9 100644 --- a/geos-mesh/src/geos/mesh/processing/helpers.py +++ b/geos-mesh/src/geos/mesh/processing/helpers.py @@ -8,7 +8,7 @@ from vtkmodules.util.numpy_support import numpy_to_vtk from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkIncrementalOctreePointLocator ) @@ -64,7 +64,7 @@ def createSingleCellMesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtk mesh.InsertNextCell(cellType, cellsID) return mesh -def createMultiCellMesh(cellTypes: list[int], +def createMultiCellMesh(cellTypes: list[int], cellPtsCoord: list[npt.NDArray[np.float64]], sharePoints: bool = True ) ->vtkUnstructuredGrid: @@ -90,15 +90,15 @@ def createMultiCellMesh(cellTypes: list[int], mesh.SetPoints(points) mesh.Allocate(nbCells) # create mesh cells - for cellType, ptsId in zip(cellTypes, cellVertexMapAll, strict=True): + for cellType, ptsId in zip(cellTypes, cellVertexMapAll, strict=True): # create cells from point ids cellsID: vtkIdList = vtkIdList() for ptId in ptsId: - cellsID.InsertNextId(ptId) + cellsID.InsertNextId(ptId) mesh.InsertNextCell(cellType, cellsID) return mesh -def createVertices(cellPtsCoord: list[npt.NDArray[np.float64]], +def createVertices(cellPtsCoord: list[npt.NDArray[np.float64]], shared: bool = True ) -> tuple[vtkPoints, list[tuple[int, ...]]]: """Create vertices from cell point coordinates list. diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py index ea8db4c0a..c37ba5465 100644 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -6,129 +6,117 @@ import numpy as np import numpy.typing as npt import pytest -from typing_extensions import Self from typing import ( Iterator, ) -from geos.mesh.processing.helpers import create_single_cell_mesh +from geos.mesh.processing.helpers import createMultiCellMesh from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkCellArray, - vtkCellData, vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, + VTK_TETRA, VTK_HEXAHEDRON, ) from vtkmodules.vtkCommonCore import ( vtkPoints, vtkIdList, - vtkDataArray, ) - -#from vtkmodules.vtkFiltersSources import vtkCubeSource - - data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") +data_filename_all: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") +celltypes_all: tuple[int] = (VTK_TETRA, VTK_HEXAHEDRON) +nbPtsCell_all: tuple[int] = (4, 8) +# expected results if shared vertices +hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.0, 0.0, 1.0], [0.5, 0.0, 1.0], [0.5, 0.5, 1.0], [0.0, 0.5, 1.0], [1.0, 0.0, 0.5], [1.0, 0.5, 0.5], [1.0, 0.0, 1.0], [1.0, 0.5, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [1.0, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 1.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 0.5], [1.0, 1.0, 1.0], [0.5, 1.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0]], np.float64) +tetra_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.0, 1.0, 0.0], [0.5, 0.0, 0.5], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]], np.float64) +points_out_all = (tetra_points_out, hexa_points_out) - -data_filename_all = (tetra_path, hexa_path, pyramid_path, triangle_path, quad_path) -cell_types_all = (tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type) -points_out_all = (tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out) -cells_out_all = (tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out) +tetra_cellPtsIdsExp = [(0, 1, 2, 3), (3, 4, 5, 6), (4, 1, 7, 8), (7, 2, 5, 9), (2, 5, 3, 1), (1, 5, 3, 4), (1, 5, 4, 7), (7, 1, 5, 2)] +hexa_cellPtsIdsExp = [(0, 1, 2, 3, 4, 5, 6, 7), (1, 8, 9, 2, 5, 10, 11, 6), (12, 13, 14, 15, 0, 1, 2, 3), (13, 16, 17, 14, 1, 8, 9, 2), (3, 2, 18, 19, 7, 6, 20, 21), (2, 9, 22, 18, 6, 11, 23, 20), (15, 14, 24, 25, 3, 2, 18, 19), (14, 17, 26, 24, 2, 9, 22, 18)] +cellPtsIdsExp_all = (tetra_cellPtsIdsExp, hexa_cellPtsIdsExp) @dataclass( frozen=True ) class TestCase: - """Test case""" + """Test case.""" __test__ = False - #: VTK cell type - cellType: int - #: mesh + #: input mesh mesh: vtkUnstructuredGrid - #: expected new point coordinates + #: expected points pointsExp: npt.NDArray[np.float64] - #: expected new cell point ids - cellsExp: list[int] - + #: expected cell point ids + cellPtsIdsExp: tuple[tuple[int]] + -def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: +def __generate_test_data() -> Iterator[ TestCase ]: """Generate test cases. Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, data_path, pointsExp, cellsExp in zip( - cell_types_all, data_filename_all, points_out_all, cells_out_all, - strict=True): - ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, data_path), dtype=float, delimiter=',') - mesh: vtkUnstructuredGrid = create_single_cell_mesh(cellType, ptsCoord) - yield TestCase( cellType, mesh, pointsExp, cellsExp ) - - -ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] -@pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) -def test_single_cell_split( test_case: TestCase ): - """Test of SplitMesh filter with meshes composed of a single cell. + for path, celltype, nbPtsCell, pointsExp, cellPtsIdsExp in zip(data_filename_all, celltypes_all, nbPtsCell_all, points_out_all, cellPtsIdsExp_all, strict=True): + # all points coordinates + ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + # split array to get a list of coordinates per cell + cellPtsCoords = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] + nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) + cellTypes = nbCells * [celltype] + mesh: vtkUnstructuredGrid = createMultiCellMesh(cellTypes, cellPtsCoords, False) + assert mesh is not None, "Input mesh is undefined." + yield TestCase( mesh, pointsExp, cellPtsIdsExp ) + + +ids: list[str] = [os.path.splitext(name)[0] for name in data_filename_all] +@pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) +def test_mergeColocatedPoints( test_case: TestCase ) ->None: + """Test of MergeColocatedPoints filter.. Args: test_case (TestCase): test case """ - cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) - filter :MergeColocatedPoints = MergeColocatedPoints() - filter.SetInputDataObject(test_case.mesh) + filter = MergeColocatedPoints() + filter.SetInputDataObject(0, test_case.mesh) filter.Update() - output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) - assert output is not None, "Output mesh is undefined." + output: vtkUnstructuredGrid = filter.GetOutputDataObject(0) + # tests on points pointsOut: vtkPoints = output.GetPoints() - assert pointsOut is not None, "Points from output mesh are undefined." - assert pointsOut.GetNumberOfPoints() == test_case.pointsExp.shape[0], f"Number of points is expected to be {test_case.pointsExp.shape[0]}." + assert pointsOut is not None, "Output points is undefined." + nbPtsExp: int = test_case.pointsExp.shape[0] + assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords: ", cellTypeName, pointCoords.tolist()) - assert np.array_equal(pointCoords.ravel(), test_case.pointsExp.ravel()), "Points coordinates mesh are wrong." + print("Points coords Obs: ", pointCoords.tolist()) + assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." + # tests on cells cellsOut: vtkCellArray = output.GetCells() - typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) - print("typesArray0", cellTypeName, typesArray0) - assert cellsOut is not None, "Cells from output mesh are undefined." - assert cellsOut.GetNumberOfCells() == len(test_case.cellsExp), f"Number of cells is expected to be {len(test_case.cellsExp)}." + nbCells: int = test_case.mesh.GetNumberOfCells() + assert cellsOut.GetNumberOfCells() == nbCells, f"Number of cells is expected to be {nbCells}." + # check cell types - types: vtkCellTypes = vtkCellTypes() - output.GetCellTypes(types) - assert types is not None, "Cell types must be defined" - typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) - - print("typesArray", cellTypeName, typesArray) - assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"All cells must be {cellTypeName}" - - for i in range(cellsOut.GetNumberOfCells()): + typesInput: vtkCellTypes = vtkCellTypes() + test_case.mesh.GetCellTypes(typesInput) + assert typesInput is not None, "Input cell types must be defined" + typesOutput: vtkCellTypes = vtkCellTypes() + output.GetCellTypes(typesOutput) + assert typesOutput is not None, "Output cell types must be defined" + typesArrayInput: npt.NDArray[np.int64] = vtk_to_numpy(typesInput.GetCellTypesArray()) + typesArrayOutput: npt.NDArray[np.int64] = vtk_to_numpy(typesOutput.GetCellTypesArray()) + assert np.array_equal(typesArrayInput, typesArrayOutput), "Cell types are wrong" + + for cellId in range(output.GetNumberOfCells()): ptIds = vtkIdList() - cellsOut.GetCellAtId(i, ptIds) - cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] - nbPtsExp: int = len(test_case.cellsExp[i]) - print("cell type", cellTypeName, i, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(i))) - print("cellsOutObs: ", cellTypeName, i, cellsOutObs) + cellsOut.GetCellAtId(cellId, ptIds) + cellsOutObs: tuple[int] = tuple([ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())]) + print("cellsOutObs: ", cellsOutObs) + nbCellPts: int = len(test_case.cellPtsIdsExp[cellId]) assert ptIds is not None, "Point ids must be defined" - assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." - assert cellsOutObs == test_case.cellsExp[i], "Cell point ids are wrong." - - # test originalId array was created - cellData: vtkCellData = output.GetCellData() - assert cellData is not None, "Cell data should be defined." - array: vtkDataArray = cellData.GetArray("OriginalID") - assert array is not None, "OriginalID array should be defined." - - # test other arrays were transferred - cellDataInput: vtkCellData = test_case.mesh.GetCellData() - assert cellDataInput is not None, "Cell data from input mesh should be defined." - nbArrayInput: int = cellDataInput.GetNumberOfArrays() - nbArraySplited: int = cellData.GetNumberOfArrays() - assert nbArraySplited == nbArrayInput + 1, f"Number of arrays should be {nbArrayInput + 1}" - - + assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." + assert cellsOutObs == test_case.cellPtsIdsExp[cellId], "Cell point ids are wrong." + + diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py index 23c684764..699b1c46b 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -15,7 +15,7 @@ from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkCellArray, vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID @@ -24,7 +24,6 @@ from vtkmodules.vtkCommonCore import ( vtkPoints, vtkIdList, - reference, ) # inputs @@ -36,7 +35,7 @@ @dataclass( frozen=True ) class TestCase: - """Test case""" + """Test case.""" __test__ = False #: VTK cell type cellType: int @@ -54,11 +53,11 @@ def __generate_test_data() -> Iterator[ TestCase ]: strict=True): cell: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') yield TestCase( cellType, cell ) - + ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_type_all] @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createSingleCellMesh( test_case: TestCase ): +def test_createSingleCellMesh( test_case: TestCase ) ->None: """Test of createSingleCellMesh method. Args: @@ -87,14 +86,14 @@ def test_createSingleCellMesh( test_case: TestCase ): output.GetCellTypes(types) assert types is not None, "Cell types must be defined" typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) - + print("typesArray", cellTypeName, typesArray) assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"Cell must be {cellTypeName}" - + ptIds = vtkIdList() cellsOut.GetCellAtId(0, ptIds) cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] - + print("cell type", cellTypeName, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(0))) print("cellsOutObs: ", cellTypeName, cellsOutObs) assert ptIds is not None, "Point ids must be defined" diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index 6044ce995..35a49c22e 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -15,7 +15,7 @@ from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkCellArray, vtkCellTypes, VTK_TETRA, VTK_HEXAHEDRON, @@ -45,7 +45,7 @@ @dataclass( frozen=True ) class TestCase: - """Test case""" + """Test case.""" __test__ = False #: cell types cellTypes: list[int] @@ -75,11 +75,11 @@ def __generate_test_data() -> Iterator[ TestCase ]: pointsExp: npt.NDArray[np.float64] = pointsExp0 if shared else ptsCoords cellPtsIdsExp = cellPtsIdsExp0 if shared else [tuple(range(i*nbPtsCell, (i+1)*nbPtsCell, 1)) for i in range(nbCells)] yield TestCase( cellTypes, cellPtsCoords, shared, pointsExp, cellPtsIdsExp ) - + ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createVertices( test_case: TestCase ): +def test_createVertices( test_case: TestCase )->None: """Test of createVertices method. Args: @@ -100,7 +100,7 @@ def test_createVertices( test_case: TestCase ): ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createMultiCellMesh( test_case: TestCase ): +def test_createMultiCellMesh( test_case: TestCase )->None: """Test of createMultiCellMesh method. Args: @@ -108,7 +108,7 @@ def test_createMultiCellMesh( test_case: TestCase ): """ output: vtkUnstructuredGrid = createMultiCellMesh(test_case.cellTypes, test_case.cellPtsCoords, test_case.share) assert output is not None, "Output mesh is undefined." - + # tests on points pointsOut: vtkPoints = output.GetPoints() assert pointsOut is not None, "Output points is undefined." @@ -123,14 +123,14 @@ def test_createMultiCellMesh( test_case: TestCase ): assert cellsOut is not None, "Cells from output mesh are undefined." nbCells: int = len(test_case.cellPtsCoords) assert cellsOut.GetNumberOfCells() == nbCells, f"Number of cells is expected to be {nbCells}." - + # check cell types types: vtkCellTypes = vtkCellTypes() output.GetCellTypes(types) assert types is not None, "Cell types must be defined" typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) print("typesArray.size ", typesArray.size) - assert (typesArray.size == 1) and (typesArray[0] == test_case.cellTypes[0]), f"Cell types are wrong" + assert (typesArray.size == 1) and (typesArray[0] == test_case.cellTypes[0]), "Cell types are wrong" for cellId in range(output.GetNumberOfCells()): ptIds = vtkIdList() @@ -142,7 +142,7 @@ def test_createMultiCellMesh( test_case: TestCase ): assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." assert cellsOutObs == test_case.cellPtsIdsExp[cellId], "Cell point ids are wrong." -def test_getBounds( ): +def test_getBounds( )->None: """Test of getBounds method.""" # input cellPtsCoord: list[npt.NDArray[np.float64]] = [ @@ -156,4 +156,3 @@ def test_getBounds( ): boundsObs: list[float] = getBounds(cellPtsCoord) assert boundsExp == boundsObs, f"Expected bounds are {boundsExp}." - \ No newline at end of file From 606379b74cf1d0c4a851189dd6ec5a1767c1dc07 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 15 Apr 2025 09:25:20 +0200 Subject: [PATCH 07/57] add MeshIdCard class and tests + linting --- geos-mesh/src/geos/mesh/model/MeshIdCard.py | 96 ++++++++++ .../mesh/processing/MergeColocatedPoints.py | 4 +- .../src/geos/mesh/processing/SplitMesh.py | 4 +- geos-mesh/tests/test_MergeColocatedPoints.py | 2 +- geos-mesh/tests/test_MeshIdCard.py | 172 ++++++++++++++++++ geos-mesh/tests/test_SplitMesh.py | 2 +- .../test_helpers_createSingleCellMesh.py | 2 +- .../tests/test_helpers_createVertices.py | 2 +- 8 files changed, 276 insertions(+), 8 deletions(-) create mode 100644 geos-mesh/src/geos/mesh/model/MeshIdCard.py create mode 100644 geos-mesh/tests/test_MeshIdCard.py diff --git a/geos-mesh/src/geos/mesh/model/MeshIdCard.py b/geos-mesh/src/geos/mesh/model/MeshIdCard.py new file mode 100644 index 000000000..c89e22e5f --- /dev/null +++ b/geos-mesh/src/geos/mesh/model/MeshIdCard.py @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Antoine Mazuyer, Martin Lemay +import numpy as np +import numpy.typing as npt +from typing_extensions import Self +from vtkmodules.vtkCommonDataModel import ( + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_LINE, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_NUMBER_OF_CELL_TYPES +) + + +__doc__ = """ +MeshIdCard stores the number of elements of each type. +""" + +class MeshIdCard(): + def __init__(self: Self ) ->None: + """MeshIdCard stores the number of cells of each type.""" + self._counts: npt.NDArray[np.int64] = np.zeros(VTK_NUMBER_OF_CELL_TYPES) + + def __str__(self: Self) ->str: + """Overload __str__ method. + + Returns: + str: card string. + """ + return self.print() + + def add(self: Self, cellType: int) ->None: + """Increment the number of cell of input type. + + Args: + cellType (int): cell type + """ + self._counts[cellType] += 1 + self._updateGeneralCounts(cellType, 1) + + def setTypeCount(self: Self, cellType: int, count: int) ->None: + """Set the number of cells of input type. + + Args: + cellType (int): cell type + count (int): number of cells + """ + prevCount = self._counts[cellType] + self._counts[cellType] = count + self._updateGeneralCounts(cellType, count - prevCount) + + def getTypeCount(self: Self, cellType: int)->int: + """Get the number of cells of input type. + + Args: + cellType (int): cell type + + Returns: + int: number of cells + """ + return self._counts[cellType] + + def _updateGeneralCounts(self: Self, cellType: int, count: int) ->None: + """Update generic type counters. + + Args: + cellType (int): cell type + count (int): count increment + """ + if (cellType != VTK_POLYGON) and (vtkCellTypes.GetDimension(cellType) == 2): + self._counts[VTK_POLYGON] += count + if (cellType != VTK_POLYHEDRON) and (vtkCellTypes.GetDimension(cellType) == 3): + self._counts[VTK_POLYHEDRON] += count + + + def print(self: Self) ->str: + """Print card string. + + Returns: + str: card string. + """ + card: str = "" + card += "| | |\n" + card += "| - | - |\n" + card += f"| **Total Number of Vertices** | {int(self._counts[VTK_VERTEX]):12} |\n" + card += f"| **Total Number of Edges** | {int(self._counts[VTK_LINE]):12} |\n" + card += f"| **Total Number of Faces** | {int(self._counts[VTK_POLYGON]):12} |\n" + card += f"| **Total Number of Polyhedron** | {int(self._counts[VTK_POLYHEDRON]):12} |\n" + card += f"| **Total Number of Cells** | {int(self._counts[VTK_POLYHEDRON]+self._counts[VTK_POLYGON]):12} |\n" + card += "| - | - |\n" + for cellType in (VTK_TRIANGLE, VTK_QUAD): + card += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(self._counts[cellType]):12} |\n" + for cellType in (VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON): + card += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(self._counts[cellType]):12} |\n" + return card + + + diff --git a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py index d69c46d22..14851c037 100644 --- a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py +++ b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay +# SPDX-FileContributor: Antoine Mazuyer, Martin Lemay import numpy as np from typing_extensions import Self from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase @@ -49,7 +49,7 @@ class MergeColocatedPoints(VTKPythonAlgorithmBase): def __init__(self: Self ) ->None: - """MergeColocatedPoints filter merge duplacted points of the input mesh.""" + """MergeColocatedPoints filter merges duplacted points of the input mesh.""" super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index 90cdaac52..0b977f3b8 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay +# SPDX-FileContributor: Antoine Mazuyer, Martin Lemay import numpy as np import numpy.typing as npt from typing_extensions import Self @@ -51,7 +51,7 @@ class SplitMesh(VTKPythonAlgorithmBase): def __init__(self) ->None: - """SplitMesh filter split each cell using edge centers.""" + """SplitMesh filter splits each cell using edge centers.""" super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") self.inData: vtkUnstructuredGrid diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py index c37ba5465..fee9ea612 100644 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -1,4 +1,4 @@ -# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-FileContributor: Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file import os diff --git a/geos-mesh/tests/test_MeshIdCard.py b/geos-mesh/tests/test_MeshIdCard.py new file mode 100644 index 000000000..bcff698f3 --- /dev/null +++ b/geos-mesh/tests/test_MeshIdCard.py @@ -0,0 +1,172 @@ +# SPDX-FileContributor: Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +from dataclasses import dataclass +import pytest +from typing import ( + Iterator, +) + +from geos.mesh.model.MeshIdCard import MeshIdCard + +from vtkmodules.vtkCommonDataModel import ( + vtkCellTypes, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_VERTEX, VTK_LINE +) + + +# inputs +nbVertex_all: tuple[int] = (3, 4, 5, 8, 10, 20) +nbEdges_all: tuple[int] = (3, 4, 6, 8, 12, 30) +nbTri_all: tuple[int] = (1, 0, 3, 0, 0, 4) +nbQuad_all: tuple[int] = (0, 1, 0, 6, 0, 3) +nbTetra_all: tuple[int] = (0, 0, 1, 0, 4, 0) +nbPyr_all: tuple[int] = (0, 0, 0, 0, 0, 4) +nbWed_all: tuple[int] = (0, 0, 0, 0, 0, 2) +nbHexa_all: tuple[int] = (0, 0, 0, 1, 0, 5) + +@dataclass( frozen=True ) +class TestCase: + """Test case.""" + __test__ = False + nbVertex: tuple[int] + nbEdges: tuple[int] + nbTri: tuple[int] + nbQuad: tuple[int] + nbTetra: tuple[int] + nbPyr: tuple[int] + nbWed: tuple[int] + nbHexa: tuple[int] + +def __generate_test_data() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for nbVertex, nbEdges, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa in zip( + nbVertex_all, nbEdges_all, nbTri_all, nbQuad_all, nbTetra_all, nbPyr_all, nbWed_all, nbHexa_all, + strict=True): + yield TestCase( nbVertex, nbEdges, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa ) + +def __get_expected_card(nbVertex: int, nbEdges: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: + nbFaces: int = nbTri + nbQuad + nbPolyhedre: int = nbTetra + nbPyr + nbHexa + nbWed + cardExp: str = "" + cardExp += "| | |\n" + cardExp += "| - | - |\n" + cardExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" + cardExp += f"| **Total Number of Edges** | {int(nbEdges):12} |\n" + cardExp += f"| **Total Number of Faces** | {int(nbFaces):12} |\n" + cardExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" + cardExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" + cardExp += "| - | - |\n" + for cellType, nb in zip((VTK_TRIANGLE, VTK_QUAD, ), (nbTri, nbQuad,), strict=True): + cardExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" + for cellType, nb in zip((VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON), (nbTetra, nbPyr, nbWed, nbHexa), strict=True): + cardExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" + return cardExp + +def test_MeshIdCard_init( ) ->None: + """Test of MeshIdCard . + + Args: + test_case (TestCase): test case + """ + card: MeshIdCard = MeshIdCard() + assert card.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" + assert card.getTypeCount(VTK_LINE) == 0, "Number of edges must be 0" + assert card.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" + assert card.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" + assert card.getTypeCount(VTK_TETRA) == 0, "Number of tetrahedra must be 0" + assert card.getTypeCount(VTK_PYRAMID) == 0, "Number of pyramids must be 0" + assert card.getTypeCount(VTK_WEDGE) == 0, "Number of wedges must be 0" + assert card.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" + +@pytest.mark.parametrize( "test_case", __generate_test_data()) +def test_MeshIdCard_add( test_case: TestCase ) ->None: + """Test of MeshIdCard . + + Args: + test_case (TestCase): test case + """ + card: MeshIdCard = MeshIdCard() + for _ in range(test_case.nbVertex): + card.add(VTK_VERTEX) + for _ in range(test_case.nbEdges): + card.add(VTK_LINE) + for _ in range(test_case.nbTri): + card.add(VTK_TRIANGLE) + for _ in range(test_case.nbQuad): + card.add(VTK_QUAD) + for _ in range(test_case.nbTetra): + card.add(VTK_TETRA) + for _ in range(test_case.nbPyr): + card.add(VTK_PYRAMID) + for _ in range(test_case.nbWed): + card.add(VTK_WEDGE) + for _ in range(test_case.nbHexa): + card.add(VTK_HEXAHEDRON) + + assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert card.getTypeCount(VTK_LINE) == test_case.nbEdges, f"Number of edges must be {test_case.nbEdges}" + assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert card.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert card.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + + +@pytest.mark.parametrize( "test_case", __generate_test_data()) +def test_MeshIdCard_setCount( test_case: TestCase ) ->None: + """Test of MeshIdCard . + + Args: + test_case (TestCase): test case + """ + card: MeshIdCard = MeshIdCard() + card.setTypeCount(VTK_VERTEX, test_case.nbVertex) + card.setTypeCount(VTK_LINE, test_case.nbEdges) + card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + card.setTypeCount(VTK_QUAD, test_case.nbQuad) + card.setTypeCount(VTK_TETRA, test_case.nbTetra) + card.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + card.setTypeCount(VTK_WEDGE, test_case.nbWed) + card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert card.getTypeCount(VTK_LINE) == test_case.nbEdges, f"Number of edges must be {test_case.nbEdges}" + assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert card.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert card.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + +#cpt = 0 +@pytest.mark.parametrize( "test_case", __generate_test_data()) +def test_MeshIdCard_print( test_case: TestCase ) ->None: + """Test of MeshIdCard . + + Args: + test_case (TestCase): test case + """ + card: MeshIdCard = MeshIdCard() + card.setTypeCount(VTK_VERTEX, test_case.nbVertex) + card.setTypeCount(VTK_LINE, test_case.nbEdges) + card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + card.setTypeCount(VTK_QUAD, test_case.nbQuad) + card.setTypeCount(VTK_TETRA, test_case.nbTetra) + card.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + card.setTypeCount(VTK_WEDGE, test_case.nbWed) + card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + line: str = card.print() + lineExp: str = __get_expected_card(test_case.nbVertex, test_case.nbEdges, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) + # global cpt + # with open(f"meshIdCard_{cpt}.txt", 'w') as fout: + # fout.write(line) + # fout.write("------------------------------------------------------------\n") + # fout.write(lineExp) + # cpt += 1 + assert line == lineExp, "Output card string differs from expected value." diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index 7c5b28fcf..a1e7f4bf1 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -1,4 +1,4 @@ -# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-FileContributor: Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file import os diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py index 699b1c46b..ab7c8ef05 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -1,4 +1,4 @@ -# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-FileContributor: Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file import os diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index 35a49c22e..2f7e2e696 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -1,4 +1,4 @@ -# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay +# SPDX-FileContributor: Martin Lemay # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file import os From 4c680852a48052724ebe65845c17cbf38069338c Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 15 Apr 2025 18:15:15 +0200 Subject: [PATCH 08/57] create vtk filters to compute mesh stats --- geos-mesh/src/geos/mesh/model/MeshIdCard.py | 26 +++- .../src/geos/mesh/stats/ComputeMeshStats.py | 132 ++++++++++++++++++ geos-mesh/tests/test_ComputeMeshStats.py | 132 ++++++++++++++++++ geos-mesh/tests/test_MeshIdCard.py | 74 ++++++---- geos-mesh/tests/test_SplitMesh.py | 17 ++- .../tests/test_helpers_createVertices.py | 2 +- 6 files changed, 342 insertions(+), 41 deletions(-) create mode 100644 geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py create mode 100644 geos-mesh/tests/test_ComputeMeshStats.py diff --git a/geos-mesh/src/geos/mesh/model/MeshIdCard.py b/geos-mesh/src/geos/mesh/model/MeshIdCard.py index c89e22e5f..1e176115e 100644 --- a/geos-mesh/src/geos/mesh/model/MeshIdCard.py +++ b/geos-mesh/src/geos/mesh/model/MeshIdCard.py @@ -6,7 +6,7 @@ from typing_extensions import Self from vtkmodules.vtkCommonDataModel import ( vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_LINE, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_NUMBER_OF_CELL_TYPES + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_NUMBER_OF_CELL_TYPES ) @@ -27,7 +27,23 @@ def __str__(self: Self) ->str: """ return self.print() - def add(self: Self, cellType: int) ->None: + def __add__(self: Self, other :Self) ->Self: + """Addition operator. + + MeshIdCard addition consists in suming counts. + + Args: + other (Self): other MeshIdCard object + + Returns: + Self: new MeshIdCard object + """ + assert isinstance(other, MeshIdCard), "Other object must be a MeshIdCard." + newCard: MeshIdCard = MeshIdCard() + newCard._counts = self._counts + other._counts + return newCard + + def addType(self: Self, cellType: int) ->None: """Increment the number of cell of input type. Args: @@ -56,7 +72,7 @@ def getTypeCount(self: Self, cellType: int)->int: Returns: int: number of cells """ - return self._counts[cellType] + return int(self._counts[cellType]) def _updateGeneralCounts(self: Self, cellType: int, count: int) ->None: """Update generic type counters. @@ -70,7 +86,6 @@ def _updateGeneralCounts(self: Self, cellType: int, count: int) ->None: if (cellType != VTK_POLYHEDRON) and (vtkCellTypes.GetDimension(cellType) == 3): self._counts[VTK_POLYHEDRON] += count - def print(self: Self) ->str: """Print card string. @@ -81,8 +96,7 @@ def print(self: Self) ->str: card += "| | |\n" card += "| - | - |\n" card += f"| **Total Number of Vertices** | {int(self._counts[VTK_VERTEX]):12} |\n" - card += f"| **Total Number of Edges** | {int(self._counts[VTK_LINE]):12} |\n" - card += f"| **Total Number of Faces** | {int(self._counts[VTK_POLYGON]):12} |\n" + card += f"| **Total Number of Polygon** | {int(self._counts[VTK_POLYGON]):12} |\n" card += f"| **Total Number of Polyhedron** | {int(self._counts[VTK_POLYHEDRON]):12} |\n" card += f"| **Total Number of Cells** | {int(self._counts[VTK_POLYHEDRON]+self._counts[VTK_POLYGON]):12} |\n" card += "| - | - |\n" diff --git a/geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py b/geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py new file mode 100644 index 000000000..deccb8c68 --- /dev/null +++ b/geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py @@ -0,0 +1,132 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Antoine Mazuyer, Martin Lemay +from typing_extensions import Self +from vtkmodules.vtkFiltersCore import vtkFeatureEdges +from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase +from vtkmodules.vtkCommonCore import ( + vtkInformation, + vtkInformationVector, +) +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCell, + VTK_VERTEX +) + +from geos.mesh.model.MeshIdCard import MeshIdCard + +__doc__ = """ +ComputeMeshStats module is a vtk filter that computes mesh stats. + +Mesh stats include the number of elements of each type. + +Filter input is a vtkUnstructuredGrid. + +To use the filter: + +.. code-block:: python + + from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats + + # filter inputs + input :vtkUnstructuredGrid + + # instanciate the filter + filter :ComputeMeshStats = ComputeMeshStats() + # set input data object + filter.SetInputDataObject(input) + # do calculations + filter.Update() + # get output mesh id card + output :MeshIdCard = filter.GetMeshIdCard() +""" +class ComputeMeshStats(VTKPythonAlgorithmBase): + + def __init__(self) ->None: + """ComputeMeshStats filter computes mesh stats.""" + super().__init__(nInputPorts=1, nOutputPorts=0) + self.card: MeshIdCard + + def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestInformation. + + Args: + port (int): input port + info (vtkInformationVector): info + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + if port == 0: + info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") + + def RequestDataObject(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + assert inData is not None + return super().RequestDataObject(request, inInfoVec, outInfoVec) + + def RequestData(self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData: vtkUnstructuredGrid = self.GetInputData(inInfoVec, 0, 0) + assert inData is not None, "Input mesh is undefined." + + self.card = MeshIdCard() + self.card.setTypeCount(VTK_VERTEX, inData.GetNumberOfPoints()) + for i in range(inData.GetNumberOfCells()): + cell: vtkCell = inData.GetCell(i) + self.card.addType(cell.GetCellType()) + return 1 + + def _computeNumberOfEdges(self :Self, mesh: vtkUnstructuredGrid) ->int: + """Compute the number of edges of the mesh. + + Args: + mesh (vtkUnstructuredGrid): input mesh + + Returns: + int: number of edges + """ + edges: vtkFeatureEdges = vtkFeatureEdges() + edges.BoundaryEdgesOn() + edges.ManifoldEdgesOn() + edges.FeatureEdgesOff() + edges.NonManifoldEdgesOff() + edges.SetInputDataObject(mesh) + edges.Update() + return edges.GetOutput().GetNumberOfCells() + + def GetMeshIdCard(self :Self) -> MeshIdCard: + """Get MeshIdCard object. + + Returns: + MeshIdCard: MeshIdCard object. + """ + return self.card diff --git a/geos-mesh/tests/test_ComputeMeshStats.py b/geos-mesh/tests/test_ComputeMeshStats.py new file mode 100644 index 000000000..85352db3f --- /dev/null +++ b/geos-mesh/tests/test_ComputeMeshStats.py @@ -0,0 +1,132 @@ +# SPDX-FileContributor: Martin Lemay +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import os +from dataclasses import dataclass +import numpy as np +import numpy.typing as npt +import pytest +from typing import ( + Iterator, +) + +from geos.mesh.processing.helpers import createSingleCellMesh, createMultiCellMesh +from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats +from geos.mesh.model.MeshIdCard import MeshIdCard + +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkCellTypes, + vtkCell, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, +) + +#from vtkmodules.vtkFiltersSources import vtkCubeSource + + +data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") + +filename_all: tuple[str,...] = ("triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", "hexa_cell.csv") +cellType_all: tuple[int, ...] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON) + +filename_all2: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") +cellType_all2: tuple[int, ...] = (VTK_TETRA, VTK_HEXAHEDRON) +nbPtsCell_all2: tuple[int] = (4, 8) + +@dataclass( frozen=True ) +class TestCase: + """Test case.""" + __test__ = False + #: mesh + mesh: vtkUnstructuredGrid + + +def __generate_test_data_single_cell() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for cellType, filename in zip(cellType_all, filename_all, strict=True): + ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, filename), dtype=float, delimiter=',') + mesh: vtkUnstructuredGrid = createSingleCellMesh(cellType, ptsCoord) + yield TestCase( mesh ) + +ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cellType_all] +@pytest.mark.parametrize( "test_case", __generate_test_data_single_cell(), ids=ids ) +def test_ComputeMeshStats_single( test_case: TestCase ) ->None: + """Test of ComputeMeshStats filter. + + Args: + test_case (TestCase): test case + """ + filter :ComputeMeshStats = ComputeMeshStats() + filter.SetInputDataObject(test_case.mesh) + filter.Update() + card :MeshIdCard = filter.GetMeshIdCard() + assert card is not None, "MeshIdCard is undefined" + + assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + + # compute counts for each type of cell + elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) + counts: npt.NDArray[np.int64] = np.zeros(len(elementTypes)) + for i in range(test_case.mesh.GetNumberOfCells()): + cell: vtkCell = test_case.mesh.GetCell(i) + index: int = elementTypes.index(cell.GetCellType()) + counts[index] += 1 + # check cell type counts + for i, elementType in enumerate(elementTypes): + assert int(card.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + + nbPolygon: int = counts[0] + counts[1] + nbPolyhedra: int = np.sum(counts[2:]) + assert int(card.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int(card.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + +def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: + """Generate test cases. + + Yields: + Iterator[ TestCase ]: iterator on test cases + """ + for cellType, filename, nbPtsCell in zip(cellType_all2, filename_all2, nbPtsCell_all2, strict=True): + ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, filename), dtype=float, delimiter=',') + # split array to get a list of coordinates per cell + cellPtsCoords: list[npt.NDArray[np.float64]]= [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] + nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) + cellTypes = nbCells * [cellType] + mesh: vtkUnstructuredGrid = createMultiCellMesh(cellTypes, cellPtsCoords, True) + yield TestCase( mesh ) + +ids2: list[str] = [os.path.splitext(name)[0] for name in filename_all2] +@pytest.mark.parametrize( "test_case", __generate_test_data_multi_cell(), ids=ids2 ) +def test_ComputeMeshStats_multi( test_case: TestCase ) ->None: + """Test of ComputeMeshStats filter. + + Args: + test_case (TestCase): test case + """ + filter :ComputeMeshStats = ComputeMeshStats() + filter.SetInputDataObject(test_case.mesh) + filter.Update() + card :MeshIdCard = filter.GetMeshIdCard() + assert card is not None, "MeshIdCard is undefined" + + assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + + # compute counts for each type of cell + elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) + counts: npt.NDArray[np.int64] = np.zeros(len(elementTypes)) + for i in range(test_case.mesh.GetNumberOfCells()): + cell: vtkCell = test_case.mesh.GetCell(i) + index: int = elementTypes.index(cell.GetCellType()) + counts[index] += 1 + # check cell type counts + for i, elementType in enumerate(elementTypes): + assert int(card.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + + nbPolygon: int = counts[0] + counts[1] + nbPolyhedra: int = np.sum(counts[2:]) + assert int(card.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int(card.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." diff --git a/geos-mesh/tests/test_MeshIdCard.py b/geos-mesh/tests/test_MeshIdCard.py index bcff698f3..dc7b9e16d 100644 --- a/geos-mesh/tests/test_MeshIdCard.py +++ b/geos-mesh/tests/test_MeshIdCard.py @@ -11,13 +11,12 @@ from vtkmodules.vtkCommonDataModel import ( vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_VERTEX, VTK_LINE + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_VERTEX ) # inputs nbVertex_all: tuple[int] = (3, 4, 5, 8, 10, 20) -nbEdges_all: tuple[int] = (3, 4, 6, 8, 12, 30) nbTri_all: tuple[int] = (1, 0, 3, 0, 0, 4) nbQuad_all: tuple[int] = (0, 1, 0, 6, 0, 3) nbTetra_all: tuple[int] = (0, 0, 1, 0, 4, 0) @@ -30,7 +29,6 @@ class TestCase: """Test case.""" __test__ = False nbVertex: tuple[int] - nbEdges: tuple[int] nbTri: tuple[int] nbQuad: tuple[int] nbTetra: tuple[int] @@ -44,20 +42,19 @@ def __generate_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for nbVertex, nbEdges, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa in zip( - nbVertex_all, nbEdges_all, nbTri_all, nbQuad_all, nbTetra_all, nbPyr_all, nbWed_all, nbHexa_all, + for nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa in zip( + nbVertex_all, nbTri_all, nbQuad_all, nbTetra_all, nbPyr_all, nbWed_all, nbHexa_all, strict=True): - yield TestCase( nbVertex, nbEdges, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa ) + yield TestCase( nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa ) -def __get_expected_card(nbVertex: int, nbEdges: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: +def __get_expected_card(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: nbFaces: int = nbTri + nbQuad nbPolyhedre: int = nbTetra + nbPyr + nbHexa + nbWed cardExp: str = "" cardExp += "| | |\n" cardExp += "| - | - |\n" cardExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" - cardExp += f"| **Total Number of Edges** | {int(nbEdges):12} |\n" - cardExp += f"| **Total Number of Faces** | {int(nbFaces):12} |\n" + cardExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" cardExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" cardExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" cardExp += "| - | - |\n" @@ -75,7 +72,6 @@ def test_MeshIdCard_init( ) ->None: """ card: MeshIdCard = MeshIdCard() assert card.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" - assert card.getTypeCount(VTK_LINE) == 0, "Number of edges must be 0" assert card.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" assert card.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" assert card.getTypeCount(VTK_TETRA) == 0, "Number of tetrahedra must be 0" @@ -84,7 +80,7 @@ def test_MeshIdCard_init( ) ->None: assert card.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" @pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_MeshIdCard_add( test_case: TestCase ) ->None: +def test_MeshIdCard_addType( test_case: TestCase ) ->None: """Test of MeshIdCard . Args: @@ -92,24 +88,21 @@ def test_MeshIdCard_add( test_case: TestCase ) ->None: """ card: MeshIdCard = MeshIdCard() for _ in range(test_case.nbVertex): - card.add(VTK_VERTEX) - for _ in range(test_case.nbEdges): - card.add(VTK_LINE) + card.addType(VTK_VERTEX) for _ in range(test_case.nbTri): - card.add(VTK_TRIANGLE) + card.addType(VTK_TRIANGLE) for _ in range(test_case.nbQuad): - card.add(VTK_QUAD) + card.addType(VTK_QUAD) for _ in range(test_case.nbTetra): - card.add(VTK_TETRA) + card.addType(VTK_TETRA) for _ in range(test_case.nbPyr): - card.add(VTK_PYRAMID) + card.addType(VTK_PYRAMID) for _ in range(test_case.nbWed): - card.add(VTK_WEDGE) + card.addType(VTK_WEDGE) for _ in range(test_case.nbHexa): - card.add(VTK_HEXAHEDRON) + card.addType(VTK_HEXAHEDRON) assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert card.getTypeCount(VTK_LINE) == test_case.nbEdges, f"Number of edges must be {test_case.nbEdges}" assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" @@ -127,7 +120,6 @@ def test_MeshIdCard_setCount( test_case: TestCase ) ->None: """ card: MeshIdCard = MeshIdCard() card.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card.setTypeCount(VTK_LINE, test_case.nbEdges) card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card.setTypeCount(VTK_QUAD, test_case.nbQuad) card.setTypeCount(VTK_TETRA, test_case.nbTetra) @@ -136,7 +128,6 @@ def test_MeshIdCard_setCount( test_case: TestCase ) ->None: card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert card.getTypeCount(VTK_LINE) == test_case.nbEdges, f"Number of edges must be {test_case.nbEdges}" assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" @@ -144,6 +135,40 @@ def test_MeshIdCard_setCount( test_case: TestCase ) ->None: assert card.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" +@pytest.mark.parametrize( "test_case", __generate_test_data()) +def test_MeshIdCard_add( test_case: TestCase ) ->None: + """Test of MeshIdCard . + + Args: + test_case (TestCase): test case + """ + card1: MeshIdCard = MeshIdCard() + card1.setTypeCount(VTK_VERTEX, test_case.nbVertex) + card1.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + card1.setTypeCount(VTK_QUAD, test_case.nbQuad) + card1.setTypeCount(VTK_TETRA, test_case.nbTetra) + card1.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + card1.setTypeCount(VTK_WEDGE, test_case.nbWed) + card1.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + card2: MeshIdCard = MeshIdCard() + card2.setTypeCount(VTK_VERTEX, test_case.nbVertex) + card2.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + card2.setTypeCount(VTK_QUAD, test_case.nbQuad) + card2.setTypeCount(VTK_TETRA, test_case.nbTetra) + card2.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + card2.setTypeCount(VTK_WEDGE, test_case.nbWed) + card2.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + newCard: MeshIdCard = card1 + card2 + assert newCard.getTypeCount(VTK_VERTEX) == int(2 * test_case.nbVertex), f"Number of vertices must be {int(2 * test_case.nbVertex)}" + assert newCard.getTypeCount(VTK_TRIANGLE) == int(2 * test_case.nbTri), f"Number of triangles must be {int(2 * test_case.nbTri)}" + assert newCard.getTypeCount(VTK_QUAD) == int(2 * test_case.nbQuad), f"Number of quads must be {int(2 * test_case.nbQuad)}" + assert newCard.getTypeCount(VTK_TETRA) == int(2 * test_case.nbTetra), f"Number of tetrahedra must be {int(2 * test_case.nbTetra)}" + assert newCard.getTypeCount(VTK_PYRAMID) == int(2 * test_case.nbPyr), f"Number of pyramids must be {int(2 * test_case.nbPyr)}" + assert newCard.getTypeCount(VTK_WEDGE) == int(2 * test_case.nbWed), f"Number of wedges must be {int(2 * test_case.nbWed)}" + assert newCard.getTypeCount(VTK_HEXAHEDRON) == int(2 * test_case.nbHexa), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" + #cpt = 0 @pytest.mark.parametrize( "test_case", __generate_test_data()) def test_MeshIdCard_print( test_case: TestCase ) ->None: @@ -154,7 +179,6 @@ def test_MeshIdCard_print( test_case: TestCase ) ->None: """ card: MeshIdCard = MeshIdCard() card.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card.setTypeCount(VTK_LINE, test_case.nbEdges) card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card.setTypeCount(VTK_QUAD, test_case.nbQuad) card.setTypeCount(VTK_TETRA, test_case.nbTetra) @@ -162,7 +186,7 @@ def test_MeshIdCard_print( test_case: TestCase ) ->None: card.setTypeCount(VTK_WEDGE, test_case.nbWed) card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) line: str = card.print() - lineExp: str = __get_expected_card(test_case.nbVertex, test_case.nbEdges, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) + lineExp: str = __get_expected_card(test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) # global cpt # with open(f"meshIdCard_{cpt}.txt", 'w') as fout: # fout.write(line) diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index a1e7f4bf1..6c2c21c49 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -6,7 +6,6 @@ import numpy as np import numpy.typing as npt import pytest -from typing_extensions import Self from typing import ( Iterator, ) @@ -17,7 +16,7 @@ from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, + vtkUnstructuredGrid, vtkCellArray, vtkCellData, vtkCellTypes, @@ -126,7 +125,7 @@ @dataclass( frozen=True ) class TestCase: - """Test case""" + """Test case.""" __test__ = False #: VTK cell type cellType: int @@ -136,7 +135,7 @@ class TestCase: pointsExp: npt.NDArray[np.float64] #: expected new cell point ids cellsExp: list[int] - + def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: """Generate test cases. @@ -150,11 +149,11 @@ def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, data_path), dtype=float, delimiter=',') mesh: vtkUnstructuredGrid = createSingleCellMesh(cellType, ptsCoord) yield TestCase( cellType, mesh, pointsExp, cellsExp ) - + ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] @pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) -def test_single_cell_split( test_case: TestCase ): +def test_single_cell_split( test_case: TestCase ) ->None: """Test of SplitMesh filter with meshes composed of a single cell. Args: @@ -184,10 +183,10 @@ def test_single_cell_split( test_case: TestCase ): output.GetCellTypes(types) assert types is not None, "Cell types must be defined" typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) - + print("typesArray", cellTypeName, typesArray) assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"All cells must be {cellTypeName}" - + for i in range(cellsOut.GetNumberOfCells()): ptIds = vtkIdList() cellsOut.GetCellAtId(i, ptIds) @@ -212,4 +211,4 @@ def test_single_cell_split( test_case: TestCase ): nbArraySplited: int = cellData.GetNumberOfArrays() assert nbArraySplited == nbArrayInput + 1, f"Number of arrays should be {nbArrayInput + 1}" - #assert False \ No newline at end of file + #assert False diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index 2f7e2e696..b4377c20a 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -68,7 +68,7 @@ def __generate_test_data() -> Iterator[ TestCase ]: # all points coordinates ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') # split array to get a list of coordinates per cell - cellPtsCoords = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] + cellPtsCoords: list[npt.NDArray[np.float64]] = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) cellTypes = nbCells * [celltype] for shared in (False, True): From b6b05eec4c5443b5b93ee444da067980453b1371 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 15 Apr 2025 18:16:20 +0200 Subject: [PATCH 09/57] create Paraview plugins to wrap vtk filters --- .../src/PVplugins/PVMergeColocatedPoints.py | 66 ++++++++ geos-pv/src/PVplugins/PVPrintMeshIdCard.py | 81 +++++++++ geos-pv/src/PVplugins/PVSplitMesh.py | 159 +++--------------- .../pv/utils/AbstractPVPluginVtkWrapper.py | 99 +++++++++++ 4 files changed, 268 insertions(+), 137 deletions(-) create mode 100644 geos-pv/src/PVplugins/PVMergeColocatedPoints.py create mode 100644 geos-pv/src/PVplugins/PVPrintMeshIdCard.py create mode 100644 geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py diff --git a/geos-pv/src/PVplugins/PVMergeColocatedPoints.py b/geos-pv/src/PVplugins/PVMergeColocatedPoints.py new file mode 100644 index 000000000..a1f791922 --- /dev/null +++ b/geos-pv/src/PVplugins/PVMergeColocatedPoints.py @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +# ruff: noqa: E402 # disable Module level import not at top of file +import sys +from pathlib import Path +from typing_extensions import Self + +from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] + smdomain, smhint, smproperty, smproxy, +) + +from vtkmodules.vtkCommonDataModel import ( + vtkPointSet, +) + +# update sys.path to load all GEOS Python Package dependencies +geos_pv_path: Path = Path( __file__ ).parent.parent.parent +sys.path.insert( 0, str( geos_pv_path / "src" ) ) +from geos.pv.utils.config import update_paths +update_paths() + +from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints +from geos.pv.utils.AbstractPVPluginVtkWrapper import AbstractPVPluginVtkWrapper + +__doc__ = """ +Merge collocated points of input mesh. + +Output mesh is of same type as input mesh. If input mesh is a composite mesh, the plugin merge points of each part independently. + +To use it: + +* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVMergeColocatedPoints. +* Select the input mesh. +* Apply the filter. + +""" + +@smproxy.filter( name="PVMergeColocatedPoints", label="Merge Colocated Points" ) +@smhint.xml( '' ) +@smproperty.input( name="Input", port_index=0 ) +@smdomain.datatype( + dataTypes=[ "vtkPointSet"], + composite_data_supported=True, +) +class PVMergeColocatedPoints(AbstractPVPluginVtkWrapper): + def __init__(self:Self) ->None: + """Merge collocated points.""" + super().__init__() + + def applyVtkFlilter( + self: Self, + input: vtkPointSet, + ) -> vtkPointSet: + """Apply vtk filter. + + Args: + input (vtkPointSet): input mesh + + Returns: + vtkPointSet: output mesh + """ + filter :MergeColocatedPoints = MergeColocatedPoints() + filter.SetInputDataObject(input) + filter.Update() + return filter.GetOutputDataObject( 0 ) diff --git a/geos-pv/src/PVplugins/PVPrintMeshIdCard.py b/geos-pv/src/PVplugins/PVPrintMeshIdCard.py new file mode 100644 index 000000000..5aa4462a4 --- /dev/null +++ b/geos-pv/src/PVplugins/PVPrintMeshIdCard.py @@ -0,0 +1,81 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +# ruff: noqa: E402 # disable Module level import not at top of file +import sys +from pathlib import Path +from typing_extensions import Self + +from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] + VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy +) + +from vtkmodules.vtkCommonCore import ( + vtkInformation, + vtkInformationVector, +) +from vtkmodules.vtkCommonDataModel import ( + vtkPointSet, + vtkTable, +) + +# update sys.path to load all GEOS Python Package dependencies +geos_pv_path: Path = Path( __file__ ).parent.parent.parent +sys.path.insert( 0, str( geos_pv_path / "src" ) ) +from geos.pv.utils.config import update_paths +update_paths() + +from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats +from geos.mesh.model.MeshIdCard import MeshIdCard + +__doc__ = """ +Display mesh statistics. + +To use it: + +* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVPrintMeshIdCard. +* Select the input mesh. +* Apply the filter. + +""" + +@smproxy.filter( name="PVPrintMeshIdCard", label="Print Mesh ID Card" ) +@smhint.xml( '' ) +@smproperty.input( name="Input", port_index=0 ) +@smdomain.datatype( + dataTypes=[ "vtkPointSet"], + composite_data_supported=True, +) +class PVPrintMeshIdCard(VTKPythonAlgorithmBase): + def __init__(self:Self) ->None: + """Merge collocated points.""" + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inputMesh: vtkPointSet = self.GetInputData( inInfoVec, 0, 0 ) + output: vtkTable = self.GetOutputData( outInfoVec, 0 ) + assert inputMesh is not None, "Input server mesh is null." + assert output is not None, "Output pipeline is null." + + output.ShallowCopy(inputMesh) + filter: ComputeMeshStats = ComputeMeshStats() + filter.SetInputDataObject(inputMesh) + filter.Update() + card: MeshIdCard = filter.GetMeshIdCard() + print(card.print()) + return 1 diff --git a/geos-pv/src/PVplugins/PVSplitMesh.py b/geos-pv/src/PVplugins/PVSplitMesh.py index 332e4a92b..8f1a6ae9d 100644 --- a/geos-pv/src/PVplugins/PVSplitMesh.py +++ b/geos-pv/src/PVplugins/PVSplitMesh.py @@ -2,40 +2,31 @@ # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay # ruff: noqa: E402 # disable Module level import not at top of file -import os import sys -from typing import Union +from pathlib import Path from typing_extensions import Self from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] - VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, + smdomain, smhint, smproperty, smproxy, ) -from vtkmodules.vtkCommonCore import ( - vtkInformation, - vtkInformationVector, -) from vtkmodules.vtkCommonDataModel import ( - vtkCompositeDataSet, - vtkDataObjectTreeIterator, - vtkMultiBlockDataSet, - vtkUnstructuredGrid, + vtkPointSet, ) -dir_path = os.path.dirname( os.path.realpath( __file__ ) ) -root = os.path.dirname(os.path.dirname(os.path.dirname( dir_path ))) -print(root) -for m in ("geos-posp", "geos-mesh", "geos-pv"): - path = os.path.join(root, m, "src") - if path not in sys.path: - sys.path.append( path ) +# update sys.path to load all GEOS Python Package dependencies +geos_pv_path: Path = Path( __file__ ).parent.parent.parent +sys.path.insert( 0, str( geos_pv_path / "src" ) ) +from geos.pv.utils.config import update_paths +update_paths() from geos.mesh.processing.SplitMesh import SplitMesh +from geos.pv.utils.AbstractPVPluginVtkWrapper import AbstractPVPluginVtkWrapper __doc__ = """ -Slip each cell of input mesh to smaller cells. +Split each cell of input mesh to smaller cells. -Input and output are vtkUnstructuredGrid. +Output mesh is of same type as input mesh. If input mesh is a composite mesh, the plugin split cells of each part independently. To use it: @@ -49,133 +40,27 @@ @smhint.xml( '' ) @smproperty.input( name="Input", port_index=0 ) @smdomain.datatype( - dataTypes=[ "vtkUnstructuredGrid"], + dataTypes=[ "vtkPointSet" ], composite_data_supported=True, ) -class PVSplitMesh(VTKPythonAlgorithmBase): - def __init__(self:Self): +class PVSplitMesh(AbstractPVPluginVtkWrapper): + def __init__(self:Self) ->None: """Split mesh cells.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") - - def FillInputPortInformation(self :Self, port: int, info: vtkInformation) ->int: - """Inherited from VTKPythonAlgorithmBase::FillInputPortInformation. - - Args: - port (int): port index - info (vtkInformation): input port Information + super().__init__() - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - if port == 0: - info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - - def RequestDataObject( + def applyVtkFlilter( self: Self, - request: vtkInformation, - inInfoVec: list[ vtkInformationVector ], - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + input: vtkPointSet, + ) -> vtkPointSet: + """Apply vtk filter. Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects + input (vtkPointSet): input mesh Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inData = self.GetInputData(inInfoVec, 0, 0) - outData = self.GetOutputData(outInfoVec, 0) - assert inData is not None - if outData is None or (not outData.IsA(inData.GetClassName())): - outData = inData.NewInstance() - outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) - - def RequestData( - self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestData. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - try: - inputMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, - vtkCompositeDataSet ] = self.GetInputData( inInfoVec, 0, 0 ) - outputMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, - vtkCompositeDataSet ] = self.GetOutputData( outInfoVec, 0 ) - - assert inputMesh is not None, "Input server mesh is null." - assert outputMesh is not None, "Output pipeline is null." - - splittedMesh: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet, vtkCompositeDataSet ] - if isinstance( inputMesh, vtkUnstructuredGrid ): - splittedMesh = self.doSplitMesh(inputMesh) - elif isinstance( inputMesh, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): - splittedMesh = self.doSplitMeshMultiBlock(inputMesh) - else: - raise ValueError( "Input mesh data type is not supported. Use either vtkUnstructuredGrid or vtkMultiBlockDataSet" ) - assert splittedMesh is not None, "Splitted mesh is null." - outputMesh.ShallowCopy(splittedMesh) - print("Mesh was successfully splitted.") - except AssertionError as e: - print(f"Mesh split failed due to: {e}") - return 0 - except Exception as e: - print(f"Mesh split failed due to: {e}") - return 0 - return 1 - - def doSplitMesh( - self: Self, - inputMesh: vtkUnstructuredGrid, - ) -> vtkUnstructuredGrid: - """Split cells from vtkUnstructuredGrids. - - Args: - inputMesh (vtkUnstructuredGrid): input mesh - - Returns: - vtkUnstructuredGrid: mesh where cells where splitted. + vtkPointSet: output mesh """ filter :SplitMesh = SplitMesh() - filter.SetInputDataObject(inputMesh) + filter.SetInputDataObject(input) filter.Update() return filter.GetOutputDataObject( 0 ) - - def doSplitMeshMultiBlock( - self: Self, - inputMesh: vtkMultiBlockDataSet, - ) -> vtkMultiBlockDataSet: - """Split cells from vtkMultiBlockDataSet. - - Args: - inputMesh (vtkMultiBlockDataSet): input mesh - - Returns: - vtkMultiBlockDataSet: mesh where cells where splitted. - """ - outputMesh: vtkMultiBlockDataSet = vtkMultiBlockDataSet() - iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() - iter.SetDataSet( inputMesh ) - iter.VisitOnlyLeavesOn() - iter.GoToFirstItem() - blockIndex: int = 0 - while iter.GetCurrentDataObject() is not None: - block: vtkUnstructuredGrid = vtkUnstructuredGrid.SafeDownCast( iter.GetCurrentDataObject() ) - splittedBlock: vtkUnstructuredGrid = self.doSplitMesh( block ) - outputMesh.SetBlock(blockIndex, splittedBlock) - blockIndex += 1 - iter.GoToNextItem() - return outputMesh diff --git a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py new file mode 100644 index 000000000..c00cef2e1 --- /dev/null +++ b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py @@ -0,0 +1,99 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +# ruff: noqa: E402 # disable Module level import not at top of file +from typing import Any +from typing_extensions import Self + +from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] + VTKPythonAlgorithmBase, +) + +from vtkmodules.vtkCommonCore import ( + vtkInformation, + vtkInformationVector, +) + + +__doc__ = """ +AbstractPVPluginVtkWrapper module defines the parent Paraview plugin from which inheritates PV plugins that directly wrap a vtk filter. + +To use it, make children PV plugins inherited from AbstractPVPluginVtkWrapper. Output mesh is of same type as input mesh. If output type needs to be specified, this must be done in the child class. +""" + +class AbstractPVPluginVtkWrapper(VTKPythonAlgorithmBase): + def __init__(self:Self) ->None: + """Abstract Paraview Plugin class.""" + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") + + def RequestDataObject( + self: Self, + request: vtkInformation, + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + outData = self.GetOutputData(outInfoVec, 0) + assert inData is not None + if outData is None or (not outData.IsA(inData.GetClassName())): + outData = inData.NewInstance() + outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfoVec, outInfoVec) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + try: + inputMesh: Any = self.GetInputData( inInfoVec, 0, 0 ) + outputMesh: Any = self.GetOutputData( outInfoVec, 0 ) + assert inputMesh is not None, "Input server mesh is null." + assert outputMesh is not None, "Output pipeline is null." + + splittedMesh = self.applyVtkFlilter(inputMesh) + assert splittedMesh is not None, "Splitted mesh is null." + outputMesh.ShallowCopy(splittedMesh) + print("Mesh was successfully splitted.") + except AssertionError as e: + print(f"Mesh split failed due to: {e}") + return 0 + except Exception as e: + print(f"Mesh split failed due to: {e}") + return 0 + return 1 + + def applyVtkFlilter( + self: Self, + input: Any, + ) -> Any: + """Apply vtk filter. + + Args: + input (Any): input object + + Returns: + Any: output mesh + """ + pass From 465622baaab044dfc3634caddab414503072cb17 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 14:20:34 +0200 Subject: [PATCH 10/57] First tests implementation --- geos-mesh/src/geos/mesh/vtkUtils.py | 14 ++--- geos-mesh/tests/conftest.py | 48 +++++++++++++++ geos-mesh/tests/data/data.npz | Bin 0 -> 28342 bytes geos-mesh/tests/test_vtkUtils.py | 88 ++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 geos-mesh/tests/conftest.py create mode 100644 geos-mesh/tests/data/data.npz create mode 100644 geos-mesh/tests/test_vtkUtils.py diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index 8ee8ad8f0..40c264867 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -395,8 +395,8 @@ def getComponentNamesMultiBlock( Returns: tuple[str,...]: names of the components. """ - elementraryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) - for blockIndex in elementraryBlockIndexes: + elementaryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) + for blockIndex in elementaryBlockIndexes: block: vtkDataSet = cast( vtkDataSet, getBlockFromFlatIndex( dataSet, blockIndex ) ) if isAttributeInObject( block, attributeName, onPoints ): return getComponentNamesDataSet( block, attributeName, onPoints ) @@ -545,23 +545,17 @@ def mergeBlocks( def createEmptyAttribute( - object: vtkDataObject, attributeName: str, componentNames: tuple[ str, ...], dataType: int, - onPoints: bool, ) -> vtkDataArray: """Create an empty attribute. Args: - object (vtkDataObject): object (vtkMultiBlockDataSet, vtkDataSet) - where to create the attribute attributeName (str): name of the attribute componentNames (tuple[str,...]): name of the components for vectorial attributes dataType (int): data type. - onPoints (bool): True if attributes are on points, False if they are - on cells. Returns: bool: True if the attribute was correctly created @@ -753,7 +747,7 @@ def copyAttribute( for index in elementaryBlockIndexesTo: # get block from initial time step object blockT0: vtkDataSet = vtkDataSet.SafeDownCast( getBlockFromFlatIndex( objectFrom, index ) ) - assert blockT0 is not None, "Block at intitial time step is null." + assert blockT0 is not None, "Block at initial time step is null." # get block from current time step object block: vtkDataSet = vtkDataSet.SafeDownCast( getBlockFromFlatIndex( objectTo, index ) ) @@ -934,7 +928,7 @@ def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) - return cutter.GetOutputDataObject( 0 ) -def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: +def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: #TODO CHECK OUTPUT """Transfer point data to cell data. Args: diff --git a/geos-mesh/tests/conftest.py b/geos-mesh/tests/conftest.py new file mode 100644 index 000000000..8e6249025 --- /dev/null +++ b/geos-mesh/tests/conftest.py @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Paloma Martinez +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file + +import pytest + +import numpy as np +import numpy.typing as npt + +from vtkmodules.vtkCommonDataModel import vtkDataSet +from vtkmodules.vtkIOXML import vtkXMLUnstructuredGridReader + +import pytest + + +@pytest.fixture +def array(request: str) -> npt.NDArray: + data = np.load("data/data.npz") + + return data[request.param] + + + + +@pytest.fixture(scope="function") +def vtkDataSetTest() -> vtkDataSet: + reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() + reader.SetFileName( "../../../GEOS/inputFiles/poromechanicsFractures/domain_res5_id.vtu" ) + reader.Update() + + return reader.GetOutput() + + + +@pytest.fixture(scope="function") +def vtkdatasetWithComponentNames(vtkDataSetTest: vtkDataSet): + attributeName1: str = "PERM" + + # return dataset + if vtkDataSetTest.GetCellData().HasArray( attributeName1 ) == 1: + vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 0, "component1" ) + vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 1, "component2" ) + vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 2, "component3" ) + + return vtkDataSetTest + diff --git a/geos-mesh/tests/data/data.npz b/geos-mesh/tests/data/data.npz new file mode 100644 index 0000000000000000000000000000000000000000..6858b20acdcaec660c5ac2a5394da7e6c55d55a6 GIT binary patch literal 28342 zcmeI*F-yZh6u|LIt5Q03$mVh`o@-*)iMM)eh6m9e2F@6&E8R!Xv=d}UAL_D(i>@KkG7 zlXdb<;`#EbZLd9buO3Y=ExNfm)aJM!nn0WWFu%)_>}HtvQmLOMgCceH;x-wj?tN?T zAlwb~{&t|B^#7vSIGSvd>;VQafB_6(00S7n00uCC0SsUO0~o*n1~7mD3}65Q7{CAq zFn|FJU;qOczyJm?fB_6(00S7n00uCC0SsUO0~o*n1~7mD3}65Q7{CAqFn|FJU;qOc zzyJm?fB_6(00S7n00uCC0SsUO1IuK<&UKRfGH)-h>q<$^I!SioPSr_LY7*7FcqhpP z`bcWs{QS5$A=v{AU;qOczyJm?fB_6(00S7n00uCC0SsUO0~o*n1~7nuWi? None: + attributes: dict[ str, int ] = vtkutils.getAttributesFromDataSet( object=vtkDataSetTest, + onPoints=onpoints ) + assert attributes == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PORO", True, 0 ), +]) +def test_isAttributeInObjectDataSet( vtkDataSetTest: vtkDataSet, + attributeName: str, + onpoints: bool, expected: bool ) -> None: + obtained: bool = vtkutils.isAttributeInObjectDataSet( object=vtkDataSetTest, + attributeName=attributeName, + onPoints=onpoints ) + assert obtained == expected + + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PERM", False, 3 ), + ( "GLOBAL_IDS_POINTS", True, 1 ), +] ) +def test_getNumberOfComponentsDataSet( vtkDataSetTest: vtkDataSet, + attributeName: str, + onpoints: bool, + expected: int, ) -> None: + obtained: int = vtkutils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PERM", False, ("component1", "component2", "component3")), + ( "PORO", False, ()), +] ) +def test_getComponentNamesDataSet( vtkdatasetWithComponentNames: vtkDataSet, attributeName: str, onpoints: bool, + expected: tuple[ str, ...] ) -> None: + obtained : tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkdatasetWithComponentNames, attributeName, onpoints) + + assert obtained == expected + + +@pytest.mark.parametrize("attributeName, dataType, expectedDatatypeArray", [ + ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), + ( "test_float", VTK_FLOAT, "vtkFloatArray" ), + ( "test_int", VTK_INT, "vtkIntArray" ), + ( "test_unsigned_int", VTK_UNSIGNED_INT, "vtkUnsignedIntArray" ), + ( "test_char", VTK_CHAR, "vtkCharArray" ), + # ("testFail", 4566, pytest.fail) #TODO +]) +def test_createEmptyAttribute( + attributeName: str, + dataType: int, + expectedDatatypeArray: vtkDataArray, +) -> None: + componentNames: tuple[ str, str, str] = ("d1, d2, d3") + newAttr: vtkDataArray = vtkutils.createEmptyAttribute(attributeName, componentNames, dataType) + + assert newAttr.GetNumberOfComponents() == len( componentNames ) + assert newAttr.GetComponentName( 0 ) == componentNames[ 0 ] + assert newAttr.GetComponentName( 1 ) == componentNames[ 1 ] + assert newAttr.GetComponentName( 2 ) == componentNames[ 2 ] + assert newAttr.IsA(str(expectedDatatypeArray)) From 072cd8edca8e88e432d1065785f90966bc1c3863 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 14:27:03 +0200 Subject: [PATCH 11/57] remove empty folder --- geos-posp/src/geos_posp/processing/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 geos-posp/src/geos_posp/processing/__init__.py diff --git a/geos-posp/src/geos_posp/processing/__init__.py b/geos-posp/src/geos_posp/processing/__init__.py deleted file mode 100644 index e69de29bb..000000000 From b0f06e1db02b709d7a54f9e6f205785e583bbfcd Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 14:34:07 +0200 Subject: [PATCH 12/57] upgrade github actions --- .github/workflows/python-package.yml | 6 +++--- .github/workflows/typing-check.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 6529c9197..456fddd20 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -34,7 +34,7 @@ jobs: echo "This is not a Pull-Request, skipping" build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: fail-fast: false max-parallel: 3 @@ -43,10 +43,10 @@ jobs: package-name: ["geos-ats", "geos-mesh", "geos-posp", "geos-timehistory", "geos-trame", "geos-utils", "geos-xml-tools", "geos-xml-viewer", "hdf5-wrapper", "pygeos-tools"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: mpi4py/setup-mpi@v1 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/typing-check.yml b/.github/workflows/typing-check.yml index 553404730..9675e778f 100644 --- a/.github/workflows/typing-check.yml +++ b/.github/workflows/typing-check.yml @@ -10,7 +10,7 @@ concurrency: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: fail-fast: false max-parallel: 3 @@ -19,10 +19,10 @@ jobs: package-name: ["geos-geomechanics", "geos-posp", "geos-timehistory", "geos-utils", "geos-xml-tools", "hdf5-wrapper"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: mpi4py/setup-mpi@v1 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 with: python-version: "3.10" cache: 'pip' From 28ae96fabc949e4a15983596659bc4c25b2e2c02 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:42:15 +0200 Subject: [PATCH 13/57] Linting and typing --- geos-mesh/tests/conftest.py | 35 +++++++--- geos-mesh/tests/test_vtkUtils.py | 111 +++++++++++++++++++++---------- 2 files changed, 102 insertions(+), 44 deletions(-) diff --git a/geos-mesh/tests/conftest.py b/geos-mesh/tests/conftest.py index 8e6249025..046645f66 100644 --- a/geos-mesh/tests/conftest.py +++ b/geos-mesh/tests/conftest.py @@ -12,30 +12,46 @@ from vtkmodules.vtkCommonDataModel import vtkDataSet from vtkmodules.vtkIOXML import vtkXMLUnstructuredGridReader -import pytest - @pytest.fixture -def array(request: str) -> npt.NDArray: - data = np.load("data/data.npz") +def array( request: str ) -> npt.NDArray: + """Fixture to get reference array depending on request array name. - return data[request.param] + Args: + request (str): _description_ + Returns: + npt.NDArray: _description_ + """ + data = np.load( "data/data.npz" ) + return data[ request.param ] -@pytest.fixture(scope="function") +@pytest.fixture( scope="function" ) def vtkDataSetTest() -> vtkDataSet: + """Load vtk dataset to run the tests in test_vtkUtils.py. + + Returns: + vtkDataSet: _description_ + """ reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() reader.SetFileName( "../../../GEOS/inputFiles/poromechanicsFractures/domain_res5_id.vtu" ) reader.Update() - + return reader.GetOutput() +@pytest.fixture( scope="function" ) +def vtkdatasetWithComponentNames( vtkDataSetTest: vtkDataSet ) -> vtkDataSet: + """Set names for existing vtk dataset for test purpose. + + Args: + vtkDataSetTest (vtkDataSet): _description_ -@pytest.fixture(scope="function") -def vtkdatasetWithComponentNames(vtkDataSetTest: vtkDataSet): + Returns: + _type_: _description_ + """ attributeName1: str = "PERM" # return dataset @@ -45,4 +61,3 @@ def vtkdatasetWithComponentNames(vtkDataSetTest: vtkDataSet): vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 2, "component3" ) return vtkDataSetTest - diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index f5c2cc5b3..ecd29668a 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -15,74 +15,117 @@ import geos.mesh.vtkUtils as vtkutils - -@pytest.mark.parametrize( "onpoints, expected", [ - ( True, { 'GLOBAL_IDS_POINTS': 1 } ), - ( False, { 'CELL_MARKERS': 1, 'PERM': 3, 'PORO': 1, 'FAULT': 1, 'GLOBAL_IDS_CELLS': 1 } ) -]) -def test_getAttributesFromDataSet( vtkDataSetTest: vtkDataSet, - onpoints: bool, expected: dict[ str, int ]) -> None: - attributes: dict[ str, int ] = vtkutils.getAttributesFromDataSet( object=vtkDataSetTest, - onPoints=onpoints ) +@pytest.mark.parametrize( "onpoints, expected", [ ( True, { + 'GLOBAL_IDS_POINTS': 1 +} ), ( False, { + 'CELL_MARKERS': 1, + 'PERM': 3, + 'PORO': 1, + 'FAULT': 1, + 'GLOBAL_IDS_CELLS': 1 +} ) ] ) +def test_getAttributesFromDataSet( vtkDataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: + """Test getAttributesFromDataSet function. + + Args: + vtkDataSetTest (vtkDataSet): _description_ + onpoints (bool): _description_ + expected (dict[ str, int ]): _description_ + """ + attributes: dict[ str, int ] = vtkutils.getAttributesFromDataSet( object=vtkDataSetTest, onPoints=onpoints ) assert attributes == expected @pytest.mark.parametrize( "attributeName, onpoints, expected", [ ( "PORO", False, 1 ), ( "PORO", True, 0 ), -]) -def test_isAttributeInObjectDataSet( vtkDataSetTest: vtkDataSet, - attributeName: str, - onpoints: bool, expected: bool ) -> None: +] ) +def test_isAttributeInObjectDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, + expected: bool ) -> None: + """Test isAttributeFromDataSet function. + + Args: + vtkDataSetTest (vtkDataSet): _description_ + attributeName (str): _description_ + onpoints (bool): _description_ + expected (bool): _description_ + """ obtained: bool = vtkutils.isAttributeInObjectDataSet( object=vtkDataSetTest, - attributeName=attributeName, - onPoints=onpoints ) + attributeName=attributeName, + onPoints=onpoints ) assert obtained == expected - @pytest.mark.parametrize( "attributeName, onpoints, expected", [ ( "PORO", False, 1 ), ( "PERM", False, 3 ), ( "GLOBAL_IDS_POINTS", True, 1 ), ] ) -def test_getNumberOfComponentsDataSet( vtkDataSetTest: vtkDataSet, +def test_getNumberOfComponentsDataSet( + vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, - expected: int, ) -> None: - obtained: int = vtkutils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints) + expected: int, +) -> None: + """Test getNumberOfComponentsDataSet function. + + Args: + vtkDataSetTest (vtkDataSet): _description_ + attributeName (str): _description_ + onpoints (bool): _description_ + expected (int): _description_ + """ + obtained: int = vtkutils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected @pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PERM", False, ("component1", "component2", "component3")), - ( "PORO", False, ()), + ( "PERM", False, ( "component1", "component2", "component3" ) ), + ( "PORO", False, () ), ] ) def test_getComponentNamesDataSet( vtkdatasetWithComponentNames: vtkDataSet, attributeName: str, onpoints: bool, - expected: tuple[ str, ...] ) -> None: - obtained : tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkdatasetWithComponentNames, attributeName, onpoints) + expected: tuple[ str, ...] ) -> None: + """Test getComponentNamesDataSet function. + + Args: + vtkdatasetWithComponentNames (vtkDataSet): _description_ + attributeName (str): _description_ + onpoints (bool): _description_ + expected (tuple[ str, ...]): _description_ + """ + obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkdatasetWithComponentNames, attributeName, + onpoints ) assert obtained == expected -@pytest.mark.parametrize("attributeName, dataType, expectedDatatypeArray", [ - ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), - ( "test_float", VTK_FLOAT, "vtkFloatArray" ), - ( "test_int", VTK_INT, "vtkIntArray" ), - ( "test_unsigned_int", VTK_UNSIGNED_INT, "vtkUnsignedIntArray" ), - ( "test_char", VTK_CHAR, "vtkCharArray" ), - # ("testFail", 4566, pytest.fail) #TODO -]) +@pytest.mark.parametrize( + "attributeName, dataType, expectedDatatypeArray", + [ + ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), + ( "test_float", VTK_FLOAT, "vtkFloatArray" ), + ( "test_int", VTK_INT, "vtkIntArray" ), + ( "test_unsigned_int", VTK_UNSIGNED_INT, "vtkUnsignedIntArray" ), + ( "test_char", VTK_CHAR, "vtkCharArray" ), + # ("testFail", 4566, pytest.fail) #TODO + ] ) def test_createEmptyAttribute( attributeName: str, dataType: int, expectedDatatypeArray: vtkDataArray, ) -> None: - componentNames: tuple[ str, str, str] = ("d1, d2, d3") - newAttr: vtkDataArray = vtkutils.createEmptyAttribute(attributeName, componentNames, dataType) + """Test createEmptyAttribute function. + + Args: + attributeName (str): _description_ + dataType (int): _description_ + expectedDatatypeArray (vtkDataArray): _description_ + """ + componentNames: tuple[ str, str, str ] = ( "d1, d2, d3" ) + newAttr: vtkDataArray = vtkutils.createEmptyAttribute( attributeName, componentNames, dataType ) assert newAttr.GetNumberOfComponents() == len( componentNames ) assert newAttr.GetComponentName( 0 ) == componentNames[ 0 ] assert newAttr.GetComponentName( 1 ) == componentNames[ 1 ] assert newAttr.GetComponentName( 2 ) == componentNames[ 2 ] - assert newAttr.IsA(str(expectedDatatypeArray)) + assert newAttr.IsA( str( expectedDatatypeArray ) ) From 996bc17d9371fa59f0bc5c1562e2c4e8c296cacf Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:49:59 +0200 Subject: [PATCH 14/57] Remove useless comment --- geos-mesh/src/geos/mesh/vtkUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index 40c264867..a4a653a46 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -928,7 +928,7 @@ def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) - return cutter.GetOutputDataObject( 0 ) -def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: #TODO CHECK OUTPUT +def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: """Transfer point data to cell data. Args: From fec1bf2c217004653ad4cd1b87ef99c10190b79b Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:53:10 +0200 Subject: [PATCH 15/57] Fix dependencies --- geos-mesh/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/geos-mesh/pyproject.toml b/geos-mesh/pyproject.toml index 2317c68b7..3f73d6c59 100644 --- a/geos-mesh/pyproject.toml +++ b/geos-mesh/pyproject.toml @@ -30,6 +30,7 @@ dependencies = [ "tqdm >= 4.67", "numpy >= 2.2", "meshio >= 5.3", + "pandas", ] [project.scripts] From c5ade9e3debcb12d1d499d4c0954c6bce7aa0e3e Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 16 Apr 2025 16:38:47 +0200 Subject: [PATCH 16/57] rename MeshIdCard and associated filters by CellTypeCounts --- .../{MeshIdCard.py => CellTypeCounts.py} | 18 +- ...ComputeMeshStats.py => CellTypeCounter.py} | 24 +-- ...teMeshStats.py => test_CellTypeCounter.py} | 24 +-- ...t_MeshIdCard.py => test_CellTypeCounts.py} | 38 ++-- geos-pv/src/PVplugins/PVCellTypeCounter.py | 174 ++++++++++++++++++ geos-pv/src/PVplugins/PVPrintMeshIdCard.py | 81 -------- 6 files changed, 226 insertions(+), 133 deletions(-) rename geos-mesh/src/geos/mesh/model/{MeshIdCard.py => CellTypeCounts.py} (86%) rename geos-mesh/src/geos/mesh/stats/{ComputeMeshStats.py => CellTypeCounter.py} (86%) rename geos-mesh/tests/{test_ComputeMeshStats.py => test_CellTypeCounter.py} (89%) rename geos-mesh/tests/{test_MeshIdCard.py => test_CellTypeCounts.py} (90%) create mode 100644 geos-pv/src/PVplugins/PVCellTypeCounter.py delete mode 100644 geos-pv/src/PVplugins/PVPrintMeshIdCard.py diff --git a/geos-mesh/src/geos/mesh/model/MeshIdCard.py b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py similarity index 86% rename from geos-mesh/src/geos/mesh/model/MeshIdCard.py rename to geos-mesh/src/geos/mesh/model/CellTypeCounts.py index 1e176115e..b8d7b6063 100644 --- a/geos-mesh/src/geos/mesh/model/MeshIdCard.py +++ b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py @@ -11,12 +11,12 @@ __doc__ = """ -MeshIdCard stores the number of elements of each type. +CellTypeCounts stores the number of elements of each type. """ -class MeshIdCard(): +class CellTypeCounts(): def __init__(self: Self ) ->None: - """MeshIdCard stores the number of cells of each type.""" + """CellTypeCounts stores the number of cells of each type.""" self._counts: npt.NDArray[np.int64] = np.zeros(VTK_NUMBER_OF_CELL_TYPES) def __str__(self: Self) ->str: @@ -30,16 +30,16 @@ def __str__(self: Self) ->str: def __add__(self: Self, other :Self) ->Self: """Addition operator. - MeshIdCard addition consists in suming counts. + CellTypeCounts addition consists in suming counts. Args: - other (Self): other MeshIdCard object + other (Self): other CellTypeCounts object Returns: - Self: new MeshIdCard object + Self: new CellTypeCounts object """ - assert isinstance(other, MeshIdCard), "Other object must be a MeshIdCard." - newCard: MeshIdCard = MeshIdCard() + assert isinstance(other, CellTypeCounts), "Other object must be a CellTypeCounts." + newCard: CellTypeCounts = CellTypeCounts() newCard._counts = self._counts + other._counts return newCard @@ -96,7 +96,7 @@ def print(self: Self) ->str: card += "| | |\n" card += "| - | - |\n" card += f"| **Total Number of Vertices** | {int(self._counts[VTK_VERTEX]):12} |\n" - card += f"| **Total Number of Polygon** | {int(self._counts[VTK_POLYGON]):12} |\n" + card += f"| **Total Number of Polygon** | {int(self._counts[VTK_POLYGON]):12} |\n" card += f"| **Total Number of Polyhedron** | {int(self._counts[VTK_POLYHEDRON]):12} |\n" card += f"| **Total Number of Cells** | {int(self._counts[VTK_POLYHEDRON]+self._counts[VTK_POLYGON]):12} |\n" card += "| - | - |\n" diff --git a/geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py similarity index 86% rename from geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py rename to geos-mesh/src/geos/mesh/stats/CellTypeCounter.py index deccb8c68..a2e10dc3f 100644 --- a/geos-mesh/src/geos/mesh/stats/ComputeMeshStats.py +++ b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py @@ -14,10 +14,10 @@ VTK_VERTEX ) -from geos.mesh.model.MeshIdCard import MeshIdCard +from geos.mesh.model.CellTypeCounts import CellTypeCounts __doc__ = """ -ComputeMeshStats module is a vtk filter that computes mesh stats. +CellTypeCounter module is a vtk filter that computes mesh stats. Mesh stats include the number of elements of each type. @@ -27,26 +27,26 @@ .. code-block:: python - from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats + from geos.mesh.stats.CellTypeCounter import CellTypeCounter # filter inputs input :vtkUnstructuredGrid # instanciate the filter - filter :ComputeMeshStats = ComputeMeshStats() + filter :CellTypeCounter = CellTypeCounter() # set input data object filter.SetInputDataObject(input) # do calculations filter.Update() # get output mesh id card - output :MeshIdCard = filter.GetMeshIdCard() + output :CellTypeCounts = filter.GetCellTypeCounts() """ -class ComputeMeshStats(VTKPythonAlgorithmBase): +class CellTypeCounter(VTKPythonAlgorithmBase): def __init__(self) ->None: - """ComputeMeshStats filter computes mesh stats.""" + """CellTypeCounter filter computes mesh stats.""" super().__init__(nInputPorts=1, nOutputPorts=0) - self.card: MeshIdCard + self.card: CellTypeCounts def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. @@ -98,7 +98,7 @@ def RequestData(self: Self, inData: vtkUnstructuredGrid = self.GetInputData(inInfoVec, 0, 0) assert inData is not None, "Input mesh is undefined." - self.card = MeshIdCard() + self.card = CellTypeCounts() self.card.setTypeCount(VTK_VERTEX, inData.GetNumberOfPoints()) for i in range(inData.GetNumberOfCells()): cell: vtkCell = inData.GetCell(i) @@ -123,10 +123,10 @@ def _computeNumberOfEdges(self :Self, mesh: vtkUnstructuredGrid) ->int: edges.Update() return edges.GetOutput().GetNumberOfCells() - def GetMeshIdCard(self :Self) -> MeshIdCard: - """Get MeshIdCard object. + def GetCellTypeCounts(self :Self) -> CellTypeCounts: + """Get CellTypeCounts object. Returns: - MeshIdCard: MeshIdCard object. + CellTypeCounts: CellTypeCounts object. """ return self.card diff --git a/geos-mesh/tests/test_ComputeMeshStats.py b/geos-mesh/tests/test_CellTypeCounter.py similarity index 89% rename from geos-mesh/tests/test_ComputeMeshStats.py rename to geos-mesh/tests/test_CellTypeCounter.py index 85352db3f..6abaf1090 100644 --- a/geos-mesh/tests/test_ComputeMeshStats.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -11,8 +11,8 @@ ) from geos.mesh.processing.helpers import createSingleCellMesh, createMultiCellMesh -from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats -from geos.mesh.model.MeshIdCard import MeshIdCard +from geos.mesh.stats.CellTypeCounter import CellTypeCounter +from geos.mesh.model.CellTypeCounts import CellTypeCounts from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, @@ -54,17 +54,17 @@ def __generate_test_data_single_cell() -> Iterator[ TestCase ]: ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cellType_all] @pytest.mark.parametrize( "test_case", __generate_test_data_single_cell(), ids=ids ) -def test_ComputeMeshStats_single( test_case: TestCase ) ->None: - """Test of ComputeMeshStats filter. +def test_CellTypeCounter_single( test_case: TestCase ) ->None: + """Test of CellTypeCounter filter. Args: test_case (TestCase): test case """ - filter :ComputeMeshStats = ComputeMeshStats() + filter :CellTypeCounter = CellTypeCounter() filter.SetInputDataObject(test_case.mesh) filter.Update() - card :MeshIdCard = filter.GetMeshIdCard() - assert card is not None, "MeshIdCard is undefined" + card :CellTypeCounts = filter.GetCellTypeCounts() + assert card is not None, "CellTypeCounts is undefined" assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" @@ -101,17 +101,17 @@ def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: ids2: list[str] = [os.path.splitext(name)[0] for name in filename_all2] @pytest.mark.parametrize( "test_case", __generate_test_data_multi_cell(), ids=ids2 ) -def test_ComputeMeshStats_multi( test_case: TestCase ) ->None: - """Test of ComputeMeshStats filter. +def test_CellTypeCounter_multi( test_case: TestCase ) ->None: + """Test of CellTypeCounter filter. Args: test_case (TestCase): test case """ - filter :ComputeMeshStats = ComputeMeshStats() + filter :CellTypeCounter = CellTypeCounter() filter.SetInputDataObject(test_case.mesh) filter.Update() - card :MeshIdCard = filter.GetMeshIdCard() - assert card is not None, "MeshIdCard is undefined" + card :CellTypeCounts = filter.GetCellTypeCounts() + assert card is not None, "CellTypeCounts is undefined" assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" diff --git a/geos-mesh/tests/test_MeshIdCard.py b/geos-mesh/tests/test_CellTypeCounts.py similarity index 90% rename from geos-mesh/tests/test_MeshIdCard.py rename to geos-mesh/tests/test_CellTypeCounts.py index dc7b9e16d..cdf2ab484 100644 --- a/geos-mesh/tests/test_MeshIdCard.py +++ b/geos-mesh/tests/test_CellTypeCounts.py @@ -7,7 +7,7 @@ Iterator, ) -from geos.mesh.model.MeshIdCard import MeshIdCard +from geos.mesh.model.CellTypeCounts import CellTypeCounts from vtkmodules.vtkCommonDataModel import ( vtkCellTypes, @@ -54,7 +54,7 @@ def __get_expected_card(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nb cardExp += "| | |\n" cardExp += "| - | - |\n" cardExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" - cardExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" + cardExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" cardExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" cardExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" cardExp += "| - | - |\n" @@ -64,13 +64,13 @@ def __get_expected_card(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nb cardExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" return cardExp -def test_MeshIdCard_init( ) ->None: - """Test of MeshIdCard . +def test_CellTypeCounts_init( ) ->None: + """Test of CellTypeCounts . Args: test_case (TestCase): test case """ - card: MeshIdCard = MeshIdCard() + card: CellTypeCounts = CellTypeCounts() assert card.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" assert card.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" assert card.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" @@ -80,13 +80,13 @@ def test_MeshIdCard_init( ) ->None: assert card.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" @pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_MeshIdCard_addType( test_case: TestCase ) ->None: - """Test of MeshIdCard . +def test_CellTypeCounts_addType( test_case: TestCase ) ->None: + """Test of CellTypeCounts . Args: test_case (TestCase): test case """ - card: MeshIdCard = MeshIdCard() + card: CellTypeCounts = CellTypeCounts() for _ in range(test_case.nbVertex): card.addType(VTK_VERTEX) for _ in range(test_case.nbTri): @@ -112,13 +112,13 @@ def test_MeshIdCard_addType( test_case: TestCase ) ->None: @pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_MeshIdCard_setCount( test_case: TestCase ) ->None: - """Test of MeshIdCard . +def test_CellTypeCounts_setCount( test_case: TestCase ) ->None: + """Test of CellTypeCounts . Args: test_case (TestCase): test case """ - card: MeshIdCard = MeshIdCard() + card: CellTypeCounts = CellTypeCounts() card.setTypeCount(VTK_VERTEX, test_case.nbVertex) card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card.setTypeCount(VTK_QUAD, test_case.nbQuad) @@ -136,13 +136,13 @@ def test_MeshIdCard_setCount( test_case: TestCase ) ->None: assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" @pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_MeshIdCard_add( test_case: TestCase ) ->None: - """Test of MeshIdCard . +def test_CellTypeCounts_add( test_case: TestCase ) ->None: + """Test of CellTypeCounts . Args: test_case (TestCase): test case """ - card1: MeshIdCard = MeshIdCard() + card1: CellTypeCounts = CellTypeCounts() card1.setTypeCount(VTK_VERTEX, test_case.nbVertex) card1.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card1.setTypeCount(VTK_QUAD, test_case.nbQuad) @@ -151,7 +151,7 @@ def test_MeshIdCard_add( test_case: TestCase ) ->None: card1.setTypeCount(VTK_WEDGE, test_case.nbWed) card1.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - card2: MeshIdCard = MeshIdCard() + card2: CellTypeCounts = CellTypeCounts() card2.setTypeCount(VTK_VERTEX, test_case.nbVertex) card2.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card2.setTypeCount(VTK_QUAD, test_case.nbQuad) @@ -160,7 +160,7 @@ def test_MeshIdCard_add( test_case: TestCase ) ->None: card2.setTypeCount(VTK_WEDGE, test_case.nbWed) card2.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - newCard: MeshIdCard = card1 + card2 + newCard: CellTypeCounts = card1 + card2 assert newCard.getTypeCount(VTK_VERTEX) == int(2 * test_case.nbVertex), f"Number of vertices must be {int(2 * test_case.nbVertex)}" assert newCard.getTypeCount(VTK_TRIANGLE) == int(2 * test_case.nbTri), f"Number of triangles must be {int(2 * test_case.nbTri)}" assert newCard.getTypeCount(VTK_QUAD) == int(2 * test_case.nbQuad), f"Number of quads must be {int(2 * test_case.nbQuad)}" @@ -171,13 +171,13 @@ def test_MeshIdCard_add( test_case: TestCase ) ->None: #cpt = 0 @pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_MeshIdCard_print( test_case: TestCase ) ->None: - """Test of MeshIdCard . +def test_CellTypeCounts_print( test_case: TestCase ) ->None: + """Test of CellTypeCounts . Args: test_case (TestCase): test case """ - card: MeshIdCard = MeshIdCard() + card: CellTypeCounts = CellTypeCounts() card.setTypeCount(VTK_VERTEX, test_case.nbVertex) card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) card.setTypeCount(VTK_QUAD, test_case.nbQuad) diff --git a/geos-pv/src/PVplugins/PVCellTypeCounter.py b/geos-pv/src/PVplugins/PVCellTypeCounter.py new file mode 100644 index 000000000..c349c8e66 --- /dev/null +++ b/geos-pv/src/PVplugins/PVCellTypeCounter.py @@ -0,0 +1,174 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +# ruff: noqa: E402 # disable Module level import not at top of file +import sys +from pathlib import Path +from typing_extensions import Self + +from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] + VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy +) + +from vtkmodules.vtkCommonCore import ( + vtkInformation, + vtkInformationVector, +) +from vtkmodules.vtkCommonDataModel import ( + vtkPointSet, + vtkTable, +) + +# update sys.path to load all GEOS Python Package dependencies +geos_pv_path: Path = Path( __file__ ).parent.parent.parent +sys.path.insert( 0, str( geos_pv_path / "src" ) ) +from geos.pv.utils.config import update_paths +update_paths() + +from geos.mesh.stats.CellTypeCounter import CellTypeCounter +from geos.mesh.model.CellTypeCounts import CellTypeCounts + +__doc__ = """ +Compute cell type counts. Counts are dumped in to Output message window and can be exporter in a file. + +To use it: + +* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVCellTypeCounter. +* Select the input mesh. +* Apply the filter. + +""" + +@smproxy.filter( name="PVCellTypeCounter", label="Cell Type Counter" ) +@smhint.xml( '' ) +@smproperty.input( name="Input", port_index=0 ) +@smdomain.datatype( + dataTypes=[ "vtkPointSet"], + composite_data_supported=True, +) +class PVCellTypeCounter(VTKPythonAlgorithmBase): + def __init__(self:Self) ->None: + """Merge collocated points.""" + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") + + self._filename = None + self._saveToFile = True + + @smproperty.intvector( + name="SetSaveToFile", + label="Save to file", + default_values=0, + panel_visibility="default", + ) + @smdomain.xml( """ + + + Specify if mesh statistics are dumped into a file. + + """ ) + def SetSaveToFile( self: Self, saveToFile: bool) -> None: + """Setter to save the stats into a file. + + Args: + saveToFile (bool): if True, a file will be saved. + """ + if self._saveToFile != saveToFile: + self._saveToFile = saveToFile + self.Modified() + + @smproperty.stringvector(name="FilePath", label="File Path") + @smdomain.xml( """ + + Output file path. + + + + + """) + def SetFileName(self: Self, fname :str) -> None: + """Specify filename for the filter to write. + + Args: + fname (str): file path + """ + if self._filename != fname: + self._filename = fname + self.Modified() + + @smproperty.xml( """ + + + + + + + """ ) + def d09GroupAdvancedOutputParameters( self: Self ) -> None: + """Organize groups.""" + self.Modified() + + def RequestDataObject( + self: Self, + request: vtkInformation, + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestDataObject. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inData = self.GetInputData(inInfoVec, 0, 0) + outData = self.GetOutputData(outInfoVec, 0) + assert inData is not None + if outData is None or (not outData.IsA(inData.GetClassName())): + outData = inData.NewInstance() + outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) + return super().RequestDataObject(request, inInfoVec, outInfoVec) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], + outInfoVec: vtkInformationVector, + ) -> int: + """Inherited from VTKPythonAlgorithmBase::RequestData. + + Args: + request (vtkInformation): request + inInfoVec (list[vtkInformationVector]): input objects + outInfoVec (vtkInformationVector): output objects + + Returns: + int: 1 if calculation successfully ended, 0 otherwise. + """ + inputMesh: vtkPointSet = self.GetInputData( inInfoVec, 0, 0 ) + output: vtkTable = self.GetOutputData( outInfoVec, 0 ) + assert inputMesh is not None, "Input server mesh is null." + assert output is not None, "Output pipeline is null." + + output.ShallowCopy(inputMesh) + filter: CellTypeCounter = CellTypeCounter() + filter.SetInputDataObject(inputMesh) + filter.Update() + card: CellTypeCounts = filter.GetCellTypeCounts() + print(card.print()) + + if self._saveToFile: + try: + with open(self._filename, 'w') as fout: + fout.write(card.print()) + print(f"File {self._filename} was successfully written.") + except Exception as e: + print("Error while exporting the file dur to:") + print(str(e)) + return 1 diff --git a/geos-pv/src/PVplugins/PVPrintMeshIdCard.py b/geos-pv/src/PVplugins/PVPrintMeshIdCard.py deleted file mode 100644 index 5aa4462a4..000000000 --- a/geos-pv/src/PVplugins/PVPrintMeshIdCard.py +++ /dev/null @@ -1,81 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay -# ruff: noqa: E402 # disable Module level import not at top of file -import sys -from pathlib import Path -from typing_extensions import Self - -from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] - VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy -) - -from vtkmodules.vtkCommonCore import ( - vtkInformation, - vtkInformationVector, -) -from vtkmodules.vtkCommonDataModel import ( - vtkPointSet, - vtkTable, -) - -# update sys.path to load all GEOS Python Package dependencies -geos_pv_path: Path = Path( __file__ ).parent.parent.parent -sys.path.insert( 0, str( geos_pv_path / "src" ) ) -from geos.pv.utils.config import update_paths -update_paths() - -from geos.mesh.stats.ComputeMeshStats import ComputeMeshStats -from geos.mesh.model.MeshIdCard import MeshIdCard - -__doc__ = """ -Display mesh statistics. - -To use it: - -* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVPrintMeshIdCard. -* Select the input mesh. -* Apply the filter. - -""" - -@smproxy.filter( name="PVPrintMeshIdCard", label="Print Mesh ID Card" ) -@smhint.xml( '' ) -@smproperty.input( name="Input", port_index=0 ) -@smdomain.datatype( - dataTypes=[ "vtkPointSet"], - composite_data_supported=True, -) -class PVPrintMeshIdCard(VTKPythonAlgorithmBase): - def __init__(self:Self) ->None: - """Merge collocated points.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") - - def RequestData( - self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestData. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inputMesh: vtkPointSet = self.GetInputData( inInfoVec, 0, 0 ) - output: vtkTable = self.GetOutputData( outInfoVec, 0 ) - assert inputMesh is not None, "Input server mesh is null." - assert output is not None, "Output pipeline is null." - - output.ShallowCopy(inputMesh) - filter: ComputeMeshStats = ComputeMeshStats() - filter.SetInputDataObject(inputMesh) - filter.Update() - card: MeshIdCard = filter.GetMeshIdCard() - print(card.print()) - return 1 From 261793dfc451ba6b213a5e89ef8d3f11f36ac533 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:28:09 +0200 Subject: [PATCH 17/57] Add data for test and modify useless functions --- geos-mesh/tests/conftest.py | 21 --------- geos-mesh/tests/data/displacedFault.vtm | 7 +++ geos-mesh/tests/data/domain_res5_id.vtu | 53 +++++++++++++++++++++++ geos-mesh/tests/data/fracture_res5_id.vtu | 52 ++++++++++++++++++++++ geos-mesh/tests/test_vtkUtils.py | 6 +-- 5 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 geos-mesh/tests/data/displacedFault.vtm create mode 100644 geos-mesh/tests/data/domain_res5_id.vtu create mode 100644 geos-mesh/tests/data/fracture_res5_id.vtu diff --git a/geos-mesh/tests/conftest.py b/geos-mesh/tests/conftest.py index 046645f66..e40353199 100644 --- a/geos-mesh/tests/conftest.py +++ b/geos-mesh/tests/conftest.py @@ -40,24 +40,3 @@ def vtkDataSetTest() -> vtkDataSet: reader.Update() return reader.GetOutput() - - -@pytest.fixture( scope="function" ) -def vtkdatasetWithComponentNames( vtkDataSetTest: vtkDataSet ) -> vtkDataSet: - """Set names for existing vtk dataset for test purpose. - - Args: - vtkDataSetTest (vtkDataSet): _description_ - - Returns: - _type_: _description_ - """ - attributeName1: str = "PERM" - - # return dataset - if vtkDataSetTest.GetCellData().HasArray( attributeName1 ) == 1: - vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 0, "component1" ) - vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 1, "component2" ) - vtkDataSetTest.GetCellData().GetArray( attributeName1 ).SetComponentName( 2, "component3" ) - - return vtkDataSetTest diff --git a/geos-mesh/tests/data/displacedFault.vtm b/geos-mesh/tests/data/displacedFault.vtm new file mode 100644 index 000000000..2cf49998a --- /dev/null +++ b/geos-mesh/tests/data/displacedFault.vtm @@ -0,0 +1,7 @@ + + + + + + + diff --git a/geos-mesh/tests/data/domain_res5_id.vtu b/geos-mesh/tests/data/domain_res5_id.vtu new file mode 100644 index 000000000..40797bd2b --- /dev/null +++ b/geos-mesh/tests/data/domain_res5_id.vtu @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + 1.7094007438e-15 + + + 1.7094007438e-15 + + + + + + + + + + + + + + + 0 + + + 3221.0246817 + + + + + + + + + + + + + + + _AQAAAACAAADgfwAARhgAAA==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AQAAAACAAAAwGwAABAEAAA==eJztlksOxDAIQ9PO/e88mq3lZ6JoVKURC5SGfADjUO4xxv1yuUA+BwjF9k95IkenYNX52CsfapNivWVddTTSWrXf+aO66p50ZsZvnV9wD9msbLk67HCajTt9u7WK34ShyythnHhA8VB8Dh/CM+FGOFexJRySn2rbYULcUl4QpitvKPHW2a14f4p0P9T/36ew6nzslY+Z+ubqp+popLVqv/NHddU96cyM3zrvfoh5QRgnHlA8FF/3Q4zpyhtKvHV2K96fIt0P9f/3Kaw6H3vlY6a+ufqpOhpprdrv/FFddU86M+O3zrsfYl4QxokHFA/F1/0QY7ryhhJvnd2K9z/5Ao84Duw=AQAAAACAAACQUQAAMQAAAA==eJztwzENAAAIA7B3SjCBx2lGCG3SbCeqqqqqqqqqqqqqqqqqqqqqqqqqqo8eaqCtmg==AQAAAACAAAAwGwAAIwAAAA==eJztwwENAAAIA6BmJjC67/QgwkZuJ6qqqqqqqvp0AWlKhrc=AQAAAACAAAAwGwAAPQAAAA==eJzt1rEJADAIRUGH/dl/hbSp0oiFcAci2Nm9VFUG5wxPnp3Pfet/AMC87b2ghwCAru29oIcAgK4L9At6fQ==AQAAAACAAABgNgAAawoAAA==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4q6xxV1ji7umNcq6axpP665pjbXumtYi666xxV1ji7vGFneNLe4aW9w1trhrbHHX2OKuaX2z7prWSeuuscVdY4u7xhZ3TfPfumtpdNfY4q6xxV3T+mbdNV1T666xxV1ji7vGFneNLe4aW9w17ce6a7pe1l1ji7umdcO6a2xx19jirul+t+5aOvzOxu5aOpy37K6l0V2H28i8ZXdN65J119jirrHFXdM8se6a1g3rrrHFXdP9aN01trhrmhvWXWOLu8YWd23XZ3LX0mo9J3ctje463EbOhd01trhrbHHXNFetu6Z737prGnPrrrHFXdN6Zd01trhrbHHX/LnsrqXDY84O9inuWhrdNba4a2xx17QmWHdN18K6a1pPrLum9dm6a1pzrLvGFneNLe4aW9w1trhrbHHX2OKuscVdY4u7xhZ3jS3ums+L3bV0OA7srlXL78zkrrHFXWOLu8YWd40t7ppet+4aW9w1trhrbHHX2OKu6XOtu5YOjtO6a9WuNLprbHHXdC9Yd01zzLprbHHX2OKuscVdY4u7xhZ3jS3umseH3bW0eh6Ru5ZG8xNuEzyPyF1ji7vGFneNLe4aW9w1trhrbHHXPA7srqXDcWN3Ld1Xjse6a2l019jirmkNt+4aW9w1reHWXWOLu8YWd40t7pruI+uu+dzZXUuH48buWrpPMG6JatzYXWOLu8YWd03roXXXtO5Zd01rmnXXfL7srqXDsWJ3LT0iGKskNVbsrulzrbum9cG6a2xx13TvWHeNLe4aW9w1trhrbHHX2OKuscVdY4u7pnXAumtaf6y7xhZ3zePG7lpaPYPIXUujuw63CZ5B5K6xxV1ji7umNdm6a1rHrLvGFneNLe6a1gTrrrHFXdNnWXctHRynddfS6K7DbexxWndNa4t119jirrHFXWOLu8YWd033uHXX2OKuad227prWMeuuscVd8/myu+Z5wu5aOpxj7K6l0V2H28gcY3eNLe4aW9w1trhrbHHXdL7WXdN+rLuWDo7BumtpdNfhNvYYrLvGFneNLe4aW9w1trhrbHHX2OKuscVd87xidy2tvkuo51G6mofsrmm+WXdN64x119jirnk+sLsOOphLGeH+rbuWRndNa75119jirrHFXWOLu8YWd40t7pqvI7tr6XAOZKlnWZa67uyu6Vpbd40t7hpb3DW2uGua29Zd03yw7pqv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AQAAAACAAADMBgAAFgAAAA==eJzT0hoFo2AUjIJRMAqGNgAA9C4diA==EQAAAACAAADAcAAAVRMAAFMRAADuEQAAZhMAANwTAAD/EgAAqBIAADwRAACTEgAAbRQAAHwTAACZEwAAxBEAACYRAADmEgAAehQAALgQAAA=eJydm2eYVeUVhZ1j7sSSZKzpPeRJ1Bild5AiSEcUpQhEo2joIE0EVFAUUaotCgqCiBUEOwQELIAiIiCKqKiI2GPsIcb8cK15nvPm7svh8Gd/d761115rne+ce4eZ+e5+3/4rqF5R9m1dqPqp6meqj5Wl8Z20uEB1ueoK1StVvxPwu68TcJ5jfKeAjzqXQ49x1H8ldBpHvyvgq3y/NP5W4T6BDusyrp/6/wE+6nSfefsFOM41b7+c+VD/cuj9rnC+7oOFW6r6L+i5FeekvhaXqS4DP3W733PqBzjqMH/9nHnRzzLoNo5+/wFfzGuccA+qfow5S5FXWy0uVr26orQe8ruvbeDP+LYBH3V6/sU586LfZfDF+2qxcP+EDusybrR4rqoordN95h1dKI7jXPOOzpkP9RtnXp6TC4W7W/Uj6FmMc3KiFsNVJ4GfusnvvhODHIz3Pvmo0/OH58yVfo2bFOQ1Srg7VT+EnruRV3Mthvr9BPzUTX73NQ9yML45rotx1On5Q3PmSr/GXRnkdZlwN6l+AD13Iq8OWpyjOhH81E1+93UIcjC+A66LcdTp+efkzJV+jZsYPIemCfc+dFiXcd015wrwUaf7zNu9UBzHuebtnjMf6jfuiuCcXCncQ6rvQc80nJNTtbhE9XLwU7f7Pcf9xFGH+U/NmRf9WOclwNGv+S4P8hruzwGq72LOQ8jrBOekOgH81ON+zzmhUBxHHeY/IWcO9FOpEzj6Nd+E4L6aI9w74Pc84/r68wT4ON995u1bKI7jXPP2zemb+o27bC++l6nuhh76nqB6KXgjPuPpJ6tv6vLcCcBRt/kuDe6PEcI9qvo25niu8U3sW3U8+KmH/O5rEvgzvglyNo46K+fnzIt+jRsfnJOZwu2CjkdxTnprzjjwUaf7zNu7UBzHuebtnTMf6jduXHBOLhVuuepb0DMT56S933f9PAQ/dbvfc9xPHHWYv33OvOjHOq8Ajn7Nd0mQ1xDhblfdiTnLkVcDLQb7+x/wUw/53dcg8Gd8A1wX46jT8wfnzIt+jbs4uK88f4nqm9BT+f8KmjNG9SLwRnxjkO+++qYuzx0DHHWb76LgnPxNuLGqb2DOEpyT6lqcpDoW/NRDfvdVD/wZXx05G0ednn9Szrzo17ixQV7nCXef6uvUg7yqaXGh/YCfut3vOdUKxXHUYf5qOfOiH+u8ELj/81uRxvO+miDcDvB7nnEdNWc0+DjffebtWCiO41zzdszpm/qNGx2ck4uEm6v6GvRMwDlppUV/+wE/dbvfc9xPHHWYv1XOvOjHOvsDR7/muzDIq69wC1RfxZy5yKumFkNUR4GfetzvOTULxXHUYf6aOXOgH+scAhz9mm9UkNfFwk1WbV6R5lmAvFpr0UX1AvBTD/nd1zrwZ3xrXBfjqNPzu+TMi35HgZd5ddfXv5d8W49X/Vz9Z1Sk8VP1+gV94d+qj6lOw/u9+c3j/akBzjrMTxx1me8x5EAfj0GvcfTtfc9nXt2sR/gaSZqnO/KaotfP6gv/BT/9mb87cpoS4KzD/MRlzZV+rPNZ5EW/L8AX3+e6ak5Fkp7TDfMn6/VLmEs/5uuGXCYHOM81L3FZc6R+414KzkkX9X+t83dEkubpinOyVIunVF8FP3Wbvyv8Ly0Ux1mH+YnLmhf9vArdxtHvS/DFvE7XnP2Fr5uk53VBXo9qsV51//LS/szfBTk9GuCsY32Ay5orfTwFvcbRt/fXB3mdpvlVhW/mviTtw/hHtNij+n3w05/5zeP9RwKcdewJcFlzpY/10GscfXt/T5BXZ83/0u/HSZrnNOT1sBarVI8AP/2Z3zzefzjAWceqAJc1V/qxzlXA0e8e+OJz+1TN/2WSntMZz4OHxLMbedGP+dzv/YcCnOfuDnBZc6T+VdBL36eI9ydJuv9U+H5Q/W+CjzrN537vPxjgPPfNAJc1H+rfDb28PzqJ9xvl9OckzXMK7o8HtFir+iX4qdv85vH+AwHOOtYGuKx50c+X0G0c/b4JX8zrZM3/vvCNkvS8Tsjrfi22qh5QXtqf+c3j/fsDnHVsDXBZc6WPtdBrHH17f2uQV0fN/7HwTf3cTtI+jF+ixRuq3wM//ZnfPN5fEuCs440AlzVX+tgKvcbRt/c9n8+hDpr/8yTd3xHPocXq34W86Md87vf+4gDnubsCXNYcqf8N6OU5aS/eL3T+6iVpng44J/dpsdJzy0vrNr95vH9fgLOOlQEua170Y50rgaPfXfDFvNpp/kHCN0jS89ojr0VabPa5gw76M795vL8owFnH5gCXNVf6WAm9xtG39yv97ZfGt9X8w5J0fzvcVwvVvx150Y/53O/9hQHOc7cHuKw5Uv9m6OU5aSPeH/o5kqR52uKc3KvFDtWflpfWbX7zeP/eAGcdOwJc1rzoYzv0Gkff3t8R5NVa838rfKskzdMGed2jxfuqh4Of/sxvHu/fE+Cs4/0AlzVX+tgBvcbRt/c9n/dVK83/UZLub4376m71v4686Md87vf+3QHOc18PcFlzpP73oZfn5CTx/tSfY5I0Tyuck7u02Kn6s/LSus1vHu/fFeCsY2eAy5oXfbwOvcbRt/d3BuekpeaX+T5M0vqNu1P9TyMv+jGf+71/Z4Dz3KcDXNYcqX8n9PKctBDvgf4ck6R5WuKc3KHFJtWflJfWbX7zeP+OAGcdmwJc1rzo42noNY6+vb8pyOtEzf+d8MclaZ4WyGuBFh+ofoX86M/85vH+ggBnHR8EuKy50scm6DWOvr+CP/veX/WVsnSfdXv/dvRTv/vd5/3bAxzzIG5vufG54J+D3ai6HT8Xq/x/V/WfrTpf9QLgyGc8f66W9edv1DUfOoyjbvPND3w30/7RyumPqs7ZuJHCfSqefwW5m8/93h9ZURznuZ8GOOq5HfONo37vfxqc17vE9zJy9f4wNdyG6+x57DduWHA9jB8W8FHHfMw/QDhfv3OFm6q6DXo874aydF9V8XVTnYc51ncW9HGe+6sC53nGVw34qHsedDFn854V5Jz1ejCn25DDgcL5/aCpzmO5ztUf/P2K3wdUff58rt0/Qq+fE//Hqj/UBTlENTr/nm9e748IcNbpecRlve/o17qfQ57Mw74+Bo45ee4heJ9mrt43L+/jJvDdFO87w5E/83B/U+Q6PMAxX+L2dh34/PV9cL3qS7gvjPN9cabqXJzbiO/M4L7Kev9R11zoMI6650EnfZ+gPI5RTr9XbYI8h+n1Z+L5KMjdfE1w/YYFOM81L3HUY76P4Jv6vW9entdrlc+LyNX7vdQwVPPmYh77jesVXA/je+F6GEcdczGfn4unCDdLtVFFmsfzjO+qxbmq51eU1u1+z3E/cdRh/q4586If6zwXOPodCjzzGuT7QfUFzJmFvOppMUB1yF70uN9z6hWK46jD/PVy5kA/1jkAOPo135Agr5HCP6C6BXPmIa+mWlykegtyox73e07TQnEcdZi/ac4c6OcW6DaOfs1nPJ+j04XbDH7PM+4M9d+MnDjffeY9I8BxrnnPyOmb+m+BXn7+7SPcVaqboMf6+uHzbw3xnaY6C3Osvxb0mcdzawQ46vKcGkF+5q0V5Ed/s6B/X68Hc7oZOfB8ef581eehxzjrGaQ6E7wR36DAT1bf1DUTOoyj7lnQyefQUJ9D1Y2Y47nGN9Lib6o3gZ96yO++RoE/4xsFfNR5E/Tsa170OxO+mFd/4RapPgc9tyCv2lqMUr0R/NTtfs+pHeCow/y1c+ZFPzdCt3H0exN88b66RrgN4Pc843qq/+/g43z3mbdngONc8/bM6Zv6b4TeyPdtqs9CD30PVL0BvBHfwMBPVt/UdQN0GEfdf4dO3h/nC3e/6nrM8VzjG2ox1ueyorQe93tOwwBHHeZvmDMH+rHOscDR7w3wxbwuEG6i6jOYcz/yaqbFKarnVZTWQ373NQv8Gd8M18U46vT8U3LmRb/GnRfkNUy4q1Wfhp6JyKuxFqerngt+6na/5zQuFMdRh/kb58yLfqzzdODo13zG8zlk3tmq6zDHOM/po9obvBFfH+S7r36oy3P7AEfd5usdnJPRwj2suhZzZuOctNBinOo54Kce93tOi0JxHHWYv0XOHOjHOscBR7/mOyfIa4xwd6iuwZyHkVdLLc5XPRv81EN+97UM/BnfEtfFOOr0/PNz5kW/xp0d5HWJcDNUn4KeO5BXGy16qP4V/NRNfve1CXIwvg2ui3HU6fk9cuZKv8b9NXgOef49qk9Cj3HWM0L1LPBGfCOQ7776pi7PHQEcdZvvrOCcDBDuctUnMOcenJM6Wpyseib4qYf87qsT+DO+DnI2jjo9/+ScedGvcWcGeQ0U7hHVx6HncuRVV4vxqn8BP3W733PqForjqMP8dXPmRT/WOR44+jXfX4K8xgt3s+pqzHkEebXz50bVXuCnHvK7r13gz/h2uC7GUafnn5czL/o1rlfwHPL8e1VXQY9x1jPS3z+BN+IbiXz31Td1ee5I4KjbfD2DczJJuBWqKzHnXpyTzlpMVJ2EHKjH/Z7TuVAcRx3m75wzB/qZBN3G0a/5jGdejbX/a/28q5aqfw7mn68Zf6sW7/oLOnjRz93Mbx7v31oojrMO8xOX9ed99GOd74KPfj+DL+a1Vbke4t/bTdLzGiOvOVpsUz0SOujP/I2R05wAZx3bAlzWXOnHOrcBR7/vwhfzaqj5ic+Tfw8gSfswfrYWz6geBB30Z37zeH92gLOOZwJc1lzpxzqf4XmF323wxed2A+n8WZKe0xDne7Bev4W86Md87vf+4IriOM99K8BlzZH6jTMvf/5TX7w1ha/v3+P17wEnaZ3uG6TX34i3oI3Dykv78DzzeX9QgLMuzyEua370Y9xh+L0Z5mBf3yBn5mSeQnC+6knPV2WYA50D9Xp1IT2Xvs1XH/kNDHCea17isuZN/caZl8+huur/lX8/2r8HW5bWV/n9jF6/oy8cWl5at/nrwf+AAGcd5icua170sRp6jaNv778T5FVHc6oI3y5J89RFXv31+kN94Ufgpz/z10VO/QOcdZifuKy50sc70GscfXv/wyCv2przG+GrJWmeOsirn16/py/8p1Dan/nrIKd+Ac46zE9c1lzpxzrfw3OIfj+ELz6HamnOv8vSc2pjfl+9fhxz6cd8tZFL3wDnueYlLmuO1G/c48E5qan+/6qveZLmqYVz0kev1+gLPygvrdv8teC/T4CzDvMTlzUv+ngceo2jb++vCfKqoTlHCl89SfPURF7Xa/Ga6teF0v7MXxM5XV8ojrMO8xOXNVf6WAO9xtH31/DH+6q65vynLN1fA/OvU/+T4KMf89VALtcFOM99MsBlzZH6X4NenpNq/v8Afx/m51VZWp/x12qxUfXA8tK6zW8e718b4KxjY4DLmhd9PAm9xtG39zcGeVXV/F/492KTNE815HWNFm+rHgx++jO/ebx/TYCzjrcDXNZc6WMj9BpH3973fN5Xx2v+n5J0f1XcVzPU/znyoh/zud/7MwKc534e4LLmSP1vQy/PyXHiPUD4Y5M0z/E4J9O1eF71C/BTt/nN4/3pAc46ng9wWfOiny+g2zj6/Ry+mNefnYfwJybpecchr2labFCtKC/tz/zm8f60AGcdGwJc1lzpxzo3AEe/z8MX8zpW8w/352R/v5vAh/BTtXhFNYEO+jO/ebw/NcBZxysBLmuu9LEBeo2jb+97Pp9Df9L8HyTp/mPxHJqi/heRF/2Yz/3enxLgPPfFAJc1R+p/BXp5To4R737+PsGfH31/4pxM1mKdall5ad3mN4/3Jwc461gX4LLmRT/WuQ44+n0RvpjX0Zp/qPDtk/S8Y5DX1Vq8rPpj6KA/85vH+1cHOOt4OcBlzZU+1kGvcfTtfc/nfXWU5u8pS/cfjfvqKvU/gbzox3zu9/5VAc5znwhwWXOk/pehl+fkj+I9WPiGSZrnKJyTHnq9xXzlpXWb3zze71FRHGcdWwJc1rzo4wnoNY6+ve/59s2/i/ffJR+VpPf598yfMA8/78qK4yt9BriIz/hPwMf/Zzfef7fpv8vsqtoNfO7j31/77zh/p1qlPJ++yvOdpPGcZxz1ma8KrmvWv0+lf/shjvlUgX/eV8aPU52heg14jDdPW9Ueqj2Rb1Y9xFlH2wBHXVUw3zj66QHdld8HwW9P+Pq/35sSbp7qbeg3zv0DVAcGOvc2P5o7IMBRT0/MN476B0Ivz4nxd6kuVl0CHuPNM0x1tOqYnHqIs45hAY66BmK+cfQzGrqNo98x8MVzYvwa1bXoN87901VnBDr3Nj+aOz3AUc8YzDeO+mdAL30b/4LqVvQb5/7ZqnNyzo/mzg5w1DMD842j/jnQy/vD+FdV31LdBR7jzbNAdaHqopx6iLOOBQGOuuZgvnH0sxC6jaPfRfDFc2L8x34fRb9x7l+quizQubf50dylAY56FmG+cdS/DHr5ucb4z1S/Uv1G1R/QzOc+861QXa261t//5NRHnHWtCHDUtwzzjaO/1dBvHP2vhT/jmM86+Of5Mv4g4Q/2B9/90zj3b1bdEvjZ2/xo7uYARz3rMN846t8CvTxfxh+meqTqL1V/BT73mW+76muqu1X/BzLR5bJ4nJ2df8xWhXmGEfQDnakC6pooCFbAopuAtd0U2GYnP2qzZOI6BQoLKGjQimAnCmKX9A/RtgOliXag1dUfm8Iqra2YqdtsFMV0ii010U1tJ1Zwbadg23XqknlfJ/ku9uQ9nP5zf3qu57nv57znfd/vfZ+vxzf6Bvzf/34YPfgDGXDYoA/0twb1P/6DghsWfangji/6vSGOPkdHX+7r3xeO4yOjP+3rz8NxHH/84CP78adEf0f1cNS/E/1lMU8v/8r3nYJznjfkD+f8v1TeIeH6xH8senp0SnSq+lFHv/ei70cHD47P4G75zJHrvYJzPvrhD+f53ld+OM/PPO+L8/nBD97XF/yM6EzVw1E/LDpc57Otf+U7rOCcZ4j84Zx/uPJGBhwi/pzoedE/Ux94+hwdHRk9vmMec+Q4uuCca7j84TzPSOWG87zHay5fJ/Bzo59VffO6kfqx0XFFzl7+le/YgnOe4+UP5/zjlNdzwy+OXqx6OOonRid19K98Jxac84yTP5zzT1Jezw2/LLpc9XDUT45O6ehf+U4uOOeZJH8455+ivJ4b/troatXDUT89OqOjf+U7veCcZ4r84Zx/hvJ6bvi10XWqh6N+dnROR//Kd3bBOc8M+cM5/xzl9dzwX4v+jerhqL8welFH/8r3woJznjnyh3P+i5TX73/wd0Tvid6rPvD0WRK9IrqsYx5z5FhScM51kfzhPM8Vyg3neZdpLl8n8N+MPqB6OOqvia4scvbyr3yvKTjnWSZ/OOdfqby+TuC/E/3n6L+oDzx9vhC9MfqljnnMkeMLBedcK+UP53luVG44z/slzcXcOTzg3w76QD868AP9yMD+x+9JwdvR/zykvx/11HH8HnH0h3dfc+4H58cbfnZ0TvRU9YGnz4l5woyJ/rqYr1ee5vV2YH/ePnAfUb7K13PAjVE/z81xfH2+4NdHvxpdpD7w9JkXnR+doPPXNg/cej1u9oFzrjHyh/McE5TXvvDz5evzBX9X9O7oRvWBp8/l0aXRxR3zwN2lx80+cM41X/5wnmOx8toXfql8/b4D/63ot1UPR/210dUd/eG+pcfJ/eGcZ6n83Q9+tfr5OoF/Kvp09GH1gafPzdH10S92zAP3lM6/feCca7X84TzHF5XXvvDr5evzBf+j6AvRf1UfePrcEb0zemvHPHA/0uNmHzjnWi9/OM9xq/LaF/5O+fp5Bb8r+rrqm98nU/jN6AMd/eF26XFyfzjnuVP+7gf/gPr5e1X4t3hf5X04+lP1o45+/xh9JPrd6JaO+eDe0uNhv+Z77qLfFnGeZ4vywnn+72o+54N/RPl8fcHzi99Bg/rXw1H/dHR7R384/ODdH855HpG/+8FvVz+/DsGzVzmcz0fqA08f9i87o9/vmAcOf3j7wDnXdvnDeY7vK6994XfK19cJPPuTUT5vA/rXs1/Z3dEfru3+y3l2yt/94Hern68TePYjvxsdrT7w3iv9KrqnYx64tvsr59otfzjPsUd57Qv/K/n6fMGzB/mD6GnqA+9906HRdzvmgWu713Iu+r2rfp6D44eqn+fm+JDiewt49iWfip6lPvDeKx0VPVznr20euLb7K+c6VP5wnuNw5bUv/FHy9fmCZ3/ymeifqg+890+josd2zAPXds/lXEfJH85zHKu89oUfJV+/bsOzd5mn+uZ1KPXsZU7q6A/Xds/lPKPk737wJ6mfrxN49i6XRBeoD7z3UadFT+mYB67t3su5TpI/nOc4RXntC3+afH2+4NnXXBldoj7w3mNNjZ7eMQ9c232Zc50mfzjPcbry2hd+qnx9vuDZ81wXXaE+8N5/zYye1TEPXNs9m3NNlT+c5zhLee0LP1O+Pl/w7Iduit6gPs3fPaQBe6S50fM65oFru59zrpnyh/Mc5ymvfeHnytev2/DskTaovvm+OPXsmRZ19Idru8dznrnydz/4Rern6wSe/dDfRTeqD7z3a8ujizvmgWu7x3OuRfKH8xyLlde+8Mvl6/MFzx5pS/Tv1Qfe+7ZV0Ss75jnQvZ5zLZc/nOe4UnntC79Kvj5f8OzJHo8+qD7w3st9OXpdxzxwbfd/zrVK/nCe4zrltS/8l+XrPeEfHfGBjsn3L2MH9j/+lzn+8xT+Qvss6uhjHm5swVX94DlOP3+PCH9y9OPRz0T/XP2oo98+TkgOjIqO7uuWD4488PaDcz76jdbn049rTuc2x/zMY87nZ7Tm9/MK/sro2ug69YGnz9To7Ogcnd+2ecyRY2rBOddo+Te/P2qe2coN53nnaC6/v8Pfwffmqoejfkn00iJnL//Kd0nBOc8c+Td7B+W/VHl9ncDfy/fnfD+uPvD0WRa9JrqyYx5z5FhWcM51qfyb90nNc41yw3nelZrL5wv+segT0SfVp/m7lvRZE10bXVfk7pXHHDnWFJxzrZQ/nOdZq9xwnned5vL5gt8R/UH0h+oDT58N0duitxe5e+UxR44NBedc6+QP53luU244z3u75vLrEPyPoz9RPRz190c3FTl7+Ve+9xec89wufzjn36S8vk7g90R/xvuw+sDT58HoQ9GtHfOYI8eDBedcm+QP53keUm44z7tVc/l8wf939H+i76oPPH2+F30i+mSRu1cec+T4XsE511b5w3meJ5QbzvM+qbn8vIIfnF+UhwzqX9+8TqTwueiOImcv/8r3uYJzniflD+f8O5TX1wn8h6LHRo9TH3j6vBB9LbqrYx5z5Hih4Jxrh/zhPM9ryg3neXdpLp8v+JOiH42OVx94+rwVfTu6t8jdK485crxVcM61S/5wnudt5YbzvHs1l59X8GdEz1Q9HPUH87l28P+fs5d/5Utfc85Dv0P0Odz5m+PF9xbwfxg9OzrNfQb073NY9IjokTofbfOYI8dhBbdfLvnDeZ4jlBvO8x6puXy+4P8kem50lvrA0+fD0eOiI4rcvfKYI8eHC865jpQ/nOc5TrnhPO8IzeXnFfzs6BzVN6+XqT8xOqbI2cu/8j2x4JxnhPybz8vKP0Z5fZ3A/0X0ougi9Wn+LjoNxkdPjU7omMccOcYXnHONkT+c5zlVueE87wTN5fMFf1l0afQK9YGnzyeiZ0TPLHL3ymOOHJ8oOOeaIH84z3OGcsN53jM1l88X/NXRldFV6tO8zqfBJ6NnR6cVuXvlMUeOTxacc50pfzjPc7Zyw3neaZrLr0PwX4n+teqb19XUnx+9oMjZy7/yPb/gnGea/OGc/wLl9XUCvz56S/RW9YGnz7zogujCjnnMkWNewTnXBfKH8zwLlBvO8y7UXL5O4L8RvUv1cNR/Lnp5kbOXf+X7uYJznoXyh3P+y5XXc8Nvim5WPRz1V0VXdPSvfK8qOOe5XP5wzr9Cef38gP929LHoP6kPPH1WR9dEb+iYxxw5Vhecc62QP5znWaPczfelmvcGzeXrhD0ae6Nx0T59/+A9239Fn9Uein7Uc5x6uLZ7vD7lqnydH45+vk7g2eucH/20+sB7n3ZC9Ji+/n5t88C13duNU77K13Mco7z2hec4vj5f8Ox5bor+lfrAe082N3pOxzxwbfdxznWC/OE8xznKa1/4ufL18wqefdDfqr75vJJC9kWXdfSHa7uPc5658nc/+MvUz9cJPHudLdH71Afee7JV0c93zAPXdh/nXJfJ3xzzOKd9za0srhN49jrbVN/83plC9j436Xy19Ydru3/bolyVr/PfpH6eG559zU7VN9d9CtnnfF3zt/WHa7tH26Zcla/zf139/PyAZz/zH9F/Vx9477E2R+/V+WibB67tvmyn8lW+nuNe5bUv/Gb5+jqBZz/zC9U3v2+lkP3Nwx394dru0Zxns/zdD/5h9fPfI8Gzd3kv+uvoPvWjzvurbdHHo491zAfXdl/mfA/L3xxzOSec539c8zkf/Dbl8/UFz17n0EH965vXlxSy93m+oz9c272a82yTv/vBP69+vr7g2c+MiHLfx2HqR533Xq9HfR/JA83XfG88qD9f7dmc73n5m+t1v0vP/7Lmcz7415XP1xc8e56TVQ/n/di+jv5wbfdvzvO6/N0Pfp/6+fqCZ68zOcp9Hz+mftR5D9YX9X0kDzQfXNu9m/Ptk7+5Xve79PxwffL1+eL4IcXnd3j2QdNVD+e92lCd37b+cG33ds7TJ3/3gx+qfv49Cp49D/dVPEd94L0n830kDzQPXNt9nHMNlb+5Xve79Nwj5evrBJ590FzVN6+DqWdfVN2fspd/8/lWj1O1j2t7X0znH6t+nhuevc5i1cN5P1bdn7KXP1zb/Vvb+2I6/0T189zw7GeWqR7Oe67q/pS9/OHa7tHa3hfT+Sern+eGZ+9yreqb17nUs5ep7k/Zyx+u7T6s7X0xnX+6+nluePYsa1XfvK6lnj1MdX/KXv5wbfdcbe+L6fyz1c9zw7M/+Zrq4bx3qu5P2csfru1eq+19MZ3/QvXz+x88+5O7o3eoD7z3Skuj1f0pe+WBa7u/antfTM+xRHntC79Uvr5O4Nmz/IPq4byHurqjP1zbPZfzLJW/+8FfrX6+TuDZB3H/x++oD7z3T76P5IHmgWu753Kuq+Vvrtf9Lj33jfL1dcI/Hx09JjpY3LPp93L0lehzup6o61OdOfvS91lxzvOc/OGc/xXl9dzwo6KjVQ9H/e7ono7+le/ugnOeV+QP5/x7lNdzw4+Pnqx6OOr3Rvd19K989xac8+yRf/P5V/w+5fXc8L8X/X3Vw1E/MP9i0MHd/Ctf+ppzHvrhD+f8HKev54afEZ2pejjqh0WHa/62/pXvsIJznkHyh3P+4crrueFnRc9TffN9WX4YER3Z0b/yHVFwzjNc/s3nTvEjlXe/z73RudHPqr753JsfxkbHdfSvfMcWnPOMlH/zOVH8OOX13PCLoxerHo76idFJHf0r34kF5zzj5A/n/JOU13PDL4suVz0c9ZOjUzr6V76TC855JskfzvmnKK/nhl8VvVb1cNRPi07v6F/5Tis455kifzjnn668+33ujV4fXaN6OOrPjc7q6F/5nltwzjNd/nDOP0t5PTf8+uhXVQ9H/bzo/I7+le+8gnOeWfKHc/75yuu54W+L3q56OOovjl7S0b/yvbjgnGe+/OGc/xLl9dzwm6KbVd+8ruaHq6IrOvpXvlcVnPNcIn8451+hvJ4b/tHoY6qHo/766JqO/pXv9QXnPCvkD+f8a5TXc8M/FX1a9c3zMT/cHF3f0b/yvbngnGeN/OGcf73yem74HdHnVQ9H/Yboxo7+le+GgnOe9fKHc/6Nyuu54X8c/Ynq4ai/P7qpo3/le3/BOc9G+cM5/ybl9dzwP4v+XPVw1D8U3drRv/J9qOCcZ5P84Zx/q/L6ezn4vdGD8t89GXhQ/z7N/08+fR6Nbo8+0zGPOXI8WnDOtVX+cJ5nu3IfrOP0fUZz+TqBHxodpno46l+MvlTk7OVf+b5YcM7zjPzhnP8l5fXfUcAfFx0dHR89Wf2oo9+u6J7o3ui+jvnMkWtXwTnfS/KH83x7lB/O8+/VfHA+P/s0/37fh4WbHZ2j+ub6zg8n8t/b4X5cB+hf+dLXnPPQb4z+/t/5OU5fX1/wi6KLo7dEb1U/6ug3IToxuiC6UOenbT5z5JpQcM43Rv5wnm+i8sPdUnALCg7/heJ8fcHfx/NA9XDUfz56dzFPL3+4+/R4uj+c8yyUvzn6Oqff5/hnvrf/7ejQ6BDx3me8Gn0xukPfE1PvfYi5tnsT59ohfzjP8aLy2hf+Vfn6fMHzff8J0WPVB957kDejr3XM07zOiq/2Lc71qvzhPMdrymtf+Dfl6+cVPHuCU1QP573JOx39m/c18dVexnnelL/7wb+jfr5O4NkTnBGdqD7w++1Por/pmAeu7Z7Guej3G/XzHM1x9fPcHMfX5wue/cKnon+sPs19TdOHPcRR0Q/p/PXK87+rlyXaeJydnWfQVsUZhkFeEBULNhQxIChiBxGxIgr2aCwYVEQ/goolxcTYYySjY4sxWLBgS8YZZ2LBZJzYJlEnPxJFUWOJoqCxd7HFFktmkvv6Zrjiztn35c+tnGuf53727O45nP2+c3q1evz3T6TH7tGto71yYBVxE6PbRFs5sIK4PcRzfNVCXvhVlbdPj2/mJ0X3UXs42n8rOrDD/HCTxDs+nP2sqvyOBz9Q8Vw3/NTooWoPR/v1oyM6zA83Vbzjw9nPQOV3PPgRird0/r63+KOiR0e/pzjwxNk8Ojq6cYd+4I4S7zxw9jVC+eFcx8by67zwo5XX/QV/fPSn0R8pDjxxto+Oi27doR+448U7D5x9jVZ+ONextfw6L/w45fW8gj89+nO1h6P9rtHdOswPd7p4x4ezn3HK73jwuymexwn8edHzozMVB544+0cnRffo0A/ceeKdB86+dlN+ONexh/w6L/wk5XV/wc+OXhadpTjwxDks2hU9uEM/cLPFOw+cfU1SfjjXcbD8Oi98l/J6XsFfF/2N2sPR/ujoMR3mh7tOvOPD2U+X8jse/DGK53ECPzd6a/S3igNPnJOjp0SP7dAP3FzxzgNnX8coP5zrOFZ+nRf+FOV1f8HfG70v+kfFgSfOedHzo2d06AfuXvHOA2dfpyg/nOs4Q36dF/585XV/wc+LPhj9q+J0r1uJc2l0dnRWh37g5ol3Hjj7Ol/54VzHLPl1XvjZyut1CP7x6BNqD0f7a6LXdpgf7nHxjg9nP7OV3/Hgr1U8jxP4l6IvRxcoDjxxbonOjV7foR+4l8Q7D5x9Xav8cK7jevl1Xvi5yuv+gl8cfS/6huLAE+eu6N3R2zr0A7dYvPPA2ddc5YdzHbfJr/PC3628nlfwS/X8n/bquWR7ONo/FJ3fYX448sE7Ppz93K38jgc/X/E8TuBXjq4S7aM48MRZGF0UfbRDP3Dkh3ceOPuar/xwruNR+XVe+EXK6/6C3yi6cXQ1xYEnzr+iH0ef79AP3EY6b84DZ1+LlB/OdTwvv84L/7Hyur/gp0QPie6lOPDEWS9/MTw6oHdnfuCm6Lw5D5x9EW+AONcxQH6dF57j5O0bro/4K6NzohdGZyoe7Yg3PXp49MDoHh36g7tS59H54OxvuPKboy77hLtQ/eC67M8c/hhfvcQvVDuO0+4G9WdtPriFOp+OCzdHfpzX86p7vYiuEl1VHPpwClsYXRR9LvpIryXjOs/DBc4+iP+wOPt6RPlL9SyS75aOE/c51eX+gh8U/VZ0cMEfcV6Nvh59o+C7yY85fLxa4OzrOeWHcz2vy3dLx4n7hury/RD8iOgGag9H+w+iHxZ8NuUv5f2gwNnPG8oPZ/8fyq/HCfzm0S2jYxUHnjhfsHAkcc9WZ37M4eOLAmdfxCM/nOvhwBeK53p7aqK7v+C3je4S3VVx4InTO7pStL/6rdaPOXz0LnD21VP54VzPSvLd0nHi9lddnlfw+0b3U3s42q8VHVTw2ZS/lHetAmc//ZUfzv4Hya/HCfx3owdHpygOPHGGRNflfq1DP+bwMaTA2dcg5YdzPevKd0vHibue6nJ/wU+PHhE9UnHgibNJdLPoyILvJj/m8LFJgbOv9ZQfzvVsJt8tHSfuSNXleQV/XPTHag9H+22i2xZ8NuUv5d2mwNnPSOWHs/9t5dfjBP7k6KnR0xQHnjg7RSdGd+7Qjzl87FTg7Gtb5YdzPRPlu6XjxN1Zdbm/4M+Mnh09R3HgibNXdJ/ovgXfTX7M4WOvAmdfOys/nOvZR75bOk7cfVWX5xX8xdFL1B6O9odEpxZ8NuUv5T2kwNnPvsoPZ/9T5dfjBP7K6NXRaxQHnjjTo0dGZ3Toxxw+phc4+5qq/HCu50j5buk4cWeoLvcX/O+iN0VvVhx44hwfPSF6YsF3kx9z+Di+wNnXDOWHcz0nyHdLx4l7ouryvIL/U/TPag9H+7Oj5xR8NuUv5T27wNnPicoPZ//nyK/HCfxfon+L3q848MS5IHpR9OIO/ZjDxwUFzr7OUX4413ORfLd0nLgXqy73F/zD0Uejf1cceOJcEZ0Tvargu8mPOXxcUeDs62Llh3M9c+S7pePEvUp1eV7B/zP6gtrD0f7G6E0Fn035S3lvLHD2c5Xyw9n/TfLrcQL/SvTt6DuKA0+cW6O3R+/o0I85fNxa4OzrJuWHcz23y3dLx4l7h+pyf8F/HP0q+rXiwBPnvuj90QcKvpv8mMPHfQXOvu5QfjjXc798t3ScuA+oLvcX/PJ5Pr1CdMWeS8aBJ85T0aejCwq+m/yYw8dTBc6+HlB+ONfztHzDud4FqsvrEPz60RFqD0f796MfFHw25S/lfb/A2c8C5Yez/w/k1+MEftfoZPZ3FAeeOP3zF+tEh/buzI85fBDfnH0Rj/xwrgef/cW53qGqy/0F/+vo7OhligNPnIOih0W71G+1fszh46ACZ19DlR9udiHeYQWOuF3ivG8Hv0DtOE676xt8lfLBOX6X4pojrvN7XaAe9nVW6/HNnPfHno8+quf1tPO+mrna/Tfi4auU1/6fVzzXA89+zRC1h/M+15uqvzY/XO0+GnHwVcpr/28qnuuGZ39mQ7WH8/7VR6q/Nj9c7f4YcfBVymv/Hyme64Znn2UrtYfzftVSrSXj1+aHq90PIw6+SnntH454rhue/ZPd1B7O+04rq/7a/N3XJ/GlfS3i4KuU1/5XVjzXDc9+yf5qD+f9pLVVf21+uNr9KuLgq5TX/tdWPNcNz77HIWoP5/2j4aq/Nj9c7f4UcfBVymv/wxXPdcOznzFD7eG8DzRK9dfmh6vdZyIOvkp57X+U4rluePYvfqL2cN7f2U711+aHq90/Ig6+SnntfzvFc93w7EP8TO3hvJ+zi+qvzQ9Xu19EHHyV8tr/LornuuHZXzhX7eG8L7Of6q/ND1e770McfJXy2v9+iue64dlPuFTt4bzfcqjqr80PV7ufQxx8lfLa/6GK57rh2Re4Vu3hvL9ylOqvzQ9Xu39DHHyV8tr/UYrnuuF53n+L2nevL/kP9gNOUv21+eFq92GIg69SXvs/SfFcNzzP9+9Rezjvf5yr+mvzw9XurxAHX6W89n+u4rlueJ7TP6D23fM2/8Fz/EtUf21+uNr9FOLgq5TX/i9RPNcNz/P3x9QezvsWV6v+2vxwtfsixMFXKa/9X614rhue5+0vqj2c9yNuVv21+eFq9zuIg69SXvu/WfFcNzzPzd9VezjvP9yp+mvzw9XubxAHX6W89n+n4vm5IjzPv3vk+dRHigPv/YR50XvUH7V+4Gr3LYiDv1Je13GP/Dov/Dzl9TiB53n4Sj2XbN89P/MfPC9/psP8cLX7FPYzT/kdD/4ZxfPvm8Dz/HsDnm9HByke7bxf8GH0reirHfqDq92fsL9nlN8cddknnOt/S/XZH/yH8ufxBc9z84PUHs77D8N6d5YfrnZ/w36IN0yc/Q/TvsMy4ZYWz3P0y6OzojOiRyou7b2/MC16cHRUdKT6q9YvXO2+hn0OU35z1GefcDPUH64Lbpb6z/3gOsxRh/dT4BeoHce97zGtzXxwtfspl8uP8/o6x58douOj60dZNuHnpbBlknDZ6Pv5+wf1/Jf2/JlX4OyD+PPE2Rdx3hfnOji+rOa36+Y4+T0fyUvcb0e3j64bXSm6lNrb7+rcf0Tfzd8/E31IdRHP9Zur7Sf7fEj54VwXx98V537g+NLqd/ff6hpHLR0nLnG6+y1/z/ikDnyuGV0x2ku8630puiA6X35o7/4yV9uv9jVf+eFcxwL5dV74l5TX11XyEndlHUftq/R7io47v8DV1o02/X6k/S9UPNfNfVz/6ArRZcQ9lvbPRp+OPq78tOurdub6F7hnxdnP48rvePBPK57nxzLi14gOjC4r3nlfjL4cfUJ+aG/f5mrrs68nlN/xqOfFQjzX+7Lqcn8tF10vul10k2g/8U8mzmLGXRJ/kv//h/zQnjxPFjj7IP6T4uyLOJ+Icz34XCzO9X6iutxf/cTvFJ0QXV68/fVL3OWjT8kP7V2fudp+sC/ikN/xqKefzmtLx7vjtpbk/e9Hxi3zeEB0rejaUcYt7TzPX4i+En1N47p2vWh3PuGXuPYDt5Z4+4VzvS+qHseDf03x/u/f6VGui8Oi/P43v1fO9aP73+m6zr4T9e+d+/frm65H7V7X2/29/qbfj3c/vFPI6356Vf3g+2PWadbX4dEtomOirD+sa7T3+v5e9Kvo11pfvf4Rz9cLc7XXldp11/W+V4jn+herLjj321fqj5aOE/dr9ZfnAfeH3J+Pjm4a5XwzPmjn+/0vo59qPLR7P9ruvy9qx63reUd+nZd++LKQ1/30qfrB10HWL9anzaKc14Hivc59pvPtcdR0H9Puelo7fl3PZ4V4rvc91eV1g/V8aHTj6KjoSMXFB+1Z99+Ofhz9d/Rz5W/3egI3VLzztttP1Elc+4cbJd71wbmfPlP9jgf/ueJ53WD9Zz4xD3gvBu/b4P0jtPP1gnnj93H4/SS172Vpuj7B1b4XpXbdqH2/iPvpC8VzPzNfOH+cn3HRPaOs+7Tz/OJ89o2R1aJfyV/TPG33elQ7/lwXPs25XvJSD5z7h+PE9XrDeWFd3zG6c5T3l/BeFM4f7b3+L5c8K0b9/hS/J6ZpXNRed+Bq30/jevHteLXvg3F/9VY/wLl/OU5+Xz8ZH6xTfF9iYnSceK9f/g5FX/lpWv/aHaf4I659wE0UX/pehuvsK879xX0Mz0n3itLvo8X7uewAnQ+Ph9r7pNrnv7Xj0PXg0/Fc73Kqy/3FesJ6sXf0oOgY8V531ogOi/r+vem+vN31zb6IN0yc68Gn47neYarL1yXmN/P3gCjv7+G9QLwnqfv3arQeDI4OiZbeo1S7rtS+Z8q+Bxfi1b7nqfY9SO6nIeoHX5eY78x/vhvDd1QmRzl/nG/ae53w92bW0Xn2uGhad2qvt3C13/2p/U5O7fh2P62h+p0Xfh3l9TxgfWG9OTB6WJTzzXijndejodENNB7avW7Wrn/tzgPXN7QQz3UPVl1w7qcN1A+eBzwfYb1jneqK/iB6QpTn1LT3cxXWtw2jY6M7RPvIb+1zmtrn6LXrt+vpI5+O19Vjybocj+P011j1Q0vHyb+D+snXT+YN3zXiu0XTopPF+/tPfN9oow7nJVztd6bsax3lh6v9XpPr3Uic1w3uY9jP/k702Cjzg3lHO+93rxkdo/njedm0b97S8ab7K/tesxCvdt1w/WNUX0vHHW9MoZ9Z7znPnJ9jol1R5g/tfH3gfG6h+eL5VXudabrfanec1s5/172h6nJe+C2U1/3Mes96fnh0epT3HnLfQztfHzaN+r2IQ+Sv6T6q3etRu++dpK7S+xvdD5sW8rqfNlE/uJ/Zd+R6wPp8UfRXUfYdaed9WtbzKdHJ0X7y17Tf29Lxpv3Q2uuZ6+gnn45H/VMK8dw/k1W/7zf4eaTx0TnRG6KXR1m3WA9p758vOzx6XHSa1jevm+Rt+nm12p+bch34cbzadd31r6m64Nxf09QPcO7f49Rvnges/1wPvh89Mcq8Yh7SzteLLaPjNe/avV+tvT61uz64nk3l13nphy0Led1P49UP7meuA9zf8B1GvrP4wyjXCdr5/sffbdyqcN1puo+qvT7B1X5Hs/Y7k653C9XjePBbKZ7XG9Z/zjPn56Qo72/lvbBHqL2vG5zXHaN+f6zfp9t0HWrpOPlL7xuuHbfEaXrfb+37cN1vOxbyul93Un95HnRFOe+c11OiZ0T5dxPtfH/FOJgQ3T06Vv5q79M43vTvudpx6zrGyqfjUf+EQjz3z+6q3/+O5Oevfx/9Q5Trw3jx/Fz2qdHTdN1o9+e7zeHj1AJHnKbrqus4XH7hXPdpqs/jkvsj7mtuj94VvTs6Qe18PzUzemb0rKh/7q3p59ngau/f7G955Xc86ptZiOf6z1R9LR0n/1mq3+sz4511ne/t8r3ZmdFfRBn3tPf67+/08h3aPTU/aq8n7c7L2u8l135f2HVPUD1wMxW39J1eOOLuKc7nh/tQ7jOviv4yelaU+x/ul2jv+9cjogdE946W7qtqn1/U3jfX3s+5ri3lF879sLfqg6Pf/gM47p0GeJydm3n4V1Wdx/npFxcUxRCXXMKp0WoKy8wlJzcsBTU1FUJtcR1FEFk0QNkEbQKRtHLJSRABwSkBhdS0FETtmSZMc2lqMjPNtaKpCdz7w/eL5+HVnOeeO/zzevje9/2cz/tz7z3n3HPPb0a3d/6d2HmHZ4ZBt2vC67ttePzUcLP8vkk4LJwWXhpeEn45vFDn7ZN4nwmPCY8KDwkPVn60RzyO7yPdNOndHjrikGepXfs5RPmis/+j5M/5oT9G+W2a37urXeJODceHY6V3fkeHh4WHKh/iE+dQXYe2dSAO+ZXa5Th+nKfbtY52fV+OC6eEV4SzwsvDSTqvf+IdGX4uHBIOCgcoP9ojHsf7SzdFereHzvkNUPuOh7/PFeLZ9yD5Quc6DVEdfF9ODqeHX1OcKdIPTJwTwpMU33kTnzgcHyjddOndTtt64YO4ztc6x0PXI79zfw4Pua5cj7nh7eFt4ZXhBYqzr+5DruewcEJ4cXhyeJDyJx/ic3xf6SZJ7/bREYe8S+3W3t+uz7CCzvU6Wf7Ruc4TVLeOjhP3YtV18/zO80D/RH9+bXhdeFV4WUg/xvkeJ04LTw9PCY9Vf17bP7Ydn4hDvqV27fe0QjziUAf76eg4dbN/dK7v6aqbx4Np4YxwfniT4uGH8xiPmS+NCIervbbjO7oZ0ru9tnW2vxGFePZ9mnyhc52Gqw5+DugH6RevDueEN4bzQsYZznf/+aVwaHhueN7/c/yq7bfROc8hah8dPonr/NHNkd7+0N0ovf1bR57nSefngP4UP5x3c7gwpJ/kPM8XaGdkOKrQj9bOO2r7+drrYR/DlKfj4X9kIZ7rM0r+XWeeK56bW8JF4b+F9F+c5+dwTDg6PEvjQm1/2Pa5Jw55ltrlOL6cp9ulDmMK7bpOo1UHzz/p73hf/Ul4dzhfer/3XhNeqn6NfIhLO6X35tp+13leU4jn/EcoT3T2e6l8+b6kv1gcLg+XhdznPBecR38yLpwUTtRz4OemqX9Ct1h6t9f2ebWfkcoXHf5p3/6sI+5E6Vxn7neuH9dnVbgi5H7nPI+vXM8rwhl6HsivaZxu+xzW3n/2MUZ5Oh7+ryjEc31myL+ff64v1+WB8P5wofS+D2aFMwvjQ1O/3/Z+c16j1L7j4WdWIZ79zpQv35f0q1wv6rwyvCf8d53nfpjrcnl4WXhBy/68o+O0S5zR0tXeb8TBTyk/juPfftyudbTreTDzDq4z1+fx8NfhL0LeNznf8xWu6+xwUTgvnKB8a+c/te/Dtfet/UxQno5HPWYX4rlei1SHjo7T/jzVyc8Bzxf9+n3hg+F/hjxfnOd+f3r4tfBqPX+140fb5558iet80D0ovfNFZ7+z5Mfx0F+teFvkd56HmSHrMqyn3Bk+H74UvhDeEX5P8QanHa/vXBIuDZeFt4VTwsnyQ17k6fgdHScf4gyWrnYdynW4pKBzHSbLDzrXbYr8o3Pdl6p+HR3nuixTfTs6Tvu3qf5+7uhHV4UPh6vDh0L6Wc7zPOC68NrwSo1Htf02ulXSuz10xCHPUrv2d10hHnHwbz/oXKdrVQePP8y3eD94IvxV+EvFJV/O93vEnPDmcL7at6/a+V7T+0vbetrvnEI8+79OvtC5bjerHh0dJ+581cvPAf3oj8PHwv8KnwzpZzmPfvab4Q3hTeGNhX6bdmjXcWr7d3TkS1zng84+rlae6PBNXPuyjrg3Suc6M89gXCMPzn8qZJ7BeZ5HO++FoechTfPxjo43zX9qx+XaOtvvbPlxPPQLFc/9Df0SzxPPwe/C58Knw5/qfPdnPD9LwsXhLeG3WvaPHR2nfeJcK11t/0AcfJXycz2WFOIRh3rZNzrXdbHq5e+O3wqXhj8P14avhf8T/ne4QHHOSPyLwrnhinBVeE+4IDxf+ZMP8Tl+hnRLpXf76Jzv+Wrf8fA/txDP9Vkhv+j+rl7yj871vUf1QufrsUr19fya/Tr4Jo914Rvhn0LGM8ZJ1iOJd6quF35Whg+Gd2scLK1jNu0nQrdAeueBrnb9tPZ+qJ0vuH5zVAe3S/1XFtr1dblb9UXn6/igrofHO/ptxslnwxfDl0P69fXrwhpHbw1vD5cXxomm8bh2PEFHvsR1PujsY6HyRIdv4tqXdcRdLp3rTH/OvO/18M3wzyH9NOd5XvhA+FD4A/Xj5Nc0v2w7zjjvBwrx7GOJ8kRn3z+QL3Su00Oqg+cVzFO4zlyf/w07Xe/w1fyfdSDO9/yG63pvuDq8P1ykfGvnS7XrVLX3rf0sUp6ORz3uLcRzvVarDh0dp/37VSevvzP/4P7g+v81fEV6z1O4T+4Lv6d8muY5HR2nPeIslq72fiYOPkr52e99iud+g35mTbhx6r1JyHXiunIe/dD3w5+EP9V1LPV/pX4N3Rrp3V7b+w1fxHXe6Oz7Xvmyjrj27zovCXtEv0XYPWR+t1TnjU+8x8LHw4fD0nyR9ojH8fEFHXk9VtDVzlPtZ67yRWf/D8sfOtfrcdXDzz/riZtFv2O4efi89KwzPhr+NvxZ6PXF2vVK5/FoQee8lqp9dPbzW+WNzn5/Jl+uF+uzrJdum/N2CLfv2lDvddynwmfC3yif2nVg2rGuFI88nyrEs49nlC86+/yN/Hj8Z52c70l839k057875HpxH3C+923yXeiR8FldV98vTftAOzretJ5f+32s9n52PR4pxHO9nlUd0Lmej6pO7mcZ/5jPbZfzeoZv5XfGR87z/PDp8MnwR+F9yq9pvEVXOx8lDnmW2rW/pwvxiIN/+0HnOj2pOrjf4PsPzyvPzy7hXdJPThw/18+HU5VP7XcmjtMecSZLV9u/OP+pytPx0D+veNxX6ImHftfw+9K5vRfCaWqfeJw/rVDHWj/OZ5radzz0Lyien8e/hN2i7xXuHG4TdnVteN4PE+8/wl+Evwt/Gf5Y+dEO7ToOOo7TLnF+KB35Etf5oOuSn1J+O6sO9oVuG9XJvl1n5qvMS3uHfcK+YUd19vz2V+Gvw5fC1cqv9v2tdj7t/FarfXT4Iq7zRtdHdbAv62j/Jek8/jO+8R7Me+l7cv4/hluGjHOc730gvM++GP4xfKIwHjbtK+noeNM4XPteb58vFnT2/Yj8oHOdnpB/dK7rH1Uvj0u8d/BesXv4D+Fa6f1+siZ8JVyhfGrX4Wvfg5zXCrXvePhZU4hnv6/Il7/DsH7Muu/7ct5Hw4+EO4Wsl7FeRxyvP/8hfD18LXwuLK3v1X7frl3/rl1XtP8/FOK5Dg/IFzrX7TnVAZ3r/brqh87X4zXV1+MB6/583+mX8/YK3xuu03n+XrQufCP8fbhS+dV+d6r9HuG81xXi2cdK5YnOvn8vX+hcpzdUB48H3Adc5/3Cg8I9Q+bXzNs53/fPRumYNg9fze+l+X3T+nXb+7b2vcK+0L1aaJe64M/tul7EoQ7oXF+OE9fPAesqrId8Ijwk/Bjjvs77u3WYxN8ifDO/L5OP2n1qtes+zo94bxbi4Y98Hc++ibOF6uw6rT/O/Rkd9zHzA+ZvzKc+HH4q/OeQcZ3zva7PPGxtuHXa3SR8Ub6avhOgq53H1M5H7Yd4m6iersfaQjzXC99rpXM9aW/rwvVh3Yz7iOu/b3hEuHe4ra6P91Fy33SlvXeFb+V3r7M17cvs6HjT+l7tc2E/xHurEI96dOk5R+c6Eeddut6uK8e7Cv0U8w++q3885/UPB4bMFzjP3+nfDnumnW1Dzydqv/fXzouc99uFePZBvG1VP/vHz9uK5/oQp2ehzswr2M+yT847LDwy7Kc6e38MLxBbhX3Cdcqvdp9N7XzHeZOH49kH8fqozvaPn27SuT595N915n2G95ADwmO7Nmz3NZ3n95/uif9u5dV2nxK62vet2jrbH/k6nn13ky90rhPHuxfqzLyXee3+4XEhz9EbOs/z5I0Tfyc9Z233/6CrnZfX9hv2R76OZ9/E20l1dp04TlyPn6yLM99lnjogPDzcg+dI46fX05nf9k5724R/yu8/l6+eisvxJ6VrWsdHt5XyLbVbO8/fQ3WwH8ejbvh3PNeVeL0LzwHreB8Kjw4/o3kX8zDOY53vr+H2ib+D5l2epzWtG6IjH/Rur+388Gj5dN7o7Jt4O0jnOnF8+0KdWYfie/yh4QnhgeHuqrO/72+Z+LvSTrhGfmv3CdSujzlv8nA8+yDeZqqffW8mX+hcJ45vWagz66esjx4Tfik8ivFBdfZ6646J/8Fwu/BZ+a1dt639buu8ycPx7IN426l+9r2dfKFznThO+14vZn/J58Mv6P5Yf/9Fz76TPfLD+3Ud2+5fsY48iG9d7f1rH1sqX3T2zfE9Cvcl71G8/wwKTww/TT+i+9LvXX0T/z1hr/AZ+ajdx1H7nuf8iNdLdbE/8nU8++4lX+hcJ473LdyXrOewn+ez4akh6zPovc9n5xz4J63bkE/TPiF0tetKzpP2Hc/5d5xnt//bL8eJ6/kZ+0PoR+gnvhger/zIl/O9r4T+5QPhLmrfvmr3ZzXtZ2lbz9r+0/XAl3Wu087yj8513UX18v3MeMB3vIPD0zVOoPf3wB458GH15+RT+z2xdlxynrTvePZBfj2Un33uKD/uZ9lfQj9F/3Ja+Enqrn7W+9fojz7EdQm9/6NpHxy6pn0vbftZ+yDeptLZ96by5XbRc7xXoc678TyEQ8KzwpOYR6jOL6fBP4fvTfyPhO8L/6K60A7tOg663dQucV6Wbojydz7oPig/pfzOUh3sC91JqpN9+/nfRdfvjPDMkP1E6H0f9Av3DNvuS2p7vzkv4u1ZuH/x00/PGTr73VO+XC++m/G9d2g4LNxP9fL35b1zYJ9wI+VT+3269vud86R9x3P+GylP6xwPncd/vr/wPeTscGJ4jvpz+nfO93ebvcIjwo+pX2+7TwVd7fei2vHHfsnb8ey/h3yhm1iId0QhHnrXydeHdVLep3lfHhF+JTwvPEDXx/tYeM/ePzwu3C/srnyb9sWgq13PrV0fsJ/uytPxqAe+SvGol32j+0ohHnqPg6yvsu/hgvCr4TjiaBz0PoqDEv/4sH+4sfKr3Y9Ru+7rvMnD8exjY+WJ7quFeMdLN051sm/Xme9efK8aHs4Ox4QfVZ39nWzf8JzwwPB1+a3dX1T7Xc75Ee9A6eyPfB1vdkF3TqFd9PbtOrPOzD6RseG88PxwgOrsfSeHhueFnwh7K7/a/Su169/Omzwczz56K0/r8G8/6OYV2kXvfp3v5uwTmR5eGV4fXsr1Vb/u/ScnhCeHZ4bHhF3Kt/a7fe2+F+fZpfYdD7/kXYpHHewH3ZWFeCdLd73q6zr5OWD9n/X9c8Obwkkh+0nWf79Ng3wP+Hg4PBwQbq38avev1H6fcH5bq33Hwx/5Ot5NBd3wQrvo7dt15jsVzyHP27fDWeFg1dnftXge/yUcEu6m/Jq+j6E7XO0SZxvpavuRwfJTyu/bqoN9oZulOtm3+xv2M7AP4eJwTjhT4zbzAs73PohPh0PDwWFp/tC0PxRd7f6L2nmL/ZK3412gOtgPujmFeEOlm6n6uk5+DvieeEo4OVyo547ndf16V+LtHg4MR6n/afv9Eh35oHd7bfuRyfLpvNGdK//2g26h6mX/rjP7SNgnMiVcFE4ID1Odve/kyHB0eHi4lfKr3SdUu8/F+W2l9h0Pf0c2xMO//aBbVIg3ulBnvgOxj298+J3wonCQ6ux9gYeFF4afCvsqv9r9hbXfp5w3eTieffRVnui+U4h3YSEeevt2nVk/4r2C+f6C8HL6H9XZfwfB+8D54aBwb+XX9PcUbde1at+LhspPKb8FqoN9obtcdbJv15l9Uex7Gh3OD78R9ledvY/qk+GI8AthT+VXu4+zdt+W8+up9h0Pf+TrePMLuhGFdtHbt9dveX9g/n+LnhueS/R+zxijfqPt/uK27zO1/cR4+XGe6G6Rf/tyvViPYT1lma7LcaqX120m6r5su9+v7fpQ7f01Wn6cJ7pl8m9ffo5ZT2Q98Lvh1zW+MX6u37+VeKwXfjn8vOYDbfeltl3vrB3XvyufzhvdFPm3H3RfV73s33VmfZ33T94LLwuXhmerzv57DN4bjw0vCvdSfk1/14Gudt2/9v35bPkp5XeZ6mBf6JaqTvbt5595IPO4O0PeT3j/Qe/54iVh6b2oaf9623lp7fvYxfLjPNHdKf/25Xox/jEuLQlZRx2oenmcHB+W1mWb/q6i7Xhcux48XH6cJ7ol8m9ffo753sh3xavC5SHrnay7cp6/T54STgpL67JNf6eIrvZ7aO168FXy6bzRjZV/+0G3XPWyf9eZfV3s27owvCNkffMQ1dn7wA4Op4Sl9dWmv1NEV7vvrHZd1/4OLsS7o6CbIt101cm+vQ7Gvk72bc4Ibw1vCKfio2vD870f9MRwbHh2eHTYdj8zutp9qM5zV7XvePg9sSEedbAfdLcW4o2V7gbV13Vy/3yg/JDPXSHfZdF73zh5Tg33Vz61+85rvyvX1n+EfJTyu0u+7cf3M/to2Lc1MpwbLg7/NWQ/Ded7P9gB4bBwXPjZsJ/yrd1fVrvfxz4OKMSzn37KE93cQrxhhXjUy77RLVZ9XSf36+wbYd/H7eHN4aiQfY6c530mE8KR4d8Az8l5oHicnZt51Fd1ncd5HsAFN0wENREzU9xQ3BUXNMUlBBIhmFwAAUXHJtBQs1wQWUTFMw1qCjUOhqBNNS7UoKIgWCmIW6WkJJZjbmRnJjUtm3Pq/XrOeV72Pffe/Of9yH3fz+fzft/7vd/1d0TnDn/9b59gp79Bh/4tf8OzW9pf7yLehJb2fK4fIN6kQrwjxLu3pX1c4ny9EO/O4MRCPK4TlzjwNwlvo+CA8IYFpwQfIE9wTEv7+7omXq/gwOA1wX7BvVUfecjrOPAGKC9xuhbiUffAQrwx0lOqb6L0Ww+8Bwp54W8a3sbBgeGNCk4Nzg0uCV4cPKul/f3dE3fP4KDg+ODU4DHBPVTvQMXlenfxqA++88JznXsov+Ohd1BFPHywHnhzC/HGi7dE/tontwPeo+HBy4L3BBfreXMf79nOweODXwteqfZBfeQhr+M0fb8vU/2uB9490ud64U2R7pKOxfLJunl/878dhuq94bk/GLy9pT2/p95n3odpwfNVD3HJ4/vh3V7gOV7d9/xB6XGdzgvfOvxenqo6uf+h4OTgaL2XO3b++7qmB/sH91J95CGv48A7VXmJs+M/6PNo6SnVN1n6rQfeQ/LL+u3zYPXX9LdL9b0ZJZ+313iC/niGvtP+3g1WPK5vLx71wHe+pt/ZuuOSpfLBuuBNlU/WjU/wzwjv4eCs4Jkt7Xm75/6ZwWHB3sp/hu7n+u4FHnlnFnhnqq5S3lmFeMMKusfiT/CR4Djp7pP7Tw1eG9xX+cfqfq73EY988B0fnuvZV/nNI67rtO53w9uvNfzg0FbFzf0f8B1JoJ4btecRh7i+r+07VuCV4lEXeR3PdRMHvr8nHybvkeFPDA4LDgpu3dr+vpX0m/mHfsFewe2Cv1R95CMe11eKRz3wnQ/e1qqzlNf6qNfxrHs76Wobf8unXvLBPv8pOo4O/6zgmcEDgtvK58eiY9P8wx7B3sE/5/qvpJd8xOP6Y+JRD3zng7et6izltR54vRXPPqDLee1Tb/ngcdufo+Ow8M8InhPs1tqe/+P80THxdg/2Da6TPuITh+s/Fo/88J0HnusiXl/xrIc6Hc96+0qX/Xo/9e0U/rnBC4Iny6/l+eO3wf0T95BgN9VDXPL4fnhcJx9xlovnOsnveK6/m+qEZ71c37/g13uMM8I/OzgqeLj8WkZ/k3j7BPekDtVDfOJwfZn0kR++87SNt1RXJ+dXPPRQp+NZ757S5fWETuFtpfec9/O84Njgga3t738yul4Iun0cGOwT/Eg+kZc6HA9eJ+UnzpPidZMe19W0XVs3efuIZ5/6SL/zwuc6ed0vfZD357jwTw9+hfYV/JT6pRWpc8v8w27Bo4N/yvU35Qv5iMf1FeJRD3zng/cp1VnKaz3wjlY8+4Au57VPR8sHt4OW8AYHxwS/Gjwt+PngDmoHTzDvSvy9g8cFdwp+Mvgb6W9RXK4/IR71wXdeeDuo3lJe66Vux7P+T0oXPPu1k3xoW0eVv8fJN7eDVvIGTwxeEvxysL/awarofTX4iVw4Nnh4sIvqIw95HQdeq/ISZ5V4J6p+1wPPOrqoTsdDP3ocz/4cLv32+Y9pzyeEPzl4WbBf8CD5/Gj0bJ1/6B88Ptg5+Bf5Qj7icf1R8agHvvPBO0h1lvJaT2fV67z4gC7ntU/Hywd/b7qE94ngkODo4CT19/T/3P9c9LwY3CF59goeoX7f4wTyUofjweui/MR5Trwh0uO6mo5j7Ae6HM9+HSEf2tarCnnhexz5l7xnR4V/YfBL9O8aR/40f2ySeEcGDw2+L7+ITxyu/1Q88sN3Hniui3iHimc91Ol41nuodPm78VHqY17JfPBS9df039z3k9Tpeehn1V+7fycPeR0H3kcaPxHnJ+LVnRfXHX9Y927S5bzwud674POW4R0SPD84gecU3EY+Px89LfmHg4IHBFuDL8mXLRWP68+LRz3wnQ/eNqqzlNf6qNfxrLtVuuDZpwPkg33uEB7rTKwjXaG6DpHPj0eH16VOUj7r6KB4XH9cvlAPfOdr6l/d9TTrP6nAsz8HSb+/s5vQXwbHBb/Gd1rf2Wfyx1aJt29wQPA9+bWJ4nD9GfHID9954Lku4g0Qz3qo0/Gsd4B02a+OfCeCVwdZVzpMfq3OH1sk3inB0vpUR8Xh+mr5RX74ztN0Xcx6qNPxrHd36XI73hT/g18Mjg8yD2EexH3PRs8fg5/Jhf00T/E8iTzkdRx4myovcZ4V74uq3/U0nceNlw/WZZ7j7VfwubO+w3xnr1Q7OF4+r4kef7dPVjtwuyEPeR0HXmflJc4a+Vy3H6nbrq17X+lyXvgnK6/nDduFt2OQdUPW+2YGLw4e29r+/lei+3/QnzysEw4NHhPcXPWSlzo+Fk91kp84r4h3uPS4rqbrpNa9ufQ4Hn4NLcSzn8fIJ7eDjeEF/yU4Nch+Cfsr3Pd0dG+WfzgsOChY2n/ZWPG4/rR8ph74ztd038f6qNfxrHsP6YJnnwbJB7eDHuGxHsV6003B6xinBHdRO1gf/V7HGhUcHtwm+Jb87KG4XF8vHvXBd154u6jeUl7r2kb1Nl2vs2+jCjz7Olx+uR1sHx7zUeaR04Ps67BfxH2/jl7PXz8fLO0nba94XP+1eNQD3/ma7mPVnXdb9/7S5XjwuX5owefNw2N/gv2HGUHOG+wnn3+eOr2fcWqwdH5hc8Xj+s/Fox74zgev7rmJuvsw1r2jdDleG3+j9vE87t4svK8HLw9yzoDzC/B/lj9OSLwTg6VzDZspDtd/1vnv86jjhAKv7nkK6+ineuFZN9fJ7+9zz/D2DjJfYp5zrfqPtv4p978WPe8GPc86Tf2D+x3yUofjweup/MR5Tbx9pMd1NZ0f1u0/7dNh0u+88LlOXn83ttA4ifHNrCDrf6wXct8vosfjqmHB0nriForH9V/IP+qB73xN1zHrjget+0jpcjz4wxTPPncNj/0c9mGuD/5z8HPyeW10e//nC8GDg9uqPvKQ13HgdVVe4qzV86i7H2Ud26pOeNZ9sHQ5L/wvKK993pV+Nci+7zXBacFT5POG6PV+8+DgkGAP1Uce8joOvF2VlzgbxKu7/20dPVSn46EfPY5nf4ZIv33eWc+Z53hRcDjPVT6/ET1+L44K7gxR9e2seFx/Q/5RD3zng3ew6izlrfs+D5d+63E88w4u+Nw9PMb5jLtvCbLvNUQ+vxzdnheMCZb20chDXseB1115ifOynkfdeUrdfT7r3ku6nBf+GOW1z73UnmgH3wyyr3uCfH49et3+zg6W9ol7KR7XX5d/1APf+eDV3Z+u+92w7v7S5Xjwz1Y8jwf7hsd5P87z3Rq8Ocj6LuvB3P9h9Puc4Njg6GBp3biv4nL9Q/lOffCdt+l6dd1zjvZjbIFnn06Rfnj2dbT88vyGcxCcX7gtyPkRzpvA93mJccHSOZR+isP1zuLVPZdR9/yLdRyrep0X/jjl/djvXcMbGBwRvCo4JThS342u+aN7cJfg54IDg59WfeQhr+PAG6C8xOkq3gjV73rgXSV9rhfeSOku6bA/AxXP7yXzeObpNwRnB/kdBXzP90cERwb9u42q32M0XVdwXT2V3/HQM6IQz3pHStfHfn8aHvN55ut3Bv89yD5tWz+YPzz/nxg8L3iS6qv6nUXT/eO66xHWNbHAs96TpAee/TlP+v1esm7K+cW5wUVB1kvh+xzk+OCFwVGqp+45yrrrt65zfCGe6x+lOuFZ74XS5feScy7sA7DO/93gXUHOwXCff0/CvsDk4EVBn6up+l0KvKrzN033Mazjs6rT8dA/uRDP/lwk/R5nsV/L/u2c4Lzgt/Ue8F5wv/d5zwqeE5yg5+z3p2rfGF7V+V94c6THdTV9v+fJF+uDZ5/GS7/jwZ+geG4Hp+v94Ln+MMh8nPk79/n8GO/BVcHS/L7qHDy8uufV6q4r1G0H1j1YuhwP/lWKZ585H8I4mXHwf/J9D54jn32ehHHzxUH/XoP6qn7XBa/q/Aq8qt+JwLOeA1Vv03mDfbpYPPvMPjrnajln+/3g/cGZ8tm/S+Ic7qXBK4JDVV/V75vg1d3frzoXbB66Li3wrHeo9MCzP1dIv8cbrHuwrrFU9VAffK+PzFB81133HHXddZi6flnPjEI8671UutwPsr9Hu+B9Xh5cHGR8zXic+/37LdrBdcErg6Vxe93fg1XtQzZt53XnFdY/QrqcF9+uK+S1r1fKLz8f1kNZ3/9WcGHw9uCNjHv0fLxvcG5wUvD84D8Fj1K9VeuxTfcrLlK9pbzWe24h3o3ywXrg2bdJ8gPe7QXe+YXnw7k0zvEyf2J+tDL4EM9bz8fnqz3vmh2cHvS5uKrz2vCqzs/BqzqX3HS+aN0nS4/j4dfsQjz7OV0+ud8dp/zc90CQfWD2hbnP5xDJc03Q+8bUV3VOGV7dc49V+9VNfbbu06TL8eBfo3j2mfM6nMd5NLgiyDrrBfLZ53uuD94QLK3vVv3eHV7d80R115Wt7/pCPOseK13w7NMN8sE+c+6J/Xf2159UXdPls3+XxH78LcpnHVW/b4JXdR4LXt3zA3V9tv5bCvHsz/XSb585R0I7oR2sCrLeMFU++9wJ7eamYGn9oupcJ7y651zqrpvU/R5Y92Tpcjz4Nyme+0/OL7DvwL7C94I/0jiAcQH3+3e67EdcEpyift7jh6rf/cKrOmfRdB+l7vjGflxSiGefzpV+ePZ1ivzy82Ef4l+D84N3B+8IfoN4ej7sV5wevCD4leCXgmcEB6reqn0QeNQH33nhTVG9pbzzpdv1w/uGfLAeeHfLP/sA7w75a5/8neKcFfNo5slP6bvId5L7fD6fefWt+i76O1p1zh9e1fmvpusAdb/z1n9rIZ79uUX67TP7/Ozjv6B2STu9TD77XMB8tTfvn1Jf1e/k4dU9h1C1b+t46JtfiFf3u2SfLpEP+OR9PObHDwbZ12vbl82NzJ+nBb1/WLUv2HSe73pGKr/jwZ+meNbNueHVQfbZLpduzhHfHCzt51WdQy7lvbnAq7uP6Ponql73L6xns179cnCt3kPeS87TcL/Xwe8K3qH3zOduqLfqXF/T9feq8z5N25l9uauQ137Nlw/w7O8d8q1LeHz/OCfGPif7mMuCLwZfCrL+yHolcfw7GPZBZwUXBO8MltY3q35fA6/qfBu8uvu4dddf7c+sQjz7NUP64dnnBfINnp/DnfLV/Rn7F8xPmX+uD7JOybom9/l8FPPVu4Oldc+qc1Z191Wazq/rrsta93XS5bzw71Ze+8y+54LgfcElwf8Ofls+sy/65eDlwanBq4NN91nhUQ9854Pn+iYoP7z7pNN1w1siH6zLPPJfLZ59Zt7DvOaR4MPBHwQXymfPk64Nzgx+NThJ9dVdT647L1uoOkt5fyBdrtN58eHaQl77NFM+2Oe5eh94Pk/ou7dIPvtcAM9zjr5n/k7WPV9Qdc6m6ftc9ztu/XMK8ezPLOm3z6yHM45iXNWxY3jBlfLZ57EYd60OPhWcrfqqznU1XaevGgfCs47ZqtPx0L+6EM/+PCX9Hn9yXoJ1LdateuT+XYKMmxiPcb/PGbHetT74VrA0bqs6twSv6lxH03W6uuNK+7G+EM8+3SX98OzrW/LL7YD2RX/weHBN8Gm1P+5zf/FvwW8Gb1P7q9vvNG33j6t+1wNvjfS5XnjWO0d6HA/+bYpnn/n+0x88G/xl8JngY/LZ/cW84HeCc4M3Nux34D2svMSZWYhH3fMK8R6TnlJ91j1XuuDZp+/IB39vWAdhnsY87A3Vjx76ce73+gnzt/uUt9TfV63/1l23+UfHGVXPxz7Mk76m8137e594bges2zAPYJzfLd+rrkHWdbjP5ziYF6wLrg02XSeCV3VuBJ7rm6b8Tec71r+uwLM/a6Xf6wqcT2L+y7y1NffvFvwM/Xius75LHJ9vYt67KvhO8HfB0npw1TkzeFXnq5quQ9ddB7APt0qX4+HjqkI8+/yOfIPn5/A7+er2w/iW/on+51fBt4Ivqv14PEx/tSi4OLhA9VWNq5uuo9TtX61rUYFnvQukB579WSz99pn+/fnga8Hfqq6n5TP9/38E/yt4j/I1HU/Aox74ztfUv9ek03XDs+5F0mUeca3f/TX72ZyHaZtvpT3sGmRcy3i5bX07cX1OiXnJhmBpXF11Dgde1b47vKrzU03nZXXnB/ZrQyGe/Vwvn9wOGJ8x/no9+GbwleBzagcez90bvD/43eC3VN8zisf1ueLVHT8+pzpLea3v3kK8V6TfeuDZp/vlg/trzs2wX0o/RL/w6SDjAMYNrJcSx+du3I+9rXGD11epv+rcFLyqcz9113XhVe0bN+2v646v7O86+eW88N9WXrcfxtmMj98Lvqv3jfeP+zwuXxZ8RO9R0/lS03lA3XZhPfeqXufFh2WFvPbpEflgn9eF95vgO8E/BH8ffFU+L8wf3wsuCT4cfCD4fdVHHvI6Drx1ykucheK9o/pdD7xXpadU3x/kg3XB+718sm77TP9PP/928P3g/2mcxX0eL/wwuDy4NOhxW91xR9X4Dt7bqt/1wLOOxarT8dC/vBDP/iyVfvtMO+L9/zD4QXCD+hfuc7tbGVwR/JH64br9VdN2/qbqLOXdIF2u03nxYWUhr31aIR/s84t6zjyfrfJ9Zx73knz2PIPn+UKwNC+s2kduOq+pOx+t+z5b/wsFnv1ZJf32mXbyv8GW3Ncp2Dn4vnymHT0UfCL4ZHCN2hH1kYe8jtO0/VIvcV0PPOtYrjrhoZu41mUecdeI9/9wSEIJeJydm2eUVdUdxRGc0RlkXmw0iUuxIoooAhaULghIVSEaEWwRAaMGkN57R0zggyGiLgt1GHrvimsJMcYlNhCVJC5jiiYxCij5wN6z1v3JyT33+WVfuPvs/97/e095j2dRhRP/nSb8oOIJPCSsXekEXi08W/hf3f+iYnL8i4UncJHwS+F3wgPC7cJVwlMrJOvaB/XM+wD1rfMiePZvXfoyzzrOFfLH/NuRyzz26wD6QH/mfwd/p4unP1Y4orpHhVU0rkR4mvBYxeS4XbrYLdwvfE/4B+Fr8Oc6rksd83zfda2zK6Bn3/sDetZxnpC/05Cfecxjn95DH9jn71T/B2GRxp0lLBYeR5936mKP8I/Cj4TvCN+AP9dxXeqY5/uua52d4NmvdenHPOs4T8ifc1uXucwrRp+Yu0g8rxffYN55vtQQVhf6+R3FerMN64nn2WfCT/Gc+Z65rn1Qz7xvMO+ssw282PUhdh4w/37kYl337bNAXfb1U/SL8+Df8vmtsEDjqgrPFOYqJcdt0cUO4e+Fh4QfCt+HP9dxXeqY5/uua50t4NmvdemHPOc6FOAx7/vIYx778yHycx6cKt4ZwguEFwprwp/9evw+6b4r/EL4V+Fh1GeuU6Hr+/vAsz/zWTdrPy9Abvo3j/kPIZd57Ndh9IE812e/OA88/zxvLhNeLjwP+4vHcb5+Jfxa+Cfsw7H7Vdb1oQQ+Q3WZ76uA3nnIzzzmsU9fow/s85l4zn6O9YWNhNegz5xffu5HTNBEOZpxnpp3TYBHvdj3lLmOBHjM7RxHwGNfjiI3+3yueD8V1hVeJ7xSeD76/LEu/iL8j/AH4TfCz+HPdVyXOuadi7rW+Ri8uvBPP+adjzwhf9ehD8xl3pXoE3N7PS4Q+jl7vaknbIDnbz7Xq2+F3+N9zrrexb5v9eCXPsxrgDz0SR7rmsd9sCL2V883v9ethNcKL8U++CbOFZynJSIe05//Cb+uax/UM68i6lvnTfBizwux6wtzu+6xgJ77VRJY/9jPY+gT32fvDz5HNhbegH3DfJ4vT5FgJeFX8JN2Ps26T9Gn61OP/q1nn+Yxr++fElhnfS735/vrhR3gyz49jt8XVJR+VdRjjtjPAbHfT8T2j/nsl3rMfQpymcc++b51uW5chufSXNhMeKOwDs4jHs/nXVlYbF/Cf+H8FnvOyfqeXQ6/obp1kI8+Wdd9qYx5aN6N6Bvzm8f+FqNvnAde/70fNBW2ELbEOcfjfrRfSP8MYRU/QPhL23eynq+awj/9mMccFeDTvBboA3ORZ90q4LHPDcVrImwjbC9sK7wZfT6ui0Lpnik8V3iW9wP4cx3XpY55DVHXOsfR5zbwTz/m3Yw8IX/t0QfmMq8t+sTc7PM1eM5+Pp2EnbH/ehzP5X6eNYQ1hSXwl3a+z7rvx76nzFUjwGPeEuQxj/2pifw8b3h98Xpzu7CjsDXOG1yHqgmrC3MZ1zHzmqGedYoDevZZLaDXGjlC/pi3OnJxH/S+6n2zh/Bn8GWf3hc8nvtxbeFFqBvaP9LOR1nPAbH7Vmzf2ZfagbrsVzX0wTz29yL0je9zJfHGCMcKL/Y6gfd5r+Ztewl1EP5df/8W5nUl6Pj+3gDPPqxPXiH8heoyh3kd0C/m9n3X5zrr/a+dsIuwO9Ylr1Me5/3xHOF5wgux3oT25dB+a579mM96WdfPLshJ3+Yxdw3kop75F0KP7+VPXNfvsXCScDLeyw/U6IPCvwm7SLgr/FjXdTjevMkBHvUugl/6IM857I885nQ987nOel3wvL9P2Et4t3Wwfns815M6wiuEFwtrYf+K3ReyrmMd4TdUtyvy0Sfrui91AnXvRt+Y3zz29wr0jeuG54ff/97CB4UP4BzicZxPdYX1hFflea7JOn/prybqU8/56gb0mL8e8pnH/lyF/Oyz15m7hD2F98NXd/TZ69AFwsuFV8IXc7iO61Indv0zryf800/WPt+PPjAXedQzr1g897sa9lfvn78Wjhf6exN/H+Pfl1jnEz0A7s/3CTsK+f0Nfy9TDfq+/wl49ms+65uX9juYrOeM2O+j2LeK6APrut/uF+vyeXREf7mP+HtXf27yfPf8GyicIhyHfYTf13KdaCrsJrwdftO+/zVvXIBHvdjPgbHrG/vQNMBjn7ohv3ns4+3oD5+Pzw+XCC9FH6zzG5wzPN7njH/g3xvYv144b9iv69oH9bKecy5FHvrK+u8Mse8F+9Qr8D6yj13QHz4fz1vPt2nCp4SPCv05rQOeD+f7ncLmwuuEoc+Jad9TZ11nYj+fMldt+DWPfbgO+cxj35qjH8xh/p3I4b76c0IP1O/n9VPoc6L5zNEI57ysn7+z9iv23MocdeCXdc1vhLo8T90H/mPC/sKHPH9wnmL964WNhVcLr4C/tHN11ry94DNU9yHkok/WdR+uD9RlnxqjD+yzz10+h/UR9hX+Uvgg+sxzWgNhQ+ENOC/HnveyntP7wD/9mMcc9eDTvL7oA3ORZ90bwOP6/ADqe9wg4WjhROzzHs/PH67XTNhO2Dmw36d9nsl6zojtJ3M2C/CYuynymMd+tUMfzGM/O6NPXJ/9PAcIB8O3c5jv53yLsAV8hN6r0PtinuubzzpZ+zoYueiXPOq1CPTL64vXm6HCIcLH0S+uQ62ELYU3ZlzHzOuPetZpHNCzz1YBvceRI+SPeVsiF+e/9z+fK6YLJ8CXfXq993ieV+4SdkLd0L6Qtv9mPSdl3Y/S+s6+3BWoy361Qh/MY387oW/cB/3eex6MEk4VzsC643GcJ7cJ7xB2x7oTO9+yrnej4J9+zJuKfPRrHvO2Qx7qmd8depwHQ/D8/HzmCp8RzhQOwzzgPPNzvVfYU9hD2DrjvDVvCOpbpyV4se/jMOQK+WM/7g3ozUS/mNs89rUn+sV5MBrPc57wOeEC7Ksex/ejt/BR4SOB/Txtn876PtJfZ9SnnvP1Dugx/6PIZx778wjys8+eN08LnxX+Fr5moM+eVz8XPiz8BXxlnafm2Y/5rJe1f88iJ32bx9y9kYs86zI/+zwQ74Ofz2vC14VT0GeeP/08ZwvnCLvBX+w5NvZ7utj3mTm6wSf1nH92QI/9mYP8Xo99vvO65X33d8LnsZ6Zz/24j7Af1qfY/Tzr+kmffQJ69H8vfJrHvP2Qi++lzzv+/mijcBN82afH8fuoCcKJqMccsd9rxZ7D6HtCQC+2z8zdB7nMY58mog/s81w8lxeELwrnY3/0OD7n/sLHhPfjvBG732Z9r56Bz1Dd+chFn6zrPvQP1GWfHkMf2Gev216fXxUuEi7GPlr+/RPW718JBwgHYh/Nul/E7t+vwj/9mMccj8KneYvQB+Yiz7oDwWOfF4r3knC5cI2wVPgy+txXeo8LhwhHC4cKn4A/13Fd6pi3EHWt0xe85fBPP+a9jDwhf2vQB+YyrxR9Ym72eQGes5/PSuFu7KMex3Ofn+cI4Szso7Hnx6z7d+x7ylwjAjzmnoVc5rEvs5GbffY6s0S4VrhKuBTrkMd5HRokHCMcKXwK63XsukaefQ0K8F6Ez1Bd5hsD/+YtRX7mMY99Gok+sM/eV71vbkY+530efeY+PAm+Q/tH2nko676fdd9Ke27MPwj56M/8SfDHPns9LxOuFq7DPFuMPnu9Hy4cJRyLeRbaZ0L7h3n2Yz7rZV0PViMnfZvH3COQi3rmj4WeoPzzg38/u164Qejfnfh3Kub7d7XjhOOFod+vpP0+lzz7GBfgxf5uhjnug1/zmHs88rFf46HrcT5PT0O/+Hsd64fO+Wn/Hm5e2u+Csn6+iO0X804Az/OQ67Xn/Ras3+Xfz2LdmIx1OOv6H7su0c8Y1Kee+ZOhx9yroOtxW5Gb+411p2Tcp1jXdawzMs/c9D0FPOb2+rNTuAvrUfn37Bo/Qzgzz/XMPNczn/rm0c9Y1Kee+TOhx9wroetxu5Gb67Z1Z6F+7Hofe56MzU3fs8DjeujfYfn7Mn/PtUfo31+Zz9/H+fuwp4W94Cft93Xmxf4eLPb7PfrvBZ/UM/9p6LFfk6DrcW94XUG/+Hs1688V8v9jSPv/DsxL+12cefTVFfWz9ot554LHfnXVxRDhFuFW4dSCJL+W/qGspXB37gRO0Z/vKEr6ob7H1QLPdcyvFdCjT9dvCR79W2cKeMw7Bbm4DvUTbzN82Jd5jaSzK/f/fXqcdRsVnZzHutZtlGd/6N886/I9uUkXE4Sb4Kcf3pMC1esk3Al9+vZ41/F48ujD+gV59ot57LMTeMxrvZ2BfnXQxWjhjFxSZwL6VVX12gl3QJ9+qO9xVQP5zK+K52Iefbp+uzz7xbw7oct5NVy86bnkePsy71bV2Z7i0+Ose2vRyXmsa91b8+wP/e+ALt+T1roYJJyWS+oMx3uSU71mwm0pvqnvcblAH8z3ferRp+s3y7OvzLsduuxXK10M8PqeS+oMQr9KVO8W4dYU39T3uJJAH8wvwXMxjz5d/5Y8+8q826DLfnXSxUPe33JJnQHoVw3Vu1q4JcU39T2uRqAP5tfAczGPPl3/6jz7yrxboct16B7pTva5Jpf0Zd4lqrM5xafHWfeSopPzWNe6l+TZH/rfAl2+J3foYoxwUi6pcw/ek/NVr71wU4pvj3cdjyePPqx/fp79Yh77bA8e824Gn/1qZl3hxFxSZwz6Vax6XYQbU/x4vOsUF52cRx/WL863D8hjn13AY95N4HNe9fW5J4fxmFcNVWdDSn2Ps27DopPzWNe6DfPMTf8boRvKPVE4PpfUYe7OwvXQDemZzzyxuenLdTuDR98bwOf8aG5d4bhcUmci5kdl1esoXJfih/oeVzmQz/zK6HN5Pvh0/Y559ot510OX78nD0h2bw3jMj/qqszbFp8dZt37RyXmsa936efaH/tdBl+9JR6/jXvdzSZ2H8Z5UV72uwjUpvj3edTyePPqwfvU8+8U89tkVPOZdCz771UQXT/jzn/cb71/oV6Hq3SRcneKH+h5XGMhnfiGei3n06fo35dkv5l0DXc4r1x8hHJVL6pR/r6A6bYSroBvSa4P+Zs1NX67bBjz6Xg0+35MGumgrHJlL6ozAe/K9/oH4LNVdmeKH+h5nHeYz3/epR5+uf1ae/WLeVdBlv67VxTA/31xSpy36dUw5WqtuWYpvj3edY6efnEcf1j+Gvsb2i3nsszX7irwrwee86izd4X6fcsl65tVUnRUp9T3Ouh5HHutat2aeuem/DLp8T27TRX8/p1xSpzPek7NVr7GwNMW3x7uOx5NHH9Y/O89+MY99NmZfkXcF+OxXQ108KRzq9ySXrGv+cb3nTVR3eYofj3cdjyePPqx/HPMqtg/MY59NwGPeUvDZr3a66CEckkvqPIl+naN6tYXLUvxQ3+POCeQz3/epR5+uXzvPfjHvcuiyX7P19+/qL44Itwnn5JL8yar3nHCXcKrwNez31reO708uOjnPPqxPHn1Zbyp4zDEVfs1j7l3Ix37NUr19+osfCpI6s9GvSdKZL9wDfeaz/mz0aVKAZx/zA7zYvjLPHvg2j3mfQy7uczNV//2CZJ1ZeE8mavwLqMs81vN4358Y4LnuCwFebB/pfz788j3ZqIvXhQcLkjoz8Z5MkM4c4SvQp++N0PH9CQGefcwJ8GL7xTyvwLd5zPsCcrFfG3SxV1ipMFnPOcwfL515wr3wwXwboOP74wM8+5gX4MX2lTnmwK95zL0X+div9bo4KqzicQXJHOaPk85u4X7oM9966Pj+uADPPnYHeLF9ZY558Gsec+9HPvZrnS52eD8uTOqsR7/GSme68CD0mW8ddHx/bIBnH9MDvNi+Ms9B+DaPeXcjF9ftteJ9Dr/2X/79i8aXoS7zrMV43x8T4LluWYAX20f6nw6/zL1GvM/gYy1yj9b4pdCjzzUY7/ujAzzXXRrgxfaH/svgl/NjtS7eEH4LP/Zn/ijpzBXugD59r4aO748K8OxjboAX2y/m2QHf5jHvUuRiv1bpYr/w9MJkvdXo10jpLBS+DR/Mtwo6vj8ywLOPhQFebF+ZYy78msfcbyMf+7VSF58Kz/C6XZDMYf4I6SwRvgt95lsJHd8fEeDZx5IAL7avzLEQfs1j7neRj+tQmfh/hl/7L//+ReNLocc8ZRjv+8MDPNctDfBi+0j/S+CX78kKXWx3zsKkThnek2HSmSbcB336XgEd3x8W4NnHtAAvtl/Msw++zWPeUuRiv0p18Y6wsDBZbwX6NVQ6C4RvwQfzlULH94cGePaxIMCL7StzTINf85j7LeTjvFou/kfwa//l36No/EvQY57lGO/7QwI8130pwIvtI/0vgF++J8t0cUhYszCpsxzvyWDpLBIehj59L4OO7w8O8OxjUYAX2y/meAl+zWPuw8jHfi3VxZfCswuTOsvQr6eks0Z4APrMtxQ6vv9UgGcfawK82L4yxyL4NY+5DyDfj/4/KvE/gV/7N2+Qxi+GHvMswXjfHxTgue7iAM86/wOVwWp0eJydnXmwleV9x93uhavYK1i1HScuERAmjopbhYCMVgFTzUzGAi6AUVQiO7jgVtMkjY4TUQL3qsgqsms0CtbUREVto0anqRIdY1xiUqeKcU1rmrh1pn4/Z+Z8vE/O68s/v5f7fJ7v7/v9nfecezgPF37Xtt3///rnjk/rvNSdPi3bvZL134m7LbVXuCxvd1su/jN17/ZmndvbmvmLonNH6qvSv1h+bpMO6xcVOHzcUeDQwV+pr3PcJr9wzv2q8uXLDX5j+CfkF/9wF2Z/t/ScZ6P2s35hgaNvd4GrOkf7v0N+fZ9syMXW1L9ub9bZqPvkgugsS/2t9O17g3RYv6DA4WNZgas6L+foll845/6t8nle63PxZuof5XuD5jU3OvemPiJ951svHdbnFjh83Fvgqs7VOZbJL5xzP6J85N4xdZ184pv1Odpv/+u0j/U5Bc7zMNdqbn5dODXcOalrUy/tbOa+mP0Hp87m9UGc9eC/2NEzRx90zNnXbPmAs2/0ZhdyX5L1/86+91KZM9wPwj0QnZ8U5o4e+1n/QWfPHH0fKHD2M0f94eyf9QcK9+tF+cIazZX1kdk3S48z/bwfbmTh8YAfWdCzj9nq3zscj9+QcKenrpYf+p3d1rzvgwj15/t+Z8/+D5I/92M/enD0g2fdevaNj/6FOaN7UGHOVR8Pz2mW5pDfNr4fzMvX/yP8u6l7ZqC7pXL/cV+z//b8/uYI/zj116nP6z71/U9/dFm/vcDhk37mqj7vnBffN2uensevlRPOc3pA+eE81+c1Lz+PL1Zu5sD6TPn2PNg/T3Od2dEz5/maa/U4+PWX58FZqbfqeQHH8+JLqTN035b04P28qvr8s68Z8gFn3+jBO/dFWf+f8G+nXqw8G/P7B6PzL4W5o3exHr+NnT1z9H2wwNnPTPWHs3/WHyzcr2fy/ji6zI31wdk3XY8z/bwfbnDh8YAfXNCzjxnq7/fFp+ViCu9bO5t16Ad/QHSGpE6Tvn2znz4HFDj7QP+AmvNynmnyDee805XL8xqWi5m8r+1s1pmiee0UnaNTp0rffthPn50KnH2gv1PNOTjPVPmGc95pyuV5HZeLb6auUJ+Zmlef6JyYer707Yf99OlT4OwD/T415+A858s3nPNOVS6/jk4Iv1z69IMbmP3fkJ77sw/dgQXOfdEdWDO3/Z8vv37/e0S4canL5Ad/R+n978cR2i+6U9QH/9vJHzr0RcecfdHnY71Ptr/tCvNzPvzuV/Px8Jy+oTn4/qL/7NSl8gOHn2Gp50m3pDeskKdqbvs6Tz7g7HuKfPp16Bjuw9Ql6kNf+N7ROTx1Veef92N99vUu5IPvXdCzT/ofXnNeznuecnlef5OLy3jfKz/na17bR+/41Fs6/7xv9tNn+46eOftAf/ua83IefB4vznnRg/fzalK4xdKnH9yg9FkpPfdnH7qDOnrm3BfdQTVz2z/cyha5Z6XeJD/OPTR1hXRLevDOUzW3fdF3qDj7Rm9F4fkxIhdX8nzobNahL3yv9BuTulz69sN++vTq6JmzD/R71ZyD8+BzjJ9vyrtCvOf1t7k4he9Tnc06V2peu6bfF1KXtfBjffbtWsgHv6seFzj7pP8Xas7LeZdL1/MamYvxfH/rbNY5RfPqSL/9U5e28M1++nR09MzZB/odNeflPPjcX5zzLhPv1yF0p/L9jT+P6fWFPkekLpFuSe8Izffz5rEv+h4hzr6Xivd9MioX3049l/cp/HlD98lu6XdS6s0t/LCfPrt19MzZB/q71ZyD8+DzJHHOu0S85zU6FxekntPZrPNtzatv+o1IXdzCj/XZ17eQD76vHpfG5xPySf8RNeflvDdL1/P6u1xMTJ3c2axzgea1R/odmHpTC9/WZ98ehTnA76HHBc4+6X9gzbk672Lp+nWI/vNSz+5s1oHDz7GpN0q3pHes5vt5c9sXfY8VZ983ifd9cnQuvpZ6VmezzjzdJzuk396pN7TwY3327VDIB7+D5gxnn/Tfu+a8nPdG6XpeQ3PxndSvdzbrfE3z2jH9Tk7tbuGb/fTZsaNnzj7Q37HmvJwHnyeLc94bxHteJ/P+IvXMzmad72hee6XfYaldLfxYn317FfLB76XHpfF+Tz7pf1jNeTlvt3T9OkT/S1IndTbrwOHnuNRF0i3pHaf5ft7c9kXf48TZd5d43ydjc3FN6vfU5xLdJ/um3ympYzUH+2E/ffbt6JmzD/T3rTkH5xkr33DOix6857UqF9v4Qm4kzsE4X2N5Q36/OXo/Sy2du62SDusbChw+0DdX9bzPefC5WfNy3geVy/O6JRfP8z6kvbnfKt1f6+NrdfRelg/nu0U6rK8vcPhA31zVuToPPldrXs67Wbk8r5W5eDJ1Z/4eQFtzDvh1fD+I3i/kw/lWSof1dQUOH+ibqzpX58HnDZqX865WLr9uz0mfV+UX/3Brw92pvs6DHvtZX1vg6IuuuapztH84dH3+Mzv7P+F+yEI//h5wW7NP9q3J7x+P7s9TX1A/56DfHM1jTYHDF33MVZ2f89wpv3CeA7keF+c5vaA5+P6aFT+PtDX3mS2fq/P7+err3OjN1vxWFzj6omuu6rztHw5dvw7NzP7X84W+7c06+IO/Nb/fFL1fSd++0Z+l/LcWOHygb67qvJxjvvzCOTfrmwrzmpE+b/E+t71ZZ6bmdW50fpT6ivSdD/2ZmtO5HT1z+EDfXNW5Oscm+YVz7leUz/Oanj5v5AsftjXrzNC8zonOPak/lb7zoT9DczqnwOHjngJXda7O81P5hnPeHymXX4empf+/tjX3ma7Ha3L2X6e+zoMe+1mfXODoe12BqzpH+79Hfn2fTI3uY/nCX7Q360zTfXJ2dBamPid9+0YfHdbPLnD4WFjgqs7LOa6TXzjnfk75PK8bc/Fy6kdtzTpTNa+zeH+b+qj0ne9G6bB+VoHDx4YCV3WuzrFQfuGc+1Hl8/PqBp6n8ov/xucv2b9Aes5zg/az/vUCR98FBa7qHO1/g/z6PunOxVOpHe3NOviDPzM6S1K3St++u6XD+pkFDh9LClzVeTnHAvmFc+6tyud5deXiv1J3aW/W6da8JkXnrtRnpO98XdJhfVKBw8ddBa7qXJ1jifzCOfczyufn1aLw78sv/hufw2f/Fuk5zyLtZ31igaPvlgJXdY72f5f8+j5ZmIunU/8gP4t0n0yIztLUh6Rv3wulw/qEAoePpQWu6ryc5yH5hnPeLcrleX0/Fz9P7Wxv7rdQ8zojOotTfykfzvd96bB+RoHDx+ICV3WuzvNL+YZz3qXK5XktyMWLqTvw59225hzwp0dnXeqT8uF8C6TD+ukFDh/rClzVuTrHYvmFc+4nlc+vQ9eHf05+8Q93Wvavkp7zXK/9rJ9W4Oi7qsBVnaP9r5Nf3yfX5eJnqdvz/rGt2R/8qdHpSn1C+vZ9nXRYP7XA4aOrwFWdl/M8Id9wzrtKuTyv+bn4Vepf8Tl4W3MO+PHRWZP6G/lwvvnSYX18gcPHmgJXda7O0SW/cM79G+Xz8+ra8P8mv/iHG5f910vPea7VftbHFTj6Xl/gqs7R/tfIr++TifnzyjP5Qq/2Zp1rdZ8sDL8iek9J377RR4f1hZ09c/hYUeCqzss5rpdfOOdmnf7k9s/F83PJv29rXvfPM9+vflV//vn3Ba6kB3+/9Pw5Ozw/t8nPZR6Q2r+9WY99/vlrfo7zzdS3avqDa/Xz3nD2d7/6w1X9+VTnf7PAeT5vKb+fV/AnpU5MnSQdeHT23PnTemDqoJ17ztfKjzl8oG/OvtCjP5zz4HNPcc47SLk+8/em8oWZqbO0H479R6cO1Zyq9i/1PbrA2c8g9W98Di3/Q+X3M+cS4S5KvSL1H6QDj87I1FGpo2v6MYePkQXOvoaqP5zzjJJvOOcdrVy+T+AXpi7Sfjj2T0idWPDZqn+p74QCZz+j1b/x5y75nyi/zg2/MvUW7Ydj/9TUaTX7l/pOLXD2M1H94ex/mvx+5u8PhFufemfqD6UDj87c1EtTL6vpxxw+5hY4+5qm/nDOc6l8wznvZcrl+wT+x6k/0X449n839aqCz1b9S32/W+Ds5zL1h7P/q+TX72vgH0x9JPVx/rwgPfahd03q/NRFqV01/ZnD1zUFzv6uUn8455sv/3DOv0j54DyfLuX3/QX/i9RntL/xOpj9y1NXFPK06l/qu7zA2U+X+sPZ/wr59f0F/0Lqy6mvpb4uPfahtzZ1Q+rdqZtq+jOHr7UFzv5WqD+c822Qfzjnv1v54DyfTcrv+wv+/dQ/aD8c+7ekPlTI06p/qe+WAmc/m9S/8Tm7/D8kv76/4D9O/SS1V74h9u7VrMc+9B5LfTz1qdSna/ozh6/HCpz9PaT+cM73uPzDOf9Tytf4c77m87Ty+/6C75e6u/bDsf+F1BcLeVr1L/V9ocDZz9PqD2f/L8qv30fB75G6T+q+0oFH5+XU11Jfr+nHHD5eLnD29aL6wznPa/IN57yvK5fvE/iBqQdqf+N1I/vfSX234LNV/1Lfdwqc/byu/nD2/678Ojf8kNTDtB+O/R+kflizf6nvBwXOft5Vfzj7/1B+nRt+eOoI7Ydr7N/l09prl3r9S33RNWc/6NEfzv5ZR9e54UenjtF+OPb3Te2n/FX7l/r2LXD200v94ey/n/w6N/zpqWdoPxz7+6cOqNm/1Ld/gbOffuoPZ/8D5Ne54c9JPVf7G5+zZv/BqYfU7F/qe3CBs58B6g9n/4fIr7//wU9LnZM6Vzrw6ByZ+uXU4TX9mMPHkQXOvg5Rfzjn+bJ8wznvcOXyfQJ/Werl2g/H/uNTTyj4bNW/1Pf4Amc/w9Ufzv5PkF/fJ/D/mPq91GulA4/OV1LHpo6r6cccPr5S4OzrBPWHc56x8g3nvOOUq3QexnnMm4XzMM5p7tW5Q9V//7nqeZh93CvOjzc85x4DUv8oHXifN72d6n9Pu6qfxuttezNfOtdq9e94wznHI/LrvvBvq6/nBc85yJmph0oH3udIg1P/VNMPXNXzKvtC70/Scw7WB0vPuVmnr+cFz3nJ7NQp0oH3udKw1CGaX1U/cFXPr+xrsPrDOccQ+XVf+GHq6+878JyfXKn9cD53GlOzP1zVcy37Gab+1oMfIz3fJ/Ccn3Sl/pN04H2uNCn1qzX9ND631fxL51f2NUb94Zzjq/LrvvCT1NfzguecZVXqYuk0/p5LdDiPmZ46uaYfuKrnXvY1Sf3hnGOy/Lov/HT19fMKnnOXu7S/8X4y+zmXubxmf7iq52H2M139rQd/ufT8uSo85yr3p96berf02OdzqatTv5V6RU1/cFXPwezvcvWHc54r5BfO+b+lfPYHf7X8+f6C59zlCe2H87lWd83+cFXPzeznavW3Hny39Pw6BM+5yrOp/y4deJ9HrUy9qaYfuKrnXvbVrf5wznGT/Lov/Er19X0Cz/nJNu2H8/nU5pr94aqef9nPSvW3Hvxm6fk+ged85H9T35AOvM+VHk69p6YfuKrnV/a1Wf3hnOMe+XVf+IfV1/OC5xykI/Uj6cD7vGlr6qM1/cBVPdeyr4fVH845HpVf94Xfqr6eFzznJX+Z2kc68D5Xein12Zp+4KqeX9nXVvWHc45n5dd94V9SX88LnvOT/VL3lg68z5+2pb5a0w9c1XMu+3pJ/eGc41X5dV/4berr1214zl0GaX/jdSj7OZd5r2Z/uKrnXPazTf2tB/+e9HyfwHPucnjqQdKB93nUR6nv1/QDV/Xcy77eU38453hfft0X/iP19bzgOa85hs+5pQPvc6zeqZ/U9ANX9bzMvtD7RHrOwXpv6Tk3670KnzfDc85zYupx0oH3+dfuqX00v6p+4Kqes9lXb/WHc44+8uu+8Lurr+cFz/nQhNS/l07j7z3o3Gpg6j41/cBVPZ+zr93VH8459pFf94UfqL5+3YbnHOk87W98XqxzrUNr9oereo5nPwPV33rwh0rP9wk850MXpE6RDrzP10akDqnpB67qOZ59Har+cM4xRH7dF36E+npe8JwjXZF6oXTgfd42KvWYmn4+77mefY1QfzjnOEZ+3Rd+lPp6XvCck81P/aZ04H0uNz71xJp+4Kqe/9nXKPWHc44T5dd94cerr88J+X/X+H/V3tE5of8/tvt0PlP1/297p8CV9ODvk54/R4Tn34lkYb/U/dub9djn/z+Of1dyW+obNf3Btfr/6uDs7z71h2v172GaI/+2Auf5vKH8fl7BH5N6euoZ0oFHp3fej/VPHbBzz/la+TGHD/TN2Rd6A/z+UXnw2Vuc8w5QLn9/h5/G5+baD8f+I1OP0pyq9i/1PbLA2c8A9W+cO8j/UfLr+wR+Lp+f8/m4dODRGZ56fOoJNf3A/R/VZMn7eJydnHvMlnUZxzF4EbQEDLOpsFJEdLwGKpmkqRBqtjYVagaIDRFR05rFwU4eYKV2mGAeAuygE0QrMMNKgZetMk0FrLaUg4emQOo4hTbBDlt8P/f2fuC35+72ny/j+VzX93v9+N0P7/Nc6pXdu/zvn2uipx6wR4dFu+2RLl/N65+PfjivjxJHn69EP35A575wvE5f+sDvH65N/M3RW6Oz1QeePqOjY6PjCrlb5TFHjtEFzrlGyR/O84xVbjjPO05z+bzg50d/GP2R+sDTZ3J0SvTyQu5WecyRY3KBc65x8ofzPFOUG87zXq658tt78T+N/kz1cNRPi04v5GzlX/KdVuCc53L5wzn/dOX1PYFfGv119DfqA0+f66I3Rmc2zGOOHNcVOOeaLn84z3OjcsN53pmay+cF/7vo49E/qA88fb4XvTU6u5C7VR5z5PhegXOumfKH8zy3Kjec552tufxcwT8b/ZPqq/eJ1M+Lzi/kbOVf8p1X4JxntvzhnH++8vqewD8XfTW6UX3g6XNPdHF0ScM85shxT4Fzrvnyh/M8i5UbzvMu0Vw+L/gd0X9Ed6oPPH2WRZdHVxRyt8pjjhzLCpxzLZE/nOdZrtxwnneF5vJzBd8tB9m2f+d6OOpXRVcXcrbyL/muKnDOs0L+cM6/Wnl9T+APiPaK9lYfePr8Jfp8dG3DPObI8ZcC51yr5Q/neZ5XbjjPu1Zz+bzg3x89ItrP59alc5+/RTdGNxVyt8pjjhx/K3DOtVb+cJ5no3LDed5NmsvPFfyA6NGqr94vU78lurWQs5V/yXdLgXOeTfKHc/6tyut7An9c9EPRIeoDT5+d0bejuxrmMUeOnQXOubbKH87zvK3ccJ53l+byecGfHB0e/aj6wNNnvwPjG207cN+5W+UxRw76m3Mu+uEP53nIuZ84z9umuXxe8COjo6JnuU+Xzn3eE+0V7a1zq5vHHDneU+D2yiV/OM/TS7nhPG9vzeX3IfgLo59VffW+mvojo0cVcrbyL/keWeCcp7f84Zz/KOX1PYGfEJ0YvUR94OkzKDo42t4wjzlyDCpwznWU/OE8z2DlhvO87ZrL9wT+6ugXVA9H/UeipxRytvIv+X6kwDlPu/zhnP8U5fXc8NOjM1QPR/2Z0REN/Uu+ZxY45zlF/nDOP0J5/XzAfyN6c/QW9YGnzznR0dExDfOYI8c5Bc65RsgfzvOMVu7q+1LNO0Zz+Z5M67VHt+VAtkfXtHXmru65Rx+NPhad23Pf/ajn9avF4Qfv/nBrlKvk6/yPqZ/vCfwHcyBHRt/XvXMfePq8Hn0j+pLOo24eOPzh7QNHH/KVfD3HS8prX/g35Ovzgh8XHR/9pPrA0+fo/Bw1MHrIAc3ywOEPbx8456LfIeI8xyHKa194XsfXzxU8+6CrVF99Xkk9+6KTG/rDfV5/Tu4P5zwD5e9+8Cern+8JPHudr0Wnqg+892RnRU9vmAeu7j7OuU6WvznmcU77mhtVuCfw7HXmqL76uTP17H3G67zq+sPV3b99TblKvs4/Xv08Nzz7mh+rvrr3qWefc4Xmr+sPV3ePNke5Sr7Of4X6+fmAZz/z8+j96gPvPdaM6DU6j7p54Oruy36sfCVfz3GN8toXfoZ8fU/g2c88qvrq563Us7+Z1dAfru4ezXlmyN/94GepX49w3cWzd3ki+ttoh/pR5/3VnOh3ozc3zAdXd1/mfLPkb465nBPO839X8zkf/Bzl8/2CZ6/zZ9VX7y+pZ+9zd0N/uLp7NeeZI3/3g79b/Xy/4NnPbIq+GF2vftR57/VQdFF0QcN81ffG+vMo7dmc7275m2Mu54Tz/Is0n/PBP6R8vl/w7HneVD2c92MdDf3h6u7fnOch+bsffIf6+X7Bs9fpHv1Pfv/f6ked92Brok9Gn2iYD67u3s35OuRvjrmcE87zP6n5nA9+jfL5fsGzD+qjejjv1dY19Ieru7dznjXydz/4dernn6Pg2fP0jx6iPvDek22OvtgwD1zdfZxzrZO/OeZxTvua21S4J/DsgwaqvnofTD37om06r7r+1edb/TmV9nH9lavk6/zb1M9zw7PXGap6OO/Hdmv+uv5wdfdvA5Wr5Ov8u9XPc8OznzlV9XDec3U/sHP/uv5wdfdoQ5Wr5Ov8cG2F7zPh2bucrfrqfU57oD6av64/XN192KnKVfJ1/j7q57nh2bOMVX31vqa9zwDNX9cfru6e62zlKvk6/wD189zw7E8mqR7Oe6fjNX9df7i6e62xylXydf7j1c9//8GzP/li9Er1gfdeaXh0mM6jbh64uvurScpX8vUcw5TXvvDD5et7As+e5VrVw3kPNbKhP1zdPZfzDJe/+8GPVD/fE3j2Qd+OXq8+8N4/fTp6bsM8cHX3XM41Uv7mmMc57WtuTOGerOm6R1+MvhR9tmtnbm76LYo+EJ2n+0QdfecWOPvSd64455knfzjnf0B5PTf8a9HXVQ9H/S+jSxv6l3x/WeCc5wH5wzn/UuX13PA7o2+qHo76FdGOhv4l3xUFznmWyr/6/Kv8HcrrueHfld/o2q1zPRz1T0efaehf8n26wDlPh/zhnP8Z5fXc8AdH36t6OOrXRzc09C/5ri9wzvOM/OGcf4Pyem74ftH+qoejflN0c0P/ku+mAuc8G+Rffe5U/s3Ku9fn3vxiYPQY1Vefe1O/Lbq9oX/Jd1uBc57N8q8+Jyr/duX13PBDoyeoHo763dF3GvqXfHcXOOfZLn84539HeT03/KnR01QPV9Xni8v9ezTzL/nS15zz0A9/OOfndfp6bvizomerHo763tE+mr+uf8m3d4Fznv3lD+f8fZR3r8+9+cUF0dGqh6P+iGi/hv4l3yMKnPP0kT+c8/dTXs8NPyF6serhqB8UPbahf8l3UIFznn7yh3P+Y5XXc8NPiV6uejjqT4ie2NC/5HtCgXOeY+UP5/wnKq/nhp8enaH66n019WdGRzT0L/meWeCc50T5wzn/COX13PA3RW9WPRz1F0RHN/Qv+V5Q4JxnhPzhnH+08npu+Nui31d99Tym/qLohIb+Jd+LCpzzjJY/nPNPUF7PDT8/erfq4aifHL2soX/Jd3KBc54J8odz/suU13PD/zT6M9XDUT8tOr2hf8l3WoFznsvkD+f805XXc8P/Ovob1cNRf2N0ZkP/ku+NBc55pssfzvlnKq+/l4NfEX0q+rT6VP+dfPrcFL09ekfDPObIcVOBc66Z8ofzPLcrN5znvUNz+Z7Ar4uuVz0c9fdFFxRytvIv+d5X4JznDvnDOf8C5Y1U88NvjL4e3Rl9U/2oo9+S6NLoimhHw3zmyLWkwDnfAvnDeb6lyg/n+VdoPjifT4fm3+v7sPxiQB64o9s611f3O/VbolsL87TyL/luKXDO0yF/OOffqry+X/BDokOjE6OXqB919NsV3R0dnH/Pvr1ns3zmyLWrwDkf/dr13w14vt3KDzexwA3uuW8Of/zgfL/gp0YXqB6O+tOjX9R51vWHm6o/T/eHc552+Zujr3P677ln9b39y9F10T917cx7n/Fg9L7ofH2fQr33Iebq7k2ca7784TzHfcprX/gH5evzeknf978RfVV94L0HeSS6uGGe6n225r7FuR6UP5znWKy89oV/RL5+ruDZE7ylejjvTVY29K/+Xqu5l3GeR+TvfvAr1c/3BL7aW0R3qw+89yeror9vmAeu7p7GuVbKH85z/F557Qu/Sr4+L3j2C32jB6kPvPcuL0Sfa5gHru5+x7lWyR/OczynvPaFf0G+fq7g2Uscpno472leaegPV3cP5DwvyN/94F9RP88Nz15ikOrhvKfZ0dAfru4eyHlekb/7we9QPz8f8OwlTowOVh9472v+FX2rYR64unsh59ohfzjP8Zby2hf+X/L1ecGzz/hY9BT1gfeep0e0a49meeDq7pOci35dxXmOrsprX3her/ZEXfbNswc5R/Vw3gsd3NAfru7eyXl6yN/94A9WP98TePYgY6Lnqg+890P9o30b5oGru4dyroPlD+c5+iqvfeH7y9fnBc/+5HPRseoD773ScdEBDfPA1d1fOVd/+cN5jgHKa1/44+Tr5wqevcsVqofzHuqkhv5wdfdcznOc/N0P/iT18z2BZ+9ybfRK9YH3PmpkdFjDPHB1917OdZL84TzHMOW1L/xI+fq84NnX3BK9Tn2qfw80fdjrjIl+omEeuLr7MucaKX84z/EJ5bUv/Bj5+rzg2fPcHr1Vfar3rfRhH3RxdGzDPHB192zONUb+cJ5jrPLaF/5i+fp9CJ790A9VD+d92ZSG/nB193HOc7H83Q9+ivr5nsCzH/p59F71gffebEb0qoZ54Oru55xrivzhPMdVymtf+Bny9XnBs0d6NPqw+lT/P6f0Yd80K/r1hnng6u71nGuG/OE8x9eV177ws+Tr5wqevdIzqofzPu7Ohv5wdfd9zjNL/u4Hf6f6+Z7AszfaEF2jPvDety2Mzm2YB67uXs+57pQ/nOeYq7z2hV8oX58XPPuht6Ivqg+893Aro4sa5oGru+9zroXyh/Mci5TXvvAr5bvX96fh2BsNjB7a1rlP9f1p+rBf2hZ9uWEeuLp7PedaKX84z/Gy8toXfpt8I9X7ETz7oUnRC6Pnqh913scdHz0y2rdns3xwdfd/zke/vgWOuZwT7kKdg+dyPnPkq76fFr9Adbzuvdzx/6cfXN193yTlsa+fq1UJuj66IfpCdLX2EnelwYLowuj90R/o+y7q8bmrwDkH/e8S51w/kH/1/qd5Fip39f6uee/XXD4v+I3RzdG/qw88fZZEfxF9uJC7VR5z5FhS4JzrfvnDeZ5fKDec531Yc/nnIfgd0X+oHo76ZdHlhZyt/Eu+ywqc8zwsfzjnX668vifw7/BGkEb7devcB54+j0f/GH2qYR5z5Hi8wDnXcvnDeZ4/Kjec531Kc/m84NuivaN91AeePquja6PrCrlb5TFHjtUFzrmekj+c51mr3HCed53m8nMFf3j0CNXDUf9qdGMhZyv/ku+rBc551skfzvk3Kq/vCfwHogP4uVB94OnzWnRLdGvDPObI8VqBc66N8ofzPFuUG87zbtVcPi/49uiHokPUB54+/4y+Hd1VyN0qjzly/LPAOddW+cN5nreVG87z7tJcfq7gh0c/qno46rvl59K2HvvO2cq/5Etfc85Dvzb9nO381euFz1fwI6Ifj45yny6d+7w7elC0l86jbh5z5Hh3gdsrl/zhPM9Byg3neXtpLp8X/Kei50XPVx94+hwaPSx6eCF3qzzmyHFogXOuXvKH8zyHKTec5z1cc/m5gh8fvUj1cNQPjB5TyNnKv+Q7sMA5z+Hyh3P+Y5TX9wT+kujk6GXqA0+f9uiQ6NCGecyRo73AOdcx8ofzPEOUG87zDtVcPi/4L0WnRqepDzx9ToueHj2jkLtVHnPkOK3AOddQ+cN5ntOVG87znqG5/FzBfzP6LdXDUX9e9PxCzlb+Jd/zCpzznCF/OOc/X3l9T+C/E50dnaM+8PT5THRcdHzDPObI8ZkC51znyx/O84xTbjjPO15z+bzg74rOjc5TH3j6TIxOil5ayN0qjzlyTCxwzjVe/nCeZ5Jyw3neSzWXnyv4B6IPqh6O+i9HpxZytvIv+X65wDnPpfKHc/6pyut7Ar84+kj0V+oDT59ro9dHb2iYxxw5ri1wzjVV/nCe53rlhvO8N2gunxf8yugT0SfVB54+t0TnRG8r5G6Vxxw5bilwznWD/OE8zxzlhvO8t2kunxf8X6PPRZ9XH3j6/CR6T/TeQu5WecyR4ycFzrlukz+c57lHueE8772ay+9D8NujO1QPR/1j0WWFnK38S76PFTjnuVf+cM6/THl9T+D75Dc+yH6nrXMfePr8FxIDpI94nJ2bedTe07mGQxJTaNVUU48M4pABaQmR0GpNNbNqSEol0ioRlJSWKK1T81xBopEgoVQQNUQRraElmqkkiChNFM1UmqSicspZ67ivb63vYq93v+k/d33vvZ/nvp+997P3+3t/mbtWm///36Lg4uDjwXafQJt/5v8sbdf688cKvC+0/wTnFnid2392vMXiEadT+9Y654rH58RdLF9rhtde/P7B44IDFQc+cbqs/QluF+y29mfrbqTHPHQQ3zzrIh754R1XiLddgUfcbuLhu6344zSOzxl3iupSmw+e43dTXPOI6/xrtGnNnxGhrwffCM5s25o3KgvlzuBdwZvWbM1jHHFHFXivF3h3FuKhq5TX+u9SPPuGvyC4UOPhMf6B4IPyX5sf3gLV2/HhvSFdpbzW/6Di2Tf8ZcHlGg+P8ZODT8h/bX54y1Rvx4e3ULpKea3/CcWzb/ir5Q+rt2s9Hh7j/xScKv+1+eGRD77jwyMOukp5rX+q4tk3/C8EN9B4eIyfG3xN/mvzt5xP7VrzHR/e6tJVymv9rymefcPfMvgljYfH+LeD78h/bX54W6rejg9vA+kq5bX+dxTPvuF3DW6j8fAY/27wPfmvzQ+vq+rt+PC+JF2lvNb/nuLZN/wdg700Hh7jPwyulP/a/PB2VL0dH9420lXKa/0rFc++4fcN9tN4eIxvn/vRGmu1jl+bH15f1dvx4fWSrlJe64fXorfNZ/P3Du6j8fAY//ng+vJfmx/e3qq348PrJ12lvNa/vuLZN/zDgodrPDzGbxHcUv5r88M7TPV2fHj7SFcpr/VvqXj2Df/Y4Hc0Hh7j/zu4rfzX5od3rOrt+PAOl65SXuvfVvHsG/73gydqPDzG9wp+Wf5r88P7vurt+PC+I12lvNb/ZcWzb/hnBX+k8S39JeO/FtxT/mvzwztL9XZ8eCdKVymv9e+pePYN/+LgJRoPj/GHBQ+X/9r88C5WvR0f3o+kq5TX+g9XPPuG/4vgdRrfsm8z/pjgsfJfmx/eL1Rvx4d3iXSV8lr/sYpn3/B/GRyt8fAY/73gCfJfmx/eL1Vvx4d3nXSV8lr/CYpn3/DvDk7QeHiMPzN4lvzX5od3t+rt+PBGS1cpr/WfpXj2DX9S8BGNh8f4nwUvkP/a/PAmqd6OD2+CdJXyWv8FiufnivCnBJ8PPqE48IlzXXBE8BLVo1YPvCmqv/PAe0T6Snnt4xLpdV74I5TX6wT+nOCrGt+yPzN+XHD8KuaHN0fz5PjwrGeE8jse/PGKF2jxD5/n38uCi4JvKx7jiMfz8snBh4ITV1EfvKWaD+eDZ33jld88fFknPPt/SP6sD/5k6fP6gs9z8y7tW4+H598flqxifni1v29Yz2Tldzz4SxQvj71b+lFnPUcfFBwQ7BXcUXEZ798Xuge3Dq7M5x+uol54tb9rWOcS5TcPf9YJr5fqYV/wBqh+roN9mNet8HsK/HEax+f+3aN7k/ng1f6eMkh6nNfn3PMRunYCrBP8Z/7+p7at+SMS4MXgrOBjwev1nITx5BlR4FkH8UeIZ13XKz88+3hMeuHZ9yz5834kL3E3ybg1g//I318NTm3berz1/jX45+AjwfHBG6R3asG/ebV1ss4blB+efY2XXniuwyPyZ33U768Ffa7vn1U3r+ep0vlmcE5wmtaz/d4THBe8UXqmFeplXm1dretG5YdnH+Ok13nh36O8PlenKe5rwen6ncm67giOVP7pBT/m1fqeLl2lvNZ/h+LZ9wvhzQ2+EnxRvkdn/O3B24I3Kz/jiDu6wJtb4N0unvXcrPyOB/82xfP+eFH8+cG/BWdpfzjvhOC9wTHSM6ug27xaf9Y1RvkdDz8TCvHs9175cr1mh/ducI0EWpH/fkn1GpsAvw3ODD4ZvEV6GE+esQWedRB/rHjWdYvyw7OfmdINz36flC/Xi7zw18349YIvq17W91Lw5eCt0vNywZ95tXWwrluV3/Hw81Ih3qf8ype/P7Ju2cfzgm8F39G6Zpz3+d3B+4L3a13X9otm99M86bceeG/Jn/XCs98J8uN48O9XvE99T9e5uCT4dvAvOj9avqfrnJ0UnBj8lc7D2vOo2XP9Neks5f2LfFmn81KHSYW8rtNE1cH3Y/o0/fW94EfBj9XH6GuMd39/NPhccIr6lPsf8XxemFd7rtT2Xft9tBDP/n8rX/Bct+dUD3iu6xTVy/uA+yH38/8EP9B6YH0wzvf9Z4NPaT00ex9t9vtF7bq1n0nS67zU4dlCXtfpKdXB5yD9i/70b60P1gt897mnNd9eR43uMc3209r1az9PF+LZ76Py5b5BP18cfD+4Mvih8qKD8fT9h4O/D/4h+IzyN3uewEMffOdttk7vy7f1w1uputgfPNfpafl3PPjPKJ77Bv2f/cQ++N/g0uDf1Td8XrBv/hh8PPgb6Xtb8fh8oniNzid4f5fOUt7avrFU/u3H8cx7qlDn9zR/zM9aCbhx8CPV2fuL+Xwh+IbOhdp92ux5VLv+7OuFAs9+n5MfeK7PG/LvfsO80Nc7ZNzng+0JHGT+GO/+Pzs4Jzgj+LzWe+26qD134BGHP5Ty2u/sQrw2qoP9wHO9ZqgO8FzfOaqbz0/WB32qXcZ9Lsh8w3f/mh58Reugtv81u07RR1zrgId++NZpnvO+UqgX9xiek34xSN2Zd/h+LjtP8+H1UHtPqn3+W7sO7WdeIZ79zpYv14t+Qr/YNNgl+LHq5b4zP7gk6Pt7o3t5s/3NuqYov+PhZ34hnv0ukS+fS+xv9u9WwY7BLYLrt2s9zv1gQXBh8K3gq6vYV9orL3FmFOKhe0Eh3vryU9K3hfzbDzzXaaHq4HOJ/c7+3yi4ebCT5pf5Zrz7xOvBvwUXaZ69Lhr1ndrzFt5G8mNd8DaXX+tudn27TvPl33nhL1Je7wP6C/2mc3A7rS/WG+PcjxYHl2k9NHtu1va/ZveB/S0uxLPvBfIFz3Vapjp4H7yr/kmf6hbcJfhV6qx94Ocq9LflwdV43yI4U3prn9PUPkev7d/2Q7y1/b6J6rG8EM/1wvdy8VxP8sH3+cm+2TbYI9hd+wk++2lp8P3gv1ZxX8IjP3zngWddi5QfXg/5sl7ziPsv8dw3uMfwe/ZmwZ21z9h3jPPv3W8GP9b+8b5s9Ls5vNr7lXW/WYhX2zfs/2P5g+f6LJZ/13lTzTPzs5P2SxfV2ecD8/mR+ob3V+050+i+1ew6rd3/9r1cvpwX/kfK6zrT7+nn2wd7BrcOdlSdfT58EFwR/EdwofQ1ukc1ex51lM5S3q3lyzqdlzp8UMjrOq1QHVznFTpf6M/fDh4VXFd19u+09POuwU7Bl6Sv0e+98Gp/D609z+yDeJ3Es/+uOsfhuT6d5N/3Dd5H4j2w7wZ/EByk/tfSXzPe75dtnzy7BbsHS32z9n212vem7AM9jlfb1+0fXnfV3fXqrjrAc335HJ3eB/R/zoPewa9p37EPGefzgsDrBEv7tNF9tfZ8arY/2A+8dVQ/1wFfzus6EadNoc6cA9xvvhLsE9xV5wTjfP/5T7BtEqwe9LnT6B5Vez7B+4r0Ww+8PvJnvfDsl7yri+f68HnbQr/pqXlmfvYMfp19EdxB/cbnBvPaIbgu+oL/bvIcgtdT+YmzYhXX7Q7yVdK3m+pgP85L3Tpof8NzXddVvbwPuC/tpHn9RvCbQb43Mc73K9bBesEN9b0KfbX3tNrvc7Xr1j5Wk07Hw/962tfwXJ8N5Z/1y/dC3r8+Jzhc5xbnWMv7iwmwV+LtrXOj2fe7zUMH8c2rPVftY3vphWfffL5XYV1yP+Je89Pg/wR/zvxoXfo+tX/woODBQb/31uh9Nni19zfrI97B4tkfeh3P/g+SP3iuz8Hy7/7Meqev7xHcDz3BA7QvGO/+v1Zwg+BGwY21P2rPk2b35R7yY13w9pNf64Zn3+vJD7z9VTf7N4+4G4vn+eEeyj3ze8EjmN8g95+dNT++v+4Q3Cq4qe5JvlfVPr+ovTfX3ufsq4308mfXYVP5g+e6baV62Ad8PseH+1Rv5T8keGCQ85jzm3H2s1lwE53XPt8b3XObrV/tvcJ+OkgvPPvfRP6sD/5m0ufzc0/FPYjzK8h9B771fTH4Od8bFb90b2q2Dl+XvlLeveTHOp3XPPJ6XdKv6DNHB/sHjwxyf2Gc+1vnYJdgx8K9qdF9qNl+an0bKr/j4a9zIZ59d5QveK5TF9XB65J+/q3gAOlBH3z6/H8Ft1b80rlSOi/gkR++8zRbrwHyZb3mOR68dcJjfe6ieWU+hgZ/Ejw3yPMtnocRx/d35rN3cN/gPsHS87NGvwfBq/3+UPvcrnZ9uz69CzzXq6v8w3Od91Xd4Hke9lFdfU+hP9HPjw8ODh4TPFR9jPE+J3oEewa3CW6ufl7bH5s9nw6S3lJe++1RiHeo6mA/8I5R3ewfnuvbU3XzecB5y/3ntOAp0o+flt+ZdJ/qE9xF+Zo93+HV3t9q62x/fQrx7LuHfMFznXZRHbwP6IP0xYHBIcGTg6fqnGG8+2e34E7BnYO7ruL5Vdu34VlnF+WHN1C+rR/eENXF/uCdrLrZv3no3FU874Mj5YdxpwfPUL9lnO8L5Okb7Ffoo7X3jto+Xzsf9tFbOh0P/30L8VyffvLvOrOv2Dc/DA4LnqD+xTjvwz2Cuwd31LlQ2w+b3feDpbOU9wT5sk7npQ57FPK6TrurDr5/0u/4vnpj8EL1Qfj+3jsoeIj6GnpqvzfX9l3rHFSIZ/19pBOe/R4iX16X9Iuzg+cHz9M+YF8wjn7yjeA3g/tpH3jfNOpP8NAD3/ma3a/201d64Z2vetifecTdTzzX+RTNH/NzVfBy7QfG+XxlPo8OHqH9gL5G53Sz+7B2/dnHHtLpePg/uhDP9TlC/r3/T9e8XB28Uv0avtdB/+BRhfOhUd9vdr1ZVz/ldzz89C/Es9+j5MvrcpjmizpfEbwoeKbWpfsw83Jk8NDgV5vs5/CGKS9xdl/F9Xam/JT0XST/9uO85pHX9+ChmmfmZ2zwruD4IN83Ge/7CvN6UnBY8NTgvtJbe/+p/T5cu27tZ1/pdDzqcVIhnus1THWA53qeqjp5H7C/6OuXBa8J3qD9xzj3/W8FBwQHav/Vnh/N7vvLpN964F0jf9YLz377y4/jwR+oeB3CYz/w+x7PZXieckHw/uCDwd8Efxbkdz/i+f0unsscGBwePC94bvCAoH8vbPT+GLza3ylrn0O5DgcWeK7D/vIDz3U7QP7hue7DVT94npfzVF94nrdzVX/vO/oo5/yo4MjgteqzjPM9YHDw+OC3dR7V9m14je4d8K6QzlJe+xtciHet/NsPPNfpeNXB5w/3Lb4f3BL8VfB26UMv4/09Ykjw9OBpym9ftfe9Rt9fmq2n/Q4pxLP/wfIFz3U7XfWA57qepnp5H9BHrw+OCY4L3qo+yzj67HHBE4OnBE8u9G3ykNdxavs7vDHSbz3w7GOgdMIbpzrYl3nEPVk815l7xtXSwfg7g2NVZ9+jrfuMwj2k0X0cXu39p/Zcrq2z/Z4kP44H/wzFc7+hL7Gf2AcTg/cFfx28Sf3G/Yz9c07w7OAPg99tsj/CG6n8xDlevNr+cJN8lfS5HucU4v1a9bJveK7r2aqXf3fk/TTeP7st+GTwmeDjwTuCvLdNHL/fNjR4efCq4EXBHwSbfS8cXu37dda7m/I7Hv6HFuK5PpfLL7xP1Uv+4bm+F6le8DwfV6m+vl8Pkm90PBX8Y/AxnYuckzyPJJ7f48fPFcFrghfqHCw9x2z0PhG82n9PUPv8tHY91N4XXL8hqoPzUv8rCnk9LxeqvvA8j9doPnze0bc5J+8NPhB8SH295bmwztEfB38SPL9wTjQ6j2vPE3j3Sr/1wLOPM6QT3gOqg32ZR9zzxXOd6efc+/4QfDY4Wf2ecb4XXh28Nnix+jj6Gt0vmz1nrPvqQjz7OEc64dn3xfIFz3W6VnXwvWKs5pn5+V1wevDpIM+BGO/7DfN6aXBk8MrgMOmtvS/VPqeqXbf2M0w6HY96XFqI53qNVB3guZ5Xqk5+/s79g/XB/P8++HC71nzfU1gnlwV/2uQ9B959ykecs8WrXc8Py0dJn/1epnjuG/SZR4PTgjM1j8wr4+hDPw/eGLxJ81jqf6W+Bg898J2v2fU2TT6tG559Xypf5hHX/l1n/r3FrODs4Iwg97vhqjP/HmNMcGxwVLB0X2z07zvMQ9eYAq/2nmo/Q6UXnv2Pkj94rtdY1cP7n+eJLwTfDL4Y5DkifJ4zjg7eE7w56OeLtc8rrWN0gWddw5Ufnv3cI93w7Pdm+XK9eD7L89LXg/OD81QvP8f9Px84tFR4nJ2cd9CV1bnFFQEFBESJoojiJJYQE41iF8WGioI1ZjIpc/9JM8ZozKRZomKNBTWa6LUhMYo9YIkx0dBBQFCUoggWuqaAKE3Knbl3/b6Z73ez79nn+s/6OHvt9TzrOe+73733u48jttniv/97PPhYsO3/wBaj8scVwVPSfol47xV4Jb0FwREFPdrfb9s6vxHi0U78x+SnQ3hbBy8J79Lgg8HXgouCM4NXtm3df0B0TwyeH7w7+GTwnuCpype45GE9eJcoPjoDxHtQfpwXvCvlq5Sf63F3Qc/1elJ1gOd63qM6BbZoH3wxvEnBd4NzgpODo9u27ndthG4NPhp8IHhb8NfK70Xp0X6teOQD3/HgjVaepbj292hBb7L82w881+kB1YHrt13wct2v3D9Lg0PatuYPjI7v65HBQcoHXeK4P7zLFQ+dgeLVji/Of5DytB78kdLjuoI/RPxlwavatuY53qjgYMUfov6DC3Ws9eN8Biu+9eCPkp7vx5fCmxJ8K7gkOC84VffjdRG6Pfhg8I/BPwTvUH7EIa514L2kuOhcJ95byt/5wJsqP6X8lqgO9gVvnupk367z38J7NTg/+E7wg+B01fn6CP1n8OHgI8Fngncqv79Jj/brxSMf+I4Hz/ndqfjw5sun84b3jupgX+YR/xnx/Pzn+fZIcFxwefBfwdl6DtKf5+BFwZuCTwf/HBxWeB4SlzysB6/2OTxOfpyXefh8usCz77vlB57rNEz+4bmuf1a9/FwaHt6M4Irg34Nj9Fw6Lzp3BV8IPhe8QfkMlw7t54lHfPiOA8953aD41sPPCwU9+31OvjqGx/gxLLy/BP8Z/DS4Prg4OIH7qW1rnXPzx9XB54MTguODTwWHBi9U/sOkT/u54pEvfMeH97DyLsW1/+cLeq7DUPmC57o9pTrAc70nqH7w/H2MV339PHgovL8G1wY3BP8RHKvnwQURuiY4Njgx+KfgjcqPOMS1DryHFBedCwp65D22oGcfNypPePb9J/mC5zpNVB38PJig77lNBpYOwXX5nPk183b6+/qZFnw9OC5Ymt9PkC7tQ8WrvW5r1xX29ajydVzqMq0Q1/UapzrAc31fV918H4xMx9eDbdOvU3BjPn9G98HFEbo3OD04KzgpeJnyGyk92i8Wj3zgOx4853eZ4lsPf9MLevY9Sb7guU6zVAffB8wPmL8xn1oT7Bqd9kGe6/RnHuF535jgm8FX9fwnX+KSh/Xg1c5jauej9vO08rQe9RhT0HO93lQd4Lmer6pO/n5G6Tri+98y/bcPbsrnC/T9sL/m629q8O3g5KD32YhLHtaDV7u/V3tf2M8I5Wk96jG1oOc6TZZ/eK7r26qXxynmHxODm4Od0797kPkC/Zif3BJ8OTgnuKAwnyAOca0Dr3Ze5LxfLujZx/PKE579z5E/eK7PAvl3nZlXjEcg/boEPxNcqzoz77g5OCU4N/iO5gnIE4e41ml2vuO8pxT07GOs8oRn/3PlD57r8478u86sZ1iHtEu/XVh4tWvth35e/8wILlJe9jtG3yvtXr/Vrrdq62x/Mwp69j1FvlrCqU6LVAfXmXkv89qt0q9nkPtooursefIrwcW6z3z/jpUe7V4P1M7La8cN+3uloGffL8sXPNdpserg5yf74sx3mafukP7dgivz+Vw9P72fzvx2fnBe8C/B4cp3jnRpf0C8Rvv48NAh31Lc2nk+OtTBfqxH3eYX9FzXeaqX7wP28VYHd0q/HkHmVczD6Mc+3+jge8H3Ne/yPK3RviE88oHveM3OD/GFrvOGZ99j5Mt68N+XnuvMPtSs4Lbpt1twm+AK1Zl9qvuDs4PLgjODLyg/4hDXOvBq98ec9+yCnn28oDzh2fdM+YLnOi1THVxn9k/ZH905/foEd+T5oDp7v3Vh8OPgu8EnlV/tvm3te1vnvbCgZx9PKk949v2ufMFznT5WHbxf/EY67p0P9gnyfXG9wL8vOiuDH+l79HWEPjq031fgkcfKAq/2+rWP2coXnn1/JH++LllHsf7pnX67B7djHNF16XXXB8HlwbeCjyu/2nMctes85/e44lsPfx8U9Oz7LfmC5zotVx18XbKfszC4axq+EGR/Bj77PE8ElwQ/CU5XPugSx/3h1e4rOc8lBT3nP115wrPfT+TL8zPOhzCOME58PtirXWtd8qW/z5UwvqwKLlV8+5qp74v2e8RrdJ6l2XrWjp+ux6oCz3VaIv/wXNelqpevZ54HvMfrmIYvBnfW9ez3gW8E12g8J5/a94m1zyXn+UZBzz7WKF949rlQfjzOcr6EcYrxZd/g1tRd46zPrzEerQ6+FvT5j0bn4OA1OvfS7DhrHyOVJzz7fk2+HBf+asV1nT9Mx1XBz6bf/sHPMY9QnZ+N0IvBfwTXB/8ZfEn5EYe41oFHO3HReVY88kXX+cBDBz+l/PCNrn3B+5zqZN++//l++f6+FNyP+bDmWb4O1gbXBZs9l9Ts9ea8Rim+9fCztqBnv+vky/XivRnve/um4eAg78Hg+/3yJi70PCinKZ/a99O17++c56aCnvOfpjzNsx48P/95/8L7kAOCJwUPDDJeM77T3+9tNgS3T6CNGtebPacCr/Z9Ue3zx343FPTsH72N4p1U0Nte38+Bqq/r5O+HfVLW06yXDwueETyU65rxPv19joV19lYJ1DPYJjhDvhqdi4FXu59buz9gP+i1UT1dD3yV9KiXfcM7o6AH389B9lc593B0+p0VPA6ddq37+RxFh+j3CnYOviIftecxavd9nTd5WM8+0Ous+uHber3EO051sm/XmfdevK86JPj94FFBzvvQz+/Jtoz+gcQJTpDf2vNFte/lnF/L+SPVxf7I13rfL/AOlN5RqpN9u87sM3NO5Njg+cHDgzvoeva5k22jfyj5BOfLR+35ldr9b+dNHtazj5a8Ovx7Hv7tB975hbjwPa7z3pxzImcHvx78dvA0vl+N6z5/slsC7BncL7hzcKr81763rz334jzR21l1sl/yLulRB/uB9/WC3p7ifVv1dZ18H7D/z/7+QcEfBk8OtpwnST+/L9gcPCRxdgi+Kb+151dq3084P/R2UF3sb3NB74cF3iHSO1l1sm/XmfdU3Ifcb98Nfi24h+rs91rcj18Ofjb4oXw0ej8Gr5viojPv/zmO7CE/pfy+qzrYF7yvqU727fGG8wycQxgQPDf4VT23mRfQ3+cgtkuAvsE9iFuYPzQ6Hwqv9vxF7bzFfsnbekerDvYD79yCXl/xvqr6uk6+D3ifuFdwYPDHuu+4X1v2uyK0Itg9+kcGS/dzo/eX8MgHvuM1O44MlE/nDe8g+bcfeD9WvezfdWbhzzmRU4IXBU8MdlGdfe7kM9HvF+wWnKv8as8J1Z5zcX7odVP97I98S3r4tx94FxX0+hXqzHsgzvEdH/xp8IRgb9XZ5wK7RL9/sGvwA/moPV9Y+37KeZOH9ewDva6q308Lev3FO0F1sm/Xmf0j1hXM9y8InsP4ozr/r99BRP/wYO/gJvlt9HuKZve1atdFfeWnlB++0bUveOeoTvbtOnMuinNP/YI/Cn4r2Fl19jmqraN/WHCf4Bz5qD3HWXtuy/mht4/qYn/ka70fFXiHSe9bqpN9e/+W9QPz/5/ovuG+hO91xlHB0v3a6Hxxs+uZ2nHiePlxnvB+Iv/25XqxH8N+ymX6XnqqXt63OQndwvfc6Lxfs/tDtddXP/lxnvAuk3/78n3MfiL7gT8LflPPN56fLee3IsR+4THBvYOl52ujc6nN7nfWPtd/Jp/OG94p8m8/8L6petm/68z+OutP1oWnBy8OHqA6+/cYrBt3CZ4Q3CC/jX7XAa923792/XyA/JTyO111sC94F6tO9u37n3kg87grg6xPWP/A93zx1GBpXdTo/Hqz89La9dgA+XGe8K6Uf/tyvXj+8Vz6ZZB91O6ql5+TxwdL+7KNflfR7PO4dj/4EPlxnvB+Kf/25fuY9428V/xG8FdB9jvZd6Wf30/uFTw5WNqXbfQ7RXi170Nr94O/IZ/OG96x8m8/8H6letm/68y5Ls5t9Q9eEWR/s5Pq7HNgHaN/SrC0v9rod4rwas+d1e7r2h/5Wu+KAu8U1fls1cm+Ay3jAOc6Obf5leDPg98LDsIH85T093nQ3RPg2OABwZ2CzZ5nhld7DtV5oreT6mS/5F3Sow72A+/nBb1jxfue6us6eXzeRn7IZ0iQ97LwfW6cPAcFt1I+tefOa98r19b/MPko5TdEvu3H1zPnaDi3dUTwvOAvgmcGOU9Df58Ha5cABwePC+4aXCv/tefLas/72Af5WM9+0NtV9TyvoHeweGeqXvYN7xeqr+vkcZ1zI5z7uDR4YfDIIOcc6edzJidG/4hg++Aa1aX2XGXtuRbnh1571eVS+XTe1sO//cC7UPWyf9eZ84ucEz81eLW+/31VZ5873zH6pwVL11/t+fVG5yqtR97kYb3a++MI+bcfeFcX4p5WGG84D83vRAYHvxO8KnhMkPPO9PfvT3okwP7BwcFOwVXyVXseu/Z3L84TvU6qk/2Sd0mPOtgPvO8U9PYX7yrV13XyfcB1xH40+8mXBC/X900//66C/eYBwYHBHZVfo99nNHt91+6nXyJ/zhfeqfJd8nG56mTfnqf00nXD935N8Aeap/icP9fD6cGDlE+j3wnA+0GBZ73a6/wa+XGejgvfPnxd7qo86X9tkHk+6wP6+XcU6J8RLK0fan+P0ej3Ms3WuXZ901/+7QfetaqX/bvO/E6C5zXP2+s03vRRnf27Cp7HZwZL412j3w3Ca/Q7jmbH2dp5yXWqg33BG6w62bf/v6T8/u/6IOsg1lnw+D3gWdEprbsa/Z6wFBdd82rXe18p6O1e8M18m/nyr4P7ybfn42cH/TuARuf7m53vOx/0zi7w0HWe9j06vPXwQ+jVXrrpPz64JLhU8dFB1/1axrH2/55X0iOvJQU9571UeXo8mcD8LR8cEdw92CM4T+PJ0Oi9xrwz/wPF5fn3+8E/KD/ioUf7UPHIB77jwUOHPEtx7Y98rWff6C0Xz3Varjq4zhOTZ4d88PngPsGNaX9Hdb4luq8zX+Y+D04KPqL8JkqP9lvEIx/4jgcPHfIsxbWfScrXcanDqkJc1+kj1cHztkn5Y6vw9w5+ObhA87Zbo/MK42zw0+AI5YM+OrTfKh7x4TsOPOc1QvGth5+VBT37/VS+XK+x+WNZ8ID0OyTYvX1r/o3RGRXcENwy1/0C5YMucdwfHu3EQ+fGgh55bijoOf8FyrPl/Z780r6hUK8x3J/hfzHYh+eE6nVDdF4NrmG+E5yuvNFHh/YbxCM+fMdpmW8pr+mKbz38rCno2e/H8hVoqdv05Pem7huuz77BLwU38TxK/zsj+Hvdj1zXm4Jrg5OVL3HJw3rwaCc+OneKt0B+nFez97V9T5YfeK7TWvl3XPibFNfPpfGJ2yUf7BU8mvsr7R/quXRz9OYGV/D95/6ZmH8/q/zGS4/2m8UjH/iOBw8d8izFtZ+JytdxqcOKQlzXCZ2WOoTHdTyV9VH4+waPD+4W7BlcpPvgjgguDK4OdkncZfn34uCTypf46NJ+h3jkB99x4aFDvqW49ru6oGf/6C0Tz/Vapjq07KOqvrQT3/fBtPhZHNw+DccGDw92bN+632+j91Tw7eC25BN8Qz6IQ1zrwKOduOj8VjzyRdf5wLOPlrxUP/vHj/VcH3S2LcyDxyW/bvmgf/AEnpvBzRpvbkrcecGO0e8anJHPX1Z+xEOP9pvEIx/4jgcPHfIsxbUfeF1VZ9cBX47rOqED3+PNG8nz7eAu6feF4JF63vP8p/99EXwouCj4SbB94pbmCcQlD+vBo5346NwnHvmj67yance4Hp8U9FwvfH8inuu5RnXyPPLl/LFN+P2Ch/J81zrlN9Gbybw0um2CY5UP+ujQ/hvxiA/fceA5L/Ta6Hq2H/K0nv2is3Vh3Jis9SfrweP0vOb5Tb/bEtfr0M56Xvv5ThziWgce7cRF5zbxatfFtfMP+14hX44Ln3bius5zk9+W+eCg4IF8T8H5Gp+HR29qcHNwY3Ba8GH5IB56tA8Xj3zgOx48dMizFNf+Nhf07HuafMFznTaqDq7zFO1bsY90svLaUtfz7dHzvtQOHf9vH1P0vdJ+u3jkA9/xmq1f7X6a/ePHPNdns/x7nJ2ZP7qGv19wAOO0xtl7ovdmcF1wu+iPUT7oo0P7PeIRH77jwHNeYxTfevhZV9CzX3Tgu16v5I/O4Q8Ksq/EPhT830VnTnCn6Jf2p9BHh/bfiUd8+I7T7L6Y/ZCn9ex3pXz5Pn6d9xDBPdOwv9Y9rIPod290xwX/FVwfLK2TiENc68Cjnbjo3Cse+aLrfJpdx+EbXfsyz3rwXOcZGtcZZwfqPuiqOt+l5w/jcnfdB75viENc68CbofEFnbvEq32O1N7X9r1OvhwXPu3EDbSMA+/HzxLtQ7Lfd1bwmOC2Wjc8HsE/Br3f2CvxOwVnyxdxycN68GgnPjqPi0f+6DqvZvdJ7Zu4nVR31wvf1nM90elVGG9ei49O+eCw4OAg70s66D64O3FnBbeKfo9g6f0L8dCj/W7xyAe+4zX73sf+yNd69o1eD30frhPt6Po+eE/7W+w3/UfwHOYpwb9rv+6xCHofq0/i9Q7Oz+fPyRfx0aX9MfHID77jwkOHfEtx7Qteb9Wzdr/OdcO/ea4r8foU7oOFWt+yjjwjyHsd3hfR74nE9fq1p977+H0S8dCj/QnxyAe+4zX7Hqt23W3f6PUUz3WivU2hzrP1XoT3D2cGOW+wXnUelvh+n7Fr4pTOLxAPPdqHiUc+8B0PXu25idr3MPa9RL6s18Lv2FrP8+5Z+ePE8E8Kcs6A8wvw749Ot+huHyyda0AfHdrvL/DIA33zas9T2Ec75QvPvmnvVhiflybP1Vp/sc45W88Pnif0HxnB0UGvs3bT88HPHeKSh/X+C+PMDnd4nJ2ce9RQZZnFP28gH6KC3ARUBJfKPUFTExW0JpWLIKLimgY1hZrCELSpZrxUVt51zZSmlmtQVETTZd4IarQUJsVLjiikpqB4w0sqghiC84f7x1r86l3nHP1nf3xnn+d59j7nvZ73c+uWT/97bZtPsX2bT/Hpdp/incGtw/swvLXBB3L99+L9U5vN+VzfsXVzHvkODG7Vunl+eMcWeLsqHnnhc52824aXyy1LU992+cXI4MTgwcFt22x+36zU90ywfeLvFmwb/D/pIB/xuD5LPOqB73zwtlWdpbzoIq7rhmfdbaXL8eBzvX3B52ejozW/+ELw+ODng13k8+zUuQQ9ib97sCX4ovSSh7x/F0d1kZc4s8WjXuK6HnjWQbwW8ay7RbqcF/6m6wWf34mej4OH5sLRwXHBbvJ5XupcFGyX+DsHewRXyBfykNdx4HGdvMSZJx71Etf1wLMO4vUQz/rR43j2p4f02+dVem94jocEe7fZ/Ab+eXfq9HuxbXBVfv+IfCEfgbh+t3jUA9/54LWozlLeuu9zb+m3Hsczr6Xg8/Lo2Cm/OC54SnAAz0s+z03evwR7J/7A4Jr8fqXqIw95HQce18lLnLniUS9xXQ+8HtJTqs+64Q1UPPvE9d4Fn99Q+6QdfDU4IthRPt+V/G5/g4Ktweekg3zE4/pd4lEPfOeD11F1lvLW7Tesu1W6HA/+IPWXNJe2wfXR0Tn8/YOnBk8Ojgl2YBzO/QsT8IXgFskzODgg2C24VPrJT1yuLxSP+uA7L7wOqreUF53Edf3m4Qe6zLNP3aQfnn0dIL/wle51m/C+FDwteFiwU5vN+U9Exw6JNyS4XfB5+bCN4nD9CfHID9954HVSfaW81rGd6nVe+FzfodBv7Jgfugb7BEcFRwf7qt94NvUtD74V7JI8XYNvSwd5yOs48HZUXuI8K14f1e964I2SPtcLr690l3TYH3hdCu9lr/COCZ4QnBTcRe/lq8nXK/H6BPsGX1M9vRSH66+KR374zgPPdRGvr3jWQ52OZ719pcvv5W754aDgEcEzgv8aPFLv5Rupc5vE7RQ8KLhvcCfVRx7yOg683ZSXOG/I5yNUv+sxD10HFXjWu5P0wLM/+0q/38tdw/ticEpwZvAkvZevR+f2ife54MHB/qqHuOTx/fB2VT7ivC5fXSf5Hc/191ed8Kz3YOnye7l3fugXHBv8dvDM4OF6L9+PjtXB7ok/InhIsIPqIw95HQfe3spLnPfFG6v6XQ886+igOh0P/ehxPPtziPR7njWQ5xucHJwa/LreA94L7l+bgH8L9kuefYLD9Jz9/pCXOhwP3kDlJ85a8SZLj+tq+n5PlS/WB88+fU76HQ/+MMVzO9hT7wfP9ftB1uOs37nv3ej2+zRK63Wv7/dUPK6/K5+pB77zNd1XqNsOrHtn6XI8+KMUzz7vlR+YJzMP/jf69+A+8vm96Pa8emRwY66vl397KR7X3xOPeuA7H7x9VGcpr/XAG6l4ddcN9mmkePa5f34YFBwe/G7w3OAE+fxB6vww2CbxDw8eGdxF9ZGHvI4Dr7/yEucD8YarftdjHrqo0zzr3UV64NmfI6Xf8w32PdjXuED1UB98748co/iue4DicH2N/Kq7D1PXL+uhTsez3sOly+PgYLUL3udLgucFmV8zH+f+dQno9nRc8CjNwz1vJy91OB68wcpPnHWfsZ3XXVdYfx/pcl58Q7/z2tej5JefD/uh7O9/LTgj+I3gicx79Hz83WBocHhwv+Ae9Fuqt2o/tun3ikNUbymv9Q4txDtRPlgPPPs2XH7A+0aBt1/h+QwjL/1TkPXR5cGf8Lz1fDYk4CdBr7smBccHO6te8lKH48EbpvzE2SDekdLjupquF627s/Q4Hn5NKsSzn+Plk8fdIcrPfT8K8h2Y78Lc91G7f1zv0UF/N6a+IYrH9Y/kM/XAdz54Vd+rm/ps3btKl+PBP1rx7PNQnkfw0uBlQfZZ95fPH0d3z8Q9PnhCsLS/O1TxuP6xfKYe+M7XdF/Z+qjX8ax7sHTBs08nyAf7fEB+4Ps739d/rrrGy+ctmS8F+R5/ivJZB3nI6zjwDlBe4mwpXt3zA3V9tv5TCvHsz/HSb585R0I7oR1cGWS/Yax89rkT2s1JwdL+xYGKx/WtxKt7zqXuvknd/sC6R0iX48E/SfE8fnJ+ge8OfFf4TvAHmgcwL+B+zjn4e8VhwdEa5z1/IC91OB68qnMWTb+j1J3f2I/DCvHs01Dph2dfR8svPx++Q/xzcFrwrODpwa8QT8+H7xV7BvcPHho8ILhXsKvqrfoOAo/64DsvvNGqt5R3mnS7fnhfkQ/WA+8s+Wcf4J0uf+2T+ynOWbGOZp18jfpF+knu4xyW192nql90P0oe8joOvKrzX033Aer289Z/aiGe/TlF+u0z3/n5jn+D2iXt9Evy2ecCpqm9+fsp9Y1QPK63ilf3HELVd1vHQ9+0Qry6/ZJ9Okw+4JO/47E+/nGQ73qbvsvmftbP44L+flj1XbDpOt/19FV+x4M/TvGs+8v5xVVBvrMdId0dc//JwdL3vC/rfq53LPDIe3KBV/c7ous/SPV6fGE/m/3qucHZeg95LzlPw/3eBz8zeLreM5+7od6qc31N99+rzvs0bWf25cxCXvs1TT7As7+ny7fApv6Pc2J85+Q75sXBm4I3B9l/ZL+SOJwr83fSicHpwTOCpf1N6qAux4VXdb4NXt3vuHX3X+3PxEI8+3WM9MOzz9PlGzw/hzPkq8czvl+wPmX9eWuQfUr2NbnP56NYr54VLO17Vp2zqvtdpen6uu6+rHUfJ13OC/8s5bXPfPecHjwneH7wh8Gvy2e+i34heERwbHBMsOl3VnjUA9/54Lm+YcoP7xzpdN3wzpcP1mUe+ceIZ59Z97CuuSh4YfB7wRny2eukY4MTgl8MDld9dfeT667LZqjOUt7vSZfrdF58OLaQ1z5NkA/2eYreB57Pz9TvzZTPPhfA85ys/sz9ZN3zBVXnbJq+z3X7ceufXIhnfyZKv31mP5x5FPOqx4J/Cl4un30ei3nXVcFrgpNUX9W5rqb79FXzQHjWMUl1Oh76ryrEsz/XSL/nn5yXYF+LfasVwbeCzJuYj3G/zxmx33Vr8F7Nrzxvqzq3BK/qXEfTfbq680r7cWshnn06U/rh2dd75ZfbAe2L8eCnwauD16r9cZ/Hi38JfjV4mtpf3XGnabv/qep3PfCulj7XC896J0uP48E/TfHsM/0/48EvgzcGfxG8Qj57vJga/FZwSvDEhuMOvAuVlzgTCvGoe2oh3hXSU6rPuqdIFzz79C354P6GfRDWaazD7lb96GEc537vn7B+O0d5S+N91f5v3X2bzzrPqHo+9mGq9DVd79rfc8RzO2DfhnUA8/wXgs8G2dfhPp/jYF0wJzg72HSfCF7VuRF4rm+c8jdd71j/nALP/syW/sAmvzmfxPqXdeujwXeDf2UcD7K/Sxyfb2Lde2VwfvA3wdJ+cNU5M3hV56ua7kPX3QewD6dKl+Ph45WFePZ5vnyD5+fwG/nq9sP8lvGJ8ecWxvsg+xXc5/kw49XM4HnB6aqval7ddB+l7vhqXTMLPOudLj3w7M950m+fGd+vD94Z/LXqulY+M/5/M/jvwf9QvqbzCXjUA9/5mvp3p3S6bnjWPVO6zCOu9Xu85ns252FYp7C+eCfIvJb58qb97cT1OSXWJfOCpXl11TkceFXf3eFVnZ9qui6ruz6wX/MK8eznrfLJ7YD5GfOvu4L3BG8LXqd24Pnc2cFzg98Ofk31/ULxuD5FvLrzx+tUZymv9Z1diHeb9FsPPPt0rnzweM25Gb6XMg4xLryteQLzBvZLieNzNx7H7tO8wfur1F91bgpe1bmfuvu68Kq+Gzcdr+vOr+zvHPnlvPDvU163H+bZzI9/H3xA7xvvH/d5Xn5x8CK9R03XS03XAXXbhfWcrXqdFx8uLuS1TxfJB/s8Jz/cHpwfvD+4IHiHfJ6ReN8Jnh+8MPij4HdVH3nI6zjw5igvcWaIN1/1ux54d0hPqb775YN1wVsgn6zbPjP+M87fF/xD8H+C98pnzxe+H7wkeEFh3lZ33lE1v4N3n+p3PfCs4zzV6Xjov6QQz/5cIP32mXbE+78w+BDju8YX7nO7uzx4WfAHGofrjldN2/k9qrOUd550uU7nxYfLC3nt02XywT7fpOfM8/lzkHXczfLZ6wye5w3B0rqw6jty03VN3fVo3ffZ+m8o8OzPldJvn2knvwsuDj4efELtiPtoRz8J/iz48+DVakfURx7yOk7T9rtY9bseeNZxieqE97h8sC7ziHu1eF5PsR/HdwK+A3wU/IvGX8Zj7vd5Fb4fPBi8WeOwx+2q8y919w2bfveoO6+w/oulC579ulk+uD74D6o+twP6JfqppcFlwSeDi9QO3I/NCl4fvDZ4RcP+EN5DykucywrxqHtWId4i6SnV96T0Ww88+3S9fLDPD+aHPwafCj4fXBJ8WD5fmnj/Gfxl8KbgdcH/Un3kIa/jwHtQeYlzqXhPqX7XA+9h6SnV97x8sC54S+STdbu/YVymPdFeXg6+pPeF94f7Pa+nnf0qeJues9+zqnVC0/lD3f6hbjuw/lnS5bz49qtCXvt6m/xyO2A8ZzxiHFkefE7jPfd5fsq4Mzd4o8b7uvPcpvOMuuOpdc0t8Kz3BumBZ39ulH63A8bpZ4Krgm8GV6o+6uV+xvP/Dt4dvCd4u/KX5hOleQI86oPvvE39XCXdrh+e9c+VLnj263b5YB757dff/X+G1W7eC74ffEXjC/e5vS4I/jZ4h8bhuuNV0/5hmeos5bW+BYV4r0i/9cCzT7+VD/b5OT1nnuPfIOSFXy+f3b547g8FHwkubNhO4a0v8Byv7ntqXQ8VeNb9iHTBsy8Lpds+v5gfXguuCW4Mrg2+Lp9vSbw7g/cH/xh8IPhr1Uce8joOvBeVlzi3iLdG9bseeK9LT6m+jfLBuuCtlU/W7f/fCc+Z/mZdcIOeP3z3V38I/m/hudft7+q+b+tUr+uAt0F6XKd5zgvP4yD7AYyvtDfe6+1D/Dj/5vs393sfwe10WXBRcL7qrdqXgFf3+3zd+ULd/sW650uP4+HXskI8+7lIPvl9ZnxgHrlFCFsF39P77Pnl4uBjGgfqzk+bjlOuc3EhnutfoDrhWe9j0uV+lnk56/stc1/XtpvHo07u837Bo8HlymcdddcBdfcn6vpnfY8W4ln3YumCZ5+Wywf3Gzw3nkv7YGtw6+BqzUe438/76eCS4OPB32n+Vnee0/Q9Iw71lvJyHX2u03nx5elC3q3lm/XDs79L5JvbAf0/40G73LddsAMPou3m93m8eCr4THCp5jl1x52m8yvqJa7rgWcdj6hOeOgmrnWZR9yl4tnnT+hHwu8Y7BLsFGwrnx9OvD8Fnwu+GHw++KTqIw95HQce18lLnIfFo17iuh54baWnVF8X+WBd8DrJJ+u2z+v13vB8dg72CG4vnz0v53m+HFyp8bfu/L7puF/3PbWulws8610mPfDsz0rp93yD/oX+pluwe3CHtpvz3Q+tCL4U/HPDfgxeq/IRZ0khHnWuKMTbQTpK9VnvS9LlcZBxlXGzT7Cv6qJOxgXu93j8VvBt5S2NH1Xzo6bzgLrjVl3f7ctbhbz2a4V8gGd/35Zvfp/5+6dRuTA6yLk6zuHB5++iurRP/cHS+byqv68yjzqIb17dc4HWAY964Vk318nvfpbxr3OwZ3B39Uv0U9zH+PhC8JXgm+pvSuNyabyFRz3wna9p/9lTOl03POt+WbocD/6biuf3kr8L4Pwa59PGh3iM+ln//QDn2HrmOfbSc6/6+wN45DHP8eqet7MO6jPPOskH3/0s/QLtvl+wf3AP4qj/5n73J6uDHwTfCb6q8avuuNC0H+uuekt5e0mf63RefFldyLuHfLN+ePb3A/nmfmNnvf8DgoODgzQP4T63pzXBdcEPP+O8pmn7dX0rld/x0LemEM/610kfPPvzofTbZ/qZ3sG9gwNV1+7ymX5oVfD94FrVZR3kIa/j1O3/4O2t+l1PU58HygfrMs/x4AU2+b1C4zDj5+Tg2CD7JuzHcL6EOD6vz/jbL9g96P2bpn8nDK/q7wXgVZ2DaTrPqLsfZd/gdVc8+91P8zF4fh7d5a/HEfZdWTfR3ml/hwYnBMdoHPF+rfuJdsm7S7Cb6q3a/4U3psBzvLrrwLr9m31Aj3n2Cb3tVJ997CZ//HyYP3Bun313fCDOScHxej4+3+/9evL313yDeqv+XqDpPKfq7wWbfmeo+17Yp/6F99E+9pQ/fj60W9rbxODI4L5B1mld9Xzc3ncLtg9uzPXSOrFqn7ppP1N3fWpd8DaKZx+43l557Vt7+WEd8LmODnxlndBH+T+veSHzRPjW0ZK4pflj1fq7qV91563WsVr1Oi/8Fr1Xnk/1E/+A4P7BIZoHc5/zbxncIviR1hd159VN9fZXnaW8Q6TLdTovPqDLee3TFvLBPjPvYh42LLhf8EDNl7nP87QNwU+CWyXfOumomu81nacPU/2uB551rFOd8PaTD9ZlHnGJA8/98yDl574RwaOC4zTOc7/XH+RrDXYO9iiM91XrmabzjLp+Wif1mmfd7aQHnv1C9/8DflemvHicnZx3sFXVGcVBQLhwH0elNxURQbGAPLrAo0jvxYZYGEcQhIB0RIoIQqISRWOJGo2KaGyJRmM0mtixV5DeRQSpooAKmQlrvZnzy91zz73558t7e33rW2udvfe53DdJ+Qol/vef0kdLiR5lj9Z+qjW1XllVvy5RRrWZftFOtaNqkWqrsnH8kfJHaznxpVXLq5aCnmbg8bp5jPN84znHuFbQF5rbEb6olzjypQN5tdAvWqp2Vu2k2hp5lRTPMaoVVQusA3rM6znsN64F5pmnZIDPOisG+FrDR0gf/RbAV0o451ao/9JB9QLVvtBlnc3LxvsPax9UEP/JqjUw135KQG8heL1+GPvP+oznXOOaQ29obtLcmYv9cS7zqogcjGO+NZBbOeGOVfW+9znorjpI9UJV3yvu4zmppHqial3cO0nPm3FFmGue8sB1h37qMW4Q/FGvcfRbGX7IZ3xd8PEcdMLz8/MZqnqZ6kWq5+Mc8Jz5uTZQbah6imqU47k1rhPmm6cAuKT78Xz4CuljHg0CfBchL/o2jrk2RF48Bz3wPK9UHak6Au9V93F/NFItVD1XtSb0ZXtP57ofqa8m5pPP/hoF+Oi/EP6MYz7nwj9z9rm5VPVq1eHQdSFy9rk6TbWxahPoyvWcGmc9xnNervldDZ/UbRx9N4Iv4sxL/8y5PfaDn8/vVW9XHYicU9ivfp6XqA5RrQN9nuO55DGuPeaaJwVc0v1MH3Wgk3z2f0mAj/kMgX/fx/5853vL791rVK/FfWY838dNVZvjfkr6Ps/1/qTOpgE+6m8AncbRb3P44r70553BqnNV50GXdbrPn4dOUu2r2g/z6MNzPJc8uX4Oo+6+Ab6kOdN3U/gyjjn1Qw7MeSiey2jVMarD8H50H59zC9WWqmfi80bS922u++oy6AzNHQZf1Mm5zqFFYC5zaokcmLPvbd/P41UnqE7Ee9R9vOfbqrZTbY/3aK7vi6Tv7/HQTz3G0UchdBo3ATnQF3HmbQ8ccx4l3FjVqaqzVKepjkPOzcTXWrWTag/VzqptoM9zPJc8xo3CXPM0A24q9FOPcePgJ6RvFnKgL+OmISf6Zs4j8Jz9fG5QXYj3qPv4uc/Ps6vqxXiPJv38mOv7O+k+pa+uARx9XwxfxjGXS+CbOfuemaQ6W3WG6mTcQ+7zPVSk2lO1m2oH3NdJ7zXirKsogBsDnaG59NcT+o2bDP/0Yxxz6oYcmLPfq35v3gx/9nstcuZ7uD90h94f2T4P5frez/W9le250X8R/FGf8f2hjzn7Pp+uOlP1RpyzicjZ930X1e6qvXDOQu+Z0PvDOOsxnvNyvQ9mwid1G0ffXeGLfMb3Ap9+Xfzvh576xRzVm1Qvd3/ZOL6KeHqr9lE9XbUq9PQEj9erBHDW0TuA6wV9obn0cTr0GkfffeCPefUBr/v8eXow8qqOfMwf+pzfBzxerw6c5xvPObn++yJpXvTbFzifQ97XPvfzcX8Xfz+Le2MA7uFc7/+k9xL19MR88hk/AHz0PQO87lsA33zfmHdgju8pzvUc83TL0zd1DwSOvn3/3Kp6G+6j4u/Z1X+h6kV53mfGeZ7x5DeOenphPvmMvwh89H0DeN23EL55b5v3YsxPet8n/TyZ1Dd1Xwwc78Pe3heq/p7rDtUrcB9WEw+/V7tU9QzoMa/nsN+43phnnmrAJf1+j/rPgE7yGX8p+JhXf/C6b5HvFeRVC7mYf6hqbejpDx6v1wLO843nHOOoqzbm55oX/Q4FjnnV1h++Oqm+HR2tC/TzoFQc/036aC0okG7VgaonFsT1kN995in+3j8Vx3udfNTp+QXAUf+J0Gkc/Q6EL95DzYV7K4r3W5dxJdTfH3zU6T7zlgjgONe8JfLMh/oHQC/3SRnx9lV9M4rzNMc++UTPr4b4DmTRXdyfivcTRx3m/wT7KWle9GOdNYCj3/7wxbyqireH6htRnKcv8lov/ZXF2xf81EN+961HDp5j/Ho8F+Oo0/Mr55kX/R4AL89VF/H+J4r398C5Ok79fZATdbrPvMcFcJxr3uPyzIf6+0Iv90kk3iLVf0dxni7YJyv0/MqLrzf4qZv87luBfeI5xnudfNTp+eXzzJV++8AX86oo3naqr0dxniLk9bV8lBNfL/BTN/nd9zXy8hzjv8ZzMY46Pb9cnrnSb2/4Yl41xHuO6mtRnKcd8tokHwdVe4Kfusnvvk3Iy3OM34TnYhx1ev7BAF+2XOnXOPPyHqov3n9F8X7rMm6X9PQAH3W6z7y70plxnGveXQG+bPlQv3E9AvvkRPH2VH01ivPUxz75VvOqiK87+Knb/Z7jfuKow/zf5pkX/VhnFewT+u0BX8yrvHj7q74SxXl6Iq8vpauW+HZn0eN+z/kynRlHHeb/Ms8c6Mc6awFHv93hi+eqmXj/GcX7++NcHZHuruDjfPeZ90g6M45zzXsE+ST1Tf27wRvy3U/15SjOQ981xdOlIM4b4qsZ8JPUN3V5bk3Mpe6u0MnzUUG8fVT/EcV5+uF8fCVd1cV3Pviph/zu+yrgz/ivkHPx98LQ6fnVgUuaF/12gS/uk8bifSmK9/fB+Tgk/Z3BR53uM++hdGYc55r3EHJMmg/1G9c5sE+qi3eA6otRnKcx9slG6aotvk7gp273e477iaMO828M8GXLi36sszbyot/O8MW8jhVvG9W/R3GeAcjrU+kqI76O4Kce8rvv04A/4z/FczGOOj2/DHBJ86LfTvDFc+X5XVVfiOI8xd8rqP941Q7gDfEdH/CT1Dd1dYAO46i7I3Ryn/yqP/ieIP7nozhPV+yTd/X8Vqt+m0UP+d33LvaJ5xjvdfJRp+evDvBly4t+jTMv8/pF+s4X/9+iOM8JyOsd6YrE2x781O1+z3knnRlHHeZ/J8CXLS/6sc4IedHvt8DzXNUU71+jeL/nGbdZetohJ853n3k3pzPjONe8m/P0Tf3GtQucq0ribaH6XBTnqYl9ska6SoqvLfip2/2e437iqMP8awJ82fKiH+ssibzotx18Ma8j2s/nif/ZKM7TAnktla5jxXce+KnH/Z6zNJ0ZRx3mX5pnDvRjnccCR79t4Yt5VRbvKarPRJiDvNZK/w5/75JFD/ndtxY5eI7xa/FcjKNOz98R4MuW1//5LYjzMq/54n1I9S3V36q+E8Xxh/TzSPHepjpI9Wd8LpgPHq8fCuCsw/zEUZf5BiEH+hgEvcbRt9dHBvbXzcLdo/oedM/H/joofcPEdwf46e9m8Hj9YABnHeYnLmmu9GOdw5AX/Y6EL77n5gn3CPRaf/G/C9U/GnPpZx76vd6vIDPOc81LXNIcqX8Y9HKfzBXudtUl0DMP++QnzRsivuvAT91zweP1n6LMOOsYEsAlzYt+rHMIcPQ7Gr6Y103C3a36EXTPRV4/Sv+V4rsbOujvJvB4/ccAzjrMT1zSXOljCPQaR99evzKQ1xzh3lZdDt03Ia/90rVQfA+Dn/7mgMfr+wM46zA/cUlzpY8rodc4+vb6wkBeNwp3i9/H0D0Hef0gXReIbwn46e9G8Hj9hwDOOsxPXNJc6cc6L0Be9LsQvnhvz/bnf+i1fuP2Sc90zKWf2ej3+r4AznPNS1zSHKnfuOkB37OEexo6ZsP3Xs2ZDD7qnIV+r+8N4DzXvMQlzYf6jZscOB8zhVuk+gb0WJ/xezRvqPhuAT91zwSP1/cEcNZhfuKS5kU/1jkU54N+J8MX85rhe0f1c+ieiby6iWeU6v3QQX8zwOP1bgWZcdZhfuKS5kofQ6HXOPq+H/6Y1w3CPaW6DLpnIK9d0jVJfA+Bn/5uAI/Xd0WZcdYxKYBLmit9jIJe4+jb657Pe2i6cM9Br/Ubt1O6p4GPfqaj3+s7AzjPNS9xSXOkfuOmBfbJ9cL9TvVj6JmOffK95g0W3z3gp+7rweP17wM46zA/cUnzoh/rHIx9Qr/T4It5TRPuQdVPoft65LVDukaI7z7ooL9p4PH6jgDOOsxPXNJc6WMw9BpH314fEThXU4VbDL3Wb9x26RkLPvqZin6vbw/gPNe8xCXNkfqNGxvYJ1OEe1J1M/RMxT75TvMmiO8Z8FP3FPB4/bsAzjrMT1zSvOhjLPQaR99enxDIa7JwL6quge4pyGubdM0S3+Pgp7/J4PH6tgDOOsxPXNJc6WMC9BpH316fFThXk4T7C/Rav3FF6p8IPvqZhH6vFxVkxnmueYlLmiP1z4Je7pOJ3k+qW6BnEvbJVs2bIr5nwU/dE8Hj9a1RZpx1TAngkuZFHxOht/j7Zvj2+pTAPpkg3F3QOxH75Bvpvhx89DMB/V7/JoDzXPMSlzRH6jfu8sA+GS/cA6qboGcC9skWzRsuvqfBT93jweP1LQGcdZifuKR50cfl0GscfXt9eCCv64R7SfVN6B6PvDZL12zx3Qp++rsOPF7fHMBZh/mJS5orfQyHXuPo2+ueb9+lVMdBp3V7vQ36qX8c+rzepiAzjnkQly033gv+O9jZfo/7fEGn/y52QLW1eDcBR74D+Dsfcdn+/kZdnnsAOOo2n/H0/bTWX1Pfq6rO2biNws0Xz7xA7uZzv9c3Rplxnjs/gKOeNphvHPV7fX5gv7YX7jfI1esp9bVSbY157DcuBZx5jU8F+KijNebz///hZ/3iVL8noziP552Zive9rf2yU3V9lFn/j9hXnOf+t4HzPOO9Tj7qto6dwNGHeZhz0ufBnIzzfP26+H3wlH5/nxZeUV2vulLV+8/72v0b9PNVmjNX9UnVR7FPuf8937xe3xDAWafnEZf03NGvdV+FPJnHk/BpHHOaD//GMddHkRfP8ZhUXK9z8HpL6GYeY9Dn9ZYFmXHMl7hsz4H3r89BI9XROBfF37Np3+9XbYF9G+Lbj/Oe6/mjLs/dDxx1m894+n5S66+r72VV52zcOuEWiGdOIHfzud/r66LMOM9dEMBRT0vMN476vb4gsF9PF+5a5Or1fcq1ufpbYB77jdsXeB7G78O+MY46vG5efi6uJ1wT1VHQ43nF349q7s+qzcBP3e73HPcTRx3m/z7Aly0v+rHOn4GjX/M1C+RV2vtHdSTmNEFeH2veMeIrBD/1uN9zPk5nxlGH+T/OMwf6sc5jsL/otxl8Ma+0cN1Vr8GclshrmXRVEl9T8FOP+z1nWTozjjrMvyzPHOjHOisBR7+F8MV79DThRoDf84zbLd3ngo/z3Wfe3enMOM41727kk9Q39RtnXn7+PaxfnCz8cOixPn+gc9970vedahPMsf734cM8nvteAEddnvMecNRnHuZHf9b7XYAv2/NgTsY1Cewvz2+tejX0GFesRzyNwRviKx3wk9Q3dXluacyl7ibQyXuonPeh6p+jOI/nGv+5dP2qeg74qYf87vs84M/4z5GzcdTp+b/mmRf9GndOIK+SwnVWfTiK8zRFXh9IV0XxnQ1+6na/53yQzoyjDvN/EODLlhf9WGdF5EW/58AXz1VD8T4Uxfs741ztlZ6zwMf57jPv3nRmHOead2+evqnfuLOy+G6l+qcozkPfpcRzJnhDfKUCfpL6pi7PLYW51H0WdPJ8lBVvN9UHozhPK5yPz6TrBPE1Aj/1uN9zPktnxlGH+T/LMwf6sc4TgKPfM+GLeRWIt47qA1GcpxvyWi79W1XPAD/1kN99y5GD5xi/HM/FOOr0/K0Bvmx50a9xZwTySom3rur9UZynDvL6Qrq2q54Ofup2v+d8kc6Mow7zfxHgy5YX/VjnduDo13zG8x4yb6HqH6M4j3Gec1i1IXhDfIeRb65+qMtzDwNH3eZrGNgnx4m3l+p9UZynEPtkpeZVFV8D8FOP+z1nZTozjjrMvzLPHOjHOqviOdFvQ/hiXseLt63qvf5+L4rPNX6VdJUV32ngpx7yu29VwJ/xq/BcjKNOzy8LXNK86LcBfDGvKuJtoHpPFOdpi7zWycce1frkhx7yu28d8vIc49fhuRhHnZ6/J8CXLVf6Nc68vIc8v4Pq3VGcxzjrqSCeU8Eb4qsQ8JPUN3V5bgXMpe760Ml9cox4a6n+IYrzdMA++VC6tqjWAz/1kN99Hwb8Gf8hcjaOOj1/S5550a9x9QJ5lRJvb9W7ojhPLeT1kXRVE98p4Kdu93vOR+nMOOow/0cBvmx50Y91VkNe9FsPvphXNfGeq3pnFOfpjbw2SNcvqnXBTz3kd9+GgD/jN+C5GEednv9LnnnRr3Hm5T3k+R1VF0VxHuOsJy2ek8Eb4ksH/CT1TV2em8Zc6q4LndwnJ4l3oOpgzOmIfbJNuuqI7yTwU4/7PWdbOjOOOsy/Lc8c6Mc66wBHvyfDF/N6QrgX1Pe+qv8O5r+vFf/v2/XzDPHdqRr6u5v5zeP1tQGcdZifuKR/76Mf65yBvOh3AXwxryWa86g/h6Ti855AXmv8d0zxPQEd9Gf+J5DTmgDOOsxPXNJc6cc6xyAv+p0BX8zrcd/zwn+Zis9bgrxW6+crxPcgdNCf+Zcgp9UBnHWYn7ikudKPdV6BvOh3DHzx3l6sOc/6fZuK6zdulX6eirn0Y77HkcuqAM5zzUtc0hyp3zjz8u8/j6l/qfCfqK5Oxfms030r9fMi8d6ruhjz6MPzFiOPlQGcdXkOcUnzo5+p0Gscc7CvRcAxp8XIgfvrUem5NRWf8xh0rtDPF2IufZvvMeS3IoDzXPMSlzRv6jfOvLyHHlH/8/73tup/ARtONDh4nJ2ca7BW5XmGMSQc1LAB007+aJIWkM7U1ESxJtImGjSxiUbHVk4bMCAolDExzLRVREajIihpRNNRDuoE8JA6owgoJ9FUFBHDSYMCWm1m2tpUAUnHqLRDZ8p9rZl94du1WP65x1nX89z387K+j29/z2bN7d3t//5b0nFYP3VYur2W/5/x6cO6NDo8uivXPxl+cUfXPlx/rcAt7921vzn6zO39//vu6f3xHHnh8IPnOv49wzH/xHCrov/Su2ufxTqvV/P/N6bfP6q/55uoPlx/tcCRg/7mmp6r55ihvHCem+s3Fs7r8nAro88rN3PA70yumen3E/X3fJerD9d3Fjhy0N9c03P1POScqfPyvDdqrh7duvITwv1YeckP96vkGSFfzzNB9Vz/VYHDl77mmp6j88ONKNwn48PNi76mPBN0n7wSv870+5n6O/d49eH6KwWOHPQ31/S8PMcI5YXz3FzvLJzX98I9HN2o3ON1Xi8n17T0u0P9Pd/31IfrLxc4ctDfXNNz9Rydygvnubk+rfC6uozXqfKSH25H8oxSP89zmeq5vqPA4Utfc03P0fnhRhXuk3HhFpBTeS7TfbI9fhPTb5H6O/c49eH69gJHDvqba3penmOU8sJ5bq5PLJzX2HDLeJ9Q7nE6r23JNT397lN/zzdWfbi+rcCRg/7mmp6r55iovHCem+vTC6+rMeGeUV7yw21Nnjnq53nGqJ7rWwscvvQ11/QcnR9uTuE+6Qy3MPoL5Rmj+2RL/Cal323q79yd6sP1LQWOHPQ31/S8PA85J+k+8bxzNJfPa3S4e6K7lLtT5/XL5JqQfouVw/ONVh+u/7LAkYP+5pqeq+ch5wSdl+edpLl8XqPCPRh9SblH67xeSq6r0+8flMPzjVIfrr9U4MhBf3NNz9VzTFBeOM/Ndfz9PjSSz03KS364zckzVf08z0jVc31zgcOXvuaanqPzw00t3Ccjwt0V3aw8I3WfvBi/sen3U/V37hHqw/UXCxw56G+u6Xl5HnKO1X3ieadqLp/X8HBLo79W7hE6r03J9f30e0Q5PN9w9eH6pgJHDvqba3qunmOs8sJ5bq5/v/C6ujTc3ysv+eFeSJ6R6ud5LlU9118ocPjS11zTc3R+uJGF+2Re6u/jc5ryXKr7ZGP4yem3QP2dm/704frGAkcO+ptrel6eY6TywnluruPP3N2jV4dbF32qd9frZ6Xulugs+VFHH/NwTxW4Uj/4WerXK1wP8euju6PvRveqH3X0uzW6JPpkdFXLfHDrda72g3O+WfKH2605ndsc8z9Z4Hw+qzS/X1fwv3/sYT05OvjYrn3g6fNW9L3ogcJ8dXnMkeOtAudcq+QP53neU244z3tAc/n9F/7M6FdUD0f9J/oc1u59Pj5nnX/Jl77mnId++MM5P9fp6/sE/mvR86LfVB94+vSO9o3203k0zWOOHL0LnHN1lz+c5+mr3HCet5/m8n0C3xkdo3o46gdFTy7krPMv+Q4qcM7TT/7Vz13Kf7Lyem74KdG/Vj0c9adHh7T0L/meXuCc52T5wzn/EOX16wP+h9FroteqDzx9hka/ER3WMo85cgwtcM41RP5wnucbyg3neYdpLt8n8DdHb1E9HPXfjV5UyFnnX/L9boFznmHyh3P+i5TXn2vgZ0fnRu+M3qV+1NHvkujw6Jjo2Jb5zJHrkgLnfBfJH87zDVd+OM8/RvPB+XzGan7fX/D3Ru9TffU+mPoro5ML89T5l3yvLHDOM1b+cM4/WXl9f8E/EH04+nh0ufpRR78fRKdFr4vOaJnPHLl+UOCcb7L84TzfNOWH8/zXaT44n88Mze/7C/6Z6C9UD0f9nOhthXnq/Eu+cwqc88yQf/U9u/Lfpry+v+BfiG6Kbo/uUD/q6Dcvemd0QXRhy3zmyDWvwDnfbfKvvj/RfHcqP5znX6D5qp/zdT4LNb/vL/jXo2+oHo76B6IPFuap8y/5PlDgnGeh/OGc/0Hl9eco+Dejb0f/Q33g6fNw9PHo8pZ5zJHj4QLnXA/KH87zPK7ccJ53uebyfQK/P/qe6qv3jdSvia4t5KzzL/muKXDOs1z+cM6/Vnk9N/zB6H+rHo7656LPt/Qv+T5X4JxnrfzhnP955fXc8D2OO6w9j+taD0f9tuj2lv4l320Fznmelz+c829XXs8N3y/aX/Vw1O+Jvt7Sv+S7p8A5z3b5wzn/68rrueEHRAeqHo76vdF9Lf1LvnsLnPO8Ln8459+nvJ4b/ovRP1F99T1r6j+IftjSv+T7QYFznn3yh3P+D5XXf//BD4meFR2qPvD0ORT9VPYLPTra5TFHjkMFzrno10N7Ds9DzkPq53npU83V7eP5YdFzVQ9HfZ9oh86pqX/Jt0+Bc54e8odz/g7l9X0C/xfRv4peqj7w9PlM9HPRz7fMY44cnylwztUhfzjP8znlhvO8n9dcpX0Y+5gnC/sw9jQ36Hv1q1XH9bPENd2HOccN4vzn/ZT2KPuiz6oPvPdNq6NzC/PV5anebxvutZ5UvpKv55irvPaFXy1fnxc8e5A/in6kPvDeI/02uqFlHrim+yrnWi1/OM+xQXntC/9b+fq84NmXfDX6JfWBP2KvFD3YMg9c0/2Vc9HvoPp5juq6+nlurncvfD6BZ3/yLdd361rPfqW/zqupP1zTvdYReeyvfvD91c/3CTz7k7HRC9UH3nulwdHPtsxTfW+r8y/tr5yrv/zhPMdnlde+8IPl6/OCZ88yNTpBfeC9jzojekrLPHBN917ONVj+cJ7jFOW1L/wZ8vXrCp69y3TVV58nU89e5tyW/nBN92HOc4b83Q/+XPXz96rw7FVmRW+IXqd+1HkvdXH029HzWuaDa7oHc75z5Q/nec5TXjjP/23N53zwFyuf7y949i4/VT2c91rjWvrDNd2bOc/F8nc/+HHq5/chePYq90fvVp/q312kD/uXKdHxLfPANd17Odc4+cN5jvHKa1/4KfL1fQLP/mSF6uG8n7q+pT9c0/2X80yRv/vBX69+vk/g2Y/8U3Sl+sB7r3R7dGbLPHBN91fOdb384TzHTOW1L/zt8vV5wbMHeTm6UX3gvW9aFL2jZR64pnst57pd/nCe4w7ltS/8Ivn6vODZl/xzdKf6wHuv9FD0/pZ54Jrur5xrkfzhPMf9ymtf+Ifk6/OCZ3/ym+i/qg+8908roo+2zAPXdM/lXA/JH85zPKq89oVfIV+/b8Ozdzmg+up9KPXsZda19IdruudynhXydz/4dern+wSevcv/RN9XH3jvozZGn2mZB67p3su51skfznM8o7z2hd8oX58XPPuaXnzPrT7w3mPtiG5qmQeu6b7MuTbKH85zbFJe+8LvkK/PC549zwnR49Wn+nfL6cM+6I3ozpZ54Jru2Zxrh/zhPMdO5bUv/Bvy9XnBsx8aFD1Jfarfe0gf9kj7o2+3zAPXdD/nXG/IH85zvK289oXfL1+/b8OzRzpV9dX3xalnz/RRS3+4pns859kvf/eD/0j9fJ/Asx/6s+iX1Afe+7We0YMt88A13eM5F/0Oqp/n4HpP9fPcPbWX83nBs0c6L/rn6gPvfVvfaC+dX9M8R7vXc66e8ofzHL2U177wfeXr84JnTzY8er76wHsv94XoCS3zwDXd/zlXX/nDeY4TlNe+8F+Qr/eEV7F/ia7RnvDM7A9+FL1J+wbq6GMebk2BK/WDv0n9/D0i/NP8e9fob6L/qX7U0W929K7oiujKlvngnta52g/O+W6SP9yLmtO5zTH/igLn81mp+f26gu+Vz1kDogOP7doHnj47onuj+wrz1eUxR44dBc65Vsq/+vyoefYqN5zn3ae5jvh9nnBDomeoHo76Q9Fu/L19lP4l30MFznn2yb/aOyg/1w8V7hP4odFh0XPVB54+PdK3T7SjT7s85sjRo8A5Vzf5V39Pah5y9hDneTs01xG/1xLukuio6Gj1qX6vJX1OjA6IDizkrstjjhwnFjjn6pA/nOcZoNxwnneg5jriuSThJkWvjE5WH3j6nBr9cvS0Qu66PObIcWqBc66B8ofzPF9WbjjPe5rm8vsQ/N9E/1b1cNR/PXp2IWedf8n36wXOeU6TP5zzn628vk/gZ0ZvjP5IfeDpc370O9ELWuYxR47zC5xznS1/OM/zHeWG87wXaC6fF/yPoz+J3qE+8PQZER0VHV3IXZfHHDlGFDjnukD+cJ5nlHLDed7RmsuvK/gF0YWqr94nUj8xOqmQs86/5DuxwDnPaPnDOf8k5fV9Av+z6KPRx9Snel5t+kyNXhO9tmUec+SYWuCca5L84TzPNcoN53mv1Vw+L/h10aei69UHnj63RGdFby3krstjjhy3FDjnulb+cJ5nlnLDed5bNZdfV/BboltVD0f93dF7Cjnr/Eu+dxc457lV/nDOf4/y+j6BfyW6K7pbfeDpc290cXRJyzzmyHFvgXOue+QP53kWKzec512iuXxe8L+O/lv039UHnj6PRB+LLivkrstjjhyPFDjnWiJ/OM/zmHLDed5lmsuvK/i90X2qr94vU78qurqQs86/5LuqwDnPMvlXPy8r/2rlPeL3osP9V/TD6EfqU/1edPqsjz4b3dAyjzlyrC9wzrVa/nCe51nlhvO8GzSXzwv+GPYQfF/K9986L/psjm6Jbi3krstjjhybC5xzbZA/nOfZotxwnner5vJ5wX+a73n5Hld9qvf59Hk1uiu6u5C7Lo85crxa4Jxrq/zhPM8u5YbzvLs1l9+H4P8g+oeqr95XU/9O9N1Czjr/ku87Bc55dssfzvnfVV7fJ/CDo38cPUV94OlzIPp+9Hct85gjx4EC51zvyh/O87yv3HCe93eay/cJ/JnRr6gejvpPZL/RvePjc9b5l3zpa8556Ndd+xjn5zp9PTf82dFzVA9H/XHR4zV/U/+S73EFznm6yx/O+Y9XXr8+4L8VvST6l+oDT5/+0ROjJ7XMY44c/Quccx0vfzjPc6JyV9+Xat6TNJfvk6u0N1obna/nonrPdnP0cn0PfpXquX6muKZ7vPnKVfJ1/pvVz/fJGu2J3om+pT7w3qc9Ef25zqNpHrime7u1ylfy9Rw/V177wj8hX58XPHueQdHfO7ZrH3jvyfZH32yZB67pPs65npA/nOd4U3ntC79fvkf8Xk449kF/qvrq5xXty47p084fruk+znnod4w45+d6t8LnE3j2OjxX8WvqA+89mZ8jebR54Jru45zrGPmbq3vepefuK1/fJ/DsdTpVX33uTD17n9LzKev84Zru35o+F9P5B6mf54ZnXzNF9dV9n3r2OaXnU9b5wzXdozV9Lqbzn65+fn3As5/5u+gP1Qfee6xzoqXnU9blgWu6L2v6XEzPMVR57Qt/jnx9n8Czn7lJ9dXnrdSzv7mwpT9c0z2a85wjf/eDv1D9/PtI8Oxd5kV57uNs9aPO+6vOqJ8jebT54Jruy5zvQvmbq3vepecfrvmcD75T+Xx/wbPXWaT66v0l9ex9rmjpD9d0r+Y8nfJ3P/gr1M/3Fzz7mWVRnvv4gPpR573X9KifI3m0+arvjfXnUdqzOd8V8jdX97xLzz9N8zkf/HTl8/0Fz57nadXDeT82u6U/XNP9m/NMl7/7wc9WP99f8Ox1tkV57uML6ked92Dzo36O5NHmg2u6d3O+2fI3V/e8S89/p+ZzPvj5yuf7C5590B7Vw3mvtrSlP1zTvZ3zzJe/+8EvVT9/joJnz8NzFd9UH3jvyfwcyaPNA9d0H+dcS+Vvru55l577cfn6PoFnH7Rf9dX7YOrZF5WeT1nnX/18qz+n0j6u6XMxnX+N+nluePY6B1UP5/1Y6fmUdf5wTfdvTZ+L6fzPqZ/nrvZr/DsL/j2J5vaeq/R8yjp/uKZ7tKbPxXT+bernueHZu/RTffU+l3r2MqXnU9b5wzXdhzV9Lqbz71E/zw3PnmWA6qv3tdSzhyk9n7LOH67pnqvpczGdf6/6eW549idfVD2c906l51PW+cM13Ws1fS6m83+gfv77D579yVejQ9QH/oi9kp4j6edT1uWBa7q/avpcTM9RPedS/Tz3J7W34j75X1BPKdx4nJ2dWaxW5RWGTbQyyKm2mjQRpMZSBQcE2sZoUhG4MHVKS2kvWhlFnBgVUXFAkNlZmcRqRQWnVtEqs4oVsIOK2sYqUFITFdMqoqBYcOgF6/mT8+Dq/s7uzZvAs9b7rt3975+zV8/X/fbZ858TD9ijvUP7hJ4Uul9w+x64R9uFNoXud2Bz7kTXH9i8Hg4/ePeH2yuP/dUPvkn9WgX3DfH9Qn8Repr6wNOnY+h3Qw+pmQeun66/feCcq0n+5pjHOe1rDt/992nOz48L+FDow6F3tmrODY1+l4SODT1X9xN19B2acPal71BxznOu/OGcf6zyem74J0OfUj0c9deETqjpn/lek3DOM1b+cM4/QXk9N/wzoc+qHo766aEzavpnvtMTznkmyB/O+Wcor+eGfzH0JdXDUT8ndG5N/8x3TsI5zwz5wzn/XOX13PCbQv+pejjqF4U+UNM/812UcM4zV/5wzv+A8npu+C2h76kejvrHQ5+o6Z/5Pp5wzvOA/OGc/wnl9dzw20I/Uj0c9StCV9b0z3xXJJzzPCF/OOdfqbyeG3536Oeqh6N+bei6mv6Z79qEc56V8odz/nXK67nh92+9R1u1bl4PR/0roa/W9M98X0k451knfzjnf1V5PTf8QaHfUj0c9RtCN9b0z3w3JJzzvCp/OOffqLyeG75D6GGqh6P+3dAtNf0z33cTznk2yh/O+bcor+eG7xzaRfVw1H8cur2mf+b7ccI5zxb5wzn/duX13PA9Qn+gejjqPw/9oqZ/5vt5wjnPdvnDOf8Xyuu54XuF9lZ947ka9Qe026Pt2tXzz3zpa8556Ic/nPPz9/T13PB9Q3+uejjqO4QepvlL/TPfDgnnPO3kD+f8hymv54bvHzpA9Y3PY9QfFdq5pn/me1TCOc9h8odz/s7K67nhh4Wep3o46ruFdq/pn/l2Szjn6Sx/OOfvrryeG35c6GWqh6P+lNBeNf0z31MSznm6yx/O+Xspr+eGnxR6nerhqD8j9Mya/pnvGQnnPL3kD+f8Zyqv38vBTw+dHTpHfeDp0zd0YOigmnnMkaNvwjnXmfJvvC/QPAOVG87zDtJcvk/gF4YuUj0c9aNCRyc5q/wz31EJ5zyD5A/n/KOVN/64MT/84tCnQp8JfVb9qKPf+NAJodNDZ9TMZ45c4xPO+UbLH87zTVD+xntAzT9d8zXeM+n6zND8e70PC25r6Ieqb9zfUb8sdHkyT5V/5rss4ZxnhvzhnH+58vr+gt8Vujv02DZ79Lg2zftRR781oWtDPw3dWTOfOXKtSTjnWy5/OM+3VvnhmNvcpwmH/05xvr/ge4aOVj0c9W2a9uhJTV8/T5U/HH7w7g/nPPQ7KeHo65z+nmNPwXv7R0IXhv6mVXPe+4xLQ0eFDtPPHdR7H2KudG/iXMPkD+c5RimvfeEvla+vFzzv+5eEPqY+8N6DXBt6Rc08jeds4b7FuS6VP5znuEJ57Qt/rXz9uYJnT7Ba9XDem8ys6d/4XivcyzjPtfJ3P/iZ6uf7BJ49wcu8b1UfeO9P5oXeXDMPXOmexrlmyh/Oc9ysvPaFnydfXy949gubQ99QH3jvXR4MvbdmHrjS/Y5zzZM/nOe4V3ntC/+gfP25gmcv8bbq4bynebSmP1zpHsh5HpS/+8E/qn6eG569xMeqh/OeZlVNf7jSPZDzPCp/94NfpX7+fMCzl/gi9FP1gfe+5oXQ1TXzNN5fFu6FnGuV/OE8x2rltS/8C/L19YJnn9E6dN/WzfvAe8/zWuhLNfPAle6TnOsF+cN5jpeU177wr8nXnyt49iDfVj2c90KbavrDle6dnOc1+bsf/Cb1830Czx6kY+gh6gPv/dB7oZtr5oEr3UM51yb5w3mOzcprX/j35OvrBc/+5OjQTuoD773SjtCtNfPAle6vnOs9+cN5jq3Ka1/4HfL15wqevcsPVQ/nPdSXNf3hSvdczrND/u4H/6X6+T6BZ+/SJ/RH6gPvfVRT6Fc188CV7r2ci35fqZ/n4O+b1M9z8/f4+nrBs6/pF/oT9Wn870CjD3udjqEH6/qV5oEr3Zc5V5P84TzHwcprX/iO8vX1gmfPMzD0V+rTeG5FH/ZBXUI71cwDV7pnc66O8m+8H9ccnZTXvvBd5OvnEDz7ofNVD+d9WY+a/nCl+zjn6SJ/94PvoX6+T+DZD10eOkJ94L036x16Qs08cKX7OefqIX84z3GC8toXvrd8fb3g2SNNDr1afeC9bzsr9NSaeeBK93rO1Vv+cJ7jVOW1L/xZ8vXnCp690lzVw3kfN7imP1zpvs95zpK/+8EPVj/fJ/DsjR4Ina8+8N63jQkdWjMPXOlez7kGy7/xvkRzDFVe+8KPka+vFzz7odWhD6kPvPdwM0MvqZmn8d5Q/71l+z7nGiP/xvtTzXGJ8toXfqZ893p/Ghx7o22hb6lP4/1p9GG/tCL0kZp54Er3es41U/5wnuMR5bUv/Ar5xh83nkfw7Ie6hh4Rekib5v2o8z7us9D3QzfXzAdXuv9zvhXyN8dczgl3hK6D53I+c+Tj/tpX/GjV8ffey33WQj+40n1fV+Wxrz9X8+IPFvH+lvezoXfovdiQ+PlmdOiY0ItDz9HPR9TjMyThnIP+Q8Q51znybzz/NM8Y5W483zXvxZrL1wt+Me99Q/+gPvD0GR96VejVSe6qPObIMT7hnOti+cN5nquUu/EeXfNerbn87yH4VaFPqx6O+qmh05KcVf6Z79SEc56r5Q/n/NOU1/cJ/LrQv4T+VX3g6XNL6KzQ2TXzmCPHLQnnXNPkD+d5Zik3nOedrbl8veDXh24I3ag+8PS5I/T+0IVJ7qo85shxR8I512z5w3me+5UbzvMu1Fz+XMG/E/qu6uGofyx0cZKzyj/zfSzhnGeh/OGcf7Hy+j6B/3fo1tAP1QeePk+GLgtdXjOPOXI8mXDOtVj+cJ5nmXLDed7lmsvXC35n6H9Dd6kPPH2eC30+dE2SuyqPOXI8l3DOtVz+cJ7neeWG87xrNJc/V/D78fNE6+b1cNS/HLo+yVnln/m+nHDOs0b+cM6/Xnl9n8C3C/1m6IHqA0+f10PfCH2zZh5z5Hg94ZxrvfzhPM8byg3ned/UXL5e8N8JPTS0va/bPs37vBX6dug7Se6qPObI8VbCOdeb8ofzPG8rN5znfUdz+XMFf2ToUaqHo35b6EdJzir/zHdbwjnPO/KHc/6PlNf3Cfxxod1Cu6sPPH12hu4K3V0zjzly7Ew45/pI/o2fWzXPLuWG87y7NZevF/yPQ3uGnqI+8I0+8fNtm9C27b4+d1Uec+Sgvznnol9b/fzuecjZSpznbau5/LmC/2noz1QPR/2hoe11nUr9M99DE8552sofzvnbK6/vE/hfhv469Gz1gafP4aHfDz2yZh5z5Dg84ZyrvfzhPM/3lRvO8x6puXy94IeEDg09V33g6XNsaNfQ45PcVXnMkePYhHOuI+UP53m6Kjec5z1ec/lzBT829FLVN963Rf3JoT2TnFX+me/JCec8x8sfzvl7Kq/vE/grQq8Nnag+8PTpE3pa6Ok185gjR5+Ec66e8ofzPKcpN5znPV1z+XrBzwy9LfR29YGnT7/Qs0P7J7mr8pgjR7+Ec67T5Q/nec5WbjjP219z+XrBLwi9N/Q+9YGnz0Whw0NHJLmr8pgjx0UJ51z95Q/neYYrN5znHaG5/ByCXxm6SvVw1E8JnZrkrPLPfKcknPOMkD+c809VXt8n8BtD/xP6vvrA02dh6FOhS2rmMUeOhQnnXFPl33hvqHmeUm44z7tEc/l6wX8v9j5dQo9mL6brRZ8PQreH7khyV+UxR44PEs65lsgfjjncb3vC0XeHOO/t4Eeojr+n7oSm/58r84Nz/x3qa46+9vdzgf0Xex3O5Zuv91Tej2XnFFLnvZq50v1b6fmIzn+J+nluePY1T6oeznuu7JzCKn+40j1a6fmIzn+N+nluePYzz6gezvur7JzCKn+40v1Y6fmIzj9d/Tw3PHuWF1UP531Vdk5hlT9c6T6s9HxE55+jfp4bnv3JJtXDee+UnVNY5d/4firca5Wej+j8i9TPc8OzL9miejjvk7JzCqv84Ur3VaXnIzr/4+rnueHZe2xTPZz3R9k5hVX+cKX7qdLzEZ1/hfp5bnj2GbtVD+c9UHZOYZU/XOmeqfR8ROdfq36eG579Befy7dbc3u9k5xRW+cOV7o9Kz0d0/lfUz3PDs4c4SPVw3udk5xRW+cOV7otKz0d0/g3q57nh2S90UD2c9zLZOYVV/nCle5/S8xGd/13189zw7BM6qx7O+5bsnMIqf7jSfU7p+YjO/7H6eW549gI9VA/n/Up2TmGVP1zp/qb0fETn/1z9PDc87/t7qb7xfIl69gHZOYVV/nCle5jS8xGdH45+nhue9/t9VQ/n/Ud2TmGVP1zpfqX0fETn76B+nhue9/T9Vd/43EY97/Gzcwqr/OFK9yml5yM6/1Hq57nhef8+TPVw3ltk5xRW+cOV7kVKz0d0/m7q57nhed8+TvVw3kdk5xRW+cOV7jtKz0d0/lPUz3PD8958kurhvH/Izims8ocr3W+Uno/o/Geon98rwvP+e1bodPWB9z5hQGh2TmFVHrjSvUXp+Yieo6/y2hd+gHx9n8DzPvx+1Tc+n3o/P7KmP1zpnsJ5Bsjf/eBHql/8cWN+eN5/Px3K+X+L1Y867wumhfo8wZbmgyvdTzjfSPmbqzr30PNP0HzOBz9N+Xx/wfPe/APVw3n/sLSmP1zpfsN5psnf/eCXql+8Bm88j+B5j35MaCed/7dLfan3fuGT0K2hPl+wpXnhSvcazrlU/uaqzkHk77kenguuk66fr4PnMMcc3qccrX3KMdqneO/xSQv94Er3Kccoj339PTcr/uBvoX8PXcl70FbN+QHx88JdoXeHTgkdqJ8nqMdnQMI5B/0HiHOugfKH8xxTlBfOc9+t+fx5nK2+/wp9NXRZ6P28b27VvN55Hw69M3RS6MjQQco7J5nfXOl1cs5B8ofzXCOVF87XYZLmcz6u38NJPl/fO3XdfD/PUc7fh94XOlf3s+e9LHRE6GDlmZtcL3Ol19W5BssfznOMUF77wl8mX3+vzlVffn+Q30uEc67s9xTnJfOYK5279PcjnX+0+nluzk3lXNR7ee5obp+rOjz0PPlT5/NYzZWe2+o858nf/eCHq58/H3eJ/13oozz/9Pmw77jQy0PPV567k9zmSudzrvPl737MMy7p53kv11y+Xr9lTxL6Suhzoffoel0Qfa4LnR96feiFykM9PhcknHPQ/wJxznWh/OE8z3zlhvO812suX697xL8e+o/QBbpezndP6ILQi5RnQTKfudLr4FwXyd/9mOeepN9e82ou//zIfcvnmPOJOX/4cd3X1Plz7vOMr9R9Xfq8aOnnqfR86dLzlz3vOM3jfvBXqt9eP6fre3FpKL//ze+VL9J19vfsxFD/3rl/v77q+6il3+st/b3+qt+P93WYmPj6Oo3XdfC/j3lO83xdEfqn0D/rOcZzjXo/3yeH3hZ6u55Tfv7Rz98X5kq/V0qfu553ctLP81+nueB83W7T9YDzdb1d18ufA/59yL/PXwj9o+4H7g/q/O/9W0Nv0P3Q0n+PtvTni9L71vNMVF77ch1uTXx9nW7QdfD3IM8vnk/P6/7gfoH3c+5G/fft+6jq3zEtfZ6W3r+e58akn+edrLn83OB5zvnznL/O+epr5EsO6n1Ov89tv0n+Lf0+gSv9/wcovU6l5+6Xnkvv63Sj5nc/+JvUz88Nnv98nvgccC4G521w/gh1/r7gc+PzOHw+Sem5LFXfT3Cl56KUPjdKzxfxdbpF/bjO/wMS9EmqeJydm3v01/MdxyOqjW3WWNg5c51zFm07k7u2c0aW3TCK2Nkll7nsSqgpLBlTKhUq3WVKRVQ0EZVVKmwIM9ewEbWbCmfYH54P53jsvPd9f/jn6fR9fl7v1/P5eb9f79fn/fn82rV5778727+HS4P3BR8OPhtcEWyX6wZv8x5eGRwWHB+cERwZ3KrNB8dhXMeBd6fGJc5g8e5T/s7HPHSNL/Csd6T0wLM/M6T/I+Hl5zZL8j/Lg2uCfw4+FFwZXNb+g9cPTdyrgpOC1wfHBkcHRyjfJYrL70PFIz/4HhfeMuVbGtd6JxXirZQP1gPPfo2VD/Ds7/XyDV+3DjI//hB8MPiE5g185s3w4JjgVM0D8iEu4/j6pvP0QeXrPOA9IT3O0zyPO7Xg14L8w5+Cz+s+L5dfgxLnuuBM3Q/PhwWKw++DxGN8+B6n6Ty0npmFeNY7SbrsF/WEerE2uD54v/xy3ZkVvCM4SvmsUBx+d/2trW/Oa5TGdzz0zCrEs947pKtDeOwvrG/W7yvBdcGXgk9qX3I9mBucF7wlOO1D1pWHNC5xxhbikffcQrwnpaeU30vSbz3w7NM8+eB9ifXO+n8m+GLwVd1f7jfXu05MD94cnK/77HnRqu7U7rfwnpEe5wXvRel13k3nt32aJf0eF/58jet1QH2h3rwW/LfmF/ON61yPbg/erfnQdN+srX9N14H13V6IZ91zpQuefbpbPngd/F71jjr1enCL3JiPBP+odXCJ6jL1bVFwVfCR4Djly7jk4Xjw+J3xiXOJeLX123rGKU/Hw49FhXj2a5V8gGc/H5FP3j9ZN/8Kbgpu1HqCz3q6K3hv8J4PuS7hMT58jwPPec3X+PA2SZfzNY+494jnukEf81zwheC7WmesO66jz7kpODt4v9aP1yXjMK7jNO2vnPfsQrzaumH990sfPPtzu/Tb57W6z9yfd7Re1stn7w/czxVaL15ftftMq36r6TytXf/WvUi6PC78FRrXPlPvqedvBDcHN6jv4TrvD0uCi4MLgvOUX6s+qul+tE55lsbdIF3O0+Piw5LCuPZpsXywz4u1v1CfPxfcLfiYfB6ifY16/vfgq8HJyo9xGNdx4PE74xJniHi1+5l1TFaejof+vxfi2Z9Xpd/9xsL8z6PBL+S6g4N7B6lb1EOuvzRxJwbfIJ9t38ONqm+um4xLHo4Hb6HGJ86lhXjoeKMQr7auWz+8jeLZr43yAZ795Xfy9Dqg/rMfQPgo+lSPuM77xcrgo1p3TfvV2v2paX2wniXK1+Piw8rCuPbpUflgn9kH6G/eDrYNccvgO/LZ/c/y4APB1YV9p1UfVbs/wXtb+TsfeOiB73zhWe8K6XE8+KsVz/Vms+YD92eb4Lasi+CbqjfeN7iva4KPBR8MLm24D8Hjd8YnzmLxauctcdBVym8r+WA9Hhff1hTGta+PyS+vg9c137ivHwt+KshzE9e5v2IePB58OrhK+dX2abXPc7Xz1jpWKU/HQ//jhXj252npZ/7yXPhI/uHw8LsH2R/Yx+BPSJyPZ7/4hPYN72/EJw6/TyjwyIP45tXuq9YB7xPaB62b3xnf85L+iL7mG8FvB7/D/VF9dj+1feJ3Cu4YnCIdjEc8fnffWNu/OT/i7ShfrI98Hc/60bO94tmfHaXf9Zn5Tl3vEOxIPsEdtC643vX/4eBTwWeCz2p91O4nTddlB+lxXvA6Sq/zhmfdj0sPvO3lm/WbR9xnxfP9oQ+lz/xicBfuLwsn+K72T/evbwZfCa5Vn+S+qvb8orZvru3nrGul8oVnH9ZKHzz79or8sA74b0qH61Qbjb9T8NPar9m/uc56Xgg+p/3a+3urPrepf7V9hfWsUb7wrP856XN+8F9Qft4/t1HcTuxf6nfgO7/ng0+ob6ztm5r6sK3yK437celxnh7XPMb1vKReUWd2D+4R3FX9C9e5vr0WXB9cV+ibWvVDTeup83ta4zse+l4rxLPuddIFzz6tlw+el9Tzzwb3VD7kB586/3Jwg+KX9pXSfgGP8eF7nKZ+7Sldztc8x4P30fCYn1vovnI/9g9+PXhEkPMtzsOI4/6d+9kmfc4ng9sFS+dnrd4HNX1+qD23q53f9gd95tkvxt1O/aF9xqc24vk+bCdf3adQn6jn+wS7BPcK7qw6xvXeJzYFNwf/EXxR9by2Pjbdnzop39K41rupEG9n+WA98PaSb9YPz/5ulm/eD9hv6X8OCh6g/NHz/nsm9VNtc/+32Pb/6221vzft32p9tj7ydTzrJt4WWgf2id/bFtYBdZC62DnYNbhf8EDtM1zv+vl68J3gu8EtM37T/au2bsNznus1PrzO0u384XWVL9YHbz/5Zv3mkSd5vVtYB7tKD9cdEjxU9Zbr3C8wztbBdoU6Wtt31Nb52vthHW2Up+OhHz2OZ3/aSb99Zl2xbr4S7Bb8kuoX13kddgi2D76lfaG2HjZd912UZ2ncL0mX8/S4+NBBdRSefWpvH8Kjn6Te8bz6o+BRqoPw/dy7d+LupLrW9Lm5tu46T8Z3POffVnnCs15+37swL6kXhwWPDPbQOmBdcB315GOJ+6lgR60Dr5tW9Qke+cD3eE3Xq/VsrXzhHSk/rM884nYUzz4foPvH/Tkh2FPrgeu8v3I/dw/uovVQu083XYe18886OihPx0P/7oV49mcX6ff6P0T3pXfweNVr+J4HewR3K+wPrep+0/nmvNppfMdDzx6FeNa7m3R5XnbT/cLnXsGjg1/VvHQd5r7sGtyZfrBhPYfXTeMSp/2HnG9flZ5SfkdLv/V4XPMY133w/rrP3J8zgucEfxbkeZPr3a9wX/cNdgseqOfSpv1P7fNw7by1nk8qT8fDj30L8exXN/kAz34eKJ+8Dlhf1PXjgicGf6j1x3Wu+58N7hnsrPVXu380XffHKX/nA+9E6XO+8Kx3D+lxPPidFY9jKNYD7/c4l+E85VvBC4IXBgcEvxnkvR/x/H0X5zKfDnYP9ggeEdwh6PeFrb4fa/qesvYcyj6Qv3n2YXvpgWffdpB+ePa9u/yD5/vSQ/7C8307Qv573VFH2edPDvYJnqQ6y3XuA7oE9wl+TvtRbd2u7Tvg9VKepXGtr0sh3knSbz3w7NM+8sH7D/0WzwdnBn8Z/LnyI1+u93NE1+AhwYM0vnXV9nutnl+a+mm9XQvxrL+LdMGzb4fID3j29SD55XVAHf1B8PTgT4Nnqc5yHXX288EvBw8I7leo24zDuI5TW9/hna78nQ886+isPOH9VD5Yl3nE3U88+0yf0Vt5cP3Z6kO4zn208z600Ie06seb9j+1+3Ktz9a7r/Q4HvxDFc/1hrrEemId/CrYP9g3eIrqjesZ6+fw4GHBrwS/0LA+wuuj8Ymzj3i19eEU6SrlZz8OL8TrK7+sG559PUx++b0j36fx/dlPgkOCw4K/Cf4iyHfbxPH3bfsHewZPCB4dPJi8lX+r78Lh1X5f53y38viKh37ydzz701N64f2PX9IPz/4eLb/g+X6cIH/dX+8t3eQxNDgieKn2RfZJziOJ5+/40dMreGLwKO2DpXPMVt8Twav9e4La89Pa+VDbL9i/rvLB4+J/r8K4vi9HyV94vo8n6n54v6Nus0/2Cw4MXqS6/v65sPbRrwW/HjyysE+02o9r9xN4/ZS/84FnHYcqT3gD5YN1mUfcI8Wzz9Rz+r7hwauCl6nec537wt7Bk4LHqI7X9pdN9xnn3bsQzzoOV57wrPsY6YJnn06SD+4rztB95v78NjgmeGWQcyCud3/DfT022Cd4fLCb8q3tl2rPqWrnrfV0U56Ohx/HFuLZrz7yAZ79PF4++fy9v+YH9/+K4MUdPsh3n8I8OS74jYZ9Drz+Go84h4lXO58vlo5SftZ7nOK5blBnBgevDY7TfeS+ch116DvBHwVP0X0s1b9SXYNHPvA9XtP5dq10Om941n2sdJlHXOu3z/y9xcTgpODYIP1dd/nM32OcHjwjeLL6v6Z/32EeeZ1e4NX2qdazv/KFZ/0nSx88+3WG/PD65zxxfHB2cEKQc0T4nDOeFjw/+OOgzxdrzyudx2kFnvPqrvHhWc/5yhue9f5YuuwX57Ocl04PzgrOlF8+xz07eF7wXOVTew48s8ArxSPPswvxrOM85QvPOs+VHu//nJPzPon3O9cFb9Z9Zx5wvb/b5L3QqcF+uq+eL62+A216nl/7fqx2PtuPUwvx7Fc/+QDPfp4mn1xn2f/o524KTgmO1P7Ide4P+wbPCn5PfUHtftu0H71CeZbGtb6+hXgjpd964Nmns+SD6wbvf1ivrJ9bg/zd2/vf5SeO1/UFwU7Kp/Y9U+3f4dXWF+ffSXk6HvwLFI95Bf/b4t9GH9LhgzyPNyDov1Ns9XeFTfU4nx01vuPBH6B4Xo+X5x9GB6cF5wRvCF6t9fjdxPt+8GfBXwV/HvyB8mMcxnUceJdrXOJ8V7xpyt/5wLtaekr5zZEP1gXvBvlk3faZfpW+9MbgjOC84Bj57P72l8FzghcG+yi/2ue32n7a+fXR+PBulE7nDW+GfLAu8xj/QvG8/7O/8RzMc+nc4O+Dk7UPcr2/A+F5dmDwkuCZhf2w1XclTffh2ud66xxY4Fn3qdIDzz6dKf3w7Osl8sv7Es8dPFfcGbw9yHk2fD+fDA5eHOypfGrP4Wufg5xXT43veOgZXIhnvRdLl9/DcH7Mue+C4B+C9wVvCXJexnkdcXz+PCg4PDgs2D9YOt+rfb9de/5de65o/YMK8exDb+mCZ9/6ywd49nu4/IPn+zFM/no/4Nyf9ztLgsuCdwQ5z+c6vy8aGhwR/HWwl/Krfe9U+z7CeQ8txLOOXsoTnnX/Wrrg2acR8sH7wXDd59XBR4JLg/TX9O1c7/lzTXBC8Mpgqb9vdX7ddN7WPldYV1/l63Hx5ZrCuPbrSvkAz/5OkG9eB5yrcB7yYHBNcDn7vtaBz2HGBCcFrwr2UH6136nVnvs4vx4a3/HQN6YQz7qvki549mmSfPA6oD+gf6OfWhz8c/CP6iO43uf69GFDgtcHx2n/r31P0LSPqe1HrWeg8nQ8/BhSiGe/rpcP8OznOPnk+zNA84j7vyr4VHBFcLruj7+jZN5cHfxdcGTQ52ytvstser5Xuy6s52zl6Xj4cXUhnn0aKf3w7Ovv5JfrFP0H79XvDz4efEb9Cdf5Pf2o4JTg9EI/Ufu+v7Yvct6jCvGsY5DyhGf9U6QPnv2ZLv32mb6C71lWBp8IPqu+g+v8fczo4NTgDPUJ5Ff7nU1tv+O8RxfiWcdQ5QnP+qdKHzz7M0P67TPPMzyHPBR8UfkPk89+/hkbvFl5Nf1OqenzVq3P1je2EM+6R0sXPPt0s3ywz/S99LUPBF/Sehwhn90nXxu8Reus6fc/Tfvy2rphfdcW4ln3KOmCZ59ukQ/ePzkXp9+lT306+JfgQtaR9k+fp9Pf3hi8IXhp8CfKd4ri8vtZ4rU6x4c3VfmWxq3t8xfKB+txPHy7sRDPvt4gv7wOOMe7N/h8cK36LvowruOc74rgzOAs9V3u01qdG8IjH/ger2l/+Lx0Om941j1EuhwP/izFs8+cQ/E+/rHgy8GHg3fKZ7/fnxy8LTg+OFj51X4nUHs+5rwnF+JZx2DlCc+6x0sXPPt0m3ywz5yfcj76QvD14HPsD/LZ562zg4uCNwX7Kb/ac9va97bOe3YhnnX0U57wrPsm6YJnnxbJB58X833JP4P/0vxgvsDnu5OFwbt0H5t+v2IeeSws8Grnr3VMVr7wrPsu6fO85DmK5591wVeCT1JHNC/93DUvODc4LXie8qv9jqP2Oc/5nafxHQ998wrxrHuadMGzT3Plg+cl5zl8z/PX4MYg5zPw/Z3PnOA9wTHKp9V3Qk3PlZznnEI85z9GecKz3nuky/0Z34dQR6gT/w7+TfmRL9f7uxLqy93BWzW+ddV+n9Xqe5amftbWT/txd4Fnn+ZIPzz7eqv88nxmP+A93qPBzdon4Pt94MTgYtXzpu8Ta/cl5zmxEM86FitfeNY5W3pcZ/m+hDpFfdkU/BO+q876+zXq0b3B64L+/qPVd3DwWn330rTOWscFyhOedV8nXR4X/r0a1z7PZz0E1wffCm6gj5DPFyXeZcE7gvcFFwQvV36Mw7iOA2++xiXOReKtV/7OB94i6Snl95Z8sC54G+STdXv936r790bwzSDfE8H3PFgSXBps+l1S0/nmvAZofMdDz5JCPOtdKl32i/dmvO99h4mbjW+1/PL75RXBlcFrlE/t++na93fOc0UhnvO/Rnma53jwvP/z/oX3If8JdgzxbdVz6jvX+73NsuBTweWq602/U2n6vqh2/7HeZYV41j9RuuDhl+M9VYgH3z75/nBOyvM0z8ttQ/xMcMvgQ7o//o6F5+wHgi8FVwfHKt9W38U0Pc+tPR+wnrHK0/Hw44EW8fDLuuHxu+PBp5z8FwnTNBZ4nJ2dZ/iW5XnGwYGADJUhCA40iamxMZpYqCZm2LTRLE3rylTT7MQmqUnapkkaP4aNICCKqCBLFNCMuhmy995bGWpFAygI2A+cv/9x+DP38Txv/HIe//c+n/O6zut97ue51ystmh37748tj+GsYKtWx/DMYNvgwrS3yHW/bXMMBwSXB3cGVweHBk9o9s44xLUOPNqJi85vC3rkvbygZx9DlSc8fFtvZ0EPvn0nTFO9/pQPNgWb57oPB1sGn1ed74jeuOD84JHgsmB/5Uc89Gi/Qzzyge948Jxff8W3Hv7mF/Twbd6RQlz49u06z8gHy4Ntcl2v4AnBjapz3+jdG1wVPK7tMVyUv8cqP+IQ1zrwaCcuOn0LeuS9qqBnH+gtKvDwbz/waHdc+Pm42UnB2Ym7MnhWCO8NXhTsyvfb8p3XD4z+fcFdwVeDB4Pbg0OUL/HRpX2geOQH33HhOc8him89/O6q0KMO9gOPelnvVfEuUn1dJ/eDaflgW/DtYM9c3yG4Vv2gd/QeDs4NNs99sDF/P6j8iIce7b3FIx/4jgfP+aG3saCHv7kFPXybhy/HhW/frvN69Wv628XB84Ivqc5j9DyhP74VfCX4e/kgDnGtA4924qIzRry6zxF08FPK72I9Z+0L3nmqk337eTM98TcHTwnhI8Eeem/P0vOmT3THB9cFjwZf0jjG4wfio0t7H/HID77jNjpusd91Bb1WqoP9wKNe1jsqXg/V13VyP9iaD/YGO+a6j6rfbVM/mBi9J4Kbgi3S70r9eav0aJ8oHvnAd7xGnyP4Qtd5w0MH//YDj3Z07d91npcPdgQ75bqPBU8NrlGdB0f3keDm4EmJsz5/P6D8iIce7YPFIx/4jgfP+aG3vqCHv80Vevi3H3i0W++kQp3n5IMNwXa57hPB9sE9qvOg6D4UXBNsnThr8/fjyo84xLUOPNqJi86ggh55ryno2Qd6a8XDt/Va6/3ZXnWyb9d5puYpjPcvC57D80d17he9d81DEm9P/p4jH8QhrnXg0U5cdPqJV3dehA5+SvnhG137gneO6mTfrvPcfPAC78Vc9/fB9wdXq853Ru/R4NLg8Yn3ev6+Xz6Ihx7td4pHPvAdD57zQ+/1gh7+lhb08G3e8arz+1Un+2Z8cWKQ+QPj/yvUb+iX8D3PaBn9Un+dr+cS7Z4f1Z3P1H1OtJMf5wmPduLbl+vFegzrKZ/R9/KC6uV1m9OiW/qeF+q+p93rUnXXh+reXyfJj/OERzvx7cv9eHE+OC78TwbP1/tth/rx8OguCJ4c/dc0HvD7lXjo0T5cPPKB73iNvtfxha7zhtdJ/u0H3vmql/27zks0n2VeeEbw08HDqvPd0fN8dUewfeLOUn7EIa514NFOXHTuFq/u/Bkd/JTywze69gXv06qTfbv/Mw5kHPc5zU82q/97vNg5uqV5Efro0O5xbt1xad352Cny4zzh0U58+3K9eP/xXvoH1imYP6hefk+2i25pXRZ9dGj3+73u+7juenBz+XGe8Ggnvn25Hy/gg/DfF7wqyHrncvXju6I7L7g32CFxSuuyxEOP9rvEIx/4jtfoejC+0HXe8NrIv/3Au0r1sn/XeVE+2B9snes+G2R9c6XqPCy6zwZXBDslTml9lXjo0T5MPPKB73iNruva34qCHr7N66T311mqk33ztfIcWJX4rwfPDuFTwUuCp+ND62CjovtUcHewTeIezt9bg1Pli/jo0j5KPPKD77jwnOdUxbcefndX6FEH+4FHvazXRt/PJaqv6+Tn8zLVh3w+z/yh1Tv596jO5Hl64ixU3ugSx9fDo5146NzzV9b/ePko5fd53X/24/t5aeIe4L0Vwt8Frwx2D76p+3lE9J8LLg42S7y2wRfz+XTlS1zysB482omPzoiCHj4WF/TsB70XxaMO1mum+7S76mXf8K5UfV0nP9dX5IMjwX/KdZcHWwTf0HN9ZOLODp4a/RODS/L5NOVHPPRoHyke+cB3PHjOD70l4uELXedtPfzbDzza0bV/13ldPtgd7Jzrvqjv/4DqPDpxHwtuCXZNnNL9RxziWgfeOvVPdEYX9Mh7S0Gvbv84Uf7tBx7tjtu18LzZkvj7gl1C+FDwC8wPg3/W82ZC9J8JbgseCnZJ3JX5+2nlS3x0aZ8gHvnBd1x4zhO9lQU9/G6r0KMO9gOPelnvkHhfUH1dJ/cD7iPWo1lP/sfg1fq+uY77zOvXpyROx+AW5bdH/c46jd7fddfT8QPf+cLrLN8lH1erTvbtccpO3Yd879cEL9U4ZYruZ+6HM6L/tvJBlzi+Hh5xzLNe3fv8GvVf5+m48O3D9+WL8sP112qcv1/P58lt/rKvbolXmj8Qh7jWgUc7cdGZ/FfWue78prX82w+8a3U/2b/rvF3vf963X9LzZp/qPEnjCd7H3ROn9LwjHnq0TxKPfOA7XqPP2brjEnzDty94XVQn+6ZO8F9L3H/WPIh5Frwnc/2Z0SvNu9DjetqfLPCIi655ded7tFtvd8E3423Gy/8SPCjfHo+fFd0Zio8e19PueUbd8b7zmaH45qHrPO37d+HNhM/zoJV0c32/4OTgFMVHB11f1/QcK/BKeuQ1uaDnvKcoTz9P+oe3lPdZ62O4m/4ZHKPxxE3RG8G4M/hY8OHgvym//tKj/SbxyAe+48EbozxLce1vcUHPvh+Wr6bxt+r0mOrgOg8IbznvaZ4nwdnB8arzl6N3b/Dp4FPBgcF/V34DpEf7l8UjH/iOB2+88izFtZ+BytdxqcPThbiu01Oqg8dtA8NbGHwt+FZwnMZtX4nOUJ6zweeDP1U+A6VD+1fEIz58x4HnvH6q+NbDz5MFPft9Xr5crz7hTQ0eDjbP/b1J9bo+Ov/NPhj7EMFxygdd4vh6eLQTD53rC3rkOaug5/zHKc+m/T35nS9frldvxhmMTxhvBRepXtdF5+7gtOAzwWHKp7d0aL9OPOLDd5ym8VZB75mCHn6mFfTs9xn5ysdNdRuWDx7Ufc79eZT3fnBOq3def2t0f6T+yH09Jzg9OEj5Epc8rAdvmOKjc6t44+THeTXar+17kPzAc52my7/jwp+juH4v9QtvTXBvsFX6w6z8/Xu9l26M3gPBJ4LLgwOCv1F+/aRH+43ikQ98x4OHDnmW4trPAOXruNThiUJc12m56uB+MCQfbA8eCLbL9bvy9wvBR9QPvhHdScHngmuCU4OPBv9D+Q6RLu3fEI/84DsuvEeUbymu/T5X0LP/R+ULnus1VXVoWkdVfdeobu4HdxE3uCHYJtefEFyhfnBz9P4z+FBwVXBRcKTyIw5xrQOPduKic7N4G5S/84FnHyOVp/Xwv6qg5/oskn/XuW901wdb57r2jMvz+VzV+YbojQmuCK4NDg/eqfz6So/2G8QjH/iOBw8d8izFtZ/hytdxqcOKQlzXaa3q4OfNyHzwUHBHcD91jQ7vc97/XP/d6P44+Ejw2eASvfc9TiAueVgP3kjFR+e74u2QH+fV6DjG9Xi2oOd6LVEdmtarVM9pqpPHkXeGt4y65/rjgtM1jvxadO4JLg0uCPZRPuijQ/vXxCM+fMeB57z6KL718LO0oGe/C+TLz41B0WVeyXywba7nfcz7m+u+Gj3PQ1frfe33O3GIax14gxQXna+KV3deXHf8Yd9PyJfjwl+tuK7zA+HPD74dPBJcEByrOv8wekOCc4Ozg3cFf6L8HpAe7T8Uj3zgOx68scqzFNf+5hb07Psu+YLnOs1WHVznweGxzsQ6UofW79Sbrzp/PXpel9qoePYxWHq0f1088oHveI3Wr+56mv1vLPBcn7ny7+fsPeGtDR4MnhKdaXrOfjs6DwZnBNcFeysf9NGh/dviER++48BzXr0V33r4mVHQs9918uV6DQ1/dfD0XMe60kLV65bo3B/cGiytTw2VDu23iEd8+I7T6LqY/Wwt6Nnvk/Llfnwv9Q++GjwUZB7CPIjrvhO9vsH/Dc4MluZJxCGudeDdq7jofEe8V5W/82l0HndIdbAv86w3s1Dn4XoO85ztmO+L+3yt6vxNvX94Lm9SP3C/IQ5xrQNvuOKi803x6r5H6vZr+54hX44Lf5PiprnpOfBwPpgcZN2Q9b4zo3My80LGe7n+59H9r6DXG3cGVwZHKV/ikof14NFOfHR+Lt4i+XFeja6T2vco+bEe9dpZ0HM9V6pO7gcjorsyeHyu6xJkv2S5+sG3ondfcGFwW7C0/zJCerR/Szzyge94je772N/Cgp59Py1f8FynbaqD+8HEfMB6FOtNF+T6cxin5PM/qB/8LLpex9oX3BMcG/wf5TtRurT/TDzyg++48NAh31Jc+xqrfBtdr3Pd9hV4ruse1cv9YFJ0mY8yj+wWZF9nqvrBL6Ln+esLwdJ+0iTp0f4L8cgHvuM1uo9Vd95t37Pky3rwX5Ce6zwqeuxPsP/QPddz3mCm6vz96Hk/48Vg6fzCKOnR/n3xyAe+48Gre26i7j6MfU+WL+s18aXncfd94Z8a/mlBzhk0nV8I/3vRWR/cECyda0AfHdq/V+CRx/oCr+55CvtYrHzh2fcG+fPzeQrjxiDzJeY5ZwV57vM+4fpfRvd3Qc+zdun94PcOccnDevBoJz46vxRvmvw4r0bnh3Xfn67TQvl3XPi7FNfPjfs1PmN8c3aQ9b9lem78QONCxkO7g6X1ROKhR/sPxCMf+I7X6Dpm3fGgfS+VL+vB3y0913l04rKfwz5Mj2Cz4GbV+bboef/npeC84HjlRxziWgce7cRF5zbx6u5H2cd45QnPvufJl+PCf0lxXec/8V4Nsu/bNXgG6wqq8x3R837z9uCO4ETlRxziWgce7cRF5w7x6u5/28dE5Wk9/G8v6Lk+O+TfdX5c9w3fY0vGhfl8nur8a92vfO/Lgo8HByu/x6VH+6/FIx/4jgcPHfIsxa17P6ODf/uxnnnzCnWeoPkA4+4Lg+x77VCdb4+e5wUHgqV9NOIQ1zrwJiguOreLV3eeUnefz76flS/HhX9AcV3nx9Q/6Qd/G2Rfd73q/Cs9F+g3bwRL+8TEQ4/2X4lHPvAdD17d/em6zw37XiFf1oP/hvQ8Hnw+H3Dej/N8Hwx+IMj6LuvBXN8/uj4n+GZwf7C0bkx8dGnvLx75wXfcRter655zdD3eLPBcp63yD8913a96eX7DOQjOL1wU5PwI503g+7zEwWDpHAr66NA+XLy65zLqnn+xj1XK13HhH1Tcd/3eNfG3BF8Odsr1nYOv6LkxOnoTgn8Ibg5uCf5R+RGHuNaBRztx0Rkt3svK3/nAww985wuPePgu+XB9tkjP9yXzeObp5wbPY91W96Xn+y8HXwn6dxtVv8dodF3BeU1RfOvh5+WCnv2+Il/v+v2p5v3M1y8PfiTIPm3TezB6nv+f2O4YHs3fG5Vf1e8sGt0/rrseYV/kaZ79EveoeK7PUfn3fcm6KecXPxT8WJD1Uvg+B3mI+z36+5RP3XOUdddvneehgp7z36c84dkv7YcK9yXnXNgHYJ3/E8Ergm11X/r3JOwLtE68lkGfq6n6XQq8qvM3je5j2Ad6LVU/+8eP9VwfdOB7nMV+Lfu3f5PrLg5+WPcB9wXXe5/3z8G3gkd0//r+qdo3hld1/hce+aPrvBq9v6kDuvYHz3U6JP/Wg39Eeu4He3W/8b1+VvP1VuoHPj/GfdApWJrfV52Dh1f3vFrddYW6/cC+0esknuvUSf3fdeZ8CONkxsGf5Pmedn6PwXU+T8K4+eTE8e81yK/qd13wqs6vwKv6nQg8+5mjfBudN7hO6Owv3M/so3OulnO2VwavCp6p+9m/S+IcbtvE6xDcqfyqft8Er+7+ftW5YPPwRZ7m2S9xO+j7cH1ob1sYb7DuwbrGl5QP+cH3+kh36Tvvuueo667D1K2X/ZCn9ewXve6F9+Cb6j/cz9cHr9b4m/F407/XkPjuT+cEOwZL4/a6vwer2odstJ/XnVfYP7yO0nPd8O+4rmtH1cvfD+uhrO9fEvxo8NLgexj36PvxvsHhYIvEezt//19wmfxXrcc2ul/RUvmW4trv4YLee1QH+4HnuuH/sHiXFnjo+vvhXBrneJk/MT+6KXgt37e+H5+v9rzrvMTvFvS5uKrz2vCqzs/BqzqX3Oh80b6J2039wvXCt/VcT3Tg+717UL657otB9oHZF27698Xa/uV8uwa9b0x+VeeU4dU991i1X91one0bva7iuU5ddR+6zpzX4TzODcEbg6yzNledfb6nR/TPDZbWd6t+7w6v7nmiuuvK9ke+1rNv9M5VnV0n2nsU6sy5J/bf2V+/VXl1U539uyT24y9UPPuo+n0TvKrzWPDqnh+oW2f7x4/1XB/0LizUmXMk9BP6wc1B1hu6qM4+d0K/uUDrEY2e64RX95xL3XWTus8D+24tX9aDf4Gem35/cn6BfQf2FT4V/JzGAYwLuN6/02U/ok3iddZ73uOHqt/9wqs6Z9HoPkrd8Y3rgS/ruU7oddb347rS3qbw/bAP8b5gz+DHg72C56On74f9ir3B5sQJHhd8Le1b5KtqHwQe+cF3XHidlW8pbk/5dv7wzlcd7Afex1U/1wFeL9XXdfJzinNWzKOZJ/+rnos8J7nO5/OZV39Qz0U/R6vO+cOrOv/V6DpA3ee8/ePHeq7PhfLvOrPPzz7+j9Qv6aftVWefC+ip/ub9U/Kr+p08vLrnEKr2ba2HP/K1Xt3nkusED13//+uYZzM/vibIvl7Tvqzm4WcEvX9YtS/Y6Dzf+aB3hnjOn/aOBd+cG74lyD7bafLNOeIPRKe0n1d1DrkUF13z6u4jOn946Pr9wno269W3B2/Tfch9yXkarvc6+BXBXrrPfO6GfKvO9TW6/l513qfRfua64M9xXa+eqgM817eX6paPm55/nBNjn5N9zOuCPw7+JMj6I+uV6Ph3MOyDnh28LHi51iu9vln1+xp4Vefb4NXdx627/ur64M96rld3+YfnOl+musHz94DO/wPPoMh4eJydnHnQVmUZxtE0BQRT9k0EVDTNwMwMBRdMFrcUEbBSSC0nN8AlHStTQdMUSUVNR1RKy70al1JxwUxcp8IFp3JB0JJqcsFMBZuJ6/fN8LNn3ufAP9fM917nvu/rOud57vuc97wM69zuf/82XA3tPhnctsNq3D44MXhy8JDgHh3WPG5Fp9X4XnBg4u8W3DzYMbheuzXzkNdx4G2rvMRZId5E1e964O0hPaX6rHtz6XJe+Hw+sODz0PCGBUcH9w/uF/ycfP4AvYm7abBnsEdwpXwZqnh8/oF41APf+eC5PuL1EG+0dLpuePvLB+syj/w9xLPPO4S3b/Dg4LjgXsFd5fOH0dM9cTcL9gt2Dn5S9e3geJ3XjAePeuA7H7xdVWcp717S5TqdFx/Q5bz2qZ98sM9DdD1wfg4Pjg8Ol8/vR7evn22C/YMbqD7ykNdx4A1RXuK8L17t9Txcekr1WT96HM/+9Jd++7xjeLsEpwQvD14ZnCSfV0XP+om7bXBK8MjgINVHHvI6DrwdlZc4q+TzFNXveuBZxyDV6Xjon1KIZ3+OlP724W0QHBHe7sHJwZuDdwVPCu7D9ZXjN0zcDsFPB08Ofj84IthN9ZKXOhwP3gjlJ86G4k2WHtcFbx/pKtVnP04uxLNPI6Qfnn39vvzyOmB90Q8OCx4RPErrj+PcL7YOfib4Wa2/2r7TdN0fpvpdD7wjpM/1wrPebaTH8eB/VvHsM/s//eCbwROC3wgeKp/dL4YGvxgcEtyiYd+BN055idOvEI+6hxbiHSo9pfqse4h0wbNPX5QP3m/2DO+44PHB76l+9NDHOX6jxP1CcOfgaOUt9fs9FZfPNxKP+uA779rOGa3Oj30YKn3wjpeP9sM84o4Wz+tgbHjcBzDn/zz40+CXtQ66Jp7vG6YHjw/2Vn1jFY/Pu4pHPfCdD57r6638Te93rH96gWd/jpf+/LnN75H5w0HBacHLgvcEf0MfD46hTyZOp8TvG9wlODk4I3h2cPtgF9U/UvH5vJN41Avf+eGNUd2lvNPkg3XAsw/bS5fj4ePkQjz7PEO+wfN5OFu+ev0w39Kf6D8n0u+DU7V+PA/Tr4YHxwaHqb5WczW88cpLnP7i1fZX6xpe4FnvMOmBZ3/GSr99pr8fGzw9+B3VdZR8pv/vFPxScG/lazpPwKMe+M7X1L/TpdN1w7Pu4dJlHnGt3/36gPAODHKfwv3Fr4PMtczLHN8rcfsEfX9zVrA0V5OXOhwP3gHKT5xe4k2SHtfV9L6s9v7Afp1ViGc/T5ZPXgfMZ8xf3w2eETwleLTWgee5UcExwd2DO6i+bygenw8Rr3Z+PFp1lvJa36hCvFOk33rg2acx8sH9ekL+8HX1IfrC3ZoTmBt4XkqcAYm/nfoxfeVMzQ1+vkr9ExSfzweIR73wnb/2uS68I+WDdTTt17Xzlf2dLr+cF/6Zyuv1w5zNfPzD4Pm63rj+2p5rJx7z9PjgwbqOmt4vNb0PqF0X1jNK9TovPowv5LVPB8sH+zw9vFOZt4LnBWcGT5PPuybensH9g+OCBwRHqj7ykNdx4E1XXuLsKt4M1e964J0mPaX6zpMP1gVvpnyybvtM/6fPnxm8IPgDzVkc53lhn+AhwYMKc1vt3NFqvoN3pup3PfCsY6zqdDz0H1KIZ38Okn77zDri+r8oOIv+rv7CcV53k4ITg/uqD9f2q6br/AzVWcp7lnS5TufFh0mFvPZponywz1N1njk/PwlyHzdNPvs+g/N5XLB0XzhV8fjc91219zW196O117P1H1fg2Z/J0m+fWSfnBucErwj+WOuI41hHBwYPD349eITWEfWRh7yO03T9zlH9rgeedRyiOuFdIR+syzziHiGe76d4Hsf3BHwP8HDwZ+q/9GOO57mdv1+4MDhNfdh9m7zU4Xi1zw2bfu9RO1dY/3jpgme/pskH1wf/QtXndcC+xD51XXBe8KrgbK0D72PHBI8NHhU8tOF+CG+W8hJnYiEedR9TiDdbekr1XSX91gPPPh0rH+zzheFdHLw6eENwbvAS+Twh8b4a/GZwavDo4NdUH3nI6zjwLlRe4kwQ72rV73rgXSI9pfpukA/WBW+ufLJu7zf0ZdYT6+XW4C26Xrh+ON5zPevs28FTdJ59nbW6T2g6P9TuD7XrwPqPkS7nxbdvF/La11Pkl9cB/Zx+RB+5KXi9+j3HeT6l75wUPEH9vnbObTpn1PZT6zqpwLPe46QHnv05Qfq9DujT1wbvCN4ZvE31US/H08+/Ffxe8IzgqcpfmidKcwI86oPvvE39vEO6XT886z9JuuDZr1Plg3nkt19eB6w/1s29wfuCt6u/cJzX68zgOcHT1Idr+1XT/WGe6izltb6ZhXi3S7/1wLNP58gH+3y9zjPn8bfBx4OPyGevL877rOClwYsarlN4jxR4jld7nVrXrALPui+VLnj25SLpts83hvfL4APBhcEHg7+Szycm3unB84IXB88Pfkf1kYe8jgPvRuUlzoniPaD6XQ+8X0lPqb6F8sG64D0on6yb/Xj9IOeZ/WZB8FGdf/jery4I/qhw3mv3u9rrbYHqdR3wHpUe12me88JzH+R5AP2V9cZ1vTj4uyDff3O8nyN4nc4Lzg7OUL2tnkvAq/1+vnZeqN1frHuG9Dgefs0rxLOfs+WTr2f6A3PkE8Gn1Dfge76cE7xcfaB2Pm3ap1znnEI81z9TdcKz3suly/ssczn3908GX1Zd1Mlxfl5wWfAm5bOO2vuA2ucTtf5Z32WFeNY9R7rg2aeb5IP3jXt1Xp4NPhN8Ojhf8wjH+3xfE5wbvCJ4rua32jmn6XV2n+ot5Z0vfa7TefHlmkLep+Wb9cOzv3Plm9cB+z/9YFHwueDzmnPannepX1wdvDZ4neac2r7TdL5apPpdDzzruFR1wntOPliXecS9Tjz7/Fh4vw/+KfhS8M/BP8jnSxLvyuD1wRuDNwSvUn3kIa/jwHtMeYlziXh/Uv2uB94fpKdU30vywbrg/Vk+Wbd9fkTnmfPzanCp+i/HeS7nfN4avE39t3a+b9r3a69T67q1wLPeedIDz/7cJv2eN9hf2G9eCS4JvqB5w/vQzcFbgj9puI/Be0b5iDO3EI86by7Ee0E6SvVZ7y3S5T5IX6Vv/j34D9VFnfQFjnc/vit4t/KW+ker+ajpHFDbt2p9ty93FfLar5vlAzz7e7d88/XM75+6dVyN3YO8V8d7ePD5XdRLwZeDpffzWv2+yjzqeKnAq30v0DrOUr3wrPtl6fM+S/97MbgsuFz7EvsUx9Effx68PXin9ptSXy71W3jUA9/5mu6fy6TTdcOz7luly/Hg36l4vi75XQDvr/F+Wp+cp74d1+T79wO8x7Ys+JrqafX7A3jkMc/xat+3s45lBZ51viY93mfZF1j3bwffCf4z+Jr2b473fjI/eH/w18FfqH/V9oWm+9gS1VvK+5r0uU7nxZf5hbz/lG/WD8/+3i/fvG+8qut/RfC94L81h3Cc19MDwQXBh9Zyrmm6fl3fbcrveOh7oBDP+hdIHzz785D022f2mTeCbwXfVV3L5TP70B3B+4IPqi7rIA95Had2/4P3lup3PU19flc+WJd5jgcvf27zm/ft6a/0z22CPYM8N+F5DO+XEMfv69N/3w4uCfr5TdPfCcNr9XsBeK3eg2k6Z9Q+j7Jvl8kH58Xvtwt5fT6WyF/3EZ67ct/Eemf9tU+cfsEeHdc83s9rvU8sCr4efEX1tnr+C4+85jle7X1g7f5mHxYVePbpdemHZx9fkT8+P8wPvLd/j/wizqeDfXR+/H6/n9eT/x3NG9Tb6vcCTeecVr8XbPo9Q+11YZ/eKfDs4zL54/PDumW99Q92DK7K59yncf/X9n2T1vvfgs8GFwZL94mtnlM33Wdq70+t6y7VC88+LJQ+ePbtWflhHfD/Jh2+r6A+8rdj/9T8DN86Htec1/T+u6lftXOrdcxXvc4L/3Hl9Tz1tvjrBtcJ/kdzMMc5/5PBJ4IPB+9Xfa3m6qZ6iUOdpbx8ji7X6bz48GQhr316Qj7YZ+Yu5rCVwY+Cn0ic9+Sz57RHg48FnwouUH2t5r2mc/pK1e964FnHAtUJ7yP5YF3mEfcp8bw//1t6OK5DsGuwd5A+zvG+/yDfM8EXg0sL/b7V/UzTOaPWT+t8psCz7kXSA89+vSgf4NnPpfLJ+zPnc8PwN1Ld6IDPef5j8DnVUbquStcLPPLDd56mvqKDuK7XPMd7ruAX+wv7Tedgp+B68sv70OLg88GnG+5j8NZRPuI8UYhHnYsL8daTjlJ91vu8dHn90/+YKzYP9lJd1Ml+z/GeV94Ivqq8pb7Qqv82nZOa9qNWvtuXNwp57ddi+QDP/r4q39wHue5ZB12CmwUHaN/hOK+TvwT/Glyufad2vTXd77qoftcDbzPpc73wrPdF6XE8+MsVz+ugk84f52dwcOvgwODGWgdeZ5zXN4NvBf8efKHhuoXXSfmJ87x4tdfjxtJVqs9+vFmIN1B+WTc8+/qW/PI66KrzuW1wx+AO6qsc5+tjRXBV8MNCP2/Vp5tej65vqfI7HvpWFOJZ/yrpg2d/PpR++8y62So4JDhUdQ2Qz6yrfwXfD36gupquU3jUA9/5mvo3RDpdNzzrXiFd5hHX+u1ze10PnJ9Dg18J9pPPnj85n1tsvBq3DL6u+mrn2NrndLXXs3UQjzodD/3ocTz7Qxz4ngfZt+i7nwvupP0MvvvxymC7xH9T9bTq5033T9e5shDP9b+pOuFZL5+vLFyXzDs8Pzog+GXVRZ0c5+dRvZKnt/JZR+1zrdo5zHVTh+PV+mzd8HrLZ/vE5+S3z4N1Xr4Q3Dm4nfojx/k8rxNcN/iu5o3aftv0utpadZbybiddrtN58QFdzmuf1pUPH/t/+tW/hgdHBHdTH217/qT9ewPiB9sHV0lHbb+o7d/DVb/rgWcdxGsv3gj5YF3mEbe9ePb58+ENC44Mjg3uFdxFPn+E3sTtFOwa7BxcX/WRh7yOA+/zykucj+TzSNXveuDtIj2l+sbKB+uCt5d8su6P/T/9Os+cn1HBSeqjbf9Pv+Y+zucmwUHqo7XzY9P+XXudWtcmG/9/nnUPki549mUL6bbP7DO7B/cJjg7uoX2I49iHOgS7BTcNdtR+XbuvmUddHQq8nVVnKa/1dVP98PaQfuuBZ582lQ/2mb5K3zxQ+tC7k3x2H+6jukv9o9U81LTvN+1brc6b9XeQPtcHn897F3xmP987OCa4r9bZbvKZ/f5TwS7B7lpnpT5T6h/wqAe+8zXdD8ZIp+uGZ92bSJfjwe+ueL7f4P3Z/YL7B3nvhPdU4PNebY/E6xksvb/S6v1c86iD+ObVvjdjHfB6yi/r5vMeBb96Ki7HMU/3l19+X4f4pTm/1ffh8Fq9F9T0/qLWL+vtpeuAdej9mnV/kPbvtuez2jf6ah9uuv/X7kuup5vyOx78vopn3aMVl+PGSbf7DXH7NexTzkse4my6lrpddz/xrJv9Z0JwovajtufsOX5AcOBa7mfwyAff8eG5nu7K73jwByqedY9SXI6bJN3et4k7SPlr9/vaebJWt+seJJ73Q97D4nkZz7m+GuT9K/h+P47nYVsF39G+1Or9Oni174PVPt9z/cTbSjzr5fMtC371UVyO+xr7ivzy+2rEHxz07xha/e4AXqv34uC5LuINXku/rHewzv9/AR/E+bU=AQAAAACAAABgNgAAMAwAAA==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 + + diff --git a/geos-mesh/tests/data/fracture_res5_id.vtu b/geos-mesh/tests/data/fracture_res5_id.vtu new file mode 100644 index 000000000..0fba5b615 --- /dev/null +++ b/geos-mesh/tests/data/fracture_res5_id.vtu @@ -0,0 +1,52 @@ + + + + + + + AQAAAACAAABADQAABgMAAA==eJwtyMVSFgAAhVFduHDh+Ah2d2GD2I0NdnchJnZiYmCLgYmtKHZid3djgo0dG2f8z918c27B7Jn+LyVzoIX4BBfmk1yET3FRPs3F+AwX57N8Tkv4S+p5fym+wKX5IpfhS1yWL3M5vsJBfJWvaXl/Bb3ur8g3uBLf5Mp8i6vwba7KdziY7/I9DfFX0/v+UH7A1fkh1+BHXJMfcy1+wrX5KT/TOv66muqvx8+5Pr/gBvySG/IrbsSvuTG/4TQN8zfRdH9TfsvN+B035/fcgj9wS/7IrfgTf9Zwf4Rm+FvzF27DX7ktf+N2/J1nZgm0vX8Wd+BY7siddLa/M8/hudrFP4+7chx34/ncnRdwD17IPbmXLvL35sW8RPv4l3JfXsb9OJ7783IewCt4IEfqSv8gXsUJGuVfzYN5DQ/htTyU1/EwXs/DeYRu8EdzIm/Ukf5NPIo382jewmN4K4/lbTyOx+t2/wTewTt1oj+JJ/Eunsy7eQoncwzv4ak8Tff6p/M+3q8z/Ad4Jh/kWXyIY/kwz+YjPIfn6lH/PD7Gcdwya6DzuRUv4HCO0IX+1ryI2/BiXqJt/Uu5HS/j9hzPHXg5d+ROusLfmVdyF17FCdrVv5q78Rruzmu5B6/jntxL1/t78wbuw4m8Ufv6N3E/3sz9eQsP4K08kCN1m38Qb+co3sE7dbA/iYfwLh7Ku3kYJ/NwHqF7/NG8l0fyPt6vo/wHeDQf5DF8iMfyYR7H4/WIfwIf5Yl8jI/rJH8KT+YTPIVPcgyf4qk8TU/7p/MZPqs5sgWaU8/5c/F5vqC5/Xn0ov+S5vVf5nx8hfPzVS7ABfWavxBf5xta2F9Eb/pvaVH/bS7Gd7g43+USXFLv+UvxfX6gpf1l9KH/kZb1P+Zy/ISD+CmX5wr6zF+RU7kSP+fK/IJfahX/K67KrzmY33AIV9M0fyinc3V+yzX4Hb/Xmv4PXIs/cm3+xHW4rn721+MMrs9fuAF/5W/a0P+dG/EPbsw/OYyb6C9/U/7NzfgPN+e//A+qS/z/ + + + 3905.8931117 + + + 5326.4624283 + + + + + AQAAAACAAACgBgAAbgEAAA==eJwtxdciEAAAAEBRUmlpK9q0aEpbey/tTUMb0d57T6VBO+2NSGjvoflDHrp7uYCA/6o40EGu6moOdnWHuIZrupZDXdt1XNf1XN9hbuCGbuTGbuKmbuZwN3cLRzjSLd3Krd3Gbd3O7R3laHdwR3dyZ3dxjGPd1d3c3T3c070c596Odx/3dT/39wAP9CAneLCHeKiHebhHeKRHebTHeKzHebwneKInebITPcVTPc3TPcMzPcuzPcdzPc/zvcBJTvZCL/JiL3GKl3qZl3uFV3qVVzvVaU73Gmc402u9zuu9wRu9yZu9xVu9zdu9wzu9y7u9x3u9z/t9wAd9yId9xEd9zMd9wid9ylk+7TPO9lmf83lfcI5zfdGXfNlXfNXXfN03nOebvuXbvuO7vuf7fuCHfuTHfuKnzneBC/3MRS72c5f4hUtd5nK/9Cu/9hu/9Tu/9wd/9Cd/9hd/9Td/9w9X+Kd/+bf/+K//uRLqf1df + + + + + AQAAAACAAADgBAAAEgEAAA==eJwtxddCCAAAAMAiozSkoaGh0NAeqGhrSNEg7SFkJKFhlIhoaCBUP9tDdy8XEHAo0Ed81EE+5uM+4ZMOdohPOdRhDneETzvSZxzlaMc41mcd53gnONHnnORkpzjV553mdF/wRV9yhjOd5Wxfdo5zned8F7jQRS52iUt9xVd9zWUud4Wv+4YrXeVq17jWda73TTe40U1u9i23+LZb3eY7vut2d7jTXb7n++72A/e4133u94AHPeRhj3jUDz3mR37sJx73Uz/zc7/whF960q885dd+47ee9oxnPed3fu8P/uh5L/iTF/3ZX7zkr/7mZX/3D6941Wte909veNNb3vYv//Yf7/iv//m/d73nfR8ARZMvOw== + + + + + AQAAAACAAADwCQAAXQIAAA==eJxtlaFOK1EQhheFQZCKq1E3+xQN6Zm+QR8ATdKER1iPQVVvVhxxa6rQtNy6DcFhGzwJkhzF9ITO/93kVn3Z7M78Z86XTtP4r7/YN6dfey7enInvvv4Gdx/ih3dx/ybejOKnrfj1UXxYiz97cbMSX96LrzrxzS3yLJBhir4tek1QvzwHXr+IuwG8FDe/wKtd89/faob3E+qAB/H1i7gp4sPEkF/cT8XdQnxzK77qxJf34mYl/uzFh7X49RF9t+LNiAxv4od35PkQ333h27N5cHsu7i/I+/Wf3+nnHbG7F+zuBbt7we5esLunb0exuxfs7gW7e8HuXrC7F+zuBbt7we6e8iyQYYq+LXpNUL88B7t7qjOAl2J3D9l24qbB8xneT6gDHhL6JuRJyGnIbziX4byGORjmY5ibIZthzob5i9093JfY3cP9it09+CB29+DPHF6J3T2wO5bhXoZ7Ge5luJfhXoZ7p29HcXUvw70M9zLcy3Avw70M9zLcO+VZIMMUfVv0mqD+0b0M9051BvBSXN2LbDvx0b14PsP7CXXAQ0LfhDwJOQ35DecynNcwB8N8DHMzZDPM2TB/cXUv7ktc3Yv7FVf3wgdxdS/8mcMrcXUveB//+3XnlnAvuO7cEu4F151bwj19O4rrzi3hXnDduSXc0+5ZievOLeFecN25pzwLZJiib4teE9Q/7twS7qnOAF6K686NbLt/dqSez/B+Qh3wkNA3IU9CTkN+w7kM5zXMwTAfw9wM2QxzFtedG/eCvltx3blxv+K6c8MHcd254c8cXonrzi3pG10/Tpw= + + + 0 + + + 2304.8861143 + + + + + + + AQAAAACAAACAEwAAWQMAAA==eJxd1Vf7CAQYhnEjpKiUWYmiREX29rf33nvvvffee29KoShbpE2plJXxhRy474Oe9+R3Xff1nL/1Cz2/BjgFJ2M9rB99EtaNnX0ifho7+wSsEzv7eKwdO/s4/CR29rH4cezsY/Cj2NlHY63Y2UdhzdjZR+KHsbOPwBqxsw/HD2JnH4bvx84+FKvHzj4Eq8XOPhjfi519EL4bO/tArBo7+wCsEjt7f3wndvZ+WDl29r74duzsffCt2Nl745uxs/fCSrGz98SKsbP3wAqxs3fH8rGzd8NysbN3xbKxs3fBN2Jn74yvx87eCcvEzt4RX4udvQO+Gjt7e3wldvZ2WDp29rZYKnb2Nvhy7Oyt8aXY2QuwZOzsrfDF2NlbYonY2Vtg8djZm2Ox2Nmb4QuxszfForGzN8EisbM3xsKxszcq9P8rHL0h+k/8O5/jZzgpdvbjODF29mM4IXb2ozg+dvYjOC529sM4Nnb2QzgmdvaDODp29gM4Knb2/TgydvZ9OCJ29r04PHb2PTgsdvbdODR29l04JHb2nTg4dvYdOCh29u04MHb2bTggdvat2D929i3YL3b2zdg3dvZN2Cd29o3YO3b2Ddgrdvb12DN29nXYI3b2tdg9dvY12C129tXYNXb2VdgldvaV2Dl29hXYKXb25dgxdvZl2CF29qXYPnb2JdgudvbF2DZ29kXYJnb2hdg6dvYFWBA7+3xsFTv7PGwZO/tcbBE7+xxsHjv7bGwWO/ssbBo7+0xsEjv7DGwcO/t0bBQ7+zRsGDv7VPSf+Hee4hM8Hjv7YzwWO/sjPBo7+394JHb2h3g4dvYHeCh29vt4MHb2e3ggdva7uD929n9xX+zs/+De2Nnv4J7Y2f/G3bGz/4W7Ymf/E3fGzn4bd8TO/gduj539d9wWO/st3Bo7+03cEjv7b7g5dvZfcVPs7L/gxtjZf8YNsbP/hOtjZ/8R18XO/gOujZ39Bq6Jnf17XB07+3VcFTv7NVwZO/t3uCJ29qu4PHb2K7gsdvbLuDR29ku4JHb2i7g4dvYLuCh29vO4MHb2c7ggdvZvcX7s7N/gvNjZz+Lc2NnP4JzY2b/G2bGzf4WzYmc/jTNjZz+FM2JnP4nTY2f/EqfFzv4FTo2d/QQ+A6EeATg= + + + AQAAAACAAADgBAAADgEAAA==eJwtxRFwAgAAAMC2C4IgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCAaDwSAIgiAIgiAIBkEQDPqXDwbeQg474qhjjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrb/87R//eue9Dz765LMvvvrmu//88NMvBz7eBR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2/95W//+Nc7733w0SefffHVN9/954effjnw+S7okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvu+B9fwUXT + + + AQAAAACAAACcAAAADAAAAA==eJxjZx+8AABPhQRF + + + + + diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index ecd29668a..733211c8f 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -83,17 +83,17 @@ def test_getNumberOfComponentsDataSet( ( "PERM", False, ( "component1", "component2", "component3" ) ), ( "PORO", False, () ), ] ) -def test_getComponentNamesDataSet( vtkdatasetWithComponentNames: vtkDataSet, attributeName: str, onpoints: bool, +def test_getComponentNamesDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, expected: tuple[ str, ...] ) -> None: """Test getComponentNamesDataSet function. Args: - vtkdatasetWithComponentNames (vtkDataSet): _description_ + vtkDataSetTest (vtkDataSet): _description_ attributeName (str): _description_ onpoints (bool): _description_ expected (tuple[ str, ...]): _description_ """ - obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkdatasetWithComponentNames, attributeName, + obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected From 2f54610a9395451f459b4b96c78ea3a0bb5cc69e Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:32:48 +0200 Subject: [PATCH 18/57] typo --- geos-mesh/tests/test_vtkUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index 733211c8f..2fa53d9fb 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -80,7 +80,7 @@ def test_getNumberOfComponentsDataSet( @pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PERM", False, ( "component1", "component2", "component3" ) ), +( "PERM", False, ( "AX1", "AX2", "AX3" ) ), ( "PORO", False, () ), ] ) def test_getComponentNamesDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, From 9282283684be9cf63710a48c115b0edda4f5459b Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:45:24 +0200 Subject: [PATCH 19/57] linting --- geos-mesh/tests/test_vtkUtils.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index 2fa53d9fb..617101c61 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -80,7 +80,7 @@ def test_getNumberOfComponentsDataSet( @pytest.mark.parametrize( "attributeName, onpoints, expected", [ -( "PERM", False, ( "AX1", "AX2", "AX3" ) ), + ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), ( "PORO", False, () ), ] ) def test_getComponentNamesDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, @@ -93,8 +93,7 @@ def test_getComponentNamesDataSet( vtkDataSetTest: vtkDataSet, attributeName: st onpoints (bool): _description_ expected (tuple[ str, ...]): _description_ """ - obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkDataSetTest, attributeName, - onpoints ) + obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected From 416ca06eab4ee3468ae4bdeac81b780df1283b9a Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:06:51 +0200 Subject: [PATCH 20/57] Update data test path --- geos-mesh/tests/conftest.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/geos-mesh/tests/conftest.py b/geos-mesh/tests/conftest.py index e40353199..e370393c5 100644 --- a/geos-mesh/tests/conftest.py +++ b/geos-mesh/tests/conftest.py @@ -3,7 +3,7 @@ # SPDX-FileContributor: Paloma Martinez # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file - +import os import pytest import numpy as np @@ -23,7 +23,9 @@ def array( request: str ) -> npt.NDArray: Returns: npt.NDArray: _description_ """ - data = np.load( "data/data.npz" ) + reference_data = "data/data.npz" + reference_data_path = os.path.join( os.path.dirname( os.path.realpath( __file__ ) ), reference_data ) + data = np.load( reference_data_path ) return data[ request.param ] @@ -36,7 +38,10 @@ def vtkDataSetTest() -> vtkDataSet: vtkDataSet: _description_ """ reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() - reader.SetFileName( "../../../GEOS/inputFiles/poromechanicsFractures/domain_res5_id.vtu" ) + vtkFilename = "data/domain_res5_id.vtu" + data_test_path = os.path.join( os.path.dirname( os.path.realpath( __file__ ) ), vtkFilename ) + # reader.SetFileName( "geos-mesh/tests/data/domain_res5_id.vtu" ) + reader.SetFileName( data_test_path ) reader.Update() return reader.GetOutput() From 7adc08b80a054df61c2afa8971595a598fdddeca Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 23 Apr 2025 17:16:30 +0200 Subject: [PATCH 21/57] add tests and update cellTypeCounter filter --- .../src/geos/mesh/model/CellTypeCounts.py | 17 +- geos-mesh/src/geos/mesh/processing/helpers.py | 39 +++- .../src/geos/mesh/stats/CellTypeCounter.py | 89 ++++----- geos-mesh/tests/test_CellTypeCounter.py | 24 +-- geos-mesh/tests/test_CellTypeCounts.py | 178 +++++++++--------- geos-pv/src/PVplugins/PVCellTypeCounter.py | 52 ++--- 6 files changed, 203 insertions(+), 196 deletions(-) diff --git a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py index b8d7b6063..48fa9193b 100644 --- a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py +++ b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py @@ -17,13 +17,13 @@ class CellTypeCounts(): def __init__(self: Self ) ->None: """CellTypeCounts stores the number of cells of each type.""" - self._counts: npt.NDArray[np.int64] = np.zeros(VTK_NUMBER_OF_CELL_TYPES) + self._counts: npt.NDArray[np.int64] = np.zeros(VTK_NUMBER_OF_CELL_TYPES, dtype=float) def __str__(self: Self) ->str: """Overload __str__ method. Returns: - str: card string. + str: counts as string. """ return self.print() @@ -39,9 +39,9 @@ def __add__(self: Self, other :Self) ->Self: Self: new CellTypeCounts object """ assert isinstance(other, CellTypeCounts), "Other object must be a CellTypeCounts." - newCard: CellTypeCounts = CellTypeCounts() - newCard._counts = self._counts + other._counts - return newCard + newCounts: CellTypeCounts = CellTypeCounts() + newCounts._counts = self._counts + other._counts + return newCounts def addType(self: Self, cellType: int) ->None: """Increment the number of cell of input type. @@ -87,10 +87,10 @@ def _updateGeneralCounts(self: Self, cellType: int, count: int) ->None: self._counts[VTK_POLYHEDRON] += count def print(self: Self) ->str: - """Print card string. + """Print counts string. Returns: - str: card string. + str: counts string. """ card: str = "" card += "| | |\n" @@ -105,6 +105,3 @@ def print(self: Self) ->str: for cellType in (VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON): card += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(self._counts[cellType]):12} |\n" return card - - - diff --git a/geos-mesh/src/geos/mesh/processing/helpers.py b/geos-mesh/src/geos/mesh/processing/helpers.py index 2122aedf9..06ae92052 100644 --- a/geos-mesh/src/geos/mesh/processing/helpers.py +++ b/geos-mesh/src/geos/mesh/processing/helpers.py @@ -3,13 +3,16 @@ # ruff: noqa: E402 # disable Module level import not at top of file import numpy as np import numpy.typing as npt -from typing import Sequence +from typing import Sequence, Union from vtkmodules.util.numpy_support import numpy_to_vtk from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, - vtkIncrementalOctreePointLocator + vtkIncrementalOctreePointLocator, + vtkPointData, + vtkCellData, + vtkDataSet ) from vtkmodules.vtkCommonCore import ( @@ -18,6 +21,38 @@ reference, ) +# TODO: copy from vtkUtils +def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: + """Get the dictionnary of all attributes of a vtkDataSet on points or cells. + + Args: + object (vtkDataSet): object where to find the attributes. + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + dict[str, int]: List of the names of the attributes. + """ + attributes: dict[ str, int ] = {} + data: Union[ vtkPointData, vtkCellData ] + sup: str = "" + if onPoints: + data = object.GetPointData() + sup = "Point" + else: + data = object.GetCellData() + sup = "Cell" + assert data is not None, f"{sup} data was not recovered." + + nbAttributes = data.GetNumberOfArrays() + for i in range( nbAttributes ): + attributeName = data.GetArrayName( i ) + attribute = data.GetArray( attributeName ) + assert attribute is not None, f"Attribut {attributeName} is null" + nbComponents = attribute.GetNumberOfComponents() + attributes[ attributeName ] = nbComponents + return attributes + def getBounds(cellPtsCoord: list[npt.NDArray[np.float64]]) -> Sequence[float]: """Compute bounding box coordinates of the list of points. diff --git a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py index a2e10dc3f..2cfb4bcec 100644 --- a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py +++ b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py @@ -2,26 +2,26 @@ # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Antoine Mazuyer, Martin Lemay from typing_extensions import Self -from vtkmodules.vtkFiltersCore import vtkFeatureEdges from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase from vtkmodules.vtkCommonCore import ( vtkInformation, vtkInformationVector, + vtkIntArray, ) from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCell, - VTK_VERTEX + vtkTable, + vtkCellTypes, + VTK_VERTEX, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON ) from geos.mesh.model.CellTypeCounts import CellTypeCounts __doc__ = """ -CellTypeCounter module is a vtk filter that computes mesh stats. +CellTypeCounter module is a vtk filter that computes cell type counts. -Mesh stats include the number of elements of each type. - -Filter input is a vtkUnstructuredGrid. +Filter input is a vtkUnstructuredGrid, output is a vtkTable To use the filter: @@ -38,15 +38,15 @@ filter.SetInputDataObject(input) # do calculations filter.Update() - # get output mesh id card - output :CellTypeCounts = filter.GetCellTypeCounts() + # get counts + counts :CellTypeCounts = filter.GetCellTypeCounts() """ class CellTypeCounter(VTKPythonAlgorithmBase): def __init__(self) ->None: """CellTypeCounter filter computes mesh stats.""" - super().__init__(nInputPorts=1, nOutputPorts=0) - self.card: CellTypeCounts + super().__init__(nInputPorts=1, nOutputPorts=1, inputType="vtkUnstructuredGrid", outputType="vtkTable") + self.counts: CellTypeCounts def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. @@ -61,25 +61,6 @@ def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> in if port == 0: info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - def RequestDataObject(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestDataObject. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inData = self.GetInputData(inInfoVec, 0, 0) - assert inData is not None - return super().RequestDataObject(request, inInfoVec, outInfoVec) - def RequestData(self: Self, request: vtkInformation, # noqa: F841 inInfoVec: list[ vtkInformationVector ], # noqa: F841 @@ -96,37 +77,45 @@ def RequestData(self: Self, int: 1 if calculation successfully ended, 0 otherwise. """ inData: vtkUnstructuredGrid = self.GetInputData(inInfoVec, 0, 0) + outTable: vtkTable = vtkTable.GetData(outInfoVec, 0) assert inData is not None, "Input mesh is undefined." + assert outTable is not None, "Output table is undefined." - self.card = CellTypeCounts() - self.card.setTypeCount(VTK_VERTEX, inData.GetNumberOfPoints()) + # compute cell type counts + self.counts = CellTypeCounts() + self.counts.setTypeCount(VTK_VERTEX, inData.GetNumberOfPoints()) for i in range(inData.GetNumberOfCells()): cell: vtkCell = inData.GetCell(i) - self.card.addType(cell.GetCellType()) + self.counts.addType(cell.GetCellType()) + + # create output table + # first reset output table + outTable.RemoveAllRows() + outTable.RemoveAllColumns() + outTable.SetNumberOfRows(1) + + # create columns per types + for cellType in self.getAllCellTypes(): + array: vtkIntArray = vtkIntArray() + array.SetName(vtkCellTypes.GetClassNameFromTypeId(cellType)) + array.SetNumberOfComponents(1) + array.SetNumberOfValues(1) + array.SetValue(0, self.counts.getTypeCount(cellType)) + outTable.AddColumn(array) return 1 - def _computeNumberOfEdges(self :Self, mesh: vtkUnstructuredGrid) ->int: - """Compute the number of edges of the mesh. - - Args: - mesh (vtkUnstructuredGrid): input mesh + def GetCellTypeCounts(self :Self) -> CellTypeCounts: + """Get CellTypeCounts object. Returns: - int: number of edges + CellTypeCounts: CellTypeCounts object. """ - edges: vtkFeatureEdges = vtkFeatureEdges() - edges.BoundaryEdgesOn() - edges.ManifoldEdgesOn() - edges.FeatureEdgesOff() - edges.NonManifoldEdgesOff() - edges.SetInputDataObject(mesh) - edges.Update() - return edges.GetOutput().GetNumberOfCells() + return self.counts - def GetCellTypeCounts(self :Self) -> CellTypeCounts: - """Get CellTypeCounts object. + def getAllCellTypes(self :Self) -> tuple[int,...]: + """Get all cell type ids managed by CellTypeCount class. Returns: - CellTypeCounts: CellTypeCounts object. + tuple[int,...]: tuple containg cell type ids. """ - return self.card + return (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON) \ No newline at end of file diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index 6abaf1090..eb58977f4 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -63,10 +63,10 @@ def test_CellTypeCounter_single( test_case: TestCase ) ->None: filter :CellTypeCounter = CellTypeCounter() filter.SetInputDataObject(test_case.mesh) filter.Update() - card :CellTypeCounts = filter.GetCellTypeCounts() - assert card is not None, "CellTypeCounts is undefined" + counts :CellTypeCounts = filter.GetCellTypeCounts() + assert counts is not None, "CellTypeCounts is undefined" - assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + assert counts.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) @@ -77,12 +77,12 @@ def test_CellTypeCounter_single( test_case: TestCase ) ->None: counts[index] += 1 # check cell type counts for i, elementType in enumerate(elementTypes): - assert int(card.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + assert int(counts.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." nbPolygon: int = counts[0] + counts[1] nbPolyhedra: int = np.sum(counts[2:]) - assert int(card.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." - assert int(card.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + assert int(counts.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int(counts.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: """Generate test cases. @@ -110,10 +110,10 @@ def test_CellTypeCounter_multi( test_case: TestCase ) ->None: filter :CellTypeCounter = CellTypeCounter() filter.SetInputDataObject(test_case.mesh) filter.Update() - card :CellTypeCounts = filter.GetCellTypeCounts() - assert card is not None, "CellTypeCounts is undefined" + counts :CellTypeCounts = filter.GetCellTypeCounts() + assert counts is not None, "CellTypeCounts is undefined" - assert card.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + assert counts.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) @@ -124,9 +124,9 @@ def test_CellTypeCounter_multi( test_case: TestCase ) ->None: counts[index] += 1 # check cell type counts for i, elementType in enumerate(elementTypes): - assert int(card.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + assert int(counts.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." nbPolygon: int = counts[0] + counts[1] nbPolyhedra: int = np.sum(counts[2:]) - assert int(card.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." - assert int(card.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + assert int(counts.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int(counts.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." diff --git a/geos-mesh/tests/test_CellTypeCounts.py b/geos-mesh/tests/test_CellTypeCounts.py index cdf2ab484..b6634a45e 100644 --- a/geos-mesh/tests/test_CellTypeCounts.py +++ b/geos-mesh/tests/test_CellTypeCounts.py @@ -47,22 +47,22 @@ def __generate_test_data() -> Iterator[ TestCase ]: strict=True): yield TestCase( nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa ) -def __get_expected_card(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: +def __get_expected_counts(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: nbFaces: int = nbTri + nbQuad nbPolyhedre: int = nbTetra + nbPyr + nbHexa + nbWed - cardExp: str = "" - cardExp += "| | |\n" - cardExp += "| - | - |\n" - cardExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" - cardExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" - cardExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" - cardExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" - cardExp += "| - | - |\n" + countsExp: str = "" + countsExp += "| | |\n" + countsExp += "| - | - |\n" + countsExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" + countsExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" + countsExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" + countsExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" + countsExp += "| - | - |\n" for cellType, nb in zip((VTK_TRIANGLE, VTK_QUAD, ), (nbTri, nbQuad,), strict=True): - cardExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" + countsExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" for cellType, nb in zip((VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON), (nbTetra, nbPyr, nbWed, nbHexa), strict=True): - cardExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" - return cardExp + countsExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" + return countsExp def test_CellTypeCounts_init( ) ->None: """Test of CellTypeCounts . @@ -70,14 +70,14 @@ def test_CellTypeCounts_init( ) ->None: Args: test_case (TestCase): test case """ - card: CellTypeCounts = CellTypeCounts() - assert card.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" - assert card.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" - assert card.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" - assert card.getTypeCount(VTK_TETRA) == 0, "Number of tetrahedra must be 0" - assert card.getTypeCount(VTK_PYRAMID) == 0, "Number of pyramids must be 0" - assert card.getTypeCount(VTK_WEDGE) == 0, "Number of wedges must be 0" - assert card.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" + counts: CellTypeCounts = CellTypeCounts() + assert counts.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" + assert counts.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" + assert counts.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" + assert counts.getTypeCount(VTK_TETRA) == 0, "Number of tetrahedra must be 0" + assert counts.getTypeCount(VTK_PYRAMID) == 0, "Number of pyramids must be 0" + assert counts.getTypeCount(VTK_WEDGE) == 0, "Number of wedges must be 0" + assert counts.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" @pytest.mark.parametrize( "test_case", __generate_test_data()) def test_CellTypeCounts_addType( test_case: TestCase ) ->None: @@ -86,29 +86,29 @@ def test_CellTypeCounts_addType( test_case: TestCase ) ->None: Args: test_case (TestCase): test case """ - card: CellTypeCounts = CellTypeCounts() + counts: CellTypeCounts = CellTypeCounts() for _ in range(test_case.nbVertex): - card.addType(VTK_VERTEX) + counts.addType(VTK_VERTEX) for _ in range(test_case.nbTri): - card.addType(VTK_TRIANGLE) + counts.addType(VTK_TRIANGLE) for _ in range(test_case.nbQuad): - card.addType(VTK_QUAD) + counts.addType(VTK_QUAD) for _ in range(test_case.nbTetra): - card.addType(VTK_TETRA) + counts.addType(VTK_TETRA) for _ in range(test_case.nbPyr): - card.addType(VTK_PYRAMID) + counts.addType(VTK_PYRAMID) for _ in range(test_case.nbWed): - card.addType(VTK_WEDGE) + counts.addType(VTK_WEDGE) for _ in range(test_case.nbHexa): - card.addType(VTK_HEXAHEDRON) + counts.addType(VTK_HEXAHEDRON) - assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" - assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" - assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" - assert card.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" - assert card.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" - assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + assert counts.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert counts.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert counts.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert counts.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert counts.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert counts.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert counts.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" @pytest.mark.parametrize( "test_case", __generate_test_data()) @@ -118,22 +118,22 @@ def test_CellTypeCounts_setCount( test_case: TestCase ) ->None: Args: test_case (TestCase): test case """ - card: CellTypeCounts = CellTypeCounts() - card.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - card.setTypeCount(VTK_QUAD, test_case.nbQuad) - card.setTypeCount(VTK_TETRA, test_case.nbTetra) - card.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - card.setTypeCount(VTK_WEDGE, test_case.nbWed) - card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - - assert card.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert card.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" - assert card.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" - assert card.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" - assert card.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" - assert card.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" - assert card.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + counts: CellTypeCounts = CellTypeCounts() + counts.setTypeCount(VTK_VERTEX, test_case.nbVertex) + counts.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + counts.setTypeCount(VTK_QUAD, test_case.nbQuad) + counts.setTypeCount(VTK_TETRA, test_case.nbTetra) + counts.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + counts.setTypeCount(VTK_WEDGE, test_case.nbWed) + counts.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + assert counts.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert counts.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert counts.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert counts.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert counts.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert counts.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert counts.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" @pytest.mark.parametrize( "test_case", __generate_test_data()) def test_CellTypeCounts_add( test_case: TestCase ) ->None: @@ -142,32 +142,32 @@ def test_CellTypeCounts_add( test_case: TestCase ) ->None: Args: test_case (TestCase): test case """ - card1: CellTypeCounts = CellTypeCounts() - card1.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card1.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - card1.setTypeCount(VTK_QUAD, test_case.nbQuad) - card1.setTypeCount(VTK_TETRA, test_case.nbTetra) - card1.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - card1.setTypeCount(VTK_WEDGE, test_case.nbWed) - card1.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - - card2: CellTypeCounts = CellTypeCounts() - card2.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card2.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - card2.setTypeCount(VTK_QUAD, test_case.nbQuad) - card2.setTypeCount(VTK_TETRA, test_case.nbTetra) - card2.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - card2.setTypeCount(VTK_WEDGE, test_case.nbWed) - card2.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - - newCard: CellTypeCounts = card1 + card2 - assert newCard.getTypeCount(VTK_VERTEX) == int(2 * test_case.nbVertex), f"Number of vertices must be {int(2 * test_case.nbVertex)}" - assert newCard.getTypeCount(VTK_TRIANGLE) == int(2 * test_case.nbTri), f"Number of triangles must be {int(2 * test_case.nbTri)}" - assert newCard.getTypeCount(VTK_QUAD) == int(2 * test_case.nbQuad), f"Number of quads must be {int(2 * test_case.nbQuad)}" - assert newCard.getTypeCount(VTK_TETRA) == int(2 * test_case.nbTetra), f"Number of tetrahedra must be {int(2 * test_case.nbTetra)}" - assert newCard.getTypeCount(VTK_PYRAMID) == int(2 * test_case.nbPyr), f"Number of pyramids must be {int(2 * test_case.nbPyr)}" - assert newCard.getTypeCount(VTK_WEDGE) == int(2 * test_case.nbWed), f"Number of wedges must be {int(2 * test_case.nbWed)}" - assert newCard.getTypeCount(VTK_HEXAHEDRON) == int(2 * test_case.nbHexa), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" + counts1: CellTypeCounts = CellTypeCounts() + counts1.setTypeCount(VTK_VERTEX, test_case.nbVertex) + counts1.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + counts1.setTypeCount(VTK_QUAD, test_case.nbQuad) + counts1.setTypeCount(VTK_TETRA, test_case.nbTetra) + counts1.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + counts1.setTypeCount(VTK_WEDGE, test_case.nbWed) + counts1.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + counts2: CellTypeCounts = CellTypeCounts() + counts2.setTypeCount(VTK_VERTEX, test_case.nbVertex) + counts2.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + counts2.setTypeCount(VTK_QUAD, test_case.nbQuad) + counts2.setTypeCount(VTK_TETRA, test_case.nbTetra) + counts2.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + counts2.setTypeCount(VTK_WEDGE, test_case.nbWed) + counts2.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + + newcounts: CellTypeCounts = counts1 + counts2 + assert newcounts.getTypeCount(VTK_VERTEX) == int(2 * test_case.nbVertex), f"Number of vertices must be {int(2 * test_case.nbVertex)}" + assert newcounts.getTypeCount(VTK_TRIANGLE) == int(2 * test_case.nbTri), f"Number of triangles must be {int(2 * test_case.nbTri)}" + assert newcounts.getTypeCount(VTK_QUAD) == int(2 * test_case.nbQuad), f"Number of quads must be {int(2 * test_case.nbQuad)}" + assert newcounts.getTypeCount(VTK_TETRA) == int(2 * test_case.nbTetra), f"Number of tetrahedra must be {int(2 * test_case.nbTetra)}" + assert newcounts.getTypeCount(VTK_PYRAMID) == int(2 * test_case.nbPyr), f"Number of pyramids must be {int(2 * test_case.nbPyr)}" + assert newcounts.getTypeCount(VTK_WEDGE) == int(2 * test_case.nbWed), f"Number of wedges must be {int(2 * test_case.nbWed)}" + assert newcounts.getTypeCount(VTK_HEXAHEDRON) == int(2 * test_case.nbHexa), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" #cpt = 0 @pytest.mark.parametrize( "test_case", __generate_test_data()) @@ -177,20 +177,20 @@ def test_CellTypeCounts_print( test_case: TestCase ) ->None: Args: test_case (TestCase): test case """ - card: CellTypeCounts = CellTypeCounts() - card.setTypeCount(VTK_VERTEX, test_case.nbVertex) - card.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - card.setTypeCount(VTK_QUAD, test_case.nbQuad) - card.setTypeCount(VTK_TETRA, test_case.nbTetra) - card.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - card.setTypeCount(VTK_WEDGE, test_case.nbWed) - card.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - line: str = card.print() - lineExp: str = __get_expected_card(test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) + counts: CellTypeCounts = CellTypeCounts() + counts.setTypeCount(VTK_VERTEX, test_case.nbVertex) + counts.setTypeCount(VTK_TRIANGLE, test_case.nbTri) + counts.setTypeCount(VTK_QUAD, test_case.nbQuad) + counts.setTypeCount(VTK_TETRA, test_case.nbTetra) + counts.setTypeCount(VTK_PYRAMID, test_case.nbPyr) + counts.setTypeCount(VTK_WEDGE, test_case.nbWed) + counts.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + line: str = counts.print() + lineExp: str = __get_expected_counts(test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) # global cpt - # with open(f"meshIdCard_{cpt}.txt", 'w') as fout: + # with open(f"meshIdcounts_{cpt}.txt", 'w') as fout: # fout.write(line) # fout.write("------------------------------------------------------------\n") # fout.write(lineExp) # cpt += 1 - assert line == lineExp, "Output card string differs from expected value." + assert line == lineExp, "Output counts string differs from expected value." diff --git a/geos-pv/src/PVplugins/PVCellTypeCounter.py b/geos-pv/src/PVplugins/PVCellTypeCounter.py index c349c8e66..eca9f3c06 100644 --- a/geos-pv/src/PVplugins/PVCellTypeCounter.py +++ b/geos-pv/src/PVplugins/PVCellTypeCounter.py @@ -13,10 +13,14 @@ from vtkmodules.vtkCommonCore import ( vtkInformation, vtkInformationVector, + vtkDoubleArray, ) from vtkmodules.vtkCommonDataModel import ( vtkPointSet, vtkTable, + vtkCellTypes, + vtkUnstructuredGrid, + vtkMultiBlockDataSet, ) # update sys.path to load all GEOS Python Package dependencies @@ -43,16 +47,18 @@ @smhint.xml( '' ) @smproperty.input( name="Input", port_index=0 ) @smdomain.datatype( - dataTypes=[ "vtkPointSet"], + dataTypes=[ "vtkUnstructuredGrid"], composite_data_supported=True, ) class PVCellTypeCounter(VTKPythonAlgorithmBase): def __init__(self:Self) ->None: """Merge collocated points.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") + super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkTable") self._filename = None self._saveToFile = True + # used to concatenate results if vtkMultiBlockDataSet + self._countsAll: CellTypeCounts = CellTypeCounts() @smproperty.intvector( name="SetSaveToFile", @@ -111,30 +117,6 @@ def d09GroupAdvancedOutputParameters( self: Self ) -> None: """Organize groups.""" self.Modified() - def RequestDataObject( - self: Self, - request: vtkInformation, - inInfoVec: list[ vtkInformationVector ], - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestDataObject. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inData = self.GetInputData(inInfoVec, 0, 0) - outData = self.GetOutputData(outInfoVec, 0) - assert inData is not None - if outData is None or (not outData.IsA(inData.GetClassName())): - outData = inData.NewInstance() - outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) - def RequestData( self: Self, request: vtkInformation, # noqa: F841 @@ -152,23 +134,27 @@ def RequestData( int: 1 if calculation successfully ended, 0 otherwise. """ inputMesh: vtkPointSet = self.GetInputData( inInfoVec, 0, 0 ) - output: vtkTable = self.GetOutputData( outInfoVec, 0 ) + outputTable: vtkTable = vtkTable.GetData(outInfoVec, 0) assert inputMesh is not None, "Input server mesh is null." - assert output is not None, "Output pipeline is null." + assert outputTable is not None, "Output pipeline is null." - output.ShallowCopy(inputMesh) filter: CellTypeCounter = CellTypeCounter() filter.SetInputDataObject(inputMesh) filter.Update() - card: CellTypeCounts = filter.GetCellTypeCounts() - print(card.print()) + outputTable.ShallowCopy(filter.GetOutputDataObject(0)) + + # print counts in Output Messages view + counts: CellTypeCounts = filter.GetCellTypeCounts() + print(counts.print()) + self._countsAll += counts + # save to file if asked if self._saveToFile: try: with open(self._filename, 'w') as fout: - fout.write(card.print()) + fout.write(self._countsAll.print()) print(f"File {self._filename} was successfully written.") except Exception as e: - print("Error while exporting the file dur to:") + print("Error while exporting the file due to:") print(str(e)) return 1 From a35eb2ca66cf280cde11588180f71ba59896db25 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 23 Apr 2025 17:42:58 +0200 Subject: [PATCH 22/57] ci fix --- .../src/geos/mesh/model/CellTypeCounts.py | 60 +-- .../mesh/processing/MergeColocatedPoints.py | 112 +++-- .../src/geos/mesh/processing/SplitMesh.py | 402 +++++++++--------- geos-mesh/src/geos/mesh/processing/helpers.py | 106 ++--- .../src/geos/mesh/stats/CellTypeCounter.py | 64 ++- geos-mesh/tests/test_CellTypeCounter.py | 139 +++--- geos-mesh/tests/test_CellTypeCounts.py | 263 +++++++----- geos-mesh/tests/test_MergeColocatedPoints.py | 100 +++-- geos-mesh/tests/test_SplitMesh.py | 164 ++++--- .../test_helpers_createSingleCellMesh.py | 68 ++- .../tests/test_helpers_createVertices.py | 152 ++++--- 11 files changed, 865 insertions(+), 765 deletions(-) diff --git a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py index 48fa9193b..534ba192d 100644 --- a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py +++ b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py @@ -4,22 +4,22 @@ import numpy as np import numpy.typing as npt from typing_extensions import Self -from vtkmodules.vtkCommonDataModel import ( - vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_NUMBER_OF_CELL_TYPES -) - +from vtkmodules.vtkCommonDataModel import ( vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, + VTK_POLYGON, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, + VTK_NUMBER_OF_CELL_TYPES ) __doc__ = """ CellTypeCounts stores the number of elements of each type. """ + class CellTypeCounts(): - def __init__(self: Self ) ->None: + + def __init__( self: Self ) -> None: """CellTypeCounts stores the number of cells of each type.""" - self._counts: npt.NDArray[np.int64] = np.zeros(VTK_NUMBER_OF_CELL_TYPES, dtype=float) + self._counts: npt.NDArray[ np.int64 ] = np.zeros( VTK_NUMBER_OF_CELL_TYPES, dtype=float ) - def __str__(self: Self) ->str: + def __str__( self: Self ) -> str: """Overload __str__ method. Returns: @@ -27,7 +27,7 @@ def __str__(self: Self) ->str: """ return self.print() - def __add__(self: Self, other :Self) ->Self: + def __add__( self: Self, other: Self ) -> Self: """Addition operator. CellTypeCounts addition consists in suming counts. @@ -38,32 +38,32 @@ def __add__(self: Self, other :Self) ->Self: Returns: Self: new CellTypeCounts object """ - assert isinstance(other, CellTypeCounts), "Other object must be a CellTypeCounts." + assert isinstance( other, CellTypeCounts ), "Other object must be a CellTypeCounts." newCounts: CellTypeCounts = CellTypeCounts() newCounts._counts = self._counts + other._counts return newCounts - def addType(self: Self, cellType: int) ->None: + def addType( self: Self, cellType: int ) -> None: """Increment the number of cell of input type. Args: cellType (int): cell type """ - self._counts[cellType] += 1 - self._updateGeneralCounts(cellType, 1) + self._counts[ cellType ] += 1 + self._updateGeneralCounts( cellType, 1 ) - def setTypeCount(self: Self, cellType: int, count: int) ->None: + def setTypeCount( self: Self, cellType: int, count: int ) -> None: """Set the number of cells of input type. Args: cellType (int): cell type count (int): number of cells """ - prevCount = self._counts[cellType] - self._counts[cellType] = count - self._updateGeneralCounts(cellType, count - prevCount) + prevCount = self._counts[ cellType ] + self._counts[ cellType ] = count + self._updateGeneralCounts( cellType, count - prevCount ) - def getTypeCount(self: Self, cellType: int)->int: + def getTypeCount( self: Self, cellType: int ) -> int: """Get the number of cells of input type. Args: @@ -72,36 +72,36 @@ def getTypeCount(self: Self, cellType: int)->int: Returns: int: number of cells """ - return int(self._counts[cellType]) + return int( self._counts[ cellType ] ) - def _updateGeneralCounts(self: Self, cellType: int, count: int) ->None: + def _updateGeneralCounts( self: Self, cellType: int, count: int ) -> None: """Update generic type counters. Args: cellType (int): cell type count (int): count increment """ - if (cellType != VTK_POLYGON) and (vtkCellTypes.GetDimension(cellType) == 2): - self._counts[VTK_POLYGON] += count - if (cellType != VTK_POLYHEDRON) and (vtkCellTypes.GetDimension(cellType) == 3): - self._counts[VTK_POLYHEDRON] += count + if ( cellType != VTK_POLYGON ) and ( vtkCellTypes.GetDimension( cellType ) == 2 ): + self._counts[ VTK_POLYGON ] += count + if ( cellType != VTK_POLYHEDRON ) and ( vtkCellTypes.GetDimension( cellType ) == 3 ): + self._counts[ VTK_POLYHEDRON ] += count - def print(self: Self) ->str: + def print( self: Self ) -> str: """Print counts string. Returns: str: counts string. """ card: str = "" - card += "| | |\n" - card += "| - | - |\n" + card += "| | |\n" + card += "| - | - |\n" card += f"| **Total Number of Vertices** | {int(self._counts[VTK_VERTEX]):12} |\n" card += f"| **Total Number of Polygon** | {int(self._counts[VTK_POLYGON]):12} |\n" card += f"| **Total Number of Polyhedron** | {int(self._counts[VTK_POLYHEDRON]):12} |\n" card += f"| **Total Number of Cells** | {int(self._counts[VTK_POLYHEDRON]+self._counts[VTK_POLYGON]):12} |\n" - card += "| - | - |\n" - for cellType in (VTK_TRIANGLE, VTK_QUAD): + card += "| - | - |\n" + for cellType in ( VTK_TRIANGLE, VTK_QUAD ): card += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(self._counts[cellType]):12} |\n" - for cellType in (VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON): + for cellType in ( VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON ): card += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(self._counts[cellType]):12} |\n" return card diff --git a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py index 14851c037..77d57cc52 100644 --- a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py +++ b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py @@ -19,7 +19,6 @@ vtkCell, ) - __doc__ = """ MergeColocatedPoints module is a vtk filter that merges colocated points from input mesh. @@ -47,10 +46,12 @@ output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) """ -class MergeColocatedPoints(VTKPythonAlgorithmBase): - def __init__(self: Self ) ->None: + +class MergeColocatedPoints( VTKPythonAlgorithmBase ): + + def __init__( self: Self ) -> None: """MergeColocatedPoints filter merges duplacted points of the input mesh.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") + super().__init__( nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid" ) def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. @@ -63,13 +64,14 @@ def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> i int: 1 if calculation successfully ended, 0 otherwise. """ if port == 0: - info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - - def RequestDataObject(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: + info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) + + def RequestDataObject( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestDataObject. Args: @@ -80,19 +82,20 @@ def RequestDataObject(self: Self, Returns: int: 1 if calculation successfully ended, 0 otherwise. """ - inData = self.GetInputData(inInfoVec, 0, 0) - outData = self.GetOutputData(outInfoVec, 0) + inData = self.GetInputData( inInfoVec, 0, 0 ) + outData = self.GetOutputData( outInfoVec, 0 ) assert inData is not None - if outData is None or (not outData.IsA(inData.GetClassName())): + if outData is None or ( not outData.IsA( inData.GetClassName() ) ): outData = inData.NewInstance() - outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) - - def RequestData(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: + outInfoVec.GetInformationObject( 0 ).Set( outData.DATA_OBJECT(), outData ) + return super().RequestDataObject( request, inInfoVec, outInfoVec ) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestData. Args: @@ -104,17 +107,14 @@ def RequestData(self: Self, int: 1 if calculation successfully ended, 0 otherwise. """ inData: vtkUnstructuredGrid = vtkUnstructuredGrid.GetData( inInfoVec[ 0 ] ) - output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) + output: vtkUnstructuredGrid = self.GetOutputData( outInfoVec, 0 ) assert inData is not None, "Input mesh is undefined." assert output is not None, "Output mesh is undefined." - vertexMap: list[int] = self.setMergePoints(inData, output) - self.setCells(inData, output, vertexMap) + vertexMap: list[ int ] = self.setMergePoints( inData, output ) + self.setCells( inData, output, vertexMap ) return 1 - def setMergePoints(self :Self, - input: vtkUnstructuredGrid, - output: vtkUnstructuredGrid - ) ->list[int]: + def setMergePoints( self: Self, input: vtkUnstructuredGrid, output: vtkUnstructuredGrid ) -> list[ int ]: """Merge duplicated points and set new points and attributes to output mesh. Args: @@ -124,36 +124,33 @@ def setMergePoints(self :Self, Returns: list[int]: list containing new point ids. """ - vertexMap: list[int] = [] + vertexMap: list[ int ] = [] newPoints: vtkPoints = vtkPoints() # use point locator to check for colocated points pointsLocator = vtkIncrementalOctreePointLocator() - pointsLocator.InitPointInsertion(newPoints,input.GetBounds()) + pointsLocator.InitPointInsertion( newPoints, input.GetBounds() ) # create an array to count the number of colocated points vertexCount: vtkIntArray = vtkIntArray() - vertexCount.SetName("Count") - ptId = reference(0) - countD: int = 0 # total number of colocated points - for v in range(input.GetNumberOfPoints()): - inserted: bool = pointsLocator.InsertUniquePoint( input.GetPoints().GetPoint(v), ptId) + vertexCount.SetName( "Count" ) + ptId = reference( 0 ) + countD: int = 0 # total number of colocated points + for v in range( input.GetNumberOfPoints() ): + inserted: bool = pointsLocator.InsertUniquePoint( input.GetPoints().GetPoint( v ), ptId ) if inserted: - vertexCount.InsertNextValue(1) + vertexCount.InsertNextValue( 1 ) else: - vertexCount.SetValue( ptId, vertexCount.GetValue(ptId) + 1) + vertexCount.SetValue( ptId, vertexCount.GetValue( ptId ) + 1 ) countD = countD + 1 - vertexMap += [ptId.get()] + vertexMap += [ ptId.get() ] - output.SetPoints(pointsLocator.GetLocatorPoints()) + output.SetPoints( pointsLocator.GetLocatorPoints() ) # copy point attributes - output.GetPointData().DeepCopy(input.GetPointData()) + output.GetPointData().DeepCopy( input.GetPointData() ) # add the array to points data - output.GetPointData().AddArray(vertexCount) + output.GetPointData().AddArray( vertexCount ) return vertexMap - def setCells(self :Self, - input: vtkUnstructuredGrid, - output: vtkUnstructuredGrid, - vertexMap: list[int]) ->bool: + def setCells( self: Self, input: vtkUnstructuredGrid, output: vtkUnstructuredGrid, vertexMap: list[ int ] ) -> bool: """Set cell point ids and attributes to output mesh. Args: @@ -166,21 +163,22 @@ def setCells(self :Self, """ nbCells: int = input.GetNumberOfCells() nbPoints: int = output.GetNumberOfPoints() - assert np.unique(vertexMap).size == nbPoints, "The size of the list of point ids must be equal to the number of points." + assert np.unique( + vertexMap ).size == nbPoints, "The size of the list of point ids must be equal to the number of points." cellTypes: vtkCellTypes = vtkCellTypes() - input.GetCellTypes(cellTypes) - output.Allocate(nbCells) + input.GetCellTypes( cellTypes ) + output.Allocate( nbCells ) # create mesh cells - for cellId in range(nbCells): - cell: vtkCell = input.GetCell(cellId) + for cellId in range( nbCells ): + cell: vtkCell = input.GetCell( cellId ) # create cells from point ids cellsID: vtkIdList = vtkIdList() - for ptId in range(cell.GetNumberOfPoints()): - ptIdOld: int = cell.GetPointId(ptId) - ptIdNew: int = vertexMap[ptIdOld] - cellsID.InsertNextId(ptIdNew) - output.InsertNextCell(cell.GetCellType(), cellsID) + for ptId in range( cell.GetNumberOfPoints() ): + ptIdOld: int = cell.GetPointId( ptId ) + ptIdNew: int = vertexMap[ ptIdOld ] + cellsID.InsertNextId( ptIdNew ) + output.InsertNextCell( cell.GetCellType(), cellsID ) # copy cell attributes assert output.GetNumberOfCells() == nbCells, "Output and input mesh must have the same number of cells." - output.GetCellData().DeepCopy(input.GetCellData()) + output.GetCellData().DeepCopy( input.GetCellData() ) return True diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index 0b977f3b8..ea9a25bcb 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -18,11 +18,14 @@ vtkCellData, vtkCell, vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, + VTK_TRIANGLE, + VTK_QUAD, + VTK_TETRA, + VTK_HEXAHEDRON, + VTK_PYRAMID, ) -from vtkmodules.util.numpy_support import (numpy_to_vtk, - vtk_to_numpy) +from vtkmodules.util.numpy_support import ( numpy_to_vtk, vtk_to_numpy ) __doc__ = """ SplitMesh module is a vtk filter that split cells of a mesh composed of Tetrahedra, pyramids, and hexahedra. @@ -48,19 +51,20 @@ output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) """ -class SplitMesh(VTKPythonAlgorithmBase): - def __init__(self) ->None: +class SplitMesh( VTKPythonAlgorithmBase ): + + def __init__( self ) -> None: """SplitMesh filter splits each cell using edge centers.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid") + super().__init__( nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid" ) self.inData: vtkUnstructuredGrid self.cells: vtkCellArray self.points: vtkPoints self.originalId: vtkIdTypeArray - self.cellTypes: list[int] + self.cellTypes: list[ int ] - def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: + def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. Args: @@ -71,13 +75,14 @@ def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> in int: 1 if calculation successfully ended, 0 otherwise. """ if port == 0: - info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - - def RequestDataObject(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: + info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) + + def RequestDataObject( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestDataObject. Args: @@ -88,19 +93,20 @@ def RequestDataObject(self: Self, Returns: int: 1 if calculation successfully ended, 0 otherwise. """ - inData = self.GetInputData(inInfoVec, 0, 0) - outData = self.GetOutputData(outInfoVec, 0) + inData = self.GetInputData( inInfoVec, 0, 0 ) + outData = self.GetOutputData( outInfoVec, 0 ) assert inData is not None - if outData is None or (not outData.IsA(inData.GetClassName())): + if outData is None or ( not outData.IsA( inData.GetClassName() ) ): outData = inData.NewInstance() - outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) - - def RequestData(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: + outInfoVec.GetInformationObject( 0 ).Set( outData.DATA_OBJECT(), outData ) + return super().RequestDataObject( request, inInfoVec, outInfoVec ) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestData. Args: @@ -111,8 +117,8 @@ def RequestData(self: Self, Returns: int: 1 if calculation successfully ended, 0 otherwise. """ - self.inData = self.GetInputData(inInfoVec, 0, 0) - output: vtkUnstructuredGrid = self.GetOutputData(outInfoVec, 0) + self.inData = self.GetInputData( inInfoVec, 0, 0 ) + output: vtkUnstructuredGrid = self.GetOutputData( outInfoVec, 0 ) assert self.inData is not None, "Input mesh is undefined." assert output is not None, "Output mesh is undefined." @@ -121,46 +127,46 @@ def RequestData(self: Self, nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad = self._get_cell_counts() self.points = vtkPoints() - self.points.DeepCopy(self.inData.GetPoints()) + self.points.DeepCopy( self.inData.GetPoints() ) nbNewPoints: int = 0 volumeCellCounts = nb_hex + nb_tet + nb_pyr nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 if volumeCellCounts > 0 else nb_triangles * 3 + nb_quad * 5 nbNewCells: int = nb_hex * 8 + nb_tet * 8 + nb_pyr * 10 * nb_triangles * 4 + nb_quad * 4 - self.points.Resize( self.inData.GetNumberOfPoints() + nbNewPoints) + self.points.Resize( self.inData.GetNumberOfPoints() + nbNewPoints ) self.cells = vtkCellArray() - self.cells.AllocateExact(nbNewCells, 8) + self.cells.AllocateExact( nbNewCells, 8 ) self.originalId = vtkIdTypeArray() - self.originalId.SetName("OriginalID") - self.originalId.Allocate(nbNewCells) + self.originalId.SetName( "OriginalID" ) + self.originalId.Allocate( nbNewCells ) self.cellTypes = [] - for c in range(nb_cells): - cell: vtkCell = self.inData.GetCell(c) + for c in range( nb_cells ): + cell: vtkCell = self.inData.GetCell( c ) cellType: int = cell.GetCellType() if cellType == VTK_HEXAHEDRON: - self._split_hexahedron(cell, c) + self._split_hexahedron( cell, c ) elif cellType == VTK_TETRA: - self._split_tetrahedron(cell, c) + self._split_tetrahedron( cell, c ) elif cellType == VTK_PYRAMID: - self._split_pyramid(cell, c) + self._split_pyramid( cell, c ) elif cellType == VTK_TRIANGLE: - self._split_triangle(cell, c) + self._split_triangle( cell, c ) elif cellType == VTK_QUAD: - self._split_quad(cell, c) + self._split_quad( cell, c ) else: - raise TypeError(f"Cell type {vtkCellTypes.GetClassNameFromTypeId(cellType)} is not supported.") + raise TypeError( f"Cell type {vtkCellTypes.GetClassNameFromTypeId(cellType)} is not supported." ) # add points and cells - output.SetPoints(self.points) - output.SetCells(self.cellTypes, self.cells) + output.SetPoints( self.points ) + output.SetCells( self.cellTypes, self.cells ) # add attribute saving original cell ids cellArrays: vtkCellData = output.GetCellData() assert cellArrays is not None, "Cell data is undefined." - cellArrays.AddArray(self.originalId) + cellArrays.AddArray( self.originalId ) # transfer all cell arrays - self._transferCellArrays(output) + self._transferCellArrays( output ) return 1 - def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: + def _get_cell_counts( self: Self ) -> tuple[ int, int, int, int, int ]: """Get the number of cells of each type. Returns: @@ -173,8 +179,8 @@ def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: nb_pyr: int = 0 nb_triangles: int = 0 nb_quad: int = 0 - for c in range(nb_cells): - cell: vtkCell = self.inData.GetCell(c) + for c in range( nb_cells ): + cell: vtkCell = self.inData.GetCell( c ) cellType = cell.GetCellType() if cellType == VTK_HEXAHEDRON: nb_hex = nb_hex + 1 @@ -188,7 +194,7 @@ def _get_cell_counts(self: Self) -> tuple[int, int, int, int, int]: nb_quad = nb_quad + 1 return nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad - def _addMidPoint( self: Self, ptA :int, ptB :int) ->int: + def _addMidPoint( self: Self, ptA: int, ptB: int ) -> int: """Add a point at the center of the edge defined by input point ids. Args: @@ -198,12 +204,12 @@ def _addMidPoint( self: Self, ptA :int, ptB :int) ->int: Returns: int: inserted point Id """ - ptACoor: npt.NDArray[np.float64] = np.array(self.points.GetPoint(ptA)) - ptBCoor: npt.NDArray[np.float64] = np.array(self.points.GetPoint(ptB)) - center: npt.NDArray[np.float64] = (ptACoor + ptBCoor) / 2. - return self.points.InsertNextPoint(center[0], center[1], center[2]) + ptACoor: npt.NDArray[ np.float64 ] = np.array( self.points.GetPoint( ptA ) ) + ptBCoor: npt.NDArray[ np.float64 ] = np.array( self.points.GetPoint( ptB ) ) + center: npt.NDArray[ np.float64 ] = ( ptACoor + ptBCoor ) / 2. + return self.points.InsertNextPoint( center[ 0 ], center[ 1 ], center[ 2 ] ) - def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: + def _split_tetrahedron( self: Self, cell: vtkCell, index: int ) -> None: r"""Split a tetrahedron. Let's suppose an input tetrahedron composed of nodes (0, 1, 2, 3), @@ -226,30 +232,30 @@ def _split_tetrahedron(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) - pt1: int = cell.GetPointId(1) - pt2: int = cell.GetPointId(2) - pt3: int = cell.GetPointId(3) - pt4: int = self._addMidPoint(pt0,pt1) - pt5: int = self._addMidPoint(pt1,pt2) - pt6: int = self._addMidPoint(pt0,pt2) - pt7: int = self._addMidPoint(pt0,pt3) - pt8: int = self._addMidPoint(pt2,pt3) - pt9: int = self._addMidPoint(pt1,pt3) - - self.cells.InsertNextCell(4, [pt0,pt4,pt6,pt7]) - self.cells.InsertNextCell(4, [pt7,pt9,pt8,pt3]) - self.cells.InsertNextCell(4, [pt9,pt4,pt5,pt1]) - self.cells.InsertNextCell(4, [pt5,pt6,pt8,pt2]) - self.cells.InsertNextCell(4, [pt6,pt8,pt7,pt4]) - self.cells.InsertNextCell(4, [pt4,pt8,pt7,pt9]) - self.cells.InsertNextCell(4, [pt4,pt8,pt9,pt5]) - self.cells.InsertNextCell(4, [pt5,pt4,pt8,pt6]) - for _ in range(8): - self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_TETRA]*8) - - def _split_pyramid(self :Self, cell: vtkCell, index: int) -> None: + pt0: int = cell.GetPointId( 0 ) + pt1: int = cell.GetPointId( 1 ) + pt2: int = cell.GetPointId( 2 ) + pt3: int = cell.GetPointId( 3 ) + pt4: int = self._addMidPoint( pt0, pt1 ) + pt5: int = self._addMidPoint( pt1, pt2 ) + pt6: int = self._addMidPoint( pt0, pt2 ) + pt7: int = self._addMidPoint( pt0, pt3 ) + pt8: int = self._addMidPoint( pt2, pt3 ) + pt9: int = self._addMidPoint( pt1, pt3 ) + + self.cells.InsertNextCell( 4, [ pt0, pt4, pt6, pt7 ] ) + self.cells.InsertNextCell( 4, [ pt7, pt9, pt8, pt3 ] ) + self.cells.InsertNextCell( 4, [ pt9, pt4, pt5, pt1 ] ) + self.cells.InsertNextCell( 4, [ pt5, pt6, pt8, pt2 ] ) + self.cells.InsertNextCell( 4, [ pt6, pt8, pt7, pt4 ] ) + self.cells.InsertNextCell( 4, [ pt4, pt8, pt7, pt9 ] ) + self.cells.InsertNextCell( 4, [ pt4, pt8, pt9, pt5 ] ) + self.cells.InsertNextCell( 4, [ pt5, pt4, pt8, pt6 ] ) + for _ in range( 8 ): + self.originalId.InsertNextValue( index ) + self.cellTypes.extend( [ VTK_TETRA ] * 8 ) + + def _split_pyramid( self: Self, cell: vtkCell, index: int ) -> None: r"""Split a pyramid. Let's suppose an input pyramid composed of nodes (0, 1, 2, 3, 4), @@ -274,37 +280,37 @@ def _split_pyramid(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) - pt1: int = cell.GetPointId(1) - pt2: int = cell.GetPointId(2) - pt3: int = cell.GetPointId(3) - pt4: int = cell.GetPointId(4) - pt5: int = self._addMidPoint(pt0,pt1) - pt6: int = self._addMidPoint(pt0,pt3) - pt7: int = self._addMidPoint(pt0,pt4) - pt8: int = self._addMidPoint(pt1,pt2) - pt9: int = self._addMidPoint(pt1,pt4) - pt10: int = self._addMidPoint(pt2,pt3) - pt11: int = self._addMidPoint(pt2,pt4) - pt12: int = self._addMidPoint(pt3,pt4) - pt13: int = self._addMidPoint(pt5,pt10) - - self.cells.InsertNextCell(5, [pt5,pt1,pt8,pt13,pt9]) - self.cells.InsertNextCell(5, [pt13,pt8,pt2,pt10,pt11]) - self.cells.InsertNextCell(5, [pt3,pt6,pt13,pt10,pt12]) - self.cells.InsertNextCell(5, [pt6,pt0,pt5,pt13,pt7]) - self.cells.InsertNextCell(5, [pt12,pt7,pt9,pt11,pt4]) - self.cells.InsertNextCell(5, [pt11,pt9,pt7,pt12,pt13]) - - self.cells.InsertNextCell(4, [pt7,pt9,pt5,pt13]) - self.cells.InsertNextCell(4, [pt9,pt11,pt8,pt13]) - self.cells.InsertNextCell(4, [pt11,pt12,pt10,pt13]) - self.cells.InsertNextCell(4, [pt12,pt7,pt6,pt13]) - for _ in range(10): - self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_PYRAMID]*8) - - def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: + pt0: int = cell.GetPointId( 0 ) + pt1: int = cell.GetPointId( 1 ) + pt2: int = cell.GetPointId( 2 ) + pt3: int = cell.GetPointId( 3 ) + pt4: int = cell.GetPointId( 4 ) + pt5: int = self._addMidPoint( pt0, pt1 ) + pt6: int = self._addMidPoint( pt0, pt3 ) + pt7: int = self._addMidPoint( pt0, pt4 ) + pt8: int = self._addMidPoint( pt1, pt2 ) + pt9: int = self._addMidPoint( pt1, pt4 ) + pt10: int = self._addMidPoint( pt2, pt3 ) + pt11: int = self._addMidPoint( pt2, pt4 ) + pt12: int = self._addMidPoint( pt3, pt4 ) + pt13: int = self._addMidPoint( pt5, pt10 ) + + self.cells.InsertNextCell( 5, [ pt5, pt1, pt8, pt13, pt9 ] ) + self.cells.InsertNextCell( 5, [ pt13, pt8, pt2, pt10, pt11 ] ) + self.cells.InsertNextCell( 5, [ pt3, pt6, pt13, pt10, pt12 ] ) + self.cells.InsertNextCell( 5, [ pt6, pt0, pt5, pt13, pt7 ] ) + self.cells.InsertNextCell( 5, [ pt12, pt7, pt9, pt11, pt4 ] ) + self.cells.InsertNextCell( 5, [ pt11, pt9, pt7, pt12, pt13 ] ) + + self.cells.InsertNextCell( 4, [ pt7, pt9, pt5, pt13 ] ) + self.cells.InsertNextCell( 4, [ pt9, pt11, pt8, pt13 ] ) + self.cells.InsertNextCell( 4, [ pt11, pt12, pt10, pt13 ] ) + self.cells.InsertNextCell( 4, [ pt12, pt7, pt6, pt13 ] ) + for _ in range( 10 ): + self.originalId.InsertNextValue( index ) + self.cellTypes.extend( [ VTK_PYRAMID ] * 8 ) + + def _split_hexahedron( self: Self, cell: vtkCell, index: int ) -> None: r"""Split a hexahedron. Let's suppose an input hexahedron composed of nodes (0, 1, 2, 3, 4, 5, 6, 7), @@ -326,47 +332,47 @@ def _split_hexahedron(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) - pt1: int = cell.GetPointId(1) - pt2: int = cell.GetPointId(2) - pt3: int = cell.GetPointId(3) - pt4: int = cell.GetPointId(4) - pt5: int = cell.GetPointId(5) - pt6: int = cell.GetPointId(6) - pt7: int = cell.GetPointId(7) - pt8: int = self._addMidPoint(pt0,pt1) - pt9: int = self._addMidPoint(pt0,pt3) - pt10: int = self._addMidPoint(pt0,pt4) - pt11: int = self._addMidPoint(pt1,pt2) - pt12: int = self._addMidPoint(pt1,pt5) - pt13: int = self._addMidPoint(pt2,pt3) - pt14: int = self._addMidPoint(pt2,pt6) - pt15: int = self._addMidPoint(pt3,pt7) - pt16: int = self._addMidPoint(pt4,pt5) - pt17: int = self._addMidPoint(pt4,pt7) - pt18: int = self._addMidPoint(pt5,pt6) - pt19: int = self._addMidPoint(pt6,pt7) - pt20: int = self._addMidPoint(pt9,pt11) - pt21: int = self._addMidPoint(pt10,pt12) - pt22: int = self._addMidPoint(pt9,pt17) - pt23: int = self._addMidPoint(pt11,pt18) - pt24: int = self._addMidPoint(pt14,pt15) - pt25: int = self._addMidPoint(pt17,pt18) - pt26: int = self._addMidPoint(pt22,pt23) - - self.cells.InsertNextCell(8, [pt10,pt21,pt26,pt22,pt4,pt16,pt25,pt17]) - self.cells.InsertNextCell(8, [pt21,pt12,pt23,pt26,pt16,pt5,pt18,pt25]) - self.cells.InsertNextCell(8, [pt0,pt8,pt20,pt9,pt10,pt21,pt26,pt22]) - self.cells.InsertNextCell(8, [pt8,pt1,pt11,pt20,pt21,pt12,pt23,pt26]) - self.cells.InsertNextCell(8, [pt22,pt26,pt24,pt15,pt17,pt25,pt19,pt7]) - self.cells.InsertNextCell(8, [pt26,pt23,pt14,pt24,pt25,pt18,pt6,pt19]) - self.cells.InsertNextCell(8, [pt9,pt20,pt13,pt3,pt22,pt26,pt24,pt15]) - self.cells.InsertNextCell(8, [pt20,pt11,pt2,pt13,pt26,pt23,pt14,pt24]) - for _ in range(8): - self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_HEXAHEDRON]*8) - - def _split_triangle(self :Self, cell: vtkCell, index: int) -> None: + pt0: int = cell.GetPointId( 0 ) + pt1: int = cell.GetPointId( 1 ) + pt2: int = cell.GetPointId( 2 ) + pt3: int = cell.GetPointId( 3 ) + pt4: int = cell.GetPointId( 4 ) + pt5: int = cell.GetPointId( 5 ) + pt6: int = cell.GetPointId( 6 ) + pt7: int = cell.GetPointId( 7 ) + pt8: int = self._addMidPoint( pt0, pt1 ) + pt9: int = self._addMidPoint( pt0, pt3 ) + pt10: int = self._addMidPoint( pt0, pt4 ) + pt11: int = self._addMidPoint( pt1, pt2 ) + pt12: int = self._addMidPoint( pt1, pt5 ) + pt13: int = self._addMidPoint( pt2, pt3 ) + pt14: int = self._addMidPoint( pt2, pt6 ) + pt15: int = self._addMidPoint( pt3, pt7 ) + pt16: int = self._addMidPoint( pt4, pt5 ) + pt17: int = self._addMidPoint( pt4, pt7 ) + pt18: int = self._addMidPoint( pt5, pt6 ) + pt19: int = self._addMidPoint( pt6, pt7 ) + pt20: int = self._addMidPoint( pt9, pt11 ) + pt21: int = self._addMidPoint( pt10, pt12 ) + pt22: int = self._addMidPoint( pt9, pt17 ) + pt23: int = self._addMidPoint( pt11, pt18 ) + pt24: int = self._addMidPoint( pt14, pt15 ) + pt25: int = self._addMidPoint( pt17, pt18 ) + pt26: int = self._addMidPoint( pt22, pt23 ) + + self.cells.InsertNextCell( 8, [ pt10, pt21, pt26, pt22, pt4, pt16, pt25, pt17 ] ) + self.cells.InsertNextCell( 8, [ pt21, pt12, pt23, pt26, pt16, pt5, pt18, pt25 ] ) + self.cells.InsertNextCell( 8, [ pt0, pt8, pt20, pt9, pt10, pt21, pt26, pt22 ] ) + self.cells.InsertNextCell( 8, [ pt8, pt1, pt11, pt20, pt21, pt12, pt23, pt26 ] ) + self.cells.InsertNextCell( 8, [ pt22, pt26, pt24, pt15, pt17, pt25, pt19, pt7 ] ) + self.cells.InsertNextCell( 8, [ pt26, pt23, pt14, pt24, pt25, pt18, pt6, pt19 ] ) + self.cells.InsertNextCell( 8, [ pt9, pt20, pt13, pt3, pt22, pt26, pt24, pt15 ] ) + self.cells.InsertNextCell( 8, [ pt20, pt11, pt2, pt13, pt26, pt23, pt14, pt24 ] ) + for _ in range( 8 ): + self.originalId.InsertNextValue( index ) + self.cellTypes.extend( [ VTK_HEXAHEDRON ] * 8 ) + + def _split_triangle( self: Self, cell: vtkCell, index: int ) -> None: r"""Split a triangle. Let's suppose an input triangle composed of nodes (0, 1, 2), @@ -384,22 +390,22 @@ def _split_triangle(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) - pt1: int = cell.GetPointId(1) - pt2: int = cell.GetPointId(2) - pt3: int = self._addMidPoint(pt0,pt1) - pt4: int = self._addMidPoint(pt1,pt2) - pt5: int = self._addMidPoint(pt0,pt2) - - self.cells.InsertNextCell(3, [pt0,pt3,pt5]) - self.cells.InsertNextCell(3, [pt3,pt1,pt4]) - self.cells.InsertNextCell(3, [pt5,pt4,pt2]) - self.cells.InsertNextCell(3, [pt3,pt4,pt5]) - for _ in range(4): - self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_TRIANGLE]*4) - - def _split_quad(self :Self, cell: vtkCell, index: int) -> None: + pt0: int = cell.GetPointId( 0 ) + pt1: int = cell.GetPointId( 1 ) + pt2: int = cell.GetPointId( 2 ) + pt3: int = self._addMidPoint( pt0, pt1 ) + pt4: int = self._addMidPoint( pt1, pt2 ) + pt5: int = self._addMidPoint( pt0, pt2 ) + + self.cells.InsertNextCell( 3, [ pt0, pt3, pt5 ] ) + self.cells.InsertNextCell( 3, [ pt3, pt1, pt4 ] ) + self.cells.InsertNextCell( 3, [ pt5, pt4, pt2 ] ) + self.cells.InsertNextCell( 3, [ pt3, pt4, pt5 ] ) + for _ in range( 4 ): + self.originalId.InsertNextValue( index ) + self.cellTypes.extend( [ VTK_TRIANGLE ] * 4 ) + + def _split_quad( self: Self, cell: vtkCell, index: int ) -> None: r"""Split a quad. Let's suppose an input quad composed of nodes (0, 1, 2, 3), @@ -417,27 +423,25 @@ def _split_quad(self :Self, cell: vtkCell, index: int) -> None: cell (vtkCell): cell to split index (int): index of the cell """ - pt0: int = cell.GetPointId(0) - pt1: int = cell.GetPointId(1) - pt2: int = cell.GetPointId(2) - pt3: int = cell.GetPointId(3) - pt4: int = self._addMidPoint(pt0,pt1) - pt5: int = self._addMidPoint(pt1,pt2) - pt6: int = self._addMidPoint(pt2,pt3) - pt7: int = self._addMidPoint(pt3,pt0) - pt8: int = self._addMidPoint(pt7,pt5) - - self.cells.InsertNextCell(4, [pt0,pt4,pt8,pt7]) - self.cells.InsertNextCell(4, [pt4,pt1,pt5,pt8]) - self.cells.InsertNextCell(4, [pt8,pt5,pt2,pt6]) - self.cells.InsertNextCell(4, [pt7,pt8,pt6,pt3]) - for _ in range(4): - self.originalId.InsertNextValue(index) - self.cellTypes.extend([VTK_QUAD]*4) - - def _transferCellArrays(self :Self, - splittedMesh: vtkUnstructuredGrid - ) ->bool: + pt0: int = cell.GetPointId( 0 ) + pt1: int = cell.GetPointId( 1 ) + pt2: int = cell.GetPointId( 2 ) + pt3: int = cell.GetPointId( 3 ) + pt4: int = self._addMidPoint( pt0, pt1 ) + pt5: int = self._addMidPoint( pt1, pt2 ) + pt6: int = self._addMidPoint( pt2, pt3 ) + pt7: int = self._addMidPoint( pt3, pt0 ) + pt8: int = self._addMidPoint( pt7, pt5 ) + + self.cells.InsertNextCell( 4, [ pt0, pt4, pt8, pt7 ] ) + self.cells.InsertNextCell( 4, [ pt4, pt1, pt5, pt8 ] ) + self.cells.InsertNextCell( 4, [ pt8, pt5, pt2, pt6 ] ) + self.cells.InsertNextCell( 4, [ pt7, pt8, pt6, pt3 ] ) + for _ in range( 4 ): + self.originalId.InsertNextValue( index ) + self.cellTypes.extend( [ VTK_QUAD ] * 4 ) + + def _transferCellArrays( self: Self, splittedMesh: vtkUnstructuredGrid ) -> bool: """Transfer arrays from input mesh to splitted mesh. Args: @@ -451,23 +455,23 @@ def _transferCellArrays(self :Self, cellData: vtkCellData = self.inData.GetCellData() assert cellData is not None, "Cell data of input mesh should be defined." # for each array of input mesh - for i in range(cellData.GetNumberOfArrays()): - array: vtkDataArray = cellData.GetArray(i) + for i in range( cellData.GetNumberOfArrays() ): + array: vtkDataArray = cellData.GetArray( i ) assert array is not None, "Array should be defined." - npArray: npt.NDArray[np.float64] = vtk_to_numpy(array) + npArray: npt.NDArray[ np.float64 ] = vtk_to_numpy( array ) # get number of components - dims: tuple[int,...] = npArray.shape - ny:int = 1 if len(dims) == 1 else dims[1] + dims: tuple[ int, ...] = npArray.shape + ny: int = 1 if len( dims ) == 1 else dims[ 1 ] # create new array with nb cells from splitted mesh and number of components from array to copy - newNpArray: npt.NDArray[np.float64] = np.full((splittedMesh.GetNumberOfCells(), ny), np.nan) + newNpArray: npt.NDArray[ np.float64 ] = np.full( ( splittedMesh.GetNumberOfCells(), ny ), np.nan ) # for each cell, copy the values from input mesh - for c in range(splittedMesh.GetNumberOfCells()): - idParent: int = int(self.originalId.GetTuple1(c)) - newNpArray[c] = npArray[idParent] + for c in range( splittedMesh.GetNumberOfCells() ): + idParent: int = int( self.originalId.GetTuple1( c ) ) + newNpArray[ c ] = npArray[ idParent ] # set array the splitted mesh - newArray: vtkDataArray = numpy_to_vtk(newNpArray) - newArray.SetName(array.GetName()) - cellDataSplitted.AddArray(newArray) + newArray: vtkDataArray = numpy_to_vtk( newNpArray ) + newArray.SetName( array.GetName() ) + cellDataSplitted.AddArray( newArray ) cellDataSplitted.Modified() splittedMesh.Modified() return True diff --git a/geos-mesh/src/geos/mesh/processing/helpers.py b/geos-mesh/src/geos/mesh/processing/helpers.py index 06ae92052..ae104ecc7 100644 --- a/geos-mesh/src/geos/mesh/processing/helpers.py +++ b/geos-mesh/src/geos/mesh/processing/helpers.py @@ -7,13 +7,8 @@ from vtkmodules.util.numpy_support import numpy_to_vtk -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkIncrementalOctreePointLocator, - vtkPointData, - vtkCellData, - vtkDataSet -) +from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkIncrementalOctreePointLocator, vtkPointData, + vtkCellData, vtkDataSet ) from vtkmodules.vtkCommonCore import ( vtkPoints, @@ -21,6 +16,7 @@ reference, ) + # TODO: copy from vtkUtils def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: """Get the dictionnary of all attributes of a vtkDataSet on points or cells. @@ -53,7 +49,8 @@ def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, attributes[ attributeName ] = nbComponents return attributes -def getBounds(cellPtsCoord: list[npt.NDArray[np.float64]]) -> Sequence[float]: + +def getBounds( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] ) -> Sequence[ float ]: """Compute bounding box coordinates of the list of points. Args: @@ -62,16 +59,24 @@ def getBounds(cellPtsCoord: list[npt.NDArray[np.float64]]) -> Sequence[float]: Returns: Sequence[float]: bounding box coordinates (xmin, xmax, ymin, ymax, zmin, zmax) """ - bounds: list[float] = [np.inf, -np.inf, np.inf, -np.inf, np.inf, -np.inf,] + bounds: list[ float ] = [ + np.inf, + -np.inf, + np.inf, + -np.inf, + np.inf, + -np.inf, + ] for ptsCoords in cellPtsCoord: - mins: npt.NDArray[np.float64] = np.min(ptsCoords, axis=0) - maxs: npt.NDArray[np.float64] = np.max(ptsCoords, axis=0) - for i in range(3): - bounds[2 * i] = float(min(bounds[2 * i], mins[i])) - bounds[2 * i + 1] = float(max(bounds[2 * i + 1], maxs[i])) + mins: npt.NDArray[ np.float64 ] = np.min( ptsCoords, axis=0 ) + maxs: npt.NDArray[ np.float64 ] = np.max( ptsCoords, axis=0 ) + for i in range( 3 ): + bounds[ 2 * i ] = float( min( bounds[ 2 * i ], mins[ i ] ) ) + bounds[ 2 * i + 1 ] = float( max( bounds[ 2 * i + 1 ], maxs[ i ] ) ) return bounds -def createSingleCellMesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtkUnstructuredGrid: + +def createSingleCellMesh( cellType: int, ptsCoord: npt.NDArray[ np.float64 ] ) -> vtkUnstructuredGrid: """Create a mesh that consists of a single cell. Args: @@ -81,28 +86,28 @@ def createSingleCellMesh(cellType: int, ptsCoord: npt.NDArray[np.float64]) ->vtk Returns: vtkUnstructuredGrid: output mesh """ - nbPoints: int = ptsCoord.shape[0] - points: npt.NDArray[np.float64] = np.vstack((ptsCoord,)) + nbPoints: int = ptsCoord.shape[ 0 ] + points: npt.NDArray[ np.float64 ] = np.vstack( ( ptsCoord, ) ) # Convert points to vtkPoints object vtkpts: vtkPoints = vtkPoints() - vtkpts.SetData(numpy_to_vtk(points)) + vtkpts.SetData( numpy_to_vtk( points ) ) # create cells from point ids cellsID: vtkIdList = vtkIdList() for j in range( nbPoints ): - cellsID.InsertNextId(j) + cellsID.InsertNextId( j ) # add cell to mesh mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() - mesh.SetPoints(vtkpts) - mesh.Allocate(1) - mesh.InsertNextCell(cellType, cellsID) + mesh.SetPoints( vtkpts ) + mesh.Allocate( 1 ) + mesh.InsertNextCell( cellType, cellsID ) return mesh -def createMultiCellMesh(cellTypes: list[int], - cellPtsCoord: list[npt.NDArray[np.float64]], - sharePoints: bool = True - ) ->vtkUnstructuredGrid: + +def createMultiCellMesh( cellTypes: list[ int ], + cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + sharePoints: bool = True ) -> vtkUnstructuredGrid: """Create a mesh that consists of multiple cells. .. WARNING:: the mesh is not check for conformity. @@ -115,27 +120,28 @@ def createMultiCellMesh(cellTypes: list[int], Returns: vtkUnstructuredGrid: output mesh """ - assert len(cellPtsCoord) == len(cellTypes), "The lists of cell types of point coordinates must be of same size." - nbCells: int = len(cellPtsCoord) + assert len( cellPtsCoord ) == len( cellTypes ), "The lists of cell types of point coordinates must be of same size." + nbCells: int = len( cellPtsCoord ) mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() points: vtkPoints - cellVertexMapAll: list[tuple[int, ...]] - points, cellVertexMapAll = createVertices(cellPtsCoord, sharePoints) - assert len(cellVertexMapAll) == len(cellTypes), "The lists of cell types of cell point ids must be of same size." - mesh.SetPoints(points) - mesh.Allocate(nbCells) + cellVertexMapAll: list[ tuple[ int, ...] ] + points, cellVertexMapAll = createVertices( cellPtsCoord, sharePoints ) + assert len( cellVertexMapAll ) == len( + cellTypes ), "The lists of cell types of cell point ids must be of same size." + mesh.SetPoints( points ) + mesh.Allocate( nbCells ) # create mesh cells - for cellType, ptsId in zip(cellTypes, cellVertexMapAll, strict=True): + for cellType, ptsId in zip( cellTypes, cellVertexMapAll, strict=True ): # create cells from point ids cellsID: vtkIdList = vtkIdList() for ptId in ptsId: - cellsID.InsertNextId(ptId) - mesh.InsertNextCell(cellType, cellsID) + cellsID.InsertNextId( ptId ) + mesh.InsertNextCell( cellType, cellsID ) return mesh -def createVertices(cellPtsCoord: list[npt.NDArray[np.float64]], - shared: bool = True - ) -> tuple[vtkPoints, list[tuple[int, ...]]]: + +def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + shared: bool = True ) -> tuple[ vtkPoints, list[ tuple[ int, ...] ] ]: """Create vertices from cell point coordinates list. Args: @@ -147,22 +153,22 @@ def createVertices(cellPtsCoord: list[npt.NDArray[np.float64]], map of cell point ids """ # get point bounds - bounds: list[float] = getBounds(cellPtsCoord) + bounds: list[ float ] = getBounds( cellPtsCoord ) points: vtkPoints = vtkPoints() # use point locator to check for colocated points pointsLocator = vtkIncrementalOctreePointLocator() - pointsLocator.InitPointInsertion(points, bounds) - cellVertexMapAll: list[tuple[int, ...]] = [] - ptId: reference = reference(0) - ptsCoords: npt.NDArray[np.float64] + pointsLocator.InitPointInsertion( points, bounds ) + cellVertexMapAll: list[ tuple[ int, ...] ] = [] + ptId: reference = reference( 0 ) + ptsCoords: npt.NDArray[ np.float64 ] for ptsCoords in cellPtsCoord: - cellVertexMap: list[reference] = [] - pt: npt.NDArray[np.float64] # 1DArray + cellVertexMap: list[ reference ] = [] + pt: npt.NDArray[ np.float64 ] # 1DArray for pt in ptsCoords: if shared: - pointsLocator.InsertUniquePoint( pt.tolist(), ptId) + pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) else: - pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1) - cellVertexMap += [ptId.get()] - cellVertexMapAll += [tuple(cellVertexMap)] + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) + cellVertexMap += [ ptId.get() ] + cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll diff --git a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py index 2cfb4bcec..2036ebbb7 100644 --- a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py +++ b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py @@ -8,13 +8,8 @@ vtkInformationVector, vtkIntArray, ) -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkCell, - vtkTable, - vtkCellTypes, - VTK_VERTEX, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON -) +from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCell, vtkTable, vtkCellTypes, VTK_VERTEX, + VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON ) from geos.mesh.model.CellTypeCounts import CellTypeCounts @@ -41,14 +36,16 @@ # get counts counts :CellTypeCounts = filter.GetCellTypeCounts() """ -class CellTypeCounter(VTKPythonAlgorithmBase): - def __init__(self) ->None: + +class CellTypeCounter( VTKPythonAlgorithmBase ): + + def __init__( self ) -> None: """CellTypeCounter filter computes mesh stats.""" - super().__init__(nInputPorts=1, nOutputPorts=1, inputType="vtkUnstructuredGrid", outputType="vtkTable") + super().__init__( nInputPorts=1, nOutputPorts=1, inputType="vtkUnstructuredGrid", outputType="vtkTable" ) self.counts: CellTypeCounts - def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> int: + def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. Args: @@ -59,13 +56,14 @@ def FillInputPortInformation(self: Self, port: int, info: vtkInformation ) -> in int: 1 if calculation successfully ended, 0 otherwise. """ if port == 0: - info.Set(self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid") - - def RequestData(self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: + info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) + + def RequestData( + self: Self, + request: vtkInformation, # noqa: F841 + inInfoVec: list[ vtkInformationVector ], # noqa: F841 + outInfoVec: vtkInformationVector, + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestData. Args: @@ -76,35 +74,35 @@ def RequestData(self: Self, Returns: int: 1 if calculation successfully ended, 0 otherwise. """ - inData: vtkUnstructuredGrid = self.GetInputData(inInfoVec, 0, 0) - outTable: vtkTable = vtkTable.GetData(outInfoVec, 0) + inData: vtkUnstructuredGrid = self.GetInputData( inInfoVec, 0, 0 ) + outTable: vtkTable = vtkTable.GetData( outInfoVec, 0 ) assert inData is not None, "Input mesh is undefined." assert outTable is not None, "Output table is undefined." # compute cell type counts self.counts = CellTypeCounts() - self.counts.setTypeCount(VTK_VERTEX, inData.GetNumberOfPoints()) - for i in range(inData.GetNumberOfCells()): - cell: vtkCell = inData.GetCell(i) - self.counts.addType(cell.GetCellType()) + self.counts.setTypeCount( VTK_VERTEX, inData.GetNumberOfPoints() ) + for i in range( inData.GetNumberOfCells() ): + cell: vtkCell = inData.GetCell( i ) + self.counts.addType( cell.GetCellType() ) # create output table # first reset output table outTable.RemoveAllRows() outTable.RemoveAllColumns() - outTable.SetNumberOfRows(1) + outTable.SetNumberOfRows( 1 ) # create columns per types for cellType in self.getAllCellTypes(): array: vtkIntArray = vtkIntArray() - array.SetName(vtkCellTypes.GetClassNameFromTypeId(cellType)) - array.SetNumberOfComponents(1) - array.SetNumberOfValues(1) - array.SetValue(0, self.counts.getTypeCount(cellType)) - outTable.AddColumn(array) + array.SetName( vtkCellTypes.GetClassNameFromTypeId( cellType ) ) + array.SetNumberOfComponents( 1 ) + array.SetNumberOfValues( 1 ) + array.SetValue( 0, self.counts.getTypeCount( cellType ) ) + outTable.AddColumn( array ) return 1 - def GetCellTypeCounts(self :Self) -> CellTypeCounts: + def GetCellTypeCounts( self: Self ) -> CellTypeCounts: """Get CellTypeCounts object. Returns: @@ -112,10 +110,10 @@ def GetCellTypeCounts(self :Self) -> CellTypeCounts: """ return self.counts - def getAllCellTypes(self :Self) -> tuple[int,...]: + def getAllCellTypes( self: Self ) -> tuple[ int, ...]: """Get all cell type ids managed by CellTypeCount class. Returns: tuple[int,...]: tuple containg cell type ids. """ - return (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON) \ No newline at end of file + return ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON ) diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index eb58977f4..83be05eda 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -7,8 +7,7 @@ import numpy.typing as npt import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.processing.helpers import createSingleCellMesh, createMultiCellMesh from geos.mesh.stats.CellTypeCounter import CellTypeCounter @@ -18,20 +17,29 @@ vtkUnstructuredGrid, vtkCellTypes, vtkCell, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_VERTEX, VTK_POLYHEDRON, VTK_POLYGON, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, + VTK_TRIANGLE, + VTK_QUAD, + VTK_TETRA, + VTK_VERTEX, + VTK_POLYHEDRON, + VTK_POLYGON, + VTK_PYRAMID, + VTK_HEXAHEDRON, + VTK_WEDGE, ) #from vtkmodules.vtkFiltersSources import vtkCubeSource +data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) -data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") +filename_all: tuple[ str, ...] = ( "triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", + "hexa_cell.csv" ) +cellType_all: tuple[ int, ...] = ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON ) -filename_all: tuple[str,...] = ("triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", "hexa_cell.csv") -cellType_all: tuple[int, ...] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON) +filename_all2: tuple[ str, ...] = ( "tetra_mesh.csv", "hexa_mesh.csv" ) +cellType_all2: tuple[ int, ...] = ( VTK_TETRA, VTK_HEXAHEDRON ) +nbPtsCell_all2: tuple[ int ] = ( 4, 8 ) -filename_all2: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") -cellType_all2: tuple[int, ...] = (VTK_TETRA, VTK_HEXAHEDRON) -nbPtsCell_all2: tuple[int] = (4, 8) @dataclass( frozen=True ) class TestCase: @@ -47,42 +55,52 @@ def __generate_test_data_single_cell() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, filename in zip(cellType_all, filename_all, strict=True): - ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, filename), dtype=float, delimiter=',') - mesh: vtkUnstructuredGrid = createSingleCellMesh(cellType, ptsCoord) + for cellType, filename in zip( cellType_all, filename_all, strict=True ): + ptsCoord: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, filename ), + dtype=float, + delimiter=',' ) + mesh: vtkUnstructuredGrid = createSingleCellMesh( cellType, ptsCoord ) yield TestCase( mesh ) -ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cellType_all] + +ids: list[ str ] = [ vtkCellTypes.GetClassNameFromTypeId( cellType ) for cellType in cellType_all ] + + @pytest.mark.parametrize( "test_case", __generate_test_data_single_cell(), ids=ids ) -def test_CellTypeCounter_single( test_case: TestCase ) ->None: +def test_CellTypeCounter_single( test_case: TestCase ) -> None: """Test of CellTypeCounter filter. Args: test_case (TestCase): test case """ - filter :CellTypeCounter = CellTypeCounter() - filter.SetInputDataObject(test_case.mesh) + filter: CellTypeCounter = CellTypeCounter() + filter.SetInputDataObject( test_case.mesh ) filter.Update() - counts :CellTypeCounts = filter.GetCellTypeCounts() + counts: CellTypeCounts = filter.GetCellTypeCounts() assert counts is not None, "CellTypeCounts is undefined" - assert counts.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + assert counts.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( + ), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell - elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) - counts: npt.NDArray[np.int64] = np.zeros(len(elementTypes)) - for i in range(test_case.mesh.GetNumberOfCells()): - cell: vtkCell = test_case.mesh.GetCell(i) - index: int = elementTypes.index(cell.GetCellType()) - counts[index] += 1 + elementTypes: tuple[ int ] = ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE ) + counts: npt.NDArray[ np.int64 ] = np.zeros( len( elementTypes ) ) + for i in range( test_case.mesh.GetNumberOfCells() ): + cell: vtkCell = test_case.mesh.GetCell( i ) + index: int = elementTypes.index( cell.GetCellType() ) + counts[ index ] += 1 # check cell type counts - for i, elementType in enumerate(elementTypes): - assert int(counts.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + for i, elementType in enumerate( elementTypes ): + assert int( + counts.getTypeCount( elementType ) + ) == counts[ i ], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + + nbPolygon: int = counts[ 0 ] + counts[ 1 ] + nbPolyhedra: int = np.sum( counts[ 2: ] ) + assert int( counts.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int( + counts.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." - nbPolygon: int = counts[0] + counts[1] - nbPolyhedra: int = np.sum(counts[2:]) - assert int(counts.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." - assert int(counts.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: """Generate test cases. @@ -90,43 +108,54 @@ def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, filename, nbPtsCell in zip(cellType_all2, filename_all2, nbPtsCell_all2, strict=True): - ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, filename), dtype=float, delimiter=',') + for cellType, filename, nbPtsCell in zip( cellType_all2, filename_all2, nbPtsCell_all2, strict=True ): + ptsCoords: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, filename ), + dtype=float, + delimiter=',' ) # split array to get a list of coordinates per cell - cellPtsCoords: list[npt.NDArray[np.float64]]= [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] - nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) - cellTypes = nbCells * [cellType] - mesh: vtkUnstructuredGrid = createMultiCellMesh(cellTypes, cellPtsCoords, True) + cellPtsCoords: list[ npt.NDArray[ np.float64 ] ] = [ + ptsCoords[ i:i + nbPtsCell ] for i in range( 0, ptsCoords.shape[ 0 ], nbPtsCell ) + ] + nbCells: int = int( ptsCoords.shape[ 0 ] / nbPtsCell ) + cellTypes = nbCells * [ cellType ] + mesh: vtkUnstructuredGrid = createMultiCellMesh( cellTypes, cellPtsCoords, True ) yield TestCase( mesh ) -ids2: list[str] = [os.path.splitext(name)[0] for name in filename_all2] + +ids2: list[ str ] = [ os.path.splitext( name )[ 0 ] for name in filename_all2 ] + + @pytest.mark.parametrize( "test_case", __generate_test_data_multi_cell(), ids=ids2 ) -def test_CellTypeCounter_multi( test_case: TestCase ) ->None: +def test_CellTypeCounter_multi( test_case: TestCase ) -> None: """Test of CellTypeCounter filter. Args: test_case (TestCase): test case """ - filter :CellTypeCounter = CellTypeCounter() - filter.SetInputDataObject(test_case.mesh) + filter: CellTypeCounter = CellTypeCounter() + filter.SetInputDataObject( test_case.mesh ) filter.Update() - counts :CellTypeCounts = filter.GetCellTypeCounts() + counts: CellTypeCounts = filter.GetCellTypeCounts() assert counts is not None, "CellTypeCounts is undefined" - assert counts.getTypeCount(VTK_VERTEX) == test_case.mesh.GetNumberOfPoints(), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" + assert counts.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( + ), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell - elementTypes: tuple[int] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE) - counts: npt.NDArray[np.int64] = np.zeros(len(elementTypes)) - for i in range(test_case.mesh.GetNumberOfCells()): - cell: vtkCell = test_case.mesh.GetCell(i) - index: int = elementTypes.index(cell.GetCellType()) - counts[index] += 1 + elementTypes: tuple[ int ] = ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE ) + counts: npt.NDArray[ np.int64 ] = np.zeros( len( elementTypes ) ) + for i in range( test_case.mesh.GetNumberOfCells() ): + cell: vtkCell = test_case.mesh.GetCell( i ) + index: int = elementTypes.index( cell.GetCellType() ) + counts[ index ] += 1 # check cell type counts - for i, elementType in enumerate(elementTypes): - assert int(counts.getTypeCount(elementType)) == counts[i], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." - - nbPolygon: int = counts[0] + counts[1] - nbPolyhedra: int = np.sum(counts[2:]) - assert int(counts.getTypeCount(VTK_POLYGON)) == nbPolygon, f"The number of faces should be {nbPolygon}." - assert int(counts.getTypeCount(VTK_POLYHEDRON)) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + for i, elementType in enumerate( elementTypes ): + assert int( + counts.getTypeCount( elementType ) + ) == counts[ i ], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." + + nbPolygon: int = counts[ 0 ] + counts[ 1 ] + nbPolyhedra: int = np.sum( counts[ 2: ] ) + assert int( counts.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int( + counts.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." diff --git a/geos-mesh/tests/test_CellTypeCounts.py b/geos-mesh/tests/test_CellTypeCounts.py index b6634a45e..39637ef02 100644 --- a/geos-mesh/tests/test_CellTypeCounts.py +++ b/geos-mesh/tests/test_CellTypeCounts.py @@ -4,37 +4,35 @@ from dataclasses import dataclass import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.model.CellTypeCounts import CellTypeCounts -from vtkmodules.vtkCommonDataModel import ( - vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE, VTK_VERTEX -) - +from vtkmodules.vtkCommonDataModel import ( vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, + VTK_HEXAHEDRON, VTK_WEDGE, VTK_VERTEX ) # inputs -nbVertex_all: tuple[int] = (3, 4, 5, 8, 10, 20) -nbTri_all: tuple[int] = (1, 0, 3, 0, 0, 4) -nbQuad_all: tuple[int] = (0, 1, 0, 6, 0, 3) -nbTetra_all: tuple[int] = (0, 0, 1, 0, 4, 0) -nbPyr_all: tuple[int] = (0, 0, 0, 0, 0, 4) -nbWed_all: tuple[int] = (0, 0, 0, 0, 0, 2) -nbHexa_all: tuple[int] = (0, 0, 0, 1, 0, 5) +nbVertex_all: tuple[ int ] = ( 3, 4, 5, 8, 10, 20 ) +nbTri_all: tuple[ int ] = ( 1, 0, 3, 0, 0, 4 ) +nbQuad_all: tuple[ int ] = ( 0, 1, 0, 6, 0, 3 ) +nbTetra_all: tuple[ int ] = ( 0, 0, 1, 0, 4, 0 ) +nbPyr_all: tuple[ int ] = ( 0, 0, 0, 0, 0, 4 ) +nbWed_all: tuple[ int ] = ( 0, 0, 0, 0, 0, 2 ) +nbHexa_all: tuple[ int ] = ( 0, 0, 0, 1, 0, 5 ) + @dataclass( frozen=True ) class TestCase: """Test case.""" __test__ = False - nbVertex: tuple[int] - nbTri: tuple[int] - nbQuad: tuple[int] - nbTetra: tuple[int] - nbPyr: tuple[int] - nbWed: tuple[int] - nbHexa: tuple[int] + nbVertex: tuple[ int ] + nbTri: tuple[ int ] + nbQuad: tuple[ int ] + nbTetra: tuple[ int ] + nbPyr: tuple[ int ] + nbWed: tuple[ int ] + nbHexa: tuple[ int ] + def __generate_test_data() -> Iterator[ TestCase ]: """Generate test cases. @@ -42,151 +40,184 @@ def __generate_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa in zip( - nbVertex_all, nbTri_all, nbQuad_all, nbTetra_all, nbPyr_all, nbWed_all, nbHexa_all, - strict=True): + for nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa in zip( nbVertex_all, + nbTri_all, + nbQuad_all, + nbTetra_all, + nbPyr_all, + nbWed_all, + nbHexa_all, + strict=True ): yield TestCase( nbVertex, nbTri, nbQuad, nbTetra, nbPyr, nbWed, nbHexa ) -def __get_expected_counts(nbVertex: int, nbTri: int, nbQuad: int, nbTetra: int, nbPyr: int, nbWed: int, nbHexa: int,) ->str: + +def __get_expected_counts( + nbVertex: int, + nbTri: int, + nbQuad: int, + nbTetra: int, + nbPyr: int, + nbWed: int, + nbHexa: int, +) -> str: nbFaces: int = nbTri + nbQuad nbPolyhedre: int = nbTetra + nbPyr + nbHexa + nbWed countsExp: str = "" - countsExp += "| | |\n" - countsExp += "| - | - |\n" + countsExp += "| | |\n" + countsExp += "| - | - |\n" countsExp += f"| **Total Number of Vertices** | {int(nbVertex):12} |\n" countsExp += f"| **Total Number of Polygon** | {int(nbFaces):12} |\n" countsExp += f"| **Total Number of Polyhedron** | {int(nbPolyhedre):12} |\n" countsExp += f"| **Total Number of Cells** | {int(nbPolyhedre+nbFaces):12} |\n" - countsExp += "| - | - |\n" - for cellType, nb in zip((VTK_TRIANGLE, VTK_QUAD, ), (nbTri, nbQuad,), strict=True): + countsExp += "| - | - |\n" + for cellType, nb in zip( ( + VTK_TRIANGLE, + VTK_QUAD, + ), ( + nbTri, + nbQuad, + ), strict=True ): countsExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" - for cellType, nb in zip((VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON), (nbTetra, nbPyr, nbWed, nbHexa), strict=True): + for cellType, nb in zip( ( VTK_TETRA, VTK_PYRAMID, VTK_WEDGE, VTK_HEXAHEDRON ), ( nbTetra, nbPyr, nbWed, nbHexa ), + strict=True ): countsExp += f"| **Total Number of {vtkCellTypes.GetClassNameFromTypeId(cellType):<13}** | {int(nb):12} |\n" return countsExp -def test_CellTypeCounts_init( ) ->None: + +def test_CellTypeCounts_init() -> None: """Test of CellTypeCounts . Args: test_case (TestCase): test case """ counts: CellTypeCounts = CellTypeCounts() - assert counts.getTypeCount(VTK_VERTEX) == 0, "Number of vertices must be 0" - assert counts.getTypeCount(VTK_TRIANGLE) == 0, "Number of triangles must be 0" - assert counts.getTypeCount(VTK_QUAD) == 0, "Number of quads must be 0" - assert counts.getTypeCount(VTK_TETRA) == 0, "Number of tetrahedra must be 0" - assert counts.getTypeCount(VTK_PYRAMID) == 0, "Number of pyramids must be 0" - assert counts.getTypeCount(VTK_WEDGE) == 0, "Number of wedges must be 0" - assert counts.getTypeCount(VTK_HEXAHEDRON) == 0, "Number of hexahedra must be 0" - -@pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_CellTypeCounts_addType( test_case: TestCase ) ->None: + assert counts.getTypeCount( VTK_VERTEX ) == 0, "Number of vertices must be 0" + assert counts.getTypeCount( VTK_TRIANGLE ) == 0, "Number of triangles must be 0" + assert counts.getTypeCount( VTK_QUAD ) == 0, "Number of quads must be 0" + assert counts.getTypeCount( VTK_TETRA ) == 0, "Number of tetrahedra must be 0" + assert counts.getTypeCount( VTK_PYRAMID ) == 0, "Number of pyramids must be 0" + assert counts.getTypeCount( VTK_WEDGE ) == 0, "Number of wedges must be 0" + assert counts.getTypeCount( VTK_HEXAHEDRON ) == 0, "Number of hexahedra must be 0" + + +@pytest.mark.parametrize( "test_case", __generate_test_data() ) +def test_CellTypeCounts_addType( test_case: TestCase ) -> None: """Test of CellTypeCounts . Args: test_case (TestCase): test case """ counts: CellTypeCounts = CellTypeCounts() - for _ in range(test_case.nbVertex): - counts.addType(VTK_VERTEX) - for _ in range(test_case.nbTri): - counts.addType(VTK_TRIANGLE) - for _ in range(test_case.nbQuad): - counts.addType(VTK_QUAD) - for _ in range(test_case.nbTetra): - counts.addType(VTK_TETRA) - for _ in range(test_case.nbPyr): - counts.addType(VTK_PYRAMID) - for _ in range(test_case.nbWed): - counts.addType(VTK_WEDGE) - for _ in range(test_case.nbHexa): - counts.addType(VTK_HEXAHEDRON) - - assert counts.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert counts.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" - assert counts.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" - assert counts.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" - assert counts.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" - assert counts.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" - assert counts.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" - - -@pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_CellTypeCounts_setCount( test_case: TestCase ) ->None: + for _ in range( test_case.nbVertex ): + counts.addType( VTK_VERTEX ) + for _ in range( test_case.nbTri ): + counts.addType( VTK_TRIANGLE ) + for _ in range( test_case.nbQuad ): + counts.addType( VTK_QUAD ) + for _ in range( test_case.nbTetra ): + counts.addType( VTK_TETRA ) + for _ in range( test_case.nbPyr ): + counts.addType( VTK_PYRAMID ) + for _ in range( test_case.nbWed ): + counts.addType( VTK_WEDGE ) + for _ in range( test_case.nbHexa ): + counts.addType( VTK_HEXAHEDRON ) + + assert counts.getTypeCount( VTK_VERTEX ) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert counts.getTypeCount( VTK_TRIANGLE ) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert counts.getTypeCount( VTK_QUAD ) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert counts.getTypeCount( VTK_TETRA ) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert counts.getTypeCount( VTK_PYRAMID ) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert counts.getTypeCount( VTK_WEDGE ) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert counts.getTypeCount( VTK_HEXAHEDRON ) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + + +@pytest.mark.parametrize( "test_case", __generate_test_data() ) +def test_CellTypeCounts_setCount( test_case: TestCase ) -> None: """Test of CellTypeCounts . Args: test_case (TestCase): test case """ counts: CellTypeCounts = CellTypeCounts() - counts.setTypeCount(VTK_VERTEX, test_case.nbVertex) - counts.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - counts.setTypeCount(VTK_QUAD, test_case.nbQuad) - counts.setTypeCount(VTK_TETRA, test_case.nbTetra) - counts.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - counts.setTypeCount(VTK_WEDGE, test_case.nbWed) - counts.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) - - assert counts.getTypeCount(VTK_VERTEX) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" - assert counts.getTypeCount(VTK_TRIANGLE) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" - assert counts.getTypeCount(VTK_QUAD) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" - assert counts.getTypeCount(VTK_TETRA) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" - assert counts.getTypeCount(VTK_PYRAMID) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" - assert counts.getTypeCount(VTK_WEDGE) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" - assert counts.getTypeCount(VTK_HEXAHEDRON) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" - -@pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_CellTypeCounts_add( test_case: TestCase ) ->None: + counts.setTypeCount( VTK_VERTEX, test_case.nbVertex ) + counts.setTypeCount( VTK_TRIANGLE, test_case.nbTri ) + counts.setTypeCount( VTK_QUAD, test_case.nbQuad ) + counts.setTypeCount( VTK_TETRA, test_case.nbTetra ) + counts.setTypeCount( VTK_PYRAMID, test_case.nbPyr ) + counts.setTypeCount( VTK_WEDGE, test_case.nbWed ) + counts.setTypeCount( VTK_HEXAHEDRON, test_case.nbHexa ) + + assert counts.getTypeCount( VTK_VERTEX ) == test_case.nbVertex, f"Number of vertices must be {test_case.nbVertex}" + assert counts.getTypeCount( VTK_TRIANGLE ) == test_case.nbTri, f"Number of triangles must be {test_case.nbTri}" + assert counts.getTypeCount( VTK_QUAD ) == test_case.nbQuad, f"Number of quads must be {test_case.nbQuad}" + assert counts.getTypeCount( VTK_TETRA ) == test_case.nbTetra, f"Number of tetrahedra must be {test_case.nbTetra}" + assert counts.getTypeCount( VTK_PYRAMID ) == test_case.nbPyr, f"Number of pyramids must be {test_case.nbPyr}" + assert counts.getTypeCount( VTK_WEDGE ) == test_case.nbWed, f"Number of wedges must be {test_case.nbWed}" + assert counts.getTypeCount( VTK_HEXAHEDRON ) == test_case.nbHexa, f"Number of hexahedra must be {test_case.nbHexa}" + + +@pytest.mark.parametrize( "test_case", __generate_test_data() ) +def test_CellTypeCounts_add( test_case: TestCase ) -> None: """Test of CellTypeCounts . Args: test_case (TestCase): test case """ counts1: CellTypeCounts = CellTypeCounts() - counts1.setTypeCount(VTK_VERTEX, test_case.nbVertex) - counts1.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - counts1.setTypeCount(VTK_QUAD, test_case.nbQuad) - counts1.setTypeCount(VTK_TETRA, test_case.nbTetra) - counts1.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - counts1.setTypeCount(VTK_WEDGE, test_case.nbWed) - counts1.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + counts1.setTypeCount( VTK_VERTEX, test_case.nbVertex ) + counts1.setTypeCount( VTK_TRIANGLE, test_case.nbTri ) + counts1.setTypeCount( VTK_QUAD, test_case.nbQuad ) + counts1.setTypeCount( VTK_TETRA, test_case.nbTetra ) + counts1.setTypeCount( VTK_PYRAMID, test_case.nbPyr ) + counts1.setTypeCount( VTK_WEDGE, test_case.nbWed ) + counts1.setTypeCount( VTK_HEXAHEDRON, test_case.nbHexa ) counts2: CellTypeCounts = CellTypeCounts() - counts2.setTypeCount(VTK_VERTEX, test_case.nbVertex) - counts2.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - counts2.setTypeCount(VTK_QUAD, test_case.nbQuad) - counts2.setTypeCount(VTK_TETRA, test_case.nbTetra) - counts2.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - counts2.setTypeCount(VTK_WEDGE, test_case.nbWed) - counts2.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + counts2.setTypeCount( VTK_VERTEX, test_case.nbVertex ) + counts2.setTypeCount( VTK_TRIANGLE, test_case.nbTri ) + counts2.setTypeCount( VTK_QUAD, test_case.nbQuad ) + counts2.setTypeCount( VTK_TETRA, test_case.nbTetra ) + counts2.setTypeCount( VTK_PYRAMID, test_case.nbPyr ) + counts2.setTypeCount( VTK_WEDGE, test_case.nbWed ) + counts2.setTypeCount( VTK_HEXAHEDRON, test_case.nbHexa ) newcounts: CellTypeCounts = counts1 + counts2 - assert newcounts.getTypeCount(VTK_VERTEX) == int(2 * test_case.nbVertex), f"Number of vertices must be {int(2 * test_case.nbVertex)}" - assert newcounts.getTypeCount(VTK_TRIANGLE) == int(2 * test_case.nbTri), f"Number of triangles must be {int(2 * test_case.nbTri)}" - assert newcounts.getTypeCount(VTK_QUAD) == int(2 * test_case.nbQuad), f"Number of quads must be {int(2 * test_case.nbQuad)}" - assert newcounts.getTypeCount(VTK_TETRA) == int(2 * test_case.nbTetra), f"Number of tetrahedra must be {int(2 * test_case.nbTetra)}" - assert newcounts.getTypeCount(VTK_PYRAMID) == int(2 * test_case.nbPyr), f"Number of pyramids must be {int(2 * test_case.nbPyr)}" - assert newcounts.getTypeCount(VTK_WEDGE) == int(2 * test_case.nbWed), f"Number of wedges must be {int(2 * test_case.nbWed)}" - assert newcounts.getTypeCount(VTK_HEXAHEDRON) == int(2 * test_case.nbHexa), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" + assert newcounts.getTypeCount( VTK_VERTEX ) == int( + 2 * test_case.nbVertex ), f"Number of vertices must be {int(2 * test_case.nbVertex)}" + assert newcounts.getTypeCount( VTK_TRIANGLE ) == int( + 2 * test_case.nbTri ), f"Number of triangles must be {int(2 * test_case.nbTri)}" + assert newcounts.getTypeCount( VTK_QUAD ) == int( + 2 * test_case.nbQuad ), f"Number of quads must be {int(2 * test_case.nbQuad)}" + assert newcounts.getTypeCount( VTK_TETRA ) == int( + 2 * test_case.nbTetra ), f"Number of tetrahedra must be {int(2 * test_case.nbTetra)}" + assert newcounts.getTypeCount( VTK_PYRAMID ) == int( + 2 * test_case.nbPyr ), f"Number of pyramids must be {int(2 * test_case.nbPyr)}" + assert newcounts.getTypeCount( VTK_WEDGE ) == int( + 2 * test_case.nbWed ), f"Number of wedges must be {int(2 * test_case.nbWed)}" + assert newcounts.getTypeCount( VTK_HEXAHEDRON ) == int( + 2 * test_case.nbHexa ), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" + #cpt = 0 -@pytest.mark.parametrize( "test_case", __generate_test_data()) -def test_CellTypeCounts_print( test_case: TestCase ) ->None: +@pytest.mark.parametrize( "test_case", __generate_test_data() ) +def test_CellTypeCounts_print( test_case: TestCase ) -> None: """Test of CellTypeCounts . Args: test_case (TestCase): test case """ counts: CellTypeCounts = CellTypeCounts() - counts.setTypeCount(VTK_VERTEX, test_case.nbVertex) - counts.setTypeCount(VTK_TRIANGLE, test_case.nbTri) - counts.setTypeCount(VTK_QUAD, test_case.nbQuad) - counts.setTypeCount(VTK_TETRA, test_case.nbTetra) - counts.setTypeCount(VTK_PYRAMID, test_case.nbPyr) - counts.setTypeCount(VTK_WEDGE, test_case.nbWed) - counts.setTypeCount(VTK_HEXAHEDRON, test_case.nbHexa) + counts.setTypeCount( VTK_VERTEX, test_case.nbVertex ) + counts.setTypeCount( VTK_TRIANGLE, test_case.nbTri ) + counts.setTypeCount( VTK_QUAD, test_case.nbQuad ) + counts.setTypeCount( VTK_TETRA, test_case.nbTetra ) + counts.setTypeCount( VTK_PYRAMID, test_case.nbPyr ) + counts.setTypeCount( VTK_WEDGE, test_case.nbWed ) + counts.setTypeCount( VTK_HEXAHEDRON, test_case.nbHexa ) line: str = counts.print() - lineExp: str = __get_expected_counts(test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa) + lineExp: str = __get_expected_counts( test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, + test_case.nbPyr, test_case.nbWed, test_case.nbHexa ) # global cpt # with open(f"meshIdcounts_{cpt}.txt", 'w') as fout: # fout.write(line) diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py index fee9ea612..bd429366d 100644 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -7,8 +7,7 @@ import numpy.typing as npt import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.processing.helpers import createMultiCellMesh from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints @@ -19,7 +18,8 @@ vtkUnstructuredGrid, vtkCellArray, vtkCellTypes, - VTK_TETRA, VTK_HEXAHEDRON, + VTK_TETRA, + VTK_HEXAHEDRON, ) from vtkmodules.vtkCommonCore import ( @@ -27,19 +27,30 @@ vtkIdList, ) -data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") -data_filename_all: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") -celltypes_all: tuple[int] = (VTK_TETRA, VTK_HEXAHEDRON) -nbPtsCell_all: tuple[int] = (4, 8) +data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) +data_filename_all: tuple[ str, ...] = ( "tetra_mesh.csv", "hexa_mesh.csv" ) +celltypes_all: tuple[ int ] = ( VTK_TETRA, VTK_HEXAHEDRON ) +nbPtsCell_all: tuple[ int ] = ( 4, 8 ) # expected results if shared vertices -hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.0, 0.0, 1.0], [0.5, 0.0, 1.0], [0.5, 0.5, 1.0], [0.0, 0.5, 1.0], [1.0, 0.0, 0.5], [1.0, 0.5, 0.5], [1.0, 0.0, 1.0], [1.0, 0.5, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [1.0, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 1.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 0.5], [1.0, 1.0, 1.0], [0.5, 1.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0]], np.float64) -tetra_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.0, 1.0, 0.0], [0.5, 0.0, 0.5], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]], np.float64) -points_out_all = (tetra_points_out, hexa_points_out) +hexa_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.5 ], [ 0.5, 0.0, 0.5 ], [ 0.5, 0.5, 0.5 ], [ 0.0, 0.5, 0.5 ], [ 0.0, 0.0, 1.0 ], [ 0.5, 0.0, 1.0 ], + [ 0.5, 0.5, 1.0 ], [ 0.0, 0.5, 1.0 ], [ 1.0, 0.0, 0.5 ], [ 1.0, 0.5, 0.5 ], [ 1.0, 0.0, 1.0 ], [ 1.0, 0.5, 1.0 ], + [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 0.5, 0.0 ], + [ 0.5, 1.0, 0.5 ], [ 0.0, 1.0, 0.5 ], [ 0.5, 1.0, 1.0 ], [ 0.0, 1.0, 1.0 ], [ 1.0, 1.0, 0.5 ], [ 1.0, 1.0, 1.0 ], + [ 0.5, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 1.0, 1.0, 0.0 ] ], np.float64 ) +tetra_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.0, 0.0, 0.5 ], [ 0.0, 0.5, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.5 ], + [ 0.0, 1.0, 0.0 ], [ 0.5, 0.0, 0.5 ], [ 1.0, 0.0, 0.0 ], [ 0.0, 0.0, 1.0 ] ], np.float64 ) +points_out_all = ( tetra_points_out, hexa_points_out ) + +tetra_cellPtsIdsExp = [ ( 0, 1, 2, 3 ), ( 3, 4, 5, 6 ), ( 4, 1, 7, 8 ), ( 7, 2, 5, 9 ), ( 2, 5, 3, 1 ), ( 1, 5, 3, 4 ), + ( 1, 5, 4, 7 ), ( 7, 1, 5, 2 ) ] +hexa_cellPtsIdsExp = [ ( 0, 1, 2, 3, 4, 5, 6, 7 ), ( 1, 8, 9, 2, 5, 10, 11, 6 ), ( 12, 13, 14, 15, 0, 1, 2, 3 ), + ( 13, 16, 17, 14, 1, 8, 9, 2 ), ( 3, 2, 18, 19, 7, 6, 20, 21 ), ( 2, 9, 22, 18, 6, 11, 23, 20 ), + ( 15, 14, 24, 25, 3, 2, 18, 19 ), ( 14, 17, 26, 24, 2, 9, 22, 18 ) ] +cellPtsIdsExp_all = ( tetra_cellPtsIdsExp, hexa_cellPtsIdsExp ) -tetra_cellPtsIdsExp = [(0, 1, 2, 3), (3, 4, 5, 6), (4, 1, 7, 8), (7, 2, 5, 9), (2, 5, 3, 1), (1, 5, 3, 4), (1, 5, 4, 7), (7, 1, 5, 2)] -hexa_cellPtsIdsExp = [(0, 1, 2, 3, 4, 5, 6, 7), (1, 8, 9, 2, 5, 10, 11, 6), (12, 13, 14, 15, 0, 1, 2, 3), (13, 16, 17, 14, 1, 8, 9, 2), (3, 2, 18, 19, 7, 6, 20, 21), (2, 9, 22, 18, 6, 11, 23, 20), (15, 14, 24, 25, 3, 2, 18, 19), (14, 17, 26, 24, 2, 9, 22, 18)] -cellPtsIdsExp_all = (tetra_cellPtsIdsExp, hexa_cellPtsIdsExp) @dataclass( frozen=True ) class TestCase: @@ -48,9 +59,9 @@ class TestCase: #: input mesh mesh: vtkUnstructuredGrid #: expected points - pointsExp: npt.NDArray[np.float64] + pointsExp: npt.NDArray[ np.float64 ] #: expected cell point ids - cellPtsIdsExp: tuple[tuple[int]] + cellPtsIdsExp: tuple[ tuple[ int ] ] def __generate_test_data() -> Iterator[ TestCase ]: @@ -59,38 +70,45 @@ def __generate_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for path, celltype, nbPtsCell, pointsExp, cellPtsIdsExp in zip(data_filename_all, celltypes_all, nbPtsCell_all, points_out_all, cellPtsIdsExp_all, strict=True): + for path, celltype, nbPtsCell, pointsExp, cellPtsIdsExp in zip( data_filename_all, + celltypes_all, + nbPtsCell_all, + points_out_all, + cellPtsIdsExp_all, + strict=True ): # all points coordinates - ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + ptsCoords: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, path ), dtype=float, delimiter=',' ) # split array to get a list of coordinates per cell - cellPtsCoords = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] - nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) - cellTypes = nbCells * [celltype] - mesh: vtkUnstructuredGrid = createMultiCellMesh(cellTypes, cellPtsCoords, False) + cellPtsCoords = [ ptsCoords[ i:i + nbPtsCell ] for i in range( 0, ptsCoords.shape[ 0 ], nbPtsCell ) ] + nbCells: int = int( ptsCoords.shape[ 0 ] / nbPtsCell ) + cellTypes = nbCells * [ celltype ] + mesh: vtkUnstructuredGrid = createMultiCellMesh( cellTypes, cellPtsCoords, False ) assert mesh is not None, "Input mesh is undefined." yield TestCase( mesh, pointsExp, cellPtsIdsExp ) -ids: list[str] = [os.path.splitext(name)[0] for name in data_filename_all] +ids: list[ str ] = [ os.path.splitext( name )[ 0 ] for name in data_filename_all ] + + @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_mergeColocatedPoints( test_case: TestCase ) ->None: +def test_mergeColocatedPoints( test_case: TestCase ) -> None: """Test of MergeColocatedPoints filter.. Args: test_case (TestCase): test case """ filter = MergeColocatedPoints() - filter.SetInputDataObject(0, test_case.mesh) + filter.SetInputDataObject( 0, test_case.mesh ) filter.Update() - output: vtkUnstructuredGrid = filter.GetOutputDataObject(0) + output: vtkUnstructuredGrid = filter.GetOutputDataObject( 0 ) # tests on points pointsOut: vtkPoints = output.GetPoints() assert pointsOut is not None, "Output points is undefined." - nbPtsExp: int = test_case.pointsExp.shape[0] + nbPtsExp: int = test_case.pointsExp.shape[ 0 ] assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords Obs: ", pointCoords.tolist()) - assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." + pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) + print( "Points coords Obs: ", pointCoords.tolist() ) + assert np.array_equal( pointCoords, test_case.pointsExp ), "Points coordinates are wrong." # tests on cells cellsOut: vtkCellArray = output.GetCells() @@ -100,23 +118,21 @@ def test_mergeColocatedPoints( test_case: TestCase ) ->None: # check cell types typesInput: vtkCellTypes = vtkCellTypes() - test_case.mesh.GetCellTypes(typesInput) + test_case.mesh.GetCellTypes( typesInput ) assert typesInput is not None, "Input cell types must be defined" typesOutput: vtkCellTypes = vtkCellTypes() - output.GetCellTypes(typesOutput) + output.GetCellTypes( typesOutput ) assert typesOutput is not None, "Output cell types must be defined" - typesArrayInput: npt.NDArray[np.int64] = vtk_to_numpy(typesInput.GetCellTypesArray()) - typesArrayOutput: npt.NDArray[np.int64] = vtk_to_numpy(typesOutput.GetCellTypesArray()) - assert np.array_equal(typesArrayInput, typesArrayOutput), "Cell types are wrong" + typesArrayInput: npt.NDArray[ np.int64 ] = vtk_to_numpy( typesInput.GetCellTypesArray() ) + typesArrayOutput: npt.NDArray[ np.int64 ] = vtk_to_numpy( typesOutput.GetCellTypesArray() ) + assert np.array_equal( typesArrayInput, typesArrayOutput ), "Cell types are wrong" - for cellId in range(output.GetNumberOfCells()): + for cellId in range( output.GetNumberOfCells() ): ptIds = vtkIdList() - cellsOut.GetCellAtId(cellId, ptIds) - cellsOutObs: tuple[int] = tuple([ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())]) - print("cellsOutObs: ", cellsOutObs) - nbCellPts: int = len(test_case.cellPtsIdsExp[cellId]) + cellsOut.GetCellAtId( cellId, ptIds ) + cellsOutObs: tuple[ int ] = tuple( [ ptIds.GetId( j ) for j in range( ptIds.GetNumberOfIds() ) ] ) + print( "cellsOutObs: ", cellsOutObs ) + nbCellPts: int = len( test_case.cellPtsIdsExp[ cellId ] ) assert ptIds is not None, "Point ids must be defined" assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." - assert cellsOutObs == test_case.cellPtsIdsExp[cellId], "Cell point ids are wrong." - - + assert cellsOutObs == test_case.cellPtsIdsExp[ cellId ], "Cell point ids are wrong." diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index 6c2c21c49..a428ee7cb 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -7,21 +7,15 @@ import numpy.typing as npt import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.processing.helpers import createSingleCellMesh from geos.mesh.processing.SplitMesh import SplitMesh from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkCellArray, - vtkCellData, - vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID -) +from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCellArray, vtkCellData, vtkCellTypes, VTK_TRIANGLE, + VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID ) from vtkmodules.vtkCommonCore import ( vtkPoints, @@ -30,8 +24,7 @@ ) #from vtkmodules.vtkFiltersSources import vtkCubeSource - -data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") +data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) ############################################################### # create single tetra mesh # @@ -40,15 +33,11 @@ tetra_path = "tetra_cell.csv" # expected results -tetra_points_out: npt.NDArray[np.float64] = np.array([[0., 0., 0. ], [1., 0., 0. ], [0., 0., 1. ], [0., 1., 0. ], [0.5, 0., 0. ], [0.5, 0., 0.5], [0., 0., 0.5], [0., 0.5, 0. ], [0., 0.5, 0.5], [0.5, 0.5, 0. ]], np.float64) -tetra_cells_out: list[list[int]] = [[0, 4, 6, 7], - [7, 9, 8, 3], - [9, 4, 5, 1], - [5, 6, 8, 2], - [6, 8, 7, 4], - [4, 8, 7, 9], - [4, 8, 9, 5], - [5, 4, 8, 6]] +tetra_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0., 0., 0. ], [ 1., 0., 0. ], [ 0., 0., 1. ], [ 0., 1., 0. ], [ 0.5, 0., 0. ], [ 0.5, 0., 0.5 ], + [ 0., 0., 0.5 ], [ 0., 0.5, 0. ], [ 0., 0.5, 0.5 ], [ 0.5, 0.5, 0. ] ], np.float64 ) +tetra_cells_out: list[ list[ int ] ] = [ [ 0, 4, 6, 7 ], [ 7, 9, 8, 3 ], [ 9, 4, 5, 1 ], [ 5, 6, 8, 2 ], [ 6, 8, 7, 4 ], + [ 4, 8, 7, 9 ], [ 4, 8, 9, 5 ], [ 5, 4, 8, 6 ] ] ############################################################### # create single hexa mesh # @@ -57,15 +46,16 @@ hexa_path = "hexa_cell.csv" # expected results -hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0], [0.0, 1.0, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5], [1.0, 0.5, 0.0], [1.0, 0.0, 0.5], [0.5, 1.0, 0.0], [1.0, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 0.0, 1.0], [0.0, 0.5, 1.0], [1.0, 0.5, 1.0], [0.5, 1.0, 1.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [1.0, 0.5, 0.5], [0.5, 1.0, 0.5], [0.5, 0.5, 1.0], [0.5, 0.5, 0.5]], np.float64) -hexa_cells_out: list[list[int]] = [[10, 21, 26, 22, 4, 16, 25, 17], - [21, 12, 23, 26, 16, 5, 18, 25], - [0, 8, 20, 9, 10, 21, 26, 22], - [8, 1, 11, 20, 21, 12, 23, 26], - [22, 26, 24, 15, 17, 25, 19, 7], - [26, 23, 14, 24, 25, 18, 6, 19], - [9, 20, 13, 3, 22, 26, 24, 15], - [20, 11, 2, 13, 26, 23, 14, 24]] +hexa_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 0.0, 0.0, 1.0 ], [ 1.0, 0.0, 1.0 ], + [ 1.0, 1.0, 1.0 ], [ 0.0, 1.0, 1.0 ], [ 0.5, 0.0, 0.0 ], [ 0.0, 0.5, 0.0 ], [ 0.0, 0.0, 0.5 ], [ 1.0, 0.5, 0.0 ], + [ 1.0, 0.0, 0.5 ], [ 0.5, 1.0, 0.0 ], [ 1.0, 1.0, 0.5 ], [ 0.0, 1.0, 0.5 ], [ 0.5, 0.0, 1.0 ], [ 0.0, 0.5, 1.0 ], + [ 1.0, 0.5, 1.0 ], [ 0.5, 1.0, 1.0 ], [ 0.5, 0.5, 0.0 ], [ 0.5, 0.0, 0.5 ], [ 0.0, 0.5, 0.5 ], [ 1.0, 0.5, 0.5 ], + [ 0.5, 1.0, 0.5 ], [ 0.5, 0.5, 1.0 ], [ 0.5, 0.5, 0.5 ] ], np.float64 ) +hexa_cells_out: list[ list[ int ] ] = [ [ 10, 21, 26, 22, 4, 16, 25, 17 ], [ 21, 12, 23, 26, 16, 5, 18, 25 ], + [ 0, 8, 20, 9, 10, 21, 26, 22 ], [ 8, 1, 11, 20, 21, 12, 23, 26 ], + [ 22, 26, 24, 15, 17, 25, 19, 7 ], [ 26, 23, 14, 24, 25, 18, 6, 19 ], + [ 9, 20, 13, 3, 22, 26, 24, 15 ], [ 20, 11, 2, 13, 26, 23, 14, 24 ] ] ############################################################### # create single pyramid mesh # @@ -74,17 +64,13 @@ pyramid_path = "pyramid_cell.csv" # expected results -pyramid_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.5, 1.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.25, 0.25, 0.5], [1.0, 0.5, 0.0], [0.75, 0.25, 0.5], [0.5, 1.0, 0.0], [0.75, 0.75, 0.5], [0.25, 0.75, 0.5], [0.5, 0.5, 0.0]], np.float64) -pyramid_cells_out: list[list[int]] = [[5, 1, 8, 13, 9], - [13, 8, 2, 10, 11], - [3, 6, 13, 10, 12], - [6, 0, 5, 13, 7], - [12, 7, 9, 11, 4], - [11, 9, 7, 12, 13], - [7, 9, 5, 13], - [9, 11, 8, 13], - [11, 12, 10, 13], - [12, 7, 6, 13]] +pyramid_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 0.5, 0.5, 1.0 ], [ 0.5, 0.0, 0.0 ], + [ 0.0, 0.5, 0.0 ], [ 0.25, 0.25, 0.5 ], [ 1.0, 0.5, 0.0 ], [ 0.75, 0.25, 0.5 ], [ 0.5, 1.0, 0.0 ], + [ 0.75, 0.75, 0.5 ], [ 0.25, 0.75, 0.5 ], [ 0.5, 0.5, 0.0 ] ], np.float64 ) +pyramid_cells_out: list[ list[ int ] ] = [ [ 5, 1, 8, 13, 9 ], [ 13, 8, 2, 10, 11 ], [ 3, 6, 13, 10, 12 ], + [ 6, 0, 5, 13, 7 ], [ 12, 7, 9, 11, 4 ], [ 11, 9, 7, 12, 13 ], + [ 7, 9, 5, 13 ], [ 9, 11, 8, 13 ], [ 11, 12, 10, 13 ], [ 12, 7, 6, 13 ] ] ############################################################### # create single triangle mesh # @@ -93,11 +79,10 @@ triangle_path = "triangle_cell.csv" # expected results -triangle_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0]], np.float64) -triangle_cells_out: list[list[int]] = [[0, 3, 5], - [3, 1, 4], - [5, 4, 2], - [3, 4, 5]] +triangle_points_out: npt.NDArray[ np.float64 ] = np.array( [ [ 0.0, 0.0, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 0.0, 1.0, 0.0 ], + [ 0.5, 0.0, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.0 ] ], + np.float64 ) +triangle_cells_out: list[ list[ int ] ] = [ [ 0, 3, 5 ], [ 3, 1, 4 ], [ 5, 4, 2 ], [ 3, 4, 5 ] ] ############################################################### # create single quad mesh # @@ -106,22 +91,21 @@ quad_path = "quad_cell.csv" # expected results -quad_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.5, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0]], np.float64) -quad_cells_out: list[list[int]] = [[0, 4, 8, 7], - [4, 1, 5, 8], - [8, 5, 2, 6], - [7, 8, 6, 3]] +quad_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 1.0, 0.5, 0.0 ], + [ 0.5, 1.0, 0.0 ], [ 0.0, 0.5, 0.0 ], [ 0.5, 0.5, 0.0 ] ], np.float64 ) +quad_cells_out: list[ list[ int ] ] = [ [ 0, 4, 8, 7 ], [ 4, 1, 5, 8 ], [ 8, 5, 2, 6 ], [ 7, 8, 6, 3 ] ] ############################################################### # create multi cell mesh # ############################################################### # TODO: add tests cases composed of multi-cell meshes of various types +data_filename_all = ( tetra_path, hexa_path, pyramid_path, triangle_path, quad_path ) +cell_types_all = ( tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type ) +points_out_all = ( tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out ) +cells_out_all = ( tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out ) -data_filename_all = (tetra_path, hexa_path, pyramid_path, triangle_path, quad_path) -cell_types_all = (tetra_cell_type, hexa_cell_type, pyramid_cell_type, triangle_cell_type, quad_cell_type) -points_out_all = (tetra_points_out, hexa_points_out, pyramid_points_out, triangle_points_out, quad_points_out) -cells_out_all = (tetra_cells_out, hexa_cells_out, pyramid_cells_out, triangle_cells_out, quad_cells_out) @dataclass( frozen=True ) class TestCase: @@ -132,9 +116,9 @@ class TestCase: #: mesh mesh: vtkUnstructuredGrid #: expected new point coordinates - pointsExp: npt.NDArray[np.float64] + pointsExp: npt.NDArray[ np.float64 ] #: expected new cell point ids - cellsExp: list[int] + cellsExp: list[ int ] def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: @@ -143,65 +127,73 @@ def __generate_split_mesh_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, data_path, pointsExp, cellsExp in zip( - cell_types_all, data_filename_all, points_out_all, cells_out_all, - strict=True): - ptsCoord: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, data_path), dtype=float, delimiter=',') - mesh: vtkUnstructuredGrid = createSingleCellMesh(cellType, ptsCoord) + for cellType, data_path, pointsExp, cellsExp in zip( cell_types_all, + data_filename_all, + points_out_all, + cells_out_all, + strict=True ): + ptsCoord: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, data_path ), + dtype=float, + delimiter=',' ) + mesh: vtkUnstructuredGrid = createSingleCellMesh( cellType, ptsCoord ) yield TestCase( cellType, mesh, pointsExp, cellsExp ) -ids = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_types_all] +ids = [ vtkCellTypes.GetClassNameFromTypeId( cellType ) for cellType in cell_types_all ] + + @pytest.mark.parametrize( "test_case", __generate_split_mesh_test_data(), ids=ids ) -def test_single_cell_split( test_case: TestCase ) ->None: +def test_single_cell_split( test_case: TestCase ) -> None: """Test of SplitMesh filter with meshes composed of a single cell. Args: test_case (TestCase): test case """ - cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) - filter :SplitMesh = SplitMesh() - filter.SetInputDataObject(test_case.mesh) + cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId( test_case.cellType ) + filter: SplitMesh = SplitMesh() + filter.SetInputDataObject( test_case.mesh ) filter.Update() - output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) + output: vtkUnstructuredGrid = filter.GetOutputDataObject( 0 ) assert output is not None, "Output mesh is undefined." pointsOut: vtkPoints = output.GetPoints() assert pointsOut is not None, "Points from output mesh are undefined." - assert pointsOut.GetNumberOfPoints() == test_case.pointsExp.shape[0], f"Number of points is expected to be {test_case.pointsExp.shape[0]}." - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords: ", cellTypeName, pointCoords.tolist()) - assert np.array_equal(pointCoords.ravel(), test_case.pointsExp.ravel()), "Points coordinates mesh are wrong." + assert pointsOut.GetNumberOfPoints( + ) == test_case.pointsExp.shape[ 0 ], f"Number of points is expected to be {test_case.pointsExp.shape[0]}." + pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) + print( "Points coords: ", cellTypeName, pointCoords.tolist() ) + assert np.array_equal( pointCoords.ravel(), test_case.pointsExp.ravel() ), "Points coordinates mesh are wrong." cellsOut: vtkCellArray = output.GetCells() - typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) - print("typesArray0", cellTypeName, typesArray0) + typesArray0: npt.NDArray[ np.int64 ] = vtk_to_numpy( output.GetDistinctCellTypesArray() ) + print( "typesArray0", cellTypeName, typesArray0 ) assert cellsOut is not None, "Cells from output mesh are undefined." - assert cellsOut.GetNumberOfCells() == len(test_case.cellsExp), f"Number of cells is expected to be {len(test_case.cellsExp)}." + assert cellsOut.GetNumberOfCells() == len( + test_case.cellsExp ), f"Number of cells is expected to be {len(test_case.cellsExp)}." # check cell types types: vtkCellTypes = vtkCellTypes() - output.GetCellTypes(types) + output.GetCellTypes( types ) assert types is not None, "Cell types must be defined" - typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + typesArray: npt.NDArray[ np.int64 ] = vtk_to_numpy( types.GetCellTypesArray() ) - print("typesArray", cellTypeName, typesArray) - assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"All cells must be {cellTypeName}" + print( "typesArray", cellTypeName, typesArray ) + assert ( typesArray.size == 1 ) and ( typesArray[ 0 ] == test_case.cellType ), f"All cells must be {cellTypeName}" - for i in range(cellsOut.GetNumberOfCells()): + for i in range( cellsOut.GetNumberOfCells() ): ptIds = vtkIdList() - cellsOut.GetCellAtId(i, ptIds) - cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] - nbPtsExp: int = len(test_case.cellsExp[i]) - print("cell type", cellTypeName, i, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(i))) - print("cellsOutObs: ", cellTypeName, i, cellsOutObs) + cellsOut.GetCellAtId( i, ptIds ) + cellsOutObs: list[ int ] = [ ptIds.GetId( j ) for j in range( ptIds.GetNumberOfIds() ) ] + nbPtsExp: int = len( test_case.cellsExp[ i ] ) + print( "cell type", cellTypeName, i, vtkCellTypes.GetClassNameFromTypeId( types.GetCellType( i ) ) ) + print( "cellsOutObs: ", cellTypeName, i, cellsOutObs ) assert ptIds is not None, "Point ids must be defined" assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." - assert cellsOutObs == test_case.cellsExp[i], "Cell point ids are wrong." + assert cellsOutObs == test_case.cellsExp[ i ], "Cell point ids are wrong." # test originalId array was created cellData: vtkCellData = output.GetCellData() assert cellData is not None, "Cell data should be defined." - array: vtkDataArray = cellData.GetArray("OriginalID") + array: vtkDataArray = cellData.GetArray( "OriginalID" ) assert array is not None, "OriginalID array should be defined." # test other arrays were transferred diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py index ab7c8ef05..ed7213110 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -7,19 +7,14 @@ import numpy.typing as npt import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.processing.helpers import createSingleCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkCellArray, - vtkCellTypes, - VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID -) +from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkCellArray, vtkCellTypes, VTK_TRIANGLE, VTK_QUAD, + VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID ) from vtkmodules.vtkCommonCore import ( vtkPoints, @@ -27,10 +22,11 @@ ) # inputs -data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") +data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) -data_filename_all: tuple[str,...] = ("triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", "hexa_cell.csv") -cell_type_all: tuple[int, ...] = (VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON) +data_filename_all: tuple[ str, ...] = ( "triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", + "hexa_cell.csv" ) +cell_type_all: tuple[ int, ...] = ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON ) @dataclass( frozen=True ) @@ -40,7 +36,8 @@ class TestCase: #: VTK cell type cellType: int #: cell point coordinates - cellPoints: npt.NDArray[np.float64] + cellPoints: npt.NDArray[ np.float64 ] + def __generate_test_data() -> Iterator[ TestCase ]: """Generate test cases. @@ -48,55 +45,54 @@ def __generate_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for cellType, path in zip( - cell_type_all, data_filename_all, - strict=True): - cell: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + for cellType, path in zip( cell_type_all, data_filename_all, strict=True ): + cell: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, path ), dtype=float, delimiter=',' ) yield TestCase( cellType, cell ) -ids: list[str] = [vtkCellTypes.GetClassNameFromTypeId(cellType) for cellType in cell_type_all] +ids: list[ str ] = [ vtkCellTypes.GetClassNameFromTypeId( cellType ) for cellType in cell_type_all ] + + @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createSingleCellMesh( test_case: TestCase ) ->None: +def test_createSingleCellMesh( test_case: TestCase ) -> None: """Test of createSingleCellMesh method. Args: test_case (TestCase): test case """ - cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId(test_case.cellType) - output: vtkUnstructuredGrid = createSingleCellMesh(test_case.cellType, test_case.cellPoints) + cellTypeName: str = vtkCellTypes.GetClassNameFromTypeId( test_case.cellType ) + output: vtkUnstructuredGrid = createSingleCellMesh( test_case.cellType, test_case.cellPoints ) assert output is not None, "Output mesh is undefined." pointsOut: vtkPoints = output.GetPoints() - nbPtsExp: int = len(test_case.cellPoints) + nbPtsExp: int = len( test_case.cellPoints ) assert pointsOut is not None, "Points from output mesh are undefined." assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords: ", cellTypeName, pointCoords.tolist()) - assert np.array_equal(pointCoords.ravel(), test_case.cellPoints.ravel()), "Points coordinates are wrong." + pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) + print( "Points coords: ", cellTypeName, pointCoords.tolist() ) + assert np.array_equal( pointCoords.ravel(), test_case.cellPoints.ravel() ), "Points coordinates are wrong." cellsOut: vtkCellArray = output.GetCells() - typesArray0: npt.NDArray[np.int64] = vtk_to_numpy(output.GetDistinctCellTypesArray()) - print("typesArray0", cellTypeName, typesArray0) + typesArray0: npt.NDArray[ np.int64 ] = vtk_to_numpy( output.GetDistinctCellTypesArray() ) + print( "typesArray0", cellTypeName, typesArray0 ) assert cellsOut is not None, "Cells from output mesh are undefined." assert cellsOut.GetNumberOfCells() == 1, "Number of cells is expected to be 1." # check cell types types: vtkCellTypes = vtkCellTypes() - output.GetCellTypes(types) + output.GetCellTypes( types ) assert types is not None, "Cell types must be defined" - typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) + typesArray: npt.NDArray[ np.int64 ] = vtk_to_numpy( types.GetCellTypesArray() ) - print("typesArray", cellTypeName, typesArray) - assert (typesArray.size == 1) and (typesArray[0] == test_case.cellType), f"Cell must be {cellTypeName}" + print( "typesArray", cellTypeName, typesArray ) + assert ( typesArray.size == 1 ) and ( typesArray[ 0 ] == test_case.cellType ), f"Cell must be {cellTypeName}" ptIds = vtkIdList() - cellsOut.GetCellAtId(0, ptIds) - cellsOutObs: list[int] = [ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())] + cellsOut.GetCellAtId( 0, ptIds ) + cellsOutObs: list[ int ] = [ ptIds.GetId( j ) for j in range( ptIds.GetNumberOfIds() ) ] - print("cell type", cellTypeName, vtkCellTypes.GetClassNameFromTypeId(types.GetCellType(0))) - print("cellsOutObs: ", cellTypeName, cellsOutObs) + print( "cell type", cellTypeName, vtkCellTypes.GetClassNameFromTypeId( types.GetCellType( 0 ) ) ) + print( "cellsOutObs: ", cellTypeName, cellsOutObs ) assert ptIds is not None, "Point ids must be defined" assert ptIds.GetNumberOfIds() == nbPtsExp, f"Cells must be defined by {nbPtsExp} points." - assert cellsOutObs == list(range(nbPtsExp)), "Cell point ids are wrong." - + assert cellsOutObs == list( range( nbPtsExp ) ), "Cell point ids are wrong." diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index b4377c20a..247c47c83 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -7,8 +7,7 @@ import numpy.typing as npt import pytest from typing import ( - Iterator, -) + Iterator, ) from geos.mesh.processing.helpers import getBounds, createVertices, createMultiCellMesh @@ -18,7 +17,8 @@ vtkUnstructuredGrid, vtkCellArray, vtkCellTypes, - VTK_TETRA, VTK_HEXAHEDRON, + VTK_TETRA, + VTK_HEXAHEDRON, ) from vtkmodules.vtkCommonCore import ( @@ -29,34 +29,46 @@ # TODO: add case whith various cell types # inputs -data_root: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") -data_filename_all: tuple[str,...] = ("tetra_mesh.csv", "hexa_mesh.csv") -celltypes_all: tuple[int] = (VTK_TETRA, VTK_HEXAHEDRON) -nbPtsCell_all: tuple[int] = (4, 8) +data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) +data_filename_all: tuple[ str, ...] = ( "tetra_mesh.csv", "hexa_mesh.csv" ) +celltypes_all: tuple[ int ] = ( VTK_TETRA, VTK_HEXAHEDRON ) +nbPtsCell_all: tuple[ int ] = ( 4, 8 ) # expected results if shared vertices -hexa_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.0, 0.0, 1.0], [0.5, 0.0, 1.0], [0.5, 0.5, 1.0], [0.0, 0.5, 1.0], [1.0, 0.0, 0.5], [1.0, 0.5, 0.5], [1.0, 0.0, 1.0], [1.0, 0.5, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [1.0, 0.0, 0.0], [1.0, 0.5, 0.0], [0.5, 1.0, 0.5], [0.0, 1.0, 0.5], [0.5, 1.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 0.5], [1.0, 1.0, 1.0], [0.5, 1.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0]], np.float64) -tetra_points_out: npt.NDArray[np.float64] = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.0, 1.0, 0.0], [0.5, 0.0, 0.5], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]], np.float64) -points_out_all = (tetra_points_out, hexa_points_out) +hexa_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.5 ], [ 0.5, 0.0, 0.5 ], [ 0.5, 0.5, 0.5 ], [ 0.0, 0.5, 0.5 ], [ 0.0, 0.0, 1.0 ], [ 0.5, 0.0, 1.0 ], + [ 0.5, 0.5, 1.0 ], [ 0.0, 0.5, 1.0 ], [ 1.0, 0.0, 0.5 ], [ 1.0, 0.5, 0.5 ], [ 1.0, 0.0, 1.0 ], [ 1.0, 0.5, 1.0 ], + [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 0.5, 0.0 ], + [ 0.5, 1.0, 0.5 ], [ 0.0, 1.0, 0.5 ], [ 0.5, 1.0, 1.0 ], [ 0.0, 1.0, 1.0 ], [ 1.0, 1.0, 0.5 ], [ 1.0, 1.0, 1.0 ], + [ 0.5, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 1.0, 1.0, 0.0 ] ], np.float64 ) +tetra_points_out: npt.NDArray[ np.float64 ] = np.array( + [ [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.0, 0.0, 0.5 ], [ 0.0, 0.5, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.5 ], + [ 0.0, 1.0, 0.0 ], [ 0.5, 0.0, 0.5 ], [ 1.0, 0.0, 0.0 ], [ 0.0, 0.0, 1.0 ] ], np.float64 ) +points_out_all = ( tetra_points_out, hexa_points_out ) + +tetra_cellPtsIdsExp = [ ( 0, 1, 2, 3 ), ( 3, 4, 5, 6 ), ( 4, 1, 7, 8 ), ( 7, 2, 5, 9 ), ( 2, 5, 3, 1 ), ( 1, 5, 3, 4 ), + ( 1, 5, 4, 7 ), ( 7, 1, 5, 2 ) ] +hexa_cellPtsIdsExp = [ ( 0, 1, 2, 3, 4, 5, 6, 7 ), ( 1, 8, 9, 2, 5, 10, 11, 6 ), ( 12, 13, 14, 15, 0, 1, 2, 3 ), + ( 13, 16, 17, 14, 1, 8, 9, 2 ), ( 3, 2, 18, 19, 7, 6, 20, 21 ), ( 2, 9, 22, 18, 6, 11, 23, 20 ), + ( 15, 14, 24, 25, 3, 2, 18, 19 ), ( 14, 17, 26, 24, 2, 9, 22, 18 ) ] +cellPtsIdsExp_all = ( tetra_cellPtsIdsExp, hexa_cellPtsIdsExp ) -tetra_cellPtsIdsExp = [(0, 1, 2, 3), (3, 4, 5, 6), (4, 1, 7, 8), (7, 2, 5, 9), (2, 5, 3, 1), (1, 5, 3, 4), (1, 5, 4, 7), (7, 1, 5, 2)] -hexa_cellPtsIdsExp = [(0, 1, 2, 3, 4, 5, 6, 7), (1, 8, 9, 2, 5, 10, 11, 6), (12, 13, 14, 15, 0, 1, 2, 3), (13, 16, 17, 14, 1, 8, 9, 2), (3, 2, 18, 19, 7, 6, 20, 21), (2, 9, 22, 18, 6, 11, 23, 20), (15, 14, 24, 25, 3, 2, 18, 19), (14, 17, 26, 24, 2, 9, 22, 18)] -cellPtsIdsExp_all = (tetra_cellPtsIdsExp, hexa_cellPtsIdsExp) @dataclass( frozen=True ) class TestCase: """Test case.""" __test__ = False #: cell types - cellTypes: list[int] + cellTypes: list[ int ] #: cell point coordinates - cellPtsCoords: list[npt.NDArray[np.float64]] + cellPtsCoords: list[ npt.NDArray[ np.float64 ] ] #: share or unshare vertices share: bool #: expected points - pointsExp: npt.NDArray[np.float64] + pointsExp: npt.NDArray[ np.float64 ] #: expected cell point ids - cellPtsIdsExp: tuple[tuple[int]] + cellPtsIdsExp: tuple[ tuple[ int ] ] + def __generate_test_data() -> Iterator[ TestCase ]: """Generate test cases. @@ -64,95 +76,113 @@ def __generate_test_data() -> Iterator[ TestCase ]: Yields: Iterator[ TestCase ]: iterator on test cases """ - for path, celltype, nbPtsCell, pointsExp0, cellPtsIdsExp0 in zip(data_filename_all, celltypes_all, nbPtsCell_all, points_out_all, cellPtsIdsExp_all, strict=True): + for path, celltype, nbPtsCell, pointsExp0, cellPtsIdsExp0 in zip( data_filename_all, + celltypes_all, + nbPtsCell_all, + points_out_all, + cellPtsIdsExp_all, + strict=True ): # all points coordinates - ptsCoords: npt.NDArray[np.float64] = np.loadtxt(os.path.join(data_root, path), dtype=float, delimiter=',') + ptsCoords: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, path ), dtype=float, delimiter=',' ) # split array to get a list of coordinates per cell - cellPtsCoords: list[npt.NDArray[np.float64]] = [ptsCoords[i:i+nbPtsCell] for i in range(0, ptsCoords.shape[0], nbPtsCell)] - nbCells: int = int(ptsCoords.shape[0]/nbPtsCell) - cellTypes = nbCells * [celltype] - for shared in (False, True): - pointsExp: npt.NDArray[np.float64] = pointsExp0 if shared else ptsCoords - cellPtsIdsExp = cellPtsIdsExp0 if shared else [tuple(range(i*nbPtsCell, (i+1)*nbPtsCell, 1)) for i in range(nbCells)] + cellPtsCoords: list[ npt.NDArray[ np.float64 ] ] = [ + ptsCoords[ i:i + nbPtsCell ] for i in range( 0, ptsCoords.shape[ 0 ], nbPtsCell ) + ] + nbCells: int = int( ptsCoords.shape[ 0 ] / nbPtsCell ) + cellTypes = nbCells * [ celltype ] + for shared in ( False, True ): + pointsExp: npt.NDArray[ np.float64 ] = pointsExp0 if shared else ptsCoords + cellPtsIdsExp = cellPtsIdsExp0 if shared else [ + tuple( range( i * nbPtsCell, ( i + 1 ) * nbPtsCell, 1 ) ) for i in range( nbCells ) + ] yield TestCase( cellTypes, cellPtsCoords, shared, pointsExp, cellPtsIdsExp ) -ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] +ids: list[ str ] = [ + os.path.splitext( name )[ 0 ] + f"_{shared}]" for name in data_filename_all for shared in ( False, True ) +] + + @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createVertices( test_case: TestCase )->None: +def test_createVertices( test_case: TestCase ) -> None: """Test of createVertices method. Args: test_case (TestCase): test case """ pointsOut: vtkPoints - cellPtsIds: list[tuple[int, ...]] - pointsOut, cellPtsIds = createVertices(test_case.cellPtsCoords, test_case.share) + cellPtsIds: list[ tuple[ int, ...] ] + pointsOut, cellPtsIds = createVertices( test_case.cellPtsCoords, test_case.share ) assert pointsOut is not None, "Output points is undefined." assert cellPtsIds is not None, "Output cell point map is undefined." - nbPtsExp: int = test_case.pointsExp.shape[0] + nbPtsExp: int = test_case.pointsExp.shape[ 0 ] assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords Obs: ", pointCoords.tolist()) - assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." - print("Cell points coords: ", cellPtsIds) + pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) + print( "Points coords Obs: ", pointCoords.tolist() ) + assert np.array_equal( pointCoords, test_case.pointsExp ), "Points coordinates are wrong." + print( "Cell points coords: ", cellPtsIds ) assert cellPtsIds == test_case.cellPtsIdsExp, f"Cell point Ids are expected to be {test_case.cellPtsIdsExp}" -ids: list[str] = [os.path.splitext(name)[0]+f"_{shared}]" for name in data_filename_all for shared in (False, True)] + +ids: list[ str ] = [ + os.path.splitext( name )[ 0 ] + f"_{shared}]" for name in data_filename_all for shared in ( False, True ) +] + + @pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_createMultiCellMesh( test_case: TestCase )->None: +def test_createMultiCellMesh( test_case: TestCase ) -> None: """Test of createMultiCellMesh method. Args: test_case (TestCase): test case """ - output: vtkUnstructuredGrid = createMultiCellMesh(test_case.cellTypes, test_case.cellPtsCoords, test_case.share) + output: vtkUnstructuredGrid = createMultiCellMesh( test_case.cellTypes, test_case.cellPtsCoords, test_case.share ) assert output is not None, "Output mesh is undefined." # tests on points pointsOut: vtkPoints = output.GetPoints() assert pointsOut is not None, "Output points is undefined." - nbPtsExp: int = test_case.pointsExp.shape[0] + nbPtsExp: int = test_case.pointsExp.shape[ 0 ] assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." - pointCoords: npt.NDArray[np.float64] = vtk_to_numpy(pointsOut.GetData()) - print("Points coords Obs: ", pointCoords.tolist()) - assert np.array_equal(pointCoords, test_case.pointsExp), "Points coordinates are wrong." + pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) + print( "Points coords Obs: ", pointCoords.tolist() ) + assert np.array_equal( pointCoords, test_case.pointsExp ), "Points coordinates are wrong." # tests on cells cellsOut: vtkCellArray = output.GetCells() assert cellsOut is not None, "Cells from output mesh are undefined." - nbCells: int = len(test_case.cellPtsCoords) + nbCells: int = len( test_case.cellPtsCoords ) assert cellsOut.GetNumberOfCells() == nbCells, f"Number of cells is expected to be {nbCells}." # check cell types types: vtkCellTypes = vtkCellTypes() - output.GetCellTypes(types) + output.GetCellTypes( types ) assert types is not None, "Cell types must be defined" - typesArray: npt.NDArray[np.int64] = vtk_to_numpy(types.GetCellTypesArray()) - print("typesArray.size ", typesArray.size) - assert (typesArray.size == 1) and (typesArray[0] == test_case.cellTypes[0]), "Cell types are wrong" + typesArray: npt.NDArray[ np.int64 ] = vtk_to_numpy( types.GetCellTypesArray() ) + print( "typesArray.size ", typesArray.size ) + assert ( typesArray.size == 1 ) and ( typesArray[ 0 ] == test_case.cellTypes[ 0 ] ), "Cell types are wrong" - for cellId in range(output.GetNumberOfCells()): + for cellId in range( output.GetNumberOfCells() ): ptIds = vtkIdList() - cellsOut.GetCellAtId(cellId, ptIds) - cellsOutObs: tuple[int] = tuple([ptIds.GetId(j) for j in range(ptIds.GetNumberOfIds())]) - print("cellsOutObs: ", cellsOutObs) - nbCellPts: int = len(test_case.cellPtsIdsExp[cellId]) + cellsOut.GetCellAtId( cellId, ptIds ) + cellsOutObs: tuple[ int ] = tuple( [ ptIds.GetId( j ) for j in range( ptIds.GetNumberOfIds() ) ] ) + print( "cellsOutObs: ", cellsOutObs ) + nbCellPts: int = len( test_case.cellPtsIdsExp[ cellId ] ) assert ptIds is not None, "Point ids must be defined" assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." - assert cellsOutObs == test_case.cellPtsIdsExp[cellId], "Cell point ids are wrong." + assert cellsOutObs == test_case.cellPtsIdsExp[ cellId ], "Cell point ids are wrong." -def test_getBounds( )->None: + +def test_getBounds() -> None: """Test of getBounds method.""" # input - cellPtsCoord: list[npt.NDArray[np.float64]] = [ - np.array([[5, 4, 3], [1, 8, 4], [2, 5, 7]], dtype=float), - np.array([[1, 4, 6], [2, 7, 9], [4, 5 ,6]], dtype=float), - np.array([[3, 7, 8], [5, 7, 3], [4, 7, 3]], dtype=float), - np.array([[1, 7, 2], [0, 1, 2], [2, 3, 7]], dtype=float), + cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] = [ + np.array( [ [ 5, 4, 3 ], [ 1, 8, 4 ], [ 2, 5, 7 ] ], dtype=float ), + np.array( [ [ 1, 4, 6 ], [ 2, 7, 9 ], [ 4, 5, 6 ] ], dtype=float ), + np.array( [ [ 3, 7, 8 ], [ 5, 7, 3 ], [ 4, 7, 3 ] ], dtype=float ), + np.array( [ [ 1, 7, 2 ], [ 0, 1, 2 ], [ 2, 3, 7 ] ], dtype=float ), ] # expected output - boundsExp: list[float] = [0., 5., 1., 8., 2., 9.] - boundsObs: list[float] = getBounds(cellPtsCoord) + boundsExp: list[ float ] = [ 0., 5., 1., 8., 2., 9. ] + boundsObs: list[ float ] = getBounds( cellPtsCoord ) assert boundsExp == boundsObs, f"Expected bounds are {boundsExp}." - From 15747994e13ebf39ecc07dd4f8df6bfbf93352e9 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Thu, 24 Apr 2025 09:12:31 +0200 Subject: [PATCH 23/57] fix test --- geos-mesh/tests/test_CellTypeCounter.py | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index 83be05eda..19243f4eb 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -76,10 +76,10 @@ def test_CellTypeCounter_single( test_case: TestCase ) -> None: filter: CellTypeCounter = CellTypeCounter() filter.SetInputDataObject( test_case.mesh ) filter.Update() - counts: CellTypeCounts = filter.GetCellTypeCounts() - assert counts is not None, "CellTypeCounts is undefined" + countsObs: CellTypeCounts = filter.GetCellTypeCounts() + assert countsObs is not None, "CellTypeCounts is undefined" - assert counts.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( + assert countsObs.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( ), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell @@ -92,14 +92,14 @@ def test_CellTypeCounter_single( test_case: TestCase ) -> None: # check cell type counts for i, elementType in enumerate( elementTypes ): assert int( - counts.getTypeCount( elementType ) + countsObs.getTypeCount( elementType ) ) == counts[ i ], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." nbPolygon: int = counts[ 0 ] + counts[ 1 ] nbPolyhedra: int = np.sum( counts[ 2: ] ) - assert int( counts.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int( countsObs.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." assert int( - counts.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + countsObs.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." def __generate_test_data_multi_cell() -> Iterator[ TestCase ]: @@ -135,15 +135,15 @@ def test_CellTypeCounter_multi( test_case: TestCase ) -> None: filter: CellTypeCounter = CellTypeCounter() filter.SetInputDataObject( test_case.mesh ) filter.Update() - counts: CellTypeCounts = filter.GetCellTypeCounts() - assert counts is not None, "CellTypeCounts is undefined" + countsObs: CellTypeCounts = filter.GetCellTypeCounts() + assert countsObs is not None, "CellTypeCounts is undefined" - assert counts.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( + assert countsObs.getTypeCount( VTK_VERTEX ) == test_case.mesh.GetNumberOfPoints( ), f"Number of vertices should be {test_case.mesh.GetNumberOfPoints()}" # compute counts for each type of cell elementTypes: tuple[ int ] = ( VTK_TRIANGLE, VTK_QUAD, VTK_TETRA, VTK_PYRAMID, VTK_HEXAHEDRON, VTK_WEDGE ) - counts: npt.NDArray[ np.int64 ] = np.zeros( len( elementTypes ) ) + counts: npt.NDArray[ np.int64 ] = np.zeros( len( elementTypes ), dtype=int ) for i in range( test_case.mesh.GetNumberOfCells() ): cell: vtkCell = test_case.mesh.GetCell( i ) index: int = elementTypes.index( cell.GetCellType() ) @@ -151,11 +151,11 @@ def test_CellTypeCounter_multi( test_case: TestCase ) -> None: # check cell type counts for i, elementType in enumerate( elementTypes ): assert int( - counts.getTypeCount( elementType ) + countsObs.getTypeCount( elementType ) ) == counts[ i ], f"The number of {vtkCellTypes.GetClassNameFromTypeId(elementType)} should be {counts[i]}." nbPolygon: int = counts[ 0 ] + counts[ 1 ] nbPolyhedra: int = np.sum( counts[ 2: ] ) - assert int( counts.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." + assert int( countsObs.getTypeCount( VTK_POLYGON ) ) == nbPolygon, f"The number of faces should be {nbPolygon}." assert int( - counts.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." + countsObs.getTypeCount( VTK_POLYHEDRON ) ) == nbPolyhedra, f"The number of polyhedra should be {nbPolyhedra}." From f1b0c9997305e6f3f6ce5767764343520bc4f324 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Thu, 24 Apr 2025 09:57:42 +0200 Subject: [PATCH 24/57] add missing dependency --- geos-mesh/pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/geos-mesh/pyproject.toml b/geos-mesh/pyproject.toml index 0ea5a2a40..e56a02adb 100644 --- a/geos-mesh/pyproject.toml +++ b/geos-mesh/pyproject.toml @@ -30,6 +30,7 @@ dependencies = [ "tqdm >= 4.67", "numpy >= 2.2", "meshio >= 5.3", + "typing_extensions >= 4.12", ] [project.scripts] @@ -47,7 +48,8 @@ build = [ "build ~= 1.2" ] dev = [ - "mypy", + "mypy", + "ruff", "yapf", ] test = [ From ed9f0a5394ad4eee11dd7a62789b83ef0ff110de Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Tue, 29 Apr 2025 11:37:01 +0200 Subject: [PATCH 25/57] add comment --- geos-mesh/src/geos/mesh/vtkUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index a4a653a46..4c4e31a2d 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -805,7 +805,7 @@ def renameAttribute( bool: True if renaming operation successfully ended. """ if isAttributeInObject( object, attributeName, onPoints ): - dim: int = int( onPoints ) + dim: int = 0 if onPoints == True else 1 filter = vtkArrayRename() filter.SetInputData( object ) filter.SetArrayName( dim, attributeName, newAttributeName ) From c77a4c5859b44b8f4226f89fe6ff837448a2055d Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 29 Apr 2025 13:21:43 +0200 Subject: [PATCH 26/57] Merge helpers --- .../mesh/doctor/checks/generate_fractures.py | 4 +- geos-mesh/src/geos/mesh/processing/helpers.py | 174 --------- geos-mesh/src/geos/mesh/vtk/helpers.py | 344 ++++++++++++++++-- geos-mesh/tests/test_CellTypeCounter.py | 2 +- geos-mesh/tests/test_MergeColocatedPoints.py | 2 +- geos-mesh/tests/test_SplitMesh.py | 2 +- .../test_helpers_createSingleCellMesh.py | 2 +- .../tests/test_helpers_createVertices.py | 2 +- 8 files changed, 312 insertions(+), 220 deletions(-) delete mode 100644 geos-mesh/src/geos/mesh/processing/helpers.py diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py index bf6f961c9..8225968e3 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py @@ -13,7 +13,7 @@ from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.vtkConstants import VTK_ID_TYPE from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.vtk.helpers import has_invalid_field, to_vtk_id_list, vtk_iter +from geos.mesh.vtk.helpers import has_invalid_arrays, to_vtk_id_list, vtk_iter from geos.mesh.vtk.io import VtkOutput, read_mesh, write_mesh """ TypeAliases cannot be used with Python 3.9. A simple assignment like described there will be used: @@ -557,7 +557,7 @@ def check( vtk_input_file: str, options: Options ) -> Result: try: mesh = read_mesh( vtk_input_file ) # Mesh cannot contain global ids before splitting. - if has_invalid_field( mesh, [ "GLOBAL_IDS_POINTS", "GLOBAL_IDS_CELLS" ] ): + if has_invalid_arrays( mesh, [ "GLOBAL_IDS_POINTS", "GLOBAL_IDS_CELLS" ] ): err_msg: str = ( "The mesh cannot contain global ids for neither cells nor points. The correct procedure " + " is to split the mesh and then generate global ids for new split meshes." ) logging.error( err_msg ) diff --git a/geos-mesh/src/geos/mesh/processing/helpers.py b/geos-mesh/src/geos/mesh/processing/helpers.py deleted file mode 100644 index ae104ecc7..000000000 --- a/geos-mesh/src/geos/mesh/processing/helpers.py +++ /dev/null @@ -1,174 +0,0 @@ -# SPDX-FileContributor: Alexandre Benedicto, Martin Lemay -# SPDX-License-Identifier: Apache 2.0 -# ruff: noqa: E402 # disable Module level import not at top of file -import numpy as np -import numpy.typing as npt -from typing import Sequence, Union - -from vtkmodules.util.numpy_support import numpy_to_vtk - -from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkIncrementalOctreePointLocator, vtkPointData, - vtkCellData, vtkDataSet ) - -from vtkmodules.vtkCommonCore import ( - vtkPoints, - vtkIdList, - reference, -) - - -# TODO: copy from vtkUtils -def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: - """Get the dictionnary of all attributes of a vtkDataSet on points or cells. - - Args: - object (vtkDataSet): object where to find the attributes. - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - dict[str, int]: List of the names of the attributes. - """ - attributes: dict[ str, int ] = {} - data: Union[ vtkPointData, vtkCellData ] - sup: str = "" - if onPoints: - data = object.GetPointData() - sup = "Point" - else: - data = object.GetCellData() - sup = "Cell" - assert data is not None, f"{sup} data was not recovered." - - nbAttributes = data.GetNumberOfArrays() - for i in range( nbAttributes ): - attributeName = data.GetArrayName( i ) - attribute = data.GetArray( attributeName ) - assert attribute is not None, f"Attribut {attributeName} is null" - nbComponents = attribute.GetNumberOfComponents() - attributes[ attributeName ] = nbComponents - return attributes - - -def getBounds( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] ) -> Sequence[ float ]: - """Compute bounding box coordinates of the list of points. - - Args: - cellPtsCoord (list[npt.NDArray[np.float64]]): list of points - - Returns: - Sequence[float]: bounding box coordinates (xmin, xmax, ymin, ymax, zmin, zmax) - """ - bounds: list[ float ] = [ - np.inf, - -np.inf, - np.inf, - -np.inf, - np.inf, - -np.inf, - ] - for ptsCoords in cellPtsCoord: - mins: npt.NDArray[ np.float64 ] = np.min( ptsCoords, axis=0 ) - maxs: npt.NDArray[ np.float64 ] = np.max( ptsCoords, axis=0 ) - for i in range( 3 ): - bounds[ 2 * i ] = float( min( bounds[ 2 * i ], mins[ i ] ) ) - bounds[ 2 * i + 1 ] = float( max( bounds[ 2 * i + 1 ], maxs[ i ] ) ) - return bounds - - -def createSingleCellMesh( cellType: int, ptsCoord: npt.NDArray[ np.float64 ] ) -> vtkUnstructuredGrid: - """Create a mesh that consists of a single cell. - - Args: - cellType (int): cell type - ptsCoord (1DArray[np.float64]): cell point coordinates - - Returns: - vtkUnstructuredGrid: output mesh - """ - nbPoints: int = ptsCoord.shape[ 0 ] - points: npt.NDArray[ np.float64 ] = np.vstack( ( ptsCoord, ) ) - # Convert points to vtkPoints object - vtkpts: vtkPoints = vtkPoints() - vtkpts.SetData( numpy_to_vtk( points ) ) - - # create cells from point ids - cellsID: vtkIdList = vtkIdList() - for j in range( nbPoints ): - cellsID.InsertNextId( j ) - - # add cell to mesh - mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() - mesh.SetPoints( vtkpts ) - mesh.Allocate( 1 ) - mesh.InsertNextCell( cellType, cellsID ) - return mesh - - -def createMultiCellMesh( cellTypes: list[ int ], - cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], - sharePoints: bool = True ) -> vtkUnstructuredGrid: - """Create a mesh that consists of multiple cells. - - .. WARNING:: the mesh is not check for conformity. - - Args: - cellTypes (list[int]): cell type - cellPtsCoord (list[1DArray[np.float64]]): list of cell point coordinates - sharePoints (bool): if True, cells share points, else a new point is created fro each cell vertex - - Returns: - vtkUnstructuredGrid: output mesh - """ - assert len( cellPtsCoord ) == len( cellTypes ), "The lists of cell types of point coordinates must be of same size." - nbCells: int = len( cellPtsCoord ) - mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() - points: vtkPoints - cellVertexMapAll: list[ tuple[ int, ...] ] - points, cellVertexMapAll = createVertices( cellPtsCoord, sharePoints ) - assert len( cellVertexMapAll ) == len( - cellTypes ), "The lists of cell types of cell point ids must be of same size." - mesh.SetPoints( points ) - mesh.Allocate( nbCells ) - # create mesh cells - for cellType, ptsId in zip( cellTypes, cellVertexMapAll, strict=True ): - # create cells from point ids - cellsID: vtkIdList = vtkIdList() - for ptId in ptsId: - cellsID.InsertNextId( ptId ) - mesh.InsertNextCell( cellType, cellsID ) - return mesh - - -def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], - shared: bool = True ) -> tuple[ vtkPoints, list[ tuple[ int, ...] ] ]: - """Create vertices from cell point coordinates list. - - Args: - cellPtsCoord (list[npt.NDArray[np.float64]]): list of cell point coordinates - shared (bool, optional): If True, collocated points are merged. Defaults to True. - - Returns: - tuple[vtkPoints, list[tuple[int, ...]]]: tuple containing points and the - map of cell point ids - """ - # get point bounds - bounds: list[ float ] = getBounds( cellPtsCoord ) - points: vtkPoints = vtkPoints() - # use point locator to check for colocated points - pointsLocator = vtkIncrementalOctreePointLocator() - pointsLocator.InitPointInsertion( points, bounds ) - cellVertexMapAll: list[ tuple[ int, ...] ] = [] - ptId: reference = reference( 0 ) - ptsCoords: npt.NDArray[ np.float64 ] - for ptsCoords in cellPtsCoord: - cellVertexMap: list[ reference ] = [] - pt: npt.NDArray[ np.float64 ] # 1DArray - for pt in ptsCoords: - if shared: - pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) - else: - pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) - cellVertexMap += [ ptId.get() ] - cellVertexMapAll += [ tuple( cellVertexMap ) ] - return points, cellVertexMapAll diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index 94b273da6..5dd3804bb 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -1,13 +1,191 @@ import logging from copy import deepcopy -from numpy import argsort, array -from typing import Iterator, Optional, List -from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonCore import vtkDataArray, vtkIdList -from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkFieldData +import numpy as np +import numpy.typing as npt +from typing import Iterator, Optional, List, Sequence, Union, Sized +from vtkmodules.util.numpy_support import vtk_to_numpy, numpy_to_vtk +from vtkmodules.vtkCommonCore import ( + vtkDataArray, + vtkPoints, + vtkIdList, + reference, +) +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkFieldData, + vtkCellData, + vtkPointData, + vtkDataSet, + vtkIncrementalOctreePointLocator, +) +GLOBAL_IDS_ARRAY_NAME: str = "GlobalIds" -def to_vtk_id_list( data ) -> vtkIdList: +# TODO: copy from vtkUtils +def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: + """Get the dictionnary of all attributes of a vtkDataSet on points or cells. + + Args: + object (vtkDataSet): object where to find the attributes. + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + dict[str, int]: List of the names of the attributes. + """ + attributes: dict[ str, int ] = {} + data: Union[ vtkPointData, vtkCellData ] + sup: str = "" + if onPoints: + data = object.GetPointData() + sup = "Point" + else: + data = object.GetCellData() + sup = "Cell" + assert data is not None, f"{sup} data was not recovered." + + nbAttributes = data.GetNumberOfArrays() + for i in range( nbAttributes ): + attributeName = data.GetArrayName( i ) + attribute = data.GetArray( attributeName ) + assert attribute is not None, f"Attribut {attributeName} is null" + nbComponents = attribute.GetNumberOfComponents() + attributes[ attributeName ] = nbComponents + return attributes + + +def getBounds( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] ) -> Sequence[ float ]: + """Compute bounding box coordinates of the list of points. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of points + + Returns: + Sequence[float]: bounding box coordinates (xmin, xmax, ymin, ymax, zmin, zmax) + """ + bounds: list[ float ] = [ + np.inf, + -np.inf, + np.inf, + -np.inf, + np.inf, + -np.inf, + ] + for ptsCoords in cellPtsCoord: + mins: npt.NDArray[ np.float64 ] = np.min( ptsCoords, axis=0 ) + maxs: npt.NDArray[ np.float64 ] = np.max( ptsCoords, axis=0 ) + for i in range( 3 ): + bounds[ 2 * i ] = float( min( bounds[ 2 * i ], mins[ i ] ) ) + bounds[ 2 * i + 1 ] = float( max( bounds[ 2 * i + 1 ], maxs[ i ] ) ) + return bounds + + +def createSingleCellMesh( cellType: int, ptsCoord: npt.NDArray[ np.float64 ] ) -> vtkUnstructuredGrid: + """Create a mesh that consists of a single cell. + + Args: + cellType (int): cell type + ptsCoord (1DArray[np.float64]): cell point coordinates + + Returns: + vtkUnstructuredGrid: output mesh + """ + nbPoints: int = ptsCoord.shape[ 0 ] + points: npt.NDArray[ np.float64 ] = np.vstack( ( ptsCoord, ) ) + # Convert points to vtkPoints object + vtkpts: vtkPoints = vtkPoints() + vtkpts.SetData( numpy_to_vtk( points ) ) + + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for j in range( nbPoints ): + cellsID.InsertNextId( j ) + + # add cell to mesh + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + mesh.SetPoints( vtkpts ) + mesh.Allocate( 1 ) + mesh.InsertNextCell( cellType, cellsID ) + return mesh + + +def createMultiCellMesh( cellTypes: list[ int ], + cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + sharePoints: bool = True ) -> vtkUnstructuredGrid: + """Create a mesh that consists of multiple cells. + + .. WARNING:: the mesh is not check for conformity. + + Args: + cellTypes (list[int]): cell type + cellPtsCoord (list[1DArray[np.float64]]): list of cell point coordinates + sharePoints (bool): if True, cells share points, else a new point is created fro each cell vertex + + Returns: + vtkUnstructuredGrid: output mesh + """ + assert len( cellPtsCoord ) == len( cellTypes ), "The lists of cell types of point coordinates must be of same size." + nbCells: int = len( cellPtsCoord ) + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + points: vtkPoints + cellVertexMapAll: list[ tuple[ int, ...] ] + points, cellVertexMapAll = createVertices( cellPtsCoord, sharePoints ) + assert len( cellVertexMapAll ) == len( + cellTypes ), "The lists of cell types of cell point ids must be of same size." + mesh.SetPoints( points ) + mesh.Allocate( nbCells ) + # create mesh cells + for cellType, ptsId in zip( cellTypes, cellVertexMapAll, strict=True ): + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for ptId in ptsId: + cellsID.InsertNextId( ptId ) + mesh.InsertNextCell( cellType, cellsID ) + return mesh + + +def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + shared: bool = True ) -> tuple[ vtkPoints, list[ tuple[ int, ...] ] ]: + """Create vertices from cell point coordinates list. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of cell point coordinates + shared (bool, optional): If True, collocated points are merged. Defaults to True. + + Returns: + tuple[vtkPoints, list[tuple[int, ...]]]: tuple containing points and the + map of cell point ids + """ + # get point bounds + bounds: list[ float ] = getBounds( cellPtsCoord ) + points: vtkPoints = vtkPoints() + # use point locator to check for colocated points + pointsLocator = vtkIncrementalOctreePointLocator() + pointsLocator.InitPointInsertion( points, bounds ) + cellVertexMapAll: list[ tuple[ int, ...] ] = [] + ptId: reference = reference( 0 ) + ptsCoords: npt.NDArray[ np.float64 ] + for ptsCoords in cellPtsCoord: + cellVertexMap: list[ reference ] = [] + pt: npt.NDArray[ np.float64 ] # 1DArray + for pt in ptsCoords: + if shared: + pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) + else: + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) + cellVertexMap += [ ptId.get() ] + cellVertexMapAll += [ tuple( cellVertexMap ) ] + return points, cellVertexMapAll + +def to_vtk_id_list( data: Sized ) -> vtkIdList: + """Generate vtkIdList from sized object. + + Args: + data (Sized): sized object + + Returns: + vtkIdList: id ilst + """ result = vtkIdList() result.Allocate( len( data ) ) for d in data: @@ -15,12 +193,16 @@ def to_vtk_id_list( data ) -> vtkIdList: return result -def vtk_iter( vtkContainer ) -> Iterator[ any ]: - """ - Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins - python containers. - :param vtkContainer: A vtk container. - :return: The iterator. +def vtk_iter( vtkContainer: any ) -> Iterator[ any ]: + """Create an iterable from a vtk "container" (e.g. vtkIdList). + + To be used for building built-inspython containers. + + Args: + vtkContainer: A vtk container. + + Yields: + Iterator[ any ]: The iterator. """ if hasattr( vtkContainer, "GetNumberOfIds" ): for i in range( vtkContainer.GetNumberOfIds() ): @@ -30,39 +212,52 @@ def vtk_iter( vtkContainer ) -> Iterator[ any ]: yield vtkContainer.GetCellType( i ) -def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: - """Checks if a mesh contains at least a data arrays within its cell, field or point data +def has_invalid_arrays( object: vtkDataSet, invalid_arrays: List[ str ] ) -> bool: + """Check object contains arrays from invalid_arrays list. + + Checks if a mesh contains at least a data arrays within its cell, field or point data having a certain name. If so, returns True, else False. Args: - mesh (vtkUnstructuredGrid): An unstructured mesh. - invalid_fields (list[str]): Field name of an array in any data from the data. + object (vtkDataSet): An object. + invalid_arrays (list[str]): Array names to check. Returns: - bool: True if one field found, else False. + bool: True if at least one array was found, else False. """ - # Check the cell data fields - cell_data = mesh.GetCellData() + # Check the cell data arrays + cell_data = object.GetCellData() for i in range( cell_data.GetNumberOfArrays() ): - if cell_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) + if cell_data.GetArrayName( i ) in invalid_arrays: + logging.error( f"The mesh contains an invalid cell array name '{cell_data.GetArrayName( i )}'." ) return True - # Check the field data fields - field_data = mesh.GetFieldData() + # Check the field data arrays + field_data = object.GetFieldData() for i in range( field_data.GetNumberOfArrays() ): - if field_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) + if field_data.GetArrayName( i ) in invalid_arrays: + logging.error( f"The mesh contains an invalid field array name '{field_data.GetArrayName( i )}'." ) return True - # Check the point data fields - point_data = mesh.GetPointData() + # Check the point data arrays + point_data = object.GetPointData() for i in range( point_data.GetNumberOfArrays() ): - if point_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) + if point_data.GetArrayName( i ) in invalid_arrays: + logging.error( f"The mesh contains an invalid point array name '{point_data.GetArrayName( i )}'." ) return True return False -def getFieldType( data: vtkFieldData ) -> str: +def getArrayType( data: vtkFieldData ) -> str: + """Get field data type. + + Args: + data (vtkFieldData): input vtkFieldData. + + Raises: + ValueError: if input is not a vtkFieldData. + + Returns: + str: array type. + """ if not data.IsA( "vtkFieldData" ): raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) if data.IsA( "vtkCellData" ): @@ -74,12 +269,32 @@ def getFieldType( data: vtkFieldData ) -> str: def getArrayNames( data: vtkFieldData ) -> List[ str ]: + """Get all array names. + + Args: + data (vtkFieldData): input vtkFieldData + + Raises: + ValueError: if input is not a vtkFieldData + + Returns: + List[ str ]: list of array names. + """ if not data.IsA( "vtkFieldData" ): raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) return [ data.GetArrayName( i ) for i in range( data.GetNumberOfArrays() ) ] def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: + """Get array from name. + + Args: + data (vtkFieldData): field data + name (str): name of the array + + Returns: + Optional[ vtkDataArray ]: output array if it exists or None. + """ if data.HasArray( name ): return data.GetArray( name ) logging.warning( f"No array named '{name}' was found in '{data}'." ) @@ -87,31 +302,72 @@ def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: def getCopyArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: + """Get a deep copy of an array from name. + + Args: + data (vtkFieldData): field data + name (str): name of the array + + Returns: + Optional[ vtkDataArray ]: deep copy of the array if it exists or None. + """ return deepcopy( getArrayByName( data, name ) ) def getGlobalIdsArray( data: vtkFieldData ) -> Optional[ vtkDataArray ]: + """Get GlobalIds array. + + Args: + data (vtkFieldData): field data + + Returns: + Optional[ vtkDataArray ]: output array + """ array_names: List[ str ] = getArrayNames( data ) for name in array_names: - if name.startswith( "Global" ) and name.endswith( "Ids" ): + if name == GLOBAL_IDS_ARRAY_NAME: return getCopyArrayByName( data, name ) - logging.warning( "No GlobalIds array was found." ) + logging.warning( f"No {GLOBAL_IDS_ARRAY_NAME} array was found." ) + +def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[npt.NDArray[np.int64]]: + """Get GlobalIds array as numpy array. -def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ array ]: + Args: + data (vtkFieldData): field data + + Returns: + Optional[npt.NDArray[np.int64]]: output numpy array + """ return vtk_to_numpy( getGlobalIdsArray( data ) ) -def sortArrayByGlobalIds( data: vtkFieldData, arr: array ) -> None: - globalids: array = getNumpyGlobalIdsArray( data ) +def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[np.int64] ) -> None: + """Sort input array by GlobalIds. + + Args: + data (vtkFieldData): field data + arr (npt.NDArray[np.int64]): array to sort + """ + globalids: npt.NDArray[np.int64] = getNumpyGlobalIdsArray( data ) if globalids is not None: - arr = arr[ argsort( globalids ) ] + arr = arr[ np.argsort( globalids ) ] else: logging.warning( "No sorting was performed." ) -def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ array ]: - arr: array = vtk_to_numpy( getArrayByName( data, name ) ) +def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[npt.NDArray[np.float64]]: + """Get numpy array from name. + + Args: + data (vtkFieldData): field data + name (str): array name + sorted (bool): True to sort output array. Defaults to False. + + Returns: + Optional[npt.NDArray[np.int64]]: output numpy array + """ + arr: npt.NDArray[np.float64] = vtk_to_numpy( getArrayByName( data, name ) ) if arr is not None: if sorted: array_names: List[ str ] = getArrayNames( data ) @@ -120,5 +376,15 @@ def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) - return None -def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ array ]: +def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[npt.NDArray[np.float64]]: + """Get a deep copy of numpy array from name. + + Args: + data (vtkFieldData): field data + name (str): array name + sorted (bool): True to sort output array. Defaults to False. + + Returns: + Optional[npt.NDArray[np.int64]]: output numpy array + """ return deepcopy( getNumpyArrayByName( data, name, sorted=sorted ) ) diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index 19243f4eb..6aa30990e 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.processing.helpers import createSingleCellMesh, createMultiCellMesh +from geos.mesh.vtk.helpers import createSingleCellMesh, createMultiCellMesh from geos.mesh.stats.CellTypeCounter import CellTypeCounter from geos.mesh.model.CellTypeCounts import CellTypeCounts diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py index bd429366d..0cedbadbc 100644 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ b/geos-mesh/tests/test_MergeColocatedPoints.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.processing.helpers import createMultiCellMesh +from geos.mesh.vtk.helpers import createMultiCellMesh from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index a428ee7cb..bf7e0e812 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.processing.helpers import createSingleCellMesh +from geos.mesh.vtk.helpers import createSingleCellMesh from geos.mesh.processing.SplitMesh import SplitMesh from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py index ed7213110..e77d996b0 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.processing.helpers import createSingleCellMesh +from geos.mesh.vtk.helpers import createSingleCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index 247c47c83..7fd784198 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.processing.helpers import getBounds, createVertices, createMultiCellMesh +from geos.mesh.vtk.helpers import getBounds, createVertices, createMultiCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy From 7fb8e79738e823290d46a3f1c9b08cb908b0d775 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 29 Apr 2025 14:01:16 +0200 Subject: [PATCH 27/57] Linting, formating, typing --- geos-mesh/src/geos/mesh/vtk/__init__.py | 2 +- geos-mesh/src/geos/mesh/vtk/helpers.py | 65 +++++++++++++------------ geos-mesh/src/geos/mesh/vtk/io.py | 29 ++++++----- 3 files changed, 54 insertions(+), 42 deletions(-) diff --git a/geos-mesh/src/geos/mesh/vtk/__init__.py b/geos-mesh/src/geos/mesh/vtk/__init__.py index b1cfe267e..b7db25411 100644 --- a/geos-mesh/src/geos/mesh/vtk/__init__.py +++ b/geos-mesh/src/geos/mesh/vtk/__init__.py @@ -1 +1 @@ -# Empty \ No newline at end of file +# Empty diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index 5dd3804bb..af7f75eb2 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -2,7 +2,7 @@ from copy import deepcopy import numpy as np import numpy.typing as npt -from typing import Iterator, Optional, List, Sequence, Union, Sized +from typing import Iterator, Iterable, Optional, List, Sequence, Union, Any from vtkmodules.util.numpy_support import vtk_to_numpy, numpy_to_vtk from vtkmodules.vtkCommonCore import ( vtkDataArray, @@ -16,11 +16,13 @@ vtkCellData, vtkPointData, vtkDataSet, + vtkCellTypes, vtkIncrementalOctreePointLocator, ) GLOBAL_IDS_ARRAY_NAME: str = "GlobalIds" + # TODO: copy from vtkUtils def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: """Get the dictionnary of all attributes of a vtkDataSet on points or cells. @@ -157,12 +159,12 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], map of cell point ids """ # get point bounds - bounds: list[ float ] = getBounds( cellPtsCoord ) + bounds: Sequence[ float ] = getBounds( cellPtsCoord ) points: vtkPoints = vtkPoints() # use point locator to check for colocated points pointsLocator = vtkIncrementalOctreePointLocator() pointsLocator.InitPointInsertion( points, bounds ) - cellVertexMapAll: list[ tuple[ int, ...] ] = [] + cellVertexMapAll: list[ tuple[ reference, ...] ] = [] ptId: reference = reference( 0 ) ptsCoords: npt.NDArray[ np.float64 ] for ptsCoords in cellPtsCoord: @@ -170,21 +172,22 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], pt: npt.NDArray[ np.float64 ] # 1DArray for pt in ptsCoords: if shared: - pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) + pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) # type: ignore[arg-type] else: - pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) - cellVertexMap += [ ptId.get() ] + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] + cellVertexMap += [ ptId ] cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll -def to_vtk_id_list( data: Sized ) -> vtkIdList: - """Generate vtkIdList from sized object. + +def to_vtk_id_list( data: Sequence [ Any ] ) -> vtkIdList: + """Generate vtkIdList from iterable object. Args: - data (Sized): sized object + data (Sequence [ Any ]): iterable object Returns: - vtkIdList: id ilst + vtkIdList: id list """ result = vtkIdList() result.Allocate( len( data ) ) @@ -193,23 +196,23 @@ def to_vtk_id_list( data: Sized ) -> vtkIdList: return result -def vtk_iter( vtkContainer: any ) -> Iterator[ any ]: - """Create an iterable from a vtk "container" (e.g. vtkIdList). +def vtk_iter( vtkContainer: vtkIdList | vtkCellTypes ) -> Iterator[ Any ]: + """Create an iterable from a vtk "container". To be used for building built-inspython containers. Args: - vtkContainer: A vtk container. + vtkContainer (vtkIdList | vtkCellTypes): A vtk container. Yields: Iterator[ any ]: The iterator. """ - if hasattr( vtkContainer, "GetNumberOfIds" ): - for i in range( vtkContainer.GetNumberOfIds() ): - yield vtkContainer.GetId( i ) - elif hasattr( vtkContainer, "GetNumberOfTypes" ): - for i in range( vtkContainer.GetNumberOfTypes() ): - yield vtkContainer.GetCellType( i ) + if isinstance( vtkContainer, vtkIdList ): + for i in range( vtkContainer.GetNumberOfIds() ): # type: ignore[attr-defined] + yield vtkContainer.GetId( i ) # type: ignore[attr-defined] + elif isinstance( vtkContainer, vtkCellTypes ): + for i in range( vtkContainer.GetNumberOfTypes() ): # type: ignore[attr-defined] + yield vtkContainer.GetCellType( i ) # type: ignore[attr-defined] def has_invalid_arrays( object: vtkDataSet, invalid_arrays: List[ str ] ) -> bool: @@ -328,9 +331,10 @@ def getGlobalIdsArray( data: vtkFieldData ) -> Optional[ vtkDataArray ]: if name == GLOBAL_IDS_ARRAY_NAME: return getCopyArrayByName( data, name ) logging.warning( f"No {GLOBAL_IDS_ARRAY_NAME} array was found." ) + return None -def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[npt.NDArray[np.int64]]: +def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ npt.NDArray[ np.int64 ] ]: """Get GlobalIds array as numpy array. Args: @@ -342,21 +346,21 @@ def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[npt.NDArray[np.int6 return vtk_to_numpy( getGlobalIdsArray( data ) ) -def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[np.int64] ) -> None: - """Sort input array by GlobalIds. +def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.float64 ] ) -> None: + """Sort inplace input array by GlobalIds. Args: data (vtkFieldData): field data arr (npt.NDArray[np.int64]): array to sort """ - globalids: npt.NDArray[np.int64] = getNumpyGlobalIdsArray( data ) + globalids: npt.NDArray[ np.int64 ] = getNumpyGlobalIdsArray( data ) if globalids is not None: arr = arr[ np.argsort( globalids ) ] else: - logging.warning( "No sorting was performed." ) + logging.warning( "No sorting was performed." ) # type: ignore[unreachable] -def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[npt.NDArray[np.float64]]: +def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray[ np.float64 ] ]: """Get numpy array from name. Args: @@ -367,16 +371,17 @@ def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) - Returns: Optional[npt.NDArray[np.int64]]: output numpy array """ - arr: npt.NDArray[np.float64] = vtk_to_numpy( getArrayByName( data, name ) ) + arr: npt.NDArray[ np.float64 ] = vtk_to_numpy( getArrayByName( data, name ) ) if arr is not None: if sorted: - array_names: List[ str ] = getArrayNames( data ) - sortArrayByGlobalIds( data, arr, array_names ) + sortArrayByGlobalIds( data, arr ) return arr - return None + return None # type: ignore[unreachable] -def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[npt.NDArray[np.float64]]: +def getCopyNumpyArrayByName( data: vtkFieldData, + name: str, + sorted: bool = False ) -> Optional[ npt.NDArray[ np.float64 ] ]: """Get a deep copy of numpy array from name. Args: diff --git a/geos-mesh/src/geos/mesh/vtk/io.py b/geos-mesh/src/geos/mesh/vtk/io.py index 5d3e36935..0ebfe0fd0 100644 --- a/geos-mesh/src/geos/mesh/vtk/io.py +++ b/geos-mesh/src/geos/mesh/vtk/io.py @@ -81,11 +81,14 @@ def __read_pvtu( vtk_input_file: str ) -> Optional[ vtkUnstructuredGrid ]: def read_mesh( vtk_input_file: str ) -> vtkPointSet: - """ - Read the vtk file and builds either an unstructured grid or a structured grid from it. - :param vtk_input_file: The file name. The extension will be used to guess the file format. - If the first guess fails, the other available readers will be tried. - :return: A vtkPointSet. + """Read the vtk file and builds either an unstructured grid or a structured grid from it. + + Args: + vtk_input_file (str): The file name. The extension will be used to guess the file format. + If the first guess fails, the other available readers will be tried. + + Returns: + vtkPointSet: A vtkPointSet. """ if not os.path.exists( vtk_input_file ): err_msg: str = f"Invalid file path. Could not read \"{vtk_input_file}\"." @@ -142,14 +145,18 @@ def __write_vtu( mesh: vtkUnstructuredGrid, output: str, toBinary: bool = False def write_mesh( mesh: vtkPointSet, vtk_output: VtkOutput, canOverwrite: bool = False ) -> int: - """ - Writes the mesh to disk. + """Writes the mesh to disk. + Nothing will be done if the file already exists. - :param mesh: The grid to write. - :param vtk_output: Where to write. The file extension will be used to select the VTK file format. - :return: 0 in case of success. - """ + Args: + mesh (vtkPointSet): The mesh to write. + vtk_output (VtkOutput): Where to write. The file extension will be used to select the VTK file format. + canOverwrite (bool): if True, overwrite output file. Defaults to False. + + Returns: + 0 in case of success. + """ if os.path.exists( vtk_output.output ) and canOverwrite: logging.error( f"File \"{vtk_output.output}\" already exists, nothing done." ) return 1 From 9af63b0c1d4e57f9df742a89734c0f8876538bca Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 29 Apr 2025 14:06:02 +0200 Subject: [PATCH 28/57] linting --- geos-mesh/src/geos/mesh/vtk/helpers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index af7f75eb2..6f56d1609 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -2,7 +2,7 @@ from copy import deepcopy import numpy as np import numpy.typing as npt -from typing import Iterator, Iterable, Optional, List, Sequence, Union, Any +from typing import Iterator, Optional, List, Sequence, Union, Any from vtkmodules.util.numpy_support import vtk_to_numpy, numpy_to_vtk from vtkmodules.vtkCommonCore import ( vtkDataArray, @@ -174,13 +174,13 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], if shared: pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) # type: ignore[arg-type] else: - pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] cellVertexMap += [ ptId ] cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll -def to_vtk_id_list( data: Sequence [ Any ] ) -> vtkIdList: +def to_vtk_id_list( data: Sequence[ Any ] ) -> vtkIdList: """Generate vtkIdList from iterable object. Args: From 15d9df93afb3fb5b32221f20b45c3fc1c91e832d Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 29 Apr 2025 14:24:14 +0200 Subject: [PATCH 29/57] fix tests --- geos-mesh/src/geos/mesh/vtk/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index 6f56d1609..433462f17 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -175,7 +175,7 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) # type: ignore[arg-type] else: pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] - cellVertexMap += [ ptId ] + cellVertexMap += [ ptId.get() ] cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll From 0575b1e04ed99413a92a8a4135adf4ae586a7ba6 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:56:20 +0200 Subject: [PATCH 30/57] Addition of data for tests --- geos-mesh/tests/data/data.npz | Bin 28342 -> 309304 bytes geos-mesh/tests/data/domain_res5_id.vtu | 44 +++++++++++++----- geos-mesh/tests/data/surface.vtu | 57 ++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 geos-mesh/tests/data/surface.vtu diff --git a/geos-mesh/tests/data/data.npz b/geos-mesh/tests/data/data.npz index 6858b20acdcaec660c5ac2a5394da7e6c55d55a6..a90e8e07b471f3555e3a7523c10854b1f10195f0 100644 GIT binary patch literal 309304 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 delta 106 zcmdn-L1^1uMyUXAW)=|!2vB6`JF+TSAc%nhgf~i=1c@P}Zm4gZxaz7MXrz8;dbBi1BM1i=hZB8^|aoAj|>MCV3zp00Ku9h5!Hn diff --git a/geos-mesh/tests/data/domain_res5_id.vtu b/geos-mesh/tests/data/domain_res5_id.vtu index 40797bd2b..6e29affaf 100644 --- a/geos-mesh/tests/data/domain_res5_id.vtu +++ b/geos-mesh/tests/data/domain_res5_id.vtu @@ -5,11 +5,21 @@ + + + + 18.923530326 + + + 18.923530326 + + + - + - + 1.7094007438e-15 @@ -19,15 +29,25 @@ - + - + - + + + + + + 37.847060652 + + + 37.847060652 + + - + 0 @@ -39,15 +59,15 @@ - - - - - + + + + + - _AQAAAACAAADgfwAARhgAAA==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AQAAAACAAAAwGwAABAEAAA==eJztlksOxDAIQ9PO/e88mq3lZ6JoVKURC5SGfADjUO4xxv1yuUA+BwjF9k95IkenYNX52CsfapNivWVddTTSWrXf+aO66p50ZsZvnV9wD9msbLk67HCajTt9u7WK34ShyythnHhA8VB8Dh/CM+FGOFexJRySn2rbYULcUl4QpitvKPHW2a14f4p0P9T/36ew6nzslY+Z+ubqp+popLVqv/NHddU96cyM3zrvfoh5QRgnHlA8FF/3Q4zpyhtKvHV2K96fIt0P9f/3Kaw6H3vlY6a+ufqpOhpprdrv/FFddU86M+O3zrsfYl4QxokHFA/F1/0QY7ryhhJvnd2K9z/5Ao84Duw=AQAAAACAAACQUQAAMQAAAA==eJztwzENAAAIA7B3SjCBx2lGCG3SbCeqqqqqqqqqqqqqqqqqqqqqqqqqqo8eaqCtmg==AQAAAACAAAAwGwAAIwAAAA==eJztwwENAAAIA6BmJjC67/QgwkZuJ6qqqqqqqvp0AWlKhrc=AQAAAACAAAAwGwAAPQAAAA==eJzt1rEJADAIRUGH/dl/hbSp0oiFcAci2Nm9VFUG5wxPnp3Pfet/AMC87b2ghwCAru29oIcAgK4L9At6fQ==AQAAAACAAABgNgAAawoAAA==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4q6xxV1ji7umNcq6axpP665pjbXumtYi666xxV1ji7vGFneNLe4aW9w1trhrbHHX2OKuaX2z7prWSeuuscVdY4u7xhZ3TfPfumtpdNfY4q6xxV3T+mbdNV1T666xxV1ji7vGFneNLe4aW9w17ce6a7pe1l1ji7umdcO6a2xx19jirul+t+5aOvzOxu5aOpy37K6l0V2H28i8ZXdN65J119jirrHFXdM8se6a1g3rrrHFXdP9aN01trhrmhvWXWOLu8YWd23XZ3LX0mo9J3ctje463EbOhd01trhrbHHXNFetu6Z737prGnPrrrHFXdN6Zd01trhrbHHX/LnsrqXDY84O9inuWhrdNba4a2xx17QmWHdN18K6a1pPrLum9dm6a1pzrLvGFneNLe4aW9w1trhrbHHX2OKuscVdY4u7xhZ3jS3ums+L3bV0OA7srlXL78zkrrHFXWOLu8YWd40t7ppet+4aW9w1trhrbHHX2OKu6XOtu5YOjtO6a9WuNLprbHHXdC9Yd01zzLprbHHX2OKuscVdY4u7xhZ3jS3umseH3bW0eh6Ru5ZG8xNuEzyPyF1ji7vGFneNLe4aW9w1trhrbHHXPA7srqXDcWN3Ld1Xjse6a2l019jirmkNt+4aW9w1reHWXWOLu8YWd40t7pruI+uu+dzZXUuH48buWrpPMG6JatzYXWOLu8YWd03roXXXtO5Zd01rmnXXfL7srqXDsWJ3LT0iGKskNVbsrulzrbum9cG6a2xx13TvWHeNLe4aW9w1trhrbHHX2OKuscVdY4u7pnXAumtaf6y7xhZ3zePG7lpaPYPIXUujuw63CZ5B5K6xxV1ji7umNdm6a1rHrLvGFneNLe6a1gTrrrHFXdNnWXctHRynddfS6K7DbexxWndNa4t119jirrHFXWOLu8YWd033uHXX2OKuad227prWMeuuscVd8/myu+Z5wu5aOpxj7K6l0V2H28gcY3eNLe4aW9w1trhrbHHXdL7WXdN+rLuWDo7BumtpdNfhNvYYrLvGFneNLe4aW9w1trhrbHHX2OKuscVd87xidy2tvkuo51G6mofsrmm+WXdN64x119jirnk+sLsOOphLGeH+rbuWRndNa75119jirrHFXWOLu8YWd40t7pqvI7tr6XAOZKlnWZa67uyu6Vpbd40t7hpb3DW2uGua29Zd03yw7pqv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AQAAAACAAADMBgAAFgAAAA==eJzT0hoFo2AUjIJRMAqGNgAA9C4diA==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AQAAAACAAABgNgAAMAwAAA==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 + _AQAAAACAAADgfwAARhgAAA==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AwAAAACAAACgfwAAdgAAAHcAAAB3AAAAeJztyDENACAMADC8EBJkTA1qmaeF2aA9m/fZcdqM0Vak995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++99957/9EX/I+fp3ic7cgxDQAgDAAwvBASZEzN1DJPZNigPZvZZoxnRZ22I7333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333vuP/gJF6p09eJztyDENACAMALB5ISTImBrUMk9kqOBoz0a0mXXayv2MDO+9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++99/6jvwaTeWc=AQAAAACAAAAwGwAABAEAAA==eJztlksOxDAIQ9PO/e88mq3lZ6JoVKURC5SGfADjUO4xxv1yuUA+BwjF9k95IkenYNX52CsfapNivWVddTTSWrXf+aO66p50ZsZvnV9wD9msbLk67HCajTt9u7WK34ShyythnHhA8VB8Dh/CM+FGOFexJRySn2rbYULcUl4QpitvKPHW2a14f4p0P9T/36ew6nzslY+Z+ubqp+popLVqv/NHddU96cyM3zrvfoh5QRgnHlA8FF/3Q4zpyhtKvHV2K96fIt0P9f/3Kaw6H3vlY6a+ufqpOhpprdrv/FFddU86M+O3zrsfYl4QxokHFA/F1/0QY7ryhhJvnd2K9z/5Ao84Duw=AQAAAACAAACQUQAAMQAAAA==eJztwzENAAAIA7B3SjCBx2lGCG3SbCeqqqqqqqqqqqqqqqqqqqqqqqqqqo8eaqCtmg==AQAAAACAAAAwGwAAIwAAAA==eJztwwENAAAIA6BmJjC67/QgwkZuJ6qqqqqqqvp0AWlKhrc=AQAAAACAAAAwGwAAPQAAAA==eJzt1rEJADAIRUGH/dl/hbSp0oiFcAci2Nm9VFUG5wxPnp3Pfet/AMC87b2ghwCAru29oIcAgK4L9At6fQ==AQAAAACAAABgNgAAawoAAA==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AgAAAACAAADQPwAAnzAAAG4eAAA=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4q6xxV1ji7umNcq6axpP665pjbXumtYi666xxV1ji7vGFneNLe4aW9w1trhrbHHX2OKuaX2z7prWSeuuscVdY4u7xhZ3TfPfumtpdNfY4q6xxV3T+mbdNV1T666xxV1ji7vGFneNLe4aW9w17ce6a7pe1l1ji7umdcO6a2xx19jirul+t+5aOvzOxu5aOpy37K6l0V2H28i8ZXdN65J119jirrHFXdM8se6a1g3rrrHFXdP9aN01trhrmhvWXWOLu8YWd23XZ3LX0mo9J3ctje463EbOhd01trhrbHHXNFetu6Z737prGnPrrrHFXdN6Zd01trhrbHHX/LnsrqXDY84O9inuWhrdNba4a2xx17QmWHdN18K6a1pPrLum9dm6a1pzrLvGFneNLe4aW9w1trhrbHHX2OKuscVdY4u7xhZ3jS3ums+L3bV0OA7srlXL78zkrrHFXWOLu8YWd40t7ppet+4aW9w1trhrbHHX2OKu6XOtu5YOjtO6a9WuNLprbHHXdC9Yd01zzLprbHHX2OKuscVdY4u7xhZ3jS3umseH3bW0eh6Ru5ZG8xNuEzyPyF1ji7vGFneNLe4aW9w1trhrbHHXPA7srqXDcWN3Ld1Xjse6a2l019jirmkNt+4aW9w1reHWXWOLu8YWd40t7pruI+uu+dzZXUuH48buWrpPMG6JatzYXWOLu8YWd03roXXXtO5Zd01rmnXXfL7srqXDsWJ3LT0iGKskNVbsrulzrbum9cG6a2xx13TvWHeNLe4aW9w1trhrbHHX2OKuscVdY4u7pnXAumtaf6y7xhZ3zePG7lpaPYPIXUujuw63CZ5B5K6xxV1ji7umNdm6a1rHrLvGFneNLe6a1gTrrrHFXdNnWXctHRynddfS6K7DbexxWndNa4t119jirrHFXWOLu8YWd033uHXX2OKuad227prWMeuuscVd8/myu+Z5wu5aOpxj7K6l0V2H28gcY3eNLe4aW9w1trhrbHHXdL7WXdN+rLuWDo7BumtpdNfhNvYYrLvGFneNLe4aW9w1trhrbHHX2OKuscVd87xidy2tvkuo51G6mofsrmm+WXdN64x119jirnk+sLsOOphLGeH+rbuWRndNa75119jirrHFXWOLu8YWd40t7pqvI7tr6XAOZKlnWZa67uyu6Vpbd40t7hpb3DW2uGua29Zd03yw7pqv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AQAAAACAAADMBgAAFgAAAA==eJzT0hoFo2AUjIJRMAqGNgAA9C4diA==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AQAAAACAAABgNgAAMAwAAA==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 diff --git a/geos-mesh/tests/data/surface.vtu b/geos-mesh/tests/data/surface.vtu new file mode 100644 index 000000000..f6bd890b6 --- /dev/null +++ b/geos-mesh/tests/data/surface.vtu @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + 2526.2662269 + + + 4019.2067423 + + + + + + + 25.568730903 + + + 25.568730903 + + + + + + + + + + + 2516.6143322 + + + 4041.4536614 + + + + + + + + + + + + + _AQAAAACAAAAIAAAADQAAAA==eJxjYAABFQcAAJAAZQ==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YnVevH0d53M5L2zzA+79rjA/6PvGzByozmv9vK/nYT0n6+f3HLuZfc7N+Jd+LvatK3lfrfqV9q/nlsvnAT0P6+eseHvVx/bzvE4F2H8aD3fnedGS56CxfGIOTj1XwL+Nf9xbXj4nGGo+uXzesOVdz1HR6Wou/dNa+nk4rav/A985xeQ=FAAAAACAAADgIwAAegAAAHgAAAB6AAAAegAAAHgAAAB6AAAAegAAAHgAAAB6AAAAegAAAHgAAAB6AAAAegAAAHgAAAB6AAAAegAAAHgAAAB6AAAAegAAAD8AAAA=eJztyEENACAMBMGK4YEABNR/wFNTggtmP5ebiG7k2d3Me2O95ZxzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzv/wAojRMEJ4nO3IQQ0AIAwAMcTwQMAEzH+YJ8KCC3qfS1r7tnJ08T6zOOecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeec84/8ACJlNQ94nO3IQQ0AIAwEwYrhgQAE1H/AU1OCC2Y/l5uIbuWdGHl2N9/nnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPO//ACCcAwUnic7chBDQAgDATBiuGBAATUf8BTU4ILZj+Xm4hu5NndzHtjveWcc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc87/8AKI0TBCeJztyEENACAMADHE8EDABMx/mCfCggt6n0ta+7ZydPE+szjnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnPOP/AAiZTUPeJztyEENACAMBMGK4YEABNR/wFNTggtmP5ebiG7lnRh5djff55xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzv/wAgnAMFJ4nO3IQQ0AIAwEwYrhgQAE1H/AU1OCC2Y/l5uIbuTZ3cx7Y73lnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPO//ACiNEwQnic7chBDQAgDAAxxPBAwATMf5gnwoILep9LWvu2cnTxPrM455xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555zzj/wAImU1D3ic7chBDQAgDATBiuGBAATUf8BTU4ILZj+Xm4hu5Z0YeXY33+ecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc87/8AIJwDBSeJztyEENACAMBMGK4YEABNR/wFNTggtmP5ebiG7k2d3Me2O95ZxzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzv/wAojRMEJ4nO3IQQ0AIAwAMcTwQMAEzH+YJ8KCC3qfS1r7tnJ08T6zOOecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeec84/8ACJlNQ94nO3IQQ0AIAwEwYrhgQAE1H/AU1OCC2Y/l5uIbuWdGHl2N9/nnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPO//ACCcAwUnic7chBDQAgDATBiuGBAATUf8BTU4ILZj+Xm4hu5NndzHtjveWcc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc87/8AKI0TBCeJztyEENACAMADHE8EDABMx/mCfCggt6n0ta+7ZydPE+szjnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnPOP/AAiZTUPeJztyEENACAMBMGK4YEABNR/wFNTggtmP5ebiG7lnRh5djff55xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzv/wAgnAMFJ4nO3IQQ0AIAwEwYrhgQAE1H/AU1OCC2Y/l5uIbuTZ3cx7Y73lnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPO//ACiNEwQnic7chBDQAgDAAxxPBAwATMf5gnwoILep9LWvu2cnTxPrM455xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555zzj/wAImU1D3ic7chBDQAgDATBiuGBAATUf8BTU4ILZj+Xm4hu5Z0YeXY33+ecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc87/8AIJwDBSeJztyEENACAMBMGK4YEABNR/wFNTggtmP5ebiG7k2d3Me2O95ZxzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzv/wAojRMEJ4nO3IMQ0AIAwAQcQwIKAC6j/UE6HBA8v98snVvq0cXbzPLM4555xzzjnnnHPOOeecc84555xzzvl3P8haB5s=BwAAAACAAACgNgAATQAAAE0AAABNAAAATQAAAE0AAABNAAAAMgAAAA==eJztxUEBAAAEBLCLJIKKGtPD9llyajq2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bT9+AZ2VEPF4nO3FQQEAAAQEsIskgooa08P2WXJqOrZt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27ZtP34BnZUQ8Xic7cVBAQAABASwiySCihrTw/ZZcmo6tm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm0/fgGdlRDxeJztxUEBAAAEBLCLJIKKGtPD9llyajq2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bT9+AZ2VEPF4nO3FQQEAAAQEsIskgooa08P2WXJqOrZt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27ZtP34BnZUQ8Xic7cVBAQAABASwiySCihrTw/ZZcmo6tm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm3btm0/fgGdlRDxeJztxTEBAAAIA6BFMoIVbawV/OEhOTUd27Zt27Zt27Zt27Zt27Zt27Zt27YfL8oT2y8=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AQAAAACAAADUZgAAMQAAAA==eJztwSEBAAAAwyC1/pUvXgMoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgBhBUCQw== + + From 0ef062e8e7c2a02aa490546383b28657108056cf Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:11:52 +0200 Subject: [PATCH 31/57] Comment and fix typos --- geos-mesh/src/geos/mesh/vtkUtils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index 4c4e31a2d..08d179d36 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -508,7 +508,7 @@ def extractBlock( multiBlockDataSet: vtkMultiBlockDataSet, blockIndex: int ) -> extractedBlock: vtkMultiBlockDataSet = extractBlockfilter.GetOutput() return extractedBlock - +# TODO : fix function for keepPartialAttributes = True def mergeBlocks( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], keepPartialAttributes: bool = False, @@ -727,7 +727,7 @@ def copyAttribute( attributNameFrom: str, attributNameTo: str, ) -> bool: - """Copy an attribute from objectFrom to objectTo. + """Copy a cell attribute from objectFrom to objectTo. Args: objectFrom (vtkMultiBlockDataSet): object from which to copy the attribute. @@ -736,7 +736,7 @@ def copyAttribute( attributNameTo (str): attribute name in objectTo. Returns: - bool: True if copy sussfully ended, False otherwise + bool: True if copy successfully ended, False otherwise """ elementaryBlockIndexesTo: list[ int ] = getBlockElementIndexesFlatten( objectTo ) elementaryBlockIndexesFrom: list[ int ] = getBlockElementIndexesFlatten( objectFrom ) @@ -766,7 +766,7 @@ def copyAttributeDataSet( attributNameFrom: str, attributNameTo: str, ) -> bool: - """Copy an attribute from objectFrom to objectTo. + """Copy a cell attribute from objectFrom to objectTo. Args: objectFrom (vtkDataSet): object from which to copy the attribute. @@ -775,7 +775,7 @@ def copyAttributeDataSet( attributNameTo (str): attribute name in objectTo. Returns: - bool: True if copy sussfully ended, False otherwise + bool: True if copy successfully ended, False otherwise """ # get attribut from initial time step block npArray: npt.NDArray[ np.float64 ] = getArrayInObject( objectFrom, attributNameFrom, False ) From 31271ba7f44efd775da884aae604f516332e0669 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:12:21 +0200 Subject: [PATCH 32/57] vtkUtils tests implemented --- geos-mesh/tests/conftest.py | 57 ++-- geos-mesh/tests/test_vtkUtils.py | 466 ++++++++++++++++++++++++++----- 2 files changed, 434 insertions(+), 89 deletions(-) diff --git a/geos-mesh/tests/conftest.py b/geos-mesh/tests/conftest.py index e370393c5..56a1de081 100644 --- a/geos-mesh/tests/conftest.py +++ b/geos-mesh/tests/conftest.py @@ -5,24 +5,16 @@ # ruff: noqa: E402 # disable Module level import not at top of file import os import pytest - +from typing import Union import numpy as np import numpy.typing as npt -from vtkmodules.vtkCommonDataModel import vtkDataSet -from vtkmodules.vtkIOXML import vtkXMLUnstructuredGridReader +from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkMultiBlockDataSet, vtkPolyData +from vtkmodules.vtkIOXML import vtkXMLUnstructuredGridReader, vtkXMLMultiBlockDataReader @pytest.fixture -def array( request: str ) -> npt.NDArray: - """Fixture to get reference array depending on request array name. - - Args: - request (str): _description_ - - Returns: - npt.NDArray: _description_ - """ +def arrayExpected( request: pytest.FixtureRequest ) -> npt.NDArray[ np.float64 ]: reference_data = "data/data.npz" reference_data_path = os.path.join( os.path.dirname( os.path.realpath( __file__ ) ), reference_data ) data = np.load( reference_data_path ) @@ -30,18 +22,33 @@ def array( request: str ) -> npt.NDArray: return data[ request.param ] -@pytest.fixture( scope="function" ) -def vtkDataSetTest() -> vtkDataSet: - """Load vtk dataset to run the tests in test_vtkUtils.py. +@pytest.fixture +def arrayTest( request: pytest.FixtureRequest ) -> npt.NDArray[ np.float64 ]: + np.random.seed( 42 ) + array: npt.NDArray[ np.float64 ] = np.random.rand( + request.param, + 3, + ) + return array - Returns: - vtkDataSet: _description_ - """ - reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() - vtkFilename = "data/domain_res5_id.vtu" - data_test_path = os.path.join( os.path.dirname( os.path.realpath( __file__ ) ), vtkFilename ) - # reader.SetFileName( "geos-mesh/tests/data/domain_res5_id.vtu" ) - reader.SetFileName( data_test_path ) - reader.Update() - return reader.GetOutput() +@pytest.fixture +def dataSetTest() -> Union[ vtkMultiBlockDataSet, vtkPolyData, vtkDataSet ]: + + def _get_dataset( datasetType: str ): + if datasetType == "multiblock": + reader = reader = vtkXMLMultiBlockDataReader() + vtkFilename = "data/displacedFault.vtm" + elif datasetType == "dataset": + reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() + vtkFilename = "data/domain_res5_id.vtu" + elif datasetType == "polydata": + reader: vtkXMLUnstructuredGridReader = vtkXMLUnstructuredGridReader() + vtkFilename = "data/surface.vtu" + datapath: str = os.path.join( os.path.dirname( os.path.realpath( __file__ ) ), vtkFilename ) + reader.SetFileName( datapath ) + reader.Update() + + return reader.GetOutput() + + return _get_dataset \ No newline at end of file diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index 617101c61..a662ec4ac 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -5,34 +5,56 @@ # ruff: noqa: E402 # disable Module level import not at top of file import pytest -from vtkmodules.vtkCommonCore import vtkDataArray -from vtkmodules.vtkCommonDataModel import vtkDataSet +import numpy as np +import numpy.typing as npt + +import vtkmodules.util.numpy_support as vnp +import pandas as pd # type: ignore[import-untyped] +from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray +from vtkmodules.vtkCommonDataModel import ( # type: ignore[import-untyped] + vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, vtkPolyData, vtkPointData, vtkCellData ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, ) -import geos.mesh.vtkUtils as vtkutils +from geos.mesh import vtkUtils + + +@pytest.mark.parametrize( "onpoints, expected", [ ( True, { + 'GLOBAL_IDS_POINTS': 1, + 'collocated_nodes': 2, + 'PointAttribute': 3 +} ), ( False, { + 'CELL_MARKERS': 1, + 'PERM': 3, + 'PORO': 1, + 'FAULT': 1, + 'GLOBAL_IDS_CELLS': 1, + 'CellAttribute': 3 +} ) ] ) +def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, onpoints: bool, + expected: dict[ str, int ] ) -> None: + multiBlockTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + attributes: dict[ str, int ] = vtkUtils.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) + + assert attributes == expected @pytest.mark.parametrize( "onpoints, expected", [ ( True, { - 'GLOBAL_IDS_POINTS': 1 + 'GLOBAL_IDS_POINTS': 1, + 'PointAttribute': 3, } ), ( False, { 'CELL_MARKERS': 1, 'PERM': 3, 'PORO': 1, 'FAULT': 1, - 'GLOBAL_IDS_CELLS': 1 + 'GLOBAL_IDS_CELLS': 1, + 'CellAttribute': 3 } ) ] ) -def test_getAttributesFromDataSet( vtkDataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: - """Test getAttributesFromDataSet function. - - Args: - vtkDataSetTest (vtkDataSet): _description_ - onpoints (bool): _description_ - expected (dict[ str, int ]): _description_ - """ - attributes: dict[ str, int ] = vtkutils.getAttributesFromDataSet( object=vtkDataSetTest, onPoints=onpoints ) +def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + attributes: dict[ str, int ] = vtkUtils.getAttributesFromDataSet( vtkDataSetTest, onpoints ) assert attributes == expected @@ -40,42 +62,89 @@ def test_getAttributesFromDataSet( vtkDataSetTest: vtkDataSet, onpoints: bool, e ( "PORO", False, 1 ), ( "PORO", True, 0 ), ] ) -def test_isAttributeInObjectDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, +def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, + expected: dict[ str, int ] ) -> None: + multiBlockDataset: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: bool = vtkUtils.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PORO", True, 0 ), +] ) +def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, expected: bool ) -> None: - """Test isAttributeFromDataSet function. - - Args: - vtkDataSetTest (vtkDataSet): _description_ - attributeName (str): _description_ - onpoints (bool): _description_ - expected (bool): _description_ - """ - obtained: bool = vtkutils.isAttributeInObjectDataSet( object=vtkDataSetTest, - attributeName=attributeName, - onPoints=onpoints ) + vtkDataset: vtkDataSet = dataSetTest( "dataset" ) + obtained: bool = vtkUtils.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) assert obtained == expected +@pytest.mark.parametrize( "arrayExpected, onpoints", [ + ( "PORO", False ), + ( "PERM", False ), + ( "PointAttribute", True ), +], + indirect=[ "arrayExpected" ] ) +def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray, dataSetTest: vtkDataSet, + onpoints: bool ) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + params = request.node.callspec.params + attributeName: str = params[ "arrayExpected" ] + + obtained: npt.NDArray[ np.float64 ] = vtkUtils.getArrayInObject( vtkDataSetTest, attributeName, onpoints ) + expected: npt.NDArray[ np.float64 ] = arrayExpected + + assert ( obtained == expected ).all() + + +@pytest.mark.parametrize( "arrayExpected, onpoints", [ + ( "PORO", False ), + ( "PointAttribute", True ), +], + indirect=[ "arrayExpected" ] ) +def test_getVtkArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray[ np.float64 ], + dataSetTest: vtkDataSet, onpoints: bool ) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + params = request.node.callspec.params + attributeName: str = params[ 'arrayExpected' ] + + obtained: vtkDoubleArray = vtkUtils.getVtkArrayInObject( vtkDataSetTest, attributeName, onpoints ) + obtained_as_np: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( obtained ) + + assert ( obtained_as_np == arrayExpected ).all() + + @pytest.mark.parametrize( "attributeName, onpoints, expected", [ ( "PORO", False, 1 ), ( "PERM", False, 3 ), - ( "GLOBAL_IDS_POINTS", True, 1 ), + ( "PointAttribute", True, 3 ), ] ) def test_getNumberOfComponentsDataSet( - vtkDataSetTest: vtkDataSet, + dataSetTest: vtkDataSet, + attributeName: str, + onpoints: bool, + expected: int, +) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + obtained: int = vtkUtils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PERM", False, 3 ), + ( "PointAttribute", True, 3 ), +] ) +def test_getNumberOfComponentsMultiBlock( + dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, expected: int, ) -> None: - """Test getNumberOfComponentsDataSet function. - - Args: - vtkDataSetTest (vtkDataSet): _description_ - attributeName (str): _description_ - onpoints (bool): _description_ - expected (int): _description_ - """ - obtained: int = vtkutils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: int = vtkUtils.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) + assert obtained == expected @@ -83,48 +152,317 @@ def test_getNumberOfComponentsDataSet( ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), ( "PORO", False, () ), ] ) -def test_getComponentNamesDataSet( vtkDataSetTest: vtkDataSet, attributeName: str, onpoints: bool, +def test_getComponentNamesDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, expected: tuple[ str, ...] ) -> None: - """Test getComponentNamesDataSet function. + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + obtained: tuple[ str, ...] = vtkUtils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) + assert obtained == expected - Args: - vtkDataSetTest (vtkDataSet): _description_ - attributeName (str): _description_ - onpoints (bool): _description_ - expected (tuple[ str, ...]): _description_ - """ - obtained: tuple[ str, ...] = vtkutils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), + ( "PORO", False, () ), +] ) +def test_getComponentNamesMultiBlock( + dataSetTest: vtkMultiBlockDataSet, + attributeName: str, + onpoints: bool, + expected: tuple[ str, ...], +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: tuple[ str, ...] = vtkUtils.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, + onpoints ) assert obtained == expected +#TODO : unify with testfillAll below ? +@pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) +def test_fillPartialAttributes( + dataSetTest: vtkMultiBlockDataSet, + attributeName: str, + onpoints: bool, +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + vtkUtils.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) + + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( vtkMultiBlockDataSetTest ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + if onpoints: + data: vtkPointData = dataset.GetPointData() + else: + data: vtkCellData = dataset.GetCellData() + assert data.HasArray( attributeName ) == 1 + + iter.GoToNextItem() + + +@pytest.mark.parametrize( "onpoints, expectedArrays", [ + ( True, ( "PointAttribute", "collocated_nodes" ) ), + ( False, ( "CELL_MARKERS", "CellAttribute", "FAULT", "PERM", "PORO" ) ), +] ) +def test_fillAllPartialAttributes( + dataSetTest: vtkMultiBlockDataSet, + onpoints: bool, + expectedArrays: tuple[ str, ...], +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + vtkUtils.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) + + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( vtkMultiBlockDataSetTest ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + if onpoints: + data: vtkPointData = dataset.GetPointData() + else: + data: vtkCellData = dataset.GetCellData() + + for attribute in expectedArrays: + assert data.HasArray( attribute ) == 1 + + iter.GoToNextItem() + + +@pytest.mark.parametrize( "attributeNames, expected_columns", [ + ( ( "CellAttribute1", ), ( "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), + ( ( + "CellAttribute1", + "CellAttribute2", + ), ( "CellAttribute2", "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), +] ) +def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames, expected_columns ): + polydataset: vtkPolyData = dataSetTest( "polydata" ) + data: pd.DataFrame = vtkUtils.getAttributeValuesAsDF( polydataset, attributeNames ) + + obtained_columns = data.columns.values.tolist() + assert obtained_columns == list( expected_columns ) + + +# TODO: Add test for keepPartialAttributes = True when function fixed @pytest.mark.parametrize( - "attributeName, dataType, expectedDatatypeArray", + "keepPartialAttributes, expected_point_attributes, expected_cell_attributes", [ - ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), - ( "test_float", VTK_FLOAT, "vtkFloatArray" ), - ( "test_int", VTK_INT, "vtkIntArray" ), - ( "test_unsigned_int", VTK_UNSIGNED_INT, "vtkUnsignedIntArray" ), - ( "test_char", VTK_CHAR, "vtkCharArray" ), - # ("testFail", 4566, pytest.fail) #TODO + ( False, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", ) ), + # ( True, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", "CELL_MARKERS", "FAULT", "PERM", "PORO" ) ), ] ) +def test_mergeBlocks( + dataSetTest: vtkMultiBlockDataSet, + expected_point_attributes: tuple[ str, ...], + expected_cell_attributes: tuple[ str, ...], + keepPartialAttributes: bool, +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + dataset: vtkUnstructuredGrid = vtkUtils.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) + + assert dataset.GetCellData().GetNumberOfArrays() == len( expected_cell_attributes ) + for c_attribute in expected_cell_attributes: + assert dataset.GetCellData().HasArray( c_attribute ) + + assert dataset.GetPointData().GetNumberOfArrays() == len( expected_point_attributes ) + for p_attribute in expected_point_attributes: + assert dataset.GetPointData().HasArray( p_attribute ) + + +@pytest.mark.parametrize( "attributeName, dataType, expectedDatatypeArray", [ + ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), + ( "test_float", VTK_FLOAT, "vtkFloatArray" ), + ( "test_int", VTK_INT, "vtkIntArray" ), + ( "test_unsigned_int", VTK_UNSIGNED_INT, "vtkUnsignedIntArray" ), + ( "test_char", VTK_CHAR, "vtkCharArray" ), +] ) def test_createEmptyAttribute( attributeName: str, dataType: int, expectedDatatypeArray: vtkDataArray, ) -> None: - """Test createEmptyAttribute function. - - Args: - attributeName (str): _description_ - dataType (int): _description_ - expectedDatatypeArray (vtkDataArray): _description_ - """ componentNames: tuple[ str, str, str ] = ( "d1, d2, d3" ) - newAttr: vtkDataArray = vtkutils.createEmptyAttribute( attributeName, componentNames, dataType ) + newAttr: vtkDataArray = vtkUtils.createEmptyAttribute( attributeName, componentNames, dataType ) assert newAttr.GetNumberOfComponents() == len( componentNames ) - assert newAttr.GetComponentName( 0 ) == componentNames[ 0 ] - assert newAttr.GetComponentName( 1 ) == componentNames[ 1 ] - assert newAttr.GetComponentName( 2 ) == componentNames[ 2 ] + for ax in range( 3 ): + assert newAttr.GetComponentName( ax ) == componentNames[ ax ] assert newAttr.IsA( str( expectedDatatypeArray ) ) + + +@pytest.mark.parametrize( "onpoints, elementSize", [ + ( False, ( 1740, 156 ) ), + ( True, ( 4092, 212 ) ), +] ) +def test_createConstantAttributeMultiBlock( + dataSetTest: vtkMultiBlockDataSet, + onpoints: bool, + elementSize: tuple[ int, ...], +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + attributeName: str = "testAttributemultiblock" + values: tuple[ float, float, float ] = ( 12.4, 10, 40.0 ) + componentNames: tuple[ str, str, str ] = ( "X", "Y", "Z" ) + vtkUtils.createConstantAttributeMultiBlock( vtkMultiBlockDataSetTest, values, attributeName, componentNames, + onpoints ) + + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( vtkMultiBlockDataSetTest ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + if onpoints: + data: vtkPointData = dataset.GetPointData() + else: + data: vtkCellData = dataset.GetCellData() + createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) + cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + + assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize[ iter.GetCurrentFlatIndex() - 1 ], 3 ), + fill_value=values ) ).all() + assert cnames == componentNames + + iter.GoToNextItem() + + +@pytest.mark.parametrize( "values, onpoints, elementSize", [ + ( ( 42, 58, -103 ), True, 4092 ), + ( ( -42, -58, 103 ), False, 1740 ), +] ) +def test_createConstantAttributeDataSet( + dataSetTest: vtkDataSet, + values: list[ float ], + elementSize: int, + onpoints: bool, +) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) + attributeName: str = "newAttributedataset" + vtkUtils.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) + + if onpoints == True: + data: vtkPointData = vtkDataSetTest.GetPointData() + + else: + data: vtkCellData = vtkDataSetTest.GetCellData() + + createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) + cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + + assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize, 3 ), fill_value=values ) ).all() + assert cnames == componentNames + + +@pytest.mark.parametrize( "onpoints, arrayTest, arrayExpected", [ + ( True, 4092, "random_4092" ), + ( False, 1740, "random_1740" ), +], + indirect=[ "arrayTest", "arrayExpected" ] ) +def test_createAttribute( + dataSetTest: vtkDataSet, + arrayTest: npt.NDArray[ np.float64 ], + arrayExpected: npt.NDArray[ np.float64 ], + onpoints: bool, +) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) + attributeName: str = "AttributeName" + + vtkUtils.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) + + if onpoints: + data: vtkPointData = vtkDataSetTest.GetPointData() + else: + data: vtkCellData = vtkDataSetTest.GetCellData() + + createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) + cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + + assert ( vnp.vtk_to_numpy( createdAttribute ) == arrayExpected ).all() + assert cnames == componentNames + + +def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet, ) -> None: + objectFrom: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + objectTo: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + + attributeFrom: str = "CellAttribute" + attributeTo: str = "CellAttributeTO" + + vtkUtils.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) + + blockIndex: int = 0 + blockFrom: vtkDataSet = objectFrom.GetBlock( blockIndex ) + blockTo: vtkDataSet = objectTo.GetBlock( blockIndex ) + + arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockFrom.GetCellData().GetArray( attributeFrom ) ) + arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockTo.GetCellData().GetArray( attributeTo ) ) + + assert ( arrayFrom == arrayTo ).all() + + +def test_copyAttributeDataSet( dataSetTest: vtkDataSet, ) -> None: + objectFrom: vtkDataSet = dataSetTest( "dataset" ) + objectTo: vtkDataSet = dataSetTest( "dataset" ) + + attributNameFrom = "CellAttribute" + attributNameTo = "COPYATTRIBUTETO" + + vtkUtils.copyAttributeDataSet( objectFrom, objectTo, attributNameFrom, attributNameTo ) + + arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectFrom.GetCellData().GetArray( attributNameFrom ) ) + arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectTo.GetCellData().GetArray( attributNameTo ) ) + + assert ( arrayFrom == arrayTo ).all() + + +@pytest.mark.parametrize( "attributeName, onpoints", [ + ( "CellAttribute", False ), + ( "PointAttribute", True ), +] ) +def test_renameAttributeMultiblock( + dataSetTest: vtkMultiBlockDataSet, + attributeName: str, + onpoints: bool, +) -> None: + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + newAttributeName: str = "new" + attributeName + vtkUtils.renameAttribute( + vtkMultiBlockDataSetTest, + attributeName, + newAttributeName, + onpoints, + ) + + block = vtkMultiBlockDataSetTest.GetBlock( 0 ) + + if onpoints == True: + assert block.GetPointData().HasArray( attributeName ) == 0 + assert block.GetPointData().HasArray( newAttributeName ) == 1 + + else: + assert block.GetCellData().HasArray( attributeName ) == 0 + assert block.GetCellData().HasArray( newAttributeName ) == 1 + + +@pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) +def test_renameAttributeDataSet( + dataSetTest: vtkDataSet, + attributeName: str, + onpoints: bool, +) -> None: + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + newAttributeName: str = "new" + attributeName + vtkUtils.renameAttribute( object=vtkDataSetTest, + attributeName=attributeName, + newAttributeName=newAttributeName, + onPoints=onpoints ) + + if onpoints == True: + assert vtkDataSetTest.GetPointData().HasArray( attributeName ) == 0 + assert vtkDataSetTest.GetPointData().HasArray( newAttributeName ) == 1 + + else: + assert vtkDataSetTest.GetCellData().HasArray( attributeName ) == 0 + assert vtkDataSetTest.GetCellData().HasArray( newAttributeName ) == 1 From 1c21a71f7508d3ebdc32d20b5ee0edc8dfd484fe Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 30 Apr 2025 17:50:36 +0200 Subject: [PATCH 33/57] Remove comments - linting - typo --- geos-mesh/src/geos/mesh/vtk/helpers.py | 10 +++++----- geos-mesh/tests/test_CellTypeCounts.py | 7 ------- geos-mesh/tests/test_SplitMesh.py | 1 - geos-mesh/tests/test_collocated_nodes.py | 3 +-- geos-mesh/tests/test_supported_elements.py | 9 +++------ 5 files changed, 9 insertions(+), 21 deletions(-) diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index 433462f17..6f3cf7eb2 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -121,7 +121,7 @@ def createMultiCellMesh( cellTypes: list[ int ], Args: cellTypes (list[int]): cell type cellPtsCoord (list[1DArray[np.float64]]): list of cell point coordinates - sharePoints (bool): if True, cells share points, else a new point is created fro each cell vertex + sharePoints (bool): if True, cells share points, else a new point is created for each cell vertex Returns: vtkUnstructuredGrid: output mesh @@ -164,18 +164,18 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], # use point locator to check for colocated points pointsLocator = vtkIncrementalOctreePointLocator() pointsLocator.InitPointInsertion( points, bounds ) - cellVertexMapAll: list[ tuple[ reference, ...] ] = [] + cellVertexMapAll: list[ tuple[ int, ...] ] = [] ptId: reference = reference( 0 ) ptsCoords: npt.NDArray[ np.float64 ] for ptsCoords in cellPtsCoord: - cellVertexMap: list[ reference ] = [] + cellVertexMap: list[ int ] = [] pt: npt.NDArray[ np.float64 ] # 1DArray for pt in ptsCoords: if shared: pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) # type: ignore[arg-type] else: pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] - cellVertexMap += [ ptId.get() ] + cellVertexMap += [ ptId.get() ] # type: ignore cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll @@ -353,7 +353,7 @@ def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.float64 ] ) - data (vtkFieldData): field data arr (npt.NDArray[np.int64]): array to sort """ - globalids: npt.NDArray[ np.int64 ] = getNumpyGlobalIdsArray( data ) + globalids: npt.NDArray[ np.int64 ] | None = getNumpyGlobalIdsArray( data ) if globalids is not None: arr = arr[ np.argsort( globalids ) ] else: diff --git a/geos-mesh/tests/test_CellTypeCounts.py b/geos-mesh/tests/test_CellTypeCounts.py index 39637ef02..32d3c7ea9 100644 --- a/geos-mesh/tests/test_CellTypeCounts.py +++ b/geos-mesh/tests/test_CellTypeCounts.py @@ -199,7 +199,6 @@ def test_CellTypeCounts_add( test_case: TestCase ) -> None: 2 * test_case.nbHexa ), f"Number of hexahedra must be {int(2 * test_case.nbHexa)}" -#cpt = 0 @pytest.mark.parametrize( "test_case", __generate_test_data() ) def test_CellTypeCounts_print( test_case: TestCase ) -> None: """Test of CellTypeCounts . @@ -218,10 +217,4 @@ def test_CellTypeCounts_print( test_case: TestCase ) -> None: line: str = counts.print() lineExp: str = __get_expected_counts( test_case.nbVertex, test_case.nbTri, test_case.nbQuad, test_case.nbTetra, test_case.nbPyr, test_case.nbWed, test_case.nbHexa ) - # global cpt - # with open(f"meshIdcounts_{cpt}.txt", 'w') as fout: - # fout.write(line) - # fout.write("------------------------------------------------------------\n") - # fout.write(lineExp) - # cpt += 1 assert line == lineExp, "Output counts string differs from expected value." diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index bf7e0e812..08df73a91 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -22,7 +22,6 @@ vtkIdList, vtkDataArray, ) -#from vtkmodules.vtkFiltersSources import vtkCubeSource data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) diff --git a/geos-mesh/tests/test_collocated_nodes.py b/geos-mesh/tests/test_collocated_nodes.py index 2b74e30fe..ecc36dbba 100644 --- a/geos-mesh/tests/test_collocated_nodes.py +++ b/geos-mesh/tests/test_collocated_nodes.py @@ -6,8 +6,7 @@ def get_points() -> Iterator[ Tuple[ vtkPoints, int ] ]: - """ - Generates the data for the cases. + """Generates the data for the cases. One case has two nodes at the exact same position. The other has two differente nodes :return: Generator to (vtk points, number of expected duplicated locations) diff --git a/geos-mesh/tests/test_supported_elements.py b/geos-mesh/tests/test_supported_elements.py index 6126b8ea3..0dc0d3af6 100644 --- a/geos-mesh/tests/test_supported_elements.py +++ b/geos-mesh/tests/test_supported_elements.py @@ -11,8 +11,7 @@ # TODO Update this test to have access to another meshTests file @pytest.mark.parametrize( "base_name", ( "supportedElements.vtk", "supportedElementsAsVTKPolyhedra.vtk" ) ) def test_supported_elements( base_name ) -> None: - """ - Testing that the supported elements are properly detected as supported! + """Testing that the supported elements are properly detected as supported! :param base_name: Supported elements are provided as standard elements or polyhedron elements. """ ... @@ -25,8 +24,7 @@ def test_supported_elements( base_name ) -> None: def make_dodecahedron() -> Tuple[ vtkPoints, vtkIdList ]: - """ - Returns the points and faces for a dodecahedron. + """Returns the points and faces for a dodecahedron. This code was adapted from an official vtk example. :return: The tuple of points and faces (as vtk instances). """ @@ -81,8 +79,7 @@ def make_dodecahedron() -> Tuple[ vtkPoints, vtkIdList ]: # TODO make this test work def test_dodecahedron() -> None: - """ - Tests whether a dodecahedron is support by GEOS or not. + """Tests whether a dodecahedron is support by GEOS or not. """ points, faces = make_dodecahedron() mesh = vtkUnstructuredGrid() From c10edba6daca62acd061af7754cf5b2e529bb103 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 5 May 2025 16:24:11 +0200 Subject: [PATCH 34/57] Typing & linting --- .mypy.ini | 14 ++--- geos-mesh/pyproject.toml | 21 ++++--- geos-mesh/tests/test_vtkUtils.py | 100 ++++++++++++++++++++----------- 3 files changed, 86 insertions(+), 49 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index 98bbe47db..50a8effb0 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -2,13 +2,13 @@ python_version = 3.10 # strict = true -warn_unreachable = true -implicit_reexport = true -show_error_codes = true -show_column_numbers = true -ignore_missing_imports = true -warn_unused_configs = true -allow_redefinition = false +warn_unreachable = True +implicit_reexport = True +show_error_codes = True +show_column_numbers = True +ignore_missing_imports = True +warn_unused_configs = True +allow_redefinition = False # ignore files in the tests directory [mypy-tests.*] diff --git a/geos-mesh/pyproject.toml b/geos-mesh/pyproject.toml index 3f73d6c59..1a184bf89 100644 --- a/geos-mesh/pyproject.toml +++ b/geos-mesh/pyproject.toml @@ -25,7 +25,7 @@ classifiers = [ requires-python = ">=3.10" dependencies = [ - "vtk >= 9.3", + "vtk == 9.3", "networkx >= 2.4", "tqdm >= 4.67", "numpy >= 2.2", @@ -57,9 +57,16 @@ test = [ ] [tool.pytest.ini_options] -addopts = [ - "--import-mode=importlib", -] -pythonpath = [ - "src", -] +addopts="--import-mode=importlib" +console_output_style = "count" +pythonpath = ["src"] +python_classes = "Test" +python_files = "test*.py" +python_functions = "test*" +testpaths = ["tests"] +norecursedirs = "bin" +filterwarnings = [] + +[tool.coverage.run] +branch = true +source = ["src/geos"] \ No newline at end of file diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index a662ec4ac..70eb67ac6 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -3,7 +3,9 @@ # SPDX-FileContributor: Paloma Martinez # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file +# mypy: disable-error-code="operator, attr-defined" import pytest +from typing import Union, Tuple import numpy as np import numpy.typing as npt @@ -11,8 +13,9 @@ import vtkmodules.util.numpy_support as vnp import pandas as pd # type: ignore[import-untyped] from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray -from vtkmodules.vtkCommonDataModel import ( # type: ignore[import-untyped] - vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, vtkPolyData, vtkPointData, vtkCellData ) +from vtkmodules.vtkCommonDataModel import ( + vtkDataSet, vtkMultiBlockDataSet, vtkDataObject, vtkDataObjectTreeIterator, vtkPolyData, vtkPointData, vtkCellData, + vtkUnstructuredGrid ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, @@ -35,6 +38,7 @@ } ) ] ) def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: + """Test getting attribute list as dict from multiblock.""" multiBlockTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) attributes: dict[ str, int ] = vtkUtils.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) @@ -53,6 +57,7 @@ def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, o 'CellAttribute': 3 } ) ] ) def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: + """Test getting attribute list as dict from dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) attributes: dict[ str, int ] = vtkUtils.getAttributesFromDataSet( vtkDataSetTest, onpoints ) assert attributes == expected @@ -64,6 +69,7 @@ def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expe ] ) def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, expected: dict[ str, int ] ) -> None: + """Test presence of attribute in a multiblock.""" multiBlockDataset: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) obtained: bool = vtkUtils.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) assert obtained == expected @@ -75,6 +81,7 @@ def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet ] ) def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, expected: bool ) -> None: + """Test presence of attribute in a dataset.""" vtkDataset: vtkDataSet = dataSetTest( "dataset" ) obtained: bool = vtkUtils.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) assert obtained == expected @@ -88,6 +95,7 @@ def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str indirect=[ "arrayExpected" ] ) def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray, dataSetTest: vtkDataSet, onpoints: bool ) -> None: + """Test getting numpy array of an attribute from dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) params = request.node.callspec.params attributeName: str = params[ "arrayExpected" ] @@ -105,6 +113,7 @@ def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.ND indirect=[ "arrayExpected" ] ) def test_getVtkArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray[ np.float64 ], dataSetTest: vtkDataSet, onpoints: bool ) -> None: + """Test getting Vtk Array from a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) params = request.node.callspec.params attributeName: str = params[ 'arrayExpected' ] @@ -126,6 +135,7 @@ def test_getNumberOfComponentsDataSet( onpoints: bool, expected: int, ) -> None: + """Test getting the number of components of an attribute from a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) obtained: int = vtkUtils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected @@ -142,6 +152,7 @@ def test_getNumberOfComponentsMultiBlock( onpoints: bool, expected: int, ) -> None: + """Test getting the number of components of an attribute from a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) obtained: int = vtkUtils.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) @@ -154,6 +165,7 @@ def test_getNumberOfComponentsMultiBlock( ] ) def test_getComponentNamesDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, expected: tuple[ str, ...] ) -> None: + """Test getting the component names of an attribute from a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) obtained: tuple[ str, ...] = vtkUtils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected @@ -169,19 +181,20 @@ def test_getComponentNamesMultiBlock( onpoints: bool, expected: tuple[ str, ...], ) -> None: + """Test getting the component names of an attribute from a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) obtained: tuple[ str, ...] = vtkUtils.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) assert obtained == expected -#TODO : unify with testfillAll below ? @pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) def test_fillPartialAttributes( dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, ) -> None: + """Test filling a partial attribute from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) vtkUtils.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) @@ -191,10 +204,11 @@ def test_fillPartialAttributes( iter.GoToFirstItem() while iter.GetCurrentDataObject() is not None: dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + data: Union[ vtkPointData, vtkCellData ] if onpoints: - data: vtkPointData = dataset.GetPointData() + data = dataset.GetPointData() else: - data: vtkCellData = dataset.GetCellData() + data = dataset.GetCellData() assert data.HasArray( attributeName ) == 1 iter.GoToNextItem() @@ -209,6 +223,7 @@ def test_fillAllPartialAttributes( onpoints: bool, expectedArrays: tuple[ str, ...], ) -> None: + """Test filling all partial attributes from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) vtkUtils.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) @@ -218,10 +233,11 @@ def test_fillAllPartialAttributes( iter.GoToFirstItem() while iter.GetCurrentDataObject() is not None: dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + data: Union[ vtkPointData, vtkCellData ] if onpoints: - data: vtkPointData = dataset.GetPointData() + data = dataset.GetPointData() else: - data: vtkCellData = dataset.GetCellData() + data = dataset.GetCellData() for attribute in expectedArrays: assert data.HasArray( attribute ) == 1 @@ -236,7 +252,9 @@ def test_fillAllPartialAttributes( "CellAttribute2", ), ( "CellAttribute2", "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), ] ) -def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames, expected_columns ): +def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames: Tuple[ str, ...], + expected_columns: Tuple[ str, ...] ) -> None: + """Test getting an attribute from a polydata as a dataframe.""" polydataset: vtkPolyData = dataSetTest( "polydata" ) data: pd.DataFrame = vtkUtils.getAttributeValuesAsDF( polydataset, attributeNames ) @@ -257,6 +275,7 @@ def test_mergeBlocks( expected_cell_attributes: tuple[ str, ...], keepPartialAttributes: bool, ) -> None: + """Test the merging of a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) dataset: vtkUnstructuredGrid = vtkUtils.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) @@ -281,7 +300,8 @@ def test_createEmptyAttribute( dataType: int, expectedDatatypeArray: vtkDataArray, ) -> None: - componentNames: tuple[ str, str, str ] = ( "d1, d2, d3" ) + """Test empty attribute creation.""" + componentNames: tuple[ str, str, str ] = ( "d1", "d2", "d3" ) newAttr: vtkDataArray = vtkUtils.createEmptyAttribute( attributeName, componentNames, dataType ) assert newAttr.GetNumberOfComponents() == len( componentNames ) @@ -297,8 +317,9 @@ def test_createEmptyAttribute( def test_createConstantAttributeMultiBlock( dataSetTest: vtkMultiBlockDataSet, onpoints: bool, - elementSize: tuple[ int, ...], + elementSize: Tuple[ int, ...], ) -> None: + """Test creation of constant attribute in multiblock dataset.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) attributeName: str = "testAttributemultiblock" values: tuple[ float, float, float ] = ( 12.4, 10, 40.0 ) @@ -312,12 +333,13 @@ def test_createConstantAttributeMultiBlock( iter.GoToFirstItem() while iter.GetCurrentDataObject() is not None: dataset: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + data: Union[ vtkPointData, vtkCellData ] if onpoints: - data: vtkPointData = dataset.GetPointData() + data = dataset.GetPointData() else: - data: vtkCellData = dataset.GetCellData() + data = dataset.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize[ iter.GetCurrentFlatIndex() - 1 ], 3 ), fill_value=values ) ).all() @@ -336,19 +358,21 @@ def test_createConstantAttributeDataSet( elementSize: int, onpoints: bool, ) -> None: + """Test constant attribute creation in dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) + componentNames: Tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "newAttributedataset" vtkUtils.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) - if onpoints == True: - data: vtkPointData = vtkDataSetTest.GetPointData() + data: Union[ vtkPointData, vtkCellData ] + if onpoints: + data = vtkDataSetTest.GetPointData() else: - data: vtkCellData = vtkDataSetTest.GetCellData() + data = vtkDataSetTest.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize, 3 ), fill_value=values ) ).all() assert cnames == componentNames @@ -365,25 +389,28 @@ def test_createAttribute( arrayExpected: npt.NDArray[ np.float64 ], onpoints: bool, ) -> None: + """Test creation of dataset in dataset from given array.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "AttributeName" vtkUtils.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) + data: Union[ vtkPointData, vtkCellData ] if onpoints: - data: vtkPointData = vtkDataSetTest.GetPointData() + data = vtkDataSetTest.GetPointData() else: - data: vtkCellData = vtkDataSetTest.GetCellData() + data = vtkDataSetTest.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: tuple[ str, str, str ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == arrayExpected ).all() assert cnames == componentNames -def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet, ) -> None: +def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet ) -> None: + """Test copy of cell attribute from one multiblock to another.""" objectFrom: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) objectTo: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) @@ -393,8 +420,8 @@ def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet, ) -> None: vtkUtils.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) blockIndex: int = 0 - blockFrom: vtkDataSet = objectFrom.GetBlock( blockIndex ) - blockTo: vtkDataSet = objectTo.GetBlock( blockIndex ) + blockFrom: vtkDataObject = objectFrom.GetBlock( blockIndex ) + blockTo: vtkDataObject = objectTo.GetBlock( blockIndex ) arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockFrom.GetCellData().GetArray( attributeFrom ) ) arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockTo.GetCellData().GetArray( attributeTo ) ) @@ -403,6 +430,7 @@ def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet, ) -> None: def test_copyAttributeDataSet( dataSetTest: vtkDataSet, ) -> None: + """Test copy of cell attribute from one dataset to another.""" objectFrom: vtkDataSet = dataSetTest( "dataset" ) objectTo: vtkDataSet = dataSetTest( "dataset" ) @@ -426,6 +454,7 @@ def test_renameAttributeMultiblock( attributeName: str, onpoints: bool, ) -> None: + """Test renaming attribute in a multiblock dataset.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) newAttributeName: str = "new" + attributeName vtkUtils.renameAttribute( @@ -434,16 +463,17 @@ def test_renameAttributeMultiblock( newAttributeName, onpoints, ) - - block = vtkMultiBlockDataSetTest.GetBlock( 0 ) - - if onpoints == True: - assert block.GetPointData().HasArray( attributeName ) == 0 - assert block.GetPointData().HasArray( newAttributeName ) == 1 + block: vtkDataObject = vtkMultiBlockDataSetTest.GetBlock( 0 ) + data: Union[ vtkPointData, vtkCellData ] + if onpoints: + data = block.GetPointData() + assert data.HasArray( attributeName ) == 0 + assert data.HasArray( newAttributeName ) == 1 else: - assert block.GetCellData().HasArray( attributeName ) == 0 - assert block.GetCellData().HasArray( newAttributeName ) == 1 + data = block.GetCellData() + assert data.HasArray( attributeName ) == 0 + assert data.HasArray( newAttributeName ) == 1 @pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) @@ -452,17 +482,17 @@ def test_renameAttributeDataSet( attributeName: str, onpoints: bool, ) -> None: + """Test renaming an attribute in a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) newAttributeName: str = "new" + attributeName vtkUtils.renameAttribute( object=vtkDataSetTest, attributeName=attributeName, newAttributeName=newAttributeName, onPoints=onpoints ) - - if onpoints == True: + if onpoints: assert vtkDataSetTest.GetPointData().HasArray( attributeName ) == 0 assert vtkDataSetTest.GetPointData().HasArray( newAttributeName ) == 1 else: assert vtkDataSetTest.GetCellData().HasArray( attributeName ) == 0 - assert vtkDataSetTest.GetCellData().HasArray( newAttributeName ) == 1 + assert vtkDataSetTest.GetCellData().HasArray( newAttributeName ) == 1 \ No newline at end of file From d6b1ae14f79639d91d8e69353f7f48dcb415ea1b Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 5 May 2025 16:54:47 +0200 Subject: [PATCH 35/57] Linting --- geos-mesh/src/geos/mesh/vtkUtils.py | 1 + geos-mesh/tests/test_vtkUtils.py | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/vtkUtils.py index 08d179d36..1b37ffd9e 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/vtkUtils.py @@ -508,6 +508,7 @@ def extractBlock( multiBlockDataSet: vtkMultiBlockDataSet, blockIndex: int ) -> extractedBlock: vtkMultiBlockDataSet = extractBlockfilter.GetOutput() return extractedBlock + # TODO : fix function for keepPartialAttributes = True def mergeBlocks( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkUtils.py index 70eb67ac6..854d77567 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkUtils.py @@ -13,9 +13,8 @@ import vtkmodules.util.numpy_support as vnp import pandas as pd # type: ignore[import-untyped] from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray -from vtkmodules.vtkCommonDataModel import ( - vtkDataSet, vtkMultiBlockDataSet, vtkDataObject, vtkDataObjectTreeIterator, vtkPolyData, vtkPointData, vtkCellData, - vtkUnstructuredGrid ) +from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObject, vtkDataObjectTreeIterator, + vtkPolyData, vtkPointData, vtkCellData, vtkUnstructuredGrid ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, @@ -339,7 +338,7 @@ def test_createConstantAttributeMultiBlock( else: data = dataset.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ...] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize[ iter.GetCurrentFlatIndex() - 1 ], 3 ), fill_value=values ) ).all() @@ -372,7 +371,7 @@ def test_createConstantAttributeDataSet( data = vtkDataSetTest.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ...] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == np.full( ( elementSize, 3 ), fill_value=values ) ).all() assert cnames == componentNames @@ -403,7 +402,7 @@ def test_createAttribute( data = vtkDataSetTest.GetCellData() createdAttribute: vtkDoubleArray = data.GetArray( attributeName ) - cnames: Tuple[ str, ... ] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) + cnames: Tuple[ str, ...] = tuple( createdAttribute.GetComponentName( i ) for i in range( 3 ) ) assert ( vnp.vtk_to_numpy( createdAttribute ) == arrayExpected ).all() assert cnames == componentNames @@ -495,4 +494,4 @@ def test_renameAttributeDataSet( else: assert vtkDataSetTest.GetCellData().HasArray( attributeName ) == 0 - assert vtkDataSetTest.GetCellData().HasArray( newAttributeName ) == 1 \ No newline at end of file + assert vtkDataSetTest.GetCellData().HasArray( newAttributeName ) == 1 From bed516c9825b7382b5571e89430a340ee6aae003 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 5 May 2025 16:56:25 +0200 Subject: [PATCH 36/57] Fix import path --- geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py index b4294dae7..06b2826ad 100644 --- a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py +++ b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py @@ -13,7 +13,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) -import geos_posp.processing.vtkUtils as vtkUtils +import geos.mesh.vtkUtils as vtkUtils __doc__ = r""" This module contains utilities to process meshes using pyvista. From 2f7339efa6c00730a12b2e4394e91987cceb3977 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 12 May 2025 11:42:59 +0200 Subject: [PATCH 37/57] Refactoring --- .../mesh/doctor/checks/check_fractures.py | 2 +- .../mesh/doctor/checks/collocated_nodes.py | 2 +- .../mesh/doctor/checks/element_volumes.py | 2 +- .../doctor/checks/fix_elements_orderings.py | 4 +- .../geos/mesh/doctor/checks/generate_cube.py | 2 +- .../mesh/doctor/checks/generate_fractures.py | 4 +- .../mesh/doctor/checks/generate_global_ids.py | 2 +- .../geos/mesh/doctor/checks/non_conformal.py | 4 +- .../geos/mesh/doctor/checks/reorient_mesh.py | 2 +- .../checks/self_intersecting_elements.py | 2 +- .../mesh/doctor/checks/supported_elements.py | 4 +- .../geos/mesh/doctor/checks/vtk_polyhedron.py | 2 +- .../parsing/generate_fractures_parsing.py | 2 +- .../mesh/doctor/parsing/vtk_output_parsing.py | 2 +- geos-mesh/src/geos/mesh/io/__init__.py | 0 .../src/geos/mesh/{vtk/io.py => io/vtkIO.py} | 0 geos-mesh/src/geos/mesh/utils/__init__.py | 0 .../mesh/{vtkUtils.py => utils/filters.py} | 472 +------------- geos-mesh/src/geos/mesh/utils/helpers.py | 579 ++++++++++++++++++ .../multiblockInspectorTreeFunctions.py | 0 geos-mesh/src/geos/mesh/vtk/__init__.py | 1 - geos-mesh/src/geos/mesh/vtk/helpers.py | 124 ---- geos-mesh/tests/test_cli_parsing.py | 2 +- geos-mesh/tests/test_generate_fractures.py | 2 +- geos-mesh/tests/test_reorient_mesh.py | 2 +- geos-mesh/tests/test_supported_elements.py | 2 +- .../{test_vtkUtils.py => test_vtkFilters.py} | 228 +------ geos-mesh/tests/test_vtkHelpers.py | 199 ++++++ geos-posp/src/PVplugins/PVAttributeMapping.py | 6 +- .../PVCreateConstantAttributePerRegion.py | 4 +- .../PVplugins/PVExtractMergeBlocksVolume.py | 2 +- .../PVExtractMergeBlocksVolumeSurface.py | 2 +- .../PVExtractMergeBlocksVolumeSurfaceWell.py | 2 +- .../PVExtractMergeBlocksVolumeWell.py | 2 +- .../src/PVplugins/PVMergeBlocksEnhanced.py | 2 +- geos-posp/src/PVplugins/PVMohrCirclePlot.py | 3 +- .../src/PVplugins/PVSurfaceGeomechanics.py | 2 +- .../PVTransferAttributesVolumeSurface.py | 5 +- .../filters/AttributeMappingFromCellCoords.py | 5 +- .../filters/AttributeMappingFromCellId.py | 3 +- .../filters/GeomechanicsCalculator.py | 5 +- .../geos_posp/filters/GeosBlockExtractor.py | 4 +- .../src/geos_posp/filters/GeosBlockMerge.py | 6 +- .../geos_posp/filters/SurfaceGeomechanics.py | 4 +- .../TransferAttributesVolumeSurface.py | 2 +- .../geos_posp/pyvistaTools/pyvistaUtils.py | 11 +- .../visu/PVUtils/paraviewTreatments.py | 2 +- .../src/geos/pygeos_tools/mesh/VtkMesh.py | 4 +- 48 files changed, 880 insertions(+), 843 deletions(-) create mode 100644 geos-mesh/src/geos/mesh/io/__init__.py rename geos-mesh/src/geos/mesh/{vtk/io.py => io/vtkIO.py} (100%) create mode 100644 geos-mesh/src/geos/mesh/utils/__init__.py rename geos-mesh/src/geos/mesh/{vtkUtils.py => utils/filters.py} (53%) create mode 100644 geos-mesh/src/geos/mesh/utils/helpers.py rename geos-mesh/src/geos/mesh/{ => utils}/multiblockInspectorTreeFunctions.py (100%) delete mode 100644 geos-mesh/src/geos/mesh/vtk/__init__.py delete mode 100644 geos-mesh/src/geos/mesh/vtk/helpers.py rename geos-mesh/tests/{test_vtkUtils.py => test_vtkFilters.py} (54%) create mode 100644 geos-mesh/tests/test_vtkHelpers.py diff --git a/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py index a42ef4182..4a23976a8 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py @@ -8,7 +8,7 @@ from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.util.numpy_support import vtk_to_numpy from geos.mesh.doctor.checks.generate_fractures import Coordinates3D -from geos.mesh.vtk.helpers import vtk_iter +from geos.mesh.utils.helpers import vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/collocated_nodes.py b/geos-mesh/src/geos/mesh/doctor/checks/collocated_nodes.py index 91632b3ee..74cbbe8c5 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/collocated_nodes.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/collocated_nodes.py @@ -5,7 +5,7 @@ from typing import Collection, Iterable from vtkmodules.vtkCommonCore import reference, vtkPoints from vtkmodules.vtkCommonDataModel import vtkIncrementalOctreePointLocator -from geos.mesh.vtk.io import read_mesh +from geos.mesh.io.vtkIO import read_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/element_volumes.py b/geos-mesh/src/geos/mesh/doctor/checks/element_volumes.py index 55ad3a225..3a37375fd 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/element_volumes.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/element_volumes.py @@ -5,7 +5,7 @@ from vtkmodules.vtkCommonDataModel import VTK_HEXAHEDRON, VTK_PYRAMID, VTK_TETRA, VTK_WEDGE from vtkmodules.vtkFiltersVerdict import vtkCellSizeFilter, vtkMeshQuality from vtkmodules.util.numpy_support import vtk_to_numpy -from geos.mesh.vtk.io import read_mesh +from geos.mesh.io.vtkIO import read_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py b/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py index 079377b98..ddb423dd0 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py @@ -1,8 +1,8 @@ from dataclasses import dataclass from typing import Dict, FrozenSet, List, Set from vtkmodules.vtkCommonCore import vtkIdList -from geos.mesh.vtk.helpers import to_vtk_id_list -from geos.mesh.vtk.io import VtkOutput, read_mesh, write_mesh +from geos.mesh.utils.helpers import to_vtk_id_list +from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_cube.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_cube.py index 4b4c71fbe..5abd17f1f 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_cube.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_cube.py @@ -7,7 +7,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkCellArray, vtkHexahedron, vtkRectilinearGrid, vtkUnstructuredGrid, VTK_HEXAHEDRON ) from geos.mesh.doctor.checks.generate_global_ids import __build_global_ids -from geos.mesh.vtk.io import VtkOutput, write_mesh +from geos.mesh.io.vtkIO import VtkOutput, write_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py index bf6f961c9..ae553dd6d 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py @@ -13,8 +13,8 @@ from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.vtkConstants import VTK_ID_TYPE from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.vtk.helpers import has_invalid_field, to_vtk_id_list, vtk_iter -from geos.mesh.vtk.io import VtkOutput, read_mesh, write_mesh +from geos.mesh.utils.helpers import has_invalid_field, to_vtk_id_list, vtk_iter +from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh """ TypeAliases cannot be used with Python 3.9. A simple assignment like described there will be used: https://docs.python.org/3/library/typing.html#typing.TypeAlias:~:text=through%20simple%20assignment%3A-,Vector%20%3D%20list%5Bfloat%5D,-Or%20marked%20with diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_global_ids.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_global_ids.py index 6142ad7ca..2fdcfe27f 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_global_ids.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_global_ids.py @@ -1,7 +1,7 @@ from dataclasses import dataclass import logging from vtkmodules.vtkCommonCore import vtkIdTypeArray -from geos.mesh.vtk.io import VtkOutput, read_mesh, write_mesh +from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py b/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py index 5d99b433d..eee5bcfbf 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py @@ -14,8 +14,8 @@ from vtkmodules.vtkFiltersModeling import vtkCollisionDetectionFilter, vtkLinearExtrusionFilter from geos.mesh.doctor.checks import reorient_mesh from geos.mesh.doctor.checks import triangle_distance -from geos.mesh.vtk.helpers import vtk_iter -from geos.mesh.vtk.io import read_mesh +from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.io.vtkIO import read_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py b/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py index 11134a403..476efa239 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py @@ -8,7 +8,7 @@ vtkUnstructuredGrid, vtkTetra ) from vtkmodules.vtkFiltersCore import vtkTriangleFilter from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream, build_face_to_face_connectivity_through_edges -from geos.mesh.vtk.helpers import to_vtk_id_list +from geos.mesh.utils.helpers import to_vtk_id_list def __compute_volume( mesh_points: vtkPoints, face_stream: FaceStream ) -> float: diff --git a/geos-mesh/src/geos/mesh/doctor/checks/self_intersecting_elements.py b/geos-mesh/src/geos/mesh/doctor/checks/self_intersecting_elements.py index 183704925..0cad78b4e 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/self_intersecting_elements.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/self_intersecting_elements.py @@ -3,7 +3,7 @@ from vtkmodules.util.numpy_support import vtk_to_numpy from vtkmodules.vtkFiltersGeneral import vtkCellValidator from vtkmodules.vtkCommonCore import vtkOutputWindow, vtkFileOutputWindow -from geos.mesh.vtk.io import read_mesh +from geos.mesh.io.vtkIO import read_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py b/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py index affad3870..f0eb5a6b5 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py @@ -11,8 +11,8 @@ VTK_PENTAGONAL_PRISM, VTK_POLYHEDRON, VTK_PYRAMID, VTK_TETRA, VTK_VOXEL, VTK_WEDGE ) from geos.mesh.doctor.checks.vtk_polyhedron import build_face_to_face_connectivity_through_edges, FaceStream -from geos.mesh.vtk.helpers import vtk_iter -from geos.mesh.vtk.io import read_mesh +from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.io.vtkIO import read_mesh @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py b/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py index 1cf1929de..d64d142ba 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py @@ -3,7 +3,7 @@ import networkx from typing import Collection, Dict, FrozenSet, Iterable, List, Sequence, Tuple from vtkmodules.vtkCommonCore import vtkIdList -from geos.mesh.vtk.helpers import vtk_iter +from geos.mesh.utils.helpers import vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/parsing/generate_fractures_parsing.py b/geos-mesh/src/geos/mesh/doctor/parsing/generate_fractures_parsing.py index 949b47a4a..18206a4e0 100644 --- a/geos-mesh/src/geos/mesh/doctor/parsing/generate_fractures_parsing.py +++ b/geos-mesh/src/geos/mesh/doctor/parsing/generate_fractures_parsing.py @@ -1,7 +1,7 @@ import os from geos.mesh.doctor.checks.generate_fractures import Options, Result, FracturePolicy from geos.mesh.doctor.parsing import vtk_output_parsing, GENERATE_FRACTURES -from geos.mesh.vtk.io import VtkOutput +from geos.mesh.io.vtkIO import VtkOutput __POLICY = "policy" __FIELD_POLICY = "field" diff --git a/geos-mesh/src/geos/mesh/doctor/parsing/vtk_output_parsing.py b/geos-mesh/src/geos/mesh/doctor/parsing/vtk_output_parsing.py index 47b6eb312..d98d8bcff 100644 --- a/geos-mesh/src/geos/mesh/doctor/parsing/vtk_output_parsing.py +++ b/geos-mesh/src/geos/mesh/doctor/parsing/vtk_output_parsing.py @@ -1,7 +1,7 @@ import os.path import logging import textwrap -from geos.mesh.vtk.io import VtkOutput +from geos.mesh.io.vtkIO import VtkOutput __OUTPUT_FILE = "output" __OUTPUT_BINARY_MODE = "data-mode" diff --git a/geos-mesh/src/geos/mesh/io/__init__.py b/geos-mesh/src/geos/mesh/io/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/geos-mesh/src/geos/mesh/vtk/io.py b/geos-mesh/src/geos/mesh/io/vtkIO.py similarity index 100% rename from geos-mesh/src/geos/mesh/vtk/io.py rename to geos-mesh/src/geos/mesh/io/vtkIO.py diff --git a/geos-mesh/src/geos/mesh/utils/__init__.py b/geos-mesh/src/geos/mesh/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/geos-mesh/src/geos/mesh/vtkUtils.py b/geos-mesh/src/geos/mesh/utils/filters.py similarity index 53% rename from geos-mesh/src/geos/mesh/vtkUtils.py rename to geos-mesh/src/geos/mesh/utils/filters.py index 1b37ffd9e..793b62f86 100644 --- a/geos-mesh/src/geos/mesh/vtkUtils.py +++ b/geos-mesh/src/geos/mesh/utils/filters.py @@ -1,15 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay -from typing import Union, cast +# SPDX-FileContributor: Martin Lemay, Paloma Martinez +from typing import Union import numpy as np import numpy.typing as npt -import pandas as pd # type: ignore[import-untyped] import vtkmodules.util.numpy_support as vnp -from vtk import ( # type: ignore[import-untyped] - VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, -) + from vtkmodules.vtkCommonCore import ( vtkCharArray, vtkDataArray, @@ -20,14 +17,12 @@ vtkUnsignedIntArray, ) from vtkmodules.vtkCommonDataModel import ( - vtkCellData, vtkCompositeDataSet, vtkDataObject, vtkDataObjectTreeIterator, vtkDataSet, vtkMultiBlockDataSet, vtkPlane, - vtkPointData, vtkPointSet, vtkPolyData, vtkUnstructuredGrid, @@ -40,367 +35,23 @@ vtkPointDataToCellData, ) from vtkmodules.vtkFiltersExtraction import vtkExtractBlock - -from geos.mesh.multiblockInspectorTreeFunctions import ( +from vtk import ( # type: ignore[import-untyped] + VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, +) +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -__doc__ = """ Utilities to process vtk objects. """ - - -def getAttributeSet( object: Union[ vtkMultiBlockDataSet, vtkDataSet ], onPoints: bool ) -> set[ str ]: - """Get the set of all attributes from an object on points or on cells. - - Args: - object (Any): object where to find the attributes. - onPoints (bool): True if attributes are on points, False if they are on - cells. - - Returns: - set[str]: set of attribute names present in input object. - """ - attributes: dict[ str, int ] - if isinstance( object, vtkMultiBlockDataSet ): - attributes = getAttributesFromMultiBlockDataSet( object, onPoints ) - elif isinstance( object, vtkDataSet ): - attributes = getAttributesFromDataSet( object, onPoints ) - else: - raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) - - assert attributes is not None, "Attribute list is undefined." - - return set( attributes.keys() ) if attributes is not None else set() - - -def getAttributesWithNumberOfComponents( - object: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet, vtkDataObject ], - onPoints: bool, -) -> dict[ str, int ]: - """Get the dictionnary of all attributes from object on points or cells. - - Args: - object (Any): object where to find the attributes. - onPoints (bool): True if attributes are on points, False if they are on - cells. - - Returns: - dict[str, int]: dictionnary where keys are the names of the attributes - and values the number of components. - - """ - attributes: dict[ str, int ] - if isinstance( object, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): - attributes = getAttributesFromMultiBlockDataSet( object, onPoints ) - elif isinstance( object, vtkDataSet ): - attributes = getAttributesFromDataSet( object, onPoints ) - else: - raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) - return attributes - - -def getAttributesFromMultiBlockDataSet( object: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], - onPoints: bool ) -> dict[ str, int ]: - """Get the dictionnary of all attributes of object on points or on cells. - - Args: - object (vtkMultiBlockDataSet | vtkCompositeDataSet): object where to find - the attributes. - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - dict[str, int]: Dictionnary of the names of the attributes as keys, and - number of components as values. - - """ - attributes: dict[ str, int ] = {} - # initialize data object tree iterator - iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() - iter.SetDataSet( object ) - iter.VisitOnlyLeavesOn() - iter.GoToFirstItem() - while iter.GetCurrentDataObject() is not None: - dataSet: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) - blockAttributes: dict[ str, int ] = getAttributesFromDataSet( dataSet, onPoints ) - for attributeName, nbComponents in blockAttributes.items(): - if attributeName not in attributes: - attributes[ attributeName ] = nbComponents - - iter.GoToNextItem() - return attributes - - -def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: - """Get the dictionnary of all attributes of a vtkDataSet on points or cells. - - Args: - object (vtkDataSet): object where to find the attributes. - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - dict[str, int]: List of the names of the attributes. - """ - attributes: dict[ str, int ] = {} - data: Union[ vtkPointData, vtkCellData ] - sup: str = "" - if onPoints: - data = object.GetPointData() - sup = "Point" - else: - data = object.GetCellData() - sup = "Cell" - assert data is not None, f"{sup} data was not recovered." - - nbAttributes = data.GetNumberOfArrays() - for i in range( nbAttributes ): - attributeName = data.GetArrayName( i ) - attribute = data.GetArray( attributeName ) - assert attribute is not None, f"Attribut {attributeName} is null" - nbComponents = attribute.GetNumberOfComponents() - attributes[ attributeName ] = nbComponents - return attributes - - -def isAttributeInObject( object: Union[ vtkMultiBlockDataSet, vtkDataSet ], attributeName: str, - onPoints: bool ) -> bool: - """Check if an attribute is in the input object. - - Args: - object (vtkMultiBlockDataSet | vtkDataSet): input object - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - bool: True if the attribute is in the table, False otherwise - """ - if isinstance( object, vtkMultiBlockDataSet ): - return isAttributeInObjectMultiBlockDataSet( object, attributeName, onPoints ) - elif isinstance( object, vtkDataSet ): - return isAttributeInObjectDataSet( object, attributeName, onPoints ) - else: - raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) - - -def isAttributeInObjectMultiBlockDataSet( object: vtkMultiBlockDataSet, attributeName: str, onPoints: bool ) -> bool: - """Check if an attribute is in the input object. - - Args: - object (vtkMultiBlockDataSet): input multiblock object - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - bool: True if the attribute is in the table, False otherwise - """ - iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() - iter.SetDataSet( object ) - iter.VisitOnlyLeavesOn() - iter.GoToFirstItem() - while iter.GetCurrentDataObject() is not None: - dataSet: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) - if isAttributeInObjectDataSet( dataSet, attributeName, onPoints ): - return True - iter.GoToNextItem() - return False - - -def isAttributeInObjectDataSet( object: vtkDataSet, attributeName: str, onPoints: bool ) -> bool: - """Check if an attribute is in the input object. - - Args: - object (vtkDataSet): input object - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - bool: True if the attribute is in the table, False otherwise - """ - data: Union[ vtkPointData, vtkCellData ] - sup: str = "" - if onPoints: - data = object.GetPointData() - sup = "Point" - else: - data = object.GetCellData() - sup = "Cell" - assert data is not None, f"{sup} data was not recovered." - return bool( data.HasArray( attributeName ) ) - - -def getArrayInObject( object: vtkDataSet, attributeName: str, onPoints: bool ) -> npt.NDArray[ np.float64 ]: - """Return the numpy array corresponding to input attribute name in table. - - Args: - object (PointSet or UnstructuredGrid): input object - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - ArrayLike[float]: the array corresponding to input attribute name. - """ - array: vtkDoubleArray = getVtkArrayInObject( object, attributeName, onPoints ) - nparray: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( array ) # type: ignore[no-untyped-call] - return nparray - - -def getVtkArrayInObject( object: vtkDataSet, attributeName: str, onPoints: bool ) -> vtkDoubleArray: - """Return the array corresponding to input attribute name in table. - - Args: - object (PointSet or UnstructuredGrid): input object - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - vtkDoubleArray: the vtk array corresponding to input attribute name. - """ - assert isAttributeInObject( object, attributeName, onPoints ), f"{attributeName} is not in input object." - return object.GetPointData().GetArray( attributeName ) if onPoints else object.GetCellData().GetArray( - attributeName ) - - -def getNumberOfComponents( - dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet ], - attributeName: str, - onPoints: bool, -) -> int: - """Get the number of components of attribute attributeName in dataSet. - - Args: - dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet | vtkDataSet): - dataSet where the attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - int: number of components. - """ - if isinstance( dataSet, vtkDataSet ): - return getNumberOfComponentsDataSet( dataSet, attributeName, onPoints ) - elif isinstance( dataSet, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): - return getNumberOfComponentsMultiBlock( dataSet, attributeName, onPoints ) - else: - raise AssertionError( "Object type is not managed." ) - - -def getNumberOfComponentsDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: bool ) -> int: - """Get the number of components of attribute attributeName in dataSet. - - Args: - dataSet (vtkDataSet): dataSet where the attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - int: number of components. - """ - array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) - return array.GetNumberOfComponents() - - -def getNumberOfComponentsMultiBlock( - dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], - attributeName: str, - onPoints: bool, -) -> int: - """Get the number of components of attribute attributeName in dataSet. - - Args: - dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet): multi block data Set where the attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - int: number of components. - """ - elementraryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) - for blockIndex in elementraryBlockIndexes: - block: vtkDataSet = cast( vtkDataSet, getBlockFromFlatIndex( dataSet, blockIndex ) ) - if isAttributeInObject( block, attributeName, onPoints ): - array: vtkDoubleArray = getVtkArrayInObject( block, attributeName, onPoints ) - return array.GetNumberOfComponents() - return 0 - - -def getComponentNames( - dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet, vtkDataObject ], - attributeName: str, - onPoints: bool, -) -> tuple[ str, ...]: - """Get the name of the components of attribute attributeName in dataSet. - - Args: - dataSet (vtkDataSet | vtkMultiBlockDataSet | vtkCompositeDataSet | vtkDataObject): dataSet - where the attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - tuple[str,...]: names of the components. - - """ - if isinstance( dataSet, vtkDataSet ): - return getComponentNamesDataSet( dataSet, attributeName, onPoints ) - elif isinstance( dataSet, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): - return getComponentNamesMultiBlock( dataSet, attributeName, onPoints ) - else: - raise AssertionError( "Object type is not managed." ) - - -def getComponentNamesDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: bool ) -> tuple[ str, ...]: - """Get the name of the components of attribute attributeName in dataSet. - - Args: - dataSet (vtkDataSet): dataSet where the attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. - - Returns: - tuple[str,...]: names of the components. - - """ - array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) - componentNames: list[ str ] = [] - if array.GetNumberOfComponents() > 1: - componentNames += [ array.GetComponentName( i ) for i in range( array.GetNumberOfComponents() ) ] - return tuple( componentNames ) - - -def getComponentNamesMultiBlock( - dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], - attributeName: str, - onPoints: bool, -) -> tuple[ str, ...]: - """Get the name of the components of attribute in MultiBlockDataSet. - - Args: - dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet): dataSet where the - attribute is. - attributeName (str): name of the attribute - onPoints (bool): True if attributes are on points, False if they are - on cells. +from geos.mesh.utils.helpers import ( + getComponentNames, + getAttributesWithNumberOfComponents, + getAttributeSet, + getArrayInObject, + isAttributeInObject, +) - Returns: - tuple[str,...]: names of the components. - """ - elementaryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) - for blockIndex in elementaryBlockIndexes: - block: vtkDataSet = cast( vtkDataSet, getBlockFromFlatIndex( dataSet, blockIndex ) ) - if isAttributeInObject( block, attributeName, onPoints ): - return getComponentNamesDataSet( block, attributeName, onPoints ) - return () +__doc__ = """ Utilities to process vtk objects. """ def fillPartialAttributes( @@ -457,39 +108,6 @@ def fillAllPartialAttributes( return True -def getAttributeValuesAsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFrame: - """Get attribute values from input surface. - - Args: - surface (vtkPolyData): mesh where to get attribute values - attributeNames (tuple[str,...]): tuple of attribute names to get the values. - - Returns: - pd.DataFrame: DataFrame containing property names as columns. - - """ - nbRows: int = surface.GetNumberOfCells() - data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) - for attributeName in attributeNames: - if not isAttributeInObject( surface, attributeName, False ): - print( f"WARNING: Attribute {attributeName} is not in the mesh." ) - continue - array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) - - if len( array.shape ) > 1: - for i in range( array.shape[ 1 ] ): - data[ attributeName + f"_{i}" ] = array[ :, i ] - data.drop( - columns=[ - attributeName, - ], - inplace=True, - ) - else: - data[ attributeName ] = array - return data - - def extractBlock( multiBlockDataSet: vtkMultiBlockDataSet, blockIndex: int ) -> vtkMultiBlockDataSet: """Extract the block with index blockIndex from multiBlockDataSet. @@ -944,63 +562,3 @@ def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: filter.SetProcessAllArrays( True ) filter.Update() return filter.GetOutputDataObject( 0 ) - - -def getBounds( - input: Union[ vtkUnstructuredGrid, - vtkMultiBlockDataSet ] ) -> tuple[ float, float, float, float, float, float ]: - """Get bounds of either single of composite data set. - - Args: - input (Union[vtkUnstructuredGrid, vtkMultiBlockDataSet]): input mesh - - Returns: - tuple[float, float, float, float, float, float]: tuple containing - bounds (xmin, xmax, ymin, ymax, zmin, zmax) - - """ - if isinstance( input, vtkMultiBlockDataSet ): - return getMultiBlockBounds( input ) - else: - return getMonoBlockBounds( input ) - - -def getMonoBlockBounds( input: vtkUnstructuredGrid, ) -> tuple[ float, float, float, float, float, float ]: - """Get boundary box extrema coordinates for a vtkUnstructuredGrid. - - Args: - input (vtkMultiBlockDataSet): input single block mesh - - Returns: - tuple[float, float, float, float, float, float]: tuple containing - bounds (xmin, xmax, ymin, ymax, zmin, zmax) - - """ - return input.GetBounds() - - -def getMultiBlockBounds( input: vtkMultiBlockDataSet, ) -> tuple[ float, float, float, float, float, float ]: - """Get boundary box extrema coordinates for a vtkMultiBlockDataSet. - - Args: - input (vtkMultiBlockDataSet): input multiblock mesh - - Returns: - tuple[float, float, float, float, float, float]: bounds. - - """ - xmin, ymin, zmin = 3 * [ np.inf ] - xmax, ymax, zmax = 3 * [ -1.0 * np.inf ] - blockIndexes: list[ int ] = getBlockElementIndexesFlatten( input ) - for blockIndex in blockIndexes: - block0: vtkDataObject = getBlockFromFlatIndex( input, blockIndex ) - assert block0 is not None, "Mesh is undefined." - block: vtkDataSet = vtkDataSet.SafeDownCast( block0 ) - bounds: tuple[ float, float, float, float, float, float ] = block.GetBounds() - xmin = bounds[ 0 ] if bounds[ 0 ] < xmin else xmin - xmax = bounds[ 1 ] if bounds[ 1 ] > xmax else xmax - ymin = bounds[ 2 ] if bounds[ 2 ] < ymin else ymin - ymax = bounds[ 3 ] if bounds[ 3 ] > ymax else ymax - zmin = bounds[ 4 ] if bounds[ 4 ] < zmin else zmin - zmax = bounds[ 5 ] if bounds[ 5 ] > zmax else zmax - return xmin, xmax, ymin, ymax, zmin, zmax diff --git a/geos-mesh/src/geos/mesh/utils/helpers.py b/geos-mesh/src/geos/mesh/utils/helpers.py new file mode 100644 index 000000000..be23bc22d --- /dev/null +++ b/geos-mesh/src/geos/mesh/utils/helpers.py @@ -0,0 +1,579 @@ +from typing import Any +import logging +from copy import deepcopy +import numpy as np +import numpy.typing as npt +import pandas as pd # type: ignore[import-untyped] +import vtkmodules.util.numpy_support as vnp +from typing import Iterator, Optional, List, Union, cast +from vtkmodules.util.numpy_support import vtk_to_numpy +from vtkmodules.vtkCommonCore import vtkDataArray, vtkIdList, vtkDoubleArray +from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkFieldData, vtkMultiBlockDataSet, vtkDataSet, + vtkCompositeDataSet, vtkDataObject, vtkPointData, vtkCellData, + vtkDataObjectTreeIterator, vtkPolyData ) +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, + getBlockFromFlatIndex ) + + +def to_vtk_id_list( data ) -> vtkIdList: + result = vtkIdList() + result.Allocate( len( data ) ) + for d in data: + result.InsertNextId( d ) + return result + + +def vtk_iter( vtkContainer ) -> Iterator[ Any ]: + """ + Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins + python containers. + :param vtkContainer: A vtk container. + :return: The iterator. + """ + if hasattr( vtkContainer, "GetNumberOfIds" ): + for i in range( vtkContainer.GetNumberOfIds() ): + yield vtkContainer.GetId( i ) + elif hasattr( vtkContainer, "GetNumberOfTypes" ): + for i in range( vtkContainer.GetNumberOfTypes() ): + yield vtkContainer.GetCellType( i ) + + +def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: + """Checks if a mesh contains at least a data arrays within its cell, field or point data + having a certain name. If so, returns True, else False. + + Args: + mesh (vtkUnstructuredGrid): An unstructured mesh. + invalid_fields (list[str]): Field name of an array in any data from the data. + + Returns: + bool: True if one field found, else False. + """ + # Check the cell data fields + cell_data = mesh.GetCellData() + for i in range( cell_data.GetNumberOfArrays() ): + if cell_data.GetArrayName( i ) in invalid_fields: + logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) + return True + # Check the field data fields + field_data = mesh.GetFieldData() + for i in range( field_data.GetNumberOfArrays() ): + if field_data.GetArrayName( i ) in invalid_fields: + logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) + return True + # Check the point data fields + point_data = mesh.GetPointData() + for i in range( point_data.GetNumberOfArrays() ): + if point_data.GetArrayName( i ) in invalid_fields: + logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) + return True + return False + + +def getFieldType( data: vtkFieldData ) -> str: + if not data.IsA( "vtkFieldData" ): + raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) + if data.IsA( "vtkCellData" ): + return "vtkCellData" + elif data.IsA( "vtkPointData" ): + return "vtkPointData" + else: + return "vtkFieldData" + + +def getArrayNames( data: vtkFieldData ) -> List[ str ]: + if not data.IsA( "vtkFieldData" ): + raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) + return [ data.GetArrayName( i ) for i in range( data.GetNumberOfArrays() ) ] + + +def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: + if data.HasArray( name ): + return data.GetArray( name ) + logging.warning( f"No array named '{name}' was found in '{data}'." ) + return None + + +def getCopyArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: + return deepcopy( getArrayByName( data, name ) ) + + +def getGlobalIdsArray( data: vtkFieldData ) -> Optional[ vtkDataArray ]: + array_names: List[ str ] = getArrayNames( data ) + for name in array_names: + if name.startswith( "Global" ) and name.endswith( "Ids" ): + return getCopyArrayByName( data, name ) + logging.warning( "No GlobalIds array was found." ) + return None + + +def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ npt.NDArray[ np.int64 ] ]: + return vtk_to_numpy( getGlobalIdsArray( data ) ) + + +def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.int64 ] ) -> None: + globalids: Optional[ npt.NDArray[ np.int64 ] ] = getNumpyGlobalIdsArray( data ) + if globalids is not None: + arr = arr[ np.argsort( globalids ) ] + else: + logging.warning( "No sorting was performed." ) + + +def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ Any ]: + arr: Optional[ npt.NDArray[ Any ] ] = vtk_to_numpy( getArrayByName( data, name ) ) + if arr is not None: + if sorted: + sortArrayByGlobalIds( data, arr ) + return arr + return None + + +def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray[ Any ] ]: + return deepcopy( getNumpyArrayByName( data, name, sorted=sorted ) ) + + +def getAttributeSet( object: Union[ vtkMultiBlockDataSet, vtkDataSet ], onPoints: bool ) -> set[ str ]: + """Get the set of all attributes from an object on points or on cells. + + Args: + object (Any): object where to find the attributes. + onPoints (bool): True if attributes are on points, False if they are on + cells. + + Returns: + set[str]: set of attribute names present in input object. + """ + attributes: dict[ str, int ] + if isinstance( object, vtkMultiBlockDataSet ): + attributes = getAttributesFromMultiBlockDataSet( object, onPoints ) + elif isinstance( object, vtkDataSet ): + attributes = getAttributesFromDataSet( object, onPoints ) + else: + raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) + + assert attributes is not None, "Attribute list is undefined." + + return set( attributes.keys() ) if attributes is not None else set() + + +def getAttributesWithNumberOfComponents( + object: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet, vtkDataObject ], + onPoints: bool, +) -> dict[ str, int ]: + """Get the dictionnary of all attributes from object on points or cells. + + Args: + object (Any): object where to find the attributes. + onPoints (bool): True if attributes are on points, False if they are on + cells. + + Returns: + dict[str, int]: dictionnary where keys are the names of the attributes + and values the number of components. + + """ + attributes: dict[ str, int ] + if isinstance( object, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): + attributes = getAttributesFromMultiBlockDataSet( object, onPoints ) + elif isinstance( object, vtkDataSet ): + attributes = getAttributesFromDataSet( object, onPoints ) + else: + raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) + return attributes + + +def getAttributesFromMultiBlockDataSet( object: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], + onPoints: bool ) -> dict[ str, int ]: + """Get the dictionnary of all attributes of object on points or on cells. + + Args: + object (vtkMultiBlockDataSet | vtkCompositeDataSet): object where to find + the attributes. + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + dict[str, int]: Dictionnary of the names of the attributes as keys, and + number of components as values. + + """ + attributes: dict[ str, int ] = {} + # initialize data object tree iterator + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( object ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + dataSet: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + blockAttributes: dict[ str, int ] = getAttributesFromDataSet( dataSet, onPoints ) + for attributeName, nbComponents in blockAttributes.items(): + if attributeName not in attributes: + attributes[ attributeName ] = nbComponents + + iter.GoToNextItem() + return attributes + + +def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: + """Get the dictionnary of all attributes of a vtkDataSet on points or cells. + + Args: + object (vtkDataSet): object where to find the attributes. + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + dict[str, int]: List of the names of the attributes. + """ + attributes: dict[ str, int ] = {} + data: Union[ vtkPointData, vtkCellData ] + sup: str = "" + if onPoints: + data = object.GetPointData() + sup = "Point" + else: + data = object.GetCellData() + sup = "Cell" + assert data is not None, f"{sup} data was not recovered." + + nbAttributes = data.GetNumberOfArrays() + for i in range( nbAttributes ): + attributeName = data.GetArrayName( i ) + attribute = data.GetArray( attributeName ) + assert attribute is not None, f"Attribut {attributeName} is null" + nbComponents = attribute.GetNumberOfComponents() + attributes[ attributeName ] = nbComponents + return attributes + + +def isAttributeInObject( object: Union[ vtkMultiBlockDataSet, vtkDataSet ], attributeName: str, + onPoints: bool ) -> bool: + """Check if an attribute is in the input object. + + Args: + object (vtkMultiBlockDataSet | vtkDataSet): input object + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + bool: True if the attribute is in the table, False otherwise + """ + if isinstance( object, vtkMultiBlockDataSet ): + return isAttributeInObjectMultiBlockDataSet( object, attributeName, onPoints ) + elif isinstance( object, vtkDataSet ): + return isAttributeInObjectDataSet( object, attributeName, onPoints ) + else: + raise TypeError( "Input object must be a vtkDataSet or vtkMultiBlockDataSet." ) + + +def isAttributeInObjectMultiBlockDataSet( object: vtkMultiBlockDataSet, attributeName: str, onPoints: bool ) -> bool: + """Check if an attribute is in the input object. + + Args: + object (vtkMultiBlockDataSet): input multiblock object + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + bool: True if the attribute is in the table, False otherwise + """ + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( object ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + dataSet: vtkDataSet = vtkDataSet.SafeDownCast( iter.GetCurrentDataObject() ) + if isAttributeInObjectDataSet( dataSet, attributeName, onPoints ): + return True + iter.GoToNextItem() + return False + + +def isAttributeInObjectDataSet( object: vtkDataSet, attributeName: str, onPoints: bool ) -> bool: + """Check if an attribute is in the input object. + + Args: + object (vtkDataSet): input object + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + bool: True if the attribute is in the table, False otherwise + """ + data: Union[ vtkPointData, vtkCellData ] + sup: str = "" + if onPoints: + data = object.GetPointData() + sup = "Point" + else: + data = object.GetCellData() + sup = "Cell" + assert data is not None, f"{sup} data was not recovered." + return bool( data.HasArray( attributeName ) ) + + +def getArrayInObject( object: vtkDataSet, attributeName: str, onPoints: bool ) -> npt.NDArray[ np.float64 ]: + """Return the numpy array corresponding to input attribute name in table. + + Args: + object (PointSet or UnstructuredGrid): input object + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + ArrayLike[float]: the array corresponding to input attribute name. + """ + array: vtkDoubleArray = getVtkArrayInObject( object, attributeName, onPoints ) + nparray: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( array ) # type: ignore[no-untyped-call] + return nparray + + +def getVtkArrayInObject( object: vtkDataSet, attributeName: str, onPoints: bool ) -> vtkDoubleArray: + """Return the array corresponding to input attribute name in table. + + Args: + object (PointSet or UnstructuredGrid): input object + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + vtkDoubleArray: the vtk array corresponding to input attribute name. + """ + assert isAttributeInObject( object, attributeName, onPoints ), f"{attributeName} is not in input object." + return object.GetPointData().GetArray( attributeName ) if onPoints else object.GetCellData().GetArray( + attributeName ) + + +def getNumberOfComponents( + dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet ], + attributeName: str, + onPoints: bool, +) -> int: + """Get the number of components of attribute attributeName in dataSet. + + Args: + dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet | vtkDataSet): + dataSet where the attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + int: number of components. + """ + if isinstance( dataSet, vtkDataSet ): + return getNumberOfComponentsDataSet( dataSet, attributeName, onPoints ) + elif isinstance( dataSet, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): + return getNumberOfComponentsMultiBlock( dataSet, attributeName, onPoints ) + else: + raise AssertionError( "Object type is not managed." ) + + +def getNumberOfComponentsDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: bool ) -> int: + """Get the number of components of attribute attributeName in dataSet. + + Args: + dataSet (vtkDataSet): dataSet where the attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + int: number of components. + """ + array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) + return array.GetNumberOfComponents() + + +def getNumberOfComponentsMultiBlock( + dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], + attributeName: str, + onPoints: bool, +) -> int: + """Get the number of components of attribute attributeName in dataSet. + + Args: + dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet): multi block data Set where the attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + int: number of components. + """ + elementaryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) + for blockIndex in elementaryBlockIndexes: + block: vtkDataSet = cast( vtkDataSet, getBlockFromFlatIndex( dataSet, blockIndex ) ) + if isAttributeInObject( block, attributeName, onPoints ): + array: vtkDoubleArray = getVtkArrayInObject( block, attributeName, onPoints ) + return array.GetNumberOfComponents() + return 0 + + +def getComponentNames( + dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet, vtkDataSet, vtkDataObject ], + attributeName: str, + onPoints: bool, +) -> tuple[ str, ...]: + """Get the name of the components of attribute attributeName in dataSet. + + Args: + dataSet (vtkDataSet | vtkMultiBlockDataSet | vtkCompositeDataSet | vtkDataObject): dataSet + where the attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + tuple[str,...]: names of the components. + + """ + if isinstance( dataSet, vtkDataSet ): + return getComponentNamesDataSet( dataSet, attributeName, onPoints ) + elif isinstance( dataSet, ( vtkMultiBlockDataSet, vtkCompositeDataSet ) ): + return getComponentNamesMultiBlock( dataSet, attributeName, onPoints ) + else: + raise AssertionError( "Object type is not managed." ) + + +def getComponentNamesDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: bool ) -> tuple[ str, ...]: + """Get the name of the components of attribute attributeName in dataSet. + + Args: + dataSet (vtkDataSet): dataSet where the attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + tuple[str,...]: names of the components. + + """ + array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) + componentNames: list[ str ] = [] + if array.GetNumberOfComponents() > 1: + componentNames += [ array.GetComponentName( i ) for i in range( array.GetNumberOfComponents() ) ] + return tuple( componentNames ) + + +def getComponentNamesMultiBlock( + dataSet: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], + attributeName: str, + onPoints: bool, +) -> tuple[ str, ...]: + """Get the name of the components of attribute in MultiBlockDataSet. + + Args: + dataSet (vtkMultiBlockDataSet | vtkCompositeDataSet): dataSet where the + attribute is. + attributeName (str): name of the attribute + onPoints (bool): True if attributes are on points, False if they are + on cells. + + Returns: + tuple[str,...]: names of the components. + """ + elementaryBlockIndexes: list[ int ] = getBlockElementIndexesFlatten( dataSet ) + for blockIndex in elementaryBlockIndexes: + block: vtkDataSet = cast( vtkDataSet, getBlockFromFlatIndex( dataSet, blockIndex ) ) + if isAttributeInObject( block, attributeName, onPoints ): + return getComponentNamesDataSet( block, attributeName, onPoints ) + return () + + +def AsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFrame: + """Get attribute values from input surface. + + Args: + surface (vtkPolyData): mesh where to get attribute values + attributeNames (tuple[str,...]): tuple of attribute names to get the values. + + Returns: + pd.DataFrame: DataFrame containing property names as columns. + + """ + nbRows: int = surface.GetNumberOfCells() + data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) + for attributeName in attributeNames: + if not isAttributeInObject( surface, attributeName, False ): + print( f"WARNING: Attribute {attributeName} is not in the mesh." ) + continue + array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) + + if len( array.shape ) > 1: + for i in range( array.shape[ 1 ] ): + data[ attributeName + f"_{i}" ] = array[ :, i ] + data.drop( + columns=[ + attributeName, + ], + inplace=True, + ) + else: + data[ attributeName ] = array + return data + + +def getBounds( + input: Union[ vtkUnstructuredGrid, + vtkMultiBlockDataSet ] ) -> tuple[ float, float, float, float, float, float ]: + """Get bounds of either single of composite data set. + + Args: + input (Union[vtkUnstructuredGrid, vtkMultiBlockDataSet]): input mesh + + Returns: + tuple[float, float, float, float, float, float]: tuple containing + bounds (xmin, xmax, ymin, ymax, zmin, zmax) + + """ + if isinstance( input, vtkMultiBlockDataSet ): + return getMultiBlockBounds( input ) + else: + return getMonoBlockBounds( input ) + + +def getMonoBlockBounds( input: vtkUnstructuredGrid, ) -> tuple[ float, float, float, float, float, float ]: + """Get boundary box extrema coordinates for a vtkUnstructuredGrid. + + Args: + input (vtkMultiBlockDataSet): input single block mesh + + Returns: + tuple[float, float, float, float, float, float]: tuple containing + bounds (xmin, xmax, ymin, ymax, zmin, zmax) + + """ + return input.GetBounds() + + +def getMultiBlockBounds( input: vtkMultiBlockDataSet, ) -> tuple[ float, float, float, float, float, float ]: + """Get boundary box extrema coordinates for a vtkMultiBlockDataSet. + + Args: + input (vtkMultiBlockDataSet): input multiblock mesh + + Returns: + tuple[float, float, float, float, float, float]: bounds. + + """ + xmin, ymin, zmin = 3 * [ np.inf ] + xmax, ymax, zmax = 3 * [ -1.0 * np.inf ] + blockIndexes: list[ int ] = getBlockElementIndexesFlatten( input ) + for blockIndex in blockIndexes: + block0: vtkDataObject = getBlockFromFlatIndex( input, blockIndex ) + assert block0 is not None, "Mesh is undefined." + block: vtkDataSet = vtkDataSet.SafeDownCast( block0 ) + bounds: tuple[ float, float, float, float, float, float ] = block.GetBounds() + xmin = bounds[ 0 ] if bounds[ 0 ] < xmin else xmin + xmax = bounds[ 1 ] if bounds[ 1 ] > xmax else xmax + ymin = bounds[ 2 ] if bounds[ 2 ] < ymin else ymin + ymax = bounds[ 3 ] if bounds[ 3 ] > ymax else ymax + zmin = bounds[ 4 ] if bounds[ 4 ] < zmin else zmin + zmax = bounds[ 5 ] if bounds[ 5 ] > zmax else zmax + return xmin, xmax, ymin, ymax, zmin, zmax diff --git a/geos-mesh/src/geos/mesh/multiblockInspectorTreeFunctions.py b/geos-mesh/src/geos/mesh/utils/multiblockInspectorTreeFunctions.py similarity index 100% rename from geos-mesh/src/geos/mesh/multiblockInspectorTreeFunctions.py rename to geos-mesh/src/geos/mesh/utils/multiblockInspectorTreeFunctions.py diff --git a/geos-mesh/src/geos/mesh/vtk/__init__.py b/geos-mesh/src/geos/mesh/vtk/__init__.py deleted file mode 100644 index b1cfe267e..000000000 --- a/geos-mesh/src/geos/mesh/vtk/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Empty \ No newline at end of file diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py deleted file mode 100644 index 94b273da6..000000000 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -from copy import deepcopy -from numpy import argsort, array -from typing import Iterator, Optional, List -from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonCore import vtkDataArray, vtkIdList -from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkFieldData - - -def to_vtk_id_list( data ) -> vtkIdList: - result = vtkIdList() - result.Allocate( len( data ) ) - for d in data: - result.InsertNextId( d ) - return result - - -def vtk_iter( vtkContainer ) -> Iterator[ any ]: - """ - Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins - python containers. - :param vtkContainer: A vtk container. - :return: The iterator. - """ - if hasattr( vtkContainer, "GetNumberOfIds" ): - for i in range( vtkContainer.GetNumberOfIds() ): - yield vtkContainer.GetId( i ) - elif hasattr( vtkContainer, "GetNumberOfTypes" ): - for i in range( vtkContainer.GetNumberOfTypes() ): - yield vtkContainer.GetCellType( i ) - - -def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: - """Checks if a mesh contains at least a data arrays within its cell, field or point data - having a certain name. If so, returns True, else False. - - Args: - mesh (vtkUnstructuredGrid): An unstructured mesh. - invalid_fields (list[str]): Field name of an array in any data from the data. - - Returns: - bool: True if one field found, else False. - """ - # Check the cell data fields - cell_data = mesh.GetCellData() - for i in range( cell_data.GetNumberOfArrays() ): - if cell_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) - return True - # Check the field data fields - field_data = mesh.GetFieldData() - for i in range( field_data.GetNumberOfArrays() ): - if field_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) - return True - # Check the point data fields - point_data = mesh.GetPointData() - for i in range( point_data.GetNumberOfArrays() ): - if point_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) - return True - return False - - -def getFieldType( data: vtkFieldData ) -> str: - if not data.IsA( "vtkFieldData" ): - raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) - if data.IsA( "vtkCellData" ): - return "vtkCellData" - elif data.IsA( "vtkPointData" ): - return "vtkPointData" - else: - return "vtkFieldData" - - -def getArrayNames( data: vtkFieldData ) -> List[ str ]: - if not data.IsA( "vtkFieldData" ): - raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) - return [ data.GetArrayName( i ) for i in range( data.GetNumberOfArrays() ) ] - - -def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: - if data.HasArray( name ): - return data.GetArray( name ) - logging.warning( f"No array named '{name}' was found in '{data}'." ) - return None - - -def getCopyArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: - return deepcopy( getArrayByName( data, name ) ) - - -def getGlobalIdsArray( data: vtkFieldData ) -> Optional[ vtkDataArray ]: - array_names: List[ str ] = getArrayNames( data ) - for name in array_names: - if name.startswith( "Global" ) and name.endswith( "Ids" ): - return getCopyArrayByName( data, name ) - logging.warning( "No GlobalIds array was found." ) - - -def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ array ]: - return vtk_to_numpy( getGlobalIdsArray( data ) ) - - -def sortArrayByGlobalIds( data: vtkFieldData, arr: array ) -> None: - globalids: array = getNumpyGlobalIdsArray( data ) - if globalids is not None: - arr = arr[ argsort( globalids ) ] - else: - logging.warning( "No sorting was performed." ) - - -def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ array ]: - arr: array = vtk_to_numpy( getArrayByName( data, name ) ) - if arr is not None: - if sorted: - array_names: List[ str ] = getArrayNames( data ) - sortArrayByGlobalIds( data, arr, array_names ) - return arr - return None - - -def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ array ]: - return deepcopy( getNumpyArrayByName( data, name, sorted=sorted ) ) diff --git a/geos-mesh/tests/test_cli_parsing.py b/geos-mesh/tests/test_cli_parsing.py index 5a5f21bb6..a73fe3f32 100644 --- a/geos-mesh/tests/test_cli_parsing.py +++ b/geos-mesh/tests/test_cli_parsing.py @@ -4,7 +4,7 @@ from typing import Iterator, Sequence from geos.mesh.doctor.checks.generate_fractures import FracturePolicy, Options from geos.mesh.doctor.parsing.generate_fractures_parsing import convert, display_results, fill_subparser -from geos.mesh.vtk.io import VtkOutput +from geos.mesh.io.vtkIO import VtkOutput @dataclass( frozen=True ) diff --git a/geos-mesh/tests/test_generate_fractures.py b/geos-mesh/tests/test_generate_fractures.py index f97d4be99..1a6c1de75 100644 --- a/geos-mesh/tests/test_generate_fractures.py +++ b/geos-mesh/tests/test_generate_fractures.py @@ -8,7 +8,7 @@ from geos.mesh.doctor.checks.generate_cube import build_rectilinear_blocks_mesh, XYZ from geos.mesh.doctor.checks.generate_fractures import ( __split_mesh_on_fractures, Options, FracturePolicy, Coordinates3D, IDMapping ) -from geos.mesh.vtk.helpers import to_vtk_id_list +from geos.mesh.utils.helpers import to_vtk_id_list FaceNodesCoords = tuple[ tuple[ float ] ] IDMatrix = Sequence[ Sequence[ int ] ] diff --git a/geos-mesh/tests/test_reorient_mesh.py b/geos-mesh/tests/test_reorient_mesh.py index 9bfd342de..9e66f3b78 100644 --- a/geos-mesh/tests/test_reorient_mesh.py +++ b/geos-mesh/tests/test_reorient_mesh.py @@ -6,7 +6,7 @@ from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, VTK_POLYHEDRON from geos.mesh.doctor.checks.reorient_mesh import reorient_mesh from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.vtk.helpers import to_vtk_id_list, vtk_iter +from geos.mesh.utils.helpers import to_vtk_id_list, vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/tests/test_supported_elements.py b/geos-mesh/tests/test_supported_elements.py index 6126b8ea3..28f4cd2f8 100644 --- a/geos-mesh/tests/test_supported_elements.py +++ b/geos-mesh/tests/test_supported_elements.py @@ -5,7 +5,7 @@ from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, VTK_POLYHEDRON # from geos.mesh.doctor.checks.supported_elements import Options, check, __check from geos.mesh.doctor.checks.vtk_polyhedron import parse_face_stream, FaceStream -from geos.mesh.vtk.helpers import to_vtk_id_list +from geos.mesh.utils.helpers import to_vtk_id_list # TODO Update this test to have access to another meshTests file diff --git a/geos-mesh/tests/test_vtkUtils.py b/geos-mesh/tests/test_vtkFilters.py similarity index 54% rename from geos-mesh/tests/test_vtkUtils.py rename to geos-mesh/tests/test_vtkFilters.py index 854d77567..1b2aa69c0 100644 --- a/geos-mesh/tests/test_vtkUtils.py +++ b/geos-mesh/tests/test_vtkFilters.py @@ -3,188 +3,23 @@ # SPDX-FileContributor: Paloma Martinez # SPDX-License-Identifier: Apache 2.0 # ruff: noqa: E402 # disable Module level import not at top of file -# mypy: disable-error-code="operator, attr-defined" +# mypy: disable-error-code="operator" import pytest -from typing import Union, Tuple +from typing import Union, Tuple, cast import numpy as np import numpy.typing as npt import vtkmodules.util.numpy_support as vnp -import pandas as pd # type: ignore[import-untyped] from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray -from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObject, vtkDataObjectTreeIterator, - vtkPolyData, vtkPointData, vtkCellData, vtkUnstructuredGrid ) +from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, + vtkPointData, vtkCellData, vtkUnstructuredGrid ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, ) -from geos.mesh import vtkUtils - - -@pytest.mark.parametrize( "onpoints, expected", [ ( True, { - 'GLOBAL_IDS_POINTS': 1, - 'collocated_nodes': 2, - 'PointAttribute': 3 -} ), ( False, { - 'CELL_MARKERS': 1, - 'PERM': 3, - 'PORO': 1, - 'FAULT': 1, - 'GLOBAL_IDS_CELLS': 1, - 'CellAttribute': 3 -} ) ] ) -def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, onpoints: bool, - expected: dict[ str, int ] ) -> None: - """Test getting attribute list as dict from multiblock.""" - multiBlockTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - attributes: dict[ str, int ] = vtkUtils.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) - - assert attributes == expected - - -@pytest.mark.parametrize( "onpoints, expected", [ ( True, { - 'GLOBAL_IDS_POINTS': 1, - 'PointAttribute': 3, -} ), ( False, { - 'CELL_MARKERS': 1, - 'PERM': 3, - 'PORO': 1, - 'FAULT': 1, - 'GLOBAL_IDS_CELLS': 1, - 'CellAttribute': 3 -} ) ] ) -def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: - """Test getting attribute list as dict from dataset.""" - vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - attributes: dict[ str, int ] = vtkUtils.getAttributesFromDataSet( vtkDataSetTest, onpoints ) - assert attributes == expected - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PORO", False, 1 ), - ( "PORO", True, 0 ), -] ) -def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, - expected: dict[ str, int ] ) -> None: - """Test presence of attribute in a multiblock.""" - multiBlockDataset: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: bool = vtkUtils.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) - assert obtained == expected - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PORO", False, 1 ), - ( "PORO", True, 0 ), -] ) -def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, - expected: bool ) -> None: - """Test presence of attribute in a dataset.""" - vtkDataset: vtkDataSet = dataSetTest( "dataset" ) - obtained: bool = vtkUtils.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) - assert obtained == expected - - -@pytest.mark.parametrize( "arrayExpected, onpoints", [ - ( "PORO", False ), - ( "PERM", False ), - ( "PointAttribute", True ), -], - indirect=[ "arrayExpected" ] ) -def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray, dataSetTest: vtkDataSet, - onpoints: bool ) -> None: - """Test getting numpy array of an attribute from dataset.""" - vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - params = request.node.callspec.params - attributeName: str = params[ "arrayExpected" ] - - obtained: npt.NDArray[ np.float64 ] = vtkUtils.getArrayInObject( vtkDataSetTest, attributeName, onpoints ) - expected: npt.NDArray[ np.float64 ] = arrayExpected - - assert ( obtained == expected ).all() - - -@pytest.mark.parametrize( "arrayExpected, onpoints", [ - ( "PORO", False ), - ( "PointAttribute", True ), -], - indirect=[ "arrayExpected" ] ) -def test_getVtkArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray[ np.float64 ], - dataSetTest: vtkDataSet, onpoints: bool ) -> None: - """Test getting Vtk Array from a dataset.""" - vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - params = request.node.callspec.params - attributeName: str = params[ 'arrayExpected' ] - - obtained: vtkDoubleArray = vtkUtils.getVtkArrayInObject( vtkDataSetTest, attributeName, onpoints ) - obtained_as_np: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( obtained ) - - assert ( obtained_as_np == arrayExpected ).all() - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PORO", False, 1 ), - ( "PERM", False, 3 ), - ( "PointAttribute", True, 3 ), -] ) -def test_getNumberOfComponentsDataSet( - dataSetTest: vtkDataSet, - attributeName: str, - onpoints: bool, - expected: int, -) -> None: - """Test getting the number of components of an attribute from a dataset.""" - vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - obtained: int = vtkUtils.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) - assert obtained == expected - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PORO", False, 1 ), - ( "PERM", False, 3 ), - ( "PointAttribute", True, 3 ), -] ) -def test_getNumberOfComponentsMultiBlock( - dataSetTest: vtkMultiBlockDataSet, - attributeName: str, - onpoints: bool, - expected: int, -) -> None: - """Test getting the number of components of an attribute from a multiblock.""" - vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: int = vtkUtils.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) - - assert obtained == expected - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), - ( "PORO", False, () ), -] ) -def test_getComponentNamesDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, - expected: tuple[ str, ...] ) -> None: - """Test getting the component names of an attribute from a dataset.""" - vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - obtained: tuple[ str, ...] = vtkUtils.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) - assert obtained == expected - - -@pytest.mark.parametrize( "attributeName, onpoints, expected", [ - ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), - ( "PORO", False, () ), -] ) -def test_getComponentNamesMultiBlock( - dataSetTest: vtkMultiBlockDataSet, - attributeName: str, - onpoints: bool, - expected: tuple[ str, ...], -) -> None: - """Test getting the component names of an attribute from a multiblock.""" - vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: tuple[ str, ...] = vtkUtils.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, - onpoints ) - assert obtained == expected +from geos.mesh.utils import filters as vtkFilters @pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) @@ -195,7 +30,7 @@ def test_fillPartialAttributes( ) -> None: """Test filling a partial attribute from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - vtkUtils.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) + vtkFilters.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -224,7 +59,7 @@ def test_fillAllPartialAttributes( ) -> None: """Test filling all partial attributes from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - vtkUtils.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) + vtkFilters.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -244,23 +79,6 @@ def test_fillAllPartialAttributes( iter.GoToNextItem() -@pytest.mark.parametrize( "attributeNames, expected_columns", [ - ( ( "CellAttribute1", ), ( "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), - ( ( - "CellAttribute1", - "CellAttribute2", - ), ( "CellAttribute2", "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), -] ) -def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames: Tuple[ str, ...], - expected_columns: Tuple[ str, ...] ) -> None: - """Test getting an attribute from a polydata as a dataframe.""" - polydataset: vtkPolyData = dataSetTest( "polydata" ) - data: pd.DataFrame = vtkUtils.getAttributeValuesAsDF( polydataset, attributeNames ) - - obtained_columns = data.columns.values.tolist() - assert obtained_columns == list( expected_columns ) - - # TODO: Add test for keepPartialAttributes = True when function fixed @pytest.mark.parametrize( "keepPartialAttributes, expected_point_attributes, expected_cell_attributes", @@ -276,7 +94,7 @@ def test_mergeBlocks( ) -> None: """Test the merging of a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - dataset: vtkUnstructuredGrid = vtkUtils.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) + dataset: vtkUnstructuredGrid = vtkFilters.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) assert dataset.GetCellData().GetNumberOfArrays() == len( expected_cell_attributes ) for c_attribute in expected_cell_attributes: @@ -301,7 +119,7 @@ def test_createEmptyAttribute( ) -> None: """Test empty attribute creation.""" componentNames: tuple[ str, str, str ] = ( "d1", "d2", "d3" ) - newAttr: vtkDataArray = vtkUtils.createEmptyAttribute( attributeName, componentNames, dataType ) + newAttr: vtkDataArray = vtkFilters.createEmptyAttribute( attributeName, componentNames, dataType ) assert newAttr.GetNumberOfComponents() == len( componentNames ) for ax in range( 3 ): @@ -323,8 +141,8 @@ def test_createConstantAttributeMultiBlock( attributeName: str = "testAttributemultiblock" values: tuple[ float, float, float ] = ( 12.4, 10, 40.0 ) componentNames: tuple[ str, str, str ] = ( "X", "Y", "Z" ) - vtkUtils.createConstantAttributeMultiBlock( vtkMultiBlockDataSetTest, values, attributeName, componentNames, - onpoints ) + vtkFilters.createConstantAttributeMultiBlock( vtkMultiBlockDataSetTest, values, attributeName, componentNames, + onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -361,7 +179,7 @@ def test_createConstantAttributeDataSet( vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) componentNames: Tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "newAttributedataset" - vtkUtils.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) + vtkFilters.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) data: Union[ vtkPointData, vtkCellData ] if onpoints: @@ -393,7 +211,7 @@ def test_createAttribute( componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "AttributeName" - vtkUtils.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) + vtkFilters.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) data: Union[ vtkPointData, vtkCellData ] if onpoints: @@ -416,11 +234,11 @@ def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet ) -> None: attributeFrom: str = "CellAttribute" attributeTo: str = "CellAttributeTO" - vtkUtils.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) + vtkFilters.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) blockIndex: int = 0 - blockFrom: vtkDataObject = objectFrom.GetBlock( blockIndex ) - blockTo: vtkDataObject = objectTo.GetBlock( blockIndex ) + blockFrom: vtkDataSet = cast( vtkDataSet, objectFrom.GetBlock( blockIndex ) ) + blockTo: vtkDataSet = cast( vtkDataSet, objectTo.GetBlock( blockIndex ) ) arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockFrom.GetCellData().GetArray( attributeFrom ) ) arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( blockTo.GetCellData().GetArray( attributeTo ) ) @@ -436,7 +254,7 @@ def test_copyAttributeDataSet( dataSetTest: vtkDataSet, ) -> None: attributNameFrom = "CellAttribute" attributNameTo = "COPYATTRIBUTETO" - vtkUtils.copyAttributeDataSet( objectFrom, objectTo, attributNameFrom, attributNameTo ) + vtkFilters.copyAttributeDataSet( objectFrom, objectTo, attributNameFrom, attributNameTo ) arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectFrom.GetCellData().GetArray( attributNameFrom ) ) arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectTo.GetCellData().GetArray( attributNameTo ) ) @@ -456,13 +274,13 @@ def test_renameAttributeMultiblock( """Test renaming attribute in a multiblock dataset.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) newAttributeName: str = "new" + attributeName - vtkUtils.renameAttribute( + vtkFilters.renameAttribute( vtkMultiBlockDataSetTest, attributeName, newAttributeName, onpoints, ) - block: vtkDataObject = vtkMultiBlockDataSetTest.GetBlock( 0 ) + block: vtkDataSet = cast( vtkDataSet, vtkMultiBlockDataSetTest.GetBlock( 0 ) ) data: Union[ vtkPointData, vtkCellData ] if onpoints: data = block.GetPointData() @@ -484,10 +302,10 @@ def test_renameAttributeDataSet( """Test renaming an attribute in a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) newAttributeName: str = "new" + attributeName - vtkUtils.renameAttribute( object=vtkDataSetTest, - attributeName=attributeName, - newAttributeName=newAttributeName, - onPoints=onpoints ) + vtkFilters.renameAttribute( object=vtkDataSetTest, + attributeName=attributeName, + newAttributeName=newAttributeName, + onPoints=onpoints ) if onpoints: assert vtkDataSetTest.GetPointData().HasArray( attributeName ) == 0 assert vtkDataSetTest.GetPointData().HasArray( newAttributeName ) == 1 diff --git a/geos-mesh/tests/test_vtkHelpers.py b/geos-mesh/tests/test_vtkHelpers.py new file mode 100644 index 000000000..c2f6058fb --- /dev/null +++ b/geos-mesh/tests/test_vtkHelpers.py @@ -0,0 +1,199 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Paloma Martinez +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +# mypy: disable-error-code="operator, attr-defined" +import pytest +from typing import Tuple + +import numpy as np +import numpy.typing as npt + +import vtkmodules.util.numpy_support as vnp +import pandas as pd # type: ignore[import-untyped] +from vtkmodules.vtkCommonCore import vtkDoubleArray +from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkMultiBlockDataSet, vtkPolyData + +from geos.mesh.utils import helpers as vtkHelpers + + +@pytest.mark.parametrize( "onpoints, expected", [ ( True, { + 'GLOBAL_IDS_POINTS': 1, + 'collocated_nodes': 2, + 'PointAttribute': 3 +} ), ( False, { + 'CELL_MARKERS': 1, + 'PERM': 3, + 'PORO': 1, + 'FAULT': 1, + 'GLOBAL_IDS_CELLS': 1, + 'CellAttribute': 3 +} ) ] ) +def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, onpoints: bool, + expected: dict[ str, int ] ) -> None: + """Test getting attribute list as dict from multiblock.""" + multiBlockTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + attributes: dict[ str, int ] = vtkHelpers.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) + + assert attributes == expected + + +@pytest.mark.parametrize( "onpoints, expected", [ ( True, { + 'GLOBAL_IDS_POINTS': 1, + 'PointAttribute': 3, +} ), ( False, { + 'CELL_MARKERS': 1, + 'PERM': 3, + 'PORO': 1, + 'FAULT': 1, + 'GLOBAL_IDS_CELLS': 1, + 'CellAttribute': 3 +} ) ] ) +def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: + """Test getting attribute list as dict from dataset.""" + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + attributes: dict[ str, int ] = vtkHelpers.getAttributesFromDataSet( vtkDataSetTest, onpoints ) + assert attributes == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PORO", True, 0 ), +] ) +def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, attributeName: str, onpoints: bool, + expected: dict[ str, int ] ) -> None: + """Test presence of attribute in a multiblock.""" + multiBlockDataset: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: bool = vtkHelpers.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PORO", True, 0 ), +] ) +def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, + expected: bool ) -> None: + """Test presence of attribute in a dataset.""" + vtkDataset: vtkDataSet = dataSetTest( "dataset" ) + obtained: bool = vtkHelpers.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "arrayExpected, onpoints", [ + ( "PORO", False ), + ( "PERM", False ), + ( "PointAttribute", True ), +], + indirect=[ "arrayExpected" ] ) +def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray[ np.float64 ], + dataSetTest: vtkDataSet, onpoints: bool ) -> None: + """Test getting numpy array of an attribute from dataset.""" + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + params = request.node.callspec.params + attributeName: str = params[ "arrayExpected" ] + + obtained: npt.NDArray[ np.float64 ] = vtkHelpers.getArrayInObject( vtkDataSetTest, attributeName, onpoints ) + expected: npt.NDArray[ np.float64 ] = arrayExpected + + assert ( obtained == expected ).all() + + +@pytest.mark.parametrize( "arrayExpected, onpoints", [ + ( "PORO", False ), + ( "PointAttribute", True ), +], + indirect=[ "arrayExpected" ] ) +def test_getVtkArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.NDArray[ np.float64 ], + dataSetTest: vtkDataSet, onpoints: bool ) -> None: + """Test getting Vtk Array from a dataset.""" + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + params = request.node.callspec.params + attributeName: str = params[ 'arrayExpected' ] + + obtained: vtkDoubleArray = vtkHelpers.getVtkArrayInObject( vtkDataSetTest, attributeName, onpoints ) + obtained_as_np: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( obtained ) + + assert ( obtained_as_np == arrayExpected ).all() + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PERM", False, 3 ), + ( "PointAttribute", True, 3 ), +] ) +def test_getNumberOfComponentsDataSet( + dataSetTest: vtkDataSet, + attributeName: str, + onpoints: bool, + expected: int, +) -> None: + """Test getting the number of components of an attribute from a dataset.""" + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + obtained: int = vtkHelpers.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PORO", False, 1 ), + ( "PERM", False, 3 ), + ( "PointAttribute", True, 3 ), +] ) +def test_getNumberOfComponentsMultiBlock( + dataSetTest: vtkMultiBlockDataSet, + attributeName: str, + onpoints: bool, + expected: int, +) -> None: + """Test getting the number of components of an attribute from a multiblock.""" + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: int = vtkHelpers.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) + + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), + ( "PORO", False, () ), +] ) +def test_getComponentNamesDataSet( dataSetTest: vtkDataSet, attributeName: str, onpoints: bool, + expected: tuple[ str, ...] ) -> None: + """Test getting the component names of an attribute from a dataset.""" + vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) + obtained: tuple[ str, ...] = vtkHelpers.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeName, onpoints, expected", [ + ( "PERM", False, ( "AX1", "AX2", "AX3" ) ), + ( "PORO", False, () ), +] ) +def test_getComponentNamesMultiBlock( + dataSetTest: vtkMultiBlockDataSet, + attributeName: str, + onpoints: bool, + expected: tuple[ str, ...], +) -> None: + """Test getting the component names of an attribute from a multiblock.""" + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + obtained: tuple[ str, ...] = vtkHelpers.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, + onpoints ) + assert obtained == expected + + +@pytest.mark.parametrize( "attributeNames, expected_columns", [ + ( ( "CellAttribute1", ), ( "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), + ( ( + "CellAttribute1", + "CellAttribute2", + ), ( "CellAttribute2", "CellAttribute1_0", "CellAttribute1_1", "CellAttribute1_2" ) ), +] ) +def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames: Tuple[ str, ...], + expected_columns: Tuple[ str, ...] ) -> None: + """Test getting an attribute from a polydata as a dataframe.""" + polydataset: vtkPolyData = dataSetTest( "polydata" ) + data: pd.DataFrame = vtkHelpers.getAttributeValuesAsDF( polydataset, attributeNames ) + + obtained_columns = data.columns.values.tolist() + assert obtained_columns == list( expected_columns ) diff --git a/geos-posp/src/PVplugins/PVAttributeMapping.py b/geos-posp/src/PVplugins/PVAttributeMapping.py index 7f37332f0..5fd6dcfec 100644 --- a/geos-posp/src/PVplugins/PVAttributeMapping.py +++ b/geos-posp/src/PVplugins/PVAttributeMapping.py @@ -18,11 +18,13 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.AttributeMappingFromCellCoords import ( AttributeMappingFromCellCoords, ) -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( fillPartialAttributes, + mergeBlocks +) +from geos.mesh.utils.helpers import ( getAttributeSet, getNumberOfComponents, - mergeBlocks, ) from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) diff --git a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py index f9de80b0c..2b2f4f597 100644 --- a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py +++ b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py @@ -19,11 +19,11 @@ import vtkmodules.util.numpy_support as vnp from geos.utils.Logger import Logger, getLogger -from geos.mesh.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos.mesh.vtkUtils import isAttributeInObject +from geos.mesh.utils.helpers import isAttributeInObject from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py index 87bad7add..9d0d60ccb 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py @@ -24,7 +24,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py index 176dd32f5..cb86d8b89 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py @@ -25,7 +25,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py index ba043b272..452db15b5 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py @@ -25,7 +25,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py index fde9c5555..a81db2495 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py @@ -28,7 +28,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py index fba10a808..9a3880fbb 100644 --- a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py +++ b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py @@ -16,7 +16,7 @@ import PVplugins # noqa: F401 from geos.utils.Logger import Logger, getLogger -from geos.mesh.vtkUtils import mergeBlocks +from geos.mesh.utils.filters import mergeBlocks from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVMohrCirclePlot.py b/geos-posp/src/PVplugins/PVMohrCirclePlot.py index 5049ba692..3c6e4888f 100644 --- a/geos-posp/src/PVplugins/PVMohrCirclePlot.py +++ b/geos-posp/src/PVplugins/PVMohrCirclePlot.py @@ -43,7 +43,8 @@ DEFAULT_FRICTION_ANGLE_RAD, DEFAULT_ROCK_COHESION, ) -from geos.mesh.vtkUtils import getArrayInObject, mergeBlocks +from geos.mesh.utils.helpers import getArrayInObject +from geos.mesh.utils.filters import mergeBlocks from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) from geos_posp.visu.PVUtils.DisplayOrganizationParaview import ( diff --git a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py index d6e05b491..f5330fe7b 100644 --- a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py +++ b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py @@ -21,7 +21,7 @@ DEFAULT_ROCK_COHESION, ) from geos_posp.filters.SurfaceGeomechanics import SurfaceGeomechanics -from geos.mesh.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py index d42519909..d7e04b5e0 100644 --- a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py @@ -17,11 +17,12 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.TransferAttributesVolumeSurface import ( TransferAttributesVolumeSurface, ) -from geos.mesh.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos.mesh.vtkUtils import getAttributeSet, mergeBlocks +from geos.mesh.utils.helpers import getAttributeSet +from geos.mesh.utils.filters import mergeBlocks from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) from geos_posp.visu.PVUtils.paraviewTreatments import getArrayChoices diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py index 296ac6b1b..e737620f7 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py @@ -22,9 +22,12 @@ vtkUnstructuredGrid, ) -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.filters import ( computeCellCenterCoordinates, createEmptyAttribute, +) + +from geos.mesh.utils.helpers import ( getVtkArrayInObject, ) diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py index 967046ce7..a530d5ae4 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py @@ -10,7 +10,8 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid -from geos.mesh.vtkUtils import createAttribute, getArrayInObject +from geos.mesh.utils.filters import createAttribute +from geos.mesh.utils.helpers import getArrayInObject __doc__ = """ AttributeMappingFromCellId module is a vtk filter that transfer a attribute from a diff --git a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py index 208b98462..aeb617703 100644 --- a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py +++ b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py @@ -30,9 +30,8 @@ vtkUnstructuredGrid, ) from vtkmodules.vtkFiltersCore import vtkCellCenters - -from geos.mesh.vtkUtils import ( - createAttribute, +from geos.mesh.utils.filters import createAttribute +from geos.mesh.utils.helpers import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py index bfd2f57f7..cffc22ea3 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py @@ -11,9 +11,9 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet -from geos.mesh.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockIndexFromName, ) -from geos.mesh.vtkUtils import extractBlock +from geos.mesh.utils.filters import extractBlock __doc__ = """ GeosBlockExtractor module is a vtk filter that allows to extract Volume mesh, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py index 8250163be..0b8a421ab 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py @@ -33,13 +33,13 @@ from vtkmodules.vtkFiltersGeometry import vtkDataSetSurfaceFilter from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane -from geos.mesh.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getElementaryCompositeBlockIndexes, ) -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.helpers import getAttributeSet +from geos.mesh.utils.filters import ( createConstantAttribute, extractBlock, fillAllPartialAttributes, - getAttributeSet, mergeBlocks, ) diff --git a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py index c2c47b8bc..01e8d4347 100644 --- a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py +++ b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py @@ -33,8 +33,8 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) -from geos.mesh.vtkUtils import ( - createAttribute, +from geos.mesh.utils.filters import createAttribute +from geos.mesh.utils.helpers import ( getArrayInObject, getAttributeSet, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py index 5572a3456..4d3632773 100644 --- a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py +++ b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py @@ -19,7 +19,7 @@ from vtkmodules.vtkCommonDataModel import vtkPolyData, vtkUnstructuredGrid from geos_posp.filters.VolumeSurfaceMeshMapper import VolumeSurfaceMeshMapper -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.helpers import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py index 06b2826ad..8ae1828f4 100644 --- a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py +++ b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py @@ -13,7 +13,8 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) -import geos.mesh.vtkUtils as vtkUtils +import geos.mesh.utils.filters as vtkFilters +import geos.mesh.utils.helpers as vtkHelpers __doc__ = r""" This module contains utilities to process meshes using pyvista. @@ -61,14 +62,14 @@ def loadDataSet( assert mergedMesh is not None, "Merged mesh is undefined." # extract data - surface = vtkUtils.extractSurfaceFromElevation( mergedMesh, elevation ) + surface = vtkFilters.extractSurfaceFromElevation( mergedMesh, elevation ) # transfer point data to cell center - surface = cast( vtkPolyData, vtkUtils.transferPointDataToCellData( surface ) ) - timeToPropertyMap[ str( time ) ] = vtkUtils.getAttributeValuesAsDF( surface, properties ) + surface = cast( vtkPolyData, vtkFilters.transferPointDataToCellData( surface ) ) + timeToPropertyMap[ str( time ) ] = vtkHelpers.getAttributeValuesAsDF( surface, properties ) # get cell center coordinates assert surface is not None, "Surface are undefined." - pointsCoords: vtkDataArray = vtkUtils.computeCellCenterCoordinates( surface ) + pointsCoords: vtkDataArray = vtkFilters.computeCellCenterCoordinates( surface ) assert pointsCoords is not None, "Cell center are undefined." pointsCoordsNp: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( pointsCoords ) return ( timeToPropertyMap, pointsCoordsNp ) diff --git a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py index 220229150..551075d4e 100644 --- a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py +++ b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py @@ -32,7 +32,7 @@ vtkUnstructuredGrid, ) -from geos.mesh.vtkUtils import ( +from geos.mesh.utils.helpers import ( getArrayInObject, isAttributeInObject, ) diff --git a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py index 5de6f2ec5..cb45e299a 100644 --- a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py +++ b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py @@ -20,8 +20,8 @@ from vtkmodules.vtkCommonDataModel import vtkCellLocator, vtkFieldData, vtkImageData, vtkPointData, vtkPointSet from vtkmodules.vtkFiltersCore import vtkExtractCells, vtkResampleWithDataSet from vtkmodules.vtkFiltersExtraction import vtkExtractGrid -from geos.mesh.vtk.helpers import getCopyNumpyArrayByName, getNumpyGlobalIdsArray, getNumpyArrayByName -from geos.mesh.vtk.io import VtkOutput, read_mesh, write_mesh +from geos.mesh.utils.helpers import getCopyNumpyArrayByName, getNumpyGlobalIdsArray, getNumpyArrayByName +from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh from geos.pygeos_tools.model.pyevtk_tools import cGlobalIds from geos.utils.errors_handling.classes import required_attributes From 8614befa9db5248e0e4f1edd54ecedb15b037740 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 12 May 2025 14:44:47 +0200 Subject: [PATCH 38/57] Updating documentation --- docs/geos-mesh.rst | 348 +----------------------------- docs/geos_mesh_docs/converter.rst | 52 +++++ docs/geos_mesh_docs/doctor.rst | 284 ++++++++++++++++++++++++ docs/geos_mesh_docs/home.rst | 4 + docs/geos_mesh_docs/io.rst | 10 + docs/geos_mesh_docs/modules.rst | 14 ++ docs/geos_mesh_docs/utils.rst | 35 +++ 7 files changed, 405 insertions(+), 342 deletions(-) create mode 100644 docs/geos_mesh_docs/converter.rst create mode 100644 docs/geos_mesh_docs/doctor.rst create mode 100644 docs/geos_mesh_docs/home.rst create mode 100644 docs/geos_mesh_docs/io.rst create mode 100644 docs/geos_mesh_docs/modules.rst create mode 100644 docs/geos_mesh_docs/utils.rst diff --git a/docs/geos-mesh.rst b/docs/geos-mesh.rst index 82b855197..81d822050 100644 --- a/docs/geos-mesh.rst +++ b/docs/geos-mesh.rst @@ -1,346 +1,10 @@ - -GEOS Mesh Tools +GEOS Mesh tools ==================== +.. toctree:: + :maxdepth: 5 + :caption: Contents: -Mesh Doctor ---------------- - -``mesh-doctor`` is a ``python`` executable that can be used through the command line to perform various checks, validations, and tiny fixes to the ``vtk`` mesh that are meant to be used in ``geos``. -``mesh-doctor`` is organized as a collection of modules with their dedicated sets of options. -The current page will introduce those modules, but the details and all the arguments can be retrieved by using the ``--help`` option for each module. - -Modules -^^^^^^^ - -To list all the modules available through ``mesh-doctor``, you can simply use the ``--help`` option, which will list all available modules as well as a quick summary. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py --help - usage: mesh_doctor.py [-h] [-v] [-q] -i VTK_MESH_FILE - {collocated_nodes,element_volumes,fix_elements_orderings,generate_cube,generate_fractures,generate_global_ids,non_conformal,self_intersecting_elements,supported_elements} - ... - - Inspects meshes for GEOSX. - - positional arguments: - {collocated_nodes,element_volumes,fix_elements_orderings,generate_cube,generate_fractures,generate_global_ids,non_conformal,self_intersecting_elements,supported_elements} - Modules - collocated_nodes - Checks if nodes are collocated. - element_volumes - Checks if the volumes of the elements are greater than "min". - fix_elements_orderings - Reorders the support nodes for the given cell types. - generate_cube - Generate a cube and its fields. - generate_fractures - Splits the mesh to generate the faults and fractures. [EXPERIMENTAL] - generate_global_ids - Adds globals ids for points and cells. - non_conformal - Detects non conformal elements. [EXPERIMENTAL] - self_intersecting_elements - Checks if the faces of the elements are self intersecting. - supported_elements - Check that all the elements of the mesh are supported by GEOSX. - - options: - -h, --help - show this help message and exit - -v Use -v 'INFO', -vv for 'DEBUG'. Defaults to 'WARNING'. - -q Use -q to reduce the verbosity of the output. - -i VTK_MESH_FILE, --vtk-input-file VTK_MESH_FILE - - Note that checks are dynamically loaded. - An option may be missing because of an unloaded module. - Increase verbosity (-v, -vv) to get full information. - -Then, if you are interested in a specific module, you can ask for its documentation using the ``mesh-doctor module_name --help`` pattern. -For example - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py collocated_nodes --help - usage: mesh_doctor.py collocated_nodes [-h] --tolerance TOLERANCE - - options: - -h, --help show this help message and exit - --tolerance TOLERANCE [float]: The absolute distance between two nodes for them to be considered collocated. - -``mesh-doctor`` loads its module dynamically. -If a module can't be loaded, ``mesh-doctor`` will proceed and try to load other modules. -If you see a message like - -.. code-block:: bash - - [1970-04-14 03:07:15,625][WARNING] Could not load module "collocated_nodes": No module named 'vtkmodules' - -then most likely ``mesh-doctor`` could not load the ``collocated_nodes`` module, because the ``vtk`` python package was not found. -Thereafter, the documentation for module ``collocated_nodes`` will not be displayed. -You can solve this issue by installing the dependencies of ``mesh-doctor`` defined in its ``requirements.txt`` file (``python -m pip install -r requirements.txt``). - -Here is a list and brief description of all the modules available. - -``collocated_nodes`` -"""""""""""""""""""" - -Displays the neighboring nodes that are closer to each other than a prescribed threshold. -It is not uncommon to define multiple nodes for the exact same position, which will typically be an issue for ``geos`` and should be fixed. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py collocated_nodes --help - usage: mesh_doctor.py collocated_nodes [-h] --tolerance TOLERANCE - - options: - -h, --help show this help message and exit - --tolerance TOLERANCE [float]: The absolute distance between two nodes for them to be considered collocated. - -``element_volumes`` -""""""""""""""""""" - -Computes the volumes of all the cells and displays the ones that are below a prescribed threshold. -Cells with negative volumes will typically be an issue for ``geos`` and should be fixed. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py element_volumes --help - usage: mesh_doctor.py element_volumes [-h] --min 0.0 - - options: - -h, --help show this help message and exit - --min 0.0 [float]: The minimum acceptable volume. Defaults to 0.0. - -``fix_elements_orderings`` -"""""""""""""""""""""""""" - -It sometimes happens that an exported mesh does not abide by the ``vtk`` orderings. -The ``fix_elements_orderings`` module can rearrange the nodes of given types of elements. -This can be convenient if you cannot regenerate the mesh. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py fix_elements_orderings --help - usage: mesh_doctor.py fix_elements_orderings [-h] [--Hexahedron 1,6,5,4,7,0,2,3] [--Prism5 8,2,0,7,6,9,5,1,4,3] - [--Prism6 11,2,8,10,5,0,9,7,6,1,4,3] [--Pyramid 3,4,0,2,1] - [--Tetrahedron 2,0,3,1] [--Voxel 1,6,5,4,7,0,2,3] - [--Wedge 3,5,4,0,2,1] --output OUTPUT [--data-mode binary, ascii] - - options: - -h, --help show this help message and exit - --Hexahedron 1,6,5,4,7,0,2,3 - [list of integers]: node permutation for "Hexahedron". - --Prism5 8,2,0,7,6,9,5,1,4,3 - [list of integers]: node permutation for "Prism5". - --Prism6 11,2,8,10,5,0,9,7,6,1,4,3 - [list of integers]: node permutation for "Prism6". - --Pyramid 3,4,0,2,1 [list of integers]: node permutation for "Pyramid". - --Tetrahedron 2,0,3,1 [list of integers]: node permutation for "Tetrahedron". - --Voxel 1,6,5,4,7,0,2,3 [list of integers]: node permutation for "Voxel". - --Wedge 3,5,4,0,2,1 [list of integers]: node permutation for "Wedge". - --output OUTPUT [string]: The vtk output file destination. - --data-mode binary, ascii - [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. - -``generate_cube`` -""""""""""""""""" - -This module conveniently generates cubic meshes in ``vtk``. -It can also generate fields with simple values. -This tool can also be useful to generate a trial mesh that will later be refined or customized. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py generate_cube --help - usage: mesh_doctor.py generate_cube [-h] [--x 0:1.5:3] [--y 0:5:10] [--z 0:1] [--nx 2:2] [--ny 1:1] [--nz 4] - [--fields name:support:dim [name:support:dim ...]] [--cells] [--no-cells] - [--points] [--no-points] --output OUTPUT [--data-mode binary, ascii] - - options: - -h, --help show this help message and exit - --x 0:1.5:3 [list of floats]: X coordinates of the points. - --y 0:5:10 [list of floats]: Y coordinates of the points. - --z 0:1 [list of floats]: Z coordinates of the points. - --nx 2:2 [list of integers]: Number of elements in the X direction. - --ny 1:1 [list of integers]: Number of elements in the Y direction. - --nz 4 [list of integers]: Number of elements in the Z direction. - --fields name:support:dim - [name:support:dim ...]: Create fields on CELLS or POINTS, with given dimension (typically 1 or 3). - --cells [bool]: Generate global ids for cells. Defaults to true. - --no-cells [bool]: Don't generate global ids for cells. - --points [bool]: Generate global ids for points. Defaults to true. - --no-points [bool]: Don't generate global ids for points. - --output OUTPUT [string]: The vtk output file destination. - --data-mode binary, ascii - [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. - -``generate_fractures`` -"""""""""""""""""""""" - -For a conformal fracture to be defined in a mesh, ``geos`` requires the mesh to be split at the faces where the fracture gets across the mesh. -The ``generate_fractures`` module will split the mesh and generate the multi-block ``vtk`` files. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py generate_fractures --help - usage: mesh_doctor.py generate_fractures [-h] --policy field, internal_surfaces [--name NAME] [--values VALUES] --output OUTPUT - [--data-mode binary, ascii] [--fractures_output_dir FRACTURES_OUTPUT_DIR] - - options: - -h, --help show this help message and exit - --policy field, internal_surfaces - [string]: The criterion to define the surfaces that will be changed into fracture zones. Possible values are "field, internal_surfaces" - --name NAME [string]: If the "field" policy is selected, defines which field will be considered to define the fractures. - If the "internal_surfaces" policy is selected, defines the name of the attribute will be considered to identify the fractures. - --values VALUES [list of comma separated integers]: If the "field" policy is selected, which changes of the field will be considered as a fracture. - If the "internal_surfaces" policy is selected, list of the fracture attributes. - You can create multiple fractures by separating the values with ':' like shown in this example. - --values 10,12:13,14,16,18:22 will create 3 fractures identified respectively with the values (10,12), (13,14,16,18) and (22). - If no ':' is found, all values specified will be assumed to create only 1 single fracture. - --output OUTPUT [string]: The vtk output file destination. - --data-mode binary, ascii - [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. - --fractures_output_dir FRACTURES_OUTPUT_DIR - [string]: The output directory for the fractures meshes that will be generated from the mesh. - --fractures_data_mode FRACTURES_DATA_MODE - [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. - -``generate_global_ids`` -""""""""""""""""""""""" - -When running ``geos`` in parallel, `global ids` can be used to refer to data across multiple ranks. -The ``generate_global_ids`` can generate `global ids` for the imported ``vtk`` mesh. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py generate_global_ids --help - usage: mesh_doctor.py generate_global_ids [-h] [--cells] [--no-cells] [--points] [--no-points] --output OUTPUT - [--data-mode binary, ascii] - - options: - -h, --help show this help message and exit - --cells [bool]: Generate global ids for cells. Defaults to true. - --no-cells [bool]: Don't generate global ids for cells. - --points [bool]: Generate global ids for points. Defaults to true. - --no-points [bool]: Don't generate global ids for points. - --output OUTPUT [string]: The vtk output file destination. - --data-mode binary, ascii - [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. - -``non_conformal`` -""""""""""""""""" - -This module will detect elements which are close enough (there's a user defined threshold) but which are not in front of each other (another threshold can be defined). -`Close enough` can be defined in terms or proximity of the nodes and faces of the elements. -The angle between two faces can also be precribed. -This module can be a bit time consuming. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py non_conformal --help - usage: mesh_doctor.py non_conformal [-h] [--angle_tolerance 10.0] [--point_tolerance POINT_TOLERANCE] - [--face_tolerance FACE_TOLERANCE] - - options: - -h, --help show this help message and exit - --angle_tolerance 10.0 [float]: angle tolerance in degrees. Defaults to 10.0 - --point_tolerance POINT_TOLERANCE - [float]: tolerance for two points to be considered collocated. - --face_tolerance FACE_TOLERANCE - [float]: tolerance for two faces to be considered "touching". - -``self_intersecting_elements`` -"""""""""""""""""""""""""""""" - -Some meshes can have cells that auto-intersect. -This module will display the elements that have faces intersecting. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py self_intersecting_elements --help - usage: mesh_doctor.py self_intersecting_elements [-h] [--min 2.220446049250313e-16] - - options: - -h, --help show this help message and exit - --min 2.220446049250313e-16 - [float]: The tolerance in the computation. Defaults to your machine precision 2.220446049250313e-16. - -``supported_elements`` -"""""""""""""""""""""" - -``geos`` supports a specific set of elements. -Let's cite the standard elements like `tetrahedra`, `wedges`, `pyramids` or `hexahedra`. -But also prismes up to 11 faces. -``geos`` also supports the generic ``VTK_POLYHEDRON``/``42`` elements, which are converted on the fly into one of the elements just described. - -The ``supported_elements`` check will validate that no unsupported element is included in the input mesh. -It will also verify that the ``VTK_POLYHEDRON`` cells can effectively get converted into a supported type of element. - -.. code-block:: - - $ python src/geos/mesh/doctor/mesh_doctor.py supported_elements --help - usage: mesh_doctor.py supported_elements [-h] [--chunck_size 1] [--nproc 8] - - options: - -h, --help show this help message and exit - --chunck_size 1 [int]: Defaults chunk size for parallel processing to 1 - --nproc 8 [int]: Number of threads used for parallel processing. Defaults to your CPU count 8. - - - -Mesh Conversion --------------------------- - -The `geos-mesh` python package includes tools for converting meshes from common formats (abaqus, etc.) to those that can be read by GEOS (gmsh, vtk). -See :ref:`PythonToolsSetup` for details on setup instructions, and `External Mesh Guidelines `_ for a detailed description of how to use external meshes in GEOS. -The available console scripts for this package and its API are described below. - - -convert_abaqus -^^^^^^^^^^^^^^ - -Compile an xml file with advanced features into a single file that can be read by GEOS. - -.. argparse:: - :module: geos.mesh.conversion.main - :func: build_abaqus_converter_input_parser - :prog: convert_abaqus - - -.. note:: - For vtk format meshes, the user also needs to determine the region ID numbers and names of nodesets to import into GEOS. - The following shows how these could look in an input XML file for a mesh with three regions (*REGIONA*, *REGIONB*, and *REGIONC*) and six nodesets (*xneg*, *xpos*, *yneg*, *ypos*, *zneg*, and *zpos*): - - -.. code-block:: xml - - - - - - - - - - - - -API -^^^ - -.. automodule:: geos.mesh.conversion.abaqus_converter - :members: - - - + ./geos_mesh_docs/home.rst + ./geos_mesh_docs/modules.rst \ No newline at end of file diff --git a/docs/geos_mesh_docs/converter.rst b/docs/geos_mesh_docs/converter.rst new file mode 100644 index 000000000..2b640bb07 --- /dev/null +++ b/docs/geos_mesh_docs/converter.rst @@ -0,0 +1,52 @@ +Mesh Conversion +-------------------------- + +The `geos-mesh` python package includes tools for converting meshes from common formats (abaqus, etc.) to those that can be read by GEOS (gmsh, vtk). +See :ref:`PythonToolsSetup` for details on setup instructions, and `External Mesh Guidelines `_ for a detailed description of how to use external meshes in GEOS. +The available console scripts for this package and its API are described below. + + +convert_abaqus +^^^^^^^^^^^^^^ + +Compile an xml file with advanced features into a single file that can be read by GEOS. + +.. argparse:: + :module: geos.mesh.conversion.main + :func: build_abaqus_converter_input_parser + :prog: convert_abaqus + + +.. note:: + For vtk format meshes, the user also needs to determine the region ID numbers and names of nodesets to import into GEOS. + The following shows how these could look in an input XML file for a mesh with three regions (*REGIONA*, *REGIONB*, and *REGIONC*) and six nodesets (*xneg*, *xpos*, *yneg*, *ypos*, *zneg*, and *zpos*): + + +.. code-block:: xml + + + + + + + + + + + + +API +^^^ + +.. automodule:: geos.mesh.conversion.abaqus_converter + :members: + + diff --git a/docs/geos_mesh_docs/doctor.rst b/docs/geos_mesh_docs/doctor.rst new file mode 100644 index 000000000..0da26c1ed --- /dev/null +++ b/docs/geos_mesh_docs/doctor.rst @@ -0,0 +1,284 @@ +Mesh Doctor +--------------- + +``mesh-doctor`` is a ``python`` executable that can be used through the command line to perform various checks, validations, and tiny fixes to the ``vtk`` mesh that are meant to be used in ``geos``. +``mesh-doctor`` is organized as a collection of modules with their dedicated sets of options. +The current page will introduce those modules, but the details and all the arguments can be retrieved by using the ``--help`` option for each module. + +Modules +^^^^^^^ + +To list all the modules available through ``mesh-doctor``, you can simply use the ``--help`` option, which will list all available modules as well as a quick summary. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py --help + usage: mesh_doctor.py [-h] [-v] [-q] -i VTK_MESH_FILE + {collocated_nodes,element_volumes,fix_elements_orderings,generate_cube,generate_fractures,generate_global_ids,non_conformal,self_intersecting_elements,supported_elements} + ... + + Inspects meshes for GEOSX. + + positional arguments: + {collocated_nodes,element_volumes,fix_elements_orderings,generate_cube,generate_fractures,generate_global_ids,non_conformal,self_intersecting_elements,supported_elements} + Modules + collocated_nodes + Checks if nodes are collocated. + element_volumes + Checks if the volumes of the elements are greater than "min". + fix_elements_orderings + Reorders the support nodes for the given cell types. + generate_cube + Generate a cube and its fields. + generate_fractures + Splits the mesh to generate the faults and fractures. [EXPERIMENTAL] + generate_global_ids + Adds globals ids for points and cells. + non_conformal + Detects non conformal elements. [EXPERIMENTAL] + self_intersecting_elements + Checks if the faces of the elements are self intersecting. + supported_elements + Check that all the elements of the mesh are supported by GEOSX. + + options: + -h, --help + show this help message and exit + -v Use -v 'INFO', -vv for 'DEBUG'. Defaults to 'WARNING'. + -q Use -q to reduce the verbosity of the output. + -i VTK_MESH_FILE, --vtk-input-file VTK_MESH_FILE + + Note that checks are dynamically loaded. + An option may be missing because of an unloaded module. + Increase verbosity (-v, -vv) to get full information. + +Then, if you are interested in a specific module, you can ask for its documentation using the ``mesh-doctor module_name --help`` pattern. +For example + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py collocated_nodes --help + usage: mesh_doctor.py collocated_nodes [-h] --tolerance TOLERANCE + + options: + -h, --help show this help message and exit + --tolerance TOLERANCE [float]: The absolute distance between two nodes for them to be considered collocated. + +``mesh-doctor`` loads its module dynamically. +If a module can't be loaded, ``mesh-doctor`` will proceed and try to load other modules. +If you see a message like + +.. code-block:: bash + + [1970-04-14 03:07:15,625][WARNING] Could not load module "collocated_nodes": No module named 'vtkmodules' + +then most likely ``mesh-doctor`` could not load the ``collocated_nodes`` module, because the ``vtk`` python package was not found. +Thereafter, the documentation for module ``collocated_nodes`` will not be displayed. +You can solve this issue by installing the dependencies of ``mesh-doctor`` defined in its ``requirements.txt`` file (``python -m pip install -r requirements.txt``). + +Here is a list and brief description of all the modules available. + +``collocated_nodes`` +"""""""""""""""""""" + +Displays the neighboring nodes that are closer to each other than a prescribed threshold. +It is not uncommon to define multiple nodes for the exact same position, which will typically be an issue for ``geos`` and should be fixed. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py collocated_nodes --help + usage: mesh_doctor.py collocated_nodes [-h] --tolerance TOLERANCE + + options: + -h, --help show this help message and exit + --tolerance TOLERANCE [float]: The absolute distance between two nodes for them to be considered collocated. + +``element_volumes`` +""""""""""""""""""" + +Computes the volumes of all the cells and displays the ones that are below a prescribed threshold. +Cells with negative volumes will typically be an issue for ``geos`` and should be fixed. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py element_volumes --help + usage: mesh_doctor.py element_volumes [-h] --min 0.0 + + options: + -h, --help show this help message and exit + --min 0.0 [float]: The minimum acceptable volume. Defaults to 0.0. + +``fix_elements_orderings`` +"""""""""""""""""""""""""" + +It sometimes happens that an exported mesh does not abide by the ``vtk`` orderings. +The ``fix_elements_orderings`` module can rearrange the nodes of given types of elements. +This can be convenient if you cannot regenerate the mesh. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py fix_elements_orderings --help + usage: mesh_doctor.py fix_elements_orderings [-h] [--Hexahedron 1,6,5,4,7,0,2,3] [--Prism5 8,2,0,7,6,9,5,1,4,3] + [--Prism6 11,2,8,10,5,0,9,7,6,1,4,3] [--Pyramid 3,4,0,2,1] + [--Tetrahedron 2,0,3,1] [--Voxel 1,6,5,4,7,0,2,3] + [--Wedge 3,5,4,0,2,1] --output OUTPUT [--data-mode binary, ascii] + + options: + -h, --help show this help message and exit + --Hexahedron 1,6,5,4,7,0,2,3 + [list of integers]: node permutation for "Hexahedron". + --Prism5 8,2,0,7,6,9,5,1,4,3 + [list of integers]: node permutation for "Prism5". + --Prism6 11,2,8,10,5,0,9,7,6,1,4,3 + [list of integers]: node permutation for "Prism6". + --Pyramid 3,4,0,2,1 [list of integers]: node permutation for "Pyramid". + --Tetrahedron 2,0,3,1 [list of integers]: node permutation for "Tetrahedron". + --Voxel 1,6,5,4,7,0,2,3 [list of integers]: node permutation for "Voxel". + --Wedge 3,5,4,0,2,1 [list of integers]: node permutation for "Wedge". + --output OUTPUT [string]: The vtk output file destination. + --data-mode binary, ascii + [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. + +``generate_cube`` +""""""""""""""""" + +This module conveniently generates cubic meshes in ``vtk``. +It can also generate fields with simple values. +This tool can also be useful to generate a trial mesh that will later be refined or customized. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py generate_cube --help + usage: mesh_doctor.py generate_cube [-h] [--x 0:1.5:3] [--y 0:5:10] [--z 0:1] [--nx 2:2] [--ny 1:1] [--nz 4] + [--fields name:support:dim [name:support:dim ...]] [--cells] [--no-cells] + [--points] [--no-points] --output OUTPUT [--data-mode binary, ascii] + + options: + -h, --help show this help message and exit + --x 0:1.5:3 [list of floats]: X coordinates of the points. + --y 0:5:10 [list of floats]: Y coordinates of the points. + --z 0:1 [list of floats]: Z coordinates of the points. + --nx 2:2 [list of integers]: Number of elements in the X direction. + --ny 1:1 [list of integers]: Number of elements in the Y direction. + --nz 4 [list of integers]: Number of elements in the Z direction. + --fields name:support:dim + [name:support:dim ...]: Create fields on CELLS or POINTS, with given dimension (typically 1 or 3). + --cells [bool]: Generate global ids for cells. Defaults to true. + --no-cells [bool]: Don't generate global ids for cells. + --points [bool]: Generate global ids for points. Defaults to true. + --no-points [bool]: Don't generate global ids for points. + --output OUTPUT [string]: The vtk output file destination. + --data-mode binary, ascii + [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. + +``generate_fractures`` +"""""""""""""""""""""" + +For a conformal fracture to be defined in a mesh, ``geos`` requires the mesh to be split at the faces where the fracture gets across the mesh. +The ``generate_fractures`` module will split the mesh and generate the multi-block ``vtk`` files. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py generate_fractures --help + usage: mesh_doctor.py generate_fractures [-h] --policy field, internal_surfaces [--name NAME] [--values VALUES] --output OUTPUT + [--data-mode binary, ascii] [--fractures_output_dir FRACTURES_OUTPUT_DIR] + + options: + -h, --help show this help message and exit + --policy field, internal_surfaces + [string]: The criterion to define the surfaces that will be changed into fracture zones. Possible values are "field, internal_surfaces" + --name NAME [string]: If the "field" policy is selected, defines which field will be considered to define the fractures. + If the "internal_surfaces" policy is selected, defines the name of the attribute will be considered to identify the fractures. + --values VALUES [list of comma separated integers]: If the "field" policy is selected, which changes of the field will be considered as a fracture. + If the "internal_surfaces" policy is selected, list of the fracture attributes. + You can create multiple fractures by separating the values with ':' like shown in this example. + --values 10,12:13,14,16,18:22 will create 3 fractures identified respectively with the values (10,12), (13,14,16,18) and (22). + If no ':' is found, all values specified will be assumed to create only 1 single fracture. + --output OUTPUT [string]: The vtk output file destination. + --data-mode binary, ascii + [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. + --fractures_output_dir FRACTURES_OUTPUT_DIR + [string]: The output directory for the fractures meshes that will be generated from the mesh. + --fractures_data_mode FRACTURES_DATA_MODE + [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. + +``generate_global_ids`` +""""""""""""""""""""""" + +When running ``geos`` in parallel, `global ids` can be used to refer to data across multiple ranks. +The ``generate_global_ids`` can generate `global ids` for the imported ``vtk`` mesh. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py generate_global_ids --help + usage: mesh_doctor.py generate_global_ids [-h] [--cells] [--no-cells] [--points] [--no-points] --output OUTPUT + [--data-mode binary, ascii] + + options: + -h, --help show this help message and exit + --cells [bool]: Generate global ids for cells. Defaults to true. + --no-cells [bool]: Don't generate global ids for cells. + --points [bool]: Generate global ids for points. Defaults to true. + --no-points [bool]: Don't generate global ids for points. + --output OUTPUT [string]: The vtk output file destination. + --data-mode binary, ascii + [string]: For ".vtu" output format, the data mode can be binary or ascii. Defaults to binary. + +``non_conformal`` +""""""""""""""""" + +This module will detect elements which are close enough (there's a user defined threshold) but which are not in front of each other (another threshold can be defined). +`Close enough` can be defined in terms or proximity of the nodes and faces of the elements. +The angle between two faces can also be precribed. +This module can be a bit time consuming. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py non_conformal --help + usage: mesh_doctor.py non_conformal [-h] [--angle_tolerance 10.0] [--point_tolerance POINT_TOLERANCE] + [--face_tolerance FACE_TOLERANCE] + + options: + -h, --help show this help message and exit + --angle_tolerance 10.0 [float]: angle tolerance in degrees. Defaults to 10.0 + --point_tolerance POINT_TOLERANCE + [float]: tolerance for two points to be considered collocated. + --face_tolerance FACE_TOLERANCE + [float]: tolerance for two faces to be considered "touching". + +``self_intersecting_elements`` +"""""""""""""""""""""""""""""" + +Some meshes can have cells that auto-intersect. +This module will display the elements that have faces intersecting. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py self_intersecting_elements --help + usage: mesh_doctor.py self_intersecting_elements [-h] [--min 2.220446049250313e-16] + + options: + -h, --help show this help message and exit + --min 2.220446049250313e-16 + [float]: The tolerance in the computation. Defaults to your machine precision 2.220446049250313e-16. + +``supported_elements`` +"""""""""""""""""""""" + +``geos`` supports a specific set of elements. +Let's cite the standard elements like `tetrahedra`, `wedges`, `pyramids` or `hexahedra`. +But also prismes up to 11 faces. +``geos`` also supports the generic ``VTK_POLYHEDRON``/``42`` elements, which are converted on the fly into one of the elements just described. + +The ``supported_elements`` check will validate that no unsupported element is included in the input mesh. +It will also verify that the ``VTK_POLYHEDRON`` cells can effectively get converted into a supported type of element. + +.. code-block:: + + $ python src/geos/mesh/doctor/mesh_doctor.py supported_elements --help + usage: mesh_doctor.py supported_elements [-h] [--chunck_size 1] [--nproc 8] + + options: + -h, --help show this help message and exit + --chunck_size 1 [int]: Defaults chunk size for parallel processing to 1 + --nproc 8 [int]: Number of threads used for parallel processing. Defaults to your CPU count 8. \ No newline at end of file diff --git a/docs/geos_mesh_docs/home.rst b/docs/geos_mesh_docs/home.rst new file mode 100644 index 000000000..78cffacb1 --- /dev/null +++ b/docs/geos_mesh_docs/home.rst @@ -0,0 +1,4 @@ +Home +======== + +**geos-mesh** is a Python package that contains several tools and utilities to handle processing and quality checks of meshes. \ No newline at end of file diff --git a/docs/geos_mesh_docs/io.rst b/docs/geos_mesh_docs/io.rst new file mode 100644 index 000000000..cc98180e3 --- /dev/null +++ b/docs/geos_mesh_docs/io.rst @@ -0,0 +1,10 @@ +Input/Outputs +^^^^^^^^^^^^^^^^ + +geos.mesh.io.vtkIO module +-------------------------------------- + +.. automodule:: geos.mesh.io.vtkIO + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/geos_mesh_docs/modules.rst b/docs/geos_mesh_docs/modules.rst new file mode 100644 index 000000000..fa6a3558f --- /dev/null +++ b/docs/geos_mesh_docs/modules.rst @@ -0,0 +1,14 @@ +GEOS Mesh tools +=================== + + +.. toctree:: + :maxdepth: 5 + + doctor + + converter + + io + + utils \ No newline at end of file diff --git a/docs/geos_mesh_docs/utils.rst b/docs/geos_mesh_docs/utils.rst new file mode 100644 index 000000000..9651dfdf9 --- /dev/null +++ b/docs/geos_mesh_docs/utils.rst @@ -0,0 +1,35 @@ +Mesh utilities +^^^^^^^^^^^^^^^^ + +The `utils` module of `geos-mesh` package contains utilities and filters for VTK meshes. + + + +geos.mesh.utils.filters module +---------------------------------------- + +.. automodule:: geos.mesh.utils.filters + :members: + :undoc-members: + :show-inheritance: + + + +geos.mesh.utils.helpers module +-------------------------------------- + +.. automodule:: geos.mesh.utils.helpers + :members: + :undoc-members: + :show-inheritance: + + + +geos.mesh.utils.multiblockInspectorTreeFunctions module +--------------------------------------------------------------- + +.. automodule:: geos.mesh.utils.multiblockInspectorTreeFunctions + :members: + :undoc-members: + :show-inheritance: + From 6b7eb0937a98ae0e2a552dbc7cfbe5289acbe9e0 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 12 May 2025 15:26:59 +0200 Subject: [PATCH 39/57] Typo when refactoring --- geos-mesh/src/geos/mesh/utils/helpers.py | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/geos-mesh/src/geos/mesh/utils/helpers.py b/geos-mesh/src/geos/mesh/utils/helpers.py index be23bc22d..0b8f34289 100644 --- a/geos-mesh/src/geos/mesh/utils/helpers.py +++ b/geos-mesh/src/geos/mesh/utils/helpers.py @@ -486,6 +486,39 @@ def getComponentNamesMultiBlock( return () +def getAttributeValuesAsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFrame: + """Get attribute values from input surface. + + Args: + surface (vtkPolyData): mesh where to get attribute values + attributeNames (tuple[str,...]): tuple of attribute names to get the values. + + Returns: + pd.DataFrame: DataFrame containing property names as columns. + + """ + nbRows: int = surface.GetNumberOfCells() + data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) + for attributeName in attributeNames: + if not isAttributeInObject( surface, attributeName, False ): + print( f"WARNING: Attribute {attributeName} is not in the mesh." ) + continue + array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) + + if len( array.shape ) > 1: + for i in range( array.shape[ 1 ] ): + data[ attributeName + f"_{i}" ] = array[ :, i ] + data.drop( + columns=[ + attributeName, + ], + inplace=True, + ) + else: + data[ attributeName ] = array + return data + + def AsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFrame: """Get attribute values from input surface. From 60374be9939260ca9cac43902e9324a9ae4c1738 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 12 May 2025 16:20:10 +0200 Subject: [PATCH 40/57] Fix documentation --- docs/geos_mesh_docs/io.rst | 5 +---- docs/geos_posp_docs/modules.rst | 2 -- docs/geos_posp_docs/processing.rst | 21 --------------------- 3 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 docs/geos_posp_docs/processing.rst diff --git a/docs/geos_mesh_docs/io.rst b/docs/geos_mesh_docs/io.rst index cc98180e3..df56d1763 100644 --- a/docs/geos_mesh_docs/io.rst +++ b/docs/geos_mesh_docs/io.rst @@ -4,7 +4,4 @@ Input/Outputs geos.mesh.io.vtkIO module -------------------------------------- -.. automodule:: geos.mesh.io.vtkIO - :members: - :undoc-members: - :show-inheritance: +In progress diff --git a/docs/geos_posp_docs/modules.rst b/docs/geos_posp_docs/modules.rst index 99fcad60a..cf77644b1 100644 --- a/docs/geos_posp_docs/modules.rst +++ b/docs/geos_posp_docs/modules.rst @@ -6,6 +6,4 @@ Processing filters - processing - pyvistaTools diff --git a/docs/geos_posp_docs/processing.rst b/docs/geos_posp_docs/processing.rst deleted file mode 100644 index c3179a82a..000000000 --- a/docs/geos_posp_docs/processing.rst +++ /dev/null @@ -1,21 +0,0 @@ -Processing functions -==================== - -This package define functions to process data. - - -geos.mesh.multiblockInspectorTreeFunctions module ---------------------------------------------------------------- - -.. automodule:: geos.mesh.multiblockInspectorTreeFunctions - :members: - :undoc-members: - :show-inheritance: - -geos.mesh.vtkUtils module ----------------------------------------- - -.. automodule:: geos.mesh.vtkUtils - :members: - :undoc-members: - :show-inheritance: From 50d90c8969f9acd31bdbd9e1bc6411a1caaac0b0 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 12 May 2025 17:05:17 +0200 Subject: [PATCH 41/57] Yapf --- geos-mesh/src/geos/mesh/utils/helpers.py | 3 +-- geos-posp/src/PVplugins/PVAttributeMapping.py | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/geos-mesh/src/geos/mesh/utils/helpers.py b/geos-mesh/src/geos/mesh/utils/helpers.py index 0b8f34289..2a2f1fec2 100644 --- a/geos-mesh/src/geos/mesh/utils/helpers.py +++ b/geos-mesh/src/geos/mesh/utils/helpers.py @@ -11,8 +11,7 @@ from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkFieldData, vtkMultiBlockDataSet, vtkDataSet, vtkCompositeDataSet, vtkDataObject, vtkPointData, vtkCellData, vtkDataObjectTreeIterator, vtkPolyData ) -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, - getBlockFromFlatIndex ) +from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) def to_vtk_id_list( data ) -> vtkIdList: diff --git a/geos-posp/src/PVplugins/PVAttributeMapping.py b/geos-posp/src/PVplugins/PVAttributeMapping.py index 5fd6dcfec..d69fa15cf 100644 --- a/geos-posp/src/PVplugins/PVAttributeMapping.py +++ b/geos-posp/src/PVplugins/PVAttributeMapping.py @@ -18,10 +18,7 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.AttributeMappingFromCellCoords import ( AttributeMappingFromCellCoords, ) -from geos.mesh.utils.filters import ( - fillPartialAttributes, - mergeBlocks -) +from geos.mesh.utils.filters import ( fillPartialAttributes, mergeBlocks ) from geos.mesh.utils.helpers import ( getAttributeSet, getNumberOfComponents, From f23f8cd7afa40297821e8eef12b1040a09460e17 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Tue, 13 May 2025 10:31:03 +0200 Subject: [PATCH 42/57] Yapf again --- geos-mesh/tests/test_vtkFilters.py | 4 ++-- .../src/geos_posp/filters/AttributeMappingFromCellCoords.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/geos-mesh/tests/test_vtkFilters.py b/geos-mesh/tests/test_vtkFilters.py index 1b2aa69c0..7524fb549 100644 --- a/geos-mesh/tests/test_vtkFilters.py +++ b/geos-mesh/tests/test_vtkFilters.py @@ -12,8 +12,8 @@ import vtkmodules.util.numpy_support as vnp from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray -from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, - vtkPointData, vtkCellData, vtkUnstructuredGrid ) +from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, vtkPointData, + vtkCellData, vtkUnstructuredGrid ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py index e737620f7..8f0229092 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py @@ -28,8 +28,7 @@ ) from geos.mesh.utils.helpers import ( - getVtkArrayInObject, -) + getVtkArrayInObject, ) __doc__ = """ AttributeMappingFromCellCoords module is a vtk filter that map two identical mesh (or a mesh is From cbaf4140faf78924761e76f60f1bd3fa062c1c08 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 13 May 2025 15:58:49 +0200 Subject: [PATCH 43/57] Remove MergeColocatedPoints and replace with CellTypeCounts --- .../mesh/processing/MergeColocatedPoints.py | 184 ------------------ .../src/geos/mesh/processing/SplitMesh.py | 60 +++--- geos-mesh/src/geos/mesh/vtk/helpers.py | 4 +- geos-mesh/tests/test_MergeColocatedPoints.py | 138 ------------- .../src/PVplugins/PVMergeColocatedPoints.py | 66 ------- .../pv/utils/AbstractPVPluginVtkWrapper.py | 18 +- 6 files changed, 40 insertions(+), 430 deletions(-) delete mode 100644 geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py delete mode 100644 geos-mesh/tests/test_MergeColocatedPoints.py delete mode 100644 geos-pv/src/PVplugins/PVMergeColocatedPoints.py diff --git a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py b/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py deleted file mode 100644 index 77d57cc52..000000000 --- a/geos-mesh/src/geos/mesh/processing/MergeColocatedPoints.py +++ /dev/null @@ -1,184 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Antoine Mazuyer, Martin Lemay -import numpy as np -from typing_extensions import Self -from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase -from vtkmodules.vtkCommonCore import ( - vtkIntArray, - vtkInformation, - vtkInformationVector, - vtkPoints, - reference, - vtkIdList, -) -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkIncrementalOctreePointLocator, - vtkCellTypes, - vtkCell, -) - -__doc__ = """ -MergeColocatedPoints module is a vtk filter that merges colocated points from input mesh. - -Filter input and output types are vtkUnstructuredGrid. - -.. Warning:: This operation uses geometrical tests that may not be accurate in case of very small cells. - - -To use the filter: - -.. code-block:: python - - from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints - - # filter inputs - input :vtkUnstructuredGrid - - # instanciate the filter - filter :MergeColocatedPoints = MergeColocatedPoints() - # set input data object - filter.SetInputDataObject(input) - # do calculations - filter.Update() - # get output object - output :vtkUnstructuredGrid = filter.GetOutputDataObject(0) -""" - - -class MergeColocatedPoints( VTKPythonAlgorithmBase ): - - def __init__( self: Self ) -> None: - """MergeColocatedPoints filter merges duplacted points of the input mesh.""" - super().__init__( nInputPorts=1, nOutputPorts=1, outputType="vtkUnstructuredGrid" ) - - def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestInformation. - - Args: - port (int): input port - info (vtkInformationVector): info - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - if port == 0: - info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) - - def RequestDataObject( - self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestDataObject. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inData = self.GetInputData( inInfoVec, 0, 0 ) - outData = self.GetOutputData( outInfoVec, 0 ) - assert inData is not None - if outData is None or ( not outData.IsA( inData.GetClassName() ) ): - outData = inData.NewInstance() - outInfoVec.GetInformationObject( 0 ).Set( outData.DATA_OBJECT(), outData ) - return super().RequestDataObject( request, inInfoVec, outInfoVec ) - - def RequestData( - self: Self, - request: vtkInformation, # noqa: F841 - inInfoVec: list[ vtkInformationVector ], # noqa: F841 - outInfoVec: vtkInformationVector, - ) -> int: - """Inherited from VTKPythonAlgorithmBase::RequestData. - - Args: - request (vtkInformation): request - inInfoVec (list[vtkInformationVector]): input objects - outInfoVec (vtkInformationVector): output objects - - Returns: - int: 1 if calculation successfully ended, 0 otherwise. - """ - inData: vtkUnstructuredGrid = vtkUnstructuredGrid.GetData( inInfoVec[ 0 ] ) - output: vtkUnstructuredGrid = self.GetOutputData( outInfoVec, 0 ) - assert inData is not None, "Input mesh is undefined." - assert output is not None, "Output mesh is undefined." - vertexMap: list[ int ] = self.setMergePoints( inData, output ) - self.setCells( inData, output, vertexMap ) - return 1 - - def setMergePoints( self: Self, input: vtkUnstructuredGrid, output: vtkUnstructuredGrid ) -> list[ int ]: - """Merge duplicated points and set new points and attributes to output mesh. - - Args: - input (vtkUnstructuredGrid): input mesh - output (vtkUnstructuredGrid): output mesh - - Returns: - list[int]: list containing new point ids. - """ - vertexMap: list[ int ] = [] - newPoints: vtkPoints = vtkPoints() - # use point locator to check for colocated points - pointsLocator = vtkIncrementalOctreePointLocator() - pointsLocator.InitPointInsertion( newPoints, input.GetBounds() ) - # create an array to count the number of colocated points - vertexCount: vtkIntArray = vtkIntArray() - vertexCount.SetName( "Count" ) - ptId = reference( 0 ) - countD: int = 0 # total number of colocated points - for v in range( input.GetNumberOfPoints() ): - inserted: bool = pointsLocator.InsertUniquePoint( input.GetPoints().GetPoint( v ), ptId ) - if inserted: - vertexCount.InsertNextValue( 1 ) - else: - vertexCount.SetValue( ptId, vertexCount.GetValue( ptId ) + 1 ) - countD = countD + 1 - vertexMap += [ ptId.get() ] - - output.SetPoints( pointsLocator.GetLocatorPoints() ) - # copy point attributes - output.GetPointData().DeepCopy( input.GetPointData() ) - # add the array to points data - output.GetPointData().AddArray( vertexCount ) - return vertexMap - - def setCells( self: Self, input: vtkUnstructuredGrid, output: vtkUnstructuredGrid, vertexMap: list[ int ] ) -> bool: - """Set cell point ids and attributes to output mesh. - - Args: - input (vtkUnstructuredGrid): input mesh - output (vtkUnstructuredGrid): output mesh - vertexMap (list[int)]): list containing new point ids - - Returns: - bool: True if calculation successfully ended. - """ - nbCells: int = input.GetNumberOfCells() - nbPoints: int = output.GetNumberOfPoints() - assert np.unique( - vertexMap ).size == nbPoints, "The size of the list of point ids must be equal to the number of points." - cellTypes: vtkCellTypes = vtkCellTypes() - input.GetCellTypes( cellTypes ) - output.Allocate( nbCells ) - # create mesh cells - for cellId in range( nbCells ): - cell: vtkCell = input.GetCell( cellId ) - # create cells from point ids - cellsID: vtkIdList = vtkIdList() - for ptId in range( cell.GetNumberOfPoints() ): - ptIdOld: int = cell.GetPointId( ptId ) - ptIdNew: int = vertexMap[ ptIdOld ] - cellsID.InsertNextId( ptIdNew ) - output.InsertNextCell( cell.GetCellType(), cellsID ) - # copy cell attributes - assert output.GetNumberOfCells() == nbCells, "Output and input mesh must have the same number of cells." - output.GetCellData().DeepCopy( input.GetCellData() ) - return True diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index ea9a25bcb..87f99e68d 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -23,10 +23,16 @@ VTK_TETRA, VTK_HEXAHEDRON, VTK_PYRAMID, + VTK_WEDGE, + VTK_POLYHEDRON, + VTK_POLYGON, ) from vtkmodules.util.numpy_support import ( numpy_to_vtk, vtk_to_numpy ) +from geos.mesh.stats.CellTypeCounter import CellTypeCounter +from geos.mesh.model.CellTypeCounts import CellTypeCounts + __doc__ = """ SplitMesh module is a vtk filter that split cells of a mesh composed of Tetrahedra, pyramids, and hexahedra. @@ -64,7 +70,10 @@ def __init__( self ) -> None: self.originalId: vtkIdTypeArray self.cellTypes: list[ int ] - def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: + def FillInputPortInformation( self: Self, + port: int, + info: vtkInformation + ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. Args: @@ -124,16 +133,24 @@ def RequestData( assert output is not None, "Output mesh is undefined." nb_cells: int = self.inData.GetNumberOfCells() - nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad = self._get_cell_counts() - - self.points = vtkPoints() - self.points.DeepCopy( self.inData.GetPoints() ) + counts: CellTypeCounts = self._get_cell_counts() + nb_tet: int = counts.getTypeCount( VTK_TETRA ) + nb_pyr: int = counts.getTypeCount( VTK_PYRAMID ) + nb_hex: int = counts.getTypeCount( VTK_HEXAHEDRON ) + nb_triangles: int = counts.getTypeCount( VTK_TRIANGLE ) + nb_quad: int = counts.getTypeCount( VTK_QUAD ) + nb_polygon = counts.getTypeCount( VTK_POLYGON ) + nb_polyhedra = counts.getTypeCount( VTK_POLYHEDRON ) + assert counts.getTypeCount( VTK_WEDGE ) == 0, "Input mesh contains wedges that are not currently supported." + assert nb_polyhedra * nb_polygon > 0, "Input mesh is composed of both polygons and polyhedra, but it must contains only one of the two." nbNewPoints: int = 0 - volumeCellCounts = nb_hex + nb_tet + nb_pyr - nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 if volumeCellCounts > 0 else nb_triangles * 3 + nb_quad * 5 + nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 if nb_polyhedra > 0 else nb_triangles * 3 + nb_quad * 5 nbNewCells: int = nb_hex * 8 + nb_tet * 8 + nb_pyr * 10 * nb_triangles * 4 + nb_quad * 4 + self.points = vtkPoints() + self.points.DeepCopy( self.inData.GetPoints() ) self.points.Resize( self.inData.GetNumberOfPoints() + nbNewPoints ) + self.cells = vtkCellArray() self.cells.AllocateExact( nbNewCells, 8 ) self.originalId = vtkIdTypeArray() @@ -166,33 +183,16 @@ def RequestData( self._transferCellArrays( output ) return 1 - def _get_cell_counts( self: Self ) -> tuple[ int, int, int, int, int ]: + def _get_cell_counts( self: Self ) -> CellTypeCounts: """Get the number of cells of each type. Returns: - tuple[int, int, int, int, int]: tuple containing counts of - hexahedron, tetrahedron, pyramid, triangles, quads + CellTypeCounts: cell type counts """ - nb_cells: int = self.inData.GetNumberOfCells() - nb_hex: int = 0 - nb_tet: int = 0 - nb_pyr: int = 0 - nb_triangles: int = 0 - nb_quad: int = 0 - for c in range( nb_cells ): - cell: vtkCell = self.inData.GetCell( c ) - cellType = cell.GetCellType() - if cellType == VTK_HEXAHEDRON: - nb_hex = nb_hex + 1 - if cellType == VTK_TETRA: - nb_tet = nb_tet + 1 - if cellType == VTK_PYRAMID: - nb_pyr = nb_pyr + 1 - if cellType == VTK_TRIANGLE: - nb_triangles = nb_triangles + 1 - if cellType == VTK_QUAD: - nb_quad = nb_quad + 1 - return nb_hex, nb_tet, nb_pyr, nb_triangles, nb_quad + filter: CellTypeCounter = CellTypeCounter() + filter.SetInputDataObject( self.inData ) + filter.Update() + return filter.GetCellTypeCounts() def _addMidPoint( self: Self, ptA: int, ptB: int ) -> int: """Add a point at the center of the edge defined by input point ids. diff --git a/geos-mesh/src/geos/mesh/vtk/helpers.py b/geos-mesh/src/geos/mesh/vtk/helpers.py index 6f3cf7eb2..baced4a65 100644 --- a/geos-mesh/src/geos/mesh/vtk/helpers.py +++ b/geos-mesh/src/geos/mesh/vtk/helpers.py @@ -23,8 +23,8 @@ GLOBAL_IDS_ARRAY_NAME: str = "GlobalIds" -# TODO: copy from vtkUtils -def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: +# copy from geos-posp vtkUtils.getAttributesFromDataSet +def getArraysFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, int ]: """Get the dictionnary of all attributes of a vtkDataSet on points or cells. Args: diff --git a/geos-mesh/tests/test_MergeColocatedPoints.py b/geos-mesh/tests/test_MergeColocatedPoints.py deleted file mode 100644 index 0cedbadbc..000000000 --- a/geos-mesh/tests/test_MergeColocatedPoints.py +++ /dev/null @@ -1,138 +0,0 @@ -# SPDX-FileContributor: Martin Lemay -# SPDX-License-Identifier: Apache 2.0 -# ruff: noqa: E402 # disable Module level import not at top of file -import os -from dataclasses import dataclass -import numpy as np -import numpy.typing as npt -import pytest -from typing import ( - Iterator, ) - -from geos.mesh.vtk.helpers import createMultiCellMesh -from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints - -from vtkmodules.util.numpy_support import vtk_to_numpy - -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkCellArray, - vtkCellTypes, - VTK_TETRA, - VTK_HEXAHEDRON, -) - -from vtkmodules.vtkCommonCore import ( - vtkPoints, - vtkIdList, -) - -data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) -data_filename_all: tuple[ str, ...] = ( "tetra_mesh.csv", "hexa_mesh.csv" ) -celltypes_all: tuple[ int ] = ( VTK_TETRA, VTK_HEXAHEDRON ) -nbPtsCell_all: tuple[ int ] = ( 4, 8 ) - -# expected results if shared vertices -hexa_points_out: npt.NDArray[ np.float64 ] = np.array( - [ [ 0.0, 0.0, 0.5 ], [ 0.5, 0.0, 0.5 ], [ 0.5, 0.5, 0.5 ], [ 0.0, 0.5, 0.5 ], [ 0.0, 0.0, 1.0 ], [ 0.5, 0.0, 1.0 ], - [ 0.5, 0.5, 1.0 ], [ 0.0, 0.5, 1.0 ], [ 1.0, 0.0, 0.5 ], [ 1.0, 0.5, 0.5 ], [ 1.0, 0.0, 1.0 ], [ 1.0, 0.5, 1.0 ], - [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.0 ], [ 1.0, 0.0, 0.0 ], [ 1.0, 0.5, 0.0 ], - [ 0.5, 1.0, 0.5 ], [ 0.0, 1.0, 0.5 ], [ 0.5, 1.0, 1.0 ], [ 0.0, 1.0, 1.0 ], [ 1.0, 1.0, 0.5 ], [ 1.0, 1.0, 1.0 ], - [ 0.5, 1.0, 0.0 ], [ 0.0, 1.0, 0.0 ], [ 1.0, 1.0, 0.0 ] ], np.float64 ) -tetra_points_out: npt.NDArray[ np.float64 ] = np.array( - [ [ 0.0, 0.0, 0.0 ], [ 0.5, 0.0, 0.0 ], [ 0.0, 0.0, 0.5 ], [ 0.0, 0.5, 0.0 ], [ 0.5, 0.5, 0.0 ], [ 0.0, 0.5, 0.5 ], - [ 0.0, 1.0, 0.0 ], [ 0.5, 0.0, 0.5 ], [ 1.0, 0.0, 0.0 ], [ 0.0, 0.0, 1.0 ] ], np.float64 ) -points_out_all = ( tetra_points_out, hexa_points_out ) - -tetra_cellPtsIdsExp = [ ( 0, 1, 2, 3 ), ( 3, 4, 5, 6 ), ( 4, 1, 7, 8 ), ( 7, 2, 5, 9 ), ( 2, 5, 3, 1 ), ( 1, 5, 3, 4 ), - ( 1, 5, 4, 7 ), ( 7, 1, 5, 2 ) ] -hexa_cellPtsIdsExp = [ ( 0, 1, 2, 3, 4, 5, 6, 7 ), ( 1, 8, 9, 2, 5, 10, 11, 6 ), ( 12, 13, 14, 15, 0, 1, 2, 3 ), - ( 13, 16, 17, 14, 1, 8, 9, 2 ), ( 3, 2, 18, 19, 7, 6, 20, 21 ), ( 2, 9, 22, 18, 6, 11, 23, 20 ), - ( 15, 14, 24, 25, 3, 2, 18, 19 ), ( 14, 17, 26, 24, 2, 9, 22, 18 ) ] -cellPtsIdsExp_all = ( tetra_cellPtsIdsExp, hexa_cellPtsIdsExp ) - - -@dataclass( frozen=True ) -class TestCase: - """Test case.""" - __test__ = False - #: input mesh - mesh: vtkUnstructuredGrid - #: expected points - pointsExp: npt.NDArray[ np.float64 ] - #: expected cell point ids - cellPtsIdsExp: tuple[ tuple[ int ] ] - - -def __generate_test_data() -> Iterator[ TestCase ]: - """Generate test cases. - - Yields: - Iterator[ TestCase ]: iterator on test cases - """ - for path, celltype, nbPtsCell, pointsExp, cellPtsIdsExp in zip( data_filename_all, - celltypes_all, - nbPtsCell_all, - points_out_all, - cellPtsIdsExp_all, - strict=True ): - # all points coordinates - ptsCoords: npt.NDArray[ np.float64 ] = np.loadtxt( os.path.join( data_root, path ), dtype=float, delimiter=',' ) - # split array to get a list of coordinates per cell - cellPtsCoords = [ ptsCoords[ i:i + nbPtsCell ] for i in range( 0, ptsCoords.shape[ 0 ], nbPtsCell ) ] - nbCells: int = int( ptsCoords.shape[ 0 ] / nbPtsCell ) - cellTypes = nbCells * [ celltype ] - mesh: vtkUnstructuredGrid = createMultiCellMesh( cellTypes, cellPtsCoords, False ) - assert mesh is not None, "Input mesh is undefined." - yield TestCase( mesh, pointsExp, cellPtsIdsExp ) - - -ids: list[ str ] = [ os.path.splitext( name )[ 0 ] for name in data_filename_all ] - - -@pytest.mark.parametrize( "test_case", __generate_test_data(), ids=ids ) -def test_mergeColocatedPoints( test_case: TestCase ) -> None: - """Test of MergeColocatedPoints filter.. - - Args: - test_case (TestCase): test case - """ - filter = MergeColocatedPoints() - filter.SetInputDataObject( 0, test_case.mesh ) - filter.Update() - output: vtkUnstructuredGrid = filter.GetOutputDataObject( 0 ) - # tests on points - pointsOut: vtkPoints = output.GetPoints() - assert pointsOut is not None, "Output points is undefined." - nbPtsExp: int = test_case.pointsExp.shape[ 0 ] - assert pointsOut.GetNumberOfPoints() == nbPtsExp, f"Number of points is expected to be {nbPtsExp}." - pointCoords: npt.NDArray[ np.float64 ] = vtk_to_numpy( pointsOut.GetData() ) - print( "Points coords Obs: ", pointCoords.tolist() ) - assert np.array_equal( pointCoords, test_case.pointsExp ), "Points coordinates are wrong." - - # tests on cells - cellsOut: vtkCellArray = output.GetCells() - assert cellsOut is not None, "Cells from output mesh are undefined." - nbCells: int = test_case.mesh.GetNumberOfCells() - assert cellsOut.GetNumberOfCells() == nbCells, f"Number of cells is expected to be {nbCells}." - - # check cell types - typesInput: vtkCellTypes = vtkCellTypes() - test_case.mesh.GetCellTypes( typesInput ) - assert typesInput is not None, "Input cell types must be defined" - typesOutput: vtkCellTypes = vtkCellTypes() - output.GetCellTypes( typesOutput ) - assert typesOutput is not None, "Output cell types must be defined" - typesArrayInput: npt.NDArray[ np.int64 ] = vtk_to_numpy( typesInput.GetCellTypesArray() ) - typesArrayOutput: npt.NDArray[ np.int64 ] = vtk_to_numpy( typesOutput.GetCellTypesArray() ) - assert np.array_equal( typesArrayInput, typesArrayOutput ), "Cell types are wrong" - - for cellId in range( output.GetNumberOfCells() ): - ptIds = vtkIdList() - cellsOut.GetCellAtId( cellId, ptIds ) - cellsOutObs: tuple[ int ] = tuple( [ ptIds.GetId( j ) for j in range( ptIds.GetNumberOfIds() ) ] ) - print( "cellsOutObs: ", cellsOutObs ) - nbCellPts: int = len( test_case.cellPtsIdsExp[ cellId ] ) - assert ptIds is not None, "Point ids must be defined" - assert ptIds.GetNumberOfIds() == nbCellPts, f"Cells must be defined by {nbCellPts} points." - assert cellsOutObs == test_case.cellPtsIdsExp[ cellId ], "Cell point ids are wrong." diff --git a/geos-pv/src/PVplugins/PVMergeColocatedPoints.py b/geos-pv/src/PVplugins/PVMergeColocatedPoints.py deleted file mode 100644 index a1f791922..000000000 --- a/geos-pv/src/PVplugins/PVMergeColocatedPoints.py +++ /dev/null @@ -1,66 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay -# ruff: noqa: E402 # disable Module level import not at top of file -import sys -from pathlib import Path -from typing_extensions import Self - -from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] - smdomain, smhint, smproperty, smproxy, -) - -from vtkmodules.vtkCommonDataModel import ( - vtkPointSet, -) - -# update sys.path to load all GEOS Python Package dependencies -geos_pv_path: Path = Path( __file__ ).parent.parent.parent -sys.path.insert( 0, str( geos_pv_path / "src" ) ) -from geos.pv.utils.config import update_paths -update_paths() - -from geos.mesh.processing.MergeColocatedPoints import MergeColocatedPoints -from geos.pv.utils.AbstractPVPluginVtkWrapper import AbstractPVPluginVtkWrapper - -__doc__ = """ -Merge collocated points of input mesh. - -Output mesh is of same type as input mesh. If input mesh is a composite mesh, the plugin merge points of each part independently. - -To use it: - -* Load the module in Paraview: Tools>Manage Plugins...>Load new>PVMergeColocatedPoints. -* Select the input mesh. -* Apply the filter. - -""" - -@smproxy.filter( name="PVMergeColocatedPoints", label="Merge Colocated Points" ) -@smhint.xml( '' ) -@smproperty.input( name="Input", port_index=0 ) -@smdomain.datatype( - dataTypes=[ "vtkPointSet"], - composite_data_supported=True, -) -class PVMergeColocatedPoints(AbstractPVPluginVtkWrapper): - def __init__(self:Self) ->None: - """Merge collocated points.""" - super().__init__() - - def applyVtkFlilter( - self: Self, - input: vtkPointSet, - ) -> vtkPointSet: - """Apply vtk filter. - - Args: - input (vtkPointSet): input mesh - - Returns: - vtkPointSet: output mesh - """ - filter :MergeColocatedPoints = MergeColocatedPoints() - filter.SetInputDataObject(input) - filter.Update() - return filter.GetOutputDataObject( 0 ) diff --git a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py index c00cef2e1..80129d559 100644 --- a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py +++ b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py @@ -18,7 +18,8 @@ __doc__ = """ AbstractPVPluginVtkWrapper module defines the parent Paraview plugin from which inheritates PV plugins that directly wrap a vtk filter. -To use it, make children PV plugins inherited from AbstractPVPluginVtkWrapper. Output mesh is of same type as input mesh. If output type needs to be specified, this must be done in the child class. +To use it, make children PV plugins inherited from AbstractPVPluginVtkWrapper. Output mesh is of same type as input mesh. +If output type needs to be specified, this must be done in the child class. """ class AbstractPVPluginVtkWrapper(VTKPythonAlgorithmBase): @@ -72,15 +73,12 @@ def RequestData( assert inputMesh is not None, "Input server mesh is null." assert outputMesh is not None, "Output pipeline is null." - splittedMesh = self.applyVtkFlilter(inputMesh) - assert splittedMesh is not None, "Splitted mesh is null." - outputMesh.ShallowCopy(splittedMesh) - print("Mesh was successfully splitted.") - except AssertionError as e: - print(f"Mesh split failed due to: {e}") - return 0 - except Exception as e: - print(f"Mesh split failed due to: {e}") + tmpMesh = self.applyVtkFlilter(inputMesh) + assert tmpMesh is not None, "Output mesh is null." + outputMesh.ShallowCopy(tmpMesh) + print("Filter was successfully applied.") + except (AssertionError, Exception) as e: + print(f"Filter failed due to: {e}") return 0 return 1 From 8f31c5105121b5f07bb0e692a7f019711d372498 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 13 May 2025 16:16:20 +0200 Subject: [PATCH 44/57] yapf fix --- geos-mesh/src/geos/mesh/processing/SplitMesh.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index 87f99e68d..f0f7bac5e 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -70,10 +70,7 @@ def __init__( self ) -> None: self.originalId: vtkIdTypeArray self.cellTypes: list[ int ] - def FillInputPortInformation( self: Self, - port: int, - info: vtkInformation - ) -> int: + def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> int: """Inherited from VTKPythonAlgorithmBase::RequestInformation. Args: From e9d11eab6c0cb7af103c1d4bf25f32b0757c3545 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Tue, 13 May 2025 17:21:56 +0200 Subject: [PATCH 45/57] fix tests --- geos-mesh/src/geos/mesh/processing/SplitMesh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index f0f7bac5e..aaded7b5b 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -139,7 +139,7 @@ def RequestData( nb_polygon = counts.getTypeCount( VTK_POLYGON ) nb_polyhedra = counts.getTypeCount( VTK_POLYHEDRON ) assert counts.getTypeCount( VTK_WEDGE ) == 0, "Input mesh contains wedges that are not currently supported." - assert nb_polyhedra * nb_polygon > 0, "Input mesh is composed of both polygons and polyhedra, but it must contains only one of the two." + assert nb_polyhedra * nb_polygon == 0, "Input mesh is composed of both polygons and polyhedra, but it must contains only one of the two." nbNewPoints: int = 0 nbNewPoints = nb_hex * 19 + nb_tet * 6 + nb_pyr * 9 if nb_polyhedra > 0 else nb_triangles * 3 + nb_quad * 5 nbNewCells: int = nb_hex * 8 + nb_tet * 8 + nb_pyr * 10 * nb_triangles * 4 + nb_quad * 4 From efaf0be8d34ec1a4995c3be7bc25b913901ee476 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 19 May 2025 10:23:09 +0200 Subject: [PATCH 46/57] Reorganize utilities & update paths accordingly --- docs/geos_mesh_docs/utils.rst | 4 +- .../mesh/doctor/checks/check_fractures.py | 2 +- .../doctor/checks/fix_elements_orderings.py | 2 +- .../mesh/doctor/checks/generate_fractures.py | 3 +- .../geos/mesh/doctor/checks/non_conformal.py | 2 +- .../geos/mesh/doctor/checks/reorient_mesh.py | 2 +- .../mesh/doctor/checks/supported_elements.py | 2 +- .../geos/mesh/doctor/checks/vtk_polyhedron.py | 2 +- .../utils/{helpers.py => arrayHelpers.py} | 74 +++++---- .../utils/{filters.py => arrayModifiers.py} | 156 ++---------------- .../src/geos/mesh/utils/genericHelpers.py | 76 +++++++++ ...rTreeFunctions.py => multiblockHelpers.py} | 32 +++- .../geos/mesh/utils/multiblockModifiers.py | 47 ++++++ ...est_vtkHelpers.py => test_arrayHelpers.py} | 26 +-- ...t_vtkFilters.py => test_arrayModifiers.py} | 58 ++----- geos-mesh/tests/test_generate_fractures.py | 2 +- geos-mesh/tests/test_multiblockModifiers.py | 35 ++++ geos-mesh/tests/test_reorient_mesh.py | 2 +- geos-mesh/tests/test_supported_elements.py | 2 +- geos-posp/src/PVplugins/PVAttributeMapping.py | 5 +- .../PVCreateConstantAttributePerRegion.py | 4 +- .../PVplugins/PVExtractMergeBlocksVolume.py | 2 +- .../PVExtractMergeBlocksVolumeSurface.py | 2 +- .../PVExtractMergeBlocksVolumeSurfaceWell.py | 2 +- .../PVExtractMergeBlocksVolumeWell.py | 2 +- .../src/PVplugins/PVMergeBlocksEnhanced.py | 2 +- geos-posp/src/PVplugins/PVMohrCirclePlot.py | 4 +- .../src/PVplugins/PVSurfaceGeomechanics.py | 2 +- .../PVTransferAttributesVolumeSurface.py | 6 +- .../filters/AttributeMappingFromCellCoords.py | 4 +- .../filters/AttributeMappingFromCellId.py | 4 +- .../filters/GeomechanicsCalculator.py | 4 +- .../geos_posp/filters/GeosBlockExtractor.py | 4 +- .../src/geos_posp/filters/GeosBlockMerge.py | 14 +- .../geos_posp/filters/SurfaceGeomechanics.py | 4 +- .../TransferAttributesVolumeSurface.py | 2 +- .../geos_posp/pyvistaTools/pyvistaUtils.py | 19 ++- .../visu/PVUtils/paraviewTreatments.py | 2 +- .../src/geos/pygeos_tools/mesh/VtkMesh.py | 2 +- 39 files changed, 327 insertions(+), 292 deletions(-) rename geos-mesh/src/geos/mesh/utils/{helpers.py => arrayHelpers.py} (94%) rename geos-mesh/src/geos/mesh/utils/{filters.py => arrayModifiers.py} (78%) create mode 100644 geos-mesh/src/geos/mesh/utils/genericHelpers.py rename geos-mesh/src/geos/mesh/utils/{multiblockInspectorTreeFunctions.py => multiblockHelpers.py} (88%) create mode 100644 geos-mesh/src/geos/mesh/utils/multiblockModifiers.py rename geos-mesh/tests/{test_vtkHelpers.py => test_arrayHelpers.py} (84%) rename geos-mesh/tests/{test_vtkFilters.py => test_arrayModifiers.py} (80%) create mode 100644 geos-mesh/tests/test_multiblockModifiers.py diff --git a/docs/geos_mesh_docs/utils.rst b/docs/geos_mesh_docs/utils.rst index 9651dfdf9..e29a7790f 100644 --- a/docs/geos_mesh_docs/utils.rst +++ b/docs/geos_mesh_docs/utils.rst @@ -25,10 +25,10 @@ geos.mesh.utils.helpers module -geos.mesh.utils.multiblockInspectorTreeFunctions module +geos.mesh.utils.multiblockHelpers module --------------------------------------------------------------- -.. automodule:: geos.mesh.utils.multiblockInspectorTreeFunctions +.. automodule:: geos.mesh.utils.multiblockHelpers :members: :undoc-members: :show-inheritance: diff --git a/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py index 4a23976a8..91375e47d 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/check_fractures.py @@ -8,7 +8,7 @@ from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.util.numpy_support import vtk_to_numpy from geos.mesh.doctor.checks.generate_fractures import Coordinates3D -from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.utils.genericHelpers import vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py b/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py index ddb423dd0..26c958dca 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/fix_elements_orderings.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import Dict, FrozenSet, List, Set from vtkmodules.vtkCommonCore import vtkIdList -from geos.mesh.utils.helpers import to_vtk_id_list +from geos.mesh.utils.genericHelpers import to_vtk_id_list from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py index ae553dd6d..17198237e 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py @@ -13,7 +13,8 @@ from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.vtkConstants import VTK_ID_TYPE from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.utils.helpers import has_invalid_field, to_vtk_id_list, vtk_iter +from geos.mesh.utils.arrayHelpers import has_invalid_field +from geos.mesh.utils.genericHelpers import to_vtk_id_list, vtk_iter from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh """ TypeAliases cannot be used with Python 3.9. A simple assignment like described there will be used: diff --git a/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py b/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py index eee5bcfbf..e4037dac0 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/non_conformal.py @@ -14,7 +14,7 @@ from vtkmodules.vtkFiltersModeling import vtkCollisionDetectionFilter, vtkLinearExtrusionFilter from geos.mesh.doctor.checks import reorient_mesh from geos.mesh.doctor.checks import triangle_distance -from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.utils.genericHelpers import vtk_iter from geos.mesh.io.vtkIO import read_mesh diff --git a/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py b/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py index 476efa239..aca4c7ee9 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/reorient_mesh.py @@ -8,7 +8,7 @@ vtkUnstructuredGrid, vtkTetra ) from vtkmodules.vtkFiltersCore import vtkTriangleFilter from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream, build_face_to_face_connectivity_through_edges -from geos.mesh.utils.helpers import to_vtk_id_list +from geos.mesh.utils.genericHelpers import to_vtk_id_list def __compute_volume( mesh_points: vtkPoints, face_stream: FaceStream ) -> float: diff --git a/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py b/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py index f0eb5a6b5..2a1c80611 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/supported_elements.py @@ -11,7 +11,7 @@ VTK_PENTAGONAL_PRISM, VTK_POLYHEDRON, VTK_PYRAMID, VTK_TETRA, VTK_VOXEL, VTK_WEDGE ) from geos.mesh.doctor.checks.vtk_polyhedron import build_face_to_face_connectivity_through_edges, FaceStream -from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.utils.genericHelpers import vtk_iter from geos.mesh.io.vtkIO import read_mesh diff --git a/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py b/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py index d64d142ba..8e628a66b 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/vtk_polyhedron.py @@ -3,7 +3,7 @@ import networkx from typing import Collection, Dict, FrozenSet, Iterable, List, Sequence, Tuple from vtkmodules.vtkCommonCore import vtkIdList -from geos.mesh.utils.helpers import vtk_iter +from geos.mesh.utils.genericHelpers import vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/src/geos/mesh/utils/helpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py similarity index 94% rename from geos-mesh/src/geos/mesh/utils/helpers.py rename to geos-mesh/src/geos/mesh/utils/arrayHelpers.py index 2a2f1fec2..b151d8f38 100644 --- a/geos-mesh/src/geos/mesh/utils/helpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay, Paloma Martinez from typing import Any import logging from copy import deepcopy @@ -7,34 +10,15 @@ import vtkmodules.util.numpy_support as vnp from typing import Iterator, Optional, List, Union, cast from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonCore import vtkDataArray, vtkIdList, vtkDoubleArray +from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkFieldData, vtkMultiBlockDataSet, vtkDataSet, vtkCompositeDataSet, vtkDataObject, vtkPointData, vtkCellData, vtkDataObjectTreeIterator, vtkPolyData ) -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) +from vtkmodules.vtkCommonCore import vtkPoints +from vtkmodules.vtkFiltersCore import vtkCellCenters +from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) - -def to_vtk_id_list( data ) -> vtkIdList: - result = vtkIdList() - result.Allocate( len( data ) ) - for d in data: - result.InsertNextId( d ) - return result - - -def vtk_iter( vtkContainer ) -> Iterator[ Any ]: - """ - Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins - python containers. - :param vtkContainer: A vtk container. - :return: The iterator. - """ - if hasattr( vtkContainer, "GetNumberOfIds" ): - for i in range( vtkContainer.GetNumberOfIds() ): - yield vtkContainer.GetId( i ) - elif hasattr( vtkContainer, "GetNumberOfTypes" ): - for i in range( vtkContainer.GetNumberOfTypes() ): - yield vtkContainer.GetCellType( i ) +__doc__ = """ Utilities methods to get information on VTK Arrays. """ def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: @@ -110,14 +94,6 @@ def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ npt.NDArray[ np.in return vtk_to_numpy( getGlobalIdsArray( data ) ) -def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.int64 ] ) -> None: - globalids: Optional[ npt.NDArray[ np.int64 ] ] = getNumpyGlobalIdsArray( data ) - if globalids is not None: - arr = arr[ np.argsort( globalids ) ] - else: - logging.warning( "No sorting was performed." ) - - def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ Any ]: arr: Optional[ npt.NDArray[ Any ] ] = vtk_to_numpy( getArrayByName( data, name ) ) if arr is not None: @@ -609,3 +585,37 @@ def getMultiBlockBounds( input: vtkMultiBlockDataSet, ) -> tuple[ float, float, zmin = bounds[ 4 ] if bounds[ 4 ] < zmin else zmin zmax = bounds[ 5 ] if bounds[ 5 ] > zmax else zmax return xmin, xmax, ymin, ymax, zmin, zmax + + +def computeCellCenterCoordinates( mesh: vtkDataSet ) -> vtkDataArray: + """Get the coordinates of Cell center. + + Args: + mesh (vtkDataSet): input surface + + Returns: + vtkPoints: cell center coordinates + """ + assert mesh is not None, "Surface is undefined." + filter: vtkCellCenters = vtkCellCenters() + filter.SetInputDataObject( mesh ) + filter.Update() + output: vtkUnstructuredGrid = filter.GetOutputDataObject( 0 ) + assert output is not None, "Cell center output is undefined." + pts: vtkPoints = output.GetPoints() + assert pts is not None, "Cell center points are undefined." + return pts.GetData() + + +def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.int64 ] ) -> None: + """Sort an array following global Ids + + Args: + data (vtkFieldData): Global Ids array + arr (npt.NDArray[ np.int64 ]): Array to sort + """ + globalids: Optional[ npt.NDArray[ np.int64 ] ] = getNumpyGlobalIdsArray( data ) + if globalids is not None: + arr = arr[ np.argsort( globalids ) ] + else: + logging.warning( "No sorting was performed." ) diff --git a/geos-mesh/src/geos/mesh/utils/filters.py b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py similarity index 78% rename from geos-mesh/src/geos/mesh/utils/filters.py rename to geos-mesh/src/geos/mesh/utils/arrayModifiers.py index 793b62f86..06a082578 100644 --- a/geos-mesh/src/geos/mesh/utils/filters.py +++ b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py @@ -1,57 +1,42 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. -# SPDX-FileContributor: Martin Lemay, Paloma Martinez -from typing import Union +# SPDX-FileContributor: Martin Lemay, Alexandre Benedicto, Paloma Martinez import numpy as np import numpy.typing as npt +import logging import vtkmodules.util.numpy_support as vnp - -from vtkmodules.vtkCommonCore import ( - vtkCharArray, - vtkDataArray, - vtkDoubleArray, - vtkFloatArray, - vtkIntArray, - vtkPoints, - vtkUnsignedIntArray, -) -from vtkmodules.vtkCommonDataModel import ( - vtkCompositeDataSet, - vtkDataObject, - vtkDataObjectTreeIterator, - vtkDataSet, - vtkMultiBlockDataSet, - vtkPlane, - vtkPointSet, - vtkPolyData, - vtkUnstructuredGrid, -) +from typing import Optional, Union +from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray +from vtkmodules.vtkCommonDataModel import ( vtkMultiBlockDataSet, vtkDataSet, vtkPointSet, vtkCompositeDataSet, + vtkDataObject, vtkDataObjectTreeIterator, vtkFieldData ) from vtkmodules.vtkFiltersCore import ( - vtk3DLinearGridPlaneCutter, - vtkAppendDataSets, vtkArrayRename, vtkCellCenters, vtkPointDataToCellData, ) -from vtkmodules.vtkFiltersExtraction import vtkExtractBlock from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, ) -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( - getBlockElementIndexesFlatten, - getBlockFromFlatIndex, +from vtkmodules.vtkCommonCore import ( + vtkCharArray, + vtkDataArray, + vtkDoubleArray, + vtkFloatArray, + vtkIntArray, + vtkPoints, + vtkUnsignedIntArray, ) - -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayHelpers import ( getComponentNames, getAttributesWithNumberOfComponents, getAttributeSet, getArrayInObject, isAttributeInObject, ) +from geos.mesh.utils.multiblockHelpers import getBlockElementIndexesFlatten, getBlockFromFlatIndex -__doc__ = """ Utilities to process vtk objects. """ +__doc__ = """ Generic utilities to process VTK Arrays objects. """ def fillPartialAttributes( @@ -108,61 +93,6 @@ def fillAllPartialAttributes( return True -def extractBlock( multiBlockDataSet: vtkMultiBlockDataSet, blockIndex: int ) -> vtkMultiBlockDataSet: - """Extract the block with index blockIndex from multiBlockDataSet. - - Args: - multiBlockDataSet (vtkMultiBlockDataSet): multiblock dataset from which - to extract the block - blockIndex (int): block index to extract - - Returns: - vtkMultiBlockDataSet: extracted block - """ - extractBlockfilter: vtkExtractBlock = vtkExtractBlock() - extractBlockfilter.SetInputData( multiBlockDataSet ) - extractBlockfilter.AddIndex( blockIndex ) - extractBlockfilter.Update() - extractedBlock: vtkMultiBlockDataSet = extractBlockfilter.GetOutput() - return extractedBlock - - -# TODO : fix function for keepPartialAttributes = True -def mergeBlocks( - input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], - keepPartialAttributes: bool = False, -) -> vtkUnstructuredGrid: - """Merge all blocks of a multi block mesh. - - Args: - input (vtkMultiBlockDataSet | vtkCompositeDataSet ): composite - object to merge blocks - keepPartialAttributes (bool): if True, keep partial attributes after merge. - - Defaults to False. - - Returns: - vtkUnstructuredGrid: merged block object - - """ - if keepPartialAttributes: - fillAllPartialAttributes( input, False ) - fillAllPartialAttributes( input, True ) - - af = vtkAppendDataSets() - af.MergePointsOn() - iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() - iter.SetDataSet( input ) - iter.VisitOnlyLeavesOn() - iter.GoToFirstItem() - while iter.GetCurrentDataObject() is not None: - block: vtkUnstructuredGrid = vtkUnstructuredGrid.SafeDownCast( iter.GetCurrentDataObject() ) - af.AddInputData( block ) - iter.GoToNextItem() - af.Update() - return af.GetOutputDataObject( 0 ) - - def createEmptyAttribute( attributeName: str, componentNames: tuple[ str, ...], @@ -495,58 +425,6 @@ def doCreateCellCenterAttribute( block: vtkDataSet, cellCenterAttributeName: str return True -def computeCellCenterCoordinates( mesh: vtkDataSet ) -> vtkDataArray: - """Get the coordinates of Cell center. - - Args: - mesh (vtkDataSet): input surface - - Returns: - vtkPoints: cell center coordinates - """ - assert mesh is not None, "Surface is undefined." - filter: vtkCellCenters = vtkCellCenters() - filter.SetInputDataObject( mesh ) - filter.Update() - output: vtkUnstructuredGrid = filter.GetOutputDataObject( 0 ) - assert output is not None, "Cell center output is undefined." - pts: vtkPoints = output.GetPoints() - assert pts is not None, "Cell center points are undefined." - return pts.GetData() - - -def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) -> vtkPolyData: - """Extract surface at a constant elevation from a mesh. - - Args: - mesh (vtkUnstructuredGrid): input mesh - elevation (float): elevation at which to extract the surface - - Returns: - vtkPolyData: output surface - """ - assert mesh is not None, "Input mesh is undefined." - assert isinstance( mesh, vtkUnstructuredGrid ), "Wrong object type" - - bounds: tuple[ float, float, float, float, float, float ] = mesh.GetBounds() - ooX: float = ( bounds[ 0 ] + bounds[ 1 ] ) / 2.0 - ooY: float = ( bounds[ 2 ] + bounds[ 3 ] ) / 2.0 - - # check plane z coordinates against mesh bounds - assert ( elevation <= bounds[ 5 ] ) and ( elevation >= bounds[ 4 ] ), "Plane is out of input mesh bounds." - - plane: vtkPlane = vtkPlane() - plane.SetNormal( 0.0, 0.0, 1.0 ) - plane.SetOrigin( ooX, ooY, elevation ) - - cutter = vtk3DLinearGridPlaneCutter() - cutter.SetInputDataObject( mesh ) - cutter.SetPlane( plane ) - cutter.SetInterpolateAttributes( True ) - cutter.Update() - return cutter.GetOutputDataObject( 0 ) - - def transferPointDataToCellData( mesh: vtkPointSet ) -> vtkPointSet: """Transfer point data to cell data. diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py new file mode 100644 index 000000000..6df864ec5 --- /dev/null +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -0,0 +1,76 @@ +from typing import Any, Iterator, List +from vtkmodules.vtkCommonCore import vtkIdList +from vtkmodules.vtkCommonDataModel import ( + vtkUnstructuredGrid, + vtkPolyData, + vtkPlane, +) +from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter +""" Generic VTK utilities.""" + + +def to_vtk_id_list( data: List[ int ] ) -> vtkIdList: + """Utility function transforming a list of ids into a vtkIdList. + + Args: + data (list[int]): Id list + + Returns: + result (vtkIdList): Vtk Id List corresponding to input data + """ + result = vtkIdList() + result.Allocate( len( data ) ) + for d in data: + result.InsertNextId( d ) + return result + + +def vtk_iter( vtkContainer ) -> Iterator[ Any ]: + """ + Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins + python containers. + + Args: + vtkContainer: A vtk container + + Returns: + The iterator + """ + if hasattr( vtkContainer, "GetNumberOfIds" ): + for i in range( vtkContainer.GetNumberOfIds() ): + yield vtkContainer.GetId( i ) + elif hasattr( vtkContainer, "GetNumberOfTypes" ): + for i in range( vtkContainer.GetNumberOfTypes() ): + yield vtkContainer.GetCellType( i ) + + +def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) -> vtkPolyData: + """Extract surface at a constant elevation from a mesh. + + Args: + mesh (vtkUnstructuredGrid): input mesh + elevation (float): elevation at which to extract the surface + + Returns: + vtkPolyData: output surface + """ + assert mesh is not None, "Input mesh is undefined." + assert isinstance( mesh, vtkUnstructuredGrid ), "Wrong object type" + + bounds: tuple[ float, float, float, float, float, float ] = mesh.GetBounds() + ooX: float = ( bounds[ 0 ] + bounds[ 1 ] ) / 2.0 + ooY: float = ( bounds[ 2 ] + bounds[ 3 ] ) / 2.0 + + # check plane z coordinates against mesh bounds + assert ( elevation <= bounds[ 5 ] ) and ( elevation >= bounds[ 4 ] ), "Plane is out of input mesh bounds." + + plane: vtkPlane = vtkPlane() + plane.SetNormal( 0.0, 0.0, 1.0 ) + plane.SetOrigin( ooX, ooY, elevation ) + + cutter = vtk3DLinearGridPlaneCutter() + cutter.SetInputDataObject( mesh ) + cutter.SetPlane( plane ) + cutter.SetInterpolateAttributes( True ) + cutter.Update() + return cutter.GetOutputDataObject( 0 ) diff --git a/geos-mesh/src/geos/mesh/utils/multiblockInspectorTreeFunctions.py b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py similarity index 88% rename from geos-mesh/src/geos/mesh/utils/multiblockInspectorTreeFunctions.py rename to geos-mesh/src/geos/mesh/utils/multiblockHelpers.py index 189a9a857..0e61dcdc6 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockInspectorTreeFunctions.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py @@ -3,14 +3,11 @@ # SPDX-FileContributor: Martin Lemay from typing import Union, cast -from vtkmodules.vtkCommonDataModel import ( - vtkCompositeDataSet, - vtkDataObject, - vtkDataObjectTreeIterator, - vtkMultiBlockDataSet, -) +from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObject, vtkDataObjectTreeIterator, + vtkMultiBlockDataSet, vtkUnstructuredGrid ) +from vtkmodules.vtkFiltersExtraction import vtkExtractBlock -__doc__ = """Functions to explore and process multiblock inspector tree.""" +__doc__ = """Functions to explore and process VTK multiblock datasets. """ def getBlockName( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ] ) -> str: @@ -24,7 +21,6 @@ def getBlockName( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ] ) -> Returns: str: name of the block in the tree. - """ iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( input ) @@ -56,7 +52,6 @@ def getBlockNameFromIndex( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataS Returns: str: name of the block in the tree. - """ iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( input ) @@ -225,3 +220,22 @@ def getBlockFromName( multiBlock: Union[ vtkMultiBlockDataSet, vtkCompositeDataS break iter.GoToNextItem() return block + + +def extractBlock( multiBlockDataSet: vtkMultiBlockDataSet, blockIndex: int ) -> vtkMultiBlockDataSet: + """Extract the block with index blockIndex from multiBlockDataSet. + + Args: + multiBlockDataSet (vtkMultiBlockDataSet): multiblock dataset from which + to extract the block + blockIndex (int): block index to extract + + Returns: + vtkMultiBlockDataSet: extracted block + """ + extractBlockfilter: vtkExtractBlock = vtkExtractBlock() + extractBlockfilter.SetInputData( multiBlockDataSet ) + extractBlockfilter.AddIndex( blockIndex ) + extractBlockfilter.Update() + extractedBlock: vtkMultiBlockDataSet = extractBlockfilter.GetOutput() + return extractedBlock diff --git a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py new file mode 100644 index 000000000..97ef7ea96 --- /dev/null +++ b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay +from typing import Union, cast + +from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObjectTreeIterator, vtkMultiBlockDataSet, + vtkUnstructuredGrid ) +from vtkmodules.vtkFiltersCore import vtkAppendDataSets +from geos.mesh.utils.arrayModifiers import fillAllPartialAttributes + +__doc__ = """Function to process VTK multiblock datasets. """ + + +# TODO : fix function for keepPartialAttributes = True +def mergeBlocks( + input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ], + keepPartialAttributes: bool = False, +) -> vtkUnstructuredGrid: + """Merge all blocks of a multi block mesh. + + Args: + input (vtkMultiBlockDataSet | vtkCompositeDataSet ): composite + object to merge blocks + keepPartialAttributes (bool): if True, keep partial attributes after merge. + + Defaults to False. + + Returns: + vtkUnstructuredGrid: merged block object + + """ + if keepPartialAttributes: + fillAllPartialAttributes( input, False ) + fillAllPartialAttributes( input, True ) + + af = vtkAppendDataSets() + af.MergePointsOn() + iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() + iter.SetDataSet( input ) + iter.VisitOnlyLeavesOn() + iter.GoToFirstItem() + while iter.GetCurrentDataObject() is not None: + block: vtkUnstructuredGrid = vtkUnstructuredGrid.SafeDownCast( iter.GetCurrentDataObject() ) + af.AddInputData( block ) + iter.GoToNextItem() + af.Update() + return af.GetOutputDataObject( 0 ) diff --git a/geos-mesh/tests/test_vtkHelpers.py b/geos-mesh/tests/test_arrayHelpers.py similarity index 84% rename from geos-mesh/tests/test_vtkHelpers.py rename to geos-mesh/tests/test_arrayHelpers.py index c2f6058fb..0a73ee999 100644 --- a/geos-mesh/tests/test_vtkHelpers.py +++ b/geos-mesh/tests/test_arrayHelpers.py @@ -15,7 +15,7 @@ from vtkmodules.vtkCommonCore import vtkDoubleArray from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkMultiBlockDataSet, vtkPolyData -from geos.mesh.utils import helpers as vtkHelpers +from geos.mesh.utils import arrayHelpers @pytest.mark.parametrize( "onpoints, expected", [ ( True, { @@ -34,7 +34,7 @@ def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, o expected: dict[ str, int ] ) -> None: """Test getting attribute list as dict from multiblock.""" multiBlockTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - attributes: dict[ str, int ] = vtkHelpers.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) + attributes: dict[ str, int ] = arrayHelpers.getAttributesFromMultiBlockDataSet( multiBlockTest, onpoints ) assert attributes == expected @@ -53,7 +53,7 @@ def test_getAttributeFromMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet, o def test_getAttributesFromDataSet( dataSetTest: vtkDataSet, onpoints: bool, expected: dict[ str, int ] ) -> None: """Test getting attribute list as dict from dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - attributes: dict[ str, int ] = vtkHelpers.getAttributesFromDataSet( vtkDataSetTest, onpoints ) + attributes: dict[ str, int ] = arrayHelpers.getAttributesFromDataSet( vtkDataSetTest, onpoints ) assert attributes == expected @@ -65,7 +65,7 @@ def test_isAttributeInObjectMultiBlockDataSet( dataSetTest: vtkMultiBlockDataSet expected: dict[ str, int ] ) -> None: """Test presence of attribute in a multiblock.""" multiBlockDataset: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: bool = vtkHelpers.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) + obtained: bool = arrayHelpers.isAttributeInObjectMultiBlockDataSet( multiBlockDataset, attributeName, onpoints ) assert obtained == expected @@ -77,7 +77,7 @@ def test_isAttributeInObjectDataSet( dataSetTest: vtkDataSet, attributeName: str expected: bool ) -> None: """Test presence of attribute in a dataset.""" vtkDataset: vtkDataSet = dataSetTest( "dataset" ) - obtained: bool = vtkHelpers.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) + obtained: bool = arrayHelpers.isAttributeInObjectDataSet( vtkDataset, attributeName, onpoints ) assert obtained == expected @@ -94,7 +94,7 @@ def test_getArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt.ND params = request.node.callspec.params attributeName: str = params[ "arrayExpected" ] - obtained: npt.NDArray[ np.float64 ] = vtkHelpers.getArrayInObject( vtkDataSetTest, attributeName, onpoints ) + obtained: npt.NDArray[ np.float64 ] = arrayHelpers.getArrayInObject( vtkDataSetTest, attributeName, onpoints ) expected: npt.NDArray[ np.float64 ] = arrayExpected assert ( obtained == expected ).all() @@ -112,7 +112,7 @@ def test_getVtkArrayInObject( request: pytest.FixtureRequest, arrayExpected: npt params = request.node.callspec.params attributeName: str = params[ 'arrayExpected' ] - obtained: vtkDoubleArray = vtkHelpers.getVtkArrayInObject( vtkDataSetTest, attributeName, onpoints ) + obtained: vtkDoubleArray = arrayHelpers.getVtkArrayInObject( vtkDataSetTest, attributeName, onpoints ) obtained_as_np: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( obtained ) assert ( obtained_as_np == arrayExpected ).all() @@ -131,7 +131,7 @@ def test_getNumberOfComponentsDataSet( ) -> None: """Test getting the number of components of an attribute from a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - obtained: int = vtkHelpers.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) + obtained: int = arrayHelpers.getNumberOfComponentsDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected @@ -148,7 +148,7 @@ def test_getNumberOfComponentsMultiBlock( ) -> None: """Test getting the number of components of an attribute from a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: int = vtkHelpers.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) + obtained: int = arrayHelpers.getNumberOfComponentsMultiBlock( vtkMultiBlockDataSetTest, attributeName, onpoints ) assert obtained == expected @@ -161,7 +161,7 @@ def test_getComponentNamesDataSet( dataSetTest: vtkDataSet, attributeName: str, expected: tuple[ str, ...] ) -> None: """Test getting the component names of an attribute from a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) - obtained: tuple[ str, ...] = vtkHelpers.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) + obtained: tuple[ str, ...] = arrayHelpers.getComponentNamesDataSet( vtkDataSetTest, attributeName, onpoints ) assert obtained == expected @@ -177,8 +177,8 @@ def test_getComponentNamesMultiBlock( ) -> None: """Test getting the component names of an attribute from a multiblock.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - obtained: tuple[ str, ...] = vtkHelpers.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, - onpoints ) + obtained: tuple[ str, ...] = arrayHelpers.getComponentNamesMultiBlock( vtkMultiBlockDataSetTest, attributeName, + onpoints ) assert obtained == expected @@ -193,7 +193,7 @@ def test_getAttributeValuesAsDF( dataSetTest: vtkPolyData, attributeNames: Tuple expected_columns: Tuple[ str, ...] ) -> None: """Test getting an attribute from a polydata as a dataframe.""" polydataset: vtkPolyData = dataSetTest( "polydata" ) - data: pd.DataFrame = vtkHelpers.getAttributeValuesAsDF( polydataset, attributeNames ) + data: pd.DataFrame = arrayHelpers.getAttributeValuesAsDF( polydataset, attributeNames ) obtained_columns = data.columns.values.tolist() assert obtained_columns == list( expected_columns ) diff --git a/geos-mesh/tests/test_vtkFilters.py b/geos-mesh/tests/test_arrayModifiers.py similarity index 80% rename from geos-mesh/tests/test_vtkFilters.py rename to geos-mesh/tests/test_arrayModifiers.py index 7524fb549..5f90bb13f 100644 --- a/geos-mesh/tests/test_vtkFilters.py +++ b/geos-mesh/tests/test_arrayModifiers.py @@ -13,13 +13,13 @@ import vtkmodules.util.numpy_support as vnp from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray from vtkmodules.vtkCommonDataModel import ( vtkDataSet, vtkMultiBlockDataSet, vtkDataObjectTreeIterator, vtkPointData, - vtkCellData, vtkUnstructuredGrid ) + vtkCellData ) from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, ) -from geos.mesh.utils import filters as vtkFilters +from geos.mesh.utils import arrayModifiers @pytest.mark.parametrize( "attributeName, onpoints", [ ( "CellAttribute", False ), ( "PointAttribute", True ) ] ) @@ -30,7 +30,7 @@ def test_fillPartialAttributes( ) -> None: """Test filling a partial attribute from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - vtkFilters.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) + arrayModifiers.fillPartialAttributes( vtkMultiBlockDataSetTest, attributeName, nbComponents=3, onPoints=onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -59,7 +59,7 @@ def test_fillAllPartialAttributes( ) -> None: """Test filling all partial attributes from a multiblock with nan values.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - vtkFilters.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) + arrayModifiers.fillAllPartialAttributes( vtkMultiBlockDataSetTest, onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -79,32 +79,6 @@ def test_fillAllPartialAttributes( iter.GoToNextItem() -# TODO: Add test for keepPartialAttributes = True when function fixed -@pytest.mark.parametrize( - "keepPartialAttributes, expected_point_attributes, expected_cell_attributes", - [ - ( False, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", ) ), - # ( True, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", "CELL_MARKERS", "FAULT", "PERM", "PORO" ) ), - ] ) -def test_mergeBlocks( - dataSetTest: vtkMultiBlockDataSet, - expected_point_attributes: tuple[ str, ...], - expected_cell_attributes: tuple[ str, ...], - keepPartialAttributes: bool, -) -> None: - """Test the merging of a multiblock.""" - vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) - dataset: vtkUnstructuredGrid = vtkFilters.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) - - assert dataset.GetCellData().GetNumberOfArrays() == len( expected_cell_attributes ) - for c_attribute in expected_cell_attributes: - assert dataset.GetCellData().HasArray( c_attribute ) - - assert dataset.GetPointData().GetNumberOfArrays() == len( expected_point_attributes ) - for p_attribute in expected_point_attributes: - assert dataset.GetPointData().HasArray( p_attribute ) - - @pytest.mark.parametrize( "attributeName, dataType, expectedDatatypeArray", [ ( "test_double", VTK_DOUBLE, "vtkDoubleArray" ), ( "test_float", VTK_FLOAT, "vtkFloatArray" ), @@ -119,7 +93,7 @@ def test_createEmptyAttribute( ) -> None: """Test empty attribute creation.""" componentNames: tuple[ str, str, str ] = ( "d1", "d2", "d3" ) - newAttr: vtkDataArray = vtkFilters.createEmptyAttribute( attributeName, componentNames, dataType ) + newAttr: vtkDataArray = arrayModifiers.createEmptyAttribute( attributeName, componentNames, dataType ) assert newAttr.GetNumberOfComponents() == len( componentNames ) for ax in range( 3 ): @@ -141,8 +115,8 @@ def test_createConstantAttributeMultiBlock( attributeName: str = "testAttributemultiblock" values: tuple[ float, float, float ] = ( 12.4, 10, 40.0 ) componentNames: tuple[ str, str, str ] = ( "X", "Y", "Z" ) - vtkFilters.createConstantAttributeMultiBlock( vtkMultiBlockDataSetTest, values, attributeName, componentNames, - onpoints ) + arrayModifiers.createConstantAttributeMultiBlock( vtkMultiBlockDataSetTest, values, attributeName, componentNames, + onpoints ) iter: vtkDataObjectTreeIterator = vtkDataObjectTreeIterator() iter.SetDataSet( vtkMultiBlockDataSetTest ) @@ -179,7 +153,7 @@ def test_createConstantAttributeDataSet( vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) componentNames: Tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "newAttributedataset" - vtkFilters.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) + arrayModifiers.createConstantAttributeDataSet( vtkDataSetTest, values, attributeName, componentNames, onpoints ) data: Union[ vtkPointData, vtkCellData ] if onpoints: @@ -211,7 +185,7 @@ def test_createAttribute( componentNames: tuple[ str, str, str ] = ( "XX", "YY", "ZZ" ) attributeName: str = "AttributeName" - vtkFilters.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) + arrayModifiers.createAttribute( vtkDataSetTest, arrayTest, attributeName, componentNames, onpoints ) data: Union[ vtkPointData, vtkCellData ] if onpoints: @@ -234,7 +208,7 @@ def test_copyAttribute( dataSetTest: vtkMultiBlockDataSet ) -> None: attributeFrom: str = "CellAttribute" attributeTo: str = "CellAttributeTO" - vtkFilters.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) + arrayModifiers.copyAttribute( objectFrom, objectTo, attributeFrom, attributeTo ) blockIndex: int = 0 blockFrom: vtkDataSet = cast( vtkDataSet, objectFrom.GetBlock( blockIndex ) ) @@ -254,7 +228,7 @@ def test_copyAttributeDataSet( dataSetTest: vtkDataSet, ) -> None: attributNameFrom = "CellAttribute" attributNameTo = "COPYATTRIBUTETO" - vtkFilters.copyAttributeDataSet( objectFrom, objectTo, attributNameFrom, attributNameTo ) + arrayModifiers.copyAttributeDataSet( objectFrom, objectTo, attributNameFrom, attributNameTo ) arrayFrom: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectFrom.GetCellData().GetArray( attributNameFrom ) ) arrayTo: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( objectTo.GetCellData().GetArray( attributNameTo ) ) @@ -274,7 +248,7 @@ def test_renameAttributeMultiblock( """Test renaming attribute in a multiblock dataset.""" vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) newAttributeName: str = "new" + attributeName - vtkFilters.renameAttribute( + arrayModifiers.renameAttribute( vtkMultiBlockDataSetTest, attributeName, newAttributeName, @@ -302,10 +276,10 @@ def test_renameAttributeDataSet( """Test renaming an attribute in a dataset.""" vtkDataSetTest: vtkDataSet = dataSetTest( "dataset" ) newAttributeName: str = "new" + attributeName - vtkFilters.renameAttribute( object=vtkDataSetTest, - attributeName=attributeName, - newAttributeName=newAttributeName, - onPoints=onpoints ) + arrayModifiers.renameAttribute( object=vtkDataSetTest, + attributeName=attributeName, + newAttributeName=newAttributeName, + onPoints=onpoints ) if onpoints: assert vtkDataSetTest.GetPointData().HasArray( attributeName ) == 0 assert vtkDataSetTest.GetPointData().HasArray( newAttributeName ) == 1 diff --git a/geos-mesh/tests/test_generate_fractures.py b/geos-mesh/tests/test_generate_fractures.py index 1a6c1de75..49f9bd82c 100644 --- a/geos-mesh/tests/test_generate_fractures.py +++ b/geos-mesh/tests/test_generate_fractures.py @@ -8,7 +8,7 @@ from geos.mesh.doctor.checks.generate_cube import build_rectilinear_blocks_mesh, XYZ from geos.mesh.doctor.checks.generate_fractures import ( __split_mesh_on_fractures, Options, FracturePolicy, Coordinates3D, IDMapping ) -from geos.mesh.utils.helpers import to_vtk_id_list +from geos.mesh.utils.genericHelpers import to_vtk_id_list FaceNodesCoords = tuple[ tuple[ float ] ] IDMatrix = Sequence[ Sequence[ int ] ] diff --git a/geos-mesh/tests/test_multiblockModifiers.py b/geos-mesh/tests/test_multiblockModifiers.py new file mode 100644 index 000000000..94b0650ef --- /dev/null +++ b/geos-mesh/tests/test_multiblockModifiers.py @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Paloma Martinez +# SPDX-License-Identifier: Apache 2.0 +# ruff: noqa: E402 # disable Module level import not at top of file +import pytest + +from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet, vtkUnstructuredGrid +from geos.mesh.utils import multiblockModifiers + + +# TODO: Add test for keepPartialAttributes = True when function fixed +@pytest.mark.parametrize( + "keepPartialAttributes, expected_point_attributes, expected_cell_attributes", + [ + ( False, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", ) ), + # ( True, ( "GLOBAL_IDS_POINTS", ), ( "GLOBAL_IDS_CELLS", "CELL_MARKERS", "FAULT", "PERM", "PORO" ) ), + ] ) +def test_mergeBlocks( + dataSetTest: vtkMultiBlockDataSet, + expected_point_attributes: tuple[ str, ...], + expected_cell_attributes: tuple[ str, ...], + keepPartialAttributes: bool, +) -> None: + """Test the merging of a multiblock.""" + vtkMultiBlockDataSetTest: vtkMultiBlockDataSet = dataSetTest( "multiblock" ) + dataset: vtkUnstructuredGrid = multiblockModifiers.mergeBlocks( vtkMultiBlockDataSetTest, keepPartialAttributes ) + + assert dataset.GetCellData().GetNumberOfArrays() == len( expected_cell_attributes ) + for c_attribute in expected_cell_attributes: + assert dataset.GetCellData().HasArray( c_attribute ) + + assert dataset.GetPointData().GetNumberOfArrays() == len( expected_point_attributes ) + for p_attribute in expected_point_attributes: + assert dataset.GetPointData().HasArray( p_attribute ) \ No newline at end of file diff --git a/geos-mesh/tests/test_reorient_mesh.py b/geos-mesh/tests/test_reorient_mesh.py index 9e66f3b78..5884d5f77 100644 --- a/geos-mesh/tests/test_reorient_mesh.py +++ b/geos-mesh/tests/test_reorient_mesh.py @@ -6,7 +6,7 @@ from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, VTK_POLYHEDRON from geos.mesh.doctor.checks.reorient_mesh import reorient_mesh from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.utils.helpers import to_vtk_id_list, vtk_iter +from geos.mesh.utils.genericHelpers import to_vtk_id_list, vtk_iter @dataclass( frozen=True ) diff --git a/geos-mesh/tests/test_supported_elements.py b/geos-mesh/tests/test_supported_elements.py index 28f4cd2f8..bb0213c6a 100644 --- a/geos-mesh/tests/test_supported_elements.py +++ b/geos-mesh/tests/test_supported_elements.py @@ -5,7 +5,7 @@ from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, VTK_POLYHEDRON # from geos.mesh.doctor.checks.supported_elements import Options, check, __check from geos.mesh.doctor.checks.vtk_polyhedron import parse_face_stream, FaceStream -from geos.mesh.utils.helpers import to_vtk_id_list +from geos.mesh.utils.genericHelpers import to_vtk_id_list # TODO Update this test to have access to another meshTests file diff --git a/geos-posp/src/PVplugins/PVAttributeMapping.py b/geos-posp/src/PVplugins/PVAttributeMapping.py index d69fa15cf..a862b9a9e 100644 --- a/geos-posp/src/PVplugins/PVAttributeMapping.py +++ b/geos-posp/src/PVplugins/PVAttributeMapping.py @@ -18,8 +18,9 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.AttributeMappingFromCellCoords import ( AttributeMappingFromCellCoords, ) -from geos.mesh.utils.filters import ( fillPartialAttributes, mergeBlocks ) -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayModifiers import fillPartialAttributes +from geos.mesh.utils.multiblockModifiers import mergeBlocks +from geos.mesh.utils.arrayHelpers import ( getAttributeSet, getNumberOfComponents, ) diff --git a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py index 2b2f4f597..8f25df08a 100644 --- a/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py +++ b/geos-posp/src/PVplugins/PVCreateConstantAttributePerRegion.py @@ -19,11 +19,11 @@ import vtkmodules.util.numpy_support as vnp from geos.utils.Logger import Logger, getLogger -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos.mesh.utils.helpers import isAttributeInObject +from geos.mesh.utils.arrayHelpers import isAttributeInObject from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py index 9d0d60ccb..443f5fc3c 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolume.py @@ -24,7 +24,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.utils.filters import ( +from geos.mesh.utils.arrayModifiers import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py index cb86d8b89..9a90cf3b1 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurface.py @@ -25,7 +25,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.utils.filters import ( +from geos.mesh.utils.arrayModifiers import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py index 452db15b5..3d0412835 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeSurfaceWell.py @@ -25,7 +25,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.utils.filters import ( +from geos.mesh.utils.arrayModifiers import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py index a81db2495..fd418b29e 100644 --- a/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py +++ b/geos-posp/src/PVplugins/PVExtractMergeBlocksVolumeWell.py @@ -28,7 +28,7 @@ from geos.utils.Logger import ERROR, INFO, Logger, getLogger from geos_posp.filters.GeosBlockExtractor import GeosBlockExtractor from geos_posp.filters.GeosBlockMerge import GeosBlockMerge -from geos.mesh.utils.filters import ( +from geos.mesh.utils.arrayModifiers import ( copyAttribute, createCellCenterAttribute, ) diff --git a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py index 9a3880fbb..23f81d87a 100644 --- a/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py +++ b/geos-posp/src/PVplugins/PVMergeBlocksEnhanced.py @@ -16,7 +16,7 @@ import PVplugins # noqa: F401 from geos.utils.Logger import Logger, getLogger -from geos.mesh.utils.filters import mergeBlocks +from geos.mesh.utils.multiblockModifiers import mergeBlocks from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy, ) diff --git a/geos-posp/src/PVplugins/PVMohrCirclePlot.py b/geos-posp/src/PVplugins/PVMohrCirclePlot.py index 3c6e4888f..935cf61a4 100644 --- a/geos-posp/src/PVplugins/PVMohrCirclePlot.py +++ b/geos-posp/src/PVplugins/PVMohrCirclePlot.py @@ -43,8 +43,8 @@ DEFAULT_FRICTION_ANGLE_RAD, DEFAULT_ROCK_COHESION, ) -from geos.mesh.utils.helpers import getArrayInObject -from geos.mesh.utils.filters import mergeBlocks +from geos.mesh.utils.arrayHelpers import getArrayInObject +from geos.mesh.utils.multiblockModifiers import mergeBlocks from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) from geos_posp.visu.PVUtils.DisplayOrganizationParaview import ( diff --git a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py index f5330fe7b..0d0b7ed52 100644 --- a/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py +++ b/geos-posp/src/PVplugins/PVSurfaceGeomechanics.py @@ -21,7 +21,7 @@ DEFAULT_ROCK_COHESION, ) from geos_posp.filters.SurfaceGeomechanics import SurfaceGeomechanics -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) diff --git a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py index d7e04b5e0..bbc5c1ad3 100644 --- a/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py +++ b/geos-posp/src/PVplugins/PVTransferAttributesVolumeSurface.py @@ -17,12 +17,12 @@ from geos.utils.Logger import Logger, getLogger from geos_posp.filters.TransferAttributesVolumeSurface import ( TransferAttributesVolumeSurface, ) -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex, ) -from geos.mesh.utils.helpers import getAttributeSet -from geos.mesh.utils.filters import mergeBlocks +from geos.mesh.utils.arrayHelpers import getAttributeSet +from geos.mesh.utils.multiblockModifiers import mergeBlocks from geos_posp.visu.PVUtils.checkboxFunction import ( # type: ignore[attr-defined] createModifiedCallback, ) from geos_posp.visu.PVUtils.paraviewTreatments import getArrayChoices diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py index 8f0229092..7ecee6ddd 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py @@ -22,12 +22,12 @@ vtkUnstructuredGrid, ) -from geos.mesh.utils.filters import ( +from geos.mesh.utils.arrayModifiers import ( computeCellCenterCoordinates, createEmptyAttribute, ) -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayHelpers import ( getVtkArrayInObject, ) __doc__ = """ diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py index a530d5ae4..ceae63135 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellId.py @@ -10,8 +10,8 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid -from geos.mesh.utils.filters import createAttribute -from geos.mesh.utils.helpers import getArrayInObject +from geos.mesh.utils.arrayModifiers import createAttribute +from geos.mesh.utils.arrayHelpers import getArrayInObject __doc__ = """ AttributeMappingFromCellId module is a vtk filter that transfer a attribute from a diff --git a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py index aeb617703..7d0337674 100644 --- a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py +++ b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py @@ -30,8 +30,8 @@ vtkUnstructuredGrid, ) from vtkmodules.vtkFiltersCore import vtkCellCenters -from geos.mesh.utils.filters import createAttribute -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayModifiers import createAttribute +from geos.mesh.utils.genericHelpers import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py index cffc22ea3..7f8e030bd 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockExtractor.py @@ -11,9 +11,9 @@ from vtkmodules.vtkCommonCore import vtkInformation, vtkInformationVector from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( +from geos.mesh.utils.multiblockHelpers import ( getBlockIndexFromName, ) -from geos.mesh.utils.filters import extractBlock +from geos.mesh.utils.multiblockHelpers import extractBlock __doc__ = """ GeosBlockExtractor module is a vtk filter that allows to extract Volume mesh, diff --git a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py index 0b8a421ab..09b0a8798 100644 --- a/geos-posp/src/geos_posp/filters/GeosBlockMerge.py +++ b/geos-posp/src/geos_posp/filters/GeosBlockMerge.py @@ -33,15 +33,11 @@ from vtkmodules.vtkFiltersGeometry import vtkDataSetSurfaceFilter from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane -from geos.mesh.utils.multiblockInspectorTreeFunctions import ( - getElementaryCompositeBlockIndexes, ) -from geos.mesh.utils.helpers import getAttributeSet -from geos.mesh.utils.filters import ( - createConstantAttribute, - extractBlock, - fillAllPartialAttributes, - mergeBlocks, -) +from geos.mesh.utils.multiblockHelpers import getElementaryCompositeBlockIndexes +from geos.mesh.utils.arrayHelpers import getAttributeSet +from geos.mesh.utils.arrayModifiers import createConstantAttribute, fillAllPartialAttributes +from geos.mesh.utils.multiblockHelpers import extractBlock +from geos.mesh.utils.multiblockModifiers import mergeBlocks __doc__ = """ GeosBlockMerge module is a vtk filter that allows to merge Geos ranks, rename diff --git a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py index 01e8d4347..7e50cbf72 100644 --- a/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py +++ b/geos-posp/src/geos_posp/filters/SurfaceGeomechanics.py @@ -33,8 +33,8 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) -from geos.mesh.utils.filters import createAttribute -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayModifiers import createAttribute +from geos.mesh.utils.arrayHelpers import ( getArrayInObject, getAttributeSet, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py index 4d3632773..2640d6250 100644 --- a/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py +++ b/geos-posp/src/geos_posp/filters/TransferAttributesVolumeSurface.py @@ -19,7 +19,7 @@ from vtkmodules.vtkCommonDataModel import vtkPolyData, vtkUnstructuredGrid from geos_posp.filters.VolumeSurfaceMeshMapper import VolumeSurfaceMeshMapper -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayHelpers import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py index 8ae1828f4..9a30cc619 100644 --- a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py +++ b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py @@ -12,9 +12,12 @@ from vtkmodules.vtkCommonCore import vtkDataArray from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) - -import geos.mesh.utils.filters as vtkFilters -import geos.mesh.utils.helpers as vtkHelpers +from geos.mesh.utils.genericHelpers import extractSurfaceFromElevation +from geos.mesh.utils.arrayHelpers import getAttributeValuesAsDF +from geos.mesh.utils.arrayModifiers import ( + transferPointDataToCellData, + computeCellCenterCoordinates, +) __doc__ = r""" This module contains utilities to process meshes using pyvista. @@ -62,14 +65,14 @@ def loadDataSet( assert mergedMesh is not None, "Merged mesh is undefined." # extract data - surface = vtkFilters.extractSurfaceFromElevation( mergedMesh, elevation ) + surface = extractSurfaceFromElevation( mergedMesh, elevation ) # transfer point data to cell center - surface = cast( vtkPolyData, vtkFilters.transferPointDataToCellData( surface ) ) - timeToPropertyMap[ str( time ) ] = vtkHelpers.getAttributeValuesAsDF( surface, properties ) + surface = cast( vtkPolyData, transferPointDataToCellData( surface ) ) + timeToPropertyMap[ str( time ) ] = getAttributeValuesAsDF( surface, properties ) # get cell center coordinates assert surface is not None, "Surface are undefined." - pointsCoords: vtkDataArray = vtkFilters.computeCellCenterCoordinates( surface ) + pointsCoords: vtkDataArray = computeCellCenterCoordinates( surface ) assert pointsCoords is not None, "Cell center are undefined." pointsCoordsNp: npt.NDArray[ np.float64 ] = vnp.vtk_to_numpy( pointsCoords ) return ( timeToPropertyMap, pointsCoordsNp ) @@ -103,4 +106,4 @@ def getBlockByName( multiBlockMesh: Union[ pv.MultiBlock, pv.UnstructuredGrid ], # if mesh is not None, it is the searched one if mesh is not None: break - return mesh + return mesh \ No newline at end of file diff --git a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py index 551075d4e..ee09f7151 100644 --- a/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py +++ b/geos-posp/src/geos_posp/visu/PVUtils/paraviewTreatments.py @@ -32,7 +32,7 @@ vtkUnstructuredGrid, ) -from geos.mesh.utils.helpers import ( +from geos.mesh.utils.arrayHelpers import ( getArrayInObject, isAttributeInObject, ) diff --git a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py index cb45e299a..22965d7b4 100644 --- a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py +++ b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py @@ -20,7 +20,7 @@ from vtkmodules.vtkCommonDataModel import vtkCellLocator, vtkFieldData, vtkImageData, vtkPointData, vtkPointSet from vtkmodules.vtkFiltersCore import vtkExtractCells, vtkResampleWithDataSet from vtkmodules.vtkFiltersExtraction import vtkExtractGrid -from geos.mesh.utils.helpers import getCopyNumpyArrayByName, getNumpyGlobalIdsArray, getNumpyArrayByName +from geos.mesh.utils.arrayHelpers import getCopyNumpyArrayByName, getNumpyGlobalIdsArray, getNumpyArrayByName from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh from geos.pygeos_tools.model.pyevtk_tools import cGlobalIds from geos.utils.errors_handling.classes import required_attributes From 29d3f4f849ebd12d3d95affdbf9fab85bb93c760 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 19 May 2025 11:33:06 +0200 Subject: [PATCH 47/57] Documentation --- docs/geos_mesh_docs/io.rst | 7 +++- docs/geos_mesh_docs/utils.rst | 36 +++++++++++++------ geos-mesh/src/geos/mesh/io/vtkIO.py | 6 ++++ geos-mesh/src/geos/mesh/utils/arrayHelpers.py | 2 +- .../src/geos/mesh/utils/arrayModifiers.py | 2 +- .../src/geos/mesh/utils/multiblockHelpers.py | 4 +-- .../geos/mesh/utils/multiblockModifiers.py | 6 ++-- 7 files changed, 44 insertions(+), 19 deletions(-) diff --git a/docs/geos_mesh_docs/io.rst b/docs/geos_mesh_docs/io.rst index df56d1763..26ece9d38 100644 --- a/docs/geos_mesh_docs/io.rst +++ b/docs/geos_mesh_docs/io.rst @@ -1,7 +1,12 @@ Input/Outputs ^^^^^^^^^^^^^^^^ +`vtkIO` module of `geos-mesh` package contains generic methods to read and write different format of VTK meshes. + geos.mesh.io.vtkIO module -------------------------------------- -In progress +.. automodule:: geos.mesh.io.vtkIO + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/geos_mesh_docs/utils.rst b/docs/geos_mesh_docs/utils.rst index e29a7790f..62c15c72a 100644 --- a/docs/geos_mesh_docs/utils.rst +++ b/docs/geos_mesh_docs/utils.rst @@ -1,29 +1,35 @@ Mesh utilities ^^^^^^^^^^^^^^^^ -The `utils` module of `geos-mesh` package contains utilities and filters for VTK meshes. +The `utils` module of `geos-mesh` package contains different utilities methods for VTK meshes. +geos.mesh.utils.genericHelpers module +-------------------------------------- -geos.mesh.utils.filters module ----------------------------------------- - -.. automodule:: geos.mesh.utils.filters - :members: - :undoc-members: - :show-inheritance: - +.. automodule:: geos.mesh.utils.genericHelpers + :members: + :undoc-members: + :show-inheritance: -geos.mesh.utils.helpers module +geos.mesh.utils.arrayHelpers module -------------------------------------- -.. automodule:: geos.mesh.utils.helpers +.. automodule:: geos.mesh.utils.arrayHelpers :members: :undoc-members: :show-inheritance: +geos.mesh.utils.arrayModifiers module +---------------------------------------- + +.. automodule:: geos.mesh.utils.arrayModifiers + :members: + :undoc-members: + :show-inheritance: + geos.mesh.utils.multiblockHelpers module --------------------------------------------------------------- @@ -33,3 +39,11 @@ geos.mesh.utils.multiblockHelpers module :undoc-members: :show-inheritance: + +geos.mesh.utils.multiblockModifiers module +--------------------------------------------------------------- + +.. automodule:: geos.mesh.utils.multiblockModifiers + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/geos-mesh/src/geos/mesh/io/vtkIO.py b/geos-mesh/src/geos/mesh/io/vtkIO.py index 5d3e36935..e8212bb08 100644 --- a/geos-mesh/src/geos/mesh/io/vtkIO.py +++ b/geos-mesh/src/geos/mesh/io/vtkIO.py @@ -1,3 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Alexandre Benedicto + import os.path import logging from dataclasses import dataclass @@ -8,6 +12,8 @@ vtkXMLStructuredGridReader, vtkXMLPUnstructuredGridReader, vtkXMLPStructuredGridReader, vtkXMLStructuredGridWriter ) +__doc__ = """Input and Ouput methods for VTK meshes.""" + @dataclass( frozen=True ) class VtkOutput: diff --git a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py index b151d8f38..ff526c90b 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -18,7 +18,7 @@ from vtkmodules.vtkFiltersCore import vtkCellCenters from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) -__doc__ = """ Utilities methods to get information on VTK Arrays. """ +__doc__ = """Utilities methods to get information on VTK Arrays.""" def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: diff --git a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py index 06a082578..98ca91424 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py @@ -36,7 +36,7 @@ ) from geos.mesh.utils.multiblockHelpers import getBlockElementIndexesFlatten, getBlockFromFlatIndex -__doc__ = """ Generic utilities to process VTK Arrays objects. """ +__doc__ = """Utilities to process VTK Arrays objects.""" def fillPartialAttributes( diff --git a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py index 0e61dcdc6..e0b702e36 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py @@ -4,10 +4,10 @@ from typing import Union, cast from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObject, vtkDataObjectTreeIterator, - vtkMultiBlockDataSet, vtkUnstructuredGrid ) + vtkMultiBlockDataSet ) from vtkmodules.vtkFiltersExtraction import vtkExtractBlock -__doc__ = """Functions to explore and process VTK multiblock datasets. """ +__doc__ = """Functions to explore VTK multiblock datasets.""" def getBlockName( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ] ) -> str: diff --git a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py index 97ef7ea96..82118461a 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py @@ -1,14 +1,14 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay -from typing import Union, cast +from typing import Union from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObjectTreeIterator, vtkMultiBlockDataSet, vtkUnstructuredGrid ) from vtkmodules.vtkFiltersCore import vtkAppendDataSets from geos.mesh.utils.arrayModifiers import fillAllPartialAttributes -__doc__ = """Function to process VTK multiblock datasets. """ +__doc__ = """Function to merge VTK multiblock datasets. """ # TODO : fix function for keepPartialAttributes = True @@ -44,4 +44,4 @@ def mergeBlocks( af.AddInputData( block ) iter.GoToNextItem() af.Update() - return af.GetOutputDataObject( 0 ) + return af.GetOutputDataObject( 0 ) \ No newline at end of file From c70f35319260241fa46f127f366847bfe08755a7 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Mon, 19 May 2025 13:07:38 +0200 Subject: [PATCH 48/57] Fix doc and yapf for ci --- geos-mesh/src/geos/mesh/io/vtkIO.py | 17 ++++++++++++----- .../filters/AttributeMappingFromCellCoords.py | 10 ++-------- .../geos_posp/filters/GeomechanicsCalculator.py | 2 +- .../src/geos_posp/pyvistaTools/pyvistaUtils.py | 9 +++------ 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/geos-mesh/src/geos/mesh/io/vtkIO.py b/geos-mesh/src/geos/mesh/io/vtkIO.py index e8212bb08..8ef974a10 100644 --- a/geos-mesh/src/geos/mesh/io/vtkIO.py +++ b/geos-mesh/src/geos/mesh/io/vtkIO.py @@ -87,11 +87,18 @@ def __read_pvtu( vtk_input_file: str ) -> Optional[ vtkUnstructuredGrid ]: def read_mesh( vtk_input_file: str ) -> vtkPointSet: - """ - Read the vtk file and builds either an unstructured grid or a structured grid from it. - :param vtk_input_file: The file name. The extension will be used to guess the file format. - If the first guess fails, the other available readers will be tried. - :return: A vtkPointSet. + """Read vtk file and build either an unstructured grid or a structured grid from it. + + Args: + vtk_input_file (str): The file name. Extension will be used to guess file format\ + If first guess fails, other available readers will be tried. + + Raises: + ValueError: Invalid file path error + ValueError: No appropriate reader available for the file format + + Returns: + vtkPointSet: Mesh read """ if not os.path.exists( vtk_input_file ): err_msg: str = f"Invalid file path. Could not read \"{vtk_input_file}\"." diff --git a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py index 7ecee6ddd..5f23d1b66 100644 --- a/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py +++ b/geos-posp/src/geos_posp/filters/AttributeMappingFromCellCoords.py @@ -21,14 +21,8 @@ vtkCellLocator, vtkUnstructuredGrid, ) - -from geos.mesh.utils.arrayModifiers import ( - computeCellCenterCoordinates, - createEmptyAttribute, -) - -from geos.mesh.utils.arrayHelpers import ( - getVtkArrayInObject, ) +from geos.mesh.utils.arrayModifiers import createEmptyAttribute +from geos.mesh.utils.arrayHelpers import ( getVtkArrayInObject, computeCellCenterCoordinates ) __doc__ = """ AttributeMappingFromCellCoords module is a vtk filter that map two identical mesh (or a mesh is diff --git a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py index 7d0337674..fb80122ad 100644 --- a/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py +++ b/geos-posp/src/geos_posp/filters/GeomechanicsCalculator.py @@ -31,7 +31,7 @@ ) from vtkmodules.vtkFiltersCore import vtkCellCenters from geos.mesh.utils.arrayModifiers import createAttribute -from geos.mesh.utils.genericHelpers import ( +from geos.mesh.utils.arrayHelpers import ( getArrayInObject, getComponentNames, isAttributeInObject, diff --git a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py index 9a30cc619..7c17e3ef1 100644 --- a/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py +++ b/geos-posp/src/geos_posp/pyvistaTools/pyvistaUtils.py @@ -13,11 +13,8 @@ from vtkmodules.vtkCommonDataModel import ( vtkPolyData, ) from geos.mesh.utils.genericHelpers import extractSurfaceFromElevation -from geos.mesh.utils.arrayHelpers import getAttributeValuesAsDF -from geos.mesh.utils.arrayModifiers import ( - transferPointDataToCellData, - computeCellCenterCoordinates, -) +from geos.mesh.utils.arrayHelpers import ( getAttributeValuesAsDF, computeCellCenterCoordinates ) +from geos.mesh.utils.arrayModifiers import transferPointDataToCellData __doc__ = r""" This module contains utilities to process meshes using pyvista. @@ -106,4 +103,4 @@ def getBlockByName( multiBlockMesh: Union[ pv.MultiBlock, pv.UnstructuredGrid ], # if mesh is not None, it is the searched one if mesh is not None: break - return mesh \ No newline at end of file + return mesh From 32af612a16fb10f6f063d1ef4043153fa4dbb35e Mon Sep 17 00:00:00 2001 From: alexbenedicto Date: Mon, 19 May 2025 15:59:22 -0700 Subject: [PATCH 49/57] Documentation and formating --- geos-mesh/src/geos/mesh/utils/arrayHelpers.py | 145 ++++++++++++------ .../src/geos/mesh/utils/arrayModifiers.py | 15 +- .../src/geos/mesh/utils/genericHelpers.py | 16 +- .../src/geos/mesh/utils/multiblockHelpers.py | 1 - .../geos/mesh/utils/multiblockModifiers.py | 5 +- 5 files changed, 109 insertions(+), 73 deletions(-) diff --git a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py index ff526c90b..7691908ee 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -1,27 +1,26 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay, Paloma Martinez -from typing import Any -import logging from copy import deepcopy import numpy as np import numpy.typing as npt import pandas as pd # type: ignore[import-untyped] import vtkmodules.util.numpy_support as vnp -from typing import Iterator, Optional, List, Union, cast +from typing import Optional, Union, cast from vtkmodules.util.numpy_support import vtk_to_numpy -from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray +from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray, vtkPoints from vtkmodules.vtkCommonDataModel import ( vtkUnstructuredGrid, vtkFieldData, vtkMultiBlockDataSet, vtkDataSet, vtkCompositeDataSet, vtkDataObject, vtkPointData, vtkCellData, vtkDataObjectTreeIterator, vtkPolyData ) -from vtkmodules.vtkCommonCore import vtkPoints from vtkmodules.vtkFiltersCore import vtkCellCenters from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) +from geos.utils.Logger import getLogger __doc__ = """Utilities methods to get information on VTK Arrays.""" +logger = getLogger( "arrayHelpers" ) -def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) -> bool: +def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: list[ str ] ) -> bool: """Checks if a mesh contains at least a data arrays within its cell, field or point data having a certain name. If so, returns True, else False. @@ -36,24 +35,37 @@ def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: List[ str ] ) cell_data = mesh.GetCellData() for i in range( cell_data.GetNumberOfArrays() ): if cell_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) + logger.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) return True # Check the field data fields field_data = mesh.GetFieldData() for i in range( field_data.GetNumberOfArrays() ): if field_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) + logger.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) return True # Check the point data fields point_data = mesh.GetPointData() for i in range( point_data.GetNumberOfArrays() ): if point_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) + logger.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) return True return False def getFieldType( data: vtkFieldData ) -> str: + """A vtk grid can contain 3 types of field data: + - vtkFieldData (parent class) + - vtkCellData (inheritance of vtkFieldData) + - vtkPointData (inheritance of vtkFieldData) + + The goal is to return whether the data is "vtkFieldData", "vtkCellData" or "vtkPointData". + + Args: + data (vtkFieldData) + + Returns: + str: "vtkFieldData", "vtkCellData" or "vtkPointData" + """ if not data.IsA( "vtkFieldData" ): raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) if data.IsA( "vtkCellData" ): @@ -64,49 +76,92 @@ def getFieldType( data: vtkFieldData ) -> str: return "vtkFieldData" -def getArrayNames( data: vtkFieldData ) -> List[ str ]: +def getArrayNames( data: vtkFieldData ) -> list[ str ]: + """Get the names of all arrays stored in a "vtkFieldData", "vtkCellData" or "vtkPointData". + + Args: + data (vtkFieldData) + + Returns: + list[ str ]: The array names in the order that they are stored in the field data. + """ if not data.IsA( "vtkFieldData" ): raise ValueError( f"data '{data}' entered is not a vtkFieldData object." ) return [ data.GetArrayName( i ) for i in range( data.GetNumberOfArrays() ) ] def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: + """Get the vtkDataArray corresponding to the given name. + + Args: + data (vtkFieldData) + name (str) + + Returns: + Optional[ vtkDataArray ]: The vtkDataArray associated with the name given. None if not found. + """ if data.HasArray( name ): return data.GetArray( name ) - logging.warning( f"No array named '{name}' was found in '{data}'." ) + logger.warning( f"No array named '{name}' was found in '{data}'." ) return None def getCopyArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: - return deepcopy( getArrayByName( data, name ) ) + """Get the copy of a vtkDataArray corresponding to the given name. + Args: + data (vtkFieldData) + name (str) -def getGlobalIdsArray( data: vtkFieldData ) -> Optional[ vtkDataArray ]: - array_names: List[ str ] = getArrayNames( data ) - for name in array_names: - if name.startswith( "Global" ) and name.endswith( "Ids" ): - return getCopyArrayByName( data, name ) - logging.warning( "No GlobalIds array was found." ) + Returns: + Optional[ vtkDataArray ]: The copy of the vtkDataArray associated with the name given. None if not found. + """ + dataArray: Optional[ vtkDataArray ] = getArrayByName( data, name ) + if dataArray is not None: + return deepcopy( dataArray ) return None -def getNumpyGlobalIdsArray( data: vtkFieldData ) -> Optional[ npt.NDArray[ np.int64 ] ]: - return vtk_to_numpy( getGlobalIdsArray( data ) ) +def getNumpyGlobalIdsArray( data: Union[ vtkCellData, vtkPointData ] ) -> Optional[ npt.NDArray[ np.int64 ] ]: + """Get a numpy array of the GlobalIds. + + Args: + data (Union[ vtkCellData, vtkPointData ]) + + Returns: + Optional[ npt.NDArray[ np.int64 ] ]: The numpy array of GlobalIds. + """ + global_ids: Optional[ vtkDataArray ] = data.GetGlobalIds() + if global_ids is None: + logger.warning( "No GlobalIds array was found." ) + return None + return vtk_to_numpy( global_ids ) -def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ Any ]: - arr: Optional[ npt.NDArray[ Any ] ] = vtk_to_numpy( getArrayByName( data, name ) ) - if arr is not None: +def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray ]: + """Get the numpy array of a given vtkDataArray found by its name. + If sorted is selected, this allows the option to reorder the values wrt GlobalIds. If not GlobalIds was found, + no reordering will be perform. + + Args: + data (vtkFieldData) + name (str) + sorted (bool, optional): Sort the output array with the help of GlobalIds. Defaults to False. + + Returns: + Optional[ npt.NDArray ] + """ + dataArray: Optional[ vtkDataArray ] = getArrayByName( data, name ) + if dataArray is not None: + arr: Optional[ npt.NDArray ] = vtk_to_numpy( dataArray ) if sorted: - sortArrayByGlobalIds( data, arr ) + fieldType: str = getFieldType( data ) + if fieldType in [ "vtkCellData", "vtkPointData" ]: + sortArrayByGlobalIds( data, arr ) return arr return None -def getCopyNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray[ Any ] ]: - return deepcopy( getNumpyArrayByName( data, name, sorted=sorted ) ) - - def getAttributeSet( object: Union[ vtkMultiBlockDataSet, vtkDataSet ], onPoints: bool ) -> set[ str ]: """Get the set of all attributes from an object on points or on cells. @@ -198,7 +253,7 @@ def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, on cells. Returns: - dict[str, int]: List of the names of the attributes. + dict[str, int]: list of the names of the attributes. """ attributes: dict[ str, int ] = {} data: Union[ vtkPointData, vtkCellData ] @@ -211,12 +266,12 @@ def getAttributesFromDataSet( object: vtkDataSet, onPoints: bool ) -> dict[ str, sup = "Cell" assert data is not None, f"{sup} data was not recovered." - nbAttributes = data.GetNumberOfArrays() + nbAttributes: int = data.GetNumberOfArrays() for i in range( nbAttributes ): - attributeName = data.GetArrayName( i ) - attribute = data.GetArray( attributeName ) + attributeName: str = data.GetArrayName( i ) + attribute: vtkDataArray = data.GetArray( attributeName ) assert attribute is not None, f"Attribut {attributeName} is null" - nbComponents = attribute.GetNumberOfComponents() + nbComponents: int = attribute.GetNumberOfComponents() attributes[ attributeName ] = nbComponents return attributes @@ -430,7 +485,7 @@ def getComponentNamesDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: """ array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) - componentNames: list[ str ] = [] + componentNames: list[ str ] = list() if array.GetNumberOfComponents() > 1: componentNames += [ array.GetComponentName( i ) for i in range( array.GetNumberOfComponents() ) ] return tuple( componentNames ) @@ -476,19 +531,14 @@ def getAttributeValuesAsDF( surface: vtkPolyData, attributeNames: tuple[ str, .. data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) for attributeName in attributeNames: if not isAttributeInObject( surface, attributeName, False ): - print( f"WARNING: Attribute {attributeName} is not in the mesh." ) + logger.warning( f"Attribute {attributeName} is not in the mesh." ) continue array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) if len( array.shape ) > 1: for i in range( array.shape[ 1 ] ): data[ attributeName + f"_{i}" ] = array[ :, i ] - data.drop( - columns=[ - attributeName, - ], - inplace=True, - ) + data.drop( columns=[ attributeName ], inplace=True ) else: data[ attributeName ] = array return data @@ -509,19 +559,14 @@ def AsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFra data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) for attributeName in attributeNames: if not isAttributeInObject( surface, attributeName, False ): - print( f"WARNING: Attribute {attributeName} is not in the mesh." ) + logger.warning( f"Attribute {attributeName} is not in the mesh." ) continue array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) if len( array.shape ) > 1: for i in range( array.shape[ 1 ] ): data[ attributeName + f"_{i}" ] = array[ :, i ] - data.drop( - columns=[ - attributeName, - ], - inplace=True, - ) + data.drop( columns=[ attributeName ], inplace=True ) else: data[ attributeName ] = array return data @@ -607,7 +652,7 @@ def computeCellCenterCoordinates( mesh: vtkDataSet ) -> vtkDataArray: return pts.GetData() -def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.int64 ] ) -> None: +def sortArrayByGlobalIds( data: Union[ vtkCellData, vtkFieldData ], arr: npt.NDArray[ np.int64 ] ) -> None: """Sort an array following global Ids Args: @@ -618,4 +663,4 @@ def sortArrayByGlobalIds( data: vtkFieldData, arr: npt.NDArray[ np.int64 ] ) -> if globalids is not None: arr = arr[ np.argsort( globalids ) ] else: - logging.warning( "No sorting was performed." ) + logger.warning( "No sorting was performed." ) diff --git a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py index 98ca91424..d95eae50f 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py @@ -1,20 +1,13 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay, Alexandre Benedicto, Paloma Martinez - import numpy as np import numpy.typing as npt -import logging import vtkmodules.util.numpy_support as vnp -from typing import Optional, Union -from vtkmodules.vtkCommonCore import vtkDataArray, vtkDoubleArray +from typing import Union from vtkmodules.vtkCommonDataModel import ( vtkMultiBlockDataSet, vtkDataSet, vtkPointSet, vtkCompositeDataSet, - vtkDataObject, vtkDataObjectTreeIterator, vtkFieldData ) -from vtkmodules.vtkFiltersCore import ( - vtkArrayRename, - vtkCellCenters, - vtkPointDataToCellData, -) + vtkDataObject, vtkDataObjectTreeIterator ) +from vtkmodules.vtkFiltersCore import vtkArrayRename, vtkCellCenters, vtkPointDataToCellData from vtk import ( # type: ignore[import-untyped] VTK_CHAR, VTK_DOUBLE, VTK_FLOAT, VTK_INT, VTK_UNSIGNED_INT, ) @@ -354,7 +347,7 @@ def renameAttribute( bool: True if renaming operation successfully ended. """ if isAttributeInObject( object, attributeName, onPoints ): - dim: int = 0 if onPoints == True else 1 + dim: int = 0 if onPoints else 1 filter = vtkArrayRename() filter.SetInputData( object ) filter.SetArrayName( dim, attributeName, newAttributeName ) diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index 6df864ec5..41b4f9817 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -1,12 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. +# SPDX-FileContributor: Martin Lemay, Paloma Martinez from typing import Any, Iterator, List from vtkmodules.vtkCommonCore import vtkIdList -from vtkmodules.vtkCommonDataModel import ( - vtkUnstructuredGrid, - vtkPolyData, - vtkPlane, -) +from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData, vtkPlane from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter -""" Generic VTK utilities.""" + +__doc__ = """ Generic VTK utilities.""" def to_vtk_id_list( data: List[ int ] ) -> vtkIdList: @@ -29,10 +29,10 @@ def vtk_iter( vtkContainer ) -> Iterator[ Any ]: """ Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins python containers. - + Args: vtkContainer: A vtk container - + Returns: The iterator """ diff --git a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py index e0b702e36..2c20135e3 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py @@ -2,7 +2,6 @@ # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay from typing import Union, cast - from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObject, vtkDataObjectTreeIterator, vtkMultiBlockDataSet ) from vtkmodules.vtkFiltersExtraction import vtkExtractBlock diff --git a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py index 82118461a..a79f256d3 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py @@ -2,13 +2,12 @@ # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay from typing import Union - from vtkmodules.vtkCommonDataModel import ( vtkCompositeDataSet, vtkDataObjectTreeIterator, vtkMultiBlockDataSet, vtkUnstructuredGrid ) from vtkmodules.vtkFiltersCore import vtkAppendDataSets from geos.mesh.utils.arrayModifiers import fillAllPartialAttributes -__doc__ = """Function to merge VTK multiblock datasets. """ +__doc__ = """Function to merge VTK multiblock datasets.""" # TODO : fix function for keepPartialAttributes = True @@ -44,4 +43,4 @@ def mergeBlocks( af.AddInputData( block ) iter.GoToNextItem() af.Update() - return af.GetOutputDataObject( 0 ) \ No newline at end of file + return af.GetOutputDataObject( 0 ) From 923897f29cdb5f385b5fa1ec992c40814b1cc43d Mon Sep 17 00:00:00 2001 From: alexbenedicto Date: Mon, 19 May 2025 17:31:51 -0700 Subject: [PATCH 50/57] Fix import errors --- geos-mesh/src/geos/mesh/utils/arrayHelpers.py | 19 +++++++++---------- .../src/geos/pygeos_tools/mesh/VtkMesh.py | 11 +++-------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py index 7691908ee..a51bd85e0 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -2,6 +2,7 @@ # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay, Paloma Martinez from copy import deepcopy +import logging import numpy as np import numpy.typing as npt import pandas as pd # type: ignore[import-untyped] @@ -14,10 +15,8 @@ vtkDataObjectTreeIterator, vtkPolyData ) from vtkmodules.vtkFiltersCore import vtkCellCenters from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) -from geos.utils.Logger import getLogger __doc__ = """Utilities methods to get information on VTK Arrays.""" -logger = getLogger( "arrayHelpers" ) def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: list[ str ] ) -> bool: @@ -35,19 +34,19 @@ def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: list[ str ] ) cell_data = mesh.GetCellData() for i in range( cell_data.GetNumberOfArrays() ): if cell_data.GetArrayName( i ) in invalid_fields: - logger.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) + logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) return True # Check the field data fields field_data = mesh.GetFieldData() for i in range( field_data.GetNumberOfArrays() ): if field_data.GetArrayName( i ) in invalid_fields: - logger.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) + logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) return True # Check the point data fields point_data = mesh.GetPointData() for i in range( point_data.GetNumberOfArrays() ): if point_data.GetArrayName( i ) in invalid_fields: - logger.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) + logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) return True return False @@ -102,7 +101,7 @@ def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: """ if data.HasArray( name ): return data.GetArray( name ) - logger.warning( f"No array named '{name}' was found in '{data}'." ) + logging.warning( f"No array named '{name}' was found in '{data}'." ) return None @@ -133,7 +132,7 @@ def getNumpyGlobalIdsArray( data: Union[ vtkCellData, vtkPointData ] ) -> Option """ global_ids: Optional[ vtkDataArray ] = data.GetGlobalIds() if global_ids is None: - logger.warning( "No GlobalIds array was found." ) + logging.warning( "No GlobalIds array was found." ) return None return vtk_to_numpy( global_ids ) @@ -531,7 +530,7 @@ def getAttributeValuesAsDF( surface: vtkPolyData, attributeNames: tuple[ str, .. data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) for attributeName in attributeNames: if not isAttributeInObject( surface, attributeName, False ): - logger.warning( f"Attribute {attributeName} is not in the mesh." ) + logging.warning( f"Attribute {attributeName} is not in the mesh." ) continue array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) @@ -559,7 +558,7 @@ def AsDF( surface: vtkPolyData, attributeNames: tuple[ str, ...] ) -> pd.DataFra data: pd.DataFrame = pd.DataFrame( np.full( ( nbRows, len( attributeNames ) ), np.nan ), columns=attributeNames ) for attributeName in attributeNames: if not isAttributeInObject( surface, attributeName, False ): - logger.warning( f"Attribute {attributeName} is not in the mesh." ) + logging.warning( f"Attribute {attributeName} is not in the mesh." ) continue array: npt.NDArray[ np.float64 ] = getArrayInObject( surface, attributeName, False ) @@ -663,4 +662,4 @@ def sortArrayByGlobalIds( data: Union[ vtkCellData, vtkFieldData ], arr: npt.NDA if globalids is not None: arr = arr[ np.argsort( globalids ) ] else: - logger.warning( "No sorting was performed." ) + logging.warning( "No sorting was performed." ) diff --git a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py index 22965d7b4..67ce1a889 100644 --- a/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py +++ b/pygeos-tools/src/geos/pygeos_tools/mesh/VtkMesh.py @@ -20,7 +20,7 @@ from vtkmodules.vtkCommonDataModel import vtkCellLocator, vtkFieldData, vtkImageData, vtkPointData, vtkPointSet from vtkmodules.vtkFiltersCore import vtkExtractCells, vtkResampleWithDataSet from vtkmodules.vtkFiltersExtraction import vtkExtractGrid -from geos.mesh.utils.arrayHelpers import getCopyNumpyArrayByName, getNumpyGlobalIdsArray, getNumpyArrayByName +from geos.mesh.utils.arrayHelpers import getNumpyArrayByName, getNumpyGlobalIdsArray from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh from geos.pygeos_tools.model.pyevtk_tools import cGlobalIds from geos.utils.errors_handling.classes import required_attributes @@ -175,7 +175,7 @@ def extractMesh( self: Self, Accessors """ - def getArray( self: Self, name: str, dtype: str = "cell", copy: bool = False, sorted: bool = False ) -> npt.NDArray: + def getArray( self: Self, name: str, dtype: str = "cell", sorted: bool = False ) -> npt.NDArray: """ Return a cell or point data array. If the file is a pvtu, the array is sorted with global ids @@ -185,8 +185,6 @@ def getArray( self: Self, name: str, dtype: str = "cell", copy: bool = False, so Name of the vtk cell/point data array dtype : str Type of vtk data `cell` or `point` - copy : bool - Return a copy of the requested array. Default is False sorted : bool Return the array sorted with respect to GlobalPointIds or GlobalCellIds. Default is False @@ -197,10 +195,7 @@ def getArray( self: Self, name: str, dtype: str = "cell", copy: bool = False, so """ assert dtype.lower() in ( "cell", "point" ) fdata = self.getCellData() if dtype.lower() == "cell" else self.getPointData() - if copy: - array = getCopyNumpyArrayByName( fdata, name, sorted=sorted ) - else: - array = getNumpyArrayByName( fdata, name, sorted=sorted ) + array = getNumpyArrayByName( fdata, name, sorted=sorted ) return array def getBounds( self: Self ) -> Iterable[ float ]: From 8c9d934b79451df0a008d2e5d06326b9664fb108 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 21 May 2025 15:25:23 +0200 Subject: [PATCH 51/57] typo --- geos-pv/src/PVplugins/PVSplitMesh.py | 2 +- geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/geos-pv/src/PVplugins/PVSplitMesh.py b/geos-pv/src/PVplugins/PVSplitMesh.py index 8f1a6ae9d..3d86b0bdc 100644 --- a/geos-pv/src/PVplugins/PVSplitMesh.py +++ b/geos-pv/src/PVplugins/PVSplitMesh.py @@ -48,7 +48,7 @@ def __init__(self:Self) ->None: """Split mesh cells.""" super().__init__() - def applyVtkFlilter( + def applyVtkFilter( self: Self, input: vtkPointSet, ) -> vtkPointSet: diff --git a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py index 80129d559..23303b950 100644 --- a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py +++ b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py @@ -73,7 +73,7 @@ def RequestData( assert inputMesh is not None, "Input server mesh is null." assert outputMesh is not None, "Output pipeline is null." - tmpMesh = self.applyVtkFlilter(inputMesh) + tmpMesh = self.applyVtkFilter(inputMesh) assert tmpMesh is not None, "Output mesh is null." outputMesh.ShallowCopy(tmpMesh) print("Filter was successfully applied.") @@ -82,7 +82,7 @@ def RequestData( return 0 return 1 - def applyVtkFlilter( + def applyVtkFilter( self: Self, input: Any, ) -> Any: From 7e65787e56146246254c432e0601723389ab9b51 Mon Sep 17 00:00:00 2001 From: Paloma Martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Wed, 21 May 2025 16:19:32 +0200 Subject: [PATCH 52/57] Adding more documentation --- geos-mesh/src/geos/mesh/io/vtkIO.py | 26 +++++++++++++------ geos-mesh/src/geos/mesh/utils/arrayHelpers.py | 9 ++++++- .../src/geos/mesh/utils/arrayModifiers.py | 9 ++++++- .../src/geos/mesh/utils/genericHelpers.py | 9 ++++++- .../src/geos/mesh/utils/multiblockHelpers.py | 8 +++++- .../geos/mesh/utils/multiblockModifiers.py | 2 +- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/geos-mesh/src/geos/mesh/io/vtkIO.py b/geos-mesh/src/geos/mesh/io/vtkIO.py index 8ef974a10..aa4e40153 100644 --- a/geos-mesh/src/geos/mesh/io/vtkIO.py +++ b/geos-mesh/src/geos/mesh/io/vtkIO.py @@ -12,7 +12,11 @@ vtkXMLStructuredGridReader, vtkXMLPUnstructuredGridReader, vtkXMLPStructuredGridReader, vtkXMLStructuredGridWriter ) -__doc__ = """Input and Ouput methods for VTK meshes.""" +__doc__ = """ +Input and Ouput methods for VTK meshes: + - VTK, VTU, VTS, PVTU, PVTS readers + - VTK, VTS, VTU writers +""" @dataclass( frozen=True ) @@ -155,14 +159,20 @@ def __write_vtu( mesh: vtkUnstructuredGrid, output: str, toBinary: bool = False def write_mesh( mesh: vtkPointSet, vtk_output: VtkOutput, canOverwrite: bool = False ) -> int: - """ - Writes the mesh to disk. - Nothing will be done if the file already exists. - :param mesh: The grid to write. - :param vtk_output: Where to write. The file extension will be used to select the VTK file format. - :return: 0 in case of success. - """ + """Write mesh to disk. + Nothing is done if file already exists. + + Args: + mesh (vtkPointSet): Grid to write + vtk_output (VtkOutput): File path. File extension will be used to select VTK file format + canOverwrite (bool, optional): Authorize overwriting the file. Defaults to False. + Raises: + ValueError: Invalid VTK format. + + Returns: + int: 0 if success + """ if os.path.exists( vtk_output.output ) and canOverwrite: logging.error( f"File \"{vtk_output.output}\" already exists, nothing done." ) return 1 diff --git a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py index a51bd85e0..2ca957fa2 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -16,7 +16,14 @@ from vtkmodules.vtkFiltersCore import vtkCellCenters from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) -__doc__ = """Utilities methods to get information on VTK Arrays.""" +__doc__ = """ +ArrayHelpers module contains several utilities methods to get information on arrays in VTK datasets. + +These methods include: + - array getters, with conversion into numpy array or pandas dataframe + - boolean functions to check whether an array is present in the dataset + - bounds getter for vtu and multiblock datasets +""" def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: list[ str ] ) -> bool: diff --git a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py index d95eae50f..6d9a738c8 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayModifiers.py @@ -29,7 +29,14 @@ ) from geos.mesh.utils.multiblockHelpers import getBlockElementIndexesFlatten, getBlockFromFlatIndex -__doc__ = """Utilities to process VTK Arrays objects.""" +__doc__ = """ +ArrayModifiers contains utilities to process VTK Arrays objects. + +These methods include: + - filling partial VTK arrays with nan values (useful for block merge) + - creation of new VTK array, empty or with a given data array + - transfer from VTK point data to VTK cell data +""" def fillPartialAttributes( diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index 41b4f9817..27005395e 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -6,7 +6,14 @@ from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData, vtkPlane from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter -__doc__ = """ Generic VTK utilities.""" +__doc__ = """ +Generic VTK utilities. + +These methods include: + - extraction of a surface from a given elevation + - conversion from a list to vtkIdList + - conversion of vtk container into iterable +""" def to_vtk_id_list( data: List[ int ] ) -> vtkIdList: diff --git a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py index 2c20135e3..ac060f5b7 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockHelpers.py @@ -6,7 +6,13 @@ vtkMultiBlockDataSet ) from vtkmodules.vtkFiltersExtraction import vtkExtractBlock -__doc__ = """Functions to explore VTK multiblock datasets.""" +__doc__ = """ +Functions to explore VTK multiblock datasets. + +Methods include: + - getters for blocks names and indexes + - block extractor +""" def getBlockName( input: Union[ vtkMultiBlockDataSet, vtkCompositeDataSet ] ) -> str: diff --git a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py index a79f256d3..ebbf21008 100644 --- a/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py +++ b/geos-mesh/src/geos/mesh/utils/multiblockModifiers.py @@ -7,7 +7,7 @@ from vtkmodules.vtkFiltersCore import vtkAppendDataSets from geos.mesh.utils.arrayModifiers import fillAllPartialAttributes -__doc__ = """Function to merge VTK multiblock datasets.""" +__doc__ = """Contains a method to merge blocks of a VTK multiblock dataset.""" # TODO : fix function for keepPartialAttributes = True From 2ff6fda156b982917439fc155486d6cf6768d935 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 21 May 2025 16:32:58 +0200 Subject: [PATCH 53/57] documentation + typing, liniting, formating --- docs/geos_mesh_docs/model.rst | 13 +++ docs/geos_mesh_docs/modules.rst | 6 ++ docs/geos_mesh_docs/processing.rst | 13 +++ docs/geos_mesh_docs/stats.rst | 13 +++ docs/geos_mesh_docs/utils.rst | 2 +- .../mesh/doctor/checks/generate_fractures.py | 4 +- .../src/geos/mesh/model/CellTypeCounts.py | 2 +- .../src/geos/mesh/processing/SplitMesh.py | 1 + .../src/geos/mesh/stats/CellTypeCounter.py | 1 + geos-mesh/src/geos/mesh/utils/arrayHelpers.py | 79 ++++++++----------- .../src/geos/mesh/utils/genericHelpers.py | 16 ++-- geos-pv/src/PVplugins/PVCellTypeCounter.py | 51 ++++++------ geos-pv/src/PVplugins/PVSplitMesh.py | 14 ++-- .../pv/utils/AbstractPVPluginVtkWrapper.py | 32 ++++---- 14 files changed, 141 insertions(+), 106 deletions(-) create mode 100644 docs/geos_mesh_docs/model.rst create mode 100644 docs/geos_mesh_docs/processing.rst create mode 100644 docs/geos_mesh_docs/stats.rst diff --git a/docs/geos_mesh_docs/model.rst b/docs/geos_mesh_docs/model.rst new file mode 100644 index 000000000..ead57332d --- /dev/null +++ b/docs/geos_mesh_docs/model.rst @@ -0,0 +1,13 @@ +Model +^^^^^^^ + +The `model` module of `geos-mesh` package contains data model. + + +geos.mesh.model.CellTypeCounts filter +-------------------------------------- + +.. automodule:: geos.mesh.model.CellTypeCounts + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/geos_mesh_docs/modules.rst b/docs/geos_mesh_docs/modules.rst index fa6a3558f..4e13c7119 100644 --- a/docs/geos_mesh_docs/modules.rst +++ b/docs/geos_mesh_docs/modules.rst @@ -11,4 +11,10 @@ GEOS Mesh tools io + model + + processing + + stats + utils \ No newline at end of file diff --git a/docs/geos_mesh_docs/processing.rst b/docs/geos_mesh_docs/processing.rst new file mode 100644 index 000000000..d79db6db1 --- /dev/null +++ b/docs/geos_mesh_docs/processing.rst @@ -0,0 +1,13 @@ +Processing filters +^^^^^^^^^^^^^^^^^^^ + +The `processing` module of `geos-mesh` package contains filters to process meshes. + + +geos.mesh.processing.SplitMesh filter +-------------------------------------- + +.. automodule:: geos.mesh.processing.SplitMesh + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/geos_mesh_docs/stats.rst b/docs/geos_mesh_docs/stats.rst new file mode 100644 index 000000000..50664514a --- /dev/null +++ b/docs/geos_mesh_docs/stats.rst @@ -0,0 +1,13 @@ +Mesh stats tools +^^^^^^^^^^^^^^^^ + +The `stats` module of `geos-mesh` package contains filter to compute statistics on meshes. + + +geos.mesh.stats.CellTypeCounter filter +-------------------------------------- + +.. automodule:: geos.mesh.stats.CellTypeCounter + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/geos_mesh_docs/utils.rst b/docs/geos_mesh_docs/utils.rst index 62c15c72a..31f83c3fc 100644 --- a/docs/geos_mesh_docs/utils.rst +++ b/docs/geos_mesh_docs/utils.rst @@ -1,7 +1,7 @@ Mesh utilities ^^^^^^^^^^^^^^^^ -The `utils` module of `geos-mesh` package contains different utilities methods for VTK meshes. +The `utils` module of `geos-mesh` package contains various utilities for VTK meshes. geos.mesh.utils.genericHelpers module diff --git a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py index 08454e78f..1fabe4ca8 100644 --- a/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py +++ b/geos-mesh/src/geos/mesh/doctor/checks/generate_fractures.py @@ -13,7 +13,7 @@ from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy from vtkmodules.util.vtkConstants import VTK_ID_TYPE from geos.mesh.doctor.checks.vtk_polyhedron import FaceStream -from geos.mesh.utils.arrayHelpers import has_invalid_field +from geos.mesh.utils.arrayHelpers import has_array from geos.mesh.utils.genericHelpers import to_vtk_id_list, vtk_iter from geos.mesh.io.vtkIO import VtkOutput, read_mesh, write_mesh """ @@ -558,7 +558,7 @@ def check( vtk_input_file: str, options: Options ) -> Result: try: mesh = read_mesh( vtk_input_file ) # Mesh cannot contain global ids before splitting. - if has_invalid_arrays( mesh, [ "GLOBAL_IDS_POINTS", "GLOBAL_IDS_CELLS" ] ): + if has_array( mesh, [ "GLOBAL_IDS_POINTS", "GLOBAL_IDS_CELLS" ] ): err_msg: str = ( "The mesh cannot contain global ids for neither cells nor points. The correct procedure " + " is to split the mesh and then generate global ids for new split meshes." ) logging.error( err_msg ) diff --git a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py index 534ba192d..bab12085f 100644 --- a/geos-mesh/src/geos/mesh/model/CellTypeCounts.py +++ b/geos-mesh/src/geos/mesh/model/CellTypeCounts.py @@ -27,7 +27,7 @@ def __str__( self: Self ) -> str: """ return self.print() - def __add__( self: Self, other: Self ) -> Self: + def __add__( self: Self, other: Self ) -> 'CellTypeCounts': """Addition operator. CellTypeCounts addition consists in suming counts. diff --git a/geos-mesh/src/geos/mesh/processing/SplitMesh.py b/geos-mesh/src/geos/mesh/processing/SplitMesh.py index aaded7b5b..95a219bc1 100644 --- a/geos-mesh/src/geos/mesh/processing/SplitMesh.py +++ b/geos-mesh/src/geos/mesh/processing/SplitMesh.py @@ -82,6 +82,7 @@ def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> i """ if port == 0: info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) + return 1 def RequestDataObject( self: Self, diff --git a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py index 2036ebbb7..749432d73 100644 --- a/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py +++ b/geos-mesh/src/geos/mesh/stats/CellTypeCounter.py @@ -57,6 +57,7 @@ def FillInputPortInformation( self: Self, port: int, info: vtkInformation ) -> i """ if port == 0: info.Set( self.INPUT_REQUIRED_DATA_TYPE(), "vtkUnstructuredGrid" ) + return 1 def RequestData( self: Self, diff --git a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py index a51bd85e0..c63cc99d5 100644 --- a/geos-mesh/src/geos/mesh/utils/arrayHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/arrayHelpers.py @@ -19,48 +19,38 @@ __doc__ = """Utilities methods to get information on VTK Arrays.""" -def has_invalid_field( mesh: vtkUnstructuredGrid, invalid_fields: list[ str ] ) -> bool: - """Checks if a mesh contains at least a data arrays within its cell, field or point data - having a certain name. If so, returns True, else False. +def has_array( mesh: vtkUnstructuredGrid, array_names: list[ str ] ) -> bool: + """Checks if input mesh contains at least one of input data arrays. Args: mesh (vtkUnstructuredGrid): An unstructured mesh. - invalid_fields (list[str]): Field name of an array in any data from the data. + array_names (list[str]): List of array names. Returns: - bool: True if one field found, else False. + bool: True if at least one array is found, else False. """ # Check the cell data fields - cell_data = mesh.GetCellData() - for i in range( cell_data.GetNumberOfArrays() ): - if cell_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid cell field name '{cell_data.GetArrayName( i )}'." ) - return True - # Check the field data fields - field_data = mesh.GetFieldData() - for i in range( field_data.GetNumberOfArrays() ): - if field_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid field name '{field_data.GetArrayName( i )}'." ) - return True - # Check the point data fields - point_data = mesh.GetPointData() - for i in range( point_data.GetNumberOfArrays() ): - if point_data.GetArrayName( i ) in invalid_fields: - logging.error( f"The mesh contains an invalid point field name '{point_data.GetArrayName( i )}'." ) - return True + data: vtkFieldData | None + for data in ( mesh.GetCellData(), mesh.GetFieldData(), mesh.GetPointData() ): + if data is None: + continue # type: ignore[unreachable] + for arrayName in array_names: + if data.HasArray( arrayName ): + logging.error( f"The mesh contains the array named '{arrayName}'." ) + return True return False def getFieldType( data: vtkFieldData ) -> str: - """A vtk grid can contain 3 types of field data: + """Returns whether the data is "vtkFieldData", "vtkCellData" or "vtkPointData". + + A vtk mesh can contain 3 types of field data: - vtkFieldData (parent class) - vtkCellData (inheritance of vtkFieldData) - vtkPointData (inheritance of vtkFieldData) - The goal is to return whether the data is "vtkFieldData", "vtkCellData" or "vtkPointData". - Args: - data (vtkFieldData) + data (vtkFieldData): vtk field data Returns: str: "vtkFieldData", "vtkCellData" or "vtkPointData" @@ -79,7 +69,7 @@ def getArrayNames( data: vtkFieldData ) -> list[ str ]: """Get the names of all arrays stored in a "vtkFieldData", "vtkCellData" or "vtkPointData". Args: - data (vtkFieldData) + data (vtkFieldData): vtk field data Returns: list[ str ]: The array names in the order that they are stored in the field data. @@ -93,8 +83,8 @@ def getArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArray ]: """Get the vtkDataArray corresponding to the given name. Args: - data (vtkFieldData) - name (str) + data (vtkFieldData): vtk field data + name (str): array name Returns: Optional[ vtkDataArray ]: The vtkDataArray associated with the name given. None if not found. @@ -109,8 +99,8 @@ def getCopyArrayByName( data: vtkFieldData, name: str ) -> Optional[ vtkDataArra """Get the copy of a vtkDataArray corresponding to the given name. Args: - data (vtkFieldData) - name (str) + data (vtkFieldData): vtk field data + name (str): array name Returns: Optional[ vtkDataArray ]: The copy of the vtkDataArray associated with the name given. None if not found. @@ -125,7 +115,7 @@ def getNumpyGlobalIdsArray( data: Union[ vtkCellData, vtkPointData ] ) -> Option """Get a numpy array of the GlobalIds. Args: - data (Union[ vtkCellData, vtkPointData ]) + data (Union[ vtkCellData, vtkPointData ]): Cell or point array. Returns: Optional[ npt.NDArray[ np.int64 ] ]: The numpy array of GlobalIds. @@ -137,26 +127,25 @@ def getNumpyGlobalIdsArray( data: Union[ vtkCellData, vtkPointData ] ) -> Option return vtk_to_numpy( global_ids ) -def getNumpyArrayByName( data: vtkFieldData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray ]: +def getNumpyArrayByName( data: vtkCellData | vtkPointData, name: str, sorted: bool = False ) -> Optional[ npt.NDArray ]: """Get the numpy array of a given vtkDataArray found by its name. + If sorted is selected, this allows the option to reorder the values wrt GlobalIds. If not GlobalIds was found, no reordering will be perform. Args: - data (vtkFieldData) - name (str) + data (vtkCellData | vtkPointData): vtk field data. + name (str): Array name to sort sorted (bool, optional): Sort the output array with the help of GlobalIds. Defaults to False. Returns: - Optional[ npt.NDArray ] + Optional[ npt.NDArray ]: Sorted array """ dataArray: Optional[ vtkDataArray ] = getArrayByName( data, name ) if dataArray is not None: - arr: Optional[ npt.NDArray ] = vtk_to_numpy( dataArray ) - if sorted: - fieldType: str = getFieldType( data ) - if fieldType in [ "vtkCellData", "vtkPointData" ]: - sortArrayByGlobalIds( data, arr ) + arr: npt.NDArray[ np.float64 ] = vtk_to_numpy( dataArray ) + if sorted and ( data.IsA( "vtkCellData" ) or data.IsA( "vtkPointData" ) ): + sortArrayByGlobalIds( data, arr ) return arr return None @@ -484,7 +473,7 @@ def getComponentNamesDataSet( dataSet: vtkDataSet, attributeName: str, onPoints: """ array: vtkDoubleArray = getVtkArrayInObject( dataSet, attributeName, onPoints ) - componentNames: list[ str ] = list() + componentNames: list[ str ] = [] if array.GetNumberOfComponents() > 1: componentNames += [ array.GetComponentName( i ) for i in range( array.GetNumberOfComponents() ) ] return tuple( componentNames ) @@ -651,12 +640,12 @@ def computeCellCenterCoordinates( mesh: vtkDataSet ) -> vtkDataArray: return pts.GetData() -def sortArrayByGlobalIds( data: Union[ vtkCellData, vtkFieldData ], arr: npt.NDArray[ np.int64 ] ) -> None: - """Sort an array following global Ids +def sortArrayByGlobalIds( data: Union[ vtkCellData, vtkPointData ], arr: npt.NDArray[ np.float64 ] ) -> None: + """Sort an array following global Ids. Args: data (vtkFieldData): Global Ids array - arr (npt.NDArray[ np.int64 ]): Array to sort + arr (npt.NDArray[ np.float64 ]): Array to sort """ globalids: Optional[ npt.NDArray[ np.int64 ] ] = getNumpyGlobalIdsArray( data ) if globalids is not None: diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index 41b4f9817..b10355a7e 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -3,7 +3,7 @@ # SPDX-FileContributor: Martin Lemay, Paloma Martinez from typing import Any, Iterator, List from vtkmodules.vtkCommonCore import vtkIdList -from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData, vtkPlane +from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData, vtkPlane, vtkCellTypes from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter __doc__ = """ Generic VTK utilities.""" @@ -25,21 +25,19 @@ def to_vtk_id_list( data: List[ int ] ) -> vtkIdList: return result -def vtk_iter( vtkContainer ) -> Iterator[ Any ]: - """ - Utility function transforming a vtk "container" (e.g. vtkIdList) into an iterable to be used for building built-ins - python containers. +def vtk_iter( vtkContainer: vtkIdList | vtkCellTypes ) -> Iterator[ Any ]: + """Utility function transforming a vtk "container" into an iterable. Args: - vtkContainer: A vtk container + vtkContainer (vtkIdList | vtkCellTypes): A vtk container Returns: - The iterator + Iterator[ Any ]: The iterator """ - if hasattr( vtkContainer, "GetNumberOfIds" ): + if isinstance( vtkContainer, vtkIdList ): for i in range( vtkContainer.GetNumberOfIds() ): yield vtkContainer.GetId( i ) - elif hasattr( vtkContainer, "GetNumberOfTypes" ): + elif isinstance( vtkContainer, vtkCellTypes ): for i in range( vtkContainer.GetNumberOfTypes() ): yield vtkContainer.GetCellType( i ) diff --git a/geos-pv/src/PVplugins/PVCellTypeCounter.py b/geos-pv/src/PVplugins/PVCellTypeCounter.py index eca9f3c06..fb465d861 100644 --- a/geos-pv/src/PVplugins/PVCellTypeCounter.py +++ b/geos-pv/src/PVplugins/PVCellTypeCounter.py @@ -5,28 +5,25 @@ import sys from pathlib import Path from typing_extensions import Self +from typing import Optional from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] - VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy -) + VTKPythonAlgorithmBase, smdomain, smhint, smproperty, smproxy ) from vtkmodules.vtkCommonCore import ( vtkInformation, vtkInformationVector, - vtkDoubleArray, ) from vtkmodules.vtkCommonDataModel import ( vtkPointSet, vtkTable, - vtkCellTypes, - vtkUnstructuredGrid, - vtkMultiBlockDataSet, ) # update sys.path to load all GEOS Python Package dependencies geos_pv_path: Path = Path( __file__ ).parent.parent.parent sys.path.insert( 0, str( geos_pv_path / "src" ) ) from geos.pv.utils.config import update_paths + update_paths() from geos.mesh.stats.CellTypeCounter import CellTypeCounter @@ -43,20 +40,22 @@ """ + @smproxy.filter( name="PVCellTypeCounter", label="Cell Type Counter" ) @smhint.xml( '' ) @smproperty.input( name="Input", port_index=0 ) @smdomain.datatype( - dataTypes=[ "vtkUnstructuredGrid"], + dataTypes=[ "vtkUnstructuredGrid" ], composite_data_supported=True, ) -class PVCellTypeCounter(VTKPythonAlgorithmBase): - def __init__(self:Self) ->None: +class PVCellTypeCounter( VTKPythonAlgorithmBase ): + + def __init__( self: Self ) -> None: """Merge collocated points.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkTable") + super().__init__( nInputPorts=1, nOutputPorts=1, outputType="vtkTable" ) - self._filename = None - self._saveToFile = True + self._filename: Optional[ str ] = None + self._saveToFile: bool = True # used to concatenate results if vtkMultiBlockDataSet self._countsAll: CellTypeCounts = CellTypeCounts() @@ -72,7 +71,7 @@ def __init__(self:Self) ->None: Specify if mesh statistics are dumped into a file. """ ) - def SetSaveToFile( self: Self, saveToFile: bool) -> None: + def SetSaveToFile( self: Self, saveToFile: bool ) -> None: """Setter to save the stats into a file. Args: @@ -82,7 +81,7 @@ def SetSaveToFile( self: Self, saveToFile: bool) -> None: self._saveToFile = saveToFile self.Modified() - @smproperty.stringvector(name="FilePath", label="File Path") + @smproperty.stringvector( name="FilePath", label="File Path" ) @smdomain.xml( """ Output file path. @@ -90,8 +89,8 @@ def SetSaveToFile( self: Self, saveToFile: bool) -> None: - """) - def SetFileName(self: Self, fname :str) -> None: + """ ) + def SetFileName( self: Self, fname: str ) -> None: """Specify filename for the filter to write. Args: @@ -134,27 +133,27 @@ def RequestData( int: 1 if calculation successfully ended, 0 otherwise. """ inputMesh: vtkPointSet = self.GetInputData( inInfoVec, 0, 0 ) - outputTable: vtkTable = vtkTable.GetData(outInfoVec, 0) + outputTable: vtkTable = vtkTable.GetData( outInfoVec, 0 ) assert inputMesh is not None, "Input server mesh is null." assert outputTable is not None, "Output pipeline is null." filter: CellTypeCounter = CellTypeCounter() - filter.SetInputDataObject(inputMesh) + filter.SetInputDataObject( inputMesh ) filter.Update() - outputTable.ShallowCopy(filter.GetOutputDataObject(0)) + outputTable.ShallowCopy( filter.GetOutputDataObject( 0 ) ) # print counts in Output Messages view counts: CellTypeCounts = filter.GetCellTypeCounts() - print(counts.print()) + print( counts.print() ) self._countsAll += counts # save to file if asked - if self._saveToFile: + if self._saveToFile and self._filename is not None: try: - with open(self._filename, 'w') as fout: - fout.write(self._countsAll.print()) - print(f"File {self._filename} was successfully written.") + with open( self._filename, 'w' ) as fout: + fout.write( self._countsAll.print() ) + print( f"File {self._filename} was successfully written." ) except Exception as e: - print("Error while exporting the file due to:") - print(str(e)) + print( "Error while exporting the file due to:" ) + print( str( e ) ) return 1 diff --git a/geos-pv/src/PVplugins/PVSplitMesh.py b/geos-pv/src/PVplugins/PVSplitMesh.py index 3d86b0bdc..673f790e7 100644 --- a/geos-pv/src/PVplugins/PVSplitMesh.py +++ b/geos-pv/src/PVplugins/PVSplitMesh.py @@ -11,13 +11,13 @@ ) from vtkmodules.vtkCommonDataModel import ( - vtkPointSet, -) + vtkPointSet, ) # update sys.path to load all GEOS Python Package dependencies geos_pv_path: Path = Path( __file__ ).parent.parent.parent sys.path.insert( 0, str( geos_pv_path / "src" ) ) from geos.pv.utils.config import update_paths + update_paths() from geos.mesh.processing.SplitMesh import SplitMesh @@ -36,6 +36,7 @@ """ + @smproxy.filter( name="PVSplitMesh", label="Split Mesh" ) @smhint.xml( '' ) @smproperty.input( name="Input", port_index=0 ) @@ -43,8 +44,9 @@ dataTypes=[ "vtkPointSet" ], composite_data_supported=True, ) -class PVSplitMesh(AbstractPVPluginVtkWrapper): - def __init__(self:Self) ->None: +class PVSplitMesh( AbstractPVPluginVtkWrapper ): + + def __init__( self: Self ) -> None: """Split mesh cells.""" super().__init__() @@ -60,7 +62,7 @@ def applyVtkFilter( Returns: vtkPointSet: output mesh """ - filter :SplitMesh = SplitMesh() - filter.SetInputDataObject(input) + filter: SplitMesh = SplitMesh() + filter.SetInputDataObject( input ) filter.Update() return filter.GetOutputDataObject( 0 ) diff --git a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py index 23303b950..8ae8c27f9 100644 --- a/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py +++ b/geos-pv/src/geos/pv/utils/AbstractPVPluginVtkWrapper.py @@ -6,15 +6,13 @@ from typing_extensions import Self from paraview.util.vtkAlgorithm import ( # type: ignore[import-not-found] - VTKPythonAlgorithmBase, -) + VTKPythonAlgorithmBase, ) from vtkmodules.vtkCommonCore import ( vtkInformation, vtkInformationVector, ) - __doc__ = """ AbstractPVPluginVtkWrapper module defines the parent Paraview plugin from which inheritates PV plugins that directly wrap a vtk filter. @@ -22,10 +20,12 @@ If output type needs to be specified, this must be done in the child class. """ -class AbstractPVPluginVtkWrapper(VTKPythonAlgorithmBase): - def __init__(self:Self) ->None: + +class AbstractPVPluginVtkWrapper( VTKPythonAlgorithmBase ): + + def __init__( self: Self ) -> None: """Abstract Paraview Plugin class.""" - super().__init__(nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet") + super().__init__( nInputPorts=1, nOutputPorts=1, outputType="vtkPointSet" ) def RequestDataObject( self: Self, @@ -43,13 +43,13 @@ def RequestDataObject( Returns: int: 1 if calculation successfully ended, 0 otherwise. """ - inData = self.GetInputData(inInfoVec, 0, 0) - outData = self.GetOutputData(outInfoVec, 0) + inData = self.GetInputData( inInfoVec, 0, 0 ) + outData = self.GetOutputData( outInfoVec, 0 ) assert inData is not None - if outData is None or (not outData.IsA(inData.GetClassName())): + if outData is None or ( not outData.IsA( inData.GetClassName() ) ): outData = inData.NewInstance() - outInfoVec.GetInformationObject(0).Set(outData.DATA_OBJECT(), outData) - return super().RequestDataObject(request, inInfoVec, outInfoVec) + outInfoVec.GetInformationObject( 0 ).Set( outData.DATA_OBJECT(), outData ) + return super().RequestDataObject( request, inInfoVec, outInfoVec ) def RequestData( self: Self, @@ -73,12 +73,12 @@ def RequestData( assert inputMesh is not None, "Input server mesh is null." assert outputMesh is not None, "Output pipeline is null." - tmpMesh = self.applyVtkFilter(inputMesh) + tmpMesh = self.applyVtkFilter( inputMesh ) assert tmpMesh is not None, "Output mesh is null." - outputMesh.ShallowCopy(tmpMesh) - print("Filter was successfully applied.") - except (AssertionError, Exception) as e: - print(f"Filter failed due to: {e}") + outputMesh.ShallowCopy( tmpMesh ) + print( "Filter was successfully applied." ) + except ( AssertionError, Exception ) as e: + print( f"Filter failed due to: {e}" ) return 0 return 1 From 9c0d60bded8d1689e31f12ea8a271a8316fb1434 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 21 May 2025 17:09:53 +0200 Subject: [PATCH 54/57] bugs and tests fix --- geos-mesh/tests/test_CellTypeCounter.py | 4 +--- geos-mesh/tests/test_SplitMesh.py | 2 +- geos-mesh/tests/test_helpers_createSingleCellMesh.py | 2 +- geos-mesh/tests/test_helpers_createVertices.py | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index 6aa30990e..6dddce45e 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.vtk.helpers import createSingleCellMesh, createMultiCellMesh +from geos.mesh.utils.helpers import createSingleCellMesh, createMultiCellMesh from geos.mesh.stats.CellTypeCounter import CellTypeCounter from geos.mesh.model.CellTypeCounts import CellTypeCounts @@ -28,8 +28,6 @@ VTK_WEDGE, ) -#from vtkmodules.vtkFiltersSources import vtkCubeSource - data_root: str = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), "data" ) filename_all: tuple[ str, ...] = ( "triangle_cell.csv", "quad_cell.csv", "tetra_cell.csv", "pyramid_cell.csv", diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index 08df73a91..a47da8535 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.vtk.helpers import createSingleCellMesh +from geos.mesh.utils.helpers import createSingleCellMesh from geos.mesh.processing.SplitMesh import SplitMesh from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_helpers_createSingleCellMesh.py index e77d996b0..4c9cdd10c 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_helpers_createSingleCellMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.vtk.helpers import createSingleCellMesh +from geos.mesh.utils.helpers import createSingleCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_helpers_createVertices.py index 7fd784198..5c6625b2b 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_helpers_createVertices.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.vtk.helpers import getBounds, createVertices, createMultiCellMesh +from geos.mesh.utils.helpers import getBounds, createVertices, createMultiCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy From 8a3c4ab35d9e218910ce63a79e121e7f327673dc Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 21 May 2025 17:33:28 +0200 Subject: [PATCH 55/57] Fix merge and tests --- .../src/geos/mesh/utils/genericHelpers.py | 196 +++++++++++++++++- geos-mesh/tests/test_CellTypeCounter.py | 2 +- geos-mesh/tests/test_SplitMesh.py | 2 +- ...eateVertices.py => test_genericHelpers.py} | 8 +- ...st_genericHelpers_createSingleCellMesh.py} | 2 +- 5 files changed, 200 insertions(+), 10 deletions(-) rename geos-mesh/tests/{test_helpers_createVertices.py => test_genericHelpers.py} (96%) rename geos-mesh/tests/{test_helpers_createSingleCellMesh.py => test_genericHelpers_createSingleCellMesh.py} (98%) diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index 59fbdef16..1f38b0e0c 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -1,10 +1,14 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright 2023-2024 TotalEnergies. # SPDX-FileContributor: Martin Lemay, Paloma Martinez -from typing import Any, Iterator, List -from vtkmodules.vtkCommonCore import vtkIdList -from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData, vtkPlane, vtkCellTypes +import numpy as np +import numpy.typing as npt +from typing import Iterator, List, Sequence, Any, Union +from vtkmodules.util.numpy_support import numpy_to_vtk +from vtkmodules.vtkCommonCore import vtkIdList, vtkPoints, reference +from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkMultiBlockDataSet, vtkPolyData, vtkDataSet, vtkDataObject, vtkPlane, vtkCellTypes, vtkIncrementalOctreePointLocator from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter +from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) __doc__ = """ Generic VTK utilities. @@ -79,3 +83,189 @@ def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) - cutter.SetInterpolateAttributes( True ) cutter.Update() return cutter.GetOutputDataObject( 0 ) + + + +def getBounds( + input: Union[ vtkUnstructuredGrid, + vtkMultiBlockDataSet ] ) -> tuple[ float, float, float, float, float, float ]: + """Get bounds of either single of composite data set. + + Args: + input (Union[vtkUnstructuredGrid, vtkMultiBlockDataSet]): input mesh + + Returns: + tuple[float, float, float, float, float, float]: tuple containing + bounds (xmin, xmax, ymin, ymax, zmin, zmax) + + """ + if isinstance( input, vtkMultiBlockDataSet ): + return getMultiBlockBounds( input ) + else: + return getMonoBlockBounds( input ) + + +def getMonoBlockBounds( input: vtkUnstructuredGrid, ) -> tuple[ float, float, float, float, float, float ]: + """Get boundary box extrema coordinates for a vtkUnstructuredGrid. + + Args: + input (vtkMultiBlockDataSet): input single block mesh + + Returns: + tuple[float, float, float, float, float, float]: tuple containing + bounds (xmin, xmax, ymin, ymax, zmin, zmax) + + """ + return input.GetBounds() + + +def getMultiBlockBounds( input: vtkMultiBlockDataSet, ) -> tuple[ float, float, float, float, float, float ]: + """Get boundary box extrema coordinates for a vtkMultiBlockDataSet. + + Args: + input (vtkMultiBlockDataSet): input multiblock mesh + + Returns: + tuple[float, float, float, float, float, float]: bounds. + + """ + xmin, ymin, zmin = 3 * [ np.inf ] + xmax, ymax, zmax = 3 * [ -1.0 * np.inf ] + blockIndexes: list[ int ] = getBlockElementIndexesFlatten( input ) + for blockIndex in blockIndexes: + block0: vtkDataObject = getBlockFromFlatIndex( input, blockIndex ) + assert block0 is not None, "Mesh is undefined." + block: vtkDataSet = vtkDataSet.SafeDownCast( block0 ) + bounds: tuple[ float, float, float, float, float, float ] = block.GetBounds() + xmin = bounds[ 0 ] if bounds[ 0 ] < xmin else xmin + xmax = bounds[ 1 ] if bounds[ 1 ] > xmax else xmax + ymin = bounds[ 2 ] if bounds[ 2 ] < ymin else ymin + ymax = bounds[ 3 ] if bounds[ 3 ] > ymax else ymax + zmin = bounds[ 4 ] if bounds[ 4 ] < zmin else zmin + zmax = bounds[ 5 ] if bounds[ 5 ] > zmax else zmax + return xmin, xmax, ymin, ymax, zmin, zmax + + +def getBoundsFromPointCoords( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] ) -> Sequence[ float ]: + """Compute bounding box coordinates of the list of points. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of points + + Returns: + Sequence[float]: bounding box coordinates (xmin, xmax, ymin, ymax, zmin, zmax) + """ + bounds: list[ float ] = [ + np.inf, + -np.inf, + np.inf, + -np.inf, + np.inf, + -np.inf, + ] + for ptsCoords in cellPtsCoord: + mins: npt.NDArray[ np.float64 ] = np.min( ptsCoords, axis=0 ) + maxs: npt.NDArray[ np.float64 ] = np.max( ptsCoords, axis=0 ) + for i in range( 3 ): + bounds[ 2 * i ] = float( min( bounds[ 2 * i ], mins[ i ] ) ) + bounds[ 2 * i + 1 ] = float( max( bounds[ 2 * i + 1 ], maxs[ i ] ) ) + return bounds + + +def createSingleCellMesh( cellType: int, ptsCoord: npt.NDArray[ np.float64 ] ) -> vtkUnstructuredGrid: + """Create a mesh that consists of a single cell. + + Args: + cellType (int): cell type + ptsCoord (1DArray[np.float64]): cell point coordinates + + Returns: + vtkUnstructuredGrid: output mesh + """ + nbPoints: int = ptsCoord.shape[ 0 ] + points: npt.NDArray[ np.float64 ] = np.vstack( ( ptsCoord, ) ) + # Convert points to vtkPoints object + vtkpts: vtkPoints = vtkPoints() + vtkpts.SetData( numpy_to_vtk( points ) ) + + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for j in range( nbPoints ): + cellsID.InsertNextId( j ) + + # add cell to mesh + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + mesh.SetPoints( vtkpts ) + mesh.Allocate( 1 ) + mesh.InsertNextCell( cellType, cellsID ) + return mesh + + +def createMultiCellMesh( cellTypes: list[ int ], + cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + sharePoints: bool = True ) -> vtkUnstructuredGrid: + """Create a mesh that consists of multiple cells. + + .. WARNING:: the mesh is not check for conformity. + + Args: + cellTypes (list[int]): cell type + cellPtsCoord (list[1DArray[np.float64]]): list of cell point coordinates + sharePoints (bool): if True, cells share points, else a new point is created for each cell vertex + + Returns: + vtkUnstructuredGrid: output mesh + """ + assert len( cellPtsCoord ) == len( cellTypes ), "The lists of cell types of point coordinates must be of same size." + nbCells: int = len( cellPtsCoord ) + mesh: vtkUnstructuredGrid = vtkUnstructuredGrid() + points: vtkPoints + cellVertexMapAll: list[ tuple[ int, ...] ] + points, cellVertexMapAll = createVertices( cellPtsCoord, sharePoints ) + assert len( cellVertexMapAll ) == len( + cellTypes ), "The lists of cell types of cell point ids must be of same size." + mesh.SetPoints( points ) + mesh.Allocate( nbCells ) + # create mesh cells + for cellType, ptsId in zip( cellTypes, cellVertexMapAll, strict=True ): + # create cells from point ids + cellsID: vtkIdList = vtkIdList() + for ptId in ptsId: + cellsID.InsertNextId( ptId ) + mesh.InsertNextCell( cellType, cellsID ) + return mesh + + +def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], + shared: bool = True ) -> tuple[ vtkPoints, list[ tuple[ int, ...] ] ]: + """Create vertices from cell point coordinates list. + + Args: + cellPtsCoord (list[npt.NDArray[np.float64]]): list of cell point coordinates + shared (bool, optional): If True, collocated points are merged. Defaults to True. + + Returns: + tuple[vtkPoints, list[tuple[int, ...]]]: tuple containing points and the + map of cell point ids + """ + # get point bounds + bounds: Sequence[ float ] = getBoundsFromPointCoords( cellPtsCoord ) + points: vtkPoints = vtkPoints() + # use point locator to check for colocated points + pointsLocator = vtkIncrementalOctreePointLocator() + pointsLocator.InitPointInsertion( points, bounds ) + cellVertexMapAll: list[ tuple[ int, ...] ] = [] + ptId: reference = reference( 0 ) + ptsCoords: npt.NDArray[ np.float64 ] + for ptsCoords in cellPtsCoord: + cellVertexMap: list[ int ] = [] + pt: npt.NDArray[ np.float64 ] # 1DArray + for pt in ptsCoords: + if shared: + pointsLocator.InsertUniquePoint( pt.tolist(), ptId ) # type: ignore[arg-type] + else: + pointsLocator.InsertPointWithoutChecking( pt.tolist(), ptId, 1 ) # type: ignore[arg-type] + cellVertexMap += [ ptId.get() ] # type: ignore + cellVertexMapAll += [ tuple( cellVertexMap ) ] + return points, cellVertexMapAll + diff --git a/geos-mesh/tests/test_CellTypeCounter.py b/geos-mesh/tests/test_CellTypeCounter.py index 6dddce45e..6da50c5c8 100644 --- a/geos-mesh/tests/test_CellTypeCounter.py +++ b/geos-mesh/tests/test_CellTypeCounter.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.utils.helpers import createSingleCellMesh, createMultiCellMesh +from geos.mesh.utils.genericHelpers import createSingleCellMesh, createMultiCellMesh from geos.mesh.stats.CellTypeCounter import CellTypeCounter from geos.mesh.model.CellTypeCounts import CellTypeCounts diff --git a/geos-mesh/tests/test_SplitMesh.py b/geos-mesh/tests/test_SplitMesh.py index a47da8535..2a73cb58a 100644 --- a/geos-mesh/tests/test_SplitMesh.py +++ b/geos-mesh/tests/test_SplitMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.utils.helpers import createSingleCellMesh +from geos.mesh.utils.genericHelpers import createSingleCellMesh from geos.mesh.processing.SplitMesh import SplitMesh from vtkmodules.util.numpy_support import vtk_to_numpy diff --git a/geos-mesh/tests/test_helpers_createVertices.py b/geos-mesh/tests/test_genericHelpers.py similarity index 96% rename from geos-mesh/tests/test_helpers_createVertices.py rename to geos-mesh/tests/test_genericHelpers.py index 5c6625b2b..f77bc6f27 100644 --- a/geos-mesh/tests/test_helpers_createVertices.py +++ b/geos-mesh/tests/test_genericHelpers.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.utils.helpers import getBounds, createVertices, createMultiCellMesh +from geos.mesh.utils.genericHelpers import getBoundsFromPointCoords, createVertices, createMultiCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy @@ -173,8 +173,8 @@ def test_createMultiCellMesh( test_case: TestCase ) -> None: assert cellsOutObs == test_case.cellPtsIdsExp[ cellId ], "Cell point ids are wrong." -def test_getBounds() -> None: - """Test of getBounds method.""" +def test_getBoundsFromPointCoords() -> None: + """Test of getBoundsFromPointCoords method.""" # input cellPtsCoord: list[ npt.NDArray[ np.float64 ] ] = [ np.array( [ [ 5, 4, 3 ], [ 1, 8, 4 ], [ 2, 5, 7 ] ], dtype=float ), @@ -184,5 +184,5 @@ def test_getBounds() -> None: ] # expected output boundsExp: list[ float ] = [ 0., 5., 1., 8., 2., 9. ] - boundsObs: list[ float ] = getBounds( cellPtsCoord ) + boundsObs: list[ float ] = getBoundsFromPointCoords( cellPtsCoord ) assert boundsExp == boundsObs, f"Expected bounds are {boundsExp}." diff --git a/geos-mesh/tests/test_helpers_createSingleCellMesh.py b/geos-mesh/tests/test_genericHelpers_createSingleCellMesh.py similarity index 98% rename from geos-mesh/tests/test_helpers_createSingleCellMesh.py rename to geos-mesh/tests/test_genericHelpers_createSingleCellMesh.py index 4c9cdd10c..d058c5376 100644 --- a/geos-mesh/tests/test_helpers_createSingleCellMesh.py +++ b/geos-mesh/tests/test_genericHelpers_createSingleCellMesh.py @@ -9,7 +9,7 @@ from typing import ( Iterator, ) -from geos.mesh.utils.helpers import createSingleCellMesh +from geos.mesh.utils.genericHelpers import createSingleCellMesh from vtkmodules.util.numpy_support import vtk_to_numpy From 2318b7e1de70165ba1bedc6613ebc52a040496de Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Wed, 21 May 2025 17:38:25 +0200 Subject: [PATCH 56/57] yapf fix --- geos-mesh/src/geos/mesh/utils/genericHelpers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index 1f38b0e0c..2faf092d3 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -85,7 +85,6 @@ def extractSurfaceFromElevation( mesh: vtkUnstructuredGrid, elevation: float ) - return cutter.GetOutputDataObject( 0 ) - def getBounds( input: Union[ vtkUnstructuredGrid, vtkMultiBlockDataSet ] ) -> tuple[ float, float, float, float, float, float ]: @@ -268,4 +267,3 @@ def createVertices( cellPtsCoord: list[ npt.NDArray[ np.float64 ] ], cellVertexMap += [ ptId.get() ] # type: ignore cellVertexMapAll += [ tuple( cellVertexMap ) ] return points, cellVertexMapAll - From 4b54e48a6a4a5afeb4111801570115358168d022 Mon Sep 17 00:00:00 2001 From: mlemayTTE Date: Thu, 22 May 2025 11:45:48 +0200 Subject: [PATCH 57/57] linting fix --- geos-mesh/src/geos/mesh/utils/genericHelpers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/geos-mesh/src/geos/mesh/utils/genericHelpers.py b/geos-mesh/src/geos/mesh/utils/genericHelpers.py index ffecfec71..2faf092d3 100644 --- a/geos-mesh/src/geos/mesh/utils/genericHelpers.py +++ b/geos-mesh/src/geos/mesh/utils/genericHelpers.py @@ -10,7 +10,6 @@ from vtkmodules.vtkFiltersCore import vtk3DLinearGridPlaneCutter from geos.mesh.utils.multiblockHelpers import ( getBlockElementIndexesFlatten, getBlockFromFlatIndex ) - __doc__ = """ Generic VTK utilities.