Merge remote-tracking branch 'origin/vtk-add-label-data-table' into development

This commit is contained in:
Martin Diehl 2022-03-12 14:10:30 +01:00
commit 527c1c2225
5 changed files with 49 additions and 30 deletions

View File

@ -662,9 +662,9 @@ class Grid:
""" """
v = VTK.from_image_data(self.cells,self.size,self.origin)\ v = VTK.from_image_data(self.cells,self.size,self.origin)\
.add(self.material.flatten(order='F'),'material') .add('material',self.material.flatten(order='F'))
for label,data in self.ic.items(): for label,data in self.ic.items():
v = v.add(data.flatten(order='F'),label) v = v.add(label,data.flatten(order='F'))
v.comments = self.comments v.comments = self.comments
v.save(fname,parallel=False,compress=compress) v.save(fname,parallel=False,compress=compress)
@ -713,7 +713,7 @@ class Grid:
""" """
VTK.from_image_data(self.cells,self.size,self.origin) \ VTK.from_image_data(self.cells,self.size,self.origin) \
.add(self.material.flatten('F'),'material') \ .add('material',self.material.flatten('F'),) \
.show('material',colormap) .show('material',colormap)

View File

@ -1621,7 +1621,7 @@ class Result:
for inc in util.show_progress(self.visible['increments']): for inc in util.show_progress(self.visible['increments']):
u = _read(f['/'.join([inc,'geometry','u_n' if mode.lower() == 'cell' else 'u_p'])]) u = _read(f['/'.join([inc,'geometry','u_n' if mode.lower() == 'cell' else 'u_p'])])
v = v.add(u,'u') v = v.add('u',u)
for ty in ['phase','homogenization']: for ty in ['phase','homogenization']:
for field in self.visible['fields']: for field in self.visible['fields']:
@ -1648,7 +1648,7 @@ class Result:
outs[out][at_cell_ho[label]] = data[in_data_ho[label]] outs[out][at_cell_ho[label]] = data[in_data_ho[label]]
for label,dataset in outs.items(): for label,dataset in outs.items():
v = v.add(dataset,' / '.join(['/'.join([ty,field,label]),dataset.dtype.metadata['unit']])) v = v.add(' / '.join(['/'.join([ty,field,label]),dataset.dtype.metadata['unit']]),dataset)
v.save(f'{self.fname.stem}_inc{inc[10:].zfill(N_digits)}',parallel=parallel) v.save(f'{self.fname.stem}_inc{inc[10:].zfill(N_digits)}',parallel=parallel)

View File

@ -402,24 +402,32 @@ class VTK:
# Check https://blog.kitware.com/ghost-and-blanking-visibility-changes/ for missing data # Check https://blog.kitware.com/ghost-and-blanking-visibility-changes/ for missing data
def add(self, def add(self,
data: Union[np.ndarray, np.ma.MaskedArray, 'Table'], label: str = None,
label: str = None): data: Union[np.ndarray, np.ma.MaskedArray] = None,
*,
table: 'Table' = None):
""" """
Add data to either cells or points. Add data to either cells or points.
Data can either be a numpy.array, which requires a corresponding label,
or a damask.Table.
Parameters Parameters
---------- ----------
data : numpy.ndarray, numpy.ma.MaskedArray, or damask.Table label : str, optional
Label of data array.
data : numpy.ndarray or numpy.ma.MaskedArray, optional
Data to add. First dimension needs to match either Data to add. First dimension needs to match either
number of cells or number of points. number of cells or number of points.
label : str, optional if data is damask.Table table: damask.Table, optional
Data label. Data to add. Number of rows needs to match either
number of cells or number of points.
""" """
def _add_array(vtk_data, def _add_array(vtk_data,
data: np.ndarray, label: str,
label: str): data: np.ndarray):
N_data = data.shape[0] N_data = data.shape[0]
data_ = data.reshape(N_data,-1) \ data_ = data.reshape(N_data,-1) \
@ -441,17 +449,22 @@ class VTK:
else: else:
raise ValueError(f'data count mismatch ({N_data}{self.N_points} & {self.N_cells})') raise ValueError(f'data count mismatch ({N_data}{self.N_points} & {self.N_cells})')
if data is None and table is None:
raise KeyError('no data given')
if data is not None and table is not None:
raise KeyError('cannot use both, data and table')
dup = self.copy() dup = self.copy()
if isinstance(data,np.ndarray): if isinstance(data,np.ndarray):
if label is not None: if label is not None:
_add_array(dup.vtk_data, _add_array(dup.vtk_data,
np.where(data.mask,data.fill_value,data) if isinstance(data,np.ma.MaskedArray) else data, label,
label) np.where(data.mask,data.fill_value,data) if isinstance(data,np.ma.MaskedArray) else data)
else: else:
raise ValueError('no label defined for numpy.ndarray') raise ValueError('no label defined for data')
elif isinstance(data,Table): elif isinstance(table,Table):
for l in data.labels: for l in table.labels:
_add_array(dup.vtk_data,data.get(l),l) _add_array(dup.vtk_data,l,table.get(l))
else: else:
raise TypeError raise TypeError

View File

@ -58,7 +58,7 @@ class TestGrid:
def test_repr(self,default): def test_repr(self,default):
print(default) print(default)
def test_read_write_vtr(self,default,tmp_path): def test_read_write_vti(self,default,tmp_path):
default.save(tmp_path/'default') default.save(tmp_path/'default')
new = Grid.load(tmp_path/'default.vti') new = Grid.load(tmp_path/'default.vti')
assert new == default assert new == default

View File

