Merge branch 'development' into avoid_data_copy_restart_MPI

This commit is contained in:
Martin Diehl 2021-03-26 08:58:03 +01:00
commit 7320120c5d
40 changed files with 68071 additions and 95 deletions

@ -1 +1 @@
Subproject commit a4fed7a4b285496f547a7b940f6b6d54419f2384
Subproject commit ba046ace284515cb82020b3930206eab84ff3121

View File

@ -1 +1 @@
v3.0.0-alpha2-619-ga99983145
v3.0.0-alpha2-646-gee8015cd5

View File

@ -65,7 +65,7 @@ if filenames == []: parser.error('no input file specified.')
for name in filenames:
damask.util.report(scriptName,name)
geom = damask.Grid.load_DREAM3D(name,options.basegroup,options.pointwise)
geom = damask.Grid.load_DREAM3D(name,'FeatureIds')
damask.util.croak(geom)
geom.save_ASCII(os.path.splitext(name)[0]+'.geom')

View File

@ -27,12 +27,14 @@ class Colormap(mpl.colors.ListedColormap):
References
----------
[1] DAMASK colormap theory
https://www.kennethmoreland.com/color-maps/ColorMapsExpanded.pdf
[2] DAMASK colormaps first use
https://doi.org/10.1016/j.ijplas.2012.09.012
[3] Matplotlib colormaps overview
https://matplotlib.org/tutorials/colors/colormaps.html
K. Moreland, Proceedings of the 5th International Symposium on Advances in Visual Computing, 2009
https://doi.org/10.1007/978-3-642-10520-3_9
P. Eisenlohr et al., International Journal of Plasticity 46:3753, 2013
https://doi.org/10.1016/j.ijplas.2012.09.012
Matplotlib colormaps overview
https://matplotlib.org/tutorials/colors/colormaps.html
"""
@ -524,7 +526,7 @@ class Colormap(mpl.colors.ListedColormap):
References
----------
http://www.ryanjuckett.com/programming/rgb-color-space-conversion
https://www.easyrgb.com/en/math.php
"""
rgb_lin = np.dot(np.array([
@ -544,7 +546,7 @@ class Colormap(mpl.colors.ListedColormap):
References
----------
http://www.ryanjuckett.com/programming/rgb-color-space-conversion
https://www.easyrgb.com/en/math.php
"""
rgb_lin = np.where(rgb>0.04045,((rgb+0.0555)/1.0555)**2.4,rgb/12.92)

View File

@ -1,4 +1,7 @@
import os.path
import numpy as np
import h5py
from . import Config
from . import Rotation
@ -49,7 +52,7 @@ class ConfigMaterial(Config):
@staticmethod
def from_table(table,**kwargs):
"""
Load from an ASCII table.
Generate from an ASCII table.
Parameters
----------
@ -85,7 +88,7 @@ class ConfigMaterial(Config):
phase: {}
"""
kwargs_ = {k:table.get(v) for k,v in kwargs.items()}
kwargs_ = {k:table.get(v) for k,v in kwargs.items()}
_,idx = np.unique(np.hstack(list(kwargs_.values())),return_index=True,axis=0)
idx = np.sort(idx)
@ -94,6 +97,79 @@ class ConfigMaterial(Config):
return ConfigMaterial().material_add(**kwargs_)
@staticmethod
def load_DREAM3D(fname,
grain_data=None,cell_data=None,cell_ensemble_data='CellEnsembleData',
phases='Phases',Euler_angles='EulerAngles',phase_names='PhaseName',
base_group=None):
"""
Load DREAM.3D (HDF5) file.
Data in DREAM.3D files can be stored per cell ('CellData')
and/or per grain ('Grain Data'). Per default, cell-wise data
is assumed.
damask.Grid.load_DREAM3D allows to get the corresponding geometry
for the grid solver.
Parameters
----------
fname : str
Filename of the DREAM.3D (HDF5) file.
grain_data : str
Name of the group (folder) containing grain-wise data. Defaults
to None, in which case cell-wise data is used.
cell_data : str
Name of the group (folder) containing cell-wise data. Defaults to
None in wich case it is automatically detected.
cell_ensemble_data : str
Name of the group (folder) containing data of cell ensembles. This
group is used to inquire the name of the phases. Phases will get
numeric IDs if this group is not found. Defaults to 'CellEnsembleData'.
phases : str
Name of the dataset containing the phase ID (cell-wise or grain-wise).
Defaults to 'Phases'.
Euler_angles : str
Name of the dataset containing the crystallographic orientation as
Euler angles in radians (cell-wise or grain-wise). Defaults to 'EulerAngles'.
phase_names : str
Name of the dataset containing the phase names. Phases will get
numeric IDs if this dataset is not found. Defaults to 'PhaseName'.
base_group : str
Path to the group (folder) that contains geometry (_SIMPL_GEOMETRY),
and grain- or cell-wise data. Defaults to None, in which case
it is set as the path that contains _SIMPL_GEOMETRY/SPACING.
"""
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
c = util.DREAM3D_cell_data_group(fname) if cell_data is None else cell_data
f = h5py.File(fname,'r')
if grain_data is None:
phase = f[os.path.join(b,c,phases)][()].flatten()
O = Rotation.from_Euler_angles(f[os.path.join(b,c,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
_,idx = np.unique(np.hstack([O,phase.reshape(-1,1)]),return_index=True,axis=0)
idx = np.sort(idx)
else:
phase = f[os.path.join(b,grain_data,phases)][()]
O = Rotation.from_Euler_angles(f[os.path.join(b,grain_data,Euler_angles)]).as_quaternion() # noqa
idx = np.arange(phase.size)
if cell_ensemble_data is not None and phase_names is not None:
try:
names = np.array([s.decode() for s in f[os.path.join(b,cell_ensemble_data,phase_names)]])
phase = names[phase]
except KeyError:
pass
base_config = ConfigMaterial({'phase':{k if isinstance(k,int) else str(k):'t.b.d.' for k in np.unique(phase)},
'homogenization':{'direct':{'N_constituents':1}}})
constituent = {k:np.atleast_1d(v[idx].squeeze()) for k,v in zip(['O','phase'],[O,phase])}
return base_config.material_add(**constituent,homogenization='direct')
@property
def is_complete(self):
"""Check for completeness."""

View File

@ -256,35 +256,62 @@ class Grid:
@staticmethod
def load_DREAM3D(fname,base_group,point_data=None,material='FeatureIds'):
def load_DREAM3D(fname,
feature_IDs=None,cell_data=None,
phases='Phases',Euler_angles='EulerAngles',
base_group=None):
"""
Load from DREAM.3D file.
Load DREAM.3D (HDF5) file.
Data in DREAM.3D files can be stored per cell ('CellData')
and/or per grain ('Grain Data'). Per default, cell-wise data
is assumed.
damask.ConfigMaterial.load_DREAM3D allows to get the
corresponding material definition.
Parameters
----------
fname : str
Filename of the DREAM.3D file
Filename of the DREAM.3D (HDF5) file.
feature_IDs : str
Name of the dataset containing the mapping between cells and
grain-wise data. Defaults to 'None', in which case cell-wise
data is used.
cell_data : str
Name of the group (folder) containing cell-wise data. Defaults to
None in wich case it is automatically detected.
phases : str
Name of the dataset containing the phase ID. It is not used for
grain-wise data, i.e. when feature_IDs is not None.
Defaults to 'Phases'.
Euler_angles : str
Name of the dataset containing the crystallographic orientation as
Euler angles in radians It is not used for grain-wise data, i.e.
when feature_IDs is not None. Defaults to 'EulerAngles'.
base_group : str
Name of the group (folder) below 'DataContainers',
for example 'SyntheticVolumeDataContainer'.
point_data : str, optional
Name of the group (folder) containing the pointwise material data,
for example 'CellData'. Defaults to None, in which case points are consecutively numbered.
material : str, optional
Name of the dataset containing the material ID.
Defaults to 'FeatureIds'.
Path to the group (folder) that contains geometry (_SIMPL_GEOMETRY),
and grain- or cell-wise data. Defaults to None, in which case
it is set as the path that contains _SIMPL_GEOMETRY/SPACING.
"""
root_dir ='DataContainers'
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
c = util.DREAM3D_cell_data_group(fname) if cell_data is None else cell_data
f = h5py.File(fname, 'r')
g = os.path.join(root_dir,base_group,'_SIMPL_GEOMETRY')
cells = f[os.path.join(g,'DIMENSIONS')][()]
size = f[os.path.join(g,'SPACING')][()] * cells
origin = f[os.path.join(g,'ORIGIN')][()]
ma = np.arange(cells.prod(),dtype=int) \
if point_data is None else \
np.reshape(f[os.path.join(root_dir,base_group,point_data,material)],cells.prod())
cells = f[os.path.join(b,'_SIMPL_GEOMETRY','DIMENSIONS')][()]
size = f[os.path.join(b,'_SIMPL_GEOMETRY','SPACING')] * cells
origin = f[os.path.join(b,'_SIMPL_GEOMETRY','ORIGIN')][()]
if feature_IDs is None:
phase = f[os.path.join(b,c,phases)][()].reshape(-1,1)
O = Rotation.from_Euler_angles(f[os.path.join(b,c,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
unique,unique_inverse = np.unique(np.hstack([O,phase]),return_inverse=True,axis=0)
ma = np.arange(cells.prod()) if len(unique) == cells.prod() else \
np.arange(unique.size)[np.argsort(pd.unique(unique_inverse))][unique_inverse]
else:
ma = f[os.path.join(b,c,feature_IDs)][()].flatten()
return Grid(ma.reshape(cells,order='F'),size,origin,util.execution_stamp('Grid','load_DREAM3D'))
@ -482,18 +509,13 @@ class Grid:
References
----------
Sébastien B G Blanquer, Maike Werner, Markus Hannula, Shahriar Sharifi,
Guillaume P R Lajoinie, David Eglin, Jari Hyttinen, André A Poot, and Dirk W Grijpma
Surface curvature in triply-periodic minimal surface architectures as
a distinct design parameter in preparing advanced tissue engineering scaffolds
S.B.G. Blanquer et al., Biofabrication 9(2):025001, 2017
https://doi.org/10.1088/1758-5090/aa6553
Meinhard Wohlgemuth, Nataliya Yufa, James Hoffman, and Edwin L. Thomas
Triply Periodic Bicontinuous Cubic Microdomain Morphologies by Symmetries
M. Wohlgemuth et al., Macromolecules 34(17):6083-6089, 2001
https://doi.org/10.1021/ma0019499
Meng-Ting Hsieh, Lorenzo Valdevit
Minisurf A minimal surface generator for finite element modeling and additive manufacturing
M.-T. Hsieh and L. Valdevit, Software Impacts 6:100026, 2020
https://doi.org/10.1016/j.simpa.2020.100026
"""

View File

@ -742,8 +742,7 @@ class Orientation(Rotation):
References
----------
C.T. Young and J.L. Lytton, J. Appl. Phys. 43:14081417, 1972
"Computer Generation and Identification of Kikuchi Projections"
C.T. Young and J.L. Lytton, Journal of Applied Physics 43:14081417, 1972
https://doi.org/10.1063/1.1661333
"""
@ -1070,8 +1069,7 @@ class Orientation(Rotation):
References
----------
J.C. Glez and J. Driver, J. Appl. Cryst. 34:280-288, 2001
"Orientation distribution analysis in deformed grains"
J.C. Glez and J. Driver, Journal of Applied Crystallography 34:280-288, 2001
https://doi.org/10.1107/S0021889801003077
"""

View File

@ -357,10 +357,8 @@ class Rotation:
References
----------
Quaternion averaging
F. Landis Markley, Yang Cheng, John L. Crassidis, Yaakov Oshman
Journal of Guidance, Control, and Dynamics 30(4):1193-1197, 2007
10.2514/1.28949
F. Landis Markley et al., Journal of Guidance, Control, and Dynamics 30(4):1193-1197, 2007
https://doi.org/10.2514/1.28949
"""
def _M(quat):
@ -859,7 +857,7 @@ class Rotation:
References
----------
P. Eisenlohr, F. Roters, Computational Materials Science 42(4), 670-678, 2008
P. Eisenlohr and F. Roters, Computational Materials Science 42(4):670-678, 2008
https://doi.org/10.1016/j.commatsci.2007.09.015
"""

View File

@ -9,6 +9,7 @@ from functools import reduce
from optparse import Option
import numpy as np
import h5py
from . import version
@ -27,7 +28,8 @@ __all__=[
'extendableOption',
'execution_stamp',
'shapeshifter', 'shapeblender',
'extend_docstring', 'extended_docstring'
'extend_docstring', 'extended_docstring',
'DREAM3D_base_group', 'DREAM3D_cell_data_group'
]
####################################################################################################
@ -376,6 +378,53 @@ def extended_docstring(f,extra_docstring):
return _decorator
def DREAM3D_base_group(fname):
"""
Determine the base group of a DREAM.3D file.
The base group is defined as the group (folder) that contains
a 'SPACING' dataset in a '_SIMPL_GEOMETRY' group.
Parameters
----------
fname : str
Filename of the DREAM.3D (HDF5) file.
"""
with h5py.File(fname,'r') as f:
base_group = f.visit(lambda path: path.rsplit('/',2)[0] if '_SIMPL_GEOMETRY/SPACING' in path else None)
if base_group is None:
raise ValueError(f'Could not determine base group in file {fname}.')
return base_group
def DREAM3D_cell_data_group(fname):
"""
Determine the cell data group of a DREAM.3D file.
The cell data group is defined as the group (folder) that contains
a dataset in the base group whose length matches the total number
of points as specified in '_SIMPL_GEOMETRY/DIMENSIONS'.
Parameters
----------
fname : str
Filename of the DREAM.3D (HDF5) file.
"""
base_group = DREAM3D_base_group(fname)
with h5py.File(fname,'r') as f:
cells = tuple(f[os.path.join(base_group,'_SIMPL_GEOMETRY','DIMENSIONS')][()][::-1])
cell_data_group = f[base_group].visititems(lambda path,obj: path.split('/')[0] \
if isinstance(obj,h5py._hl.dataset.Dataset) and np.shape(obj)[:-1] == cells \
else None)
if cell_data_group is None:
raise ValueError(f'Could not determine cell data group in file {fname}/{base_group}.')
return cell_data_group
####################################################################################################
# Classes
####################################################################################################

View File

@ -0,0 +1 @@
../Grid/2phase_irregularGrid.dream3d

View File

@ -0,0 +1 @@
../Grid/2phase_irregularGrid.json

View File

@ -0,0 +1 @@
../Grid/2phase_irregularGrid.xdmf

View File

@ -0,0 +1 @@
../Grid/measured.dream3d

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
../Grid/measured.xdmf

View File

@ -0,0 +1,764 @@
{
"0": {
"CellEnsembleAttributeMatrixName": "CellEnsembleData",
"CrystalStructuresArrayName": "CrystalStructures",
"Filter_Enabled": true,
"Filter_Human_Label": "StatsGenerator",
"Filter_Name": "StatsGeneratorFilter",
"Filter_Uuid": "{f642e217-4722-5dd8-9df9-cee71e7b26ba}",
"PhaseNamesArrayName": "PhaseName",
"PhaseTypesArrayName": "PhaseTypes",
"StatsDataArray": {
"1": {
"AxisODF-Weights": {
},
"Bin Count": 34,
"BinNumber": [
0.03019738383591175,
1.031197428703308,
2.0321974754333496,
3.0331974029541016,
4.0341973304748535,
5.0351972579956055,
6.036197185516357,
7.037197113037109,
8.03819751739502,
9.03919792175293,
10.04019832611084,
11.04119873046875,
12.04219913482666,
13.04319953918457,
14.04419994354248,
15.04520034790039,
16.046199798583984,
17.047199249267578,
18.048198699951172,
19.049198150634766,
20.05019760131836,
21.051197052001953,
22.052196502685547,
23.05319595336914,
24.054195404052734,
25.055194854736328,
26.056194305419922,
27.057193756103516,
28.05819320678711,
29.059192657470703,
30.060192108154297,
31.06119155883789,
32.062191009521484,
33.06319046020508
],
"BoundaryArea": 0,
"Crystal Symmetry": 1,
"FeatureSize Distribution": {
"Average": 0.5,
"Standard Deviation": 1
},
"FeatureSize Vs B Over A Distributions": {
"Alpha": [
15.845513343811035,
15.281289100646973,
15.406131744384766,
15.695631980895996
],
"Beta": [
1.5363599061965942,
1.3575199842453003,
1.2908644676208496,
1.6510697603225708
],
"Distribution Type": "Beta Distribution"
},
"FeatureSize Vs C Over A Distributions": {
"Alpha": [
15.83090591430664,
15.119057655334473,
15.210259437561035,
15.403964042663574
],
"Beta": [
1.4798208475112915,
1.439164638519287,
1.6361048221588135,
1.3149876594543457
],
"Distribution Type": "Beta Distribution"
},
"FeatureSize Vs Neighbors Distributions": {
"Average": [
2.3025851249694824,
2.4849066734313965,
2.6390573978424072,
2.7725887298583984
],
"Distribution Type": "Log Normal Distribution",
"Standard Deviation": [
0.4000000059604645,
0.3499999940395355,
0.30000001192092896,
0.25
]
},
"FeatureSize Vs Omega3 Distributions": {
"Alpha": [
10.906224250793457,
10.030556678771973,
10.367804527282715,
10.777519226074219
],
"Beta": [
1.7305665016174316,
1.638364553451538,
1.6687047481536865,
1.6839183568954468
],
"Distribution Type": "Beta Distribution"
},
"Feature_Diameter_Info": [
1.0010000467300415,
33.11545181274414,
0.03019738383591175
],
"MDF-Weights": {
},
"Name": "Primary",
"ODF-Weights": {
},
"PhaseFraction": 0.8999999761581421,
"PhaseType": "Primary"
},
"2": {
"AxisODF-Weights": {
},
"Bin Count": 34,
"BinNumber": [
0.03019738383591175,
1.031197428703308,
2.0321974754333496,
3.0331974029541016,
4.0341973304748535,
5.0351972579956055,
6.036197185516357,
7.037197113037109,
8.03819751739502,
9.03919792175293,
10.04019832611084,
11.04119873046875,
12.04219913482666,
13.04319953918457,
14.04419994354248,
15.04520034790039,
16.046199798583984,
17.047199249267578,
18.048198699951172,
19.049198150634766,
20.05019760131836,
21.051197052001953,
22.052196502685547,
23.05319595336914,
24.054195404052734,
25.055194854736328,
26.056194305419922,
27.057193756103516,
28.05819320678711,
29.059192657470703,
30.060192108154297,
31.06119155883789,
32.062191009521484,
33.06319046020508
],
"BoundaryArea": 0,
"Crystal Symmetry": 0,
"FeatureSize Distribution": {
"Average": 0.5,
"Standard Deviation": 1
},
"FeatureSize Vs B Over A Distributions": {
"Alpha": [
15.447705268859863,
15.033297538757324,
15.445094108581543,
15.426791191101074,
15.61402702331543,
15.366107940673828,
15.525880813598633,
15.943540573120117,
15.176913261413574,
15.9615478515625,
15.254341125488281,
15.919609069824219,
15.170331954956055,
15.80831527709961,
15.88097095489502,
15.6745023727417,
15.72781753540039,
15.8475980758667,
15.314001083374023,
15.855002403259277,
15.942434310913086,
15.40106201171875,
15.478381156921387,
15.788527488708496,
15.045133590698242,
15.81428050994873,
15.582372665405273,
15.878610610961914,
15.554070472717285,
15.576101303100586,
15.961583137512207,
15.629712104797363,
15.71079158782959,
15.126718521118164
],
"Beta": [
1.6585813760757446,
1.5793683528900146,
1.3637349605560303,
1.3487848043441772,
1.2599012851715088,
1.6920716762542725,
1.4974967241287231,
1.2616045475006104,
1.4897079467773438,
1.7281248569488525,
1.427177906036377,
1.6394929885864258,
1.533599853515625,
1.4850311279296875,
1.4161322116851807,
1.4839515686035156,
1.619403600692749,
1.3563393354415894,
1.7409964799880981,
1.7253544330596924,
1.3933753967285156,
1.7071460485458374,
1.4746366739273071,
1.3466795682907104,
1.5836750268936157,
1.2904614210128784,
1.4404902458190918,
1.7157742977142334,
1.3197978734970093,
1.2591632604599,
1.387762188911438,
1.5591365098953247,
1.3606828451156616,
1.4381128549575806
],
"Distribution Type": "Beta Distribution"
},
"FeatureSize Vs C Over A Distributions": {
"Alpha": [
15.365218162536621,
15.545299530029297,
15.212627410888672,
15.400262832641602,
15.938212394714355,
15.722898483276367,
15.016470909118652,
15.900740623474121,
15.425718307495117,
15.16152572631836,
15.375897407531738,
15.372262954711914,
15.971389770507812,
15.753372192382812,
15.400237083435059,
15.377294540405273,
15.65787124633789,
15.287458419799805,
15.704233169555664,
15.063706398010254,
15.128981590270996,
15.337125778198242,
15.145627975463867,
15.563216209411621,
15.704171180725098,
15.633543014526367,
15.44886589050293,
15.549928665161133,
15.656011581420898,
15.29349136352539,
15.840867042541504,
15.322612762451172,
15.672919273376465,
15.617719650268555
],
"Beta": [
1.4064055681228638,
1.2828519344329834,
1.468850016593933,
1.7444164752960205,
1.6199990510940552,
1.3697280883789062,
1.2706352472305298,
1.5357846021652222,
1.4822189807891846,
1.6722832918167114,
1.369265079498291,
1.4566115140914917,
1.3299659490585327,
1.3810123205184937,
1.3476874828338623,
1.5510755777359009,
1.7177120447158813,
1.3624974489212036,
1.3216533660888672,
1.3339394330978394,
1.2930961847305298,
1.6279221773147583,
1.6160264015197754,
1.528560757637024,
1.510753870010376,
1.3254910707473755,
1.4221922159194946,
1.2564609050750732,
1.6635781526565552,
1.3418669700622559,
1.7360178232192993,
1.5526862144470215,
1.4054912328720093,
1.277783989906311
],
"Distribution Type": "Beta Distribution"
},
"FeatureSize Vs Omega3 Distributions": {
"Alpha": [
10.336419105529785,
10.1687650680542,
10.27115249633789,
10.215887069702148,
10.185782432556152,
10.72452449798584,
10.59039306640625,
10.541507720947266,
10.88405990600586,
10.985298156738281,
10.061153411865234,
10.403335571289062,
10.103477478027344,
10.359172821044922,
10.454915046691895,
10.805563926696777,
10.597787857055664,
10.86919116973877,
10.310497283935547,
10.723823547363281,
10.431794166564941,
10.962357521057129,
10.227286338806152,
10.641992568969727,
10.421194076538086,
10.347271919250488,
10.305063247680664,
10.359184265136719,
10.88247013092041,
10.224652290344238,
10.449006080627441,
10.638978958129883,
10.109529495239258,
10.306557655334473
],
"Beta": [
1.952553629875183,
1.8465642929077148,
1.9641268253326416,
1.8473154306411743,
1.8531252145767212,
1.6586203575134277,
1.7890105247497559,
1.5307549238204956,
1.5579677820205688,
1.5402934551239014,
1.8692169189453125,
1.7846438884735107,
1.547948956489563,
1.6955899000167847,
1.7097049951553345,
1.5930047035217285,
1.7674869298934937,
1.519134759902954,
1.655213475227356,
1.846417784690857,
1.6024950742721558,
1.7787903547286987,
1.529666781425476,
1.9883882999420166,
1.9980814456939697,
1.6461148262023926,
1.518980622291565,
1.954341173171997,
1.994722604751587,
1.6828864812850952,
1.5880030393600464,
1.7846791744232178,
1.6626262664794922,
1.714822769165039
],
"Distribution Type": "Beta Distribution"
},
"Feature_Diameter_Info": [
1.0010000467300415,
33.11545181274414,
0.03019738383591175
],
"MDF-Weights": {
},
"Name": "Precipitate",
"ODF-Weights": {
},
"PhaseFraction": 0.10000000149011612,
"PhaseType": "Precipitate",
"Precipitate Boundary Fraction": 0.699999988079071,
"Radial Distribution Function": {
"Bin Count": 50,
"BoxDims": [
100,
100,
100
],
"BoxRes": [
0.10000000149011612,
0.10000000149011612,
0.10000000149011612
],
"Max": 80,
"Min": 10
}
},
"Name": "Statistics",
"Phase Count": 3
},
"StatsDataArrayName": "Statistics",
"StatsGeneratorDataContainerName": "StatsGeneratorDataContainer"
},
"1": {
"BoxDimensions": "X Range: 0 to 10.4 (Delta: 10.4)\nY Range: 0 to 6.4 (Delta: 6.4)\nZ Range: 0 to 8 (Delta: 8)",
"CellAttributeMatrixName": "CellData",
"DataContainerName": "SyntheticVolumeDataContainer",
"Dimensions": {
"x": 13,
"y": 8,
"z": 10
},
"EnsembleAttributeMatrixName": "CellEnsembleData",
"EstimateNumberOfFeatures": 1,
"EstimatedPrimaryFeatures": "17",
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Initialize Synthetic Volume",
"Filter_Name": "InitializeSyntheticVolume",
"Filter_Uuid": "{c2ae366b-251f-5dbd-9d70-d790376c0c0d}",
"InputPhaseTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputStatsArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "Statistics",
"Data Container Name": "StatsGeneratorDataContainer"
},
"Origin": {
"x": 0,
"y": 0,
"z": 0
},
"Resolution": {
"x": 0.800000011920929,
"y": 0.800000011920929,
"z": 0.800000011920929
}
},
"2": {
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Establish Shape Types",
"Filter_Name": "EstablishShapeTypes",
"Filter_Uuid": "{4edbbd35-a96b-5ff1-984a-153d733e2abb}",
"InputPhaseTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"ShapeTypeData": [
999,
0,
0
],
"ShapeTypesArrayName": "ShapeTypes"
},
"3": {
"CellPhasesArrayName": "Phases",
"FeatureGeneration": 0,
"FeatureIdsArrayName": "FeatureIds",
"FeatureInputFile": "C:/Users/work",
"FeaturePhasesArrayName": "Phases",
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Pack Primary Phases",
"Filter_Name": "PackPrimaryPhases",
"Filter_Uuid": "{84305312-0d10-50ca-b89a-fda17a353cc9}",
"InputPhaseNamesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseName",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputPhaseTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputShapeTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "ShapeTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputStatsArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "Statistics",
"Data Container Name": "StatsGeneratorDataContainer"
},
"MaskArrayPath": {
"Attribute Matrix Name": "",
"Data Array Name": "",
"Data Container Name": ""
},
"NewAttributeMatrixPath": {
"Attribute Matrix Name": "Synthetic Shape Parameters (Primary Phase)",
"Data Array Name": "",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"NumFeaturesArrayName": "NumFeatures",
"OutputCellAttributeMatrixPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"OutputCellEnsembleAttributeMatrixName": "CellEnsembleData",
"OutputCellFeatureAttributeMatrixName": "Grain Data",
"PeriodicBoundaries": 0,
"SaveGeometricDescriptions": 0,
"SelectedAttributeMatrixPath": {
"Attribute Matrix Name": "",
"Data Array Name": "",
"Data Container Name": ""
},
"UseMask": 0
},
"4": {
"BoundaryCellsArrayName": "BoundaryCells",
"FeatureIdsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "FeatureIds",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Find Boundary Cells (Image)",
"Filter_Name": "FindBoundaryCells",
"Filter_Uuid": "{8a1106d4-c67f-5e09-a02a-b2e9b99d031e}",
"IgnoreFeatureZero": 1,
"IncludeVolumeBoundary": 0
},
"5": {
"BoundaryCellsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "BoundaryCells",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"CellPhasesArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "Phases",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FeatureGeneration": 0,
"FeatureIdsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "FeatureIds",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FeaturePhasesArrayPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "Phases",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Insert Precipitate Phases",
"Filter_Name": "InsertPrecipitatePhases",
"Filter_Uuid": "{1e552e0c-53bb-5ae1-bd1c-c7a6590f9328}",
"InputPhaseTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputShapeTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "ShapeTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"InputStatsArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "Statistics",
"Data Container Name": "StatsGeneratorDataContainer"
},
"MaskArrayPath": {
"Attribute Matrix Name": "",
"Data Array Name": "",
"Data Container Name": ""
},
"MatchRDF": 0,
"NewAttributeMatrixPath": {
"Attribute Matrix Name": "Synthetic Shape Parameters (Precipitate)",
"Data Array Name": "",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"NumFeaturesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "NumFeatures",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"PeriodicBoundaries": 0,
"PrecipInputFile": "C:/Users/work",
"SaveGeometricDescriptions": 0,
"SelectedAttributeMatrixPath": {
"Attribute Matrix Name": "",
"Data Array Name": "",
"Data Container Name": ""
},
"UseMask": 0
},
"6": {
"BoundaryCellsArrayName": "BoundaryCells",
"CellFeatureAttributeMatrixPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FeatureIdsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "FeatureIds",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Find Feature Neighbors",
"Filter_Name": "FindNeighbors",
"Filter_Uuid": "{97cf66f8-7a9b-5ec2-83eb-f8c4c8a17bac}",
"NeighborListArrayName": "NeighborList",
"NumNeighborsArrayName": "NumNeighbors",
"SharedSurfaceAreaListArrayName": "SharedSurfaceAreaList",
"StoreBoundaryCells": 0,
"StoreSurfaceFeatures": 1,
"SurfaceFeaturesArrayName": "SurfaceFeatures"
},
"7": {
"AvgQuatsArrayName": "AvgQuats",
"CellEulerAnglesArrayName": "EulerAngles",
"CrystalStructuresArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "CrystalStructures",
"Data Container Name": "StatsGeneratorDataContainer"
},
"FeatureEulerAnglesArrayName": "EulerAngles",
"FeatureIdsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "FeatureIds",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FeaturePhasesArrayPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "Phases",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Match Crystallography",
"Filter_Name": "MatchCrystallography",
"Filter_Uuid": "{7bfb6e4a-6075-56da-8006-b262d99dff30}",
"InputStatsArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "Statistics",
"Data Container Name": "StatsGeneratorDataContainer"
},
"MaxIterations": 100,
"NeighborListArrayPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "NeighborList",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"NumFeaturesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "NumFeatures",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"PhaseTypesArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "PhaseTypes",
"Data Container Name": "StatsGeneratorDataContainer"
},
"SharedSurfaceAreaListArrayPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "SharedSurfaceAreaList",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"SurfaceFeaturesArrayPath": {
"Attribute Matrix Name": "Grain Data",
"Data Array Name": "SurfaceFeatures",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"VolumesArrayName": "Volumes"
},
"8": {
"CellEulerAnglesArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "EulerAngles",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"CellIPFColorsArrayName": "IPFColor",
"CellPhasesArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "Phases",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"CrystalStructuresArrayPath": {
"Attribute Matrix Name": "CellEnsembleData",
"Data Array Name": "CrystalStructures",
"Data Container Name": "StatsGeneratorDataContainer"
},
"FilterVersion": "6.5.138",
"Filter_Enabled": true,
"Filter_Human_Label": "Generate IPF Colors",
"Filter_Name": "GenerateIPFColors",
"Filter_Uuid": "{a50e6532-8075-5de5-ab63-945feb0de7f7}",
"GoodVoxelsArrayPath": {
"Attribute Matrix Name": "CellData",
"Data Array Name": "",
"Data Container Name": "SyntheticVolumeDataContainer"
},
"ReferenceDir": {
"x": 0,
"y": 0,
"z": 1
},
"UseGoodVoxels": 0
},
"9": {
"FilterVersion": "1.2.812",
"Filter_Enabled": true,
"Filter_Human_Label": "Write DREAM.3D Data File",
"Filter_Name": "DataContainerWriter",
"Filter_Uuid": "{3fcd4c43-9d75-5b86-aad4-4441bc914f37}",
"OutputFile": "C:\\Users\\work\\Desktop\\2phase_irregularGrid.dream3d",
"WriteTimeSeries": 0,
"WriteXdmfFile": 1
},
"PipelineBuilder": {
"Name": "2phase_irregularGrid",
"Number_Filters": 10,
"Version": 6
}
}

