BlueQuartzSoftware / simplnx

The backend algorithms and framework associated with DREAM3DNX, a data analysis program for materials science data analytics
http://www.dream3d.io/
Other
7 stars 9 forks source link

ENH: Compute Taylor factor of each feature and average value for ensemble #1050

Open StopkaKris opened 2 months ago

StopkaKris commented 2 months ago

Is there an existing plan for this?

Description of the Feature, Filter, or Functionality?

Hello,

Could we add a filter to compute the Taylor factor for each feature/grain? It is commonly reported in literature to quantify the texture of a polycrystal. Our group currently relies on custom codes or integration with MTEX, but it would be great if DREAM.3D could compute this directly. It would be structured similar to the "Compute Schmid Factors" filter. I am happy to help with this implementation in any way I can.

References: Bishop and Hill. A theoretical derivation of the plastic properties of a polycrystalline face-centred metal. https://doi.org/10.1080/14786444108561385

Miller and Dawson. Influence of slip system hardening assumptions on modeling stress dependence of work hardening. https://doi.org/10.1016/S0022-5096(97)00029-X

Version

7.0.x (DREAM3DNX beta)

What section did you foresee your suggestion falling in? [Further details may be required during triage process]

No response

High Level Steps To Implement

No response

Anything else?

No response

Code of Conduct

imikejackson commented 2 months ago

@StopkaKris If you have actual code implementations that would be a start. Not sure of the band width I have for this at the moment but if you can tie the need to an actual DoD or DoE contract that would help.

StopkaKris commented 2 months ago

@imikejackson The MatLab code leverages MTEX and is posted below. The calculation is most straightforward for FCC because the 12 slip systems have identical resistance to slip, and I think my peers more versed in this topic may say that this calculation can be more complex for HCP crystals, because I think it depends on relative slip system strengths... Nonetheless, the simplified calculation for HCP is still very useful.

The current work that relies on these calculations is sponsored by NASA (ESI19 Grant number 80NSSC20K0296) and NIST (grant number 70NANB21H005). The latest publications that leveraged this code are available here, here, and here, and we have others in preparation. I don't think our group has any current DoD or DoE projects that rely on this but we did in the past and may have others in the future.


addpath('C:\Users\stopk\Desktop\MTEX\mtex-6.0.beta3');
startup_mtex
clear variables; close all;

% startup_mtex

disp('Start...')

%% Input and calculation for HCP crystal

% Add your orientation/Euler angles here. It can be a single orientation or nx3 vector containing multiple orientations
% NOTE: angles must be in radians for MTEX.

ang_data_HCP = [
1.4416009   0.41336653  3.8852353
2.0489373   1.5178732   3.779793
0.85339028  1.0982764   6.1133742
4.1814857   1.4110879   3.241231
5.5727954   1.7680696   0.51296496
3.2973526   1.4986781   1.8723277
1.9572715   1.6110781   1.7915303
6.0501504   1.7549795   0.25639468
2.0195224   2.1245868   5.739234
4.8148546   1.105855    5.3476686
3.6220899   2.6163311   5.0088763];

% Specify a loading direction, here it is the X direction
eps = strainTensor(diag([1 -0.5 -0.5])); %Uniaxial tension

% Specify HCP crystal symmetry
cs_HCP = crystalSymmetry('hexagonal')

% Specify HCP slip systems
sBasal = slipSystem.basal(cs_HCP);
ssPrism = slipSystem.prismaticA(cs_HCP);
ssPyrA = slipSystem.pyramidalA(cs_HCP);
ssPyrCA = slipSystem.pyramidalCA(cs_HCP);

ss = [sBasal; ssPrism; ssPyrA; ssPyrCA];

ori = orientation.byEuler(ang_data_HCP(:,1),ang_data_HCP(:,2),ang_data_HCP(:,3),cs_HCP)

% NOTE: if orientations are supplies as degrees, the line below will
% convert to radians
% ori = orientation.byEuler(angdat(:,1)*degree,angdat(:,2)*degree,angdat(:,3)*degree,cs)

% Compute Taylor factor
[M,b,W] = calcTaylor(inv(ori)*eps,ss.symmetrise);

M_grains = M; %Taylor factor for each orientation in angdat
Tay = mean(M) %The mean Taylor factor for the aggregate 

%% Input and calculation for FCC crystal

% Add your orientation/Euler angles here. It can be a single orientation or nx3 vector containing multiple orientations
% NOTE: angles must be in radians for MTEX.

ang_data_FCC = [
2.2763655   1.3206245   5.6447248
5.1452227   1.5281901   4.0765667
0.74482793  0.76546848  1.5905015
2.9133639   1.3761976   0.51417983
4.806447    2.7984304   5.0935655
0.10467447  1.9473389   4.0803266
5.7894387   1.7973889   0.85527849
2.8706079   0.49759239  2.1377926
5.6877685   2.2614186   0.22883539];

% Specify a loading direction, here it is the X direction
eps = strainTensor(diag([1 -0.5 -0.5])); %Uniaxial tension

% Specify FCC crystal symmetry
cs_FCC = crystalSymmetry('m-3m')

% Consider FCC slip systems
sS = symmetrise(slipSystem.fcc(cs_FCC));

ori = orientation.byEuler(ang_data_FCC(:,1),ang_data_FCC(:,2),ang_data_FCC(:,3),cs_FCC)

% Compute Taylor factor
[M,b,W] = calcTaylor(inv(ori)*eps,sS);

M_grains = M; %Taylor factor for each orientation in angdat
Tay = mean(M) %The mean Taylor factor for the aggregate ```
StopkaKris commented 1 month ago

@imikejackson I have internal codes that compute the Taylor factor for FCC crystals without the need for MTEX, but I have to spend some time to properly label these and include the proper references, so this might take a while. Let's table these efforts for the time being.