Skip to content

Commit af46a35

Browse files
refactor: Merge the four geomechanics workflow plugins in one (#175)
1 parent 45c6914 commit af46a35

File tree

15 files changed

+541
-1696
lines changed

15 files changed

+541
-1696
lines changed

docs/geos_pv_docs/processing.rst

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,36 +53,17 @@ PVGeosBlockExtractAndMerge plugin
5353
.. automodule:: geos.pv.plugins.PVGeosBlockExtractAndMerge
5454

5555

56-
5756
Geomechanics workflows
5857
++++++++++++++++++++++++
5958

6059

61-
PVGeomechanicsWorkflowVolume plugin
62-
---------------------------------------------
63-
64-
.. automodule:: geos.pv.plugins.PVGeomechanicsWorkflowVolume
65-
66-
67-
PVGeomechanicsWorkflowVolumeSurface plugin
68-
----------------------------------------------------
69-
70-
.. automodule:: geos.pv.plugins.PVGeomechanicsWorkflowVolumeSurface
71-
72-
73-
PVGeomechanicsWorkflowVolumeSurfaceWell plugin
74-
--------------------------------------------------------
75-
76-
.. automodule:: geos.pv.plugins.PVGeomechanicsWorkflowVolumeSurfaceWell
77-
78-
79-
PVGeomechanicsWorkflowVolumeWell plugin
80-
-------------------------------------------------
60+
PVGeomechanicsWorkflow plugin
61+
------------------------------
8162

82-
.. automodule:: geos.pv.plugins.PVGeomechanicsWorkflowVolumeWell
63+
.. automodule:: geos.pv.plugins.PVGeomechanicsWorkflow
8364

8465

8566
PVGeomechanicsCalculator plugin
8667
---------------------------------------
8768

88-
.. automodule:: geos.pv.plugins.PVGeomechanicsCalculator
69+
.. automodule:: geos.pv.plugins.PVGeomechanicsCalculator

geos-mesh/src/geos/mesh/utils/genericHelpers.py

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,17 @@ def triangulateMesh(
6262
Returns:
6363
vtkUnstructuredGrid: Triangulated mesh
6464
"""
65+
vtkErrorLogger: Logger
6566
if logger is None:
66-
logger = getLogger( "Triangulate", True )
67-
# Creation of a child logger to deal with VTKErrors without polluting parent logger
68-
vtkErrorLogger: Logger = getLogger( f"{logger.name}.vtkErrorLogger", True )
69-
vtkErrorLogger.propagate = False
67+
vtkErrorLogger = getLogger( "Triangulate Mesh vtkError Logger", True )
68+
else:
69+
vtkErrorLogger = logging.getLogger( f"{ logger.name } vtkError Logger" )
70+
vtkErrorLogger.setLevel( logging.INFO )
71+
vtkErrorLogger.addHandler( logger.handlers[ 0 ] )
72+
vtkErrorLogger.propagate = False
7073

7174
vtkLogger.SetStderrVerbosity( vtkLogger.VERBOSITY_ERROR )
72-
7375
vtkErrorLogger.addFilter( RegexExceptionFilter() ) # will raise VTKError if captured VTK Error
74-
vtkErrorLogger.setLevel( logging.DEBUG )
7576

7677
with VTKCaptureLog() as capturedLog:
7778
triangulateMeshFilter: vtkDataSetTriangleFilter = vtkDataSetTriangleFilter()
@@ -81,7 +82,8 @@ def triangulateMesh(
8182
capturedLog.seek( 0 )
8283
captured = capturedLog.read().decode()
8384

84-
vtkErrorLogger.debug( captured.strip() )
85+
if captured != "":
86+
vtkErrorLogger.error( captured.strip() )
8587

8688
triangulatedMesh: vtkUnstructuredGrid = triangulateMeshFilter.GetOutput()
8789

@@ -107,16 +109,17 @@ def convertUnstructuredGridToPolyData(
107109
Returns:
108110
vtkPolyData: Extracted surface
109111
"""
112+
vtkErrorLogger: Logger
110113
if logger is None:
111-
logger = getLogger( "ConvertVtkUnstructuredGridToVtkPolyData.", True )
112-
# Creation of a child logger to deal with VTKErrors without polluting parent logger
113-
vtkErrorLogger: Logger = getLogger( f"{logger.name}.vtkErrorLogger", True )
114-
vtkErrorLogger.propagate = False
114+
vtkErrorLogger = getLogger( "Convert vtkUnstructuredGrid To vtkPolyData vtkError Logger", True )
115+
else:
116+
vtkErrorLogger = logging.getLogger( f"{ logger.name } vtkError Logger" )
117+
vtkErrorLogger.setLevel( logging.INFO )
118+
vtkErrorLogger.addHandler( logger.handlers[ 0 ] )
119+
vtkErrorLogger.propagate = False
115120

116121
vtkLogger.SetStderrVerbosity( vtkLogger.VERBOSITY_ERROR )
117-
118122
vtkErrorLogger.addFilter( RegexExceptionFilter() ) # will raise VTKError if captured VTK Error
119-
vtkErrorLogger.setLevel( logging.DEBUG )
120123

121124
with VTKCaptureLog() as capturedLog:
122125
extractSurfaceFilter: vtkDataSetSurfaceFilter = vtkDataSetSurfaceFilter()
@@ -131,7 +134,8 @@ def convertUnstructuredGridToPolyData(
131134
capturedLog.seek( 0 )
132135
captured = capturedLog.read().decode()
133136

134-
vtkErrorLogger.debug( captured.strip() )
137+
if captured != "":
138+
vtkErrorLogger.error( captured.strip() )
135139

136140
extractedSurface: vtkPolyData = extractSurfaceFilter.GetOutput()
137141

@@ -460,8 +464,8 @@ def getTangentsVectors( surface: vtkPolyData ) -> Tuple[ npt.NDArray[ np.float64
460464
try:
461465
tangents1 = vtk_to_numpy( vtkTangents )
462466
except AttributeError as err:
463-
print( "No tangential attribute found in the mesh. Use the computeTangents function beforehand." )
464-
raise VTKError( err ) from err
467+
context: str = f"No tangential attribute found in the mesh. Use the computeTangents function beforehand.\n{ err }"
468+
raise VTKError( context ) from err
465469
else:
466470
# Compute second tangential component
467471
normals: npt.NDArray[ np.float64 ] = getNormalVectors( surface )
@@ -471,22 +475,30 @@ def getTangentsVectors( surface: vtkPolyData ) -> Tuple[ npt.NDArray[ np.float64
471475
return ( tangents1, tangents2 )
472476

473477

474-
def getLocalBasisVectors( surface: vtkPolyData ) -> npt.NDArray[ np.float64 ]:
478+
def getLocalBasisVectors(
479+
surface: vtkPolyData,
480+
logger: Union[ Logger, None ] = None,
481+
) -> npt.NDArray[ np.float64 ]:
475482
"""Return the local basis vectors for all cells of the input surface.
476483
477484
Args:
478485
surface(vtkPolydata): The input surface.
486+
logger (Union[Logger, None], optional): A logger to manage the output messages.
487+
Defaults to None, an internal logger is used.
479488
480489
Returns:
481490
npt.NDArray[np.float64]: Array with normal, tangential 1 and tangential 2 vectors.
482491
"""
492+
if logger is None:
493+
logger = getLogger( "getLocalBasisVectors", True )
494+
483495
try:
484496
normals: npt.NDArray[ np.float64 ] = getNormalVectors( surface )
485497
surfaceWithNormals: vtkPolyData = surface
486498
# ValueError raised if no normals found in the mesh
487499
except ValueError:
488500
# In that case, the normals are computed.
489-
surfaceWithNormals = computeNormals( surface )
501+
surfaceWithNormals = computeNormals( surface, logger )
490502
normals = getNormalVectors( surfaceWithNormals )
491503

492504
# Tangents require normals to be present in the mesh
@@ -495,7 +507,7 @@ def getLocalBasisVectors( surface: vtkPolyData ) -> npt.NDArray[ np.float64 ]:
495507
npt.NDArray[ np.float64 ] ] = getTangentsVectors( surfaceWithNormals )
496508
# If no tangents is present in the mesh, they are computed on that surface
497509
except VTKError:
498-
surfaceWithTangents: vtkPolyData = computeTangents( surfaceWithNormals )
510+
surfaceWithTangents: vtkPolyData = computeTangents( surfaceWithNormals, logger )
499511
tangents = getTangentsVectors( surfaceWithTangents )
500512

501513
return np.array( ( normals, *tangents ) )
@@ -515,16 +527,17 @@ def computeNormals(
515527
Returns:
516528
vtkPolyData: The surface with normal attribute.
517529
"""
530+
vtkErrorLogger: Logger
518531
if logger is None:
519-
logger = getLogger( "computeSurfaceNormals" )
520-
# Creation of a child logger to deal with VTKErrors without polluting parent logger
521-
vtkErrorLogger: Logger = getLogger( f"{logger.name}.vtkErrorLogger" )
522-
vtkErrorLogger.propagate = False
532+
vtkErrorLogger = getLogger( "Compute Surface Normals vtkError Logger", True )
533+
else:
534+
vtkErrorLogger = logging.getLogger( f"{ logger.name } vtkError Logger" )
535+
vtkErrorLogger.setLevel( logging.INFO )
536+
vtkErrorLogger.addHandler( logger.handlers[ 0 ] )
537+
vtkErrorLogger.propagate = False
523538

524539
vtkLogger.SetStderrVerbosity( vtkLogger.VERBOSITY_ERROR )
525-
526540
vtkErrorLogger.addFilter( RegexExceptionFilter() ) # will raise VTKError if captured VTK Error
527-
vtkErrorLogger.setLevel( logging.DEBUG )
528541

529542
with VTKCaptureLog() as capturedLog:
530543
normalFilter: vtkPolyDataNormals = vtkPolyDataNormals()
@@ -536,7 +549,8 @@ def computeNormals(
536549
capturedLog.seek( 0 )
537550
captured = capturedLog.read().decode()
538551

539-
vtkErrorLogger.debug( captured.strip() )
552+
if captured != "":
553+
vtkErrorLogger.error( captured.strip() )
540554

541555
outputSurface = normalFilter.GetOutput()
542556

@@ -562,22 +576,23 @@ def computeTangents(
562576
Returns:
563577
vtkPolyData: The surface with tangent attribute
564578
"""
565-
# need to compute texture coordinates required for tangent calculation
566-
surface1: vtkPolyData = computeSurfaceTextureCoordinates( triangulatedSurface )
579+
# Need to compute texture coordinates required for tangent calculation
580+
surface1: vtkPolyData = computeSurfaceTextureCoordinates( triangulatedSurface, logger )
567581

568582
# TODO: triangulate the surface before computation of the tangents if needed.
569583

570-
# compute tangents
584+
# Compute tangents
585+
vtkErrorLogger: Logger
571586
if logger is None:
572-
logger = getLogger( "computeSurfaceTangents" )
573-
# Creation of a child logger to deal with VTKErrors without polluting parent logger
574-
vtkErrorLogger: Logger = getLogger( f"{logger.name}.vtkErrorLogger" )
575-
vtkErrorLogger.propagate = False
587+
vtkErrorLogger = getLogger( "Compute Surface Tangents vtkError Logger", True )
588+
else:
589+
vtkErrorLogger = logging.getLogger( f"{ logger.name } vtkError Logger" )
590+
vtkErrorLogger.setLevel( logging.INFO )
591+
vtkErrorLogger.addHandler( logger.handlers[ 0 ] )
592+
vtkErrorLogger.propagate = False
576593

577594
vtkLogger.SetStderrVerbosity( vtkLogger.VERBOSITY_ERROR )
578-
579595
vtkErrorLogger.addFilter( RegexExceptionFilter() ) # will raise VTKError if captured VTK Error
580-
vtkErrorLogger.setLevel( logging.DEBUG )
581596

582597
with VTKCaptureLog() as capturedLog:
583598

@@ -591,7 +606,8 @@ def computeTangents(
591606
capturedLog.seek( 0 )
592607
captured = capturedLog.read().decode()
593608

594-
vtkErrorLogger.debug( captured.strip() )
609+
if captured != "":
610+
vtkErrorLogger.error( captured.strip() )
595611

596612
if surfaceOut is None:
597613
raise VTKError( "Something went wrong in VTK calculation." )
@@ -623,16 +639,17 @@ def computeSurfaceTextureCoordinates(
623639
vtkPolyData: The input surface with generated texture map.
624640
"""
625641
# Need to compute texture coordinates required for tangent calculation
642+
vtkErrorLogger: Logger
626643
if logger is None:
627-
logger = getLogger( "computeSurfaceTextureCoordinates" )
628-
# Creation of a child logger to deal with VTKErrors without polluting parent logger
629-
vtkErrorLogger: Logger = getLogger( f"{logger.name}.vtkErrorLogger" )
630-
vtkErrorLogger.propagate = False
644+
vtkErrorLogger = getLogger( "Compute Surface Texture Coordinates vtkError Logger", True )
645+
else:
646+
vtkErrorLogger = logging.getLogger( f"{ logger.name } vtkError Logger" )
647+
vtkErrorLogger.setLevel( logging.INFO )
648+
vtkErrorLogger.addHandler( logger.handlers[ 0 ] )
649+
vtkErrorLogger.propagate = False
631650

632651
vtkLogger.SetStderrVerbosity( vtkLogger.VERBOSITY_ERROR )
633-
634652
vtkErrorLogger.addFilter( RegexExceptionFilter() ) # will raise VTKError if captured VTK Error
635-
vtkErrorLogger.setLevel( logging.DEBUG )
636653

637654
with VTKCaptureLog() as capturedLog:
638655

@@ -644,6 +661,7 @@ def computeSurfaceTextureCoordinates(
644661
capturedLog.seek( 0 )
645662
captured = capturedLog.read().decode()
646663

647-
vtkErrorLogger.debug( captured.strip() )
664+
if captured != "":
665+
vtkErrorLogger.error( captured.strip() )
648666

649667
return textureFilter.GetOutput()

geos-processing/src/geos/processing/post_processing/GeomechanicsCalculator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
mesh: vtkUnstructuredGrid
8686
computeAdvancedProperties: bool # optional, defaults to False
8787
speHandler: bool # optional, defaults to False
88+
loggerName: str # Defaults to "Geomechanics Calculator"
8889
8990
# Instantiate the filter
9091
geomechanicsCalculatorFilter: GeomechanicsCalculator = GeomechanicsCalculator( mesh, computeAdvancedProperties, speHandler )
@@ -693,7 +694,7 @@ def __init__(
693694
computeAdvancedProperties (bool, optional): True to compute advanced geomechanics properties, False otherwise.
694695
Defaults to False.
695696
loggerName (str, optional): Name of the filter logger.
696-
Defaults to "Geomechanics Calculator"
697+
Defaults to "Geomechanics Calculator".
697698
speHandler (bool, optional): True to use a specific handler, False to use the internal handler.
698699
Defaults to False.
699700
"""

geos-processing/src/geos/processing/post_processing/GeosBlockExtractor.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
extractFault: bool # Defaults to False
3939
extractWell: bool # Defaults to False
4040
speHandler: bool # Defaults to False
41+
loggerName: str # Defaults to "Geos Block Extractor"
4142
4243
# Instantiate the filter
4344
geosBlockExtractor: GeosBlockExtractor = GeosBlockExtractor( geosMesh, extractFault, extractWell, speHandler )
@@ -56,8 +57,6 @@
5657
geosDomainExtracted = geosBlockExtractor.extractedGeosDomain.well # For well domain
5758
"""
5859

59-
loggerTitle: str = "Geos Block Extractor"
60-
6160

6261
class GeosExtractDomainBlock( vtkExtractBlock ):
6362

@@ -149,6 +148,7 @@ def __init__(
149148
extractFault: bool = False,
150149
extractWell: bool = False,
151150
speHandler: bool = False,
151+
loggerName: str = "Geos Block Extractor",
152152
) -> None:
153153
"""Blocks from the ElementRegions from a GEOS output multiBlockDataset mesh.
154154
@@ -160,6 +160,8 @@ def __init__(
160160
Defaults to False.
161161
speHandler (bool, optional): True to use a specific handler, False to use the internal handler.
162162
Defaults to False.
163+
loggerName (str, optional): Name of the filter logger.
164+
Defaults to "Geos Block Extractor".
163165
"""
164166
self.geosMesh: vtkMultiBlockDataSet = geosMesh
165167
self.extractedGeosDomain = self.ExtractedGeosDomain()
@@ -173,9 +175,9 @@ def __init__(
173175
# Logger.
174176
self.logger: Logger
175177
if not speHandler:
176-
self.logger = getLogger( loggerTitle, True )
178+
self.logger = getLogger( loggerName, True )
177179
else:
178-
self.logger = logging.getLogger( loggerTitle )
180+
self.logger = logging.getLogger( loggerName )
179181
self.logger.setLevel( logging.INFO )
180182

181183
def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
@@ -201,15 +203,18 @@ def applyFilter( self: Self ) -> None:
201203
extractGeosDomain: GeosExtractDomainBlock = GeosExtractDomainBlock()
202204
extractGeosDomain.SetInputData( self.geosMesh )
203205

206+
domainNames: list = []
204207
for domain in self.domainToExtract:
205208
extractGeosDomain.RemoveAllIndices()
206209
extractGeosDomain.AddGeosDomainName( domain )
207210
extractGeosDomain.Update()
208211
self.extractedGeosDomain.setExtractedDomain( domain, extractGeosDomain.GetOutput() )
212+
domainNames.append( domain.value )
213+
214+
self.logger.info( f"The GEOS domain { domainNames } have been extracted." )
215+
self.logger.info( f"The filter { self.logger.name } succeeded." )
209216

210-
self.logger.info( "The filter succeeded." )
217+
except ( ValueError, TypeError ) as e:
218+
self.logger.error( f"The filter { self.logger.name } failed.\n{ e }." )
211219

212-
except ValueError as ve:
213-
self.logger.error( f"The filter failed.\n{ ve }." )
214-
except TypeError as te:
215-
self.logger.error( f"The filter failed.\n{ te }." )
220+
return

0 commit comments

Comments
 (0)