View File

@ -0,0 +1,42 @@
<?xml version="1.0"?>
<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd"[]>
<Xdmf xmlns:xi="http://www.w3.org/2003/XInclude" Version="2.2">
<Domain>
<!-- *************** START OF SyntheticVolumeDataContainer *************** -->
<Grid Name="SyntheticVolumeDataContainer" GridType="Uniform">
<Topology TopologyType="3DCoRectMesh" Dimensions="11 9 14 "></Topology>
<Geometry Type="ORIGIN_DXDYDZ">
<!-- Origin Z, Y, X -->
<DataItem Format="XML" Dimensions="3">0 0 0</DataItem>
<!-- DxDyDz (Spacing/Resolution) Z, Y, X -->
<DataItem Format="XML" Dimensions="3">0.8 0.8 0.8</DataItem>
</Geometry>
<Attribute Name="BoundaryCells" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="10 8 13 1" NumberType="Char" Precision="1" >
2phase_irregularGrid.dream3d:/DataContainers/SyntheticVolumeDataContainer/CellData/BoundaryCells
</DataItem>
</Attribute>
<Attribute Name="EulerAngles" AttributeType="Vector" Center="Cell">
<DataItem Format="HDF" Dimensions="10 8 13 3" NumberType="Float" Precision="4" >
2phase_irregularGrid.dream3d:/DataContainers/SyntheticVolumeDataContainer/CellData/EulerAngles
</DataItem>
</Attribute>
<Attribute Name="FeatureIds" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="10 8 13 1" NumberType="Int" Precision="4" >
2phase_irregularGrid.dream3d:/DataContainers/SyntheticVolumeDataContainer/CellData/FeatureIds
</DataItem>
</Attribute>
<Attribute Name="IPFColor" AttributeType="Vector" Center="Cell">
<DataItem Format="HDF" Dimensions="10 8 13 3" NumberType="UChar" Precision="1" >
2phase_irregularGrid.dream3d:/DataContainers/SyntheticVolumeDataContainer/CellData/IPFColor
</DataItem>
</Attribute>
<Attribute Name="Phases" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="10 8 13 1" NumberType="Int" Precision="4" >
2phase_irregularGrid.dream3d:/DataContainers/SyntheticVolumeDataContainer/CellData/Phases
</DataItem>
</Attribute>
</Grid>
<!-- *************** END OF SyntheticVolumeDataContainer *************** -->
</Domain>
</Xdmf>

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,77 @@
<?xml version="1.0"?>
<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd"[]>
<Xdmf xmlns:xi="http://www.w3.org/2003/XInclude" Version="2.2">
<Domain>
<!-- *************** START OF Small IN100 *************** -->
<Grid Name="Small IN100" GridType="Uniform">
<Topology TopologyType="3DCoRectMesh" Dimensions="2 102 202 "></Topology>
<Geometry Type="ORIGIN_DXDYDZ">
<!-- Origin Z, Y, X -->
<DataItem Format="XML" Dimensions="3">0 35 -294.7</DataItem>
<!-- DxDyDz (Spacing/Resolution) Z, Y, X -->
<DataItem Format="XML" Dimensions="3">0.35 0.35 0.35</DataItem>
</Geometry>
<Attribute Name="Confidence Index" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Confidence Index
</DataItem>
</Attribute>
<Attribute Name="EulerAngles" AttributeType="Vector" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 3" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/EulerAngles
</DataItem>
</Attribute>
<Attribute Name="FeatureIds" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Int" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/FeatureIds
</DataItem>
</Attribute>
<Attribute Name="Fit" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Fit
</DataItem>
</Attribute>
<Attribute Name="IPFColor" AttributeType="Vector" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 3" NumberType="UChar" Precision="1" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/IPFColor
</DataItem>
</Attribute>
<Attribute Name="Image Quality" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Image Quality
</DataItem>
</Attribute>
<Attribute Name="Mask" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="uchar" Precision="1" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Mask
</DataItem>
</Attribute>
<Attribute Name="ParentIds" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Int" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/ParentIds
</DataItem>
</Attribute>
<Attribute Name="Phases" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Int" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Phases
</DataItem>
</Attribute>
<Attribute Name="SEM Signal" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/SEM Signal
</DataItem>
</Attribute>
<Attribute Name="X Position" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/X Position
</DataItem>
</Attribute>
<Attribute Name="Y Position" AttributeType="Scalar" Center="Cell">
<DataItem Format="HDF" Dimensions="1 101 201 1" NumberType="Float" Precision="4" >
measured.dream3d:/DataContainers/Small IN100/EBSD Scan Data/Y Position
</DataItem>
</Attribute>
</Grid>
<!-- *************** END OF Small IN100 *************** -->
</Domain>
</Xdmf>

