first ideas for more user friendly usage
This commit is contained in:
parent
2e96fcf768
commit
b19ec4f8ae
|
@ -11,6 +11,7 @@ from collections import defaultdict
|
||||||
|
|
||||||
import h5py
|
import h5py
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import numpy.ma as ma
|
||||||
from numpy.lib import recfunctions as rfn
|
from numpy.lib import recfunctions as rfn
|
||||||
|
|
||||||
import damask
|
import damask
|
||||||
|
@ -345,76 +346,6 @@ class Result:
|
||||||
raise PermissionError('Rename operation not permitted')
|
raise PermissionError('Rename operation not permitted')
|
||||||
|
|
||||||
|
|
||||||
def place(self,datasets,constituent=0,tagged=False,split=True):
|
|
||||||
"""
|
|
||||||
Distribute datasets onto geometry and return Table or (split) dictionary of Tables.
|
|
||||||
|
|
||||||
Must not mix nodal end cell data.
|
|
||||||
|
|
||||||
Only data within
|
|
||||||
- inc*/phase/*/*
|
|
||||||
- inc*/homogenization/*/*
|
|
||||||
- inc*/geometry/*
|
|
||||||
are considered.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
datasets : iterable or str
|
|
||||||
constituent : int
|
|
||||||
Constituent to consider for phase data.
|
|
||||||
tagged : bool
|
|
||||||
Tag Table.column name with '#constituent'.
|
|
||||||
Defaults to False.
|
|
||||||
split : bool
|
|
||||||
Split Table by increment and return dictionary of Tables.
|
|
||||||
Defaults to True.
|
|
||||||
|
|
||||||
"""
|
|
||||||
sets = datasets if hasattr(datasets,'__iter__') and not isinstance(datasets,str) else \
|
|
||||||
[datasets]
|
|
||||||
tag = f'#{constituent}' if tagged else ''
|
|
||||||
tbl = {} if split else None
|
|
||||||
inGeom = {}
|
|
||||||
inData = {}
|
|
||||||
# compatibility hack
|
|
||||||
name = 'Name' if self.version_minor < 12 else 'label'
|
|
||||||
member = 'Position' if self.version_minor < 12 else 'entry'
|
|
||||||
grp = 'mapping' if self.version_minor < 12 else 'cell_to'
|
|
||||||
with h5py.File(self.fname,'r') as f:
|
|
||||||
for dataset in sets:
|
|
||||||
for group in self.groups_with_datasets(dataset):
|
|
||||||
path = '/'.join([group,dataset])
|
|
||||||
inc,prop,name,cat,item = (path.split('/') + ['']*5)[:5]
|
|
||||||
key = '/'.join([prop,name+tag])
|
|
||||||
if key not in inGeom:
|
|
||||||
if prop == 'geometry':
|
|
||||||
inGeom[key] = inData[key] = np.arange(self.N_materialpoints)
|
|
||||||
elif prop == 'phase':
|
|
||||||
inGeom[key] = np.where(f[f'{grp}/phase'][:,constituent][name] == str.encode(name))[0]
|
|
||||||
inData[key] = f[f'{grp}/phase'][inGeom[key],constituent][member]
|
|
||||||
elif prop == 'homogenization':
|
|
||||||
inGeom[key] = np.where(f[f'{grp}/homogenization'][name] == str.encode(name))[0]
|
|
||||||
inData[key] = f[f'{grp}/homogenization'][inGeom[key].tolist()][member]
|
|
||||||
shape = np.shape(f[path])
|
|
||||||
data = np.full((self.N_materialpoints,) + (shape[1:] if len(shape)>1 else (1,)),
|
|
||||||
np.nan,
|
|
||||||
dtype=np.dtype(f[path]))
|
|
||||||
data[inGeom[key]] = (f[path] if len(shape)>1 else np.expand_dims(f[path],1))[inData[key]]
|
|
||||||
path = ('/'.join([prop,name]+([cat] if cat else [])+([item] if item else [])) if split else path)+tag
|
|
||||||
if split:
|
|
||||||
try:
|
|
||||||
tbl[inc] = tbl[inc].add(path,data)
|
|
||||||
except KeyError:
|
|
||||||
tbl[inc] = Table(data.reshape(self.N_materialpoints,-1),{path:data.shape[1:]})
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
tbl = tbl.add(path,data)
|
|
||||||
except AttributeError:
|
|
||||||
tbl = Table(data.reshape(self.N_materialpoints,-1),{path:data.shape[1:]})
|
|
||||||
|
|
||||||
return tbl
|
|
||||||
|
|
||||||
|
|
||||||
def groups_with_datasets(self,datasets):
|
def groups_with_datasets(self,datasets):
|
||||||
"""
|
"""
|
||||||
Return groups that contain all requested datasets.
|
Return groups that contain all requested datasets.
|
||||||
|
@ -1385,3 +1316,73 @@ class Result:
|
||||||
v.add(u,'u')
|
v.add(u,'u')
|
||||||
|
|
||||||
v.save(f'{self.fname.stem}_inc{inc[ln:].zfill(N_digits)}')
|
v.save(f'{self.fname.stem}_inc{inc[ln:].zfill(N_digits)}')
|
||||||
|
|
||||||
|
|
||||||
|
def read(self,labels):
|
||||||
|
r = {}
|
||||||
|
labels_ = labels if isinstance(labels,list) else [labels] # check for arbitrary iterable
|
||||||
|
with h5py.File(self.fname,'r') as f:
|
||||||
|
for inc in util.show_progress(self.visible['increments'],len(self.visible['increments'])):
|
||||||
|
r[inc] = {'phase':{},'homogenization':{}}
|
||||||
|
for ph in self.visible['phases']:
|
||||||
|
r[inc]['phase'][ph] = {}
|
||||||
|
for me in f[os.path.join(inc,'phase',ph)].keys():
|
||||||
|
r[inc]['phase'][ph][me] = {}
|
||||||
|
for da in f[os.path.join(inc,'phase',ph,me)].keys():
|
||||||
|
if da in labels_:
|
||||||
|
r[inc]['phase'][ph][me][da] = \
|
||||||
|
f[os.path.join(inc,'phase',ph,me,da)][()]
|
||||||
|
for ho in self.visible['homogenizations']:
|
||||||
|
r[inc]['homogenization'][ho] = {}
|
||||||
|
for me in f[os.path.join(inc,'homogenization',ho)].keys():
|
||||||
|
r[inc]['homogenization'][ho][me] = {}
|
||||||
|
for da in f[os.path.join(inc,'homogenization',ho,me)].keys():
|
||||||
|
if da in labels_:
|
||||||
|
r[inc]['homogenization'][ho][me][da] = \
|
||||||
|
f[os.path.join(inc,'homogenization',ho,me,da)][()]
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def place(self,labels,fill_int=0,fill_float=0,constituents=None):
|
||||||
|
r = {}
|
||||||
|
|
||||||
|
labels_ = labels if isinstance(labels,list) else [labels] # check for arbitrary iterable
|
||||||
|
if constituents is None:
|
||||||
|
constituents_ = range(self.N_constituents)
|
||||||
|
else:
|
||||||
|
constituents_ = labels if isinstance(labels,list) else [labels] # allow abribtrary iterable
|
||||||
|
|
||||||
|
|
||||||
|
grp = 'mapping' if self.version_minor < 12 else 'cell_to'
|
||||||
|
name = 'Name' if self.version_minor < 12 else 'label'
|
||||||
|
|
||||||
|
with h5py.File(self.fname,'r') as f:
|
||||||
|
N_cells = self.cells.prod() if self.structured else np.shape(f['/geometry/T_c'])[0]
|
||||||
|
|
||||||
|
to_cell_ph = []
|
||||||
|
for c in constituents_:
|
||||||
|
to_cell_ph.append({label: np.where(f[os.path.join(grp,'phase')][:,c][name] == str.encode(label))[0] \
|
||||||
|
for label in self.visible['phases']})
|
||||||
|
to_cell_ho = {label: np.where(f[os.path.join(grp,'homogenization')][name] == str.encode(label))[0] \
|
||||||
|
for label in self.visible['homogenizations']}
|
||||||
|
|
||||||
|
for inc in util.show_progress(self.visible['increments'],len(self.visible['increments'])):
|
||||||
|
r[inc] = {'phase':{},'homogenization':{}}
|
||||||
|
for ph in self.visible['phases']:
|
||||||
|
for me in f[os.path.join(inc,'phase',ph)].keys():
|
||||||
|
r[inc]['phase'][me] = {}
|
||||||
|
for da in f[os.path.join(inc,'phase',ph,me)].keys():
|
||||||
|
if da in labels_:
|
||||||
|
data = f[os.path.join(inc,'phase',ph,me,da)][()]
|
||||||
|
|
||||||
|
unit = f[os.path.join(inc,'phase',ph,me,da)].attrs['unit']
|
||||||
|
description = f[os.path.join(inc,'phase',ph,me,da)].attrs['description']
|
||||||
|
if not h5py3:
|
||||||
|
description = description.decode()
|
||||||
|
unit = unit.decode()
|
||||||
|
|
||||||
|
if da not in r[inc]['phase'][me].keys():
|
||||||
|
dt = np.dtype(data.dtype,metadata={'description':description,
|
||||||
|
'unit':unit})
|
||||||
|
r[inc]['phase'][me][da] = ma.empty((N_cells,)+data.shape[1:],dtype=dt)
|
||||||
|
return r
|
||||||
|
|
Loading…
Reference in New Issue