fairly general function to generate material configuration

This commit is contained in:
Martin Diehl 2020-10-08 21:29:58 +02:00
parent 952ad4f8fe
commit 6ecaaa31c9
1 changed files with 58 additions and 4 deletions

View File

@ -62,10 +62,10 @@ class ConfigMaterial(Config):
print(f'No lattice specified in phase {k}') print(f'No lattice specified in phase {k}')
ok = False ok = False
#for k,v in self['homogenization'].items(): for k,v in self['homogenization'].items():
# if 'N_constituents' not in v: if 'N_constituents' not in v:
# print(f'No. of constituents not specified in homogenization {k}'} print(f'No. of constituents not specified in homogenization {k}')
# ok = False ok = False
if phase - set(self['phase']): if phase - set(self['phase']):
print(f'Phase(s) {phase-set(self["phase"])} missing') print(f'Phase(s) {phase-set(self["phase"])} missing')
@ -158,3 +158,57 @@ class ConfigMaterial(Config):
except KeyError: except KeyError:
continue continue
return dup return dup
def material_add(self,constituents,**kwargs):
"""
Add material entries.
Parameters
----------
constituents: scalar or numpy.ndarray
**kwargs: tbd
Examples
--------
m = damask.ConfigMaterial()
O = damask.Rotation.from_random(3).as_quaternion()
phase = ['Aluminum','Steel','Aluminum']
m.material_add(constituents={'phase':phase,'O':O},homogenization='SX')
"""
c = [{'constituents':u} for u in ConfigMaterial._constituents(**constituents)]
for k,v in kwargs.items():
if isinstance(v,np.ndarray):
for i,vv in enumerate(v):
c[i][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item()
else:
for i in range(len(c)):
c[i][k] = v
dup = copy.deepcopy(self)
if 'material' not in dup: dup['material'] = []
dup['material'] +=c
return dup
@staticmethod
def _constituents(N=1,**kwargs):
for v in kwargs.values():
if hasattr(v,'__len__') and not isinstance(v,str): N_material = len(v)
if N == 1:
m = [[{'fraction':1.0}] for _ in range(N_material)]
for k,v in kwargs.items():
if hasattr(v,'__len__') and not isinstance(v,str):
if len(v) != N_material:
raise ValueError
for i,vv in enumerate(np.array(v)):
m[i][0][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item()
else:
for i in range(N_material):
m[i][0][k] = v
return m
else:
raise NotImplementedError