from dataclasses import dataclass, field#, asdict
import numpy as np
'''
Module introduction
'''
[docs]
def build():
"""
Build and return the material data base using classes in this module.
When no inputs are provided, defaults prescribed in the class data are used.
Returns
-------
ObjectDataDictionary
Material data dictionary accessible via ``matdata.data``.
Examples
--------
>>> from upxo.material.Material import build
>>> matdata = build()
>>> matdata.data.keys()
"""
from upxo._sup.ODDict import ObjectDataDictionary
matdata = ObjectDataDictionary()
from upxo.material.Material import MaterialIdentity, ProcessingCondition, IrradiationCondition
from upxo.material.Material import CrystalFamily, Phases, PhysicalProperty
from upxo.material.Material import ElasticProperty, TensileStressStrain, PlasticProperty
from upxo.material.Material import ExpDataAvailability, GrainEqDiaEbsd, TexCompVolFracFCC
from upxo.material.Material import TexFibreVolFracFCC, TexCompWidth, EBSDParameters
from upxo.material.Material import TensileTestParameters
# Append for the first time
matdata.append(MaterialIdentity())
matdata.append(ProcessingCondition())
matdata.append(IrradiationCondition())
matdata.append(CrystalFamily())
matdata.append(Phases())
matdata.append(PhysicalProperty())
matdata.append(ElasticProperty())
matdata.append(TensileStressStrain())
matdata.append(PlasticProperty())
matdata.append(ExpDataAvailability())
matdata.append(GrainEqDiaEbsd())
matdata.append(TexCompVolFracFCC())
matdata.append(TexFibreVolFracFCC())
matdata.append(TexCompWidth())
matdata.append(EBSDParameters())
matdata.append(TensileTestParameters())
# Retain the following lines. These are to be used, in case, the
# user wishes to update the already existing data on a segment by
# segment basis
#matdata.CrossCheckAndAppend(MaterialIdentity())
#matdata.CrossCheckAndAppend(ProcessingCondition())
#matdata.CrossCheckAndAppend(IrradiationCondition())
#matdata.CrossCheckAndAppend(CrystalFamily())
#matdata.CrossCheckAndAppend(Phases())
#matdata.CrossCheckAndAppend(PhysicalProperty())
#matdata.CrossCheckAndAppend(ElasticProperty())
#matdata.CrossCheckAndAppend(TensileStressStrain())
#matdata.CrossCheckAndAppend(PlasticProperty())
#matdata.CrossCheckAndAppend(ExpDataAvailability())
#matdata.CrossCheckAndAppend(GrainEqDiaEbsd())
#matdata.CrossCheckAndAppend(TexCompVolFracFCC())
#matdata.CrossCheckAndAppend(TexFibreVolFracFCC())
#matdata.CrossCheckAndAppend(TexCompWidth())
#matdata.CrossCheckAndAppend(EBSDParameters())
#matdata.CrossCheckAndAppend(TensileTestParameters())
return matdata
[docs]
@dataclass(frozen=False, repr=True)
class MaterialIdentity:
'''
MaterialIdentity()
'''
# Now, we assign the default arguments
name : str = field(default = 'cu') # Name of the material
alloy: str = field(default = 'value') # Alloy grade
comp : str = field(default = 'value', compare = False) # Composition
[docs]
@dataclass(frozen = True, repr = True)
class ProcessingCondition:
ht : str = field(default = 'heat treatment') # Heat treatment
pro : str = field(default = 'extruded') # Processing
app : str = field(default = 'cooling pipe') # Application
appLoc: str = field(default = 'W-Ci unterface') # Application location
[docs]
@dataclass(frozen = True, repr = True)
class IrradiationCondition:
irr : str = field(default = 'neutron') # Type of irradiation
irr_temp: float = field(default = 400) # Temperature of irradiation in Kelvin
irr_dpa : float = field(default = 1E-5) # displacements per atom
[docs]
@dataclass(frozen = True, repr = True)
class CrystalFamily:
xtal_family: str = field(default = 'mmm') # Crystal family: mmm, etc
[docs]
@dataclass(frozen = True, repr = True)
class Phases:
nphases: int = field(default = 2) # Number of phases
namesPhases: np.ndarray = field(default_factory=lambda: np.ndarray([], dtype=str))
phaseFractions: np.ndarray = field(default_factory=lambda: np.ndarray([], dtype=float))
[docs]
@dataclass(frozen = True, repr = True)
class PhysicalProperty:
density: float = field(default = '2700') # in kg m^-3
[docs]
@dataclass(frozen = True, repr = True)
class ElasticProperty:
E: float = field(default = 70E3) # Young's modulus in MPa
[docs]
@dataclass(frozen = True, repr = True)
class TensileStressStrain:
strain: np.ndarray = field(default_factory=lambda: np.array([], dtype=float))
stress: np.ndarray = field(default_factory=lambda: np.array([], dtype=float))
[docs]
@dataclass(frozen = True, repr = True)
class PlasticProperty:
Sy001: float = field(default = 135) # 0.1% proof strength, MPa
Sy002: float = field(default = 150) # 0.2% proof strength, MPa
Sy003: float = field(default = 155) # 0.3% proof strength, MPa
HV0005: float = field(default = 50) # Vicker's hardness number @ 0.005 kg-f
HV0010: float = field(default = 50) # Vicker's hardness number @ 0.010 kg-f
HV0020: float = field(default = 50) # Vicker's hardness number @ 0.020 kg-f
K: float = field(default = 1234) # Fracture toughness
[docs]
@dataclass(frozen = True, repr = True)
class ExpDataAvailability:
tt : bool = field(default = True) # tensile test. True if available else False
fatigue_low : bool = field(default = True)
fatigue_high: bool = field(default = True)
ebsd : bool = field(default = True)
tem : bool = field(default = True)
[docs]
@dataclass(frozen = True, repr = True)
class GrainEqDiaEbsd:
modality: int = field(default = 2)
skewness: float = field(default = -1.02)
kurtosis: float = field(default = 1.24)
dist_grain_size : np.ndarray = field(default_factory=lambda: np.array([], dtype=float))
dist_grain_count: np.ndarray = field(default_factory=lambda: np.array([], dtype=int))
dist_grain_prob : np.ndarray = field(default_factory=lambda: np.array([], dtype=float))
[docs]
@dataclass(frozen = True, repr = True)
class TexCompVolFracFCC:
import random
cube_tc_vf : float = field(default = random.random()/10)
ndcube_tc_vf: float = field(default = random.random()/10)
rdcube_tc_vf: float = field(default = random.random()/10)
goss_tc_vf : float = field(default = random.random()/10)
brass_tc_vf : float = field(default = random.random()/10)
copper_tc_vf: float = field(default = random.random()/10)
s_tc_vf : float = field(default = random.random()/10)
t1_tc_vf : float = field(default = random.random()/10)
t2_tc_vf : float = field(default = random.random()/10)
p_tc_vf : float = field(default = random.random()/10)
[docs]
@dataclass(frozen = True, repr = True)
class TexFibreVolFracFCC:
import random
cube_tf_vf : float = field(default = random.random()/10)
alpha_tf_vf: float = field(default = random.random()/10)
beta_tf_vf : float = field(default = random.random()/10)
[docs]
@dataclass(frozen = True, repr = True)
class TexCompWidth:
import random
cube_tc_w : float = field(default = random.random()*10)
ndcube_tc_w: float = field(default = random.random()*10)
rdcube_tc_w: float = field(default = random.random()*10)
goss_tc_w : float = field(default = random.random()*10)
brass_tc_w : float = field(default = random.random()*10)
copper_tc_w: float = field(default = random.random()*10)
s_tc_w : float = field(default = random.random()*10)
t1_tc_w : float = field(default = random.random()*10)
t2_tc_w : float = field(default = random.random()*10)
p_tc_w : float = field(default = random.random()*10)
[docs]
@dataclass(frozen = True, repr = True)
class EBSDParameters:
zero_fraction_uncorrected : float = field(default = 'value')# 0 to 1
zero_fraction_corrected : float = field(default = 'value')# 0 to 1
phase_fraction: np.ndarray = field(default = 'value')# data for every phase
[docs]
@dataclass(frozen = True, repr = True)
class TensileTestParameters:
sample_type : str = field(default = 'value')# 'dogbonegrip','dogboneshoulder'
strain_rate : float = field(default = 'value')
test_temperature: float = field(default = 'value')
#______________________________________________________________________________
# HELPER METHODS:
[docs]
def TempKelvin(temp_celcius):
"""Tempkelvin."""
# This is only to demonstrate a way of setting value in a dataclass.
# Value could infact be taken directly in Kelvin, inside the "IrradiationCondition" class
return 273.0 + temp_celcius
#______________________________________________________________________________
# CALLER METHODS
[docs]
def generate():
'''
'''
import Material
return Material.build()
#______________________________________________________________________________