2013-10-08 21:57:26 +05:30
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
!> @brief material subroutine incoprorating dislocation and twinning physics
!> @details to be done
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
module plastic_dislotwin
2013-11-27 13:34:05 +05:30
use prec , only : &
2013-10-08 21:57:26 +05:30
pReal , &
pInt
2018-05-03 14:38:51 +05:30
2013-10-08 21:57:26 +05:30
implicit none
private
2013-12-12 05:12:33 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , public , protected :: &
2015-12-16 11:45:21 +05:30
plastic_dislotwin_sizePostResults !< cumulative size of post results
2011-04-13 17:21:46 +05:30
2013-12-12 05:12:33 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable , target , public :: &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_sizePostResult !< size of each post result output
2012-01-11 22:26:35 +05:30
2013-12-12 05:12:33 +05:30
character ( len = 64 ) , dimension ( : , : ) , allocatable , target , public :: &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_output !< name of each post result output
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
real ( pReal ) , parameter , private :: &
2015-01-23 16:53:35 +05:30
kB = 1.38e-23_pReal !< Boltzmann constant in J/Kelvin
2013-10-08 21:57:26 +05:30
2014-09-26 15:55:26 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , target , public :: &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_Noutput !< number of outputs per instance of this plasticity
2013-10-08 21:57:26 +05:30
2018-05-02 23:00:27 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , private :: &
2018-05-03 14:38:51 +05:30
totalNslip , & !< total number of active slip systems for each instance
totalNtwin , & !< total number of active twin systems for each instance
totalNtrans !< number of active transformation systems
2013-10-08 21:57:26 +05:30
2018-05-08 19:56:49 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable , private :: &
Nslip , &
Ntwin , &
Ntrans
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
real ( pReal ) , dimension ( : , : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
Ctwin66 !< twin elasticity matrix in Mandel notation for each instance
2013-12-12 05:12:33 +05:30
real ( pReal ) , dimension ( : , : , : , : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
Ctwin3333 !< twin elasticity matrix for each instance
2014-09-10 17:42:17 +05:30
real ( pReal ) , dimension ( : , : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
Ctrans66 !< trans elasticity matrix in Mandel notation for each instance
2014-09-10 17:42:17 +05:30
real ( pReal ) , dimension ( : , : , : , : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
Ctrans3333 !< trans elasticity matrix for each instance
2013-12-12 05:12:33 +05:30
real ( pReal ) , dimension ( : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
tau_r_twin , & !< stress to bring partial close together for each twin system and instance
tau_r_trans , & !< stress to bring partial close together for each trans system and instance
interaction_SlipSlip , & !< coefficients for slip-slip interaction for each interaction type and instance
interaction_SlipTwin , & !< coefficients for slip-twin interaction for each interaction type and instance
interaction_TwinSlip , & !< coefficients for twin-slip interaction for each interaction type and instance
interaction_TwinTwin , & !< coefficients for twin-twin interaction for each interaction type and instance
interaction_SlipTrans , & !< coefficients for slip-trans interaction for each interaction type and instance
interaction_TransSlip , & !< coefficients for trans-slip interaction for each interaction type and instance
2018-06-27 14:23:23 +05:30
interaction_TransTrans !< coefficients for trans-trans interaction for each interaction type and instance
2013-12-12 05:12:33 +05:30
real ( pReal ) , dimension ( : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
interactionMatrix_SlipSlip , & !< interaction matrix of the different slip systems for each instance
interactionMatrix_SlipTwin , & !< interaction matrix of slip systems with twin systems for each instance
interactionMatrix_TwinSlip , & !< interaction matrix of twin systems with slip systems for each instance
interactionMatrix_TwinTwin , & !< interaction matrix of the different twin systems for each instance
interactionMatrix_SlipTrans , & !< interaction matrix of slip systems with trans systems for each instance
interactionMatrix_TransSlip , & !< interaction matrix of trans systems with slip systems for each instance
interactionMatrix_TransTrans , & !< interaction matrix of the different trans systems for each instance
forestProjectionEdge , & !< matrix of forest projections of edge dislocations for each instance
projectionMatrix_Trans !< matrix for projection of slip system shear on fault band (twin) systems for each instance
2014-09-24 18:01:16 +05:30
2013-12-12 05:12:33 +05:30
real ( pReal ) , dimension ( : , : , : , : , : ) , allocatable , private :: &
2018-05-02 23:00:27 +05:30
sbSv
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
enum , bind ( c )
enumerator :: undefined_ID , &
edge_density_ID , &
dipole_density_ID , &
shear_rate_slip_ID , &
accumulated_shear_slip_ID , &
mfp_slip_ID , &
resolved_stress_slip_ID , &
threshold_stress_slip_ID , &
edge_dipole_distance_ID , &
stress_exponent_ID , &
twin_fraction_ID , &
shear_rate_twin_ID , &
accumulated_shear_twin_ID , &
mfp_twin_ID , &
resolved_stress_twin_ID , &
threshold_stress_twin_ID , &
resolved_stress_shearband_ID , &
shear_rate_shearband_ID , &
sb_eigenvalues_ID , &
2014-09-24 12:56:27 +05:30
sb_eigenvectors_ID , &
stress_trans_fraction_ID , &
strain_trans_fraction_ID , &
trans_fraction_ID
2013-12-12 05:12:33 +05:30
end enum
2018-05-02 23:00:27 +05:30
type , private :: tParameters
2018-05-29 21:59:38 +05:30
integer ( kind ( undefined_ID ) ) , dimension ( : ) , allocatable , private :: &
outputID !< ID of each post result output
2018-05-02 23:00:27 +05:30
real ( pReal ) :: &
CAtomicVolume , & !< atomic volume in Bugers vector unit
2018-05-03 14:38:51 +05:30
D0 , & !< prefactor for self-diffusion coefficient
2018-05-03 17:13:19 +05:30
Qsd , & !< activation energy for dislocation climb
GrainSize , & !<grain size
pShearBand , & !< p-exponent in shear band velocity
qShearBand , & !< q-exponent in shear band velocity
MaxTwinFraction , & !<max allowed total twin volume fraction
CEdgeDipMinDistance , & !<
Cmfptwin , & !<
Cthresholdtwin , & !<
SolidSolutionStrength , & !<strength due to elements in solid solution
L0_twin , & !< Length of twin nuclei in Burgers vectors
L0_trans , & !< Length of trans nuclei in Burgers vectors
xc_twin , & !< critical distance for formation of twin nucleus
xc_trans , & !< critical distance for formation of trans nucleus
VcrossSlip , & !< cross slip volume
2018-05-03 20:55:56 +05:30
sbResistance , & !< value for shearband resistance (might become an internal state variable at some point)
2018-05-03 17:13:19 +05:30
sbVelocity , & !< value for shearband velocity_0
sbQedge , & !< value for shearband systems Qedge
SFE_0K , & !< stacking fault energy at zero K
dSFE_dT , & !< temperature dependance of stacking fault energy
2018-05-03 20:55:56 +05:30
dipoleFormationFactor = 1.0_pReal , & !< scaling factor for dipole formation: 0: off, 1: on. other values not useful
2018-05-03 17:13:19 +05:30
aTolRho , & !< absolute tolerance for integration of dislocation density
aTolTwinFrac , & !< absolute tolerance for integration of twin volume fraction
aTolTransFrac , & !< absolute tolerance for integration of trans volume fraction
deltaG , & !< Free energy difference between austensite and martensite
Cmfptrans , & !<
Cthresholdtrans , & !<
transStackHeight !< Stack height of hex nucleus
2018-05-03 20:55:56 +05:30
2018-06-25 23:37:35 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , private :: &
Nslip , & !< number of active slip systems for each family and instance
Ntwin , & !< number of active twin systems for each family and instance
Ntrans !< number of active transformation systems for each family and instance
real ( pReal ) , dimension ( : ) , allocatable , private :: &
rho0 , & !< initial unipolar dislocation density per slip system
rhoDip0 , & !< initial dipole dislocation density per slip system
burgers_slip , & !< absolute length of burgers vector [m] for each slip systems
burgers_twin , & !< absolute length of burgers vector [m] for each slip systems
2018-06-27 14:23:23 +05:30
burgers_trans , & !< absolute length of burgers vector [m] for each twin family and instance
QedgePerSlipSystem , & !< activation energy for glide [J] for each slip system and instance
v0PerSlipSystem , & !dislocation velocity prefactor [m/s] for each slip system and instance
tau_peierlsPerSlipFamily , & !< Peierls stress [Pa] for each family and instance
Ndot0PerTwinSystem , & !< twin nucleation rate [1/m³s] for each twin system and instance
Ndot0PerTransSystem , & !< trans nucleation rate [1/m³s] for each trans system and instance
twinsizePerTwinSystem , & !< twin thickness [m] for each twin system and instance
CLambdaSlipPerSlipSystem , & !< Adj. parameter for distance between 2 forest dislocations for each slip system and instance
lamellarsizePerTransSystem , & !< martensite lamellar thickness [m] for each trans system and instance
pPerSlipFamily , & !< p-exponent in glide velocity
qPerSlipFamily , & !< q-exponent in glide velocity
rPerTwinFamily , & !< r-exponent in twin nucleation rate
sPerTransFamily !< s-exponent in trans nucleation rate
2018-05-02 23:00:27 +05:30
end type
2018-06-25 23:37:35 +05:30
type ( tParameters ) , dimension ( : ) , allocatable , private , target :: param !< containers of constitutive parameters (len Ninstance)
2018-05-02 23:00:27 +05:30
2015-11-06 22:30:00 +05:30
type , private :: tDislotwinState
2018-05-02 23:00:27 +05:30
2015-11-06 22:30:00 +05:30
real ( pReal ) , pointer , dimension ( : , : ) :: &
2015-11-09 14:21:05 +05:30
rhoEdge , &
rhoEdgeDip , &
2015-11-06 22:30:00 +05:30
accshear_slip , &
2015-11-10 18:31:03 +05:30
twinFraction , &
2015-11-06 22:30:00 +05:30
accshear_twin , &
2015-11-10 18:31:03 +05:30
stressTransFraction , &
strainTransFraction , &
2015-11-06 22:30:00 +05:30
invLambdaSlip , &
invLambdaSlipTwin , &
invLambdaTwin , &
invLambdaSlipTrans , &
2015-11-10 20:53:15 +05:30
invLambdaTrans , &
2015-11-06 22:30:00 +05:30
mfp_slip , &
mfp_twin , &
2015-11-10 20:53:15 +05:30
mfp_trans , &
2015-11-06 22:30:00 +05:30
threshold_stress_slip , &
threshold_stress_twin , &
2015-11-10 20:53:15 +05:30
threshold_stress_trans , &
twinVolume , &
martensiteVolume
2015-11-06 22:30:00 +05:30
end type
type ( tDislotwinState ) , allocatable , dimension ( : ) , private :: &
state , &
state0 , &
dotState
2013-10-08 21:57:26 +05:30
public :: &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_init , &
plastic_dislotwin_homogenizedC , &
plastic_dislotwin_microstructure , &
plastic_dislotwin_LpAndItsTangent , &
plastic_dislotwin_dotState , &
plastic_dislotwin_postResults
2013-10-08 21:57:26 +05:30
contains
2011-04-13 17:21:46 +05:30
2013-03-28 13:10:30 +05:30
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief module initialization
!> @details reads in material parameters, allocates arrays, and does sanity checks
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
subroutine plastic_dislotwin_init ( fileUnit )
2018-02-02 17:06:09 +05:30
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
2017-10-05 20:05:34 +05:30
use , intrinsic :: iso_fortran_env , only : &
compiler_version , &
compiler_options
#endif
2016-05-27 15:16:34 +05:30
use prec , only : &
2016-10-29 13:09:08 +05:30
dEq0 , &
dNeq0 , &
2016-05-27 15:16:34 +05:30
dNeq
2013-10-08 21:57:26 +05:30
use debug , only : &
debug_level , &
2013-10-14 16:24:45 +05:30
debug_constitutive , &
debug_levelBasic
2013-10-08 21:57:26 +05:30
use math , only : &
math_Mandel3333to66 , &
math_Voigt66to3333 , &
2018-05-17 23:02:41 +05:30
math_mul3x3 , &
math_expand , &
pi
2013-10-08 21:57:26 +05:30
use mesh , only : &
mesh_maxNips , &
mesh_NcpElems
2013-12-19 14:19:47 +05:30
use IO , only : &
2014-02-10 20:01:19 +05:30
IO_read , &
IO_lc , &
IO_getTag , &
IO_isBlank , &
IO_stringPos , &
IO_stringValue , &
IO_floatValue , &
IO_intValue , &
IO_warning , &
IO_error , &
IO_timeStamp , &
IO_EOF
2013-12-19 14:19:47 +05:30
use material , only : &
homogenization_maxNgrains , &
phase_plasticity , &
phase_plasticityInstance , &
phase_Noutput , &
PLASTICITY_DISLOTWIN_label , &
PLASTICITY_DISLOTWIN_ID , &
2014-06-11 17:41:14 +05:30
material_phase , &
2018-06-10 21:31:52 +05:30
plasticState
2018-06-14 10:09:49 +05:30
use config , only : &
2018-06-25 23:37:35 +05:30
MATERIAL_partPhase , &
phaseConfig
2013-10-08 21:57:26 +05:30
use lattice
2014-06-11 17:41:14 +05:30
use numerics , only : &
numerics_integrator
2013-10-08 21:57:26 +05:30
implicit none
2013-12-12 05:12:33 +05:30
integer ( pInt ) , intent ( in ) :: fileUnit
2013-10-08 21:57:26 +05:30
2015-08-28 13:08:48 +05:30
integer ( pInt ) , allocatable , dimension ( : ) :: chunkPos
2014-09-10 17:42:17 +05:30
integer ( pInt ) :: maxNinstance , mySize = 0_pInt , phase , maxTotalNslip , maxTotalNtwin , maxTotalNtrans , &
2018-05-17 23:02:41 +05:30
f , instance , j , i , k , l , m , n , o , p , q , r , s , ns , nt , nr , &
2015-04-21 20:46:13 +05:30
Nchunks_SlipSlip = 0_pInt , Nchunks_SlipTwin = 0_pInt , &
Nchunks_TwinSlip = 0_pInt , Nchunks_TwinTwin = 0_pInt , &
2015-11-17 20:50:36 +05:30
Nchunks_SlipTrans = 0_pInt , Nchunks_TransSlip = 0_pInt , Nchunks_TransTrans = 0_pInt , &
2015-04-21 20:46:13 +05:30
Nchunks_SlipFamilies = 0_pInt , Nchunks_TwinFamilies = 0_pInt , Nchunks_TransFamilies = 0_pInt , &
2015-11-06 22:30:00 +05:30
offset_slip , index_myFamily , index_otherFamily , &
2018-06-25 23:37:35 +05:30
startIndex , endIndex , outputID , outputSize
2015-06-01 21:32:27 +05:30
integer ( pInt ) :: sizeState , sizeDotState , sizeDeltaState
2014-06-11 17:41:14 +05:30
integer ( pInt ) :: NofMyPhase
2018-05-17 23:02:41 +05:30
real ( pReal ) , allocatable , dimension ( : ) :: &
invLambdaSlip0 , &
MeanFreePathSlip0 , &
MeanFreePathTrans0 , &
MeanFreePathTwin0 , &
tauSlipThreshold0 , &
TwinVolume0 , &
MartensiteVolume0
2013-11-28 14:26:02 +05:30
character ( len = 65536 ) :: &
tag = '' , &
line = ''
2018-05-29 21:59:38 +05:30
2018-06-25 23:37:35 +05:30
character ( len = 65536 ) , dimension ( : ) , allocatable :: outputs
integer ( pInt ) , dimension ( 0 ) , parameter :: emptyInt = [ integer ( pInt ) :: ]
real ( pReal ) , dimension ( 0 ) , parameter :: emptyReal = [ real ( pReal ) :: ]
character ( len = 65536 ) , dimension ( 0 ) , parameter :: emptyString = [ character ( len = 65536 ) :: ]
2018-05-29 21:59:38 +05:30
2018-06-25 23:37:35 +05:30
type ( tParameters ) , pointer :: prm
2018-05-29 21:59:38 +05:30
2014-07-22 13:13:03 +05:30
real ( pReal ) , dimension ( : ) , allocatable :: tempPerSlip , tempPerTwin , tempPerTrans
2013-10-14 16:24:45 +05:30
2016-07-25 23:42:00 +05:30
write ( 6 , '(/,a)' ) ' <<<+- constitutive_' / / PLASTICITY_DISLOTWIN_label / / ' init -+>>>'
2018-04-17 19:21:59 +05:30
write ( 6 , '(/,a)' ) ' A. Ma and F. Roters, Acta Materialia, 52(12):3603– 3612, 2004'
write ( 6 , '(/,a)' ) ' https://doi.org/10.1016/j.actamat.2004.04.012'
2018-04-22 13:37:49 +05:30
write ( 6 , '(/,a)' ) ' F.Roters et al., Computational Materials Science, 39:91– 95, 2007'
2018-04-17 19:21:59 +05:30
write ( 6 , '(/,a)' ) ' https://doi.org/10.1016/j.commatsci.2006.04.014'
2018-04-22 13:37:49 +05:30
write ( 6 , '(/,a)' ) ' Wong et al., Acta Materialia, 118:140– 151, 2016'
2018-04-18 18:52:19 +05:30
write ( 6 , '(/,a)' ) ' https://doi.org/10.1016/j.actamat.2016.07.032'
2016-07-25 23:42:00 +05:30
write ( 6 , '(a15,a)' ) ' Current time: ' , IO_timeStamp ( )
2012-02-01 00:48:55 +05:30
#include "compilation_info.f90"
2013-10-08 21:57:26 +05:30
2013-11-27 13:34:05 +05:30
maxNinstance = int ( count ( phase_plasticity == PLASTICITY_DISLOTWIN_ID ) , pInt )
2013-10-08 21:57:26 +05:30
if ( maxNinstance == 0_pInt ) return
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) &
2014-03-09 02:20:31 +05:30
write ( 6 , '(a16,1x,i5,/)' ) '# instances:' , maxNinstance
2013-10-08 21:57:26 +05:30
2014-12-08 21:25:30 +05:30
allocate ( plastic_dislotwin_sizePostResults ( maxNinstance ) , source = 0_pInt )
allocate ( plastic_dislotwin_sizePostResult ( maxval ( phase_Noutput ) , maxNinstance ) , source = 0_pInt )
allocate ( plastic_dislotwin_output ( maxval ( phase_Noutput ) , maxNinstance ) )
plastic_dislotwin_output = ''
2018-05-29 21:59:38 +05:30
2014-12-08 21:25:30 +05:30
allocate ( plastic_dislotwin_Noutput ( maxNinstance ) , source = 0_pInt )
2018-05-02 23:00:27 +05:30
allocate ( param ( maxNinstance ) )
allocate ( totalNslip ( maxNinstance ) , source = 0_pInt )
allocate ( totalNtwin ( maxNinstance ) , source = 0_pInt )
allocate ( totalNtrans ( maxNinstance ) , source = 0_pInt )
2018-05-08 19:56:49 +05:30
allocate ( Nslip ( lattice_maxNslipFamily , maxNinstance ) , source = 0_pInt )
allocate ( Ntwin ( lattice_maxNtwinFamily , maxNinstance ) , source = 0_pInt )
allocate ( Ntrans ( lattice_maxNtransFamily , maxNinstance ) , source = 0_pInt )
2018-05-02 23:00:27 +05:30
allocate ( interaction_SlipSlip ( lattice_maxNinteraction , maxNinstance ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_SlipTwin ( lattice_maxNinteraction , maxNinstance ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_TwinSlip ( lattice_maxNinteraction , maxNinstance ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_TwinTwin ( lattice_maxNinteraction , maxNinstance ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_SlipTrans ( lattice_maxNinteraction , maxNinstance ) , &
2015-11-10 19:00:34 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_TransSlip ( lattice_maxNinteraction , maxNinstance ) , &
2015-11-10 19:00:34 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interaction_TransTrans ( lattice_maxNinteraction , maxNinstance ) , &
2015-11-10 19:00:34 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( sbSv ( 6 , 6 , homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-06-27 14:23:23 +05:30
2015-07-10 14:32:48 +05:30
2018-06-25 23:37:35 +05:30
do phase = 1_pInt , size ( phase_plasticityInstance )
if ( phase_plasticity ( phase ) == PLASTICITY_DISLOTWIN_ID ) then
instance = phase_plasticityInstance ( phase )
prm = > param ( instance )
prm % Nslip = phaseConfig ( phase ) % getInts ( 'nslip' , defaultVal = emptyInt )
!if (size > Nchunks_SlipFamilies + 1_pInt) call IO_error(150_pInt,ext_msg=extmsg)
if ( sum ( prm % Nslip ) > 0_pInt ) then
prm % rho0 = phaseConfig ( phase ) % getFloats ( 'rhoedge0' )
prm % rhoDip0 = phaseConfig ( phase ) % getFloats ( 'rhoedgedip0' )
prm % burgers_slip = phaseConfig ( phase ) % getFloats ( 'slipburgers' )
2018-06-27 14:23:23 +05:30
!prm%burgers_slip = math_expand(prm%burgers_slip,Nslip(:,instance))
prm % burgers_slip = math_expand ( prm % burgers_slip , prm % Nslip ( : ) )
prm % QedgePerSlipSystem = phaseConfig ( phase ) % getFloats ( 'qedge' )
!prm%QedgePerSlipSystem = math_expand(prm%QedgePerSlipSystem,Nslip(:,instance))
prm % QedgePerSlipSystem = math_expand ( prm % QedgePerSlipSystem , prm % Nslip ( : ) )
2018-06-25 23:37:35 +05:30
prm % aTolRho = phaseConfig ( phase ) % getFloat ( 'atol_rho' )
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem = phaseConfig ( phase ) % getFloats ( 'v0' )
prm % v0PerSlipSystem = math_expand ( prm % v0PerSlipSystem , Nslip ( : , instance ) )
prm % tau_peierlsPerSlipFamily = phaseConfig ( phase ) % getFloats ( 'tau_peierls' , defaultVal = [ 0.0_pReal ] )
2018-06-25 23:37:35 +05:30
prm % CEdgeDipMinDistance = phaseConfig ( phase ) % getFloat ( 'cedgedipmindistance' )
2018-06-27 14:23:23 +05:30
prm % CLambdaSlipPerSlipSystem = phaseConfig ( phase ) % getFloats ( 'clambdaslip' )
!prm%CLambdaSlipPerSlipSystem= math_expand(prm%CLambdaSlipPerSlipSystem,Nslip(:,instance))
prm % CLambdaSlipPerSlipSystem = math_expand ( prm % CLambdaSlipPerSlipSystem , prm % Nslip ( : ) )
write ( 6 , * ) Nslip ( : , instance )
write ( 6 , * ) ( prm % CLambdaSlipPerSlipSystem ( 1_pInt ) )
prm % pPerSlipFamily = phaseConfig ( phase ) % getFloats ( 'p_slip' )
prm % qPerSlipFamily = phaseConfig ( phase ) % getFloats ( 'q_slip' )
2018-06-25 23:37:35 +05:30
endif
prm % Ntwin = phaseConfig ( phase ) % getInts ( 'ntwin' , defaultVal = emptyInt )
!if (size > Nchunks_SlipFamilies + 1_pInt) call IO_error(150_pInt,ext_msg=extmsg)
if ( sum ( prm % Ntwin ) > 0_pInt ) then
2018-06-27 14:23:23 +05:30
prm % burgers_twin = phaseConfig ( phase ) % getFloats ( 'twinburgers' )
! prm%burgers_twin = math_expand(prm%burgers_twin,Ntwin(:,instance))
prm % burgers_twin = math_expand ( prm % burgers_twin , prm % Ntwin ( : ) )
2018-06-25 23:37:35 +05:30
prm % xc_twin = phaseConfig ( phase ) % getFloat ( 'xc_twin' )
prm % aTolTwinFrac = phaseConfig ( phase ) % getFloat ( 'atol_twinfrac' )
prm % L0_twin = phaseConfig ( phase ) % getFloat ( 'l0_twin' )
2018-06-27 14:23:23 +05:30
if ( lattice_structure ( phase ) / = LATTICE_fcc_ID ) then
prm % Ndot0PerTwinSystem = phaseConfig ( phase ) % getFloats ( 'ndot0_twin' )
prm % Ndot0PerTwinSystem = math_expand ( prm % Ndot0PerTwinSystem , prm % Ntwin ( : ) )
endif
! prm%Ndot0PerTwinSystem = math_expand(prm%Ndot0PerTwinSystem,Ntwin(:,instance))
prm % twinsizePerTwinSystem = phaseConfig ( phase ) % getFloats ( 'twinsize' )
prm % twinsizePerTwinSystem = math_expand ( prm % twinsizePerTwinSystem , prm % Ntwin ( : ) )
! prm%twinsizePerTwinSystem= math_expand(prm%twinsizePerTwinSystem,Ntwin(:,instance))
prm % rPerTwinFamily = phaseConfig ( phase ) % getFloats ( 'r_twin' )
2018-06-25 23:37:35 +05:30
endif
prm % Ntrans = phaseConfig ( phase ) % getInts ( 'ntrans' , defaultVal = emptyInt )
!if (size > Nchunks_SlipFamilies + 1_pInt) call IO_error(150_pInt,ext_msg=extmsg)
if ( sum ( prm % Ntrans ) > 0_pInt ) then
2018-06-27 14:23:23 +05:30
prm % burgers_trans = phaseConfig ( phase ) % getFloats ( 'transburgers' )
! prm%burgers_trans = math_expand(prm%burgers_trans,Ntrans(:,instance))
prm % burgers_trans = math_expand ( prm % burgers_trans , prm % Ntrans ( : ) )
2018-06-25 23:37:35 +05:30
prm % Cthresholdtrans = phaseConfig ( phase ) % getFloat ( 'cthresholdtrans' , defaultVal = 0.0_pReal ) ! ToDo: How to handle that???
prm % transStackHeight = phaseConfig ( phase ) % getFloat ( 'transstackheight' , defaultVal = 0.0_pReal ) ! ToDo: How to handle that???
prm % Cmfptrans = phaseConfig ( phase ) % getFloat ( 'cmfptrans' , defaultVal = 0.0_pReal ) ! ToDo: How to handle that???
prm % deltaG = phaseConfig ( phase ) % getFloat ( 'deltag' )
prm % xc_trans = phaseConfig ( phase ) % getFloat ( 'xc_trans' , defaultVal = 0.0_pReal ) ! ToDo: How to handle that???
prm % L0_trans = phaseConfig ( phase ) % getFloat ( 'l0_trans' )
prm % aTolTransFrac = phaseConfig ( phase ) % getFloat ( 'atol_transfrac' )
2018-06-27 14:23:23 +05:30
if ( lattice_structure ( phase ) / = LATTICE_fcc_ID ) then
prm % Ndot0PerTransSystem = phaseConfig ( phase ) % getFloats ( 'ndot0_trans' )
! prm%Ndot0PerTransSystem = math_expand(prm%Ndot0PerTransSystem,Ntrans(:,instance))
prm % Ndot0PerTransSystem = math_expand ( prm % Ndot0PerTransSystem , prm % Ntrans ( : ) )
endif
prm % lamellarsizePerTransSystem = phaseConfig ( phase ) % getFloats ( 'lamellarsize' )
! prm%lamellarsizePerTransSystem = math_expand(prm%lamellarsizePerTransSystem,Ntrans(:,instance))
prm % lamellarsizePerTransSystem = math_expand ( prm % lamellarsizePerTransSystem , prm % Ntrans ( : ) )
prm % sPerTransFamily = phaseConfig ( phase ) % getFloats ( 's_trans' , defaultVal = [ 0.0_pReal ] )
2018-06-25 23:37:35 +05:30
endif
if ( sum ( prm % Ntwin ) > 0_pInt . or . sum ( prm % Ntrans ) > 0_pInt ) then
prm % SFE_0K = phaseConfig ( phase ) % getFloat ( 'sfe_0k' )
prm % dSFE_dT = phaseConfig ( phase ) % getFloat ( 'dsfe_dt' )
prm % VcrossSlip = phaseConfig ( phase ) % getFloat ( 'vcrossslip' )
endif
prm % sbResistance = phaseConfig ( phase ) % getFloat ( 'shearbandresistance' , defaultVal = 0.0_pReal )
prm % sbVelocity = phaseConfig ( phase ) % getFloat ( 'shearbandvelocity' , defaultVal = 0.0_pReal )
prm % CAtomicVolume = phaseConfig ( phase ) % getFloat ( 'catomicvolume' )
prm % GrainSize = phaseConfig ( phase ) % getFloat ( 'grainsize' )
prm % MaxTwinFraction = phaseConfig ( phase ) % getFloat ( 'maxtwinfraction' ) ! ToDo: only used in postResults
prm % pShearBand = phaseConfig ( phase ) % getFloat ( 'p_shearband' )
prm % qShearBand = phaseConfig ( phase ) % getFloat ( 'q_shearband' )
prm % D0 = phaseConfig ( phase ) % getFloat ( 'd0' )
prm % Qsd = phaseConfig ( phase ) % getFloat ( 'qsd' )
prm % SolidSolutionStrength = phaseConfig ( phase ) % getFloat ( 'solidsolutionstrength' )
prm % dipoleFormationFactor = phaseConfig ( phase ) % getFloat ( 'dipoleformationfactor' , defaultVal = 0.0_pReal ) ! ToDo: How to handle that???
prm % sbQedge = phaseConfig ( phase ) % getFloat ( 'qedgepersbsystem' )
2018-06-27 14:23:23 +05:30
2018-06-25 23:37:35 +05:30
outputs = phaseConfig ( phase ) % getStrings ( '(output)' , defaultVal = emptyString )
allocate ( prm % outputID ( 0 ) )
do i = 1_pInt , size ( outputs )
outputID = undefined_ID
select case ( outputs ( i ) )
case ( 'edge_density' )
outputID = edge_density_ID
outputSize = sum ( prm % Nslip )
case ( 'dipole_density' )
outputID = dipole_density_ID
outputSize = sum ( prm % Nslip )
case ( 'shear_rate_slip' , 'shearrate_slip' )
outputID = shear_rate_slip_ID
outputSize = sum ( prm % Nslip )
case ( 'accumulated_shear_slip' )
outputID = accumulated_shear_slip_ID
outputSize = sum ( prm % Nslip )
case ( 'mfp_slip' )
outputID = mfp_slip_ID
outputSize = sum ( prm % Nslip )
case ( 'resolved_stress_slip' )
outputID = resolved_stress_slip_ID
outputSize = sum ( prm % Nslip )
case ( 'threshold_stress_slip' )
outputID = threshold_stress_slip_ID
outputSize = sum ( prm % Nslip )
case ( 'edge_dipole_distance' )
outputID = edge_dipole_distance_ID
outputSize = sum ( prm % Nslip )
case ( 'stress_exponent' )
outputID = stress_exponent_ID
outputSize = sum ( prm % Nslip )
case ( 'twin_fraction' )
outputID = twin_fraction_ID
outputSize = sum ( prm % Ntwin )
case ( 'shear_rate_twin' , 'shearrate_twin' )
outputID = shear_rate_twin_ID
outputSize = sum ( prm % Ntwin )
case ( 'accumulated_shear_twin' )
outputID = accumulated_shear_twin_ID
outputSize = sum ( prm % Ntwin )
case ( 'mfp_twin' )
outputID = mfp_twin_ID
outputSize = sum ( prm % Ntwin )
case ( 'resolved_stress_twin' )
outputID = resolved_stress_twin_ID
outputSize = sum ( prm % Ntwin )
case ( 'threshold_stress_twin' )
outputID = threshold_stress_twin_ID
outputSize = sum ( prm % Ntwin )
case ( 'resolved_stress_shearband' )
outputID = resolved_stress_shearband_ID
outputSize = 6_pInt
case ( 'shear_rate_shearband' , 'shearrate_shearband' )
outputID = shear_rate_shearband_ID
outputSize = 6_pInt
case ( 'sb_eigenvalues' )
outputID = sb_eigenvalues_ID
outputSize = 3_pInt
case ( 'sb_eigenvectors' )
outputID = sb_eigenvectors_ID
outputSize = 3_pInt
case ( 'stress_trans_fraction' )
outputID = stress_trans_fraction_ID
outputSize = sum ( prm % Ntrans )
case ( 'strain_trans_fraction' )
outputID = strain_trans_fraction_ID
outputSize = sum ( prm % Ntrans )
case ( 'trans_fraction' , 'total_trans_fraction' )
outputID = trans_fraction_ID
outputSize = sum ( prm % Ntrans )
end select
if ( outputID / = undefined_ID ) then
plastic_dislotwin_output ( i , instance ) = outputs ( i )
plastic_dislotwin_sizePostResult ( i , instance ) = outputSize
prm % outputID = [ prm % outputID , outputID ]
endif
enddo
endif
enddo
2013-11-27 13:34:05 +05:30
2013-12-12 05:12:33 +05:30
rewind ( fileUnit )
2014-03-09 02:20:31 +05:30
phase = 0_pInt
do while ( trim ( line ) / = IO_EOF . and . IO_lc ( IO_getTag ( line , '<' , '>' ) ) / = MATERIAL_partPhase ) ! wind forward to <phase>
2013-12-12 05:12:33 +05:30
line = IO_read ( fileUnit )
2013-10-08 21:57:26 +05:30
enddo
2014-03-09 02:20:31 +05:30
parsingFile : do while ( trim ( line ) / = IO_EOF ) ! read through sections of phase part
2013-12-12 05:12:33 +05:30
line = IO_read ( fileUnit )
2014-03-09 02:20:31 +05:30
if ( IO_isBlank ( line ) ) cycle ! skip empty lines
if ( IO_getTag ( line , '<' , '>' ) / = '' ) then ! stop at next part
line = IO_read ( fileUnit , . true . ) ! reset IO_read
2013-12-12 05:12:33 +05:30
exit
2014-03-09 02:20:31 +05:30
endif
if ( IO_getTag ( line , '[' , ']' ) / = '' ) then ! next phase section
phase = phase + 1_pInt ! advance phase section counter
if ( phase_plasticity ( phase ) == PLASTICITY_DISLOTWIN_ID ) then
2018-05-29 21:59:38 +05:30
instance = phase_plasticityInstance ( phase )
2015-11-10 19:00:34 +05:30
Nchunks_SlipFamilies = count ( lattice_NslipSystem ( : , phase ) > 0_pInt )
Nchunks_TwinFamilies = count ( lattice_NtwinSystem ( : , phase ) > 0_pInt )
Nchunks_TransFamilies = count ( lattice_NtransSystem ( : , phase ) > 0_pInt )
Nchunks_SlipSlip = maxval ( lattice_interactionSlipSlip ( : , : , phase ) )
Nchunks_SlipTwin = maxval ( lattice_interactionSlipTwin ( : , : , phase ) )
Nchunks_TwinSlip = maxval ( lattice_interactionTwinSlip ( : , : , phase ) )
Nchunks_TwinTwin = maxval ( lattice_interactionTwinTwin ( : , : , phase ) )
Nchunks_SlipTrans = maxval ( lattice_interactionSlipTrans ( : , : , phase ) )
Nchunks_TransSlip = maxval ( lattice_interactionTransSlip ( : , : , phase ) )
Nchunks_TransTrans = maxval ( lattice_interactionTransTrans ( : , : , phase ) )
2014-03-12 05:25:40 +05:30
if ( allocated ( tempPerSlip ) ) deallocate ( tempPerSlip )
if ( allocated ( tempPerTwin ) ) deallocate ( tempPerTwin )
2014-07-22 13:13:03 +05:30
if ( allocated ( tempPerTrans ) ) deallocate ( tempPerTrans )
2014-03-12 05:25:40 +05:30
allocate ( tempPerSlip ( Nchunks_SlipFamilies ) )
allocate ( tempPerTwin ( Nchunks_TwinFamilies ) )
2014-07-22 13:13:03 +05:30
allocate ( tempPerTrans ( Nchunks_TransFamilies ) )
2013-10-14 16:24:45 +05:30
endif
2014-03-09 02:20:31 +05:30
cycle ! skip to next line
2013-10-08 21:57:26 +05:30
endif
2014-07-02 17:57:39 +05:30
2014-03-09 02:20:31 +05:30
if ( phase > 0_pInt ) then ; if ( phase_plasticity ( phase ) == PLASTICITY_DISLOTWIN_ID ) then ! do not short-circuit here (.and. with next if statemen). It's not safe in Fortran
instance = phase_plasticityInstance ( phase ) ! which instance of my plasticity is present phase
2015-08-28 13:08:48 +05:30
chunkPos = IO_stringPos ( line )
tag = IO_lc ( IO_stringValue ( line , chunkPos , 1_pInt ) ) ! extract key
2014-03-09 02:20:31 +05:30
select case ( tag )
2018-06-25 23:37:35 +05:30
2018-05-29 21:59:38 +05:30
2014-03-12 05:25:40 +05:30
!--------------------------------------------------------------------------------------------------
2014-04-04 20:10:30 +05:30
! parameters depending on number of slip system families
2014-03-09 02:20:31 +05:30
case ( 'nslip' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_SlipFamilies + 1_pInt ) &
2014-03-09 02:20:31 +05:30
call IO_warning ( 50_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_SlipFamilies + 1_pInt ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_SlipFamilies = chunkPos ( 1 ) - 1_pInt
2014-03-09 02:20:31 +05:30
do j = 1_pInt , Nchunks_SlipFamilies
2018-05-03 20:55:56 +05:30
2018-05-08 19:56:49 +05:30
Nslip ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-03-09 02:20:31 +05:30
enddo
2018-06-27 14:23:23 +05:30
2014-03-12 05:25:40 +05:30
!--------------------------------------------------------------------------------------------------
! parameters depending on slip number of twin families
case ( 'ntwin' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_TwinFamilies + 1_pInt ) &
2014-06-17 20:54:44 +05:30
call IO_warning ( 51_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_TwinFamilies + 1_pInt ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_TwinFamilies = chunkPos ( 1 ) - 1_pInt
2014-03-09 02:20:31 +05:30
do j = 1_pInt , Nchunks_TwinFamilies
2018-05-08 19:56:49 +05:30
Ntwin ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-03-09 02:20:31 +05:30
enddo
2018-06-27 14:23:23 +05:30
2014-04-04 20:10:30 +05:30
!--------------------------------------------------------------------------------------------------
2014-07-22 13:13:03 +05:30
! parameters depending on number of transformation system families
case ( 'ntrans' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_TransFamilies + 1_pInt ) &
2014-07-22 13:13:03 +05:30
call IO_warning ( 53_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_TransFamilies + 1_pInt ) &
2014-07-22 13:13:03 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_TransFamilies = chunkPos ( 1 ) - 1_pInt
2014-07-22 13:13:03 +05:30
do j = 1_pInt , Nchunks_TransFamilies
2018-05-08 19:56:49 +05:30
Ntrans ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-07-22 13:13:03 +05:30
enddo
!--------------------------------------------------------------------------------------------------
2014-04-04 20:10:30 +05:30
! parameters depending on number of interactions
case ( 'interaction_slipslip' , 'interactionslipslip' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipSlip ) &
2014-04-04 20:10:30 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_SlipSlip
2018-05-02 23:00:27 +05:30
interaction_SlipSlip ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-04 20:10:30 +05:30
enddo
case ( 'interaction_sliptwin' , 'interactionsliptwin' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipTwin ) &
2014-04-04 20:10:30 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_SlipTwin
2018-05-02 23:00:27 +05:30
interaction_SlipTwin ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-04 20:10:30 +05:30
enddo
case ( 'interaction_twinslip' , 'interactiontwinslip' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinSlip ) &
2014-04-04 20:10:30 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_TwinSlip
2018-05-02 23:00:27 +05:30
interaction_TwinSlip ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-04 20:10:30 +05:30
enddo
case ( 'interaction_twintwin' , 'interactiontwintwin' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinTwin ) &
2014-04-04 20:10:30 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_TwinTwin
2018-05-02 23:00:27 +05:30
interaction_TwinTwin ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-04 20:10:30 +05:30
enddo
2015-11-10 19:00:34 +05:30
case ( 'interaction_sliptrans' , 'interactionsliptrans' )
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipTrans ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_SlipTrans
2018-05-02 23:00:27 +05:30
interaction_SlipTrans ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2015-11-10 19:00:34 +05:30
enddo
case ( 'interaction_transslip' , 'interactiontransslip' )
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TransSlip ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_TransSlip
2018-05-02 23:00:27 +05:30
interaction_TransSlip ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2015-11-10 19:00:34 +05:30
enddo
case ( 'interaction_transtrans' , 'interactiontranstrans' )
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TransTrans ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_DISLOTWIN_label / / ')' )
do j = 1_pInt , Nchunks_TransTrans
2018-05-02 23:00:27 +05:30
interaction_TransTrans ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2015-11-10 19:00:34 +05:30
enddo
2018-06-25 23:37:35 +05:30
2014-03-09 02:20:31 +05:30
end select
endif ; endif
enddo parsingFile
sanityChecks : do phase = 1_pInt , size ( phase_plasticity )
myPhase : if ( phase_plasticity ( phase ) == PLASTICITY_dislotwin_ID ) then
instance = phase_plasticityInstance ( phase )
2018-05-03 20:55:56 +05:30
2018-05-08 19:56:49 +05:30
if ( sum ( Nslip ( : , instance ) ) < 0_pInt ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'Nslip (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-08 19:56:49 +05:30
if ( sum ( Ntwin ( : , instance ) ) < 0_pInt ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'Ntwin (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-08 19:56:49 +05:30
if ( sum ( Ntrans ( : , instance ) ) < 0_pInt ) &
2014-10-23 19:21:18 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'Ntrans (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2014-03-09 02:20:31 +05:30
do f = 1_pInt , lattice_maxNslipFamily
2018-05-08 19:56:49 +05:30
if ( Nslip ( f , instance ) > 0_pInt ) then
2018-06-25 23:37:35 +05:30
! if (rhoEdge0(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='rhoEdge0 ('//PLASTICITY_DISLOTWIN_label//')')
! if (rhoEdgeDip0(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='rhoEdgeDip0 ('//PLASTICITY_DISLOTWIN_label//')')
! if (burgersPerSlipFamily(f,instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='slipBurgers ('//PLASTICITY_DISLOTWIN_label//')')
2018-06-27 14:23:23 +05:30
!if (v0PerSlipFamily(f,instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='v0 ('//PLASTICITY_DISLOTWIN_label//')')
!if (prm%tau_peierlsPerSlipFamily(f) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='tau_peierls ('//PLASTICITY_DISLOTWIN_label//')')
2014-03-09 02:20:31 +05:30
endif
enddo
do f = 1_pInt , lattice_maxNtwinFamily
2018-05-08 19:56:49 +05:30
if ( Ntwin ( f , instance ) > 0_pInt ) then
2018-06-25 23:37:35 +05:30
! if (burgersPerTwinFamily(f,instance) <= 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='twinburgers ('//PLASTICITY_DISLOTWIN_label//')')
2018-06-27 14:23:23 +05:30
!if (Ndot0PerTwinFamily(f,instance) < 0.0_pReal) &
! call IO_error(211_pInt,el=instance,ext_msg='ndot0_twin ('//PLASTICITY_DISLOTWIN_label//')')
2014-03-09 02:20:31 +05:30
endif
enddo
2018-05-02 23:00:27 +05:30
if ( param ( instance ) % CAtomicVolume < = 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'cAtomicVolume (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-02 23:00:27 +05:30
if ( param ( instance ) % D0 < = 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'D0 (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-02 23:00:27 +05:30
if ( param ( instance ) % Qsd < = 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'Qsd (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-08 19:56:49 +05:30
if ( sum ( Ntwin ( : , instance ) ) > 0_pInt ) then
2018-05-03 17:13:19 +05:30
if ( dEq0 ( param ( instance ) % SFE_0K ) . and . &
dEq0 ( param ( instance ) % dSFE_dT ) . and . &
2015-04-11 13:55:23 +05:30
lattice_structure ( phase ) == LATTICE_fcc_ID ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'SFE0K (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % aTolRho < = 0.0_pReal ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolRho (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % aTolTwinFrac < = 0.0_pReal ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolTwinFrac (' / / PLASTICITY_DISLOTWIN_label / / ')' )
endif
2018-05-08 19:56:49 +05:30
if ( sum ( Ntrans ( : , instance ) ) > 0_pInt ) then
2018-05-03 17:13:19 +05:30
if ( dEq0 ( param ( instance ) % SFE_0K ) . and . &
dEq0 ( param ( instance ) % dSFE_dT ) . and . &
2015-07-08 21:07:16 +05:30
lattice_structure ( phase ) == LATTICE_fcc_ID ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'SFE0K (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % aTolTransFrac < = 0.0_pReal ) &
2014-10-23 19:21:18 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolTransFrac (' / / PLASTICITY_DISLOTWIN_label / / ')' )
endif
2018-05-03 20:55:56 +05:30
if ( param ( instance ) % sbResistance < 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'sbResistance (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % sbVelocity < 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'sbVelocity (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % sbVelocity > 0.0_pReal . and . &
param ( instance ) % pShearBand < = 0.0_pReal ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'pShearBand (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 20:55:56 +05:30
if ( dNeq0 ( param ( instance ) % dipoleFormationFactor ) . and . &
dNeq ( param ( instance ) % dipoleFormationFactor , 1.0_pReal ) ) &
2014-03-14 05:20:55 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'dipoleFormationFactor (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2018-05-03 17:13:19 +05:30
if ( param ( instance ) % sbVelocity > 0.0_pReal . and . &
param ( instance ) % qShearBand < = 0.0_pReal ) &
2014-03-12 05:25:40 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'qShearBand (' / / PLASTICITY_DISLOTWIN_label / / ')' )
2014-03-09 02:20:31 +05:30
!--------------------------------------------------------------------------------------------------
! Determine total number of active slip or twin systems
2018-05-08 19:56:49 +05:30
Nslip ( : , instance ) = min ( lattice_NslipSystem ( : , phase ) , Nslip ( : , instance ) )
Ntwin ( : , instance ) = min ( lattice_NtwinSystem ( : , phase ) , Ntwin ( : , instance ) )
Ntrans ( : , instance ) = min ( lattice_NtransSystem ( : , phase ) , Ntrans ( : , instance ) )
totalNslip ( instance ) = sum ( Nslip ( : , instance ) )
totalNtwin ( instance ) = sum ( Ntwin ( : , instance ) )
totalNtrans ( instance ) = sum ( Ntrans ( : , instance ) )
2014-03-09 02:20:31 +05:30
endif myPhase
enddo sanityChecks
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
! allocation of variables whose size depends on the total number of active slip systems
2018-05-02 23:00:27 +05:30
maxTotalNslip = maxval ( totalNslip )
maxTotalNtwin = maxval ( totalNtwin )
maxTotalNtrans = maxval ( totalNtrans )
allocate ( tau_r_twin ( maxTotalNtwin , maxNinstance ) , source = 0.0_pReal )
allocate ( tau_r_trans ( maxTotalNtrans , maxNinstance ) , source = 0.0_pReal )
allocate ( interactionMatrix_SlipSlip ( maxval ( totalNslip ) , & ! slip resistance from slip activity
maxval ( totalNslip ) , &
2014-03-12 05:25:40 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_SlipTwin ( maxval ( totalNslip ) , & ! slip resistance from twin activity
maxval ( totalNtwin ) , &
2014-03-12 05:25:40 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_TwinSlip ( maxval ( totalNtwin ) , & ! twin resistance from slip activity
maxval ( totalNslip ) , &
2014-03-12 05:25:40 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_TwinTwin ( maxval ( totalNtwin ) , & ! twin resistance from twin activity
maxval ( totalNtwin ) , &
2014-03-12 05:25:40 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_SlipTrans ( maxval ( totalNslip ) , & ! slip resistance from trans activity
maxval ( totalNtrans ) , &
2015-11-10 19:00:34 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_TransSlip ( maxval ( totalNtrans ) , & ! trans resistance from slip activity
maxval ( totalNslip ) , &
2015-11-10 19:00:34 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( interactionMatrix_TransTrans ( maxval ( totalNtrans ) , & ! trans resistance from trans activity
maxval ( totalNtrans ) , &
2015-11-10 19:00:34 +05:30
maxNinstance ) , source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( forestProjectionEdge ( maxTotalNslip , maxTotalNslip , maxNinstance ) , &
2013-12-12 05:12:33 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( projectionMatrix_Trans ( maxTotalNtrans , maxTotalNslip , maxNinstance ) , &
2014-09-24 18:01:16 +05:30
source = 0.0_pReal )
2018-05-02 23:00:27 +05:30
allocate ( Ctwin66 ( 6 , 6 , maxTotalNtwin , maxNinstance ) , source = 0.0_pReal )
allocate ( Ctwin3333 ( 3 , 3 , 3 , 3 , maxTotalNtwin , maxNinstance ) , source = 0.0_pReal )
allocate ( Ctrans66 ( 6 , 6 , maxTotalNtrans , maxNinstance ) , source = 0.0_pReal )
allocate ( Ctrans3333 ( 3 , 3 , 3 , 3 , maxTotalNtrans , maxNinstance ) , source = 0.0_pReal )
2015-11-06 22:30:00 +05:30
allocate ( state ( maxNinstance ) )
allocate ( state0 ( maxNinstance ) )
allocate ( dotState ( maxNinstance ) )
2014-03-12 05:25:40 +05:30
2014-03-09 02:20:31 +05:30
initializeInstances : do phase = 1_pInt , size ( phase_plasticity )
2014-07-02 17:57:39 +05:30
myPhase2 : if ( phase_plasticity ( phase ) == PLASTICITY_dislotwin_ID ) then
2014-06-11 17:41:14 +05:30
NofMyPhase = count ( material_phase == phase )
2014-03-09 02:20:31 +05:30
instance = phase_plasticityInstance ( phase )
2013-12-12 05:12:33 +05:30
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2014-03-09 02:20:31 +05:30
!--------------------------------------------------------------------------------------------------
! Determine size of postResults array
2014-12-08 21:25:30 +05:30
outputsLoop : do o = 1_pInt , plastic_dislotwin_Noutput ( instance )
2018-05-29 21:59:38 +05:30
select case ( param ( instance ) % outputID ( o ) )
2013-12-12 05:12:33 +05:30
case ( edge_density_ID , &
dipole_density_ID , &
shear_rate_slip_ID , &
accumulated_shear_slip_ID , &
mfp_slip_ID , &
resolved_stress_slip_ID , &
threshold_stress_slip_ID , &
edge_dipole_distance_ID , &
stress_exponent_ID &
2013-10-14 16:24:45 +05:30
)
2014-03-09 02:20:31 +05:30
mySize = ns
2013-12-12 05:12:33 +05:30
case ( twin_fraction_ID , &
shear_rate_twin_ID , &
accumulated_shear_twin_ID , &
mfp_twin_ID , &
resolved_stress_twin_ID , &
threshold_stress_twin_ID &
2013-10-14 16:24:45 +05:30
)
2014-03-09 02:20:31 +05:30
mySize = nt
2013-12-12 05:12:33 +05:30
case ( resolved_stress_shearband_ID , &
shear_rate_shearband_ID &
2013-10-14 16:24:45 +05:30
)
2014-03-09 02:20:31 +05:30
mySize = 6_pInt
2013-12-12 05:12:33 +05:30
case ( sb_eigenvalues_ID )
2014-03-09 02:20:31 +05:30
mySize = 3_pInt
2013-12-12 05:12:33 +05:30
case ( sb_eigenvectors_ID )
2014-03-09 02:20:31 +05:30
mySize = 9_pInt
2014-09-24 12:56:27 +05:30
case ( stress_trans_fraction_ID , &
strain_trans_fraction_ID , &
trans_fraction_ID &
)
mySize = nr
2013-10-14 16:24:45 +05:30
end select
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
if ( mySize > 0_pInt ) then ! any meaningful output found
2014-12-08 21:25:30 +05:30
plastic_dislotwin_sizePostResult ( o , instance ) = mySize
plastic_dislotwin_sizePostResults ( instance ) = plastic_dislotwin_sizePostResults ( instance ) + mySize
2014-03-09 02:20:31 +05:30
endif
enddo outputsLoop
2014-07-02 17:57:39 +05:30
!--------------------------------------------------------------------------------------------------
! allocate state arrays
2015-12-16 11:45:21 +05:30
2018-06-25 23:37:35 +05:30
sizeDotState = int ( size ( [ 'rho ' , 'rhoDip ' , 'accshearslip' ] ) , pInt ) * ns &
2015-12-16 11:45:21 +05:30
+ int ( size ( [ 'twinFraction' , 'accsheartwin' ] ) , pInt ) * nt &
+ int ( size ( [ 'stressTransFraction' , 'strainTransFraction' ] ) , pInt ) * nr
sizeDeltaState = 0_pInt
sizeState = sizeDotState &
+ int ( size ( [ 'invLambdaSlip ' , 'invLambdaSlipTwin ' , 'invLambdaSlipTrans' , &
'meanFreePathSlip ' , 'tauSlipThreshold ' ] ) , pInt ) * ns &
+ int ( size ( [ 'invLambdaTwin ' , 'meanFreePathTwin' , 'tauTwinThreshold' , &
'twinVolume ' ] ) , pInt ) * nt &
+ int ( size ( [ 'invLambdaTrans ' , 'meanFreePathTrans' , 'tauTransThreshold' , &
'martensiteVolume ' ] ) , pInt ) * nr
2014-06-11 17:41:14 +05:30
plasticState ( phase ) % sizeState = sizeState
plasticState ( phase ) % sizeDotState = sizeDotState
2015-06-01 21:32:27 +05:30
plasticState ( phase ) % sizeDeltaState = sizeDeltaState
2014-12-08 21:25:30 +05:30
plasticState ( phase ) % sizePostResults = plastic_dislotwin_sizePostResults ( instance )
2018-05-02 23:00:27 +05:30
plasticState ( phase ) % nSlip = totalNslip ( instance )
plasticState ( phase ) % nTwin = totalNtwin ( instance )
plasticState ( phase ) % nTrans = totalNtrans ( instance )
2014-06-11 17:41:14 +05:30
allocate ( plasticState ( phase ) % aTolState ( sizeState ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % state0 ( sizeState , NofMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % partionedState0 ( sizeState , NofMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % subState0 ( sizeState , NofMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % state ( sizeState , NofMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % dotState ( sizeDotState , NofMyPhase ) , source = 0.0_pReal )
2015-06-01 21:32:27 +05:30
allocate ( plasticState ( phase ) % deltaState ( sizeDeltaState , NofMyPhase ) , source = 0.0_pReal )
2014-06-11 17:41:14 +05:30
if ( any ( numerics_integrator == 1_pInt ) ) then
allocate ( plasticState ( phase ) % previousDotState ( sizeDotState , NofMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % previousDotState2 ( sizeDotState , NofMyPhase ) , source = 0.0_pReal )
endif
if ( any ( numerics_integrator == 4_pInt ) ) &
allocate ( plasticState ( phase ) % RK4dotState ( sizeDotState , NofMyPhase ) , source = 0.0_pReal )
if ( any ( numerics_integrator == 5_pInt ) ) &
allocate ( plasticState ( phase ) % RKCK45dotState ( 6 , sizeDotState , NofMyPhase ) , source = 0.0_pReal )
2015-01-05 00:56:33 +05:30
offset_slip = 2_pInt * plasticState ( phase ) % nslip
plasticState ( phase ) % slipRate = > &
plasticState ( phase ) % dotState ( offset_slip + 1 : offset_slip + plasticState ( phase ) % nslip , 1 : NofMyPhase )
plasticState ( phase ) % accumulatedSlip = > &
plasticState ( phase ) % state ( offset_slip + 1 : offset_slip + plasticState ( phase ) % nslip , 1 : NofMyPhase )
2015-11-10 19:00:34 +05:30
2018-06-25 23:37:35 +05:30
2018-06-27 14:23:23 +05:30
2014-06-11 17:41:14 +05:30
!* Process slip related parameters ------------------------------------------------
2014-03-09 02:20:31 +05:30
slipFamiliesLoop : do f = 1_pInt , lattice_maxNslipFamily
2018-05-08 19:56:49 +05:30
index_myFamily = sum ( Nslip ( 1 : f - 1_pInt , instance ) ) ! index in truncated slip system list
slipSystemsLoop : do j = 1_pInt , Nslip ( f , instance )
2013-12-12 05:12:33 +05:30
2015-11-10 19:00:34 +05:30
!* Burgers vector,
! dislocation velocity prefactor,
! mean free path prefactor,
! and minimum dipole distance
2014-03-09 02:20:31 +05:30
!* Calculation of forest projections for edge dislocations
!* Interaction matrices
do o = 1_pInt , lattice_maxNslipFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
2018-05-02 23:00:27 +05:30
forestProjectionEdge ( index_myFamily + j , index_otherFamily + k , instance ) = &
2014-03-09 02:20:31 +05:30
abs ( math_mul3x3 ( lattice_sn ( : , sum ( lattice_NslipSystem ( 1 : f - 1 , phase ) ) + j , phase ) , &
lattice_st ( : , sum ( lattice_NslipSystem ( 1 : o - 1 , phase ) ) + k , phase ) ) )
2018-05-02 23:00:27 +05:30
interactionMatrix_SlipSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_SlipSlip ( lattice_interactionSlipSlip ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NslipSystem ( 1 : f - 1 , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1 , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
2018-05-02 23:00:27 +05:30
interactionMatrix_SlipTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_SlipTwin ( lattice_interactionSlipTwin ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NslipSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
2015-11-10 19:00:34 +05:30
do o = 1_pInt , lattice_maxNtransFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Ntrans ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Ntrans ( o , instance ) ! loop over (active) systems in other family (trans)
2018-05-02 23:00:27 +05:30
interactionMatrix_SlipTrans ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_SlipTrans ( lattice_interactionSlipTrans ( &
2015-11-10 19:00:34 +05:30
sum ( lattice_NslipSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtransSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
2014-03-09 02:20:31 +05:30
enddo slipSystemsLoop
enddo slipFamiliesLoop
2013-10-14 16:24:45 +05:30
!* Process twin related parameters ------------------------------------------------
2014-03-09 02:20:31 +05:30
twinFamiliesLoop : do f = 1_pInt , lattice_maxNtwinFamily
2018-05-08 19:56:49 +05:30
index_myFamily = sum ( Ntwin ( 1 : f - 1_pInt , instance ) ) ! index in truncated twin system list
twinSystemsLoop : do j = 1_pInt , Ntwin ( f , instance )
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
! nucleation rate prefactor,
! and twin size
!* Rotate twin elasticity matrices
index_otherFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) ! index in full lattice twin list
2014-03-12 05:25:40 +05:30
do l = 1_pInt , 3_pInt ; do m = 1_pInt , 3_pInt ; do n = 1_pInt , 3_pInt ; do o = 1_pInt , 3_pInt
do p = 1_pInt , 3_pInt ; do q = 1_pInt , 3_pInt ; do r = 1_pInt , 3_pInt ; do s = 1_pInt , 3_pInt
2018-05-02 23:00:27 +05:30
Ctwin3333 ( l , m , n , o , index_myFamily + j , instance ) = &
Ctwin3333 ( l , m , n , o , index_myFamily + j , instance ) + &
2017-12-19 10:29:10 +05:30
lattice_C3333 ( p , q , r , s , phase ) * &
2014-03-09 02:20:31 +05:30
lattice_Qtwin ( l , p , index_otherFamily + j , phase ) * &
lattice_Qtwin ( m , q , index_otherFamily + j , phase ) * &
lattice_Qtwin ( n , r , index_otherFamily + j , phase ) * &
lattice_Qtwin ( o , s , index_otherFamily + j , phase )
2014-03-12 05:25:40 +05:30
enddo ; enddo ; enddo ; enddo
enddo ; enddo ; enddo ; enddo
2018-05-02 23:00:27 +05:30
Ctwin66 ( 1 : 6 , 1 : 6 , index_myFamily + j , instance ) = &
math_Mandel3333to66 ( Ctwin3333 ( 1 : 3 , 1 : 3 , 1 : 3 , 1 : 3 , index_myFamily + j , instance ) )
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Interaction matrices
do o = 1_pInt , lattice_maxNslipFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
2018-05-02 23:00:27 +05:30
interactionMatrix_TwinSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_TwinSlip ( lattice_interactionTwinSlip ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
2018-05-02 23:00:27 +05:30
interactionMatrix_TwinTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_TwinTwin ( lattice_interactionTwinTwin ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
enddo twinSystemsLoop
enddo twinFamiliesLoop
2014-09-10 17:42:17 +05:30
!* Process transformation related parameters ------------------------------------------------
transFamiliesLoop : do f = 1_pInt , lattice_maxNtransFamily
2018-05-08 19:56:49 +05:30
index_myFamily = sum ( Ntrans ( 1 : f - 1_pInt , instance ) ) ! index in truncated trans system list
transSystemsLoop : do j = 1_pInt , Ntrans ( f , instance )
2014-09-10 17:42:17 +05:30
2015-11-16 15:45:18 +05:30
!* Burgers vector,
! nucleation rate prefactor,
! and martensite size
2014-09-10 17:42:17 +05:30
!* Rotate trans elasticity matrices
index_otherFamily = sum ( lattice_NtransSystem ( 1 : f - 1_pInt , phase ) ) ! index in full lattice trans list
do l = 1_pInt , 3_pInt ; do m = 1_pInt , 3_pInt ; do n = 1_pInt , 3_pInt ; do o = 1_pInt , 3_pInt
do p = 1_pInt , 3_pInt ; do q = 1_pInt , 3_pInt ; do r = 1_pInt , 3_pInt ; do s = 1_pInt , 3_pInt
2018-05-02 23:00:27 +05:30
Ctrans3333 ( l , m , n , o , index_myFamily + j , instance ) = &
Ctrans3333 ( l , m , n , o , index_myFamily + j , instance ) + &
2017-12-19 10:29:10 +05:30
lattice_trans_C3333 ( p , q , r , s , phase ) * &
2014-09-10 17:42:17 +05:30
lattice_Qtrans ( l , p , index_otherFamily + j , phase ) * &
lattice_Qtrans ( m , q , index_otherFamily + j , phase ) * &
lattice_Qtrans ( n , r , index_otherFamily + j , phase ) * &
lattice_Qtrans ( o , s , index_otherFamily + j , phase )
enddo ; enddo ; enddo ; enddo
enddo ; enddo ; enddo ; enddo
2018-05-02 23:00:27 +05:30
Ctrans66 ( 1 : 6 , 1 : 6 , index_myFamily + j , instance ) = &
math_Mandel3333to66 ( Ctrans3333 ( 1 : 3 , 1 : 3 , 1 : 3 , 1 : 3 , index_myFamily + j , instance ) )
2014-09-24 18:01:16 +05:30
2015-11-10 19:00:34 +05:30
!* Interaction matrices
do o = 1_pInt , lattice_maxNslipFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
2018-05-02 23:00:27 +05:30
interactionMatrix_TransSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_TransSlip ( lattice_interactionTransSlip ( &
2015-11-10 19:00:34 +05:30
sum ( lattice_NtransSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
do o = 1_pInt , lattice_maxNtransFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Ntrans ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Ntrans ( o , instance ) ! loop over (active) systems in other family (trans)
2018-05-02 23:00:27 +05:30
interactionMatrix_TransTrans ( index_myFamily + j , index_otherFamily + k , instance ) = &
interaction_TransTrans ( lattice_interactionTransTrans ( &
2015-11-10 19:00:34 +05:30
sum ( lattice_NtransSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtransSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
!* Projection matrices for shear from slip systems to fault-band (twin) systems for strain-induced martensite nucleation
2015-07-08 17:28:52 +05:30
select case ( trans_lattice_structure ( phase ) )
case ( LATTICE_bcc_ID )
do o = 1_pInt , lattice_maxNtransFamily
2018-05-08 19:56:49 +05:30
index_otherFamily = sum ( Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , Nslip ( o , instance ) ! loop over (active) systems in other family (trans)
2018-05-02 23:00:27 +05:30
projectionMatrix_Trans ( index_myFamily + j , index_otherFamily + k , instance ) = &
2015-07-08 17:28:52 +05:30
lattice_projectionTrans ( sum ( lattice_NtransSystem ( 1 : f - 1 , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1 , phase ) ) + k , phase )
enddo ; enddo
end select
2014-09-10 17:42:17 +05:30
enddo transSystemsLoop
enddo transFamiliesLoop
2015-11-06 22:30:00 +05:30
startIndex = 1_pInt
endIndex = ns
2015-11-09 14:21:05 +05:30
state ( instance ) % rhoEdge = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % rhoEdge = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
2018-06-25 23:37:35 +05:30
spread ( math_expand ( prm % rho0 , Nslip ( instance , : ) ) , 2 , NofMyPhase )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolRho
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
2015-11-09 14:21:05 +05:30
state ( instance ) % rhoEdgeDip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % rhoEdgeDip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
2018-06-25 23:37:35 +05:30
spread ( math_expand ( prm % rhoDip0 , Nslip ( instance , : ) ) , 2 , NofMyPhase )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolRho
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % accshear_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % accshear_slip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-24 03:55:29 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = 1e-6_pReal
2018-05-17 23:02:41 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
2015-11-10 18:31:03 +05:30
state ( instance ) % twinFraction = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % twinFraction = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolTwinFrac
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
state ( instance ) % accshear_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % accshear_twin = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-24 03:55:29 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = 1e-6_pReal
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
2015-11-10 18:31:03 +05:30
state ( instance ) % stressTransFraction = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % stressTransFraction = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolTransFrac
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
2015-11-10 18:31:03 +05:30
state ( instance ) % strainTransFraction = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % strainTransFraction = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolTransFrac
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % invLambdaSlip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
invLambdaSlip0 = spread ( 0.0_pReal , 1 , ns )
forall ( i = 1_pInt : ns ) &
2018-06-25 23:37:35 +05:30
invLambdaSlip0 ( i ) = sqrt ( dot_product ( math_expand ( prm % rho0 , Nslip ( instance , : ) ) + &
math_expand ( prm % rhoDip0 , Nslip ( instance , : ) ) , forestProjectionEdge ( 1 : ns , i , instance ) ) ) / &
2018-06-27 14:23:23 +05:30
prm % CLambdaSlipPerSlipSystem ( i )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( invLambdaSlip0 , Nslip ( instance , : ) ) , 2 , NofMyPhase )
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % invLambdaSlipTwin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
state ( instance ) % invLambdaTwin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % invLambdaSlipTrans = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-10 20:53:15 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
state ( instance ) % invLambdaTrans = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % mfp_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
state0 ( instance ) % mfp_slip = > plasticState ( phase ) % state0 ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
MeanFreePathSlip0 = param ( instance ) % GrainSize / ( 1.0_pReal + invLambdaSlip0 * param ( instance ) % GrainSize )
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( MeanFreePathSlip0 , Nslip ( instance , : ) ) , 2 , NofMyPhase )
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
state ( instance ) % mfp_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-22 23:29:05 +05:30
MeanFreePathTwin0 = spread ( param ( instance ) % GrainSize , 1 , nt )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
2018-05-22 23:29:05 +05:30
spread ( math_expand ( MeanFreePathTwin0 , Ntwin ( instance , : ) ) , 2 , NofMyPhase )
2015-11-10 20:53:15 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
state ( instance ) % mfp_trans = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-22 23:29:05 +05:30
MeanFreePathTrans0 = spread ( param ( instance ) % GrainSize , 1 , nr )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
2018-05-22 23:29:05 +05:30
spread ( math_expand ( MeanFreePathTrans0 , Ntrans ( instance , : ) ) , 2 , NofMyPhase )
2015-11-10 20:53:15 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + ns
state ( instance ) % threshold_stress_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
tauSlipThreshold0 = spread ( 0.0_pReal , 1 , ns )
2018-05-22 23:29:05 +05:30
forall ( i = 1_pInt : ns ) tauSlipThreshold0 ( i ) = &
2018-06-25 23:37:35 +05:30
lattice_mu ( phase ) * prm % burgers_slip ( i ) * &
sqrt ( dot_product ( math_expand ( prm % rho0 + prm % rhoDip0 , Nslip ( instance , : ) ) , &
2018-05-22 23:29:05 +05:30
interactionMatrix_SlipSlip ( i , 1 : ns , instance ) ) )
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( tauSlipThreshold0 , Nslip ( instance , : ) ) , 2 , NofMyPhase )
2015-11-10 20:53:15 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
state ( instance ) % threshold_stress_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-10 20:53:15 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
state ( instance ) % threshold_stress_trans = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
2015-11-06 22:30:00 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nt
state ( instance ) % twinVolume = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
TwinVolume0 = spread ( 0.0_pReal , 1 , nt )
2018-05-22 23:29:05 +05:30
forall ( i = 1_pInt : nt ) TwinVolume0 ( i ) = &
2018-06-27 14:23:23 +05:30
( PI / 4.0_pReal ) * prm % twinsizePerTwinSystem ( i ) * MeanFreePathTwin0 ( i ) ** 2.0_pReal
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( TwinVolume0 , Ntwin ( instance , : ) ) , 2 , NofMyPhase )
2015-11-10 20:53:15 +05:30
startIndex = endIndex + 1
endIndex = endIndex + nr
state ( instance ) % martensiteVolume = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2018-05-17 23:02:41 +05:30
MartensiteVolume0 = spread ( 0.0_pReal , 1 , nr )
2018-05-22 23:29:05 +05:30
forall ( i = 1_pInt : nr ) MartensiteVolume0 ( i ) = &
2018-06-27 14:23:23 +05:30
( PI / 4.0_pReal ) * prm % lamellarsizePerTransSystem ( i ) * MeanFreePathTrans0 ( i ) ** 2.0_pReal
2018-05-17 23:02:41 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( MartensiteVolume0 , Ntrans ( instance , : ) ) , 2 , NofMyPhase )
2014-07-02 17:57:39 +05:30
endif myPhase2
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
enddo initializeInstances
2014-12-08 21:25:30 +05:30
end subroutine plastic_dislotwin_init
2011-04-13 17:21:46 +05:30
2014-07-22 13:13:03 +05:30
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns the homogenized elasticity matrix
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
function plastic_dislotwin_homogenizedC ( ipc , ip , el )
2013-10-08 21:57:26 +05:30
use material , only : &
2014-07-02 17:57:39 +05:30
phase_plasticityInstance , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt
2014-03-09 02:20:31 +05:30
use lattice , only : &
lattice_C66
2013-10-08 21:57:26 +05:30
implicit none
real ( pReal ) , dimension ( 6 , 6 ) :: &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_homogenizedC
2013-10-08 21:57:26 +05:30
integer ( pInt ) , intent ( in ) :: &
2014-03-09 02:20:31 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
el !< element
2014-07-02 17:57:39 +05:30
2014-09-10 17:42:17 +05:30
integer ( pInt ) :: instance , ns , nt , nr , i , &
2014-07-02 17:57:39 +05:30
ph , &
of
2014-09-10 17:42:17 +05:30
real ( pReal ) :: sumf , sumftr
2014-07-02 17:57:39 +05:30
2013-10-08 21:57:26 +05:30
!* Shortened notation
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2014-09-10 17:42:17 +05:30
2013-10-08 21:57:26 +05:30
!* Total twin volume fraction
2016-02-01 16:11:39 +05:30
sumf = sum ( state ( instance ) % twinFraction ( 1_pInt : nt , of ) ) ! safe for nt == 0
2014-09-10 17:42:17 +05:30
!* Total transformed volume fraction
2016-02-01 16:11:39 +05:30
sumftr = sum ( state ( instance ) % stressTransFraction ( 1_pInt : nr , of ) ) + &
sum ( state ( instance ) % strainTransFraction ( 1_pInt : nr , of ) )
2014-09-10 17:42:17 +05:30
2013-10-08 21:57:26 +05:30
!* Homogenized elasticity matrix
2014-12-08 21:25:30 +05:30
plastic_dislotwin_homogenizedC = ( 1.0_pReal - sumf - sumftr ) * lattice_C66 ( 1 : 6 , 1 : 6 , ph )
2013-10-08 21:57:26 +05:30
do i = 1_pInt , nt
2014-12-08 21:25:30 +05:30
plastic_dislotwin_homogenizedC = plastic_dislotwin_homogenizedC &
2018-05-02 23:00:27 +05:30
+ state ( instance ) % twinFraction ( i , of ) * Ctwin66 ( 1 : 6 , 1 : 6 , i , instance )
2013-10-08 21:57:26 +05:30
enddo
2014-09-10 17:42:17 +05:30
do i = 1_pInt , nr
2014-12-08 21:25:30 +05:30
plastic_dislotwin_homogenizedC = plastic_dislotwin_homogenizedC &
2016-02-01 16:11:39 +05:30
+ ( state ( instance ) % stressTransFraction ( i , of ) + state ( instance ) % strainTransFraction ( i , of ) ) * &
2018-05-02 23:00:27 +05:30
Ctrans66 ( 1 : 6 , 1 : 6 , i , instance )
2014-09-10 17:42:17 +05:30
enddo
2014-12-08 21:25:30 +05:30
end function plastic_dislotwin_homogenizedC
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates derived quantities from state
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
subroutine plastic_dislotwin_microstructure ( temperature , ipc , ip , el )
2013-10-08 21:57:26 +05:30
use math , only : &
pi
use material , only : &
material_phase , &
2014-07-02 17:57:39 +05:30
phase_plasticityInstance , &
2015-11-06 22:30:00 +05:30
!plasticState, & !!!!delete
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt
2014-03-09 02:20:31 +05:30
use lattice , only : &
lattice_mu , &
2015-04-11 00:39:26 +05:30
lattice_nu
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< component-ID of integration point
ip , & !< integration point
el !< element
real ( pReal ) , intent ( in ) :: &
temperature !< temperature at IP
2014-07-02 17:57:39 +05:30
2013-10-08 21:57:26 +05:30
integer ( pInt ) :: &
2014-07-02 17:57:39 +05:30
instance , &
2014-10-27 20:44:45 +05:30
ns , nt , nr , s , t , r , &
2014-07-02 17:57:39 +05:30
ph , &
of
2013-10-08 21:57:26 +05:30
real ( pReal ) :: &
2014-09-24 12:56:27 +05:30
sumf , sfe , x0 , sumftr
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNtwin ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: fOverStacksize
real ( pReal ) , dimension ( totalNtrans ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2014-10-27 20:44:45 +05:30
ftransOverLamellarSize
2018-06-25 23:37:35 +05:30
type ( tParameters ) , pointer :: prm
2014-07-02 17:57:39 +05:30
2018-06-25 23:37:35 +05:30
2013-10-08 21:57:26 +05:30
!* Shortened notation
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2018-06-25 23:37:35 +05:30
prm = > param ( instance )
2013-10-08 21:57:26 +05:30
!* Total twin volume fraction
2016-02-01 16:11:39 +05:30
sumf = sum ( state ( instance ) % twinFraction ( 1_pInt : nt , of ) ) ! safe for nt == 0
2013-10-08 21:57:26 +05:30
2014-09-24 12:56:27 +05:30
!* Total transformed volume fraction
2016-02-01 16:11:39 +05:30
sumftr = sum ( state ( instance ) % stressTransFraction ( 1_pInt : nr , of ) ) + &
sum ( state ( instance ) % strainTransFraction ( 1_pInt : nr , of ) )
2014-09-24 12:56:27 +05:30
2013-10-08 21:57:26 +05:30
!* Stacking fault energy
2018-05-03 17:13:19 +05:30
sfe = param ( instance ) % SFE_0K + &
param ( instance ) % dSFE_dT * Temperature
2013-10-08 21:57:26 +05:30
!* rescaled twin volume fraction for topology
forall ( t = 1_pInt : nt ) &
2013-10-14 16:24:45 +05:30
fOverStacksize ( t ) = &
2018-06-27 14:23:23 +05:30
state ( instance ) % twinFraction ( t , of ) / prm % twinsizePerTwinSystem ( t )
2014-10-27 20:44:45 +05:30
!* rescaled trans volume fraction for topology
forall ( r = 1_pInt : nr ) &
ftransOverLamellarSize ( r ) = &
2016-02-01 16:11:39 +05:30
( state ( instance ) % stressTransFraction ( r , of ) + state ( instance ) % strainTransFraction ( r , of ) ) / &
2018-06-27 14:23:23 +05:30
prm % lamellarsizePerTransSystem ( r )
2013-10-08 21:57:26 +05:30
!* 1/mean free distance between 2 forest dislocations seen by a moving dislocation
forall ( s = 1_pInt : ns ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaSlip ( s , of ) = &
sqrt ( dot_product ( ( state ( instance ) % rhoEdge ( 1_pInt : ns , of ) + state ( instance ) % rhoEdgeDip ( 1_pInt : ns , of ) ) , &
2018-05-02 23:00:27 +05:30
forestProjectionEdge ( 1 : ns , s , instance ) ) ) / &
2018-06-27 14:23:23 +05:30
prm % CLambdaSlipPerSlipSystem ( s )
2014-08-14 18:48:33 +05:30
2013-10-08 21:57:26 +05:30
!* 1/mean free distance between 2 twin stacks from different systems seen by a moving dislocation
!$OMP CRITICAL (evilmatmul)
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaSlipTwin ( 1_pInt : ns , of ) = 0.0_pReal
2013-10-08 21:57:26 +05:30
if ( nt > 0_pInt . and . ns > 0_pInt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaSlipTwin ( 1_pInt : ns , of ) = &
2018-05-02 23:00:27 +05:30
matmul ( interactionMatrix_SlipTwin ( 1 : ns , 1 : nt , instance ) , fOverStacksize ( 1 : nt ) ) / ( 1.0_pReal - sumf )
2013-10-08 21:57:26 +05:30
!$OMP END CRITICAL (evilmatmul)
!* 1/mean free distance between 2 twin stacks from different systems seen by a growing twin
!$OMP CRITICAL (evilmatmul)
if ( nt > 0_pInt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaTwin ( 1_pInt : nt , of ) = &
2018-05-02 23:00:27 +05:30
matmul ( interactionMatrix_TwinTwin ( 1 : nt , 1 : nt , instance ) , fOverStacksize ( 1 : nt ) ) / ( 1.0_pReal - sumf )
2013-10-08 21:57:26 +05:30
!$OMP END CRITICAL (evilmatmul)
2014-10-27 20:44:45 +05:30
!* 1/mean free distance between 2 martensite lamellar from different systems seen by a moving dislocation
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaSlipTrans ( 1_pInt : ns , of ) = 0.0_pReal
2014-10-27 20:44:45 +05:30
if ( nr > 0_pInt . and . ns > 0_pInt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaSlipTrans ( 1_pInt : ns , of ) = &
2018-05-02 23:00:27 +05:30
matmul ( interactionMatrix_SlipTrans ( 1 : ns , 1 : nr , instance ) , ftransOverLamellarSize ( 1 : nr ) ) / ( 1.0_pReal - sumftr )
2015-11-10 20:53:15 +05:30
!* 1/mean free distance between 2 martensite stacks from different systems seen by a growing martensite (1/lambda_trans)
if ( nr > 0_pInt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % invLambdaTrans ( 1_pInt : nr , of ) = &
2018-05-02 23:00:27 +05:30
matmul ( interactionMatrix_TransTrans ( 1 : nr , 1 : nr , instance ) , ftransOverLamellarSize ( 1 : nr ) ) / ( 1.0_pReal - sumftr )
2015-11-10 20:53:15 +05:30
2013-10-08 21:57:26 +05:30
!* mean free path between 2 obstacles seen by a moving dislocation
do s = 1_pInt , ns
2014-10-27 20:44:45 +05:30
if ( ( nt > 0_pInt ) . or . ( nr > 0_pInt ) ) then
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_slip ( s , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % GrainSize / ( 1.0_pReal + param ( instance ) % GrainSize * &
2016-02-01 16:11:39 +05:30
( state ( instance ) % invLambdaSlip ( s , of ) + &
state ( instance ) % invLambdaSlipTwin ( s , of ) + &
state ( instance ) % invLambdaSlipTrans ( s , of ) ) )
2013-10-14 16:24:45 +05:30
else
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_slip ( s , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % GrainSize / &
( 1.0_pReal + param ( instance ) % GrainSize * ( state ( instance ) % invLambdaSlip ( s , of ) ) ) !!!!!! correct?
2013-10-14 16:24:45 +05:30
endif
2013-10-08 21:57:26 +05:30
enddo
2014-03-12 05:25:40 +05:30
2013-10-08 21:57:26 +05:30
!* mean free path between 2 obstacles seen by a growing twin
forall ( t = 1_pInt : nt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_twin ( t , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % Cmfptwin * param ( instance ) % GrainSize / &
( 1.0_pReal + param ( instance ) % GrainSize * state ( ph ) % invLambdaTwin ( t , of ) )
2013-10-08 21:57:26 +05:30
2015-11-10 20:53:15 +05:30
!* mean free path between 2 obstacles seen by a growing martensite
forall ( r = 1_pInt : nr ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_trans ( r , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % Cmfptrans * param ( instance ) % GrainSize / &
( 1.0_pReal + param ( instance ) % GrainSize * state ( instance ) % invLambdaTrans ( r , of ) )
2015-11-10 20:53:15 +05:30
2013-10-08 21:57:26 +05:30
!* threshold stress for dislocation motion
2014-03-30 20:34:06 +05:30
forall ( s = 1_pInt : ns ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % threshold_stress_slip ( s , of ) = &
2018-06-25 23:37:35 +05:30
lattice_mu ( ph ) * prm % burgers_slip ( s ) * &
2016-02-01 16:11:39 +05:30
sqrt ( dot_product ( ( state ( instance ) % rhoEdge ( 1_pInt : ns , of ) + state ( instance ) % rhoEdgeDip ( 1_pInt : ns , of ) ) , &
2018-05-02 23:00:27 +05:30
interactionMatrix_SlipSlip ( s , 1 : ns , instance ) ) )
2015-11-10 20:53:15 +05:30
2013-10-08 21:57:26 +05:30
!* threshold stress for growing twin
forall ( t = 1_pInt : nt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % threshold_stress_twin ( t , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % Cthresholdtwin * &
2018-06-25 23:37:35 +05:30
( sfe / ( 3.0_pReal ** prm % burgers_twin ( t ) ) &
+ 3.0_pReal * prm % burgers_twin ( t ) * lattice_mu ( ph ) / &
( param ( instance ) % L0_twin * prm % burgers_slip ( t ) ) &
2016-01-07 17:18:30 +05:30
)
2015-11-10 20:53:15 +05:30
!* threshold stress for growing martensite
forall ( r = 1_pInt : nr ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % threshold_stress_trans ( r , of ) = &
2018-05-03 17:13:19 +05:30
param ( instance ) % Cthresholdtrans * &
2018-06-25 23:37:35 +05:30
( sfe / ( 3.0_pReal * prm % burgers_trans ( r ) ) &
+ 3.0_pReal * prm % burgers_trans ( r ) * lattice_mu ( ph ) / &
( param ( instance ) % L0_trans * prm % burgers_slip ( r ) ) &
2018-05-03 17:13:19 +05:30
+ param ( instance ) % transStackHeight * param ( instance ) % deltaG / &
2018-06-25 23:37:35 +05:30
( 3.0_pReal * prm % burgers_trans ( r ) ) &
2016-01-07 17:18:30 +05:30
)
2015-11-10 20:53:15 +05:30
2013-10-08 21:57:26 +05:30
!* final twin volume after growth
forall ( t = 1_pInt : nt ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % twinVolume ( t , of ) = &
2018-06-27 14:23:23 +05:30
( pi / 4.0_pReal ) * prm % twinsizePerTwinSystem ( t ) * &
2018-06-25 23:37:35 +05:30
state ( instance ) % mfp_twin ( t , of ) ** 2.0_pReal
2014-06-11 17:41:14 +05:30
2015-11-10 20:53:15 +05:30
!* final martensite volume after growth
forall ( r = 1_pInt : nr ) &
2016-02-01 16:11:39 +05:30
state ( instance ) % martensiteVolume ( r , of ) = &
2018-06-27 14:23:23 +05:30
( pi / 4.0_pReal ) * prm % lamellarsizePerTransSystem ( r ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_trans ( r , of ) ** ( 2.0_pReal )
2015-11-10 20:53:15 +05:30
2015-10-21 15:07:45 +05:30
!* equilibrium separation of partial dislocations (twin)
2013-10-08 21:57:26 +05:30
do t = 1_pInt , nt
2018-06-25 23:37:35 +05:30
x0 = lattice_mu ( ph ) * prm % burgers_twin ( t ) ** ( 2.0_pReal ) / &
2014-07-02 17:57:39 +05:30
( sfe * 8.0_pReal * pi ) * ( 2.0_pReal + lattice_nu ( ph ) ) / ( 1.0_pReal - lattice_nu ( ph ) )
2018-05-02 23:00:27 +05:30
tau_r_twin ( t , instance ) = &
2018-06-25 23:37:35 +05:30
lattice_mu ( ph ) * prm % burgers_twin ( t ) / ( 2.0_pReal * pi ) * &
2018-05-03 17:13:19 +05:30
( 1 / ( x0 + param ( instance ) % xc_twin ) + cos ( pi / 3.0_pReal ) / x0 )
2013-10-08 21:57:26 +05:30
enddo
2014-07-02 17:57:39 +05:30
2015-10-21 15:07:45 +05:30
!* equilibrium separation of partial dislocations (trans)
do r = 1_pInt , nr
2018-06-25 23:37:35 +05:30
x0 = lattice_mu ( ph ) * prm % burgers_trans ( r ) ** ( 2.0_pReal ) / &
2015-10-21 15:07:45 +05:30
( sfe * 8.0_pReal * pi ) * ( 2.0_pReal + lattice_nu ( ph ) ) / ( 1.0_pReal - lattice_nu ( ph ) )
2018-05-02 23:00:27 +05:30
tau_r_trans ( r , instance ) = &
2018-06-25 23:37:35 +05:30
lattice_mu ( ph ) * prm % burgers_trans ( r ) / ( 2.0_pReal * pi ) * &
2018-05-03 17:13:19 +05:30
( 1 / ( x0 + param ( instance ) % xc_trans ) + cos ( pi / 3.0_pReal ) / x0 )
2015-10-21 15:07:45 +05:30
enddo
2014-12-08 21:25:30 +05:30
end subroutine plastic_dislotwin_microstructure
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates plastic velocity gradient and its tangent
!--------------------------------------------------------------------------------------------------
2015-01-29 19:26:09 +05:30
subroutine plastic_dislotwin_LpAndItsTangent ( Lp , dLp_dTstar99 , Tstar_v , Temperature , ipc , ip , el )
2013-10-08 21:57:26 +05:30
use prec , only : &
2016-05-29 14:15:03 +05:30
tol_math_check , &
2016-10-29 13:09:08 +05:30
dNeq0
2013-10-08 21:57:26 +05:30
use math , only : &
math_Plain3333to99 , &
math_Mandel6to33 , &
math_Mandel33to6 , &
2016-02-26 20:06:24 +05:30
math_eigenValuesVectorsSym , &
2016-01-10 19:04:26 +05:30
math_tensorproduct33 , &
2013-10-08 21:57:26 +05:30
math_symmetric33 , &
2016-01-09 17:42:31 +05:30
math_mul33x3
2013-10-08 21:57:26 +05:30
use material , only : &
material_phase , &
2014-07-02 17:57:39 +05:30
phase_plasticityInstance , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt
2013-10-08 21:57:26 +05:30
use lattice , only : &
lattice_Sslip , &
lattice_Sslip_v , &
lattice_Stwin , &
lattice_Stwin_v , &
2015-06-08 19:56:50 +05:30
lattice_Strans , &
lattice_Strans_v , &
2013-10-08 21:57:26 +05:30
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
2014-08-14 18:48:33 +05:30
lattice_maxNtransFamily , &
2013-10-08 21:57:26 +05:30
lattice_NslipSystem , &
lattice_NtwinSystem , &
2014-08-14 18:48:33 +05:30
lattice_NtransSystem , &
2013-10-08 21:57:26 +05:30
lattice_shearTwin , &
2014-03-09 02:20:31 +05:30
lattice_structure , &
lattice_fcc_twinNucleationSlipPair , &
2013-11-27 21:50:27 +05:30
LATTICE_fcc_ID
2013-10-14 16:24:45 +05:30
2013-10-08 21:57:26 +05:30
implicit none
2015-01-29 19:26:09 +05:30
integer ( pInt ) , intent ( in ) :: ipc , ip , el
2014-03-13 12:13:49 +05:30
real ( pReal ) , intent ( in ) :: Temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v
real ( pReal ) , dimension ( 3 , 3 ) , intent ( out ) :: Lp
2014-11-06 17:19:37 +05:30
real ( pReal ) , dimension ( 9 , 9 ) , intent ( out ) :: dLp_dTstar99
2013-10-08 21:57:26 +05:30
2014-08-14 18:48:33 +05:30
integer ( pInt ) :: instance , ph , of , ns , nt , nr , f , i , j , k , l , m , n , index_myFamily , s1 , s2
2015-11-17 22:00:06 +05:30
real ( pReal ) :: sumf , sumftr , StressRatio_p , StressRatio_pminus1 , StressRatio_r , BoltzmannRatio , DotGamma0 , Ndot0_twin , stressRatio , &
Ndot0_trans , StressRatio_s
2013-10-08 21:57:26 +05:30
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) :: dLp_dTstar3333
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNslip ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2013-10-14 16:24:45 +05:30
gdot_slip , dgdot_dtauslip , tau_slip
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNtwin ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2013-10-14 16:24:45 +05:30
gdot_twin , dgdot_dtautwin , tau_twin
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNtrans ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2015-11-17 22:00:06 +05:30
gdot_trans , dgdot_dtautrans , tau_trans
2013-10-08 21:57:26 +05:30
real ( pReal ) , dimension ( 6 ) :: gdot_sb , dgdot_dtausb , tau_sb
real ( pReal ) , dimension ( 3 , 3 ) :: eigVectors , sb_Smatrix
real ( pReal ) , dimension ( 3 ) :: eigValues , sb_s , sb_m
2016-01-31 22:19:56 +05:30
logical :: error
2013-10-08 21:57:26 +05:30
real ( pReal ) , dimension ( 3 , 6 ) , parameter :: &
2013-10-14 16:24:45 +05:30
sb_sComposition = &
reshape ( real ( [ &
1 , 0 , 1 , &
1 , 0 , - 1 , &
1 , 1 , 0 , &
1 , - 1 , 0 , &
0 , 1 , 1 , &
0 , 1 , - 1 &
] , pReal ) , [ 3 , 6 ] ) , &
sb_mComposition = &
reshape ( real ( [ &
1 , 0 , - 1 , &
1 , 0 , + 1 , &
1 , - 1 , 0 , &
1 , 1 , 0 , &
0 , 1 , - 1 , &
0 , 1 , 1 &
] , pReal ) , [ 3 , 6 ] )
2018-06-25 23:37:35 +05:30
type ( tParameters ) , pointer :: prm
2013-10-08 21:57:26 +05:30
!* Shortened notation
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2014-06-11 17:41:14 +05:30
2013-10-08 21:57:26 +05:30
Lp = 0.0_pReal
dLp_dTstar3333 = 0.0_pReal
2018-06-25 23:37:35 +05:30
prm = > param ( instance )
2014-11-05 23:22:49 +05:30
!--------------------------------------------------------------------------------------------------
! Dislocation glide part
2013-10-08 21:57:26 +05:30
gdot_slip = 0.0_pReal
dgdot_dtauslip = 0.0_pReal
j = 0_pInt
2013-12-12 05:12:33 +05:30
slipFamiliesLoop : do f = 1_pInt , lattice_maxNslipFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
slipSystemsLoop : do i = 1_pInt , Nslip ( f , instance )
2013-12-12 05:12:33 +05:30
j = j + 1_pInt
!* Calculation of Lp
!* Resolved shear stress on slip system
2015-01-29 19:26:09 +05:30
tau_slip ( j ) = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2014-03-30 20:34:06 +05:30
2016-02-01 16:11:39 +05:30
if ( ( abs ( tau_slip ( j ) ) - state ( instance ) % threshold_stress_slip ( j , of ) ) > tol_math_check ) then
2013-12-12 05:12:33 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
stressRatio = ( ( abs ( tau_slip ( j ) ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-06-27 14:23:23 +05:30
( param ( instance ) % SolidSolutionStrength + prm % tau_peierlsPerSlipFamily ( f ) ) )
StressRatio_p = stressRatio ** prm % pPerSlipFamily ( f )
StressRatio_pminus1 = stressRatio ** ( prm % pPerSlipFamily ( f ) - 1.0_pReal )
2013-12-12 05:12:33 +05:30
!* Boltzmann ratio
2018-06-27 14:23:23 +05:30
BoltzmannRatio = prm % QedgePerSlipSystem ( j ) / ( kB * Temperature )
2013-12-12 05:12:33 +05:30
!* Initial shear rates
2014-03-30 20:34:06 +05:30
DotGamma0 = &
2018-06-25 23:37:35 +05:30
state ( instance ) % rhoEdge ( j , of ) * prm % burgers_slip ( j ) * &
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem ( j )
2014-03-30 20:34:06 +05:30
!* Shear rates due to slip
2014-11-05 23:22:49 +05:30
gdot_slip ( j ) = DotGamma0 &
2018-06-27 14:23:23 +05:30
* exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** prm % qPerSlipFamily ( f ) ) &
2014-03-30 20:34:06 +05:30
* sign ( 1.0_pReal , tau_slip ( j ) )
!* Derivatives of shear rates
dgdot_dtauslip ( j ) = &
2018-06-27 14:23:23 +05:30
abs ( gdot_slip ( j ) ) * BoltzmannRatio * prm % pPerSlipFamily ( f ) &
* prm % qPerSlipFamily ( f ) / &
( param ( instance ) % SolidSolutionStrength + prm % tau_peierlsPerSlipFamily ( f ) ) * &
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % qPerSlipFamily ( f ) - 1.0_pReal )
2014-03-30 20:34:06 +05:30
endif
2013-12-12 05:12:33 +05:30
!* Plastic velocity gradient for dislocation glide
2014-07-02 17:57:39 +05:30
Lp = Lp + gdot_slip ( j ) * lattice_Sslip ( : , : , 1 , index_myFamily + i , ph )
2013-12-12 05:12:33 +05:30
!* Calculation of the tangent of Lp
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtauslip ( j ) * &
2014-07-02 17:57:39 +05:30
lattice_Sslip ( k , l , 1 , index_myFamily + i , ph ) * &
lattice_Sslip ( m , n , 1 , index_myFamily + i , ph )
2013-12-12 05:12:33 +05:30
enddo slipSystemsLoop
enddo slipFamiliesLoop
2013-10-08 21:57:26 +05:30
2014-11-05 23:22:49 +05:30
!--------------------------------------------------------------------------------------------------
! correct Lp and dLp_dTstar3333 for twinned and transformed fraction
!* Total twin volume fraction
2016-02-01 16:11:39 +05:30
sumf = sum ( state ( instance ) % twinFraction ( 1_pInt : nt , of ) ) ! safe for nt == 0
2014-11-05 23:22:49 +05:30
!* Total transformed volume fraction
2016-02-01 16:11:39 +05:30
sumftr = sum ( state ( instance ) % stressTransFraction ( 1_pInt : nr , of ) ) + &
sum ( state ( instance ) % strainTransFraction ( 1_pInt : nr , of ) )
2014-11-05 23:22:49 +05:30
Lp = Lp * ( 1.0_pReal - sumf - sumftr )
dLp_dTstar3333 = dLp_dTstar3333 * ( 1.0_pReal - sumf - sumftr )
!--------------------------------------------------------------------------------------------------
! Shear banding (shearband) part
2018-05-03 20:55:56 +05:30
if ( dNeq0 ( param ( instance ) % sbVelocity ) . and . dNeq0 ( param ( instance ) % sbResistance ) ) then
2013-10-14 16:24:45 +05:30
gdot_sb = 0.0_pReal
dgdot_dtausb = 0.0_pReal
2016-02-26 20:06:24 +05:30
call math_eigenValuesVectorsSym ( math_Mandel6to33 ( Tstar_v ) , eigValues , eigVectors , error )
2013-10-14 16:24:45 +05:30
do j = 1_pInt , 6_pInt
sb_s = 0.5_pReal * sqrt ( 2.0_pReal ) * math_mul33x3 ( eigVectors , sb_sComposition ( 1 : 3 , j ) )
sb_m = 0.5_pReal * sqrt ( 2.0_pReal ) * math_mul33x3 ( eigVectors , sb_mComposition ( 1 : 3 , j ) )
2016-01-10 19:04:26 +05:30
sb_Smatrix = math_tensorproduct33 ( sb_s , sb_m )
2018-05-02 23:00:27 +05:30
sbSv ( 1 : 6 , j , ipc , ip , el ) = math_Mandel33to6 ( math_symmetric33 ( sb_Smatrix ) )
2013-10-14 16:24:45 +05:30
!* Calculation of Lp
!* Resolved shear stress on shear banding system
2018-05-02 23:00:27 +05:30
tau_sb ( j ) = dot_product ( Tstar_v , sbSv ( 1 : 6 , j , ipc , ip , el ) )
2013-10-14 16:24:45 +05:30
!* Stress ratios
2014-03-12 05:25:40 +05:30
if ( abs ( tau_sb ( j ) ) < tol_math_check ) then
StressRatio_p = 0.0_pReal
StressRatio_pminus1 = 0.0_pReal
else
2018-05-03 20:55:56 +05:30
StressRatio_p = ( abs ( tau_sb ( j ) ) / param ( instance ) % sbResistance ) &
2018-05-03 17:13:19 +05:30
** param ( instance ) % pShearBand
2018-05-03 20:55:56 +05:30
StressRatio_pminus1 = ( abs ( tau_sb ( j ) ) / param ( instance ) % sbResistance ) &
2018-05-03 17:13:19 +05:30
** ( param ( instance ) % pShearBand - 1.0_pReal )
2014-03-12 05:25:40 +05:30
endif
2013-10-14 16:24:45 +05:30
!* Boltzmann ratio
2018-05-03 17:13:19 +05:30
BoltzmannRatio = param ( instance ) % sbQedge / ( kB * Temperature )
2013-10-14 16:24:45 +05:30
!* Initial shear rates
2018-05-03 17:13:19 +05:30
DotGamma0 = param ( instance ) % sbVelocity
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Shear rates due to shearband
2014-03-12 05:25:40 +05:30
gdot_sb ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
2018-05-03 17:13:19 +05:30
param ( instance ) % qShearBand ) * sign ( 1.0_pReal , tau_sb ( j ) )
2013-10-14 16:24:45 +05:30
!* Derivatives of shear rates
dgdot_dtausb ( j ) = &
( ( abs ( gdot_sb ( j ) ) * BoltzmannRatio * &
2018-05-03 17:13:19 +05:30
param ( instance ) % pShearBand * param ( instance ) % qShearBand ) / &
2018-05-03 20:55:56 +05:30
param ( instance ) % sbResistance ) * &
2018-05-03 17:13:19 +05:30
StressRatio_pminus1 * ( 1_pInt - StressRatio_p ) ** ( param ( instance ) % qShearBand - 1.0_pReal )
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Plastic velocity gradient for shear banding
Lp = Lp + gdot_sb ( j ) * sb_Smatrix
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Calculation of the tangent of Lp
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtausb ( j ) * &
sb_Smatrix ( k , l ) * &
sb_Smatrix ( m , n )
enddo
2013-10-08 21:57:26 +05:30
end if
2012-05-16 20:13:26 +05:30
2014-11-05 23:22:49 +05:30
!--------------------------------------------------------------------------------------------------
! Mechanical twinning part
2013-10-08 21:57:26 +05:30
gdot_twin = 0.0_pReal
dgdot_dtautwin = 0.0_pReal
j = 0_pInt
2013-12-12 05:12:33 +05:30
twinFamiliesLoop : do f = 1_pInt , lattice_maxNtwinFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
twinSystemsLoop : do i = 1_pInt , Ntwin ( f , instance )
2013-12-12 05:12:33 +05:30
j = j + 1_pInt
!* Calculation of Lp
!* Resolved shear stress on twin system
2014-07-02 17:57:39 +05:30
tau_twin ( j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , ph ) )
2014-03-12 05:25:40 +05:30
2013-12-12 05:12:33 +05:30
!* Stress ratios
2014-03-12 05:25:40 +05:30
if ( tau_twin ( j ) > tol_math_check ) then
2018-06-27 14:23:23 +05:30
StressRatio_r = ( state ( instance ) % threshold_stress_twin ( j , of ) / tau_twin ( j ) ) ** prm % rPerTwinFamily ( f )
2015-11-17 22:00:06 +05:30
!* Shear rates and their derivatives due to twin
2014-07-02 17:57:39 +05:30
select case ( lattice_structure ( ph ) )
2013-12-12 05:12:33 +05:30
case ( LATTICE_fcc_ID )
2014-03-09 02:20:31 +05:30
s1 = lattice_fcc_twinNucleationSlipPair ( 1 , index_myFamily + i )
s2 = lattice_fcc_twinNucleationSlipPair ( 2 , index_myFamily + i )
2018-05-02 23:00:27 +05:30
if ( tau_twin ( j ) < tau_r_twin ( j , instance ) ) then
2016-02-01 16:11:39 +05:30
Ndot0_twin = ( abs ( gdot_slip ( s1 ) ) * ( state ( instance ) % rhoEdge ( s2 , of ) + state ( ph ) % rhoEdgeDip ( s2 , of ) ) + & !!!!! correct?
abs ( gdot_slip ( s2 ) ) * ( state ( instance ) % rhoEdge ( s1 , of ) + state ( instance ) % rhoEdgeDip ( s1 , of ) ) ) / &
2018-06-25 23:37:35 +05:30
( param ( instance ) % L0_twin * prm % burgers_slip ( j ) ) * &
2018-05-03 17:13:19 +05:30
( 1.0_pReal - exp ( - param ( instance ) % VcrossSlip / ( kB * Temperature ) * &
2018-05-02 23:00:27 +05:30
( tau_r_twin ( j , instance ) - tau_twin ( j ) ) ) )
2013-12-12 05:12:33 +05:30
else
2015-11-16 15:45:18 +05:30
Ndot0_twin = 0.0_pReal
2013-12-12 05:12:33 +05:30
end if
case default
2018-06-27 14:23:23 +05:30
Ndot0_twin = prm % Ndot0PerTwinSystem ( j )
2013-12-12 05:12:33 +05:30
end select
gdot_twin ( j ) = &
2014-09-10 17:42:17 +05:30
( 1.0_pReal - sumf - sumftr ) * lattice_shearTwin ( index_myFamily + i , ph ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % twinVolume ( j , of ) * Ndot0_twin * exp ( - StressRatio_r )
2018-06-27 14:23:23 +05:30
dgdot_dtautwin ( j ) = ( ( gdot_twin ( j ) * prm % rPerTwinFamily ( f ) ) / tau_twin ( j ) ) * StressRatio_r
2013-12-12 05:12:33 +05:30
endif
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
!* Plastic velocity gradient for mechanical twinning
2014-07-02 17:57:39 +05:30
Lp = Lp + gdot_twin ( j ) * lattice_Stwin ( : , : , index_myFamily + i , ph )
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
!* Calculation of the tangent of Lp
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtautwin ( j ) * &
2014-07-02 17:57:39 +05:30
lattice_Stwin ( k , l , index_myFamily + i , ph ) * &
lattice_Stwin ( m , n , index_myFamily + i , ph )
2013-12-12 05:12:33 +05:30
enddo twinSystemsLoop
enddo twinFamiliesLoop
2014-09-10 17:42:17 +05:30
2014-10-01 13:41:39 +05:30
!* Phase transformation part
2015-11-17 22:00:06 +05:30
gdot_trans = 0.0_pReal
dgdot_dtautrans = 0.0_pReal
2014-10-01 13:41:39 +05:30
j = 0_pInt
transFamiliesLoop : do f = 1_pInt , lattice_maxNtransFamily
index_myFamily = sum ( lattice_NtransSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
transSystemsLoop : do i = 1_pInt , Ntrans ( f , instance )
2014-10-01 13:41:39 +05:30
j = j + 1_pInt
!* Resolved shear stress on transformation system
2015-06-08 19:56:50 +05:30
tau_trans ( j ) = dot_product ( Tstar_v , lattice_Strans_v ( : , index_myFamily + i , ph ) )
2014-10-01 13:41:39 +05:30
2015-11-17 22:00:06 +05:30
!* Stress ratios
if ( tau_trans ( j ) > tol_math_check ) then
2018-06-27 14:23:23 +05:30
StressRatio_s = ( state ( instance ) % threshold_stress_trans ( j , of ) / tau_trans ( j ) ) ** prm % sPerTransFamily ( f )
2015-11-17 22:00:06 +05:30
!* Shear rates and their derivatives due to transformation
select case ( lattice_structure ( ph ) )
case ( LATTICE_fcc_ID )
s1 = lattice_fcc_twinNucleationSlipPair ( 1 , index_myFamily + i )
s2 = lattice_fcc_twinNucleationSlipPair ( 2 , index_myFamily + i )
2018-05-02 23:00:27 +05:30
if ( tau_trans ( j ) < tau_r_trans ( j , instance ) ) then
2016-02-01 16:11:39 +05:30
Ndot0_trans = ( abs ( gdot_slip ( s1 ) ) * ( state ( instance ) % rhoEdge ( s2 , of ) + state ( instance ) % rhoEdgeDip ( s2 , of ) ) + & !!!!! correct?
abs ( gdot_slip ( s2 ) ) * ( state ( instance ) % rhoEdge ( s1 , of ) + state ( instance ) % rhoEdgeDip ( s1 , of ) ) ) / &
2018-06-25 23:37:35 +05:30
( param ( instance ) % L0_trans * prm % burgers_slip ( j ) ) * &
2018-05-03 17:13:19 +05:30
( 1.0_pReal - exp ( - param ( instance ) % VcrossSlip / ( kB * Temperature ) * &
2018-05-02 23:00:27 +05:30
( tau_r_trans ( j , instance ) - tau_trans ( j ) ) ) )
2015-11-17 22:00:06 +05:30
else
Ndot0_trans = 0.0_pReal
end if
case default
2018-06-27 14:23:23 +05:30
Ndot0_trans = prm % Ndot0PerTransSystem ( j )
2015-11-17 22:00:06 +05:30
end select
gdot_trans ( j ) = &
( 1.0_pReal - sumf - sumftr ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % martensiteVolume ( j , of ) * Ndot0_trans * exp ( - StressRatio_s )
2018-06-27 14:23:23 +05:30
dgdot_dtautrans ( j ) = ( ( gdot_trans ( j ) * prm % sPerTransFamily ( f ) ) / tau_trans ( j ) ) * StressRatio_s
2014-10-01 13:41:39 +05:30
endif
!* Plastic velocity gradient for phase transformation
2015-11-17 22:00:06 +05:30
Lp = Lp + gdot_trans ( j ) * lattice_Strans ( : , : , index_myFamily + i , ph )
2014-10-01 13:41:39 +05:30
!* Calculation of the tangent of Lp
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dTstar3333 ( k , l , m , n ) = &
2015-11-17 22:00:06 +05:30
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtautrans ( j ) * &
2015-06-08 19:56:50 +05:30
lattice_Strans ( k , l , index_myFamily + i , ph ) * &
lattice_Strans ( m , n , index_myFamily + i , ph )
2014-10-01 13:41:39 +05:30
enddo transSystemsLoop
enddo transFamiliesLoop
2014-11-06 17:19:37 +05:30
dLp_dTstar99 = math_Plain3333to99 ( dLp_dTstar3333 )
2013-10-08 21:57:26 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_dislotwin_LpAndItsTangent
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calculates the rate of change of microstructure
!--------------------------------------------------------------------------------------------------
2015-01-29 19:26:09 +05:30
subroutine plastic_dislotwin_dotState ( Tstar_v , Temperature , ipc , ip , el )
2013-11-27 21:50:27 +05:30
use prec , only : &
2016-05-29 14:15:03 +05:30
tol_math_check , &
2016-10-29 13:09:08 +05:30
dEq0
2013-11-27 21:50:27 +05:30
use math , only : &
pi
use material , only : &
material_phase , &
2014-07-02 17:57:39 +05:30
phase_plasticityInstance , &
plasticState , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt
2013-11-27 21:50:27 +05:30
use lattice , only : &
lattice_Sslip_v , &
lattice_Stwin_v , &
2015-06-08 19:56:50 +05:30
lattice_Strans_v , &
2013-11-27 21:50:27 +05:30
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
2014-08-14 18:48:33 +05:30
lattice_maxNtransFamily , &
2013-11-27 21:50:27 +05:30
lattice_NslipSystem , &
lattice_NtwinSystem , &
2014-08-14 18:48:33 +05:30
lattice_NtransSystem , &
2013-11-27 21:50:27 +05:30
lattice_sheartwin , &
2014-03-09 02:20:31 +05:30
lattice_mu , &
lattice_structure , &
lattice_fcc_twinNucleationSlipPair , &
2015-06-22 14:03:48 +05:30
lattice_fccTobcc_transNucleationTwinPair , &
lattice_fccTobcc_shearCritTrans , &
2015-04-11 00:39:26 +05:30
LATTICE_fcc_ID
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
implicit none
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: &
2013-10-08 21:57:26 +05:30
Tstar_v !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-03-13 12:13:49 +05:30
real ( pReal ) , intent ( in ) :: &
2013-10-08 21:57:26 +05:30
temperature !< temperature at integration point
2014-03-13 12:13:49 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-10-08 21:57:26 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
el !< element
2014-07-02 17:57:39 +05:30
2015-12-15 01:18:11 +05:30
integer ( pInt ) :: instance , ns , nt , nr , f , i , j , index_myFamily , s1 , s2 , &
2014-07-02 17:57:39 +05:30
ph , &
of
2014-09-10 17:42:17 +05:30
real ( pReal ) :: sumf , sumftr , StressRatio_p , StressRatio_pminus1 , BoltzmannRatio , DotGamma0 , &
2015-11-17 22:00:06 +05:30
EdgeDipMinDistance , AtomicVolume , VacancyDiffusion , StressRatio_r , Ndot0_twin , stressRatio , &
2015-12-12 00:06:58 +05:30
Ndot0_trans , StressRatio_s , EdgeDipDistance , ClimbVelocity , DotRhoEdgeDipClimb , DotRhoEdgeDipAnnihilation , &
DotRhoDipFormation , DotRhoMultiplication , DotRhoEdgeEdgeAnnihilation
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNslip ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2015-12-12 00:06:58 +05:30
gdot_slip , tau_slip
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNtwin ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2013-10-14 16:24:45 +05:30
tau_twin
2018-05-02 23:00:27 +05:30
real ( pReal ) , dimension ( totalNtrans ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2015-11-17 22:00:06 +05:30
tau_trans
2014-09-10 17:42:17 +05:30
2018-06-25 23:37:35 +05:30
type ( tParameters ) , pointer :: prm
2013-10-08 21:57:26 +05:30
!* Shortened notation
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2018-06-25 23:37:35 +05:30
prm = > param ( instance )
2013-10-08 21:57:26 +05:30
!* Total twin volume fraction
2016-02-01 16:11:39 +05:30
sumf = sum ( state ( instance ) % twinFraction ( 1_pInt : nt , of ) ) ! safe for nt == 0
2016-02-22 20:15:18 +05:30
plasticState ( ph ) % dotState ( : , of ) = 0.0_pReal
2013-10-08 21:57:26 +05:30
2014-09-10 17:42:17 +05:30
!* Total transformed volume fraction
2016-02-01 16:11:39 +05:30
sumftr = sum ( state ( instance ) % stressTransFraction ( 1_pInt : nr , of ) ) + &
sum ( state ( instance ) % strainTransFraction ( 1_pInt : nr , of ) )
2014-09-10 17:42:17 +05:30
2013-10-08 21:57:26 +05:30
!* Dislocation density evolution
gdot_slip = 0.0_pReal
j = 0_pInt
2015-11-17 22:00:06 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2014-03-09 02:20:31 +05:30
j = j + 1_pInt
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Resolved shear stress on slip system
2015-01-29 19:26:09 +05:30
tau_slip ( j ) = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2014-03-12 05:25:40 +05:30
2016-02-01 16:11:39 +05:30
if ( ( abs ( tau_slip ( j ) ) - state ( instance ) % threshold_stress_slip ( j , of ) ) > tol_math_check ) then
2014-03-30 20:34:06 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
stressRatio = ( ( abs ( tau_slip ( j ) ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-06-27 14:23:23 +05:30
( param ( instance ) % SolidSolutionStrength + prm % tau_peierlsPerSlipFamily ( f ) ) )
StressRatio_p = stressRatio ** prm % pPerSlipFamily ( f )
StressRatio_pminus1 = stressRatio ** ( prm % pPerSlipFamily ( f ) - 1.0_pReal )
2014-03-09 02:20:31 +05:30
!* Boltzmann ratio
2018-06-27 14:23:23 +05:30
BoltzmannRatio = prm % QedgePerSlipSystem ( j ) / ( kB * Temperature )
2014-03-09 02:20:31 +05:30
!* Initial shear rates
2014-03-30 20:34:06 +05:30
DotGamma0 = &
2018-06-25 23:37:35 +05:30
plasticState ( ph ) % state ( j , of ) * prm % burgers_slip ( j ) * &
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem ( j )
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Shear rates due to slip
2014-03-30 20:34:06 +05:30
gdot_slip ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
2018-06-27 14:23:23 +05:30
prm % qPerSlipFamily ( f ) ) * sign ( 1.0_pReal , tau_slip ( j ) )
2014-03-30 20:34:06 +05:30
endif
2014-03-09 02:20:31 +05:30
!* Multiplication
2015-12-12 00:06:58 +05:30
DotRhoMultiplication = abs ( gdot_slip ( j ) ) / &
2018-06-25 23:37:35 +05:30
( prm % burgers_slip ( j ) * state ( instance ) % mfp_slip ( j , of ) )
2014-03-09 02:20:31 +05:30
!* Dipole formation
EdgeDipMinDistance = &
2018-06-25 23:37:35 +05:30
param ( instance ) % CEdgeDipMinDistance * prm % burgers_slip ( j )
2016-10-29 13:09:08 +05:30
if ( dEq0 ( tau_slip ( j ) ) ) then
2015-12-12 00:06:58 +05:30
DotRhoDipFormation = 0.0_pReal
2014-03-09 02:20:31 +05:30
else
2015-12-12 00:06:58 +05:30
EdgeDipDistance = &
2018-06-25 23:37:35 +05:30
( 3.0_pReal * lattice_mu ( ph ) * prm % burgers_slip ( j ) ) / &
2014-03-09 02:20:31 +05:30
( 1 6.0_pReal * pi * abs ( tau_slip ( j ) ) )
2016-02-01 16:11:39 +05:30
if ( EdgeDipDistance > state ( instance ) % mfp_slip ( j , of ) ) EdgeDipDistance = state ( instance ) % mfp_slip ( j , of )
2015-12-12 00:06:58 +05:30
if ( EdgeDipDistance < EdgeDipMinDistance ) EdgeDipDistance = EdgeDipMinDistance
DotRhoDipFormation = &
2018-06-25 23:37:35 +05:30
( ( 2.0_pReal * ( EdgeDipDistance - EdgeDipMinDistance ) ) / prm % burgers_slip ( j ) ) * &
2018-05-03 20:55:56 +05:30
state ( instance ) % rhoEdge ( j , of ) * abs ( gdot_slip ( j ) ) * param ( instance ) % dipoleFormationFactor
2014-03-09 02:20:31 +05:30
endif
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Spontaneous annihilation of 2 single edge dislocations
2015-12-12 00:06:58 +05:30
DotRhoEdgeEdgeAnnihilation = &
2018-06-25 23:37:35 +05:30
( ( 2.0_pReal * EdgeDipMinDistance ) / prm % burgers_slip ( j ) ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % rhoEdge ( j , of ) * abs ( gdot_slip ( j ) )
2014-03-09 02:20:31 +05:30
!* Spontaneous annihilation of a single edge dislocation with a dipole constituent
2015-12-12 00:06:58 +05:30
DotRhoEdgeDipAnnihilation = &
2018-06-25 23:37:35 +05:30
( ( 2.0_pReal * EdgeDipMinDistance ) / prm % burgers_slip ( j ) ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % rhoEdgeDip ( j , of ) * abs ( gdot_slip ( j ) )
2014-03-09 02:20:31 +05:30
!* Dislocation dipole climb
AtomicVolume = &
2018-06-25 23:37:35 +05:30
param ( instance ) % CAtomicVolume * prm % burgers_slip ( j ) ** ( 3.0_pReal )
2014-03-09 02:20:31 +05:30
VacancyDiffusion = &
2018-05-02 23:00:27 +05:30
param ( instance ) % D0 * exp ( - param ( instance ) % Qsd / ( kB * Temperature ) )
2016-10-29 13:09:08 +05:30
if ( dEq0 ( tau_slip ( j ) ) ) then
2015-12-12 00:06:58 +05:30
DotRhoEdgeDipClimb = 0.0_pReal
2014-03-09 02:20:31 +05:30
else
2016-10-29 13:09:08 +05:30
if ( dEq0 ( EdgeDipDistance - EdgeDipMinDistance ) ) then
2015-12-12 00:06:58 +05:30
DotRhoEdgeDipClimb = 0.0_pReal
else
2016-01-07 17:18:30 +05:30
ClimbVelocity = 3.0_pReal * lattice_mu ( ph ) * VacancyDiffusion * AtomicVolume / &
( 2.0_pReal * pi * kB * Temperature * ( EdgeDipDistance + EdgeDipMinDistance ) )
2016-02-01 16:11:39 +05:30
DotRhoEdgeDipClimb = 4.0_pReal * ClimbVelocity * state ( instance ) % rhoEdgeDip ( j , of ) / &
2016-01-07 17:18:30 +05:30
( EdgeDipDistance - EdgeDipMinDistance )
2015-12-12 00:06:58 +05:30
endif
2014-03-09 02:20:31 +05:30
endif
!* Edge dislocation density rate of change
2016-02-01 16:11:39 +05:30
dotState ( instance ) % rhoEdge ( j , of ) = &
2015-12-12 00:06:58 +05:30
DotRhoMultiplication - DotRhoDipFormation - DotRhoEdgeEdgeAnnihilation
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Edge dislocation dipole density rate of change
2016-02-01 16:11:39 +05:30
dotState ( instance ) % rhoEdgeDip ( j , of ) = &
2015-12-12 00:06:58 +05:30
DotRhoDipFormation - DotRhoEdgeDipAnnihilation - DotRhoEdgeDipClimb
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Dotstate for accumulated shear due to slip
2016-02-01 16:11:39 +05:30
dotState ( instance ) % accshear_slip ( j , of ) = abs ( gdot_slip ( j ) )
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
enddo
2013-10-08 21:57:26 +05:30
enddo
!* Twin volume fraction evolution
j = 0_pInt
2015-11-17 22:00:06 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all twin families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Ntwin ( f , instance ) ! process each (active) twin system in family
2014-03-09 02:20:31 +05:30
j = j + 1_pInt
2013-10-08 21:57:26 +05:30
2014-03-09 02:20:31 +05:30
!* Resolved shear stress on twin system
2014-07-02 17:57:39 +05:30
tau_twin ( j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , ph ) )
2014-03-09 02:20:31 +05:30
!* Stress ratios
2014-03-12 05:25:40 +05:30
if ( tau_twin ( j ) > tol_math_check ) then
2016-02-01 16:11:39 +05:30
StressRatio_r = ( state ( instance ) % threshold_stress_twin ( j , of ) / &
2018-06-27 14:23:23 +05:30
tau_twin ( j ) ) ** prm % rPerTwinFamily ( f )
2015-11-17 22:00:06 +05:30
!* Shear rates and their derivatives due to twin
2014-07-02 17:57:39 +05:30
select case ( lattice_structure ( ph ) )
2014-03-09 02:20:31 +05:30
case ( LATTICE_fcc_ID )
s1 = lattice_fcc_twinNucleationSlipPair ( 1 , index_myFamily + i )
s2 = lattice_fcc_twinNucleationSlipPair ( 2 , index_myFamily + i )
2018-05-02 23:00:27 +05:30
if ( tau_twin ( j ) < tau_r_twin ( j , instance ) ) then
2016-02-01 16:11:39 +05:30
Ndot0_twin = ( abs ( gdot_slip ( s1 ) ) * ( state ( instance ) % rhoEdge ( s2 , of ) + state ( instance ) % rhoEdgeDip ( s2 , of ) ) + &
abs ( gdot_slip ( s2 ) ) * ( state ( instance ) % rhoEdge ( s1 , of ) + state ( instance ) % rhoEdgeDip ( s1 , of ) ) ) / &
2018-06-25 23:37:35 +05:30
( param ( instance ) % L0_twin * prm % burgers_slip ( j ) ) * &
2018-05-03 17:13:19 +05:30
( 1.0_pReal - exp ( - param ( instance ) % VcrossSlip / ( kB * Temperature ) * &
2018-05-02 23:00:27 +05:30
( tau_r_twin ( j , instance ) - tau_twin ( j ) ) ) )
2014-03-09 02:20:31 +05:30
else
2015-11-16 15:45:18 +05:30
Ndot0_twin = 0.0_pReal
2014-03-09 02:20:31 +05:30
end if
case default
2018-06-27 14:23:23 +05:30
Ndot0_twin = prm % Ndot0PerTwinSystem ( j )
2014-03-09 02:20:31 +05:30
end select
2016-02-01 16:11:39 +05:30
dotState ( instance ) % twinFraction ( j , of ) = &
2014-09-10 17:42:17 +05:30
( 1.0_pReal - sumf - sumftr ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % twinVolume ( j , of ) * Ndot0_twin * exp ( - StressRatio_r )
2014-03-09 02:20:31 +05:30
!* Dotstate for accumulated shear due to twin
2016-02-01 16:11:39 +05:30
dotState ( instance ) % accshear_twin ( j , of ) = dotState ( instance ) % twinFraction ( j , of ) * &
2014-07-02 17:57:39 +05:30
lattice_sheartwin ( index_myfamily + i , ph )
2014-03-09 02:20:31 +05:30
endif
enddo
2013-10-08 21:57:26 +05:30
enddo
2014-06-11 17:41:14 +05:30
2014-10-01 13:41:39 +05:30
!* Transformation volume fraction evolution
j = 0_pInt
2015-11-17 22:00:06 +05:30
do f = 1_pInt , lattice_maxNtransFamily ! loop over all trans families
index_myFamily = sum ( lattice_NtransSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Ntrans ( f , instance ) ! process each (active) trans system in family
2014-10-01 13:41:39 +05:30
j = j + 1_pInt
!* Resolved shear stress on transformation system
2015-06-08 19:56:50 +05:30
tau_trans ( j ) = dot_product ( Tstar_v , lattice_Strans_v ( : , index_myFamily + i , ph ) )
2014-10-01 13:41:39 +05:30
2015-11-17 22:00:06 +05:30
!* Stress ratios
if ( tau_trans ( j ) > tol_math_check ) then
2016-02-01 16:11:39 +05:30
StressRatio_s = ( state ( instance ) % threshold_stress_trans ( j , of ) / &
2018-06-27 14:23:23 +05:30
tau_trans ( j ) ) ** prm % sPerTransFamily ( f )
2015-11-17 22:00:06 +05:30
!* Shear rates and their derivatives due to transformation
select case ( lattice_structure ( ph ) )
case ( LATTICE_fcc_ID )
s1 = lattice_fcc_twinNucleationSlipPair ( 1 , index_myFamily + i )
s2 = lattice_fcc_twinNucleationSlipPair ( 2 , index_myFamily + i )
2018-05-02 23:00:27 +05:30
if ( tau_trans ( j ) < tau_r_trans ( j , instance ) ) then
2016-02-01 16:11:39 +05:30
Ndot0_trans = ( abs ( gdot_slip ( s1 ) ) * ( state ( instance ) % rhoEdge ( s2 , of ) + state ( instance ) % rhoEdgeDip ( s2 , of ) ) + &
abs ( gdot_slip ( s2 ) ) * ( state ( instance ) % rhoEdge ( s1 , of ) + state ( instance ) % rhoEdgeDip ( s1 , of ) ) ) / &
2018-06-25 23:37:35 +05:30
( param ( instance ) % L0_trans * prm % burgers_slip ( j ) ) * &
2018-05-03 17:13:19 +05:30
( 1.0_pReal - exp ( - param ( instance ) % VcrossSlip / ( kB * Temperature ) * &
2018-05-02 23:00:27 +05:30
( tau_r_trans ( j , instance ) - tau_trans ( j ) ) ) )
2015-11-17 22:00:06 +05:30
else
Ndot0_trans = 0.0_pReal
end if
case default
2018-06-27 14:23:23 +05:30
Ndot0_trans = prm % Ndot0PerTransSystem ( j )
2015-11-17 22:00:06 +05:30
end select
2016-02-01 16:11:39 +05:30
dotState ( instance ) % strainTransFraction ( j , of ) = &
2015-11-17 22:00:06 +05:30
( 1.0_pReal - sumf - sumftr ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % martensiteVolume ( j , of ) * Ndot0_trans * exp ( - StressRatio_s )
2015-11-17 22:00:06 +05:30
!* Dotstate for accumulated shear due to transformation
2016-02-01 16:11:39 +05:30
!dotState(instance)%accshear_trans(j,of) = dotState(instance)%strainTransFraction(j,of) * &
2015-11-17 22:00:06 +05:30
! lattice_sheartrans(index_myfamily+i,ph)
2014-10-01 13:41:39 +05:30
endif
enddo
enddo
2015-02-24 15:45:07 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_dislotwin_dotState
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
2014-10-11 15:15:30 +05:30
2013-10-08 21:57:26 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
function plastic_dislotwin_postResults ( Tstar_v , Temperature , ipc , ip , el )
2013-10-08 21:57:26 +05:30
use prec , only : &
2016-05-29 14:15:03 +05:30
tol_math_check , &
2016-10-29 13:09:08 +05:30
dEq0
2013-10-08 21:57:26 +05:30
use math , only : &
pi , &
math_Mandel6to33 , &
2016-02-26 20:06:24 +05:30
math_eigenValuesSym33 , &
math_eigenValuesVectorsSym33
2013-10-08 21:57:26 +05:30
use material , only : &
material_phase , &
phase_plasticityInstance , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt
2013-10-08 21:57:26 +05:30
use lattice , only : &
lattice_Sslip_v , &
lattice_Stwin_v , &
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
lattice_NslipSystem , &
lattice_NtwinSystem , &
lattice_shearTwin , &
2014-03-09 02:20:31 +05:30
lattice_mu , &
lattice_structure , &
lattice_fcc_twinNucleationSlipPair , &
2013-11-27 21:50:27 +05:30
LATTICE_fcc_ID
2011-04-13 17:21:46 +05:30
2013-10-08 21:57:26 +05:30
implicit none
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: &
2013-10-08 21:57:26 +05:30
Tstar_v !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-03-13 12:13:49 +05:30
real ( pReal ) , intent ( in ) :: &
2013-10-16 18:34:59 +05:30
temperature !< temperature at integration point
2014-03-13 12:13:49 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-10-08 21:57:26 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
el !< element
2014-07-02 17:57:39 +05:30
2014-12-08 21:25:30 +05:30
real ( pReal ) , dimension ( plastic_dislotwin_sizePostResults ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
plastic_dislotwin_postResults
2013-10-08 21:57:26 +05:30
integer ( pInt ) :: &
2014-09-23 02:04:42 +05:30
instance , &
2014-08-14 18:48:33 +05:30
ns , nt , nr , &
2013-10-08 21:57:26 +05:30
f , o , i , c , j , index_myFamily , &
2014-07-02 17:57:39 +05:30
s1 , s2 , &
ph , &
of
2015-11-16 15:45:18 +05:30
real ( pReal ) :: sumf , tau , StressRatio_p , StressRatio_pminus1 , BoltzmannRatio , DotGamma0 , StressRatio_r , Ndot0_twin , dgdot_dtauslip , &
stressRatio
2018-05-02 23:00:27 +05:30
real ( preal ) , dimension ( totalNslip ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2013-10-08 21:57:26 +05:30
gdot_slip
real ( pReal ) , dimension ( 3 , 3 ) :: eigVectors
real ( pReal ) , dimension ( 3 ) :: eigValues
2018-06-25 23:37:35 +05:30
type ( tParameters ) , pointer :: prm
2013-10-08 21:57:26 +05:30
!* Shortened notation
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2018-05-02 23:00:27 +05:30
ns = totalNslip ( instance )
nt = totalNtwin ( instance )
nr = totalNtrans ( instance )
2014-06-11 17:41:14 +05:30
2018-06-25 23:37:35 +05:30
prm = > param ( instance )
2013-10-08 21:57:26 +05:30
!* Total twin volume fraction
2016-02-01 16:11:39 +05:30
sumf = sum ( state ( instance ) % twinFraction ( 1_pInt : nt , of ) ) ! safe for nt == 0
2013-10-08 21:57:26 +05:30
!* Required output
c = 0_pInt
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults = 0.0_pReal
do o = 1_pInt , plastic_dislotwin_Noutput ( instance )
2018-05-29 21:59:38 +05:30
select case ( param ( instance ) % outputID ( o ) )
2013-10-08 21:57:26 +05:30
2013-12-12 05:12:33 +05:30
case ( edge_density_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + ns ) = state ( instance ) % rhoEdge ( 1_pInt : ns , of )
2013-10-14 16:24:45 +05:30
c = c + ns
2013-12-12 05:12:33 +05:30
case ( dipole_density_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + ns ) = state ( instance ) % rhoEdgeDip ( 1_pInt : ns , of )
2013-10-14 16:24:45 +05:30
c = c + ns
2013-12-12 05:12:33 +05:30
case ( shear_rate_slip_ID )
2013-10-14 16:24:45 +05:30
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2015-06-17 12:23:00 +05:30
j = j + 1_pInt ! could be taken from state by now!
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Resolved shear stress on slip system
2014-07-02 17:57:39 +05:30
tau = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2013-10-14 16:24:45 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
if ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) > tol_math_check ) then
2014-03-30 20:34:06 +05:30
!* Stress ratios
2015-11-06 22:30:00 +05:30
stressRatio = ( ( abs ( tau ) - state ( ph ) % threshold_stress_slip ( j , of ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) )
StressRatio_p = stressRatio ** prm % pPerSlipFamily ( f )
StressRatio_pminus1 = stressRatio ** ( prm % pPerSlipFamily ( f ) - 1.0_pReal )
2013-10-14 16:24:45 +05:30
!* Boltzmann ratio
2018-06-27 14:23:23 +05:30
BoltzmannRatio = prm % QedgePerSlipSystem ( j ) / ( kB * Temperature )
2013-10-14 16:24:45 +05:30
!* Initial shear rates
2014-03-30 20:34:06 +05:30
DotGamma0 = &
2018-06-25 23:37:35 +05:30
state ( instance ) % rhoEdge ( j , of ) * prm % burgers_slip ( j ) * &
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem ( j )
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Shear rates due to slip
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2014-03-30 20:34:06 +05:30
DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
2018-06-27 14:23:23 +05:30
prm % qPerSlipFamily ( f ) ) * sign ( 1.0_pReal , tau )
2014-03-30 20:34:06 +05:30
else
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = 0.0_pReal
2014-03-30 20:34:06 +05:30
endif
2013-10-14 16:24:45 +05:30
enddo ; enddo
c = c + ns
2013-12-12 05:12:33 +05:30
case ( accumulated_shear_slip_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + ns ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % accshear_slip ( 1_pInt : ns , of )
2013-10-14 16:24:45 +05:30
c = c + ns
2013-12-12 05:12:33 +05:30
case ( mfp_slip_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + ns ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_slip ( 1_pInt : ns , of )
2013-10-14 16:24:45 +05:30
c = c + ns
2013-12-12 05:12:33 +05:30
case ( resolved_stress_slip_ID )
2013-10-14 16:24:45 +05:30
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2013-10-14 16:24:45 +05:30
j = j + 1_pInt
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2013-10-14 16:24:45 +05:30
enddo ; enddo
c = c + ns
2013-12-12 05:12:33 +05:30
case ( threshold_stress_slip_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + ns ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % threshold_stress_slip ( 1_pInt : ns , of )
2013-10-14 16:24:45 +05:30
c = c + ns
2013-12-12 05:12:33 +05:30
case ( edge_dipole_distance_ID )
2013-10-14 16:24:45 +05:30
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2013-10-14 16:24:45 +05:30
j = j + 1_pInt
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2018-06-25 23:37:35 +05:30
( 3.0_pReal * lattice_mu ( ph ) * prm % burgers_slip ( j ) ) / &
2014-07-02 17:57:39 +05:30
( 1 6.0_pReal * pi * abs ( dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) ) ) )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = min ( plastic_dislotwin_postResults ( c + j ) , &
2016-02-01 16:11:39 +05:30
state ( instance ) % mfp_slip ( j , of ) )
2014-12-08 21:25:30 +05:30
! plastic_dislotwin_postResults(c+j)=max(plastic_dislotwin_postResults(c+j),&
2014-09-10 17:42:17 +05:30
! plasticState(ph)%state(4*ns+2*nt+2*nr+j, of))
2013-10-14 16:24:45 +05:30
enddo ; enddo
c = c + ns
2013-12-12 05:12:33 +05:30
case ( resolved_stress_shearband_ID )
2014-07-02 17:57:39 +05:30
do j = 1_pInt , 6_pInt ! loop over all shearband families
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = dot_product ( Tstar_v , &
2018-05-02 23:00:27 +05:30
sbSv ( 1 : 6 , j , ipc , ip , el ) )
2013-10-14 16:24:45 +05:30
enddo
c = c + 6_pInt
2013-12-12 05:12:33 +05:30
case ( shear_rate_shearband_ID )
2014-07-02 17:57:39 +05:30
do j = 1_pInt , 6_pInt ! loop over all shearbands
2013-10-14 16:24:45 +05:30
!* Resolved shear stress on shearband system
2018-05-02 23:00:27 +05:30
tau = dot_product ( Tstar_v , sbSv ( 1 : 6 , j , ipc , ip , el ) )
2013-10-14 16:24:45 +05:30
!* Stress ratios
2014-03-12 05:25:40 +05:30
if ( abs ( tau ) < tol_math_check ) then
StressRatio_p = 0.0_pReal
StressRatio_pminus1 = 0.0_pReal
else
2018-05-03 20:55:56 +05:30
StressRatio_p = ( abs ( tau ) / param ( instance ) % sbResistance ) ** &
2018-05-03 17:13:19 +05:30
param ( instance ) % pShearBand
2018-05-03 20:55:56 +05:30
StressRatio_pminus1 = ( abs ( tau ) / param ( instance ) % sbResistance ) ** &
2018-05-03 17:13:19 +05:30
( param ( instance ) % pShearBand - 1.0_pReal )
2014-03-12 05:25:40 +05:30
endif
2013-10-14 16:24:45 +05:30
!* Boltzmann ratio
2018-05-03 17:13:19 +05:30
BoltzmannRatio = param ( instance ) % sbQedge / ( kB * Temperature )
2013-10-14 16:24:45 +05:30
!* Initial shear rates
2018-05-03 17:13:19 +05:30
DotGamma0 = param ( instance ) % sbVelocity
2014-03-12 05:25:40 +05:30
! Shear rate due to shear band
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2018-05-03 17:13:19 +05:30
DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** param ( instance ) % qShearBand ) * &
2014-03-12 05:25:40 +05:30
sign ( 1.0_pReal , tau )
2013-10-14 16:24:45 +05:30
enddo
c = c + 6_pInt
2013-12-12 05:12:33 +05:30
case ( twin_fraction_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( instance ) % twinFraction ( 1_pInt : nt , of )
2013-10-14 16:24:45 +05:30
c = c + nt
2013-12-12 05:12:33 +05:30
case ( shear_rate_twin_ID )
2013-10-14 16:24:45 +05:30
if ( nt > 0_pInt ) then
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2013-10-14 16:24:45 +05:30
j = j + 1_pInt
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Resolved shear stress on slip system
2014-07-02 17:57:39 +05:30
tau = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2013-10-14 16:24:45 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
if ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) > tol_math_check ) then
2014-03-30 20:34:06 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
StressRatio_p = ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) ) &
** prm % pPerSlipFamily ( f )
2016-02-01 16:11:39 +05:30
StressRatio_pminus1 = ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) ) &
** ( prm % pPerSlipFamily ( f ) - 1.0_pReal )
2013-10-14 16:24:45 +05:30
!* Boltzmann ratio
2018-06-27 14:23:23 +05:30
BoltzmannRatio = prm % QedgePerSlipSystem ( j ) / ( kB * Temperature )
2013-10-14 16:24:45 +05:30
!* Initial shear rates
2014-03-30 20:34:06 +05:30
DotGamma0 = &
2018-06-25 23:37:35 +05:30
state ( instance ) % rhoEdge ( j , of ) * prm % burgers_slip ( j ) * &
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem ( j )
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
!* Shear rates due to slip
2014-03-30 20:34:06 +05:30
gdot_slip ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
2018-06-27 14:23:23 +05:30
prm % qPerSlipFamily ( f ) ) * sign ( 1.0_pReal , tau )
2014-03-30 20:34:06 +05:30
else
gdot_slip ( j ) = 0.0_pReal
2016-01-07 17:18:30 +05:30
endif
2013-10-14 16:24:45 +05:30
enddo ; enddo
2016-01-07 17:18:30 +05:30
2013-10-14 16:24:45 +05:30
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all twin families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1 , Ntwin ( f , instance ) ! process each (active) twin system in family
2013-10-14 16:24:45 +05:30
j = j + 1_pInt
2016-01-07 17:18:30 +05:30
2014-07-02 17:57:39 +05:30
tau = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , ph ) )
2016-01-07 17:18:30 +05:30
2013-10-14 16:24:45 +05:30
!* Shear rates due to twin
if ( tau > 0.0_pReal ) then
2014-07-02 17:57:39 +05:30
select case ( lattice_structure ( ph ) )
2013-11-27 21:50:27 +05:30
case ( LATTICE_fcc_ID )
2014-03-09 02:20:31 +05:30
s1 = lattice_fcc_twinNucleationSlipPair ( 1 , index_myFamily + i )
s2 = lattice_fcc_twinNucleationSlipPair ( 2 , index_myFamily + i )
2018-05-02 23:00:27 +05:30
if ( tau < tau_r_twin ( j , instance ) ) then
2016-02-01 16:11:39 +05:30
Ndot0_twin = ( abs ( gdot_slip ( s1 ) ) * ( state ( instance ) % rhoEdge ( s2 , of ) + state ( instance ) % rhoEdgeDip ( s2 , of ) ) + &
abs ( gdot_slip ( s2 ) ) * ( state ( instance ) % rhoEdge ( s1 , of ) + state ( instance ) % rhoEdgeDip ( s1 , of ) ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % L0_twin * &
2018-06-25 23:37:35 +05:30
prm % burgers_slip ( j ) ) * &
2018-05-03 17:13:19 +05:30
( 1.0_pReal - exp ( - param ( instance ) % VcrossSlip / ( kB * Temperature ) * &
2018-05-02 23:00:27 +05:30
( tau_r_twin ( j , instance ) - tau ) ) )
2013-10-14 16:24:45 +05:30
else
2015-11-16 15:45:18 +05:30
Ndot0_twin = 0.0_pReal
2013-10-14 16:24:45 +05:30
end if
case default
2018-06-27 14:23:23 +05:30
Ndot0_twin = prm % Ndot0PerTwinSystem ( j )
2013-10-14 16:24:45 +05:30
end select
2016-02-01 16:11:39 +05:30
StressRatio_r = ( state ( instance ) % threshold_stress_twin ( j , of ) / tau ) &
2018-06-27 14:23:23 +05:30
** prm % rPerTwinFamily ( f )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2018-05-03 17:13:19 +05:30
( param ( instance ) % MaxTwinFraction - sumf ) * lattice_shearTwin ( index_myFamily + i , ph ) * &
2016-02-01 16:11:39 +05:30
state ( instance ) % twinVolume ( j , of ) * Ndot0_twin * exp ( - StressRatio_r )
2013-10-14 16:24:45 +05:30
endif
2013-10-08 21:57:26 +05:30
2013-10-14 16:24:45 +05:30
enddo ; enddo
endif
c = c + nt
2013-12-12 05:12:33 +05:30
case ( accumulated_shear_twin_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( instance ) % accshear_twin ( 1_pInt : nt , of )
2013-10-14 16:24:45 +05:30
c = c + nt
2013-12-12 05:12:33 +05:30
case ( mfp_twin_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( instance ) % mfp_twin ( 1_pInt : nt , of )
2013-10-14 16:24:45 +05:30
c = c + nt
2013-12-12 05:12:33 +05:30
case ( resolved_stress_twin_ID )
2013-10-14 16:24:45 +05:30
if ( nt > 0_pInt ) then
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all slip families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Ntwin ( f , instance ) ! process each (active) slip system in family
2013-10-14 16:24:45 +05:30
j = j + 1_pInt
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , ph ) )
2013-10-14 16:24:45 +05:30
enddo ; enddo
endif
c = c + nt
2013-12-12 05:12:33 +05:30
case ( threshold_stress_twin_ID )
2016-02-01 16:11:39 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( instance ) % threshold_stress_twin ( 1_pInt : nt , of )
2013-10-14 16:24:45 +05:30
c = c + nt
2013-12-12 05:12:33 +05:30
case ( stress_exponent_ID )
2013-10-14 16:24:45 +05:30
j = 0_pInt
2014-07-02 17:57:39 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-05-08 19:56:49 +05:30
do i = 1_pInt , Nslip ( f , instance ) ! process each (active) slip system in family
2014-03-09 02:20:31 +05:30
j = j + 1_pInt
2014-03-12 05:25:40 +05:30
2014-03-09 02:20:31 +05:30
!* Resolved shear stress on slip system
2014-07-02 17:57:39 +05:30
tau = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , ph ) )
2016-02-01 16:11:39 +05:30
if ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) > tol_math_check ) then
2014-03-30 20:34:06 +05:30
!* Stress ratios
2016-02-01 16:11:39 +05:30
StressRatio_p = ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) ) &
** prm % pPerSlipFamily ( f )
2016-02-01 16:11:39 +05:30
StressRatio_pminus1 = ( ( abs ( tau ) - state ( instance ) % threshold_stress_slip ( j , of ) ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) ) &
** ( prm % pPerSlipFamily ( f ) - 1.0_pReal )
2014-03-09 02:20:31 +05:30
!* Boltzmann ratio
2018-06-27 14:23:23 +05:30
BoltzmannRatio = prm % QedgePerSlipSystem ( j ) / ( kB * Temperature )
2014-03-09 02:20:31 +05:30
!* Initial shear rates
2014-03-30 20:34:06 +05:30
DotGamma0 = &
2018-06-25 23:37:35 +05:30
state ( instance ) % rhoEdge ( j , of ) * prm % burgers_slip ( j ) * &
2018-06-27 14:23:23 +05:30
prm % v0PerSlipSystem ( j )
2014-03-12 05:25:40 +05:30
2014-03-09 02:20:31 +05:30
!* Shear rates due to slip
2014-03-30 20:34:06 +05:30
gdot_slip ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
2018-06-27 14:23:23 +05:30
prm % qPerSlipFamily ( f ) ) * sign ( 1.0_pReal , tau )
2014-03-12 05:25:40 +05:30
2014-03-09 02:20:31 +05:30
!* Derivatives of shear rates
2014-03-30 20:34:06 +05:30
dgdot_dtauslip = &
2018-06-27 14:23:23 +05:30
abs ( gdot_slip ( j ) ) * BoltzmannRatio * prm % pPerSlipFamily ( f ) &
* prm % qPerSlipFamily ( f ) / &
2018-05-03 17:13:19 +05:30
( param ( instance ) % SolidSolutionStrength + &
2018-06-27 14:23:23 +05:30
prm % tau_peierlsPerSlipFamily ( f ) ) * &
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( prm % qPerSlipFamily ( f ) - 1.0_pReal )
2014-03-30 20:34:06 +05:30
else
gdot_slip ( j ) = 0.0_pReal
dgdot_dtauslip = 0.0_pReal
endif
2014-03-12 05:25:40 +05:30
2014-03-09 02:20:31 +05:30
!* Stress exponent
2016-05-29 14:15:03 +05:30
plastic_dislotwin_postResults ( c + j ) = &
2016-10-29 13:09:08 +05:30
merge ( 0.0_pReal , ( tau / gdot_slip ( j ) ) * dgdot_dtauslip , dEq0 ( gdot_slip ( j ) ) )
2014-03-09 02:20:31 +05:30
enddo ; enddo
c = c + ns
2013-12-12 05:12:33 +05:30
case ( sb_eigenvalues_ID )
2016-01-31 16:55:26 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + 3_pInt ) = math_eigenvaluesSym33 ( math_Mandel6to33 ( Tstar_v ) )
2013-10-14 16:24:45 +05:30
c = c + 3_pInt
2013-12-12 05:12:33 +05:30
case ( sb_eigenvectors_ID )
2016-02-26 20:06:24 +05:30
call math_eigenValuesVectorsSym33 ( math_Mandel6to33 ( Tstar_v ) , eigValues , eigVectors )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + 9_pInt ) = reshape ( eigVectors , [ 9 ] )
2013-10-14 16:24:45 +05:30
c = c + 9_pInt
2014-09-24 12:56:27 +05:30
case ( stress_trans_fraction_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nr ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % stressTransFraction ( 1_pInt : nr , of )
2014-09-24 12:56:27 +05:30
c = c + nr
case ( strain_trans_fraction_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nr ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % strainTransFraction ( 1_pInt : nr , of )
2014-09-24 12:56:27 +05:30
c = c + nr
case ( trans_fraction_ID )
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( c + 1_pInt : c + nr ) = &
2016-02-01 16:11:39 +05:30
state ( instance ) % stressTransFraction ( 1_pInt : nr , of ) + &
state ( instance ) % strainTransFraction ( 1_pInt : nr , of )
2014-09-24 12:56:27 +05:30
c = c + nr
2013-10-14 16:24:45 +05:30
end select
2013-10-08 21:57:26 +05:30
enddo
2014-12-08 21:25:30 +05:30
end function plastic_dislotwin_postResults
2013-10-08 21:57:26 +05:30
2016-02-26 20:06:24 +05:30
end module plastic_dislotwin