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
from scipy import ndimage,spatial
from vtk.util.numpy_support import vtk_to_numpy as vtk_to_np
from . import environment
from . import Rotation
@ -271,16 +270,6 @@ class Geom:
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
def from_file(fname):
"""
@ -356,19 +345,12 @@ class Geom:
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
grid = np.array(g.GetDimensions())-1
bbox = np.array(g.GetBounds()).reshape(3,2).T
v = VTK.from_file(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
grid = np.array(v.geom.GetDimensions())-1
bbox = np.array(v.geom.GetBounds()).reshape(3,2).T
size = bbox[1] - bbox[0]
celldata = g.GetCellData()
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}')
return Geom(v.get('materialpoint').reshape(grid,order='F'),size,bbox[0])
@staticmethod
@ -417,7 +399,7 @@ class Geom:
else:
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)
@ -442,7 +424,7 @@ class Geom:
KDTree = spatial.cKDTree(seeds,boxsize=size) if periodic else spatial.cKDTree(seeds)
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)
@ -458,8 +440,13 @@ class Geom:
Compress geometry with 'x of y' and 'a to b'.
"""
header = self.get_header()
grid = self.get_grid()
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()}')
grid = self.get_grid()
if pack is None:
plain = grid.prod()/self.N_microstructure < 250
@ -490,7 +477,7 @@ class Geom:
reps += 1
else:
if compressType is None:
f.write('\n'.join(self.get_header())+'\n')
f.write('\n'.join(header)+'\n')
elif compressType == '.':
f.write(f'{former}\n')
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)
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)
@ -620,7 +607,7 @@ class Geom:
if 'x' in directions:
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)
@ -636,7 +623,7 @@ class Geom:
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(
ndimage.interpolation.zoom(
self.microstructure,
@ -671,7 +658,7 @@ class Geom:
else:
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(
self.microstructure,
mostFrequent,
@ -688,7 +675,7 @@ class Geom:
for i, oldID in enumerate(np.unique(self.microstructure)):
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)
@ -723,7 +710,7 @@ class Geom:
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)
@ -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]]
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)
@ -776,7 +763,7 @@ class Geom:
for from_ms,to_ms in zip(from_microstructure,to_microstructure):
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)
@ -822,5 +809,5 @@ class Geom:
extra_keywords={'trigger':trigger})
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)