Demo workflows#
These workflow templates are included in MatFlow as demonstrations. You can copy a demo workflow template to somewhere accessible using the CLI like this:
matflow demo-workflow copy WORKFLOW_NAME DESTINATION
where WORKFLOW_NAME
is the name of one of the demo workflows, and DESTINATION
is the
target copy location, which can be a directory (e.g. "."
for the current
working directory, or a full file path).
In the Python API, we can copy a demo workflow template file like this:
import matflow as mf
mf.copy_demo_workflow(name, dst)
RVE_extrusion_EBSD#
A workflow to generate a volume element from EBSD data that is extruded in the z-direction. The volume element is modified to include a buffer zone, and uniaxial tension is simulated using DAMASK.
Note: this is a work-in-progress, and material parameters may need to be updated.
RVE_extrusion_EBSD.yaml
tasks:
- schema: load_microstructure_EBSD
inputs:
root_path: <<demo_data_file:defdap_small_dataset>>
scaling_factor: 0.5
EBSD:
filename: ebsd_data
flip_vert: true # optional
boundary_tol: 8 # optional
min_grain_size: 30 # optional
- schema: generate_volume_element_extrusion
inputs:
depth: 8
image_axes: [y, x]
homog_label: SX
phase_label: Ti
- schema: visualise_VE_VTK
- schema: modify_VE_add_buffer_zones
inputs:
buffer_sizes: [4, 4, 4, 4, 2, 2] # size of buffer on each face [-x, +x, -y, +y, -z, +z]
phase_ids: [1, 1, 1, 1, 2, 2] # phase of each buffer. Relative, so 1 is the first new phase and so on
phase_labels: [Ti_iso, Air] # labels of the new phases
homog_label: SX
order: [z, y, x] # order to add the zones, default [x, y, z]
- schema: visualise_VE_VTK
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 30
num_increments: 30
target_def_grad_rate: 1.0e-4
direction: x
homogenization:
SX:
mechanical:
type: pass
N_constituents: 1
damask_phases:
Ti:
lattice: hP
c/a: 1.587
mechanical:
output: [F, F_p, P, O]
elastic:
type: Hooke
C_11: 160.0e9
C_12: 90.0e9
C_13: 66.0e9
C_33: 181.7e9
C_44: 46.5e9
plastic:
type: phenopowerlaw
output: [gamma_sl]
N_sl: [3, 3, 0, 12] # basal, prism, -, 1. pyr<c+a>
n_sl: 20
a_sl: 2
dot_gamma_0_sl: 0.001
xi_0_sl: [349.e+6, 150.e+6, 0.0, 1107.e+6] # C. Zambaldi et al.
xi_inf_sl: [568.e+6, 150.e+7, 0.0, 3420.e+6] # C. Zambaldi et al.
h_0_sl-sl: 15.e6
h_sl-sl: [+1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, +1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0] # unused entries are indicated by -1.0
Ti_iso:
lattice: cF
mechanical:
output: [F, P]
elastic:
type: Hooke
C_11: 175.5e9
C_12: 90.4e9
C_44: 42.55e9 # isotropic value: 0.5*(C_11-C_12)
plastic:
type: none
Air:
lattice: cF
mechanical:
output: [F, P]
elastic:
type: Hooke
C_11: 1e8
C_12: 1e6
C_44: 49.5e6 # isotropic value: 0.5*(C_11-C_12)
plastic:
type: isotropic
output: [xi, gamma]
xi_0: 0.3e6
xi_inf: 0.6e6
dot_gamma_0: 0.001
n: 5
M: 3
h_0: 1e6
a: 2
dilatation: true
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {}
- name: add_strain
args: {F: F, t: U, m: 2}
opts: {}
VE_response_data:
# Use for average quantities in a single phase, say average stress/strain at each step of sim
phase_data:
- field_name: sigma
phase_name: Ti
out_name: vol_avg_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_U^2(F)
phase_name: Ti
out_name: vol_avg_strain
transforms: [mean_along_axes: 1]
# Use to extract spatial data from (probably a subset of increments)
field_data:
- field_name: epsilon_U^2(F)
increments:
- values: [10, 20, 30]
- field_name: sigma
increments:
- start: 10
stop: 30
step: 10
- field_name: O
increments:
- values: [10, 20, 30]
- field_name: u_n
increments:
- values: [10, 20, 30]
- field_name: grain # Grain mapping
- field_name: phase # Phase mapping
# Use to extract grain averaged data
grain_data:
- field_name: epsilon_U^2(F)
increments:
- values: [10, 20, 30]
- field_name: sigma
increments:
- values: [10, 20, 30]
- field_name: O
increments:
- values: [10, 20, 30]
damask_numerics:
grid:
itmin: 2
itmax: 100
derivative: FWBW_difference
RVE_extrusion_EBSD_DIC#
A workflow to generate a volume element from EBSD and DIC data that is extruded in the z-direction. The volume element is modified to include a buffer zone, and uniaxial tension is simulated using DAMASK.
Note: this is a work-in-progress, and material parameters may need to be updated.
RVE_extrusion_EBSD_DIC.yaml
tasks:
- schema: load_microstructure_EBSD_DIC
inputs:
transform_type: affine
root_path: <<demo_data_file:defdap_small_dataset>>
scaling_factor: 0.5
DIC:
filename: dic_data.txt
crop: [15, 28, 30, 15] # optional
scale: 1.328e-2 # microns per pixel, optional
min_grain_size: 20 # optional
homog_points:
- [452, 322]
- [200, 417]
- [159, 144]
- [352, 269]
- [102, 33]
- [500, 48]
- [295, 245]
- [176, 437]
- [61, 382]
- [391, 398]
- [240, 208]
EBSD:
filename: ebsd_data
flip_vert: true # optional
boundary_tol: 8 # optional
min_grain_size: 10 # optional
homog_points:
- [780, 606]
- [374, 816]
- [285, 385]
- [612, 543]
- [186, 218]
- [839, 149]
- [516, 519]
- [335, 856]
- [145, 794]
- [686, 743]
- [424, 470]
- schema: generate_volume_element_extrusion
inputs:
depth: 8
image_axes: [y, x]
homog_label: SX
phase_label: Ti
- schema: visualise_VE_VTK
- schema: modify_VE_add_buffer_zones
inputs:
buffer_sizes: [4, 4, 4, 4, 2, 2] # size of buffer on each face [-x, +x, -y, +y, -z, +z]
phase_ids: [1, 1, 1, 1, 2, 2] # phase of each buffer. Relative, so 1 is the first new phase and so on
phase_labels: [Ti_iso, Air] # labels of the new phases
homog_label: SX
order: [z, y, x] # order to add the zones, default [x, y, z]
- schema: visualise_VE_VTK
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 30
num_increments: 30
target_def_grad_rate: 1.0e-4
direction: x
homogenization:
SX:
mechanical:
type: pass
N_constituents: 1
damask_phases:
Ti:
lattice: hP
c/a: 1.587
mechanical:
output: [F, F_p, P, O]
elastic:
type: Hooke
C_11: 160.0e9
C_12: 90.0e9
C_13: 66.0e9
C_33: 181.7e9
C_44: 46.5e9
plastic:
type: phenopowerlaw
output: [gamma_sl]
N_sl: [3, 3, 0, 12] # basal, prism, -, 1. pyr<c+a>
n_sl: 20
a_sl: 2
dot_gamma_0_sl: 0.001
xi_0_sl: [349.e+6, 150.e+6, 0.0, 1107.e+6] # C. Zambaldi et al.
xi_inf_sl: [568.e+6, 150.e+7, 0.0, 3420.e+6] # C. Zambaldi et al.
h_0_sl-sl: 15.e6
h_sl-sl: [+1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, +1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0] # unused entries are indicated by -1.0
Ti_iso:
lattice: cF
mechanical:
output: [F, P]
elastic:
type: Hooke
C_11: 175.5e9
C_12: 90.4e9
C_44: 42.55e9 # isotropic value: 0.5*(C_11-C_12)
plastic:
type: none
Air:
lattice: cF
mechanical:
output: [F, P]
elastic:
type: Hooke
C_11: 1e8
C_12: 1e6
C_44: 49.5e6 # isotropic value: 0.5*(C_11-C_12)
plastic:
type: isotropic
output: [xi, gamma]
xi_0: 0.3e6
xi_inf: 0.6e6
dot_gamma_0: 0.001
n: 5
M: 3
h_0: 1e6
a: 2
dilatation: true
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {}
- name: add_strain
args: {F: F, t: U, m: 2}
opts: {}
VE_response_data:
# Use for average quantities in a single phase, say average stress/strain at each step of sim
phase_data:
- field_name: sigma
phase_name: Ti
out_name: vol_avg_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_U^2(F)
phase_name: Ti
out_name: vol_avg_strain
transforms: [mean_along_axes: 1]
# Use to extract spatial data from (probably a subset of increments)
field_data:
- field_name: epsilon_U^2(F)
increments:
- values: [10, 20, 30]
- field_name: sigma
increments:
- start: 10
stop: 30
step: 10
- field_name: O
increments:
- values: [10, 20, 30]
- field_name: u_n
increments:
- values: [10, 20, 30]
- field_name: grain # Grain mapping
- field_name: phase # Phase mapping
# Use to extract grain averaged data
grain_data:
- field_name: epsilon_U^2(F)
increments:
- values: [10, 20, 30]
- field_name: sigma
increments:
- values: [10, 20, 30]
- field_name: O
increments:
- values: [10, 20, 30]
damask_numerics:
grid:
itmin: 2
itmax: 100
derivative: FWBW_difference
cubic_textures#
A simple workflow to demonstrate sampling common “named” cubic textures. Euler angles are taken from L. A. I. Kestens & H. Pirgazi (2016) Texture formation in metal alloys with cubic crystal structures, Materials Science and Technology, 32:13, 1303-1315, DOI: 10.1080/02670836.2016.1231746.
cubic_textures.yaml
tasks:
- schema: sample_texture_from_model_ODF_mtex
inputs:
crystal_symmetry: cubic
specimen_symmetry: orthorhombic
num_orientations: 2000
ODF_components:
- type: unimodal
component_fraction: 1.0
halfwidth: 5
compile: false
sequences:
- path: inputs.ODF_components.0.modal_orientation_euler
values:
- [90, 35, 45] # Copper
- [59, 37, 63] # S
- [0, 45, 90] # Goss
- [35, 45, 90] # Brass
- [90, 27, 45] # Dillamore
- [0, 0, 0] # Cube
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic # so we only see one orientaion on the pole figure
pole_figure_directions:
- [1, 1, 1]
compile: false
damask_input_files#
Demonstration of passing DAMASK input files (load case file, geometry file, and material file) directly to the simulate_VE_loading_damask task. Input parameters that are used to generate these input files need not be passed.
damask_input_files.yaml
tasks:
- schema: simulate_VE_loading_damask
input_files:
damask_load_file: <<demo_data_file:load.yaml>>
damask_geom_file: <<demo_data_file:geom.vti>>
damask_material_file: <<demo_data_file:material.yaml>>
inputs:
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Al
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Al
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Al
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 20
damask_numerics#
Demonstration of providing custom numerics options to DAMASK via the numerics.yaml file. For a list of supported numerics keys, look in the demo-data file numerics_example.yaml; you can copy this file to your current working directory with this command: matflow demo-data copy numerics_example.yaml .
damask_numerics.yaml
tasks:
- schema: simulate_VE_loading_damask
input_files:
damask_load_file: <<demo_data_file:load.yaml>>
damask_geom_file: <<demo_data_file:geom.vti>>
damask_material_file: <<demo_data_file:material.yaml>>
inputs:
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Al
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Al
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Al
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 20
damask_numerics:
grid:
itmin: 2
itmax: 100
derivative: FWBW_difference
fit_single_crystal_parameters#
Fit single crystal parameters using an experimental uniaxial tension stress-strain curve and an iterative Levenberg-Marquardt fitting process.
fit_single_crystal_parameters.yaml
loops:
- num_iterations: 2
tasks: [3, 4]
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 2000
phase_label: Al
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [32, 32, 32]
- schema: read_tensile_test_from_CSV
inputs:
CSV_file_path: <<demo_data_file:surfalex_tensile_test.csv>>
CSV_arguments:
delimiter: ','
skip_rows: 0
header_row: 1
eng_strain_col_index: 0
eng_stress_col_index: 1
stress_units: MPa
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 3500
num_increments: 170
direction: x
target_def_grad_rate: 1.0e-4
dump_frequency: 1
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
single_crystal_parameters:
phases:
Al:
h_0_sl-sl: 400e6
xi_0_sl: [30e6]
xi_inf_sl: [95e6]
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_p]
elastic:
type: Hooke
C_11: 106750000000
C_12: 60410000000
C_44: 28340000000
plastic:
type: phenopowerlaw
single_crystal_parameters: Al
N_sl: [12]
a_sl: 2.25
atol_xi: 1
dot_gamma_0_sl: 0.001
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: U, m: 0}
opts: {add_Mises: true}
VE_response_data:
volume_data:
- out_name: vol_avg_stress
field_name: sigma
transforms: [mean_along_axes: 1]
- out_name: vol_avg_strain
field_name: epsilon_U^0(F)
transforms: [mean_along_axes: 1]
sequences:
- path: inputs.single_crystal_parameters.perturbations
values:
-
- multiplicative: 1.05
path: [Al, h_0_sl-sl]
- multiplicative: 1.05
path: [Al, xi_0_sl, 0]
- multiplicative: 1.05
path: [Al, xi_inf_sl, 0]
groups:
- name: fit_single_crystal_parameters
- schema: fit_single_crystal_parameters
inputs:
initial_damping: [2.0, 1.0, 0.5]
fit_yield_funcs#
A workflow to fit yield functions to crystal plasticity simulations.
fit_yield_funcs.yaml
tasks:
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
orientations::from_random:
number: 4
microstructure_seeds::from_random:
box_size: [1, 1, 1]
num_seeds: 4
phase_label: Al
- schema: define_load_case
element_sets:
- inputs:
load_case::uniaxial:
total_time: 100
num_increments: 200
direction: x
target_def_grad_rate: 1.0e-3
- inputs:
load_case::random_3D:
total_time: 100
num_increments: 200
target_def_grad: 1.0e-1
groups:
- name: multiaxial_load_cases
repeats: 6
- schema: simulate_VE_loading_damask
inputs:
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 106750000000
C_12: 60410000000
C_44: 28340000000
plastic:
type: phenopowerlaw
N_sl: [12]
a_sl: 2.25
atol_xi: 1
dot_gamma_0_sl: 0.001
h_0_sl-sl: 75.0e+6
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
xi_0_sl: [31.0e+6]
xi_inf_sl: [63.0e+6]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {}
- name: add_strain
args: {F: F_p, t: U, m: 0}
opts: {}
VE_response_data:
volume_data:
- out_name: vol_avg_stress
field_name: sigma
transforms: [mean_along_axes: 1]
- out_name: vol_avg_plastic_strain
field_name: epsilon_U^0(F_p)
transforms: [mean_along_axes: 1]
- schema: fit_yield_function
inputs:
yield_function_name: Hill1948
yield_point_criteria:
threshold: equivalent_plastic_strain
values: [2.0e-3, 1.0e-2]
input_sources:
VE_response[uniaxial]:
- source_type: task
task_ref: simulate_VE_loading_damask
where:
path: inputs.load_case.type
condition:
value.equal_to: uniaxial
VE_response[multiaxial]:
- source_type: task
task_ref: simulate_VE_loading_damask
where:
path: inputs.load_case.type
condition:
value.equal_to: random_3D
generate_volume_element_from_statistics#
This simple workflow generates a pipeline.json file, and then runs it with Dream.3D’s PipelineRunner command. Phases can be specified and parametrised as if using the “Stats Generator” filter in the Dream.3D GUI.
generate_volume_element_from_statistics.yaml
tasks:
- schema: generate_volume_element_from_statistics
inputs:
grid_size: [128, 128, 256]
size: [1, 1, 2]
phase_statistics:
- type: primary
name: Al
crystal_structure: cubic
volume_fraction: 1.00 # `volume_fraction` for all phases must sum to 1!
size_distribution:
ESD_mean: 0.3 # Specify either `ESD_mean` or `ESD_log_mean`
ESD_log_stddev: 0.1
num_bins: 10 # Specify either `num_bins` or `bin_step_size
modify_volume_element_grid_size#
Workflow to generate a volume element, then increase the grid size, and visualise the original and modified volume elements.
modify_volume_element_grid_size.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 4
phase_label: Al
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
- schema: visualise_VE_VTK
- schema: modify_VE_grid_size
inputs:
new_grid_size: [16, 16, 16]
- schema: visualise_VE_VTK
read_tensile_test_CSV#
Read tensile test data from a CSV file.
read_tensile_test_CSV.yaml
tasks:
- schema: read_tensile_test_from_CSV
inputs:
CSV_file_path: <<demo_data_file:surfalex_tensile_test.csv>>
CSV_arguments:
delimiter: ','
skip_rows: 0
header_row: 1
eng_strain_col_index: 0
eng_stress_col_index: 1
stress_units: MPa
sample_orientations_CRC_file#
Demonstration of a task to sample a subset of orientations from a CRC file using MTEX, and produce pole figures of the sampled orientations. Note that directory to which the CRC_file_path points should also contain a CPR file with the same file name stem as the CRC file.
Note that sample_orientations schemas pick a random subset of orientations from the EBSD data, whereas the sample_texture schemas first construct an orientation distribution function (ODF), from which orientations are then sampled.
sample_orientations_CRC_file.yaml
tasks:
- schema: sample_orientations_from_CRC_file_mtex
inputs:
CRC_file_path: <<demo_data_file:texture_Al_CRC>>/texture_Al.crc
EBSD_reference_frame_transformation: convertEuler2SpatialReferenceFrame
specimen_symmetry: cubic
EBSD_phase: Al
EBSD_rotation:
num_orientations: 1000
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
sample_orientations_CTF_file#
Demonstration of a task to sample a subset of orientations from a CTF file using MTEX, and produce pole figures of the sampled orientations.
Note that sample_orientations schemas pick a random subset of orientations from the EBSD data, whereas the sample_texture schemas first construct an orientation distribution function (ODF), from which orientations are then sampled.
sample_orientations_CTF_file.yaml
tasks:
- schema: sample_orientations_from_CTF_file_mtex
inputs:
CTF_file_path: <<demo_data_file:texture_Al.ctf>>
EBSD_reference_frame_transformation: convertEuler2SpatialReferenceFrame
specimen_symmetry: cubic
EBSD_phase: Al
EBSD_rotation:
num_orientations: 1000
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
sample_texture_CRC_file#
Demonstration of a task to sample texture from a CRC file using MTEX, and produce pole figures of the sampled orientations. Note that directory to which the CRC_file_path points should also contain a CPR file with the same file name stem as the CRC file.
sample_texture_CRC_file.yaml
tasks:
- schema: sample_texture_from_CRC_file_mtex
inputs:
CRC_file_path: <<demo_data_file:texture_Al_CRC>>/texture_Al.crc
EBSD_reference_frame_transformation: convertEuler2SpatialReferenceFrame
specimen_symmetry: cubic
EBSD_phase: Al
EBSD_rotation:
num_orientations: 1000
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
sample_texture_CTF_file#
Demonstration of a task to sample texture from a CTF file using MTEX, and produce pole figures of the sampled orientations.
sample_texture_CTF_file.yaml
tasks:
- schema: sample_texture_from_CTF_file_mtex
inputs:
CTF_file_path: <<demo_data_file:texture_Al.ctf>>
EBSD_reference_frame_transformation: convertEuler2SpatialReferenceFrame
specimen_symmetry: cubic
EBSD_phase: Al
EBSD_rotation:
num_orientations: 1000
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
sample_texture_ODF_mat#
Demonstration of a task to sample texture from an MTEX ODF object stored in a binary .mat file, and produce pole figures of the sampled orientations.
sample_texture_ODF_mat.yaml
tasks:
- schema: sample_texture_from_ODF_mat_file_mtex
inputs:
ODF_mat_file_path: <<demo_data_file:ODF.mat>>
num_orientations: 1000
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
sample_texture_model_ODF#
Demonstration of a task to sample texture from a model orientation distribution function (ODF) using MTEX, and produce pole figures of the sampled orientations.
sample_texture_model_ODF.yaml
tasks:
- schema: sample_texture_from_model_ODF_mtex
inputs:
crystal_symmetry: hexagonal
specimen_symmetry: orthorhombic
num_orientations: 1000
ODF_components:
- type: unimodal
component_fraction: 0.4 # component fractions must sum to 1!
modal_orientation_HKL: [0, 0, 1]
modal_orientation_UVW: [1, 0, 0]
halfwidth: 15
- type: unimodal
component_fraction: 0.3 # component fractions must sum to 1!
modal_orientation_euler: [0, 0, 10] # in Bunge/degrees/MTEX hex alignment (y//b)
halfwidth: 5
- type: uniform
component_fraction: 0.3 # component fractions must sum to 1!
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: hexagonal
pole_figure_directions:
- [0, 0, 0, 1]
- [1, 0, -1, 0]
- [1, 1, -2, 0]
use_contours: true
compile: false
sample_texture_random#
Demonstration of a task to sample texture randomly using MTEX, and produce pole figures of the sampled orientations.
sample_texture_random.yaml
tasks:
- schema: sample_texture_random_mtex
inputs:
specimen_symmetry: cubic
num_orientations: 1000
crystal_symmetry: cubic
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [0, 0, 1]
- [1, 0, 1]
- [1, 1, 1]
use_contours: false
compile: false
simulate_yield_surface_2D#
This workflow uses DAMASK full-field crystal plasticity simulations to generate yield surfaces for an aluminium material with different strong textures.
simulate_yield_surface_2D.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 1024
phase_label: Al
- schema: sample_texture_from_model_ODF_mtex
inputs:
crystal_symmetry: cubic
specimen_symmetry: orthorhombic
num_orientations: 1024
ODF_components:
- type: unimodal
component_fraction: 1.0
halfwidth: 3
compile: false
sequences:
- path: inputs.ODF_components.0.modal_orientation_euler
values:
- [90, 35, 45] # Copper
- [59, 37, 63] # S
- [0, 45, 90] # Goss
- [35, 45, 90] # Brass
- [0, 0, 0] # Cube
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic
pole_figure_directions:
- [1, 1, 1]
compile: false
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [64, 64, 64]
scale_morphology: [1, 0.8, 0.48]
- schema: visualise_VE_VTK
- schema: define_load_case
inputs:
load_case:
steps:
- total_time: 80
num_increments: 400
target_def_grad_rate:
- [0.0, 0.0, x]
- [0.0, 0.0, x]
- [0.0, 0.0, x]
stress:
- [x, x, 0.0]
- [x, x, 0.0]
- [x, x, 0.0]
dump_frequency: 1
sequences:
- path: inputs.load_case.steps.0.target_def_grad_rate.0.0
values::from_rectangle:
start: [-0.0002, -0.0002]
stop: [+0.0002, +0.0002]
num: [17, 17]
coord: 0
- path: inputs.load_case.steps.0.target_def_grad_rate.1.1
values::from_rectangle:
start: [-0.0002, -0.0002]
stop: [+0.0002, +0.0002]
num: [17, 17]
coord: 1
- schema: simulate_VE_loading_damask
nesting_order:
inputs.volume_element: 0
inputs.load_case: 1
inputs.load_case.steps.0.target_def_grad_rate.0.0: 1
inputs.load_case.steps.0.target_def_grad_rate.1.1: 1
inputs:
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 107.3e+9
C_12: 60.9e+9
C_44: 28.3e+9
plastic:
type: phenopowerlaw
N_sl: [12]
a_sl: 1.499
atol_xi: 1
dot_gamma_0_sl: 0.001
h_0_sl-sl: 912.2e+6 # come from 60C results
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
xi_0_sl: [138.2e+6]
xi_inf_sl: [300.9e+6]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
- name: add_strain
args: {F: F_p, t: U, m: 1}
VE_response_data:
phase_data:
- field_name: sigma
phase_name: Al
out_name: vol_avg_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_U^1(F_p)
phase_name: Al
out_name: vol_avg_plastic_strain
transforms: [mean_along_axes: 1]
simulate_yield_surface_2D_brass#
WIP: This workflow uses DAMASK full-field crystal plasticity simulations to generate a yield surface for an aluminium material with the Brass texture.
simulate_yield_surface_2D_brass.yaml
tasks:
- schema: sample_texture_from_model_ODF_mtex
inputs:
crystal_symmetry: cubic
specimen_symmetry: orthorhombic
num_orientations: 1024
ODF_components:
- type: unimodal
component_fraction: 1.0
modal_orientation_HKL: [1, 1, 0]
modal_orientation_UVW: [1, -1, 2]
halfwidth: 5
compile: false
- schema: visualise_orientations_pole_figure_mtex
inputs:
crystal_symmetry: cubic # so we only see one orientaion on the pole figure
pole_figure_directions:
- [1, 1, 1]
compile: false
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 1024
phase_label: Al
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [64, 64, 64]
scale_morphology: [1, 0.8, 0.48]
- schema: visualise_VE_VTK
- schema: define_load_case
inputs:
load_case:
steps:
- total_time: 100
num_increments: 500
target_def_grad_rate:
- [0.0, 0.0, x]
- [0.0, 0.0, x]
- [0.0, 0.0, x]
stress:
- [x, x, 0.0]
- [x, x, 0.0]
- [x, x, 0.0]
dump_frequency: 1
sequences:
- path: inputs.load_case.steps.0.target_def_grad_rate.0.0
values::from_rectangle:
start: [-0.0002, -0.0002]
stop: [+0.0002, +0.0002]
num: [17, 17]
include: [top, right]
coord: 0
- path: inputs.load_case.steps.0.target_def_grad_rate.1.1
values::from_rectangle:
start: [-0.0002, -0.0002]
stop: [+0.0002, +0.0002]
num: [17, 17]
include: [top, right]
coord: 1
- schema: simulate_VE_loading_damask
inputs:
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 107.3e+9
C_12: 60.9e+9
C_44: 28.3e+9
plastic:
type: phenopowerlaw
N_sl: [12]
a_sl: 1.499
atol_xi: 1
dot_gamma_0_sl: 0.001
h_0_sl-sl: 912.2e+6 # come from 60C results
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
xi_0_sl: [138.2e+6]
xi_inf_sl: [300.9e+6]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
- name: add_strain
args: {F: F_p, t: U, m: 1}
VE_response_data:
phase_data:
- field_name: sigma
phase_name: Al
out_name: vol_avg_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_U^1(F_p)
phase_name: Al
out_name: vol_avg_plastic_strain
transforms: [mean_along_axes: 1]
tension_DAMASK_Al#
A simple crystal plasticity simulation using DAMASK. A volume element generated from a random voronoi tessellation is loaded uniaxially, using aluminium (Al) material parameters.
tension_DAMASK_Al.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 4
phase_label: Al
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 100
num_increments: 200
direction: x
target_def_grad_rate: 1.0e-3
dump_frequency: 1
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 106750000000
C_12: 60410000000
C_44: 28340000000
plastic:
type: phenopowerlaw
N_sl: [12]
a_sl: 2.25
atol_xi: 1
dot_gamma_0_sl: 0.001
h_0_sl-sl: 75.0e+6
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
xi_0_sl: [31.0e+6]
xi_inf_sl: [63.0e+6]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Al
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Al
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Al
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 20
tension_DAMASK_Al_N_repeats#
A simple crystal plasticity simulation using DAMASK. A volume element generated from a random voronoi tessellation is loaded uniaxially, using aluminium (Al) material parameters. Multiple simulations can be generated by using the make/go command-line –var option like this (e.g. for 100 repeats): –var N 100.
tension_DAMASK_Al_N_repeats.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 4
phase_label: Al
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
- schema: simulate_VE_loading_damask
repeats: <<var:N[default=1]>>
inputs:
load_case::uniaxial:
total_time: 100
num_increments: 200
direction: x
target_def_grad_rate: 1.0e-3
dump_frequency: 1
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Al:
lattice: cF
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 106750000000
C_12: 60410000000
C_44: 28340000000
plastic:
type: phenopowerlaw
N_sl: [12]
a_sl: 2.25
atol_xi: 1
dot_gamma_0_sl: 0.001
h_0_sl-sl: 75.0e+6
h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4]
n_sl: 20
output: [xi_sl]
xi_0_sl: [31.0e+6]
xi_inf_sl: [63.0e+6]
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Al
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Al
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Al
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 20
tension_DAMASK_Mg#
A simple crystal plasticity simulation using DAMASK. A volume element generated from a random voronoi tessellation is loaded uniaxially, using magnesium (Mg) material parameters.
tension_DAMASK_Mg.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 4
phase_label: Mg
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 100
num_increments: 1000
direction: x
target_def_grad_rate: 1.0e-3
dump_frequency: 5
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Mg:
lattice: hP
c/a: 1.62350 # from Tromans 2011, Elastic Anisotropy of HCP Metal Crystals and Polycrystals
rho: 1740.0
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 59.3e9
C_12: 25.7e9
C_13: 21.4e9
C_33: 61.5e9
C_44: 16.4e9
plastic:
type: phenopowerlaw
references:
- F. Wang et al., Acta Materialia 80:77-93, 2014, https://doi.org/10.1016/j.actamat.2014.07.048
output: [xi_sl, xi_tw]
N_sl: [3, 3, 6, 0, 6] # basal, prism, 1. pyr<a>, -, 2. pyr<c+a>
N_tw: [6, 0, 6] # tension, -, compression
xi_0_sl: [10.e+6, 55.e+6, 60.e+6, 0., 60.e+6]
xi_inf_sl: [40.e+6, 135.e+6, 150.e+6, 0., 150.e+6]
xi_0_tw: [40.e+6, 0., 60.e+6]
a_sl: 2.25
dot_gamma_0_sl: 0.001
dot_gamma_0_tw: 0.001
n_sl: 20
n_tw: 20
f_sat_sl-tw: 10.0
h_0_sl-sl: 500.0e+6
h_0_tw-tw: 50.0e+6
h_0_tw-sl: 150.0e+6
h_sl-sl: [+1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, +1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0,
1.0, +1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0,
-1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0] # unused entries are indicated by -1.0
h_tw-tw: [+1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0,
1.0] # unused entries are indicated by -1.0
h_tw-sl: [1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, +1.0, -1.0, 1.0, -1.0] # unused entries are indicated by -1.0
h_sl-tw: [1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, +1.0, -1.0, 1.0] # unused entries are indicated by -1.0
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Mg
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Mg
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Mg
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 100
tension_DAMASK_Ti#
A simple crystal plasticity simulation using DAMASK. A volume element generated from a random voronoi tessellation is loaded uniaxially, using titanium (Ti) material parameters.
tension_DAMASK_Ti.yaml
tasks:
- schema: generate_microstructure_seeds_from_random
inputs:
VE_size: [1, 1, 1]
num_grains: 4
phase_label: Ti
- schema: generate_volume_element_from_voronoi
inputs:
homog_label: SX
VE_grid_size: [8, 8, 8]
- schema: simulate_VE_loading_damask
inputs:
load_case::uniaxial:
total_time: 100
num_increments: 1000
direction: x
target_def_grad_rate: 1.0e-3
dump_frequency: 5
homogenization:
SX:
mechanical: {type: pass}
N_constituents: 1
damask_phases:
Ti:
lattice: hP
c/a: 1.62350 # from Tromans 2011, Elastic Anisotropy of HCP Metal Crystals and Polycrystals
rho: 1740.0
mechanical:
output: [F, P, F_e, F_p, L_p, O]
elastic:
type: Hooke
C_11: 59.3e9
C_12: 25.7e9
C_13: 21.4e9
C_33: 61.5e9
C_44: 16.4e9
plastic:
type: phenopowerlaw
references:
- C. Zambaldi et al., Journal of Materials Research 27(1):356-367, 2021,
https://doi.org/10.1557/jmr.2011.334
- L. Wang et al., Acta Materialia 132:598-610, 2017, https://doi.org/10.1016/j.actamat.2017.05.015
output: [gamma_sl]
N_sl: [3, 3, 0, 12] # basal, prism, -, 1. pyr<c+a>
n_sl: 20
a_sl: 2.0
dot_gamma_0_sl: 0.001
h_0_sl-sl: 200.e+6
xi_0_sl: [349.e+6, 150.e+6, 0.0, 1107.e+6] # C. Zambaldi et al.
xi_inf_sl: [568.e+6, 150.e+7, 0.0, 3420.e+6] # C. Zambaldi et al.
# xi_0_sl: [127.e+6, 96.e+6, 0.0, 240.e+6] # L. Wang et al.
h_sl-sl: [+1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0,
-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, +1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, +1.0, 1.0, 1.0, 1.0, 1.0, 1.0] # unused entries are indicated by -1.0
damask_post_processing:
- name: add_stress_Cauchy
args: {P: P, F: F}
opts: {add_Mises: true}
- name: add_strain
args: {F: F, t: V, m: 0}
opts: {add_Mises: true}
- name: add_strain
args: {F: F_p, t: V, m: 0}
opts: {add_Mises: true}
- name: add_IPF_color
args: {l: [0, 0, 1]}
VE_response_data:
phase_data:
- field_name: sigma_vM
phase_name: Ti
out_name: vol_avg_equivalent_stress
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F)_vM
phase_name: Ti
out_name: vol_avg_equivalent_strain
transforms: [mean_along_axes: 1]
- field_name: epsilon_V^0(F_p)_vM
phase_name: Ti
out_name: vol_avg_equivalent_plastic_strain
transforms: [mean_along_axes: 1]
field_data:
- field_name: phase
- field_name: O
grain_data:
- field_name: O
increments: [values: [0, -1]]
damask_viz:
fields: [F, F_p, P, sigma_vM, epsilon_V^0(F_p)_vM, IPFcolor_(0 0 1), phase]
increments:
- step: 100