more logical encapsulation

- getting data out of VTK is a functionality of the VTK class. Need to
  discuss whether the VTK class should also provide grid and size (works
  only for rectilinear grid, so hiding VTK type is not possible
  anymore), but the current situation requires the Geom class to rely on
  'internals' of the VTK class
- header is specific to *.geom format, not to Geom objects.
This commit is contained in:
Martin Diehl 2020-08-24 06:46:22 +02:00
parent 507a165733
commit 0d3ef29554
1 changed files with 23 additions and 36 deletions

View File

@ -7,7 +7,6 @@ from functools import partial
import numpy as np import numpy as np
from scipy import ndimage,spatial from scipy import ndimage,spatial
from vtk.util.numpy_support import vtk_to_numpy as vtk_to_np
from . import environment from . import environment
from . import Rotation from . import Rotation
@ -271,16 +270,6 @@ class Geom:
return self.comments[:] return self.comments[:]
def get_header(self):
"""Return the full header (grid, size, origin, homogenization, comments)."""
header = [f'{len(self.comments)+4} header'] + self.comments
header.append('grid a {} b {} c {}'.format(*self.get_grid()))
header.append('size x {} y {} z {}'.format(*self.get_size()))
header.append('origin x {} y {} z {}'.format(*self.get_origin()))
header.append(f'homogenization {self.get_homogenization()}')
return header
@staticmethod @staticmethod
def from_file(fname): def from_file(fname):
""" """
@ -356,19 +345,12 @@ class Geom:
Valid extension is .vtr, it will be appended if not given. Valid extension is .vtr, it will be appended if not given.
""" """
g = VTK.from_file(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr').geom v = VTK.from_file(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
grid = np.array(g.GetDimensions())-1 grid = np.array(v.geom.GetDimensions())-1
bbox = np.array(g.GetBounds()).reshape(3,2).T bbox = np.array(v.geom.GetBounds()).reshape(3,2).T
size = bbox[1] - bbox[0] size = bbox[1] - bbox[0]
celldata = g.GetCellData() return Geom(v.get('materialpoint').reshape(grid,order='F'),size,bbox[0])
for a in range(celldata.GetNumberOfArrays()):
if celldata.GetArrayName(a) == 'materialpoint':
materialpoint = vtk_to_np(celldata.GetArray(a))
return Geom(materialpoint.reshape(grid,order='F'),size,bbox[0])
raise ValueError(f'"materialpoint" array not found in {fname}')
@staticmethod @staticmethod
@ -417,7 +399,7 @@ class Geom:
else: else:
microstructure = microstructure.reshape(grid) microstructure = microstructure.reshape(grid)
creator = util.edit_info('damask.Result.'+inspect.stack()[0][3]) creator = util.edit_info('damask.Geom.'+inspect.stack()[0][3])
return Geom(microstructure+1,size,homogenization=1,comments=creator) return Geom(microstructure+1,size,homogenization=1,comments=creator)
@ -442,7 +424,7 @@ class Geom:
KDTree = spatial.cKDTree(seeds,boxsize=size) if periodic else spatial.cKDTree(seeds) KDTree = spatial.cKDTree(seeds,boxsize=size) if periodic else spatial.cKDTree(seeds)
devNull,microstructure = KDTree.query(coords) devNull,microstructure = KDTree.query(coords)
creator = util.edit_info('damask.Result.'+inspect.stack()[0][3]) creator = util.edit_info('damask.Geom.'+inspect.stack()[0][3])
return Geom(microstructure.reshape(grid)+1,size,homogenization=1,comments=creator) return Geom(microstructure.reshape(grid)+1,size,homogenization=1,comments=creator)
@ -458,8 +440,13 @@ class Geom:
Compress geometry with 'x of y' and 'a to b'. Compress geometry with 'x of y' and 'a to b'.
""" """
header = self.get_header() header = [f'{len(self.comments)+4} header'] + self.comments
grid = self.get_grid() header.append('grid a {} b {} c {}'.format(*self.get_grid()))
header.append('size x {} y {} z {}'.format(*self.get_size()))
header.append('origin x {} y {} z {}'.format(*self.get_origin()))
header.append(f'homogenization {self.get_homogenization()}')
grid = self.get_grid()
if pack is None: if pack is None:
plain = grid.prod()/self.N_microstructure < 250 plain = grid.prod()/self.N_microstructure < 250
@ -490,7 +477,7 @@ class Geom:
reps += 1 reps += 1
else: else:
if compressType is None: if compressType is None:
f.write('\n'.join(self.get_header())+'\n') f.write('\n'.join(header)+'\n')
elif compressType == '.': elif compressType == '.':
f.write(f'{former}\n') f.write(f'{former}\n')
elif compressType == 'to': elif compressType == 'to':
@ -589,7 +576,7 @@ class Geom:
fill_ = np.full_like(self.microstructure,np.nanmax(self.microstructure)+1 if fill is None else fill) fill_ = np.full_like(self.microstructure,np.nanmax(self.microstructure)+1 if fill is None else fill)
ms = np.ma.MaskedArray(fill_,np.logical_not(mask) if inverse else mask) ms = np.ma.MaskedArray(fill_,np.logical_not(mask) if inverse else mask)
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(ms) return self.update(ms)
@ -620,7 +607,7 @@ class Geom:
if 'x' in directions: if 'x' in directions:
ms = np.concatenate([ms,ms[limits[0]:limits[1]:-1,:,:]],0) ms = np.concatenate([ms,ms[limits[0]:limits[1]:-1,:,:]],0)
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(ms,rescale=True) return self.update(ms,rescale=True)
@ -636,7 +623,7 @@ class Geom:
Assume geometry to be periodic. Defaults to True. Assume geometry to be periodic. Defaults to True.
""" """
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update( return self.update(
ndimage.interpolation.zoom( ndimage.interpolation.zoom(
self.microstructure, self.microstructure,
@ -671,7 +658,7 @@ class Geom:
else: else:
return me return me
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(ndimage.filters.generic_filter( return self.update(ndimage.filters.generic_filter(
self.microstructure, self.microstructure,
mostFrequent, mostFrequent,
@ -688,7 +675,7 @@ class Geom:
for i, oldID in enumerate(np.unique(self.microstructure)): for i, oldID in enumerate(np.unique(self.microstructure)):
renumbered = np.where(self.microstructure == oldID, i+1, renumbered) renumbered = np.where(self.microstructure == oldID, i+1, renumbered)
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(renumbered) return self.update(renumbered)
@ -723,7 +710,7 @@ class Geom:
origin = self.origin-(np.asarray(microstructure_in.shape)-self.grid)*.5 * self.size/self.grid origin = self.origin-(np.asarray(microstructure_in.shape)-self.grid)*.5 * self.size/self.grid
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(microstructure_in,origin=origin,rescale=True) return self.update(microstructure_in,origin=origin,rescale=True)
@ -756,7 +743,7 @@ class Geom:
canvas[ll[0]:ur[0],ll[1]:ur[1],ll[2]:ur[2]] = self.microstructure[LL[0]:UR[0],LL[1]:UR[1],LL[2]:UR[2]] canvas[ll[0]:ur[0],ll[1]:ur[1],ll[2]:ur[2]] = self.microstructure[LL[0]:UR[0],LL[1]:UR[1],LL[2]:UR[2]]
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(canvas,origin=self.origin+offset*self.size/self.grid,rescale=True) return self.update(canvas,origin=self.origin+offset*self.size/self.grid,rescale=True)
@ -776,7 +763,7 @@ class Geom:
for from_ms,to_ms in zip(from_microstructure,to_microstructure): for from_ms,to_ms in zip(from_microstructure,to_microstructure):
substituted[self.microstructure==from_ms] = to_ms substituted[self.microstructure==from_ms] = to_ms
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(substituted) return self.update(substituted)
@ -822,5 +809,5 @@ class Geom:
extra_keywords={'trigger':trigger}) extra_keywords={'trigger':trigger})
microstructure = np.ma.MaskedArray(self.microstructure + offset_, np.logical_not(mask)) microstructure = np.ma.MaskedArray(self.microstructure + offset_, np.logical_not(mask))
self.add_comments(util.edit_info('damask.Result.'+inspect.stack()[0][3])) self.add_comments(util.edit_info('damask.Geom.'+inspect.stack()[0][3]))
return self.update(microstructure) return self.update(microstructure)