-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add mesh_stats checks and field_operations features #51
base: main
Are you sure you want to change the base?
Changes from all commits
0e323e9
420a72c
3e40aaa
f8d19d5
cde3385
656da06
4e34794
50a0ee9
be2aa69
38bde63
b4c0f18
6f774ec
548ae2a
6285d64
eaab705
645f3e4
404bc22
0676967
ea4eb84
983b3bc
a613e08
e863fd1
7de5d87
60fad80
23d1f6a
01b9af1
9002e9c
c0ce7f6
bd814da
8c14003
67c7d0b
479a1b2
4b200a7
ce8f650
72741ee
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,3 +9,4 @@ vtk >= 9.1 | |
networkx >= 2.4 | ||
tqdm | ||
numpy | ||
numexpr |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,6 +23,7 @@ dependencies = [ | |
"networkx >= 2.4", | ||
"tqdm", | ||
"numpy", | ||
"numexpr", | ||
"meshio>=5.3.2", | ||
] | ||
|
||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,276 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||
import logging | ||||||||||||||||||||||||||||||||||||||||||||||||||
from numexpr import evaluate | ||||||||||||||||||||||||||||||||||||||||||||||||||
from dataclasses import dataclass | ||||||||||||||||||||||||||||||||||||||||||||||||||
from geos.mesh.doctor.checks.vtk_utils import ( VtkOutput, get_points_coords_from_vtk, get_cell_centers_array, | ||||||||||||||||||||||||||||||||||||||||||||||||||
get_vtm_filepath_from_pvd, get_vtu_filepaths_from_vtm, | ||||||||||||||||||||||||||||||||||||||||||||||||||
get_all_array_names, read_mesh, write_mesh ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
from numpy import array, empty, full, sqrt, int64, nan | ||||||||||||||||||||||||||||||||||||||||||||||||||
from numpy.random import rand | ||||||||||||||||||||||||||||||||||||||||||||||||||
from scipy.spatial import KDTree | ||||||||||||||||||||||||||||||||||||||||||||||||||
from tqdm import tqdm | ||||||||||||||||||||||||||||||||||||||||||||||||||
from vtkmodules.util.numpy_support import numpy_to_vtk, vtk_to_numpy | ||||||||||||||||||||||||||||||||||||||||||||||||||
from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
@dataclass( frozen=True ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
class Options: | ||||||||||||||||||||||||||||||||||||||||||||||||||
support: str # choice between 'cell' and 'point' to operate on fields | ||||||||||||||||||||||||||||||||||||||||||||||||||
source: str # file from where the data is collected | ||||||||||||||||||||||||||||||||||||||||||||||||||
operations: list[ tuple[ str ] ] # [ ( function0, new_name0 ), ... ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. From the comment, it seems like we expect exactly 2 str in the tuple. Would something like |
||||||||||||||||||||||||||||||||||||||||||||||||||
vtm_index: int # useful when source is a .pvd or .vtm file | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_output: VtkOutput | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
@dataclass( frozen=True ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
class Result: | ||||||||||||||||||||||||||||||||||||||||||||||||||
info: bool | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
__SUPPORT_CHOICES = [ "point", "cell" ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
support_construction: dict[ str, tuple[ any ] ] = { | ||||||||||||||||||||||||||||||||||||||||||||||||||
__SUPPORT_CHOICES[ 0 ]: get_points_coords_from_vtk, | ||||||||||||||||||||||||||||||||||||||||||||||||||
__SUPPORT_CHOICES[ 1 ]: get_cell_centers_array | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def get_distances_mesh_center( mesh: vtkUnstructuredGrid, support: str ) -> array: | ||||||||||||||||||||||||||||||||||||||||||||||||||
f"""For a specific support type {__SUPPORT_CHOICES}, returns a numpy array filled with the distances between | ||||||||||||||||||||||||||||||||||||||||||||||||||
their coordinates and the center of the mesh. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
support (str): Choice between {__SUPPORT_CHOICES}. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||
array: [ distance0, distance1, ..., distanceN ] with N being the number of support elements. | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks like a great opportunity to use your |
||||||||||||||||||||||||||||||||||||||||||||||||||
if support == __SUPPORT_CHOICES[ 0 ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
coords: array = get_points_coords_from_vtk( mesh ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
elif support == __SUPPORT_CHOICES[ 1 ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
coords = get_cell_centers_array( mesh ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( f"For support, the only choices available are {__SUPPORT_CHOICES}." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
center = ( coords.max( axis=0 ) + coords.min( axis=0 ) ) / 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||
distances = empty( coords.shape[ 0 ] ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
for i in range( coords.shape[ 0 ] ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
distance_squared: float = 0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||
coord = coords[ i ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
for j in range( len( coord ) ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
distance_squared += ( coord[ j ] - center[ j ] ) * ( coord[ j ] - center[ j ] ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
distances[ i ] = distance_squared | ||||||||||||||||||||||||||||||||||||||||||||||||||
distances = sqrt( distances ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return distances | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+46
to
+62
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would try to simplify the whole function, and do something like
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def get_random_field( mesh: vtkUnstructuredGrid, support: str ) -> array: | ||||||||||||||||||||||||||||||||||||||||||||||||||
f"""For a specific support type {__SUPPORT_CHOICES}, an array with samples from a uniform distribution over [0, 1). | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In the doc string, "returns an array..." |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
support (str): Choice between {__SUPPORT_CHOICES}. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||
array: Array of size N being the number of support elements. | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
if support == __SUPPORT_CHOICES[ 0 ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's tempting to have a seperate function that would return the number of elements, especially if the |
||||||||||||||||||||||||||||||||||||||||||||||||||
number_elements: int = mesh.GetNumberOfPoints() | ||||||||||||||||||||||||||||||||||||||||||||||||||
elif support == __SUPPORT_CHOICES[ 1 ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_elements = mesh.GetNumberOfCells() | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( f"For support, the only choices available are {__SUPPORT_CHOICES}." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return rand( number_elements, 1 ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
create_precoded_fields: dict[ str, any ] = { | ||||||||||||||||||||||||||||||||||||||||||||||||||
"distances_mesh_center": get_distances_mesh_center, | ||||||||||||||||||||||||||||||||||||||||||||||||||
"random": get_random_field | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def get_vtu_filepaths( options: Options ) -> tuple[ str ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. At some point, could maybe be moved to the vtk utils ? |
||||||||||||||||||||||||||||||||||||||||||||||||||
"""Returns the vtu filepaths to use for the rest of the workflow. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
options (Options): Options chosen by the user. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||
tuple[ str ]: ( "file/path/0.vtu", ..., "file/path/N.vtu" ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
source_filepath: str = options.source | ||||||||||||||||||||||||||||||||||||||||||||||||||
if source_filepath.endswith( ".vtu" ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
return ( source_filepath, ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
elif source_filepath.endswith( ".vtm" ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
return get_vtu_filepaths_from_vtm( source_filepath ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
elif source_filepath.endswith( ".pvd" ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtm_filepath: str = get_vtm_filepath_from_pvd( source_filepath, options.vtm_index ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return get_vtu_filepaths_from_vtm( vtm_filepath ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( f"The source filepath '{options.source}' provided does not target a .vtu, a .vtm nor a " + | ||||||||||||||||||||||||||||||||||||||||||||||||||
".pvd file." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def get_reorder_mapping( kd_tree_grid_ref: KDTree, sub_grid: vtkUnstructuredGrid, support: str ) -> array: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"""Builds an array containing the indexes of the reference grid linked to every | ||||||||||||||||||||||||||||||||||||||||||||||||||
cell ids / point ids of the subset grid. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
kd_tree_grid_ref (KDTree): A KDTree of the nearest neighbor cell centers for every cells / | ||||||||||||||||||||||||||||||||||||||||||||||||||
points coordinates for point of the reference grid. | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_grid (vtkUnstructuredGrid): A vtk grid that is a subset of the reference grid. | ||||||||||||||||||||||||||||||||||||||||||||||||||
support (str): Either "point" or "cell". | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||
np.array: [ cell_idK_grid, cell_idN_grid, ... ] or [ point_idK_grid, point_idN_grid, ... ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
support_elements: array = support_construction[ support ]( sub_grid ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# now that you have the support elements, you can map them to the reference grid | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_elements: int = support_elements.shape[ 0 ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
mapping: array = empty( number_elements, dtype=int64 ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
for cell_id in range( number_elements ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, index = kd_tree_grid_ref.query( support_elements[ cell_id ] ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
mapping[ cell_id ] = index | ||||||||||||||||||||||||||||||||||||||||||||||||||
return mapping | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def get_array_names_to_collect_and_options( sub_vtu_filepath: str, | ||||||||||||||||||||||||||||||||||||||||||||||||||
options: Options ) -> tuple[ list[ tuple[ str ] ], Options ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"""We need to have the list of array names that are required to perform copy and creation of new arrays. To build | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_arrays to perform operations, we need only these names and not all array names present in the sub meshes. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_vtu_filepath (str): Path to sub vtu file that can be used to find the names of the arrays within its data. | ||||||||||||||||||||||||||||||||||||||||||||||||||
options (Options): Options chosen by the user. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||
list[ str ]: Array names. | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
ref_mesh: vtkUnstructuredGrid = read_mesh( sub_vtu_filepath ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
all_array_names: dict[ str, dict[ str, int ] ] = get_all_array_names( ref_mesh ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if options.support == __SUPPORT_CHOICES[ 0 ]: # point | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. see other comment L209 |
||||||||||||||||||||||||||||||||||||||||||||||||||
support_array_names: list[ str ] = list( all_array_names[ "PointData" ].keys() ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: # cell | ||||||||||||||||||||||||||||||||||||||||||||||||||
support_array_names = list( all_array_names[ "CellData" ].keys() ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
to_use_arrays: set[ str ] = set() | ||||||||||||||||||||||||||||||||||||||||||||||||||
to_use_operate: list[ tuple[ str ] ] = list() | ||||||||||||||||||||||||||||||||||||||||||||||||||
for function_newname in options.operations: | ||||||||||||||||||||||||||||||||||||||||||||||||||
funct: str = function_newname[ 0 ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
if funct in create_precoded_fields: | ||||||||||||||||||||||||||||||||||||||||||||||||||
to_use_operate.append( function_newname ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
continue | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
is_usable: bool = False | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess there must be a more pythonic way to code this |
||||||||||||||||||||||||||||||||||||||||||||||||||
for support_array_name in support_array_names: | ||||||||||||||||||||||||||||||||||||||||||||||||||
if support_array_name in funct: | ||||||||||||||||||||||||||||||||||||||||||||||||||
to_use_arrays.add( support_array_name ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
is_usable = True | ||||||||||||||||||||||||||||||||||||||||||||||||||
if is_usable: | ||||||||||||||||||||||||||||||||||||||||||||||||||
to_use_operate.append( function_newname ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
logging.warning( f"Cannot perform operations with '{funct}' because some or all the fields do not " + | ||||||||||||||||||||||||||||||||||||||||||||||||||
f"exist in '{sub_vtu_filepath}'." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
updated_options: Options = Options( options.support, options.source, to_use_operate, options.vtm_index, | ||||||||||||||||||||||||||||||||||||||||||||||||||
options.vtk_output ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return ( list( to_use_arrays ), updated_options ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def merge_local_in_global_array( global_array: array, local_array: array, mapping: array ) -> None: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"""Fill the values of a global_array using the values contained in a local_array that is smaller or equal to the | ||||||||||||||||||||||||||||||||||||||||||||||||||
size as the global_array. A mapping is used to copy the values from the local_array to the right indexes in | ||||||||||||||||||||||||||||||||||||||||||||||||||
the global_array. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_array (np.array): Array of size N. | ||||||||||||||||||||||||||||||||||||||||||||||||||
local_array (np.array): Array of size M <= N that is representing a subset of the global_array. | ||||||||||||||||||||||||||||||||||||||||||||||||||
mapping (np.array): Array of global indexes of size M. | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
size_global, size_local = global_array.shape, local_array.shape | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If it's a shape, I would rename in |
||||||||||||||||||||||||||||||||||||||||||||||||||
if size_global[ 0 ] < size_local[ 0 ]: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( "The global array to fill is smaller than the local array to merge." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_columns_global: int = size_global[ 1 ] if len( size_global ) == 2 else 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_columns_local: int = size_local[ 1 ] if len( size_local ) == 2 else 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
if number_columns_global != number_columns_local: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( "The arrays do not have same number of columns." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# when converting a numpy array to vtk array, you need to make sure to have a 2D array | ||||||||||||||||||||||||||||||||||||||||||||||||||
if len( size_local ) == 1: | ||||||||||||||||||||||||||||||||||||||||||||||||||
local_array = local_array.reshape( -1, 1 ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_array[ mapping ] = local_array | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def implement_arrays( mesh: vtkUnstructuredGrid, global_arrays: dict[ str, array ], options: Options ) -> None: | ||||||||||||||||||||||||||||||||||||||||||||||||||
"""Implement the arrays that are contained in global_arrays into the Data of a mesh. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||
mesh (vtkUnstructuredGrid): A vtk grid. | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_arrays (dict[ str, np.array ]): { "array_name0": np.array, ..., "array_nameN": np.array } | ||||||||||||||||||||||||||||||||||||||||||||||||||
options (Options): Options chosen by the user. | ||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||
data = mesh.GetPointData() if options.support == __SUPPORT_CHOICES[ 0 ] else mesh.GetCellData() | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Defaulting to Either the |
||||||||||||||||||||||||||||||||||||||||||||||||||
number_elements: int = mesh.GetNumberOfPoints() if options.support == __SUPPORT_CHOICES[ 0 ] else \ | ||||||||||||||||||||||||||||||||||||||||||||||||||
mesh.GetNumberOfCells() | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
arrays_to_implement: dict[ str, array ] = dict() | ||||||||||||||||||||||||||||||||||||||||||||||||||
# proceed operations | ||||||||||||||||||||||||||||||||||||||||||||||||||
for function_newname in tqdm( options.operations, desc="Performing operations" ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
funct, new_name = function_newname | ||||||||||||||||||||||||||||||||||||||||||||||||||
if funct in create_precoded_fields: | ||||||||||||||||||||||||||||||||||||||||||||||||||
created_arr: array = create_precoded_fields[ funct ]( mesh, options.support ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
created_arr = evaluate( funct, local_dict=global_arrays ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
arrays_to_implement[ new_name ] = created_arr | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
# once the data is selected, we can implement the global arrays inside it | ||||||||||||||||||||||||||||||||||||||||||||||||||
for final_name, final_array in arrays_to_implement.items(): | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_columns: int = final_array.shape[ 1 ] if len( final_array.shape ) == 2 else 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
if number_columns > 1: # Reshape the VTK array to match the original dimensions | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_array = numpy_to_vtk( final_array.flatten() ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_array.SetNumberOfComponents( number_columns ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_array.SetNumberOfTuples( number_elements ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_array = numpy_to_vtk( final_array ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
vtk_array.SetName( final_name ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
data.AddArray( vtk_array ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def __check( grid_ref: vtkUnstructuredGrid, options: Options ) -> Result: | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_vtu_filepaths: tuple[ str ] = get_vtu_filepaths( options ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
array_names_to_collect, new_options = get_array_names_to_collect_and_options( sub_vtu_filepaths[ 0 ], options ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if len( array_names_to_collect ) == 0: | ||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( "No array corresponding to the operations suggested was found in the source" + | ||||||||||||||||||||||||||||||||||||||||||||||||||
f" {new_options.support} data. Check your support and source file." ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# create the output grid | ||||||||||||||||||||||||||||||||||||||||||||||||||
output_mesh: vtkUnstructuredGrid = grid_ref.NewInstance() | ||||||||||||||||||||||||||||||||||||||||||||||||||
output_mesh.CopyStructure( grid_ref ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
output_mesh.CopyAttributes( grid_ref ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# find the support elements to use and construct their KDTree | ||||||||||||||||||||||||||||||||||||||||||||||||||
support_elements: array = support_construction[ new_options.support ]( output_mesh ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_elements: int = support_elements.shape[ 0 ] | ||||||||||||||||||||||||||||||||||||||||||||||||||
kd_tree_ref: KDTree = KDTree( support_elements ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# perform operations to construct the global arrays to implement in the output mesh from copy | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_arrays: dict[ str, array ] = dict() | ||||||||||||||||||||||||||||||||||||||||||||||||||
for vtu_id in tqdm( range( len( sub_vtu_filepaths ) ), desc="Processing VTU files" ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_grid: vtkUnstructuredGrid = read_mesh( sub_vtu_filepaths[ vtu_id ] ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_data = sub_grid.GetPointData() if new_options.support == __SUPPORT_CHOICES[ 0 ] else sub_grid.GetCellData() | ||||||||||||||||||||||||||||||||||||||||||||||||||
usable_arrays: list[ tuple[ int, str ] ] = list() | ||||||||||||||||||||||||||||||||||||||||||||||||||
for array_index in range( sub_data.GetNumberOfArrays() ): | ||||||||||||||||||||||||||||||||||||||||||||||||||
array_name: str = sub_data.GetArrayName( array_index ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if array_name in array_names_to_collect: | ||||||||||||||||||||||||||||||||||||||||||||||||||
usable_arrays.append( ( array_index, array_name ) ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if not array_name in global_arrays: | ||||||||||||||||||||||||||||||||||||||||||||||||||
number_components: int = sub_data.GetArray( array_index ).GetNumberOfComponents() | ||||||||||||||||||||||||||||||||||||||||||||||||||
global_arrays[ array_name ] = full( ( number_elements, number_components ), nan ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
if len( usable_arrays ) > 0: | ||||||||||||||||||||||||||||||||||||||||||||||||||
reorder_mapping: array = get_reorder_mapping( kd_tree_ref, sub_grid, new_options.support ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
for index_name in usable_arrays: | ||||||||||||||||||||||||||||||||||||||||||||||||||
sub_array: array = vtk_to_numpy( sub_data.GetArray( index_name[ 0 ] ) ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
merge_local_in_global_array( global_arrays[ index_name[ 1 ] ], sub_array, reorder_mapping ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
# The global arrays have been filled, so now we need to implement them in the output_mesh | ||||||||||||||||||||||||||||||||||||||||||||||||||
implement_arrays( output_mesh, global_arrays, new_options ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
write_mesh( output_mesh, new_options.vtk_output ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return Result( info="OK" ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
def check( vtk_input_file: str, options: Options ) -> Result: | ||||||||||||||||||||||||||||||||||||||||||||||||||
mesh = read_mesh( vtk_input_file ) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return __check( mesh, options ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would move the "local" imports at the end