generate configuration from table
This commit is contained in:
parent
0c68d293b6
commit
75401dd280
|
@ -5,6 +5,7 @@ import numpy as np
|
||||||
from . import Config
|
from . import Config
|
||||||
from . import Lattice
|
from . import Lattice
|
||||||
from . import Rotation
|
from . import Rotation
|
||||||
|
from . import Table
|
||||||
|
|
||||||
class ConfigMaterial(Config):
|
class ConfigMaterial(Config):
|
||||||
"""Material configuration."""
|
"""Material configuration."""
|
||||||
|
@ -23,6 +24,22 @@ class ConfigMaterial(Config):
|
||||||
"""
|
"""
|
||||||
super().save(fname,**kwargs)
|
super().save(fname,**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def load_table(fname,coordinates=None,constituents={},**kwargs):
|
||||||
|
t = Table.load(fname)
|
||||||
|
if coordinates is not None: t = t.sort_by([f'{i}_{coordinates}' for i in range(3,0,-1)])
|
||||||
|
constituents_ = {k:t.get(v) for k,v in constituents.items()}
|
||||||
|
kwargs_ = {k:t.get(v) for k,v in kwargs.items()}
|
||||||
|
|
||||||
|
_,idx = np.unique(np.hstack(list({**constituents_,**kwargs_}.values())),return_index=True,axis=0)
|
||||||
|
|
||||||
|
constituents_ = {k:v[idx].squeeze() for k,v in constituents_.items()}
|
||||||
|
kwargs_ = {k:v[idx].squeeze() for k,v in kwargs_.items()}
|
||||||
|
|
||||||
|
return ConfigMaterial().material_add(constituents_,**kwargs_)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_complete(self):
|
def is_complete(self):
|
||||||
"""Check for completeness."""
|
"""Check for completeness."""
|
||||||
|
@ -180,7 +197,9 @@ class ConfigMaterial(Config):
|
||||||
"""
|
"""
|
||||||
c = [{'constituents':u} for u in ConfigMaterial._constituents(**constituents)]
|
c = [{'constituents':u} for u in ConfigMaterial._constituents(**constituents)]
|
||||||
for k,v in kwargs.items():
|
for k,v in kwargs.items():
|
||||||
if isinstance(v,np.ndarray):
|
if hasattr(v,'__len__') and not isinstance(v,str):
|
||||||
|
if len(v) != len(c):
|
||||||
|
raise ValueError('len mismatch 1')
|
||||||
for i,vv in enumerate(v):
|
for i,vv in enumerate(v):
|
||||||
c[i][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item()
|
c[i][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item()
|
||||||
else:
|
else:
|
||||||
|
@ -195,6 +214,7 @@ class ConfigMaterial(Config):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _constituents(N=1,**kwargs):
|
def _constituents(N=1,**kwargs):
|
||||||
|
"""Construct list of constituents."""
|
||||||
for v in kwargs.values():
|
for v in kwargs.values():
|
||||||
if hasattr(v,'__len__') and not isinstance(v,str): N_material = len(v)
|
if hasattr(v,'__len__') and not isinstance(v,str): N_material = len(v)
|
||||||
|
|
||||||
|
@ -203,7 +223,7 @@ class ConfigMaterial(Config):
|
||||||
for k,v in kwargs.items():
|
for k,v in kwargs.items():
|
||||||
if hasattr(v,'__len__') and not isinstance(v,str):
|
if hasattr(v,'__len__') and not isinstance(v,str):
|
||||||
if len(v) != N_material:
|
if len(v) != N_material:
|
||||||
raise ValueError
|
raise ValueError('len mismatch 2')
|
||||||
for i,vv in enumerate(np.array(v)):
|
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()
|
m[i][0][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item()
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -33,6 +33,10 @@ class Table:
|
||||||
"""Brief overview."""
|
"""Brief overview."""
|
||||||
return util.srepr(self.comments)+'\n'+self.data.__repr__()
|
return util.srepr(self.comments)+'\n'+self.data.__repr__()
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
"""Number of rows."""
|
||||||
|
return len(self.data)
|
||||||
|
|
||||||
def __copy__(self):
|
def __copy__(self):
|
||||||
"""Copy Table."""
|
"""Copy Table."""
|
||||||
return copy.deepcopy(self)
|
return copy.deepcopy(self)
|
||||||
|
|
Loading…
Reference in New Issue