View File

@ -1,11 +1,12 @@
import os
import filecmp
import pytest
import numpy as np
from damask import ConfigMaterial
from damask import Table
from damask import Rotation
from damask import Grid
@pytest.fixture
def ref_path(ref_path_base):
@ -108,3 +109,32 @@ class TestConfigMaterial:
m = ConfigMaterial().material_add(**kw)
assert len(m['material']) == N
assert len(m['material'][0]['constituents']) == n
@pytest.mark.parametrize('cell_ensemble_data',[None,'CellEnsembleData'])
def test_load_DREAM3D(self,ref_path,cell_ensemble_data):
grain_c = ConfigMaterial.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d','Grain Data',
cell_ensemble_data = cell_ensemble_data)
point_c = ConfigMaterial.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d',
cell_ensemble_data = cell_ensemble_data)
assert point_c.is_valid and grain_c.is_valid and \
len(point_c['material'])+1 == len(grain_c['material'])
grain_m = Grid.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d','FeatureIds').material.flatten()
point_m = Grid.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d').material.flatten()
for i in np.unique(point_m):
j = int(grain_m[(point_m==i).nonzero()[0][0]])
assert np.allclose(point_c['material'][i]['constituents'][0]['O'],
grain_c['material'][j]['constituents'][0]['O'])
assert point_c['material'][i]['constituents'][0]['phase'] == \
grain_c['material'][j]['constituents'][0]['phase']
def test_load_DREAM3D_reference(self,tmp_path,ref_path,update):
config = ConfigMaterial.load_DREAM3D(ref_path/'measured.dream3d')
config.save(tmp_path/'material.yaml')
if update:
config.save(ref_path/'measured.material_yaml')
assert config.is_valid and filecmp.cmp(tmp_path/'material.yaml',ref_path/'measured.material_yaml')