@ -147,16 +147,22 @@ class TestVTK:
def test_invalid_add_shape(self,default): def test_invalid_add_shape(self,default):
with pytest.raises(ValueError): with pytest.raises(ValueError):
default.add(np.ones(3),'valid') default.add('valid',np.ones(3))
def test_invalid_add_missing_label(self,default): def test_invalid_add_missing_label(self,default):
data = np.random.randint(9,size=np.prod(np.array(default.vtk_data.GetDimensions())-1)) data = np.random.randint(9,size=np.prod(np.array(default.vtk_data.GetDimensions())-1))
with pytest.raises(ValueError): with pytest.raises(ValueError):
default.add(data) default.add(data=data)
def test_invalid_add_type(self,default): def test_invalid_add_type(self,default):
with pytest.raises(TypeError): with pytest.raises(TypeError):
default.add('invalid_type','valid') default.add(label='valid',data='invalid_type')
with pytest.raises(TypeError):
default.add(label='valid',table='invalid_type')
def test_invalid_add_dual(self,default):
with pytest.raises(KeyError):
default.add(label='valid',data=0,table=0)
@pytest.mark.parametrize('data_type,shape',[(float,(3,)), @pytest.mark.parametrize('data_type,shape',[(float,(3,)),
(float,(3,3)), (float,(3,3)),
@ -166,7 +172,7 @@ class TestVTK:
@pytest.mark.parametrize('N_values',[5*6*7,6*7*8]) @pytest.mark.parametrize('N_values',[5*6*7,6*7*8])
def test_add_get(self,default,data_type,shape,N_values): def test_add_get(self,default,data_type,shape,N_values):
data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type) data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type)
new = default.add(data,'data') new = default.add('data',data)
assert (np.squeeze(data.reshape(N_values,-1)) == new.get('data')).all() assert (np.squeeze(data.reshape(N_values,-1)) == new.get('data')).all()
@ -179,7 +185,7 @@ class TestVTK:
for k,s in shapes.items(): for k,s in shapes.items():
d[k] = dict(shape = s, d[k] = dict(shape = s,
data = np.random.random(N*np.prod(s)).reshape((N,-1))) data = np.random.random(N*np.prod(s)).reshape((N,-1)))
new = default.add(Table(shapes,np.column_stack([d[k]['data'] for k in shapes.keys()]))) new = default.add(table=Table(shapes,np.column_stack([d[k]['data'] for k in shapes.keys()])))
for k,s in shapes.items(): for k,s in shapes.items():
assert np.allclose(np.squeeze(d[k]['data']),new.get(k),rtol=1e-7) assert np.allclose(np.squeeze(d[k]['data']),new.get(k),rtol=1e-7)
@ -187,8 +193,8 @@ class TestVTK:
def test_add_masked(self,default): def test_add_masked(self,default):
data = np.random.rand(5*6*7,3) data = np.random.rand(5*6*7,3)
masked = ma.MaskedArray(data,mask=data<.4,fill_value=42.) masked = ma.MaskedArray(data,mask=data<.4,fill_value=42.)
mask_auto = default.add(masked,'D') mask_auto = default.add('D',masked)
mask_manual = default.add(np.where(masked.mask,masked.fill_value,masked),'D') mask_manual = default.add('D',np.where(masked.mask,masked.fill_value,masked))
assert mask_manual == mask_auto assert mask_manual == mask_auto
@ -202,7 +208,7 @@ class TestVTK:
data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type) data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type)
ALPHABET = np.array(list(string.ascii_lowercase + ' ')) ALPHABET = np.array(list(string.ascii_lowercase + ' '))
label = ''.join(np.random.choice(ALPHABET, size=10)) label = ''.join(np.random.choice(ALPHABET, size=10))
new = default.add(data,label) new = default.add(label,data)
if N_values == default.N_points: assert label in new.labels['Point Data'] if N_values == default.N_points: assert label in new.labels['Point Data']
if N_values == default.N_cells: assert label in new.labels['Cell Data'] if N_values == default.N_cells: assert label in new.labels['Cell Data']
@ -217,7 +223,7 @@ class TestVTK:
@pytest.mark.xfail(int(vtk.vtkVersion.GetVTKVersion().split('.')[0])<8, reason='missing METADATA') @pytest.mark.xfail(int(vtk.vtkVersion.GetVTKVersion().split('.')[0])<8, reason='missing METADATA')
def test_compare_reference_polyData(self,update,ref_path,tmp_path): def test_compare_reference_polyData(self,update,ref_path,tmp_path):
points=np.dstack((np.linspace(0.,1.,10),np.linspace(0.,2.,10),np.linspace(-1.,1.,10))).squeeze() points=np.dstack((np.linspace(0.,1.,10),np.linspace(0.,2.,10),np.linspace(-1.,1.,10))).squeeze()
polyData = VTK.from_poly_data(points).add(points,'coordinates') polyData = VTK.from_poly_data(points).add('coordinates',points)
if update: if update:
polyData.save(ref_path/'polyData') polyData.save(ref_path/'polyData')
else: else:
@ -234,8 +240,8 @@ class TestVTK:
c = coords[:-1,:-1,:-1,:].reshape(-1,3,order='F') c = coords[:-1,:-1,:-1,:].reshape(-1,3,order='F')
n = coords[:,:,:,:].reshape(-1,3,order='F') n = coords[:,:,:,:].reshape(-1,3,order='F')
rectilinearGrid = VTK.from_rectilinear_grid(grid) \ rectilinearGrid = VTK.from_rectilinear_grid(grid) \
.add(np.ascontiguousarray(c),'cell') \ .add('cell',np.ascontiguousarray(c)) \
.add(np.ascontiguousarray(n),'node') .add('node',np.ascontiguousarray(n))
if update: if update:
rectilinearGrid.save(ref_path/'rectilinearGrid') rectilinearGrid.save(ref_path/'rectilinearGrid')
else: else: