2020-09-19 16:31:19 +05:30
|
|
|
import os
|
|
|
|
|
|
|
|
import pytest
|
2020-10-29 12:12:41 +05:30
|
|
|
import numpy as np
|
2020-09-19 16:31:19 +05:30
|
|
|
|
2020-09-30 11:23:25 +05:30
|
|
|
from damask import ConfigMaterial
|
2020-10-29 12:12:41 +05:30
|
|
|
from damask import Table
|
2020-09-19 16:31:19 +05:30
|
|
|
|
|
|
|
@pytest.fixture
|
2020-11-30 01:20:41 +05:30
|
|
|
def ref_path(ref_path_base):
|
2020-09-19 16:31:19 +05:30
|
|
|
"""Directory containing reference results."""
|
2020-11-30 01:20:41 +05:30
|
|
|
return ref_path_base/'ConfigMaterial'
|
2020-09-19 16:31:19 +05:30
|
|
|
|
|
|
|
|
2020-09-30 12:19:55 +05:30
|
|
|
class TestConfigMaterial:
|
|
|
|
|
2020-09-19 16:31:19 +05:30
|
|
|
@pytest.mark.parametrize('fname',[None,'test.yaml'])
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_load_save(self,ref_path,tmp_path,fname):
|
|
|
|
reference = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-09-19 16:31:19 +05:30
|
|
|
os.chdir(tmp_path)
|
|
|
|
if fname is None:
|
|
|
|
reference.save()
|
2020-09-30 11:23:25 +05:30
|
|
|
new = ConfigMaterial.load('material.yaml')
|
2020-09-19 16:31:19 +05:30
|
|
|
else:
|
|
|
|
reference.save(fname)
|
2020-09-30 11:23:25 +05:30
|
|
|
new = ConfigMaterial.load(fname)
|
2020-09-19 16:31:19 +05:30
|
|
|
assert reference == new
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_valid_complete(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-09-19 16:31:19 +05:30
|
|
|
assert material_config.is_valid and material_config.is_complete
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_invalid_lattice(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-09-19 16:31:19 +05:30
|
|
|
material_config['phase']['Aluminum']['lattice']='fxc'
|
|
|
|
assert not material_config.is_valid
|
2020-09-30 12:19:55 +05:30
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_invalid_orientation(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
material_config['material'][0]['constituents'][0]['O']=[0,0,0,0]
|
2020-09-19 16:31:19 +05:30
|
|
|
assert not material_config.is_valid
|
2020-09-30 12:19:55 +05:30
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_invalid_fraction(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
material_config['material'][0]['constituents'][0]['fraction']=.9
|
2020-09-19 16:31:19 +05:30
|
|
|
assert not material_config.is_valid
|
|
|
|
|
2020-10-02 21:19:52 +05:30
|
|
|
@pytest.mark.parametrize('item',['homogenization','phase','material'])
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_missing(self,ref_path,item):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-09-19 16:31:19 +05:30
|
|
|
del material_config[item]
|
|
|
|
assert not material_config.is_complete
|
2020-09-30 12:19:55 +05:30
|
|
|
|
2020-10-02 21:19:52 +05:30
|
|
|
@pytest.mark.parametrize('item',['O','phase'])
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_material_constituent(self,ref_path,item):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
del material_config['material'][0]['constituents'][0][item]
|
2020-09-30 12:19:55 +05:30
|
|
|
assert not material_config.is_complete
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_material_homogenization(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
del material_config['material'][0]['homogenization']
|
2020-09-30 12:19:55 +05:30
|
|
|
assert not material_config.is_complete
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_homogenization_N_constituents(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-11-14 21:43:38 +05:30
|
|
|
for h in material_config['homogenization'].keys():
|
|
|
|
del material_config['homogenization'][h]['N_constituents']
|
|
|
|
assert not material_config.is_complete
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_phase_lattice(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-09-30 12:19:55 +05:30
|
|
|
del material_config['phase']['Aluminum']['lattice']
|
|
|
|
assert not material_config.is_complete
|
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_wrong_phase(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
new = material_config.material_rename_phase({'Steel':'FeNbC'})
|
2020-09-19 16:31:19 +05:30
|
|
|
assert not new.is_complete
|
2020-09-30 12:19:55 +05:30
|
|
|
|
2020-11-30 01:20:41 +05:30
|
|
|
def test_incomplete_wrong_homogenization(self,ref_path):
|
|
|
|
material_config = ConfigMaterial.load(ref_path/'material.yaml')
|
2020-10-02 21:19:52 +05:30
|
|
|
new = material_config.material_rename_homogenization({'Taylor':'isostrain'})
|
2020-09-19 16:31:19 +05:30
|
|
|
assert not new.is_complete
|
2020-10-29 12:12:41 +05:30
|
|
|
|
|
|
|
def test_from_table(self):
|
|
|
|
N = np.random.randint(3,10)
|
|
|
|
a = np.vstack((np.hstack((np.arange(N),np.arange(N)[::-1])),np.ones(N*2),np.zeros(N*2),np.ones(N*2))).T
|
|
|
|
t = Table(a,{'varying':2,'constant':2})
|
|
|
|
c = ConfigMaterial.from_table(t,constituents={'a':'varying','b':'1_constant'},c='2_constant')
|
|
|
|
assert len(c['material']) == N
|
|
|
|
for i,m in enumerate(c['material']):
|
|
|
|
c = m['constituents'][0]
|
2020-11-14 21:43:38 +05:30
|
|
|
assert m['c'] == 1 and c['b'] == 0 and (c['a'] == [i,1]).all()
|
2020-10-29 12:12:41 +05:30
|
|
|
|
2020-11-14 21:43:38 +05:30
|
|
|
def test_constituents(self):
|
2020-10-31 14:26:43 +05:30
|
|
|
c = ConfigMaterial._constituents(c=1,v=[2,3])
|
|
|
|
assert c[0][0]['c'] == c[1][0]['c'] == 1
|
|
|
|
assert c[0][0]['v'] == c[1][0]['v'] -1 ==2
|
2020-11-14 21:43:38 +05:30
|
|
|
|
|
|
|
@pytest.mark.parametrize('constituents',[{'W':1,'X':[2,3]},{'Y':4},{'Z':[5,6]}])
|
|
|
|
@pytest.mark.parametrize('a',[[7.,8.],9.])
|
|
|
|
@pytest.mark.parametrize('b',['bd',['efg','hi']])
|
|
|
|
def test_material_add(self,tmp_path,constituents,a,b):
|
|
|
|
len_c = len(ConfigMaterial()._constituents(1,**constituents))
|
|
|
|
len_a = len(a) if isinstance(a,list) else 1
|
|
|
|
len_b = len(b) if isinstance(b,list) else 1
|
|
|
|
m = ConfigMaterial().material_add(constituents,a=a,b=b)
|
|
|
|
m.save()
|
|
|
|
assert len(m['material']) == np.max([len_a,len_b,len_c])
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('constituents',[{'W':1,'X':np.array([2,3])},{'Y':4},{'Z':np.array([5,6])}])
|
|
|
|
@pytest.mark.parametrize('a',[np.array([7,8]),9])
|
|
|
|
def test_material_add_np(self,tmp_path,constituents,a):
|
|
|
|
len_c = len(ConfigMaterial()._constituents(1,**constituents))
|
|
|
|
len_a = len(a) if isinstance(a,np.ndarray) else 1
|
|
|
|
m = ConfigMaterial().material_add(constituents,ld=a)
|
|
|
|
m.save()
|
|
|
|
assert len(m['material']) == np.max([len_a,len_c])
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('constituents',[{'X':np.array([2,3,4,5])},{'Y':4}])
|
|
|
|
@pytest.mark.parametrize('a',[np.array([1,2,3]),[4,5,6]])
|
|
|
|
@pytest.mark.parametrize('b',[np.array([6.,7.]),[8.,9.]])
|
|
|
|
def test_material_add_invalid(self,constituents,a,b):
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
ConfigMaterial().material_add(constituents,a=a,u=b)
|