View File

@ -420,12 +420,31 @@ class TestGrid:
t = Table(np.column_stack((coords.reshape(-1,3,order='F'),grid.material.flatten(order='F'))),{'c':3,'m':1})
assert grid_equal(grid.sort().renumber(),Grid.from_table(t,'c',['m']))
@pytest.mark.parametrize('periodic',[True,False])
@pytest.mark.parametrize('direction',['x','y','z',['x','y'],'zy','xz',['x','y','z']])
def test_get_grain_boundaries(self,update,ref_path,periodic,direction):
grid=Grid.load(ref_path/'get_grain_boundaries_8g12x15x20.vtr')
current=grid.get_grain_boundaries(periodic,direction)
grid = Grid.load(ref_path/'get_grain_boundaries_8g12x15x20.vtr')
current = grid.get_grain_boundaries(periodic,direction)
if update:
current.save(ref_path/f'get_grain_boundaries_8g12x15x20_{direction}_{periodic}.vtu',parallel=False)
reference=VTK.load(ref_path/f'get_grain_boundaries_8g12x15x20_{"".join(direction)}_{periodic}.vtu')
reference = VTK.load(ref_path/f'get_grain_boundaries_8g12x15x20_{"".join(direction)}_{periodic}.vtu')
assert current.__repr__() == reference.__repr__()
def test_load_DREAM3D(self,ref_path):
grain = Grid.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d','FeatureIds')
point = Grid.load_DREAM3D(ref_path/'2phase_irregularGrid.dream3d')
assert np.allclose(grain.origin,point.origin) and \
np.allclose(grain.size,point.size) and \
(grain.sort().material == point.material+1).all()
def test_load_DREAM3D_reference(self,ref_path,update):
current = Grid.load_DREAM3D(ref_path/'measured.dream3d')
reference = Grid.load(ref_path/'measured')
if update:
current.save(ref_path/'measured.vtr')
assert grid_equal(current,reference)

View File

@ -1,6 +1,10 @@
import random
import os
import pytest
import numpy as np
from scipy import stats
import h5py
from damask import util
@ -102,3 +106,36 @@ class TestUtil:
@pytest.mark.parametrize('style',[util.emph,util.deemph,util.warn,util.strikeout])
def test_decorate(self,style):
assert 'DAMASK' in style('DAMASK')
@pytest.mark.parametrize('complete',[True,False])
def test_D3D_base_group(self,tmp_path,complete):
base_group = ''.join(random.choices('DAMASK', k=10))
with h5py.File(tmp_path/'base_group.dream3d','w') as f:
f.create_group(os.path.join(base_group,'_SIMPL_GEOMETRY'))
if complete:
f[os.path.join(base_group,'_SIMPL_GEOMETRY')].create_dataset('SPACING',data=np.ones(3))
if complete:
assert base_group == util.DREAM3D_base_group(tmp_path/'base_group.dream3d')
else:
with pytest.raises(ValueError):
util.DREAM3D_base_group(tmp_path/'base_group.dream3d')
@pytest.mark.parametrize('complete',[True,False])
def test_D3D_cell_data_group(self,tmp_path,complete):
base_group = ''.join(random.choices('DAMASK', k=10))
cell_data_group = ''.join(random.choices('KULeuven', k=10))
cells = np.random.randint(1,50,3)
with h5py.File(tmp_path/'cell_data_group.dream3d','w') as f:
f.create_group(os.path.join(base_group,'_SIMPL_GEOMETRY'))
f[os.path.join(base_group,'_SIMPL_GEOMETRY')].create_dataset('SPACING',data=np.ones(3))
f[os.path.join(base_group,'_SIMPL_GEOMETRY')].create_dataset('DIMENSIONS',data=cells[::-1])
f[base_group].create_group(cell_data_group)
if complete:
f[os.path.join(base_group,cell_data_group)].create_dataset('data',shape=np.append(cells,1))
if complete:
assert cell_data_group == util.DREAM3D_cell_data_group(tmp_path/'cell_data_group.dream3d')
else:
with pytest.raises(ValueError):
util.DREAM3D_cell_data_group(tmp_path/'cell_data_group.dream3d')

View File

@ -93,7 +93,7 @@ subroutine DAMASK_interface_init
#endif
print*, achar(27)//'[0m'
print*, 'Roters et al., Computational Materials Science 158:420478, 2019'
print*, 'F. Roters et al., Computational Materials Science 158:420478, 2019'
print*, 'https://doi.org/10.1016/j.commatsci.2018.04.030'
print'(/,a)', ' Version: '//DAMASKVERSION

View File

@ -118,7 +118,7 @@ program DAMASK_grid
call CPFEM_initAll
print'(/,a)', ' <<<+- DAMASK_grid init -+>>>'; flush(IO_STDOUT)
print*, 'Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'P. Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'https://doi.org/10.1007/978-981-10-6855-3_80'

View File

@ -75,7 +75,7 @@ subroutine grid_damage_spectral_init
print'(/,a)', ' <<<+- grid_spectral_damage init -+>>>'
print*, 'Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'P. Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'https://doi.org/10.1007/978-981-10-6855-3_80'
!-------------------------------------------------------------------------------------------------

View File

@ -105,10 +105,10 @@ subroutine grid_mechanical_spectral_basic_init
print'(/,a)', ' <<<+- grid_mechanical_spectral_basic init -+>>>'; flush(IO_STDOUT)
print*, 'Eisenlohr et al., International Journal of Plasticity 46:3753, 2013'
print*, 'P. Eisenlohr et al., International Journal of Plasticity 46:3753, 2013'
print*, 'https://doi.org/10.1016/j.ijplas.2012.09.012'//IO_EOL
print*, 'Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'P. Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'https://doi.org/10.1016/j.ijplas.2014.02.006'
!-------------------------------------------------------------------------------------------------

View File

@ -118,7 +118,7 @@ subroutine grid_mechanical_spectral_polarisation_init
print'(/,a)', ' <<<+- grid_mechanical_spectral_polarization init -+>>>'; flush(IO_STDOUT)
print*, 'Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'P. Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'https://doi.org/10.1016/j.ijplas.2014.02.006'
!-------------------------------------------------------------------------------------------------

View File

@ -75,7 +75,7 @@ subroutine grid_thermal_spectral_init(T_0)
print'(/,a)', ' <<<+- grid_thermal_spectral init -+>>>'
print*, 'Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'P. Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'https://doi.org/10.1007/978-981-10-6855-3_80'
!-------------------------------------------------------------------------------------------------

View File

@ -176,16 +176,16 @@ subroutine spectral_utilities_init
print'(/,a)', ' <<<+- spectral_utilities init -+>>>'
print*, 'Diehl, Diploma Thesis TU München, 2010'
print*, 'M. Diehl, Diploma Thesis TU München, 2010'
print*, 'https://doi.org/10.13140/2.1.3234.3840'//IO_EOL
print*, 'Eisenlohr et al., International Journal of Plasticity 46:3753, 2013'
print*, 'P. Eisenlohr et al., International Journal of Plasticity 46:3753, 2013'
print*, 'https://doi.org/10.1016/j.ijplas.2012.09.012'//IO_EOL
print*, 'Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'P. Shanthraj et al., International Journal of Plasticity 66:3145, 2015'
print*, 'https://doi.org/10.1016/j.ijplas.2014.02.006'//IO_EOL
print*, 'Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'P. Shanthraj et al., Handbook of Mechanics of Materials, 2019'
print*, 'https://doi.org/10.1007/978-981-10-6855-3_80'
!--------------------------------------------------------------------------------------------------

View File

@ -287,20 +287,17 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
.and. NiterationMPstate < num%nMPstate)
NiterationMPstate = NiterationMPstate + 1
call mechanical_partition(homogenization_F(1:3,1:3,ce),ce)
converged = .true.
do co = 1, myNgrains
converged = converged .and. crystallite_stress(dt,co,ip,el)
enddo
if (.not. doneAndHappy(1)) then
call mechanical_partition(homogenization_F(1:3,1:3,ce),ce)
converged = .true.
do co = 1, myNgrains
converged = converged .and. crystallite_stress(dt,co,ip,el)
enddo
if (.not. converged) then
doneAndHappy = [.true.,.false.]
else
doneAndHappy = mechanical_updateState(dt,homogenization_F(1:3,1:3,ce),ce)
converged = all(doneAndHappy)
endif
if (converged) then
doneAndHappy = mechanical_updateState(dt,homogenization_F(1:3,1:3,ce),ce)
converged = all(doneAndHappy)
else
doneAndHappy = [.true.,.false.]
endif
enddo convergenceLooping

View File

@ -91,12 +91,11 @@ module subroutine mechanical_RGC_init(num_homogMech)
print'(a,i2)', ' # instances: ',count(homogenization_type == HOMOGENIZATION_RGC_ID); flush(IO_STDOUT)
print*, 'Tjahjanto et al., International Journal of Material Forming 2(1):939942, 2009'
print*, 'D.D. Tjahjanto et al., International Journal of Material Forming 2(1):939942, 2009'
print*, 'https://doi.org/10.1007/s12289-009-0619-1'//IO_EOL
print*, 'Tjahjanto et al., Modelling and Simulation in Materials Science and Engineering 18:015006, 2010'
print*, 'https://doi.org/10.1088/0965-0393/18/1/015006'//IO_EOL
print*, 'D.D. Tjahjanto et al., Modelling and Simulation in Materials Science and Engineering 18:015006, 2010'
print*, 'https://doi.org/10.1088/0965-0393/18/1/015006'//IO_EOL
material_homogenization => config_material%get('homogenization')

View File

@ -561,7 +561,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,co,ip,el) result(broken)
cycle LpLoop
endif
calculateJacobiLi: if (mod(jacoCounterLp, num%iJacoLpresiduum) == 0) then
calculateJacobiLp: if (mod(jacoCounterLp, num%iJacoLpresiduum) == 0) then
jacoCounterLp = jacoCounterLp + 1
do o=1,3; do p=1,3
@ -573,7 +573,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,co,ip,el) result(broken)
call dgesv(9,1,dRLp_dLp,9,devNull_9,temp_9,9,ierr) ! solve dRLp/dLp * delta Lp = -res for delta Lp
if (ierr /= 0) return ! error
deltaLp = - math_9to33(temp_9)
endif calculateJacobiLi
endif calculateJacobiLp
Lpguess = Lpguess &
+ deltaLp * steplengthLp
@ -601,7 +601,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,co,ip,el) result(broken)
cycle LiLoop
endif
calculateJacobiLp: if (mod(jacoCounterLi, num%iJacoLpresiduum) == 0) then
calculateJacobiLi: if (mod(jacoCounterLi, num%iJacoLpresiduum) == 0) then
jacoCounterLi = jacoCounterLi + 1
temp_33 = matmul(matmul(A,B),invFi_current)
@ -620,7 +620,7 @@ function integrateStress(F,subFp0,subFi0,Delta_t,co,ip,el) result(broken)
call dgesv(9,1,dRLi_dLi,9,devNull_9,temp_9,9,ierr) ! solve dRLi/dLp * delta Li = -res for delta Li
if (ierr /= 0) return ! error
deltaLi = - math_9to33(temp_9)
endif calculateJacobiLp
endif calculateJacobiLi
Liguess = Liguess &
+ deltaLi * steplengthLi

View File

@ -103,7 +103,7 @@ module function plastic_dislotungsten_init() result(myPlasticity)
print'(/,a)', ' <<<+- phase:mechanical:plastic:dislotungsten init -+>>>'
print'(a,i0)', ' # phases: ',count(myPlasticity); flush(IO_STDOUT)
print*, 'Cereceda et al., International Journal of Plasticity 78:242256, 2016'
print*, 'D. Cereceda et al., International Journal of Plasticity 78:242256, 2016'
print*, 'https://dx.doi.org/10.1016/j.ijplas.2015.09.002'

View File

@ -150,13 +150,13 @@ module function plastic_dislotwin_init() result(myPlasticity)
print'(/,a)', ' <<<+- phase:mechanical:plastic:dislotwin init -+>>>'
print'(a,i0)', ' # phases: ',count(myPlasticity); flush(IO_STDOUT)
print*, 'Ma and Roters, Acta Materialia 52(12):36033612, 2004'
print*, 'A. Ma and F. Roters, Acta Materialia 52(12):36033612, 2004'
print*, 'https://doi.org/10.1016/j.actamat.2004.04.012'//IO_EOL
print*, 'Roters et al., Computational Materials Science 39:9195, 2007'
print*, 'F. Roters et al., Computational Materials Science 39:9195, 2007'
print*, 'https://doi.org/10.1016/j.commatsci.2006.04.014'//IO_EOL
print*, 'Wong et al., Acta Materialia 118:140151, 2016'
print*, 'S.L. Wong et al., Acta Materialia 118:140151, 2016'
print*, 'https://doi.org/10.1016/j.actamat.2016.07.032'

View File

@ -71,7 +71,7 @@ module function plastic_isotropic_init() result(myPlasticity)
print'(/,a)', ' <<<+- phase:mechanical:plastic:isotropic init -+>>>'
print'(a,i0)', ' # phases: ',count(myPlasticity); flush(IO_STDOUT)
print*, 'Maiti and Eisenlohr, Scripta Materialia 145:3740, 2018'
print*, 'T. Maiti and P. Eisenlohr, Scripta Materialia 145:3740, 2018'
print*, 'https://doi.org/10.1016/j.scriptamat.2017.09.047'
phases => config_material%get('phase')

View File

@ -203,10 +203,10 @@ module function plastic_nonlocal_init() result(myPlasticity)
print'(/,a)', ' <<<+- phase:mechanical:plastic:nonlocal init -+>>>'
print'(a,i0)', ' # phases: ',Ninstances; flush(IO_STDOUT)
print*, 'Reuber et al., Acta Materialia 71:333348, 2014'
print*, 'C. Reuber et al., Acta Materialia 71:333348, 2014'
print*, 'https://doi.org/10.1016/j.actamat.2014.03.012'//IO_EOL
print*, 'Kords, Dissertation RWTH Aachen, 2014'
print*, 'C. Kords, Dissertation RWTH Aachen, 2014'
print*, 'http://publications.rwth-aachen.de/record/229993'

View File

@ -61,7 +61,7 @@ subroutine results_init(restart)
print'(/,a)', ' <<<+- results init -+>>>'; flush(IO_STDOUT)
print*, 'Diehl et al., Integrating Materials and Manufacturing Innovation 6(1):8391, 2017'
print*, 'M. Diehl et al., Integrating Materials and Manufacturing Innovation 6(1):8391, 2017'
print*, 'https://doi.org/10.1007/s40192-017-0084-5'//IO_EOL
if(.not. restart) then

View File

@ -105,7 +105,7 @@ subroutine rotations_init
print'(/,a)', ' <<<+- rotations init -+>>>'; flush(IO_STDOUT)
print*, 'Rowenhorst et al., Modelling and Simulation in Materials Science and Engineering 23:083501, 2015'
print*, 'D. Rowenhorst et al., Modelling and Simulation in Materials Science and Engineering 23:083501, 2015'
print*, 'https://doi.org/10.1088/0965-0393/23/8/083501'
call selfTest