2011-04-13 16:54:36 +05:30
! Copyright 2011 Max-Planck-Institut für Eisenforschung GmbH
!
! This file is part of DAMASK,
! the Düsseldorf Advanced MAterial Simulation Kit.
!
! DAMASK is free software: you can redistribute it and/or modify
! it under the terms of the GNU General Public License as published by
! the Free Software Foundation, either version 3 of the License, or
! (at your option) any later version.
!
! DAMASK is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with DAMASK. If not, see <http://www.gnu.org/licenses/>.
!
2011-04-13 17:21:46 +05:30
!##############################################################
!* $Id$
!************************************
!* Module: CONSTITUTIVE *
!************************************
MODULE constitutive_dislotwin
!* Include other modules
use prec , only : pReal , pInt
implicit none
!* Lists of states and physical parameters
character ( len = * ) , parameter :: constitutive_dislotwin_label = 'dislotwin'
character ( len = 18 ) , dimension ( 2 ) , parameter :: constitutive_dislotwin_listBasicSlipStates = ( / 'rhoEdge ' , &
'rhoEdgeDip' / )
character ( len = 18 ) , dimension ( 1 ) , parameter :: constitutive_dislotwin_listBasicTwinStates = ( / 'twinFraction' / )
character ( len = 18 ) , dimension ( 4 ) , parameter :: constitutive_dislotwin_listDependentSlipStates = ( / 'invLambdaSlip ' , &
'invLambdaSlipTwin' , &
'meanFreePathSlip ' , &
'tauSlipThreshold ' / )
character ( len = 18 ) , dimension ( 4 ) , parameter :: constitutive_dislotwin_listDependentTwinStates = ( / 'invLambdaTwin ' , &
'meanFreePathTwin' , &
'tauTwinThreshold' , &
'twinVolume ' / )
real ( pReal ) , parameter :: kB = 1.38e-23_pReal ! Boltzmann constant in J/Kelvin
!* Definition of global variables
2012-11-14 15:52:34 +05:30
integer ( pInt ) , dimension ( : ) , allocatable :: constitutive_dislotwin_sizeDotState , & ! number of dotStates
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_sizeState , & ! total number of microstructural state variables
constitutive_dislotwin_sizePostResults ! cumulative size of post results
2012-11-14 15:52:34 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable , target :: constitutive_dislotwin_sizePostResult ! size of each post result output
2011-04-13 17:21:46 +05:30
character ( len = 64 ) , dimension ( : , : ) , allocatable , target :: constitutive_dislotwin_output ! name of each post result output
2012-11-14 15:52:34 +05:30
integer ( pInt ) , dimension ( : ) , allocatable :: constitutive_dislotwin_Noutput ! number of outputs per instance of this plasticity
character ( len = 32 ) , dimension ( : ) , allocatable :: constitutive_dislotwin_structureName ! name of the lattice structure
integer ( pInt ) , dimension ( : ) , allocatable :: constitutive_dislotwin_structure , & ! number representing the kind of lattice structure
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_totalNslip , & ! total number of active slip systems for each instance
constitutive_dislotwin_totalNtwin ! total number of active twin systems for each instance
2012-11-14 15:52:34 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable :: constitutive_dislotwin_Nslip , & ! number of active slip systems for each family and instance
constitutive_dislotwin_Ntwin ! number of active twin systems for each family and instance
real ( pReal ) , dimension ( : ) , allocatable :: constitutive_dislotwin_CoverA , & ! c/a ratio for hex type lattice
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_Gmod , & ! shear modulus
constitutive_dislotwin_CAtomicVolume , & ! atomic volume in Bugers vector unit
constitutive_dislotwin_D0 , & ! prefactor for self-diffusion coefficient
constitutive_dislotwin_Qsd , & ! activation energy for dislocation climb
constitutive_dislotwin_GrainSize , & ! grain size
constitutive_dislotwin_p , & ! p-exponent in glide velocity
constitutive_dislotwin_q , & ! q-exponent in glide velocity
constitutive_dislotwin_MaxTwinFraction , & ! maximum allowed total twin volume fraction
constitutive_dislotwin_r , & ! r-exponent in twin nucleation rate
constitutive_dislotwin_CEdgeDipMinDistance , & !
constitutive_dislotwin_Cmfptwin , & !
constitutive_dislotwin_Cthresholdtwin , & !
constitutive_dislotwin_SolidSolutionStrength , & ! Strength due to elements in solid solution
constitutive_dislotwin_L0 , & ! Length of twin nuclei in Burgers vectors
2011-09-16 21:25:18 +05:30
constitutive_dislotwin_sbResistance , & ! FIXED (for now) value for shearband resistance (might become an internal state variable at some point)
constitutive_dislotwin_sbVelocity , & ! FIXED (for now) value for shearband velocity_0
2012-05-22 21:40:28 +05:30
constitutive_dislotwin_sbQedge , & ! FIXED (for now) value for shearband systems Qedge
2011-09-26 15:25:08 +05:30
constitutive_dislotwin_SFE_0K , & ! stacking fault energy at zero K
constitutive_dislotwin_dSFE_dT , & ! temperature dependance of stacking fault energy
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_aTolRho ! absolute tolerance for integration of dislocation density
real ( pReal ) , dimension ( : , : , : ) , allocatable :: constitutive_dislotwin_Cslip_66 ! elasticity matrix in Mandel notation for each instance
real ( pReal ) , dimension ( : , : , : , : ) , allocatable :: constitutive_dislotwin_Ctwin_66 ! twin elasticity matrix in Mandel notation for each instance
real ( pReal ) , dimension ( : , : , : , : , : ) , allocatable :: constitutive_dislotwin_Cslip_3333 ! elasticity matrix for each instance
real ( pReal ) , dimension ( : , : , : , : , : , : ) , allocatable :: constitutive_dislotwin_Ctwin_3333 ! twin elasticity matrix for each instance
2012-11-14 15:52:34 +05:30
real ( pReal ) , dimension ( : , : ) , allocatable :: constitutive_dislotwin_rhoEdge0 , & ! initial edge dislocation density per slip system for each family and instance
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_rhoEdgeDip0 , & ! initial edge dipole density per slip system for each family and instance
constitutive_dislotwin_burgersPerSlipFamily , & ! absolute length of burgers vector [m] for each slip family and instance
constitutive_dislotwin_burgersPerSlipSystem , & ! absolute length of burgers vector [m] for each slip system and instance
constitutive_dislotwin_burgersPerTwinFamily , & ! absolute length of burgers vector [m] for each twin family and instance
constitutive_dislotwin_burgersPerTwinSystem , & ! absolute length of burgers vector [m] for each twin system and instance
constitutive_dislotwin_QedgePerSlipFamily , & ! activation energy for glide [J] for each slip family and instance
constitutive_dislotwin_QedgePerSlipSystem , & ! activation energy for glide [J] for each slip system and instance
constitutive_dislotwin_v0PerSlipFamily , & ! dislocation velocity prefactor [m/s] for each family and instance
constitutive_dislotwin_v0PerSlipSystem , & ! dislocation velocity prefactor [m/s] for each slip system and instance
constitutive_dislotwin_Ndot0PerTwinFamily , & ! twin nucleation rate [1/m³s] for each twin family and instance
constitutive_dislotwin_Ndot0PerTwinSystem , & ! twin nucleation rate [1/m³s] for each twin system and instance
constitutive_dislotwin_twinsizePerTwinFamily , & ! twin thickness [m] for each twin family and instance
constitutive_dislotwin_twinsizePerTwinSystem , & ! twin thickness [m] for each twin system and instance
constitutive_dislotwin_CLambdaSlipPerSlipFamily , & ! Adj. parameter for distance between 2 forest dislocations for each slip family and instance
constitutive_dislotwin_CLambdaSlipPerSlipSystem , & ! Adj. parameter for distance between 2 forest dislocations for each slip system and instance
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interaction_SlipSlip , & ! coefficients for slip-slip interaction for each interaction type and instance
constitutive_dislotwin_interaction_SlipTwin , & ! coefficients for slip-twin interaction for each interaction type and instance
constitutive_dislotwin_interaction_TwinSlip , & ! coefficients for twin-slip interaction for each interaction type and instance
constitutive_dislotwin_interaction_TwinTwin ! coefficients for twin-twin interaction for each interaction type and instance
real ( pReal ) , dimension ( : , : , : ) , allocatable :: constitutive_dislotwin_interactionMatrix_SlipSlip , & ! interaction matrix of the different slip systems for each instance
constitutive_dislotwin_interactionMatrix_SlipTwin , & ! interaction matrix of slip systems with twin systems for each instance
constitutive_dislotwin_interactionMatrix_TwinSlip , & ! interaction matrix of twin systems with slip systems for each instance
constitutive_dislotwin_interactionMatrix_TwinTwin , & ! interaction matrix of the different twin systems for each instance
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_forestProjectionEdge ! matrix of forest projections of edge dislocations for each instance
2012-11-14 15:52:34 +05:30
real ( pReal ) , dimension ( : , : , : , : , : ) , allocatable :: constitutive_dislotwin_sbSv
2012-01-11 22:26:35 +05:30
2011-04-13 17:21:46 +05:30
CONTAINS
!****************************************
!* - constitutive_dislotwin_init
!* - constitutive_dislotwin_stateInit
!* - constitutive_dislotwin_relevantState
!* - constitutive_dislotwin_homogenizedC
!* - constitutive_dislotwin_microstructure
!* - constitutive_dislotwin_LpAndItsTangent
2012-05-16 20:13:26 +05:30
!* - constitutive_dislotwin_dotState
!* - constitutive_dislotwin_deltaState
2011-04-13 17:21:46 +05:30
!* - constitutive_dislotwin_dotTemperature
2012-05-16 20:13:26 +05:30
!* - constitutive_dislotwin_postResults
2011-04-13 17:21:46 +05:30
!****************************************
subroutine constitutive_dislotwin_init ( file )
!**************************************
!* Module initialization *
!**************************************
2012-02-21 21:30:00 +05:30
use , intrinsic :: iso_fortran_env ! to get compiler_version and compiler_options (at least for gfortran 4.6 at the moment)
2011-04-13 17:21:46 +05:30
use prec , only : pInt , pReal
use math , only : math_Mandel3333to66 , math_Voigt66to3333 , math_mul3x3
2011-09-16 21:25:18 +05:30
use mesh , only : mesh_maxNips , mesh_NcpElems
2011-04-13 17:21:46 +05:30
use IO
use material
use lattice
!* Input variables
integer ( pInt ) , intent ( in ) :: file
!* Local variables
2012-02-21 21:30:00 +05:30
integer ( pInt ) , parameter :: maxNchunks = 21_pInt
2011-04-13 17:21:46 +05:30
integer ( pInt ) , dimension ( 1 + 2 * maxNchunks ) :: positions
2012-02-21 21:30:00 +05:30
integer ( pInt ) :: section , maxNinstance , mySize , myStructure , maxTotalNslip , maxTotalNtwin , &
2012-11-14 20:03:41 +05:30
f , i , j , k , l , m , n , o , p , q , r , s , ns , nt , &
index_myFamily , index_otherFamily
2011-04-13 17:21:46 +05:30
character ( len = 64 ) tag
2013-01-09 03:41:59 +05:30
character ( len = 1024 ) :: line = '' ! to start initialized
write ( 6 , * )
write ( 6 , * ) '<<<+- constitutive_' , trim ( constitutive_dislotwin_label ) , ' init -+>>>'
write ( 6 , * ) '$Id$'
2012-02-01 00:48:55 +05:30
#include "compilation_info.f90"
2011-04-13 17:21:46 +05:30
2012-03-12 19:39:37 +05:30
maxNinstance = int ( count ( phase_plasticity == constitutive_dislotwin_label ) , pInt )
2012-02-21 21:30:00 +05:30
if ( maxNinstance == 0_pInt ) return
2011-04-13 17:21:46 +05:30
!* Space allocation for global variables
allocate ( constitutive_dislotwin_sizeDotState ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sizeDotState = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_sizeState ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sizeState = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_sizePostResults ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sizePostResults = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_sizePostResult ( maxval ( phase_Noutput ) , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sizePostResult = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_output ( maxval ( phase_Noutput ) , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_output = ''
2012-02-14 20:49:59 +05:30
allocate ( constitutive_dislotwin_Noutput ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Noutput = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_structureName ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_structureName = ''
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_structure ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_structure = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Nslip ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Nslip = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Ntwin ( lattice_maxNtwinFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Ntwin = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_totalNslip ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_totalNslip = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_totalNtwin ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_totalNtwin = 0_pInt
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_CoverA ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_CoverA = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Gmod ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Gmod = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_CAtomicVolume ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_CAtomicVolume = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_D0 ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_D0 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Qsd ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Qsd = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_GrainSize ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_GrainSize = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_p ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_p = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_q ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_q = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_MaxTwinFraction ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_MaxTwinFraction = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_r ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_r = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_CEdgeDipMinDistance ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_CEdgeDipMinDistance = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Cmfptwin ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Cmfptwin = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Cthresholdtwin ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Cthresholdtwin = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_SolidSolutionStrength ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_SolidSolutionStrength = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_L0 ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_L0 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_aTolRho ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_aTolRho = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Cslip_66 ( 6 , 6 , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Cslip_66 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Cslip_3333 ( 3 , 3 , 3 , 3 , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Cslip_3333 = 0.0_pReal
2011-09-16 21:25:18 +05:30
allocate ( constitutive_dislotwin_sbResistance ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sbResistance = 0.0_pReal
2011-09-16 21:25:18 +05:30
allocate ( constitutive_dislotwin_sbVelocity ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sbVelocity = 0.0_pReal
2012-05-22 21:40:28 +05:30
allocate ( constitutive_dislotwin_sbQedge ( maxNinstance ) )
constitutive_dislotwin_sbQedge = 0.0_pReal
2011-09-26 15:25:08 +05:30
allocate ( constitutive_dislotwin_SFE_0K ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_SFE_0K = 0.0_pReal
2011-09-26 15:25:08 +05:30
allocate ( constitutive_dislotwin_dSFE_dT ( maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_dSFE_dT = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_rhoEdge0 ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_rhoEdge0 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_rhoEdgeDip0 ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_rhoEdgeDip0 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_burgersPerSlipFamily ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_burgersPerSlipFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_burgersPerTwinFamily ( lattice_maxNtwinFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_burgersPerTwinFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_QedgePerSlipFamily ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_QedgePerSlipFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_v0PerSlipFamily ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_v0PerSlipFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Ndot0PerTwinFamily ( lattice_maxNtwinFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Ndot0PerTwinFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_twinsizePerTwinFamily ( lattice_maxNtwinFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_twinsizePerTwinFamily = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_CLambdaSlipPerSlipFamily ( lattice_maxNslipFamily , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_CLambdaSlipPerSlipFamily = 0.0_pReal
2012-11-14 15:52:34 +05:30
allocate ( constitutive_dislotwin_interaction_SlipSlip ( lattice_maxNinteraction , maxNinstance ) )
constitutive_dislotwin_interaction_SlipSlip = 0.0_pReal
allocate ( constitutive_dislotwin_interaction_SlipTwin ( lattice_maxNinteraction , maxNinstance ) )
constitutive_dislotwin_interaction_SlipTwin = 0.0_pReal
allocate ( constitutive_dislotwin_interaction_TwinSlip ( lattice_maxNinteraction , maxNinstance ) )
constitutive_dislotwin_interaction_TwinSlip = 0.0_pReal
allocate ( constitutive_dislotwin_interaction_TwinTwin ( lattice_maxNinteraction , maxNinstance ) )
constitutive_dislotwin_interaction_TwinTwin = 0.0_pReal
2011-09-16 21:25:18 +05:30
allocate ( constitutive_dislotwin_sbSv ( 6 , 6 , homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_sbSv = 0.0_pReal
2011-04-13 17:21:46 +05:30
!* Readout data from material.config file
rewind ( file )
line = ''
2012-02-21 21:30:00 +05:30
section = 0_pInt
2011-04-13 17:21:46 +05:30
do while ( IO_lc ( IO_getTag ( line , '<' , '>' ) ) / = 'phase' ) ! wind forward to <phase>
read ( file , '(a1024)' , END = 100 ) line
enddo
do ! read thru sections of phase part
read ( file , '(a1024)' , END = 100 ) line
2012-02-14 05:00:59 +05:30
if ( IO_isBlank ( line ) ) cycle ! skip empty lines
if ( IO_getTag ( line , '<' , '>' ) / = '' ) exit ! stop at next part
if ( IO_getTag ( line , '[' , ']' ) / = '' ) then ! next section
section = section + 1_pInt ! advance section counter
cycle
2011-04-13 17:21:46 +05:30
endif
2012-03-12 19:39:37 +05:30
if ( section > 0_pInt . and . phase_plasticity ( section ) == constitutive_dislotwin_label ) then ! one of my sections
2012-03-12 20:13:19 +05:30
i = phase_plasticityInstance ( section ) ! which instance of my plasticity is present phase
2011-04-13 17:21:46 +05:30
positions = IO_stringPos ( line , maxNchunks )
2012-02-21 21:30:00 +05:30
tag = IO_lc ( IO_stringValue ( line , positions , 1_pInt ) ) ! extract key
2011-04-13 17:21:46 +05:30
select case ( tag )
2012-03-15 14:52:24 +05:30
case ( 'plasticity' , 'elasticity' )
2012-02-14 14:52:37 +05:30
cycle
2011-04-13 17:21:46 +05:30
case ( '(output)' )
2012-02-14 20:49:59 +05:30
constitutive_dislotwin_Noutput ( i ) = constitutive_dislotwin_Noutput ( i ) + 1_pInt
constitutive_dislotwin_output ( constitutive_dislotwin_Noutput ( i ) , i ) = IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2011-04-13 17:21:46 +05:30
case ( 'lattice_structure' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_structureName ( i ) = IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2011-04-13 17:21:46 +05:30
case ( 'covera_ratio' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_CoverA ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'c11' )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Cslip_66 ( 1 , 1 , i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'c12' )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Cslip_66 ( 1 , 2 , i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'c13' )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Cslip_66 ( 1 , 3 , i ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'c22' )
constitutive_dislotwin_Cslip_66 ( 2 , 2 , i ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'c23' )
constitutive_dislotwin_Cslip_66 ( 2 , 3 , i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'c33' )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Cslip_66 ( 3 , 3 , i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'c44' )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Cslip_66 ( 4 , 4 , i ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'c55' )
constitutive_dislotwin_Cslip_66 ( 5 , 5 , i ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'c66' )
constitutive_dislotwin_Cslip_66 ( 6 , 6 , i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'nslip' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Nslip ( j , i ) = IO_intValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'ntwin' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNtwinFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Ntwin ( j , i ) = IO_intValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'rhoedge0' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_rhoEdge0 ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'rhoedgedip0' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_rhoEdgeDip0 ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'slipburgers' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_burgersPerSlipFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'twinburgers' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNtwinFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_burgersPerTwinFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'qedge' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_QedgePerSlipFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'v0' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_v0PerSlipFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'ndot0' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNtwinFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Ndot0PerTwinFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'twinsize' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNtwinFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_twinsizePerTwinFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'clambdaslip' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNslipFamily
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_CLambdaSlipPerSlipFamily ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-04-13 17:21:46 +05:30
case ( 'grainsize' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_GrainSize ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'maxtwinfraction' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_MaxTwinFraction ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'pexponent' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_p ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'qexponent' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_q ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'rexponent' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_r ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'd0' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_D0 ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'qsd' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Qsd ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'atol_rho' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_aTolRho ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'cmfptwin' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Cmfptwin ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'cthresholdtwin' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_Cthresholdtwin ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'solidsolutionstrength' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_SolidSolutionStrength ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'l0' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_L0 ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'cedgedipmindistance' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_CEdgeDipMinDistance ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-04-13 17:21:46 +05:30
case ( 'catomicvolume' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_CAtomicVolume ( i ) = IO_floatValue ( line , positions , 2_pInt )
2012-11-14 15:52:34 +05:30
case ( 'interaction_slipslip' , 'interactionslipslip' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNinteraction
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interaction_SlipSlip ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2012-11-14 15:52:34 +05:30
case ( 'interaction_sliptwin' , 'interactionsliptwin' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNinteraction
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interaction_SlipTwin ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2012-11-14 15:52:34 +05:30
case ( 'interaction_twinslip' , 'interactiontwinslip' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNinteraction
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interaction_TwinSlip ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2012-11-14 15:52:34 +05:30
case ( 'interaction_twintwin' , 'interactiontwintwin' )
2013-02-06 22:15:34 +05:30
do j = 1_pInt , lattice_maxNinteraction
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interaction_TwinTwin ( j , i ) = IO_floatValue ( line , positions , 1_pInt + j )
2013-02-06 22:15:34 +05:30
enddo
2011-09-26 15:25:08 +05:30
case ( 'sfe_0k' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_SFE_0K ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-09-26 15:25:08 +05:30
case ( 'dsfe_dt' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_dSFE_dT ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-09-16 21:25:18 +05:30
case ( 'shearbandresistance' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_sbResistance ( i ) = IO_floatValue ( line , positions , 2_pInt )
2011-09-16 21:25:18 +05:30
case ( 'shearbandvelocity' )
2012-02-13 19:48:07 +05:30
constitutive_dislotwin_sbVelocity ( i ) = IO_floatValue ( line , positions , 2_pInt )
2012-05-22 21:40:28 +05:30
case ( 'qedgepersbsystem' )
constitutive_dislotwin_sbQedge ( i ) = IO_floatValue ( line , positions , 2_pInt )
2012-02-14 14:52:37 +05:30
case default
2012-07-17 23:06:24 +05:30
call IO_error ( 210_pInt , ext_msg = tag / / ' (' / / constitutive_dislotwin_label / / ')' )
2011-04-13 17:21:46 +05:30
end select
endif
enddo
2012-02-13 19:48:07 +05:30
100 do i = 1_pInt , maxNinstance
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_structure ( i ) = &
lattice_initializeStructure ( constitutive_dislotwin_structureName ( i ) , constitutive_dislotwin_CoverA ( i ) )
myStructure = constitutive_dislotwin_structure ( i )
!* Sanity checks
2012-07-17 23:06:24 +05:30
if ( myStructure < 1_pInt ) call IO_error ( 205_pInt , e = i )
if ( sum ( constitutive_dislotwin_Nslip ( : , i ) ) < 0_pInt ) call IO_error ( 211_pInt , e = i , ext_msg = 'Nslip (' &
/ / constitutive_dislotwin_label / / ')' )
if ( sum ( constitutive_dislotwin_Ntwin ( : , i ) ) < 0_pInt ) call IO_error ( 211_pInt , e = i , ext_msg = 'Ntwin (' &
/ / constitutive_dislotwin_label / / ')' )
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily
2011-04-13 17:21:46 +05:30
if ( constitutive_dislotwin_Nslip ( f , i ) > 0_pInt ) then
2012-07-17 23:06:24 +05:30
if ( constitutive_dislotwin_rhoEdge0 ( f , i ) < 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'rhoEdge0 (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_rhoEdgeDip0 ( f , i ) < 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'rhoEdgeDip0 (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_burgersPerSlipFamily ( f , i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'slipBurgers (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_v0PerSlipFamily ( f , i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'v0 (' &
/ / constitutive_dislotwin_label / / ')' )
2011-04-13 17:21:46 +05:30
endif
enddo
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNtwinFamily
2011-09-13 13:48:43 +05:30
if ( constitutive_dislotwin_Ntwin ( f , i ) > 0_pInt ) then
2012-07-17 23:06:24 +05:30
if ( constitutive_dislotwin_burgersPerTwinFamily ( f , i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'twinburgers (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_Ndot0PerTwinFamily ( f , i ) < 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'ndot0 (' &
/ / constitutive_dislotwin_label / / ')' )
2011-04-13 17:21:46 +05:30
endif
enddo
2012-07-17 23:06:24 +05:30
if ( constitutive_dislotwin_CAtomicVolume ( i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'cAtomicVolume (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_D0 ( i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'D0 (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_Qsd ( i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'Qsd (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_aTolRho ( i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'aTolRho (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_sbResistance ( i ) < = 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'sbResistance (' &
/ / constitutive_dislotwin_label / / ')' )
if ( constitutive_dislotwin_sbVelocity ( i ) < 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'sbVelocity (' &
/ / constitutive_dislotwin_label / / ')' )
2012-02-13 23:11:27 +05:30
if ( constitutive_dislotwin_SFE_0K ( i ) == 0.0_pReal . AND . &
2012-07-17 23:06:24 +05:30
constitutive_dislotwin_dSFE_dT ( i ) == 0.0_pReal ) call IO_error ( 211_pInt , e = i , ext_msg = 'SFE (' &
/ / constitutive_dislotwin_label / / ')' )
2011-04-13 17:21:46 +05:30
!* Determine total number of active slip or twin systems
constitutive_dislotwin_Nslip ( : , i ) = min ( lattice_NslipSystem ( : , myStructure ) , constitutive_dislotwin_Nslip ( : , i ) )
constitutive_dislotwin_Ntwin ( : , i ) = min ( lattice_NtwinSystem ( : , myStructure ) , constitutive_dislotwin_Ntwin ( : , i ) )
constitutive_dislotwin_totalNslip ( i ) = sum ( constitutive_dislotwin_Nslip ( : , i ) )
constitutive_dislotwin_totalNtwin ( i ) = sum ( constitutive_dislotwin_Ntwin ( : , i ) )
enddo
!* Allocation of variables whose size depends on the total number of active slip systems
maxTotalNslip = maxval ( constitutive_dislotwin_totalNslip )
maxTotalNtwin = maxval ( constitutive_dislotwin_totalNtwin )
2012-06-19 21:36:25 +05:30
!write(6,*) 'nslip',i,constitutive_dislotwin_totalNslip(i),maxTotalNslip
!write(6,*) 'ntwin',i,constitutive_dislotwin_totalNtwin(i),maxTotalNtwin
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_burgersPerSlipSystem ( maxTotalNslip , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_burgersPerSlipSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_burgersPerTwinSystem ( maxTotalNtwin , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_burgersPerTwinSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_QedgePerSlipSystem ( maxTotalNslip , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_QedgePerSlipSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_v0PerSlipSystem ( maxTotalNslip , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_v0PerSlipSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Ndot0PerTwinSystem ( maxTotalNtwin , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Ndot0PerTwinSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_twinsizePerTwinSystem ( maxTotalNtwin , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_twinsizePerTwinSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_CLambdaSlipPerSlipSystem ( maxTotalNslip , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_CLambdaSlipPerSlipSystem = 0.0_pReal
2011-04-13 17:21:46 +05:30
2012-11-14 15:52:34 +05:30
allocate ( constitutive_dislotwin_interactionMatrix_SlipSlip ( maxTotalNslip , maxTotalNslip , maxNinstance ) )
constitutive_dislotwin_interactionMatrix_SlipSlip = 0.0_pReal
allocate ( constitutive_dislotwin_interactionMatrix_SlipTwin ( maxTotalNslip , maxTotalNtwin , maxNinstance ) )
constitutive_dislotwin_interactionMatrix_SlipTwin = 0.0_pReal
allocate ( constitutive_dislotwin_interactionMatrix_TwinSlip ( maxTotalNtwin , maxTotalNslip , maxNinstance ) )
constitutive_dislotwin_interactionMatrix_TwinSlip = 0.0_pReal
allocate ( constitutive_dislotwin_interactionMatrix_TwinTwin ( maxTotalNtwin , maxTotalNtwin , maxNinstance ) )
constitutive_dislotwin_interactionMatrix_TwinTwin = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_forestProjectionEdge ( maxTotalNslip , maxTotalNslip , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_forestProjectionEdge = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Ctwin_66 ( 6 , 6 , maxTotalNtwin , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Ctwin_66 = 0.0_pReal
2011-04-13 17:21:46 +05:30
allocate ( constitutive_dislotwin_Ctwin_3333 ( 3 , 3 , 3 , 3 , maxTotalNtwin , maxNinstance ) )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_Ctwin_3333 = 0.0_pReal
2011-04-13 17:21:46 +05:30
2012-02-13 19:48:07 +05:30
do i = 1_pInt , maxNinstance
2011-04-13 17:21:46 +05:30
myStructure = constitutive_dislotwin_structure ( i )
ns = constitutive_dislotwin_totalNslip ( i )
nt = constitutive_dislotwin_totalNtwin ( i )
2012-11-14 15:52:34 +05:30
! write(6,*) 'instance',i,'has nslip and ntwin',ns,nt
!* Determine size of state array
constitutive_dislotwin_sizeDotState ( i ) = int ( size ( constitutive_dislotwin_listBasicSlipStates ) , pInt ) * ns &
+ int ( size ( constitutive_dislotwin_listBasicTwinStates ) , pInt ) * nt
constitutive_dislotwin_sizeState ( i ) = constitutive_dislotwin_sizeDotState ( i ) &
+ int ( size ( constitutive_dislotwin_listDependentSlipStates ) , pInt ) * ns &
+ int ( size ( constitutive_dislotwin_listDependentTwinStates ) , pInt ) * nt
2011-04-13 17:21:46 +05:30
!* Determine size of postResults array
2012-02-14 20:49:59 +05:30
do o = 1_pInt , constitutive_dislotwin_Noutput ( i )
2011-04-13 17:21:46 +05:30
select case ( constitutive_dislotwin_output ( o , i ) )
case ( 'edge_density' , &
'dipole_density' , &
'shear_rate_slip' , &
'mfp_slip' , &
'resolved_stress_slip' , &
'threshold_stress_slip' , &
'edge_dipole_distance' , &
'stress_exponent' &
)
2012-06-19 21:36:25 +05:30
mySize = ns
2011-04-13 17:21:46 +05:30
case ( 'twin_fraction' , &
'shear_rate_twin' , &
'mfp_twin' , &
'resolved_stress_twin' , &
'threshold_stress_twin' &
)
2012-06-19 21:36:25 +05:30
mySize = nt
2011-09-16 21:25:18 +05:30
case ( 'resolved_stress_shearband' , &
'shear_rate_shearband' &
)
mySize = 6_pInt
case ( 'schmid_factor_shearband' )
mySize = 6_pInt
case ( 'sb_eigenvalues' )
mySize = 3_pInt
case ( 'sb_eigenvectors' )
mySize = 9_pInt
2011-04-13 17:21:46 +05:30
case default
2012-07-17 23:06:24 +05:30
call IO_error ( 212_pInt , ext_msg = constitutive_dislotwin_output ( o , i ) / / ' (' / / constitutive_dislotwin_label / / ')' )
2011-04-13 17:21:46 +05:30
end select
if ( mySize > 0_pInt ) then ! any meaningful output found
constitutive_dislotwin_sizePostResult ( o , i ) = mySize
constitutive_dislotwin_sizePostResults ( i ) = constitutive_dislotwin_sizePostResults ( i ) + mySize
endif
enddo
2012-06-19 21:36:25 +05:30
2011-04-13 17:21:46 +05:30
!* Elasticity matrix and shear modulus according to material.config
2013-01-22 18:32:23 +05:30
constitutive_dislotwin_Cslip_66 ( 1 : 6 , 1 : 6 , i ) = lattice_symmetrizeC66 ( constitutive_dislotwin_structureName ( i ) , &
2013-01-22 21:18:47 +05:30
constitutive_dislotwin_Cslip_66 ( : , : , i ) )
2013-01-22 03:27:26 +05:30
constitutive_dislotwin_Gmod ( i ) = &
2013-01-22 18:32:23 +05:30
0.2_pReal * ( constitutive_dislotwin_Cslip_66 ( 1 , 1 , i ) - constitutive_dislotwin_Cslip_66 ( 1 , 2 , i ) ) &
2013-01-29 20:29:26 +05:30
+ 0.6_pReal * constitutive_dislotwin_Cslip_66 ( 4 , 4 , i ) ! (C11iso-C12iso)/2 with C11iso=(3*C11+2*C12+4*C44)/5 and C12iso=(C11+4*C12-2*C44)/5
2013-01-22 18:32:23 +05:30
constitutive_dislotwin_Cslip_66 ( 1 : 6 , 1 : 6 , i ) = &
math_Mandel3333to66 ( math_Voigt66to3333 ( constitutive_dislotwin_Cslip_66 ( 1 : 6 , 1 : 6 , i ) ) )
constitutive_dislotwin_Cslip_3333 ( 1 : 3 , 1 : 3 , 1 : 3 , 1 : 3 , i ) = &
math_Voigt66to3333 ( constitutive_dislotwin_Cslip_66 ( 1 : 6 , 1 : 6 , i ) )
2011-04-13 17:21:46 +05:30
2012-11-14 15:52:34 +05:30
!* Process slip related parameters ------------------------------------------------
2011-04-13 17:21:46 +05:30
2012-11-14 15:52:34 +05:30
do f = 1_pInt , lattice_maxNslipFamily
index_myFamily = sum ( constitutive_dislotwin_Nslip ( 1 : f - 1_pInt , i ) ) ! index in truncated slip system list
do j = 1_pInt , constitutive_dislotwin_Nslip ( f , i ) ! system in family
!* Burgers vector,
! dislocation velocity prefactor,
! mean free path prefactor,
! and minimum dipole distance
constitutive_dislotwin_burgersPerSlipSystem ( index_myFamily + j , i ) = constitutive_dislotwin_burgersPerSlipFamily ( f , i )
constitutive_dislotwin_QedgePerSlipSystem ( index_myFamily + j , i ) = constitutive_dislotwin_QedgePerSlipFamily ( f , i )
constitutive_dislotwin_v0PerSlipSystem ( index_myFamily + j , i ) = constitutive_dislotwin_v0PerSlipFamily ( f , i )
constitutive_dislotwin_CLambdaSlipPerSlipSystem ( index_myFamily + j , i ) = constitutive_dislotwin_CLambdaSlipPerSlipFamily ( f , i )
!* Interaction matrices
do o = 1_pInt , lattice_maxNslipFamily
index_otherFamily = sum ( constitutive_dislotwin_Nslip ( 1 : o - 1_pInt , i ) )
do k = 1_pInt , constitutive_dislotwin_Nslip ( o , i ) ! loop over (active) systems in other family (slip)
constitutive_dislotwin_interactionMatrix_SlipSlip ( index_myFamily + j , index_otherFamily + k , i ) = &
constitutive_dislotwin_interaction_SlipSlip ( lattice_interactionSlipSlip ( &
sum ( lattice_NslipSystem ( 1 : f - 1 , myStructure ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1 , myStructure ) ) + k , &
myStructure ) , i )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
index_otherFamily = sum ( constitutive_dislotwin_Ntwin ( 1 : o - 1_pInt , i ) )
do k = 1_pInt , constitutive_dislotwin_Ntwin ( o , i ) ! loop over (active) systems in other family (twin)
constitutive_dislotwin_interactionMatrix_SlipTwin ( index_myFamily + j , index_otherFamily + k , i ) = &
constitutive_dislotwin_interaction_SlipTwin ( lattice_interactionSlipTwin ( &
sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , myStructure ) ) + k , &
myStructure ) , i )
enddo ; enddo
enddo ! slip system in family
enddo ! slip families
!* Process twin related parameters ------------------------------------------------
do f = 1_pInt , lattice_maxNtwinFamily
index_myFamily = sum ( constitutive_dislotwin_Ntwin ( 1 : f - 1_pInt , i ) ) ! index in truncated twin system list
do j = 1_pInt , constitutive_dislotwin_Ntwin ( f , i ) ! system in family
!* Burgers vector,
! nucleation rate prefactor,
! and twin size
constitutive_dislotwin_burgersPerTwinSystem ( index_myFamily + j , i ) = constitutive_dislotwin_burgersPerTwinFamily ( f , i )
constitutive_dislotwin_Ndot0PerTwinSystem ( index_myFamily + j , i ) = constitutive_dislotwin_Ndot0PerTwinFamily ( f , i )
constitutive_dislotwin_twinsizePerTwinSystem ( index_myFamily + j , i ) = constitutive_dislotwin_twinsizePerTwinFamily ( f , i )
!* Rotate twin elasticity matrices
index_otherFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) ! index in full lattice twin 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
constitutive_dislotwin_Ctwin_3333 ( l , m , n , o , index_myFamily + j , i ) = &
constitutive_dislotwin_Ctwin_3333 ( l , m , n , o , index_myFamily + j , i ) + &
constitutive_dislotwin_Cslip_3333 ( p , q , r , s , i ) * &
lattice_Qtwin ( l , p , index_otherFamily + j , myStructure ) * &
lattice_Qtwin ( m , q , index_otherFamily + j , myStructure ) * &
lattice_Qtwin ( n , r , index_otherFamily + j , myStructure ) * &
lattice_Qtwin ( o , s , index_otherFamily + j , myStructure )
enddo ; enddo ; enddo ; enddo
enddo ; enddo ; enddo ; enddo
2013-01-22 18:32:23 +05:30
constitutive_dislotwin_Ctwin_66 ( 1 : 6 , 1 : 6 , index_myFamily + j , i ) = &
math_Mandel3333to66 ( constitutive_dislotwin_Ctwin_3333 ( 1 : 3 , 1 : 3 , 1 : 3 , 1 : 3 , index_myFamily + j , i ) )
2012-11-14 15:52:34 +05:30
!* Interaction matrices
do o = 1_pInt , lattice_maxNslipFamily
index_otherFamily = sum ( constitutive_dislotwin_Nslip ( 1 : o - 1_pInt , i ) )
do k = 1_pInt , constitutive_dislotwin_Nslip ( o , i ) ! loop over (active) systems in other family (slip)
constitutive_dislotwin_interactionMatrix_TwinSlip ( index_myFamily + j , index_otherFamily + k , i ) = &
constitutive_dislotwin_interaction_TwinSlip ( lattice_interactionTwinSlip ( &
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1_pInt , myStructure ) ) + k , &
myStructure ) , i )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
index_otherFamily = sum ( constitutive_dislotwin_Ntwin ( 1 : o - 1_pInt , i ) )
do k = 1_pInt , constitutive_dislotwin_Ntwin ( o , i ) ! loop over (active) systems in other family (twin)
constitutive_dislotwin_interactionMatrix_TwinTwin ( index_myFamily + j , index_otherFamily + k , i ) = &
constitutive_dislotwin_interaction_TwinTwin ( lattice_interactionTwinTwin ( &
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , myStructure ) ) + k , &
myStructure ) , i )
enddo ; enddo
enddo ! twin system in family
enddo ! twin families
enddo ! instances
2011-04-13 17:21:46 +05:30
2013-02-06 14:15:08 +05:30
end subroutine constitutive_dislotwin_init
2011-04-13 17:21:46 +05:30
function constitutive_dislotwin_stateInit ( myInstance )
!*********************************************************************
!* initial microstructural state *
!*********************************************************************
use prec , only : pReal , pInt
use math , only : pi
2012-02-21 21:30:00 +05:30
use lattice , only : lattice_maxNslipFamily
2011-04-13 17:21:46 +05:30
implicit none
!* Input-Output variables
integer ( pInt ) :: myInstance
real ( pReal ) , dimension ( constitutive_dislotwin_sizeState ( myInstance ) ) :: constitutive_dislotwin_stateInit
!* Local variables
2012-11-14 20:03:41 +05:30
integer ( pInt ) :: i , j , f , ns , nt , index_myFamily
2011-04-13 17:21:46 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNslip ( myInstance ) ) :: rhoEdge0 , &
rhoEdgeDip0 , &
invLambdaSlip0 , &
MeanFreePathSlip0 , &
tauSlipThreshold0
real ( pReal ) , dimension ( constitutive_dislotwin_totalNtwin ( myInstance ) ) :: MeanFreePathTwin0 , TwinVolume0
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
constitutive_dislotwin_stateInit = 0.0_pReal
!* Initialize basic slip state variables
2012-11-14 15:52:34 +05:30
2012-02-13 19:48:07 +05:30
do f = 1_pInt , lattice_maxNslipFamily
2012-11-14 15:52:34 +05:30
index_myFamily = sum ( constitutive_dislotwin_Nslip ( 1 : f - 1_pInt , myInstance ) ) ! index in truncated slip system list
2012-11-14 20:03:41 +05:30
rhoEdge0 ( index_myFamily + 1_pInt : &
index_myFamily + constitutive_dislotwin_Nslip ( f , myInstance ) ) = &
constitutive_dislotwin_rhoEdge0 ( f , myInstance )
rhoEdgeDip0 ( index_myFamily + 1_pInt : &
index_myFamily + constitutive_dislotwin_Nslip ( f , myInstance ) ) = &
constitutive_dislotwin_rhoEdgeDip0 ( f , myInstance )
enddo
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_stateInit ( 1_pInt : ns ) = rhoEdge0
constitutive_dislotwin_stateInit ( ns + 1_pInt : 2_pInt * ns ) = rhoEdgeDip0
2011-04-13 17:21:46 +05:30
!* Initialize dependent slip microstructural variables
2012-11-14 20:03:41 +05:30
forall ( i = 1_pInt : ns ) &
invLambdaSlip0 ( i ) = sqrt ( dot_product ( ( rhoEdge0 + rhoEdgeDip0 ) , constitutive_dislotwin_forestProjectionEdge ( 1 : ns , i , myInstance ) ) ) / &
constitutive_dislotwin_CLambdaSlipPerSlipSystem ( i , myInstance )
constitutive_dislotwin_stateInit ( 2_pInt * ns + nt + 1_pInt : 3_pInt * ns + nt ) = invLambdaSlip0
forall ( i = 1_pInt : ns ) &
MeanFreePathSlip0 ( i ) = &
constitutive_dislotwin_GrainSize ( myInstance ) / ( 1.0_pReal + invLambdaSlip0 ( i ) * constitutive_dislotwin_GrainSize ( myInstance ) )
constitutive_dislotwin_stateInit ( 4_pInt * ns + 2_pInt * nt + 1 : 5_pInt * ns + 2_pInt * nt ) = MeanFreePathSlip0
forall ( i = 1_pInt : ns ) &
tauSlipThreshold0 ( i ) = constitutive_dislotwin_SolidSolutionStrength ( myInstance ) + &
constitutive_dislotwin_Gmod ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( i , myInstance ) * &
sqrt ( dot_product ( ( rhoEdge0 + rhoEdgeDip0 ) , constitutive_dislotwin_interactionMatrix_SlipSlip ( i , 1 : ns , myInstance ) ) )
constitutive_dislotwin_stateInit ( 5_pInt * ns + 3_pInt * nt + 1 : 6_pInt * ns + 3_pInt * nt ) = tauSlipThreshold0
2011-04-13 17:21:46 +05:30
!* Initialize dependent twin microstructural variables
2012-11-14 20:03:41 +05:30
forall ( j = 1_pInt : nt ) &
MeanFreePathTwin0 ( j ) = constitutive_dislotwin_GrainSize ( myInstance )
constitutive_dislotwin_stateInit ( 5_pInt * ns + 2_pInt * nt + 1_pInt : 5_pInt * ns + 3_pInt * nt ) = MeanFreePathTwin0
2011-04-13 17:21:46 +05:30
2012-11-14 20:03:41 +05:30
forall ( j = 1_pInt : nt ) &
TwinVolume0 ( j ) = &
( pi / 6.0_pReal ) * constitutive_dislotwin_twinsizePerTwinSystem ( j , myInstance ) * MeanFreePathTwin0 ( j ) ** ( 2.0_pReal )
constitutive_dislotwin_stateInit ( 6_pInt * ns + 4_pInt * nt + 1_pInt : 6_pInt * ns + 5_pInt * nt ) = TwinVolume0
2011-04-13 17:21:46 +05:30
!write(6,*) '#STATEINIT#'
!write(6,*)
2012-02-02 01:50:05 +05:30
!write(6,'(a,/,4(3(f30.20,1x)/))') 'RhoEdge',rhoEdge0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'RhoEdgedip',rhoEdgeDip0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'invLambdaSlip',invLambdaSlip0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'MeanFreePathSlip',MeanFreePathSlip0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'tauSlipThreshold', tauSlipThreshold0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'MeanFreePathTwin', MeanFreePathTwin0
!write(6,'(a,/,4(3(f30.20,1x)/))') 'TwinVolume', TwinVolume0
2011-04-13 17:21:46 +05:30
end function
pure function constitutive_dislotwin_aTolState ( myInstance )
!*********************************************************************
!* absolute state tolerance *
!*********************************************************************
use prec , only : pReal , pInt
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: myInstance
real ( pReal ) , dimension ( constitutive_dislotwin_sizeState ( myInstance ) ) :: constitutive_dislotwin_aTolState
constitutive_dislotwin_aTolState = constitutive_dislotwin_aTolRho ( myInstance )
2012-11-14 20:03:41 +05:30
end function constitutive_dislotwin_aTolState
2011-04-13 17:21:46 +05:30
pure function constitutive_dislotwin_homogenizedC ( state , g , ip , el )
!*********************************************************************
!* calculates homogenized elacticity matrix *
!* - state : microstructure quantities *
!* - g : component-ID of current integration point *
!* - ip : current integration point *
!* - el : current element *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
use mesh , only : mesh_NcpElems , mesh_maxNips
2012-03-12 19:39:37 +05:30
use material , only : homogenization_maxNgrains , material_phase , phase_plasticityInstance
2011-04-13 17:21:46 +05:30
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: g , ip , el
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( in ) :: state
real ( pReal ) , dimension ( 6 , 6 ) :: constitutive_dislotwin_homogenizedC
!* Local variables
integer ( pInt ) myInstance , ns , nt , i
real ( pReal ) sumf
!* Shortened notation
2012-03-12 19:39:37 +05:30
myInstance = phase_plasticityInstance ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
!* Total twin volume fraction
2012-02-21 21:30:00 +05:30
sumf = sum ( state ( g , ip , el ) % p ( ( 2_pInt * ns + 1_pInt ) : ( 2_pInt * ns + nt ) ) ) ! safe for nt == 0
2011-04-13 17:21:46 +05:30
!* Homogenized elasticity matrix
constitutive_dislotwin_homogenizedC = ( 1.0_pReal - sumf ) * constitutive_dislotwin_Cslip_66 ( : , : , myInstance )
2012-02-21 21:30:00 +05:30
do i = 1_pInt , nt
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_homogenizedC = &
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_homogenizedC + state ( g , ip , el ) % p ( 2_pInt * ns + i ) * constitutive_dislotwin_Ctwin_66 ( : , : , i , myInstance )
2011-04-13 17:21:46 +05:30
enddo
end function
subroutine constitutive_dislotwin_microstructure ( Temperature , state , g , ip , el )
!*********************************************************************
!* calculates quantities characterizing the microstructure *
!* - Temperature : temperature *
!* - state : microstructure quantities *
!* - ipc : component-ID of current integration point *
!* - ip : current integration point *
!* - el : current element *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
use math , only : pi
use mesh , only : mesh_NcpElems , mesh_maxNips
2012-03-12 19:39:37 +05:30
use material , only : homogenization_maxNgrains , material_phase , phase_plasticityInstance
2011-04-13 17:21:46 +05:30
!use debug, only: debugger
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: g , ip , el
real ( pReal ) , intent ( in ) :: Temperature
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( inout ) :: state
!* Local variables
integer ( pInt ) myInstance , myStructure , ns , nt , s , t
real ( pReal ) sumf , sfe
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNtwin ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: fOverStacksize
2011-04-13 17:21:46 +05:30
!* Shortened notation
2012-03-12 19:39:37 +05:30
myInstance = phase_plasticityInstance ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
myStructure = constitutive_dislotwin_structure ( myInstance )
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
!* State: 1 : ns rho_edge
!* State: ns+1 : 2*ns rho_dipole
!* State: 2*ns+1 : 2*ns+nt f
!* State: 2*ns+nt+1 : 3*ns+nt 1/lambda_slip
!* State: 3*ns+nt+1 : 4*ns+nt 1/lambda_sliptwin
!* State: 4*ns+nt+1 : 4*ns+2*nt 1/lambda_twin
!* State: 4*ns+2*nt+1 : 5*ns+2*nt mfp_slip
!* State: 5*ns+2*nt+1 : 5*ns+3*nt mfp_twin
!* State: 5*ns+3*nt+1 : 6*ns+3*nt threshold_stress_slip
!* State: 6*ns+3*nt+1 : 6*ns+4*nt threshold_stress_twin
!* State: 6*ns+4*nt+1 : 6*ns+5*nt twin volume
!* Total twin volume fraction
sumf = sum ( state ( g , ip , el ) % p ( ( 2 * ns + 1 ) : ( 2 * ns + nt ) ) ) ! safe for nt == 0
!* Stacking fault energy
2011-09-26 15:25:08 +05:30
sfe = constitutive_dislotwin_SFE_0K ( myInstance ) + &
constitutive_dislotwin_dSFE_dT ( myInstance ) * Temperature
2011-04-13 17:21:46 +05:30
!* rescaled twin volume fraction for topology
2012-02-21 21:30:00 +05:30
forall ( t = 1_pInt : nt ) &
2011-04-13 17:21:46 +05:30
fOverStacksize ( t ) = &
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( 2_pInt * ns + t ) / constitutive_dislotwin_twinsizePerTwinSystem ( t , myInstance )
2011-04-13 17:21:46 +05:30
!* 1/mean free distance between 2 forest dislocations seen by a moving dislocation
2012-02-21 21:30:00 +05:30
forall ( s = 1_pInt : ns ) &
state ( g , ip , el ) % p ( 2_pInt * ns + nt + s ) = &
sqrt ( dot_product ( ( state ( g , ip , el ) % p ( 1 : ns ) + state ( g , ip , el ) % p ( ns + 1_pInt : 2_pInt * ns ) ) , &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_forestProjectionEdge ( 1 : ns , s , myInstance ) ) ) / &
constitutive_dislotwin_CLambdaSlipPerSlipSystem ( s , myInstance )
!* 1/mean free distance between 2 twin stacks from different systems seen by a moving dislocation
!$OMP CRITICAL (evilmatmul)
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( ( 3_pInt * ns + nt + 1_pInt ) : ( 4_pInt * ns + nt ) ) = 0.0_pReal
2013-01-24 18:42:51 +05:30
if ( nt > 0_pInt . and . ns > 0_pInt ) &
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( ( 3_pInt * ns + nt + 1 ) : ( 4_pInt * ns + nt ) ) = &
2012-11-14 15:52:34 +05:30
matmul ( constitutive_dislotwin_interactionMatrix_SlipTwin ( 1 : ns , 1 : nt , myInstance ) , fOverStacksize ( 1 : nt ) ) / ( 1.0_pReal - sumf )
2011-04-13 17:21:46 +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 ) &
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( ( 4_pInt * ns + nt + 1_pInt ) : ( 4_pInt * ns + 2_pInt * nt ) ) = &
2012-11-14 15:52:34 +05:30
matmul ( constitutive_dislotwin_interactionMatrix_TwinTwin ( 1 : nt , 1 : nt , myInstance ) , fOverStacksize ( 1 : nt ) ) / ( 1.0_pReal - sumf )
2011-04-13 17:21:46 +05:30
!$OMP END CRITICAL (evilmatmul)
!* mean free path between 2 obstacles seen by a moving dislocation
2012-02-21 21:30:00 +05:30
do s = 1_pInt , ns
2011-04-13 17:21:46 +05:30
if ( nt > 0_pInt ) then
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( 4_pInt * ns + 2_pInt * nt + s ) = &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_GrainSize ( myInstance ) / ( 1.0_pReal + constitutive_dislotwin_GrainSize ( myInstance ) * &
2012-02-21 21:30:00 +05:30
( state ( g , ip , el ) % p ( 2_pInt * ns + nt + s ) + state ( g , ip , el ) % p ( 3_pInt * ns + nt + s ) ) )
2011-04-13 17:21:46 +05:30
else
2012-02-21 21:30:00 +05:30
state ( g , ip , el ) % p ( 4_pInt * ns + s ) = &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_GrainSize ( myInstance ) / &
2012-02-21 21:30:00 +05:30
( 1.0_pReal + constitutive_dislotwin_GrainSize ( myInstance ) * ( state ( g , ip , el ) % p ( 2_pInt * ns + s ) ) )
2011-04-13 17:21:46 +05:30
endif
enddo
!* mean free path between 2 obstacles seen by a growing twin
2012-02-21 21:30:00 +05:30
forall ( t = 1_pInt : nt ) &
state ( g , ip , el ) % p ( 5_pInt * ns + 2_pInt * nt + t ) = &
2011-04-13 17:21:46 +05:30
( constitutive_dislotwin_Cmfptwin ( myInstance ) * constitutive_dislotwin_GrainSize ( myInstance ) ) / &
2012-02-21 21:30:00 +05:30
( 1.0_pReal + constitutive_dislotwin_GrainSize ( myInstance ) * state ( g , ip , el ) % p ( 4_pInt * ns + nt + t ) )
2011-04-13 17:21:46 +05:30
!* threshold stress for dislocation motion
2012-02-21 21:30:00 +05:30
forall ( s = 1_pInt : ns ) &
state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + s ) = constitutive_dislotwin_SolidSolutionStrength ( myInstance ) + &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_Gmod ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( s , myInstance ) * &
2012-02-21 21:30:00 +05:30
sqrt ( dot_product ( ( state ( g , ip , el ) % p ( 1 : ns ) + state ( g , ip , el ) % p ( ns + 1_pInt : 2_pInt * ns ) ) , &
2012-11-14 15:52:34 +05:30
constitutive_dislotwin_interactionMatrix_SlipSlip ( s , 1 : ns , myInstance ) ) )
2011-04-13 17:21:46 +05:30
!* threshold stress for growing twin
2012-02-21 21:30:00 +05:30
forall ( t = 1_pInt : nt ) &
state ( g , ip , el ) % p ( 6_pInt * ns + 3_pInt * nt + t ) = &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_Cthresholdtwin ( myInstance ) * &
( sfe / ( 3.0_pReal * constitutive_dislotwin_burgersPerTwinSystem ( t , myInstance ) ) + &
3.0_pReal * constitutive_dislotwin_burgersPerTwinSystem ( t , myInstance ) * constitutive_dislotwin_Gmod ( myInstance ) / &
( constitutive_dislotwin_L0 ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( t , myInstance ) ) )
!* final twin volume after growth
2012-02-21 21:30:00 +05:30
forall ( t = 1_pInt : nt ) &
state ( g , ip , el ) % p ( 6_pInt * ns + 4_pInt * nt + t ) = &
2013-01-29 20:29:26 +05:30
( pi / 4.0_pReal ) * constitutive_dislotwin_twinsizePerTwinSystem ( t , myInstance ) * state ( g , ip , el ) % p ( 5 * ns + 2 * nt + t ) ** ( 2.0_pReal )
2011-04-13 17:21:46 +05:30
!if ((ip==1).and.(el==1)) then
! write(6,*) '#MICROSTRUCTURE#'
! write(6,*)
2012-02-02 01:50:05 +05:30
! write(6,'(a,/,4(3(f10.4,1x)/))') 'rhoEdge',state(g,ip,el)%p(1:ns)/1e9
! write(6,'(a,/,4(3(f10.4,1x)/))') 'rhoEdgeDip',state(g,ip,el)%p(ns+1:2*ns)/1e9
! write(6,'(a,/,4(3(f10.4,1x)/))') 'Fraction',state(g,ip,el)%p(2*ns+1:2*ns+nt)
2011-04-13 17:21:46 +05:30
!endif
end subroutine
subroutine constitutive_dislotwin_LpAndItsTangent ( Lp , dLp_dTstar , Tstar_v , Temperature , state , g , ip , el )
!*********************************************************************
!* calculates plastic velocity gradient and its tangent *
!* INPUT: *
!* - Temperature : temperature *
!* - state : microstructure quantities *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - ipc : component-ID at current integration point *
!* - ip : current integration point *
!* - el : current element *
!* OUTPUT: *
!* - Lp : plastic velocity gradient *
!* - dLp_dTstar : derivative of Lp (4th-rank tensor) *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
2011-09-16 21:25:18 +05:30
use math , only : math_Plain3333to99 , math_Mandel6to33 , math_Mandel33to6 , &
2012-01-26 19:20:00 +05:30
math_spectralDecompositionSym33 , math_tensorproduct , math_symmetric33 , math_mul33x3
2011-04-13 17:21:46 +05:30
use mesh , only : mesh_NcpElems , mesh_maxNips
2012-03-12 19:39:37 +05:30
use material , only : homogenization_maxNgrains , material_phase , phase_plasticityInstance
2011-04-13 17:21:46 +05:30
use lattice , only : lattice_Sslip , lattice_Sslip_v , lattice_Stwin , lattice_Stwin_v , lattice_maxNslipFamily , lattice_maxNtwinFamily , &
lattice_NslipSystem , lattice_NtwinSystem , lattice_shearTwin
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: g , ip , el
real ( pReal ) , intent ( in ) :: Temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( inout ) :: state
real ( pReal ) , dimension ( 3 , 3 ) , intent ( out ) :: Lp
real ( pReal ) , dimension ( 9 , 9 ) , intent ( out ) :: dLp_dTstar
!* Local variables
integer ( pInt ) myInstance , myStructure , ns , nt , f , i , j , k , l , m , n , index_myFamily
real ( pReal ) sumf , StressRatio_p , StressRatio_pminus1 , StressRatio_r , BoltzmannRatio , DotGamma0
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) :: dLp_dTstar3333
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNslip ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
gdot_slip , dgdot_dtauslip , tau_slip
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNtwin ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
gdot_twin , dgdot_dtautwin , tau_twin
2011-09-16 21:25:18 +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
real ( pReal ) , dimension ( 3 , 6 ) , parameter :: &
sb_sComposition = &
2012-02-10 17:26:05 +05:30
reshape ( real ( [ &
2011-09-16 21:25:18 +05:30
1 , 0 , 1 , &
1 , 0 , - 1 , &
1 , 1 , 0 , &
1 , - 1 , 0 , &
0 , 1 , 1 , &
0 , 1 , - 1 &
2012-02-10 17:26:05 +05:30
] , pReal ) , [ 3 , 6 ] ) , &
2011-09-16 21:25:18 +05:30
sb_mComposition = &
2012-02-10 17:26:05 +05:30
reshape ( real ( [ &
2011-09-16 21:25:18 +05:30
1 , 0 , - 1 , &
1 , 0 , + 1 , &
1 , - 1 , 0 , &
1 , 1 , 0 , &
0 , 1 , - 1 , &
0 , 1 , 1 &
2012-02-10 17:26:05 +05:30
] , pReal ) , [ 3 , 6 ] )
2011-09-16 21:25:18 +05:30
logical error
2011-04-13 17:21:46 +05:30
!* Shortened notation
2012-03-12 19:39:37 +05:30
myInstance = phase_plasticityInstance ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
myStructure = constitutive_dislotwin_structure ( myInstance )
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
!* Total twin volume fraction
2012-02-21 21:30:00 +05:30
sumf = sum ( state ( g , ip , el ) % p ( ( 2_pInt * ns + 1_pInt ) : ( 2_pInt * ns + nt ) ) ) ! safe for nt == 0
2011-04-13 17:21:46 +05:30
Lp = 0.0_pReal
dLp_dTstar3333 = 0.0_pReal
dLp_dTstar = 0.0_pReal
!* Dislocation glide part
gdot_slip = 0.0_pReal
dgdot_dtauslip = 0.0_pReal
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Calculation of Lp
!* Resolved shear stress on slip system
2013-01-22 04:41:16 +05:30
tau_slip ( j ) = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) )
2011-04-13 17:21:46 +05:30
!* Stress ratios
StressRatio_p = ( abs ( tau_slip ( j ) ) / state ( g , ip , el ) % p ( 5 * ns + 3 * nt + j ) ) ** constitutive_dislotwin_p ( myInstance )
StressRatio_pminus1 = ( abs ( tau_slip ( j ) ) / state ( g , ip , el ) % p ( 5 * ns + 3 * nt + j ) ) ** ( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
!* Boltzmann ratio
2013-02-06 14:15:08 +05:30
BoltzmannRatio = constitutive_dislotwin_QedgePerSlipSystem ( j , myInstance ) / ( kB * Temperature )
2011-04-13 17:21:46 +05:30
!* Initial shear rates
DotGamma0 = &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( j ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) * &
constitutive_dislotwin_v0PerSlipSystem ( j , myInstance )
2011-04-13 17:21:46 +05:30
!* Shear rates due to slip
gdot_slip ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1 - StressRatio_p ) ** constitutive_dislotwin_q ( myInstance ) ) * &
sign ( 1.0_pReal , tau_slip ( j ) )
!* Derivatives of shear rates
dgdot_dtauslip ( j ) = &
( ( abs ( gdot_slip ( j ) ) * BoltzmannRatio * &
constitutive_dislotwin_p ( myInstance ) * constitutive_dislotwin_q ( myInstance ) ) / state ( g , ip , el ) % p ( 5 * ns + 3 * nt + j ) ) * &
StressRatio_pminus1 * ( 1 - StressRatio_p ) ** ( constitutive_dislotwin_q ( myInstance ) - 1.0_pReal )
!* Plastic velocity gradient for dislocation glide
Lp = Lp + ( 1.0_pReal - sumf ) * gdot_slip ( j ) * lattice_Sslip ( : , : , index_myFamily + i , myStructure )
!* Calculation of the tangent of Lp
2012-02-21 21:30:00 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
2011-04-13 17:21:46 +05:30
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtauslip ( j ) * &
lattice_Sslip ( k , l , index_myFamily + i , myStructure ) * &
lattice_Sslip ( m , n , index_myFamily + i , myStructure )
enddo
enddo
2011-09-16 21:25:18 +05:30
!* Shear banding (shearband) part
2011-09-26 15:25:08 +05:30
if ( constitutive_dislotwin_sbVelocity ( myInstance ) / = 0.0_pReal ) then
gdot_sb = 0.0_pReal
dgdot_dtausb = 0.0_pReal
2012-01-26 19:20:00 +05:30
call math_spectralDecompositionSym33 ( math_Mandel6to33 ( Tstar_v ) , eigValues , eigVectors , error )
2012-02-21 21:30:00 +05:30
do j = 1_pInt , 6_pInt
2011-09-26 15:25:08 +05:30
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 ) )
sb_Smatrix = math_tensorproduct ( sb_s , sb_m )
2012-01-26 19:20:00 +05:30
constitutive_dislotwin_sbSv ( 1 : 6 , j , g , ip , el ) = math_Mandel33to6 ( math_symmetric33 ( sb_Smatrix ) )
2011-09-16 21:25:18 +05:30
2011-09-26 15:25:08 +05:30
!* Calculation of Lp
!* Resolved shear stress on shear banding system
tau_sb ( j ) = dot_product ( Tstar_v , constitutive_dislotwin_sbSv ( 1 : 6 , j , g , ip , el ) )
2011-09-16 21:25:18 +05:30
2011-09-26 15:25:08 +05:30
! if (debug_selectiveDebugger .and. g==debug_g .and. ip==debug_i .and. el==debug_e) then
2012-02-02 01:50:05 +05:30
! write(6,'(a,3(i3,1x),a,i1,a,e10.3)') '### TAU SHEARBAND at g ip el ',g,ip,el,' on family ',j,' : ',tau
2011-09-26 15:25:08 +05:30
! endif
2011-09-16 21:25:18 +05:30
2011-09-26 15:25:08 +05:30
!* Stress ratios
StressRatio_p = ( abs ( tau_sb ( j ) ) / constitutive_dislotwin_sbResistance ( myInstance ) ) ** constitutive_dislotwin_p ( myInstance )
2011-12-06 22:28:17 +05:30
StressRatio_pminus1 = ( abs ( tau_sb ( j ) ) / constitutive_dislotwin_sbResistance ( myInstance ) ) &
** ( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
2011-09-26 15:25:08 +05:30
!* Boltzmann ratio
2012-05-22 21:40:28 +05:30
BoltzmannRatio = constitutive_dislotwin_sbQedge ( myInstance ) / ( kB * Temperature )
2011-09-26 15:25:08 +05:30
!* Initial shear rates
DotGamma0 = constitutive_dislotwin_sbVelocity ( myInstance )
!* Shear rates due to shearband
2012-02-21 21:30:00 +05:30
gdot_sb ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** constitutive_dislotwin_q ( myInstance ) ) * &
2011-09-16 21:25:18 +05:30
sign ( 1.0_pReal , tau_sb ( j ) )
2011-09-26 15:25:08 +05:30
!* Derivatives of shear rates
dgdot_dtausb ( j ) = &
( ( abs ( gdot_sb ( j ) ) * BoltzmannRatio * &
constitutive_dislotwin_p ( myInstance ) * constitutive_dislotwin_q ( myInstance ) ) / constitutive_dislotwin_sbResistance ( myInstance ) ) * &
2012-02-21 21:30:00 +05:30
StressRatio_pminus1 * ( 1_pInt - StressRatio_p ) ** ( constitutive_dislotwin_q ( myInstance ) - 1.0_pReal )
2011-09-26 15:25:08 +05:30
!* Plastic velocity gradient for shear banding
Lp = Lp + gdot_sb ( j ) * sb_Smatrix
!* Calculation of the tangent of Lp
2012-02-21 21:30:00 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
2011-09-26 15:25:08 +05:30
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtausb ( j ) * &
sb_Smatrix ( k , l ) * &
sb_Smatrix ( m , n )
enddo
end if
2011-09-16 21:25:18 +05:30
2011-04-13 17:21:46 +05:30
!* Mechanical twinning part
gdot_twin = 0.0_pReal
dgdot_dtautwin = 0.0_pReal
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all slip families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Ntwin ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Calculation of Lp
!* Resolved shear stress on twin system
tau_twin ( j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , myStructure ) )
!* Stress ratios
StressRatio_r = ( state ( g , ip , el ) % p ( 6 * ns + 3 * nt + j ) / tau_twin ( j ) ) ** constitutive_dislotwin_r ( myInstance )
!* Shear rates and their derivatives due to twin
if ( tau_twin ( j ) > 0.0_pReal ) then
gdot_twin ( j ) = &
( constitutive_dislotwin_MaxTwinFraction ( myInstance ) - sumf ) * lattice_shearTwin ( index_myFamily + i , myStructure ) * &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( 6 * ns + 4 * nt + j ) * constitutive_dislotwin_Ndot0PerTwinSystem ( j , myInstance ) * exp ( - StressRatio_r )
2011-04-13 17:21:46 +05:30
dgdot_dtautwin ( j ) = ( ( gdot_twin ( j ) * constitutive_dislotwin_r ( myInstance ) ) / tau_twin ( j ) ) * StressRatio_r
endif
!* Plastic velocity gradient for mechanical twinning
Lp = Lp + gdot_twin ( j ) * lattice_Stwin ( : , : , index_myFamily + i , myStructure )
!* Calculation of the tangent of Lp
2012-02-21 21:30:00 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
2011-04-13 17:21:46 +05:30
dLp_dTstar3333 ( k , l , m , n ) = &
dLp_dTstar3333 ( k , l , m , n ) + dgdot_dtautwin ( j ) * &
lattice_Stwin ( k , l , index_myFamily + i , myStructure ) * &
lattice_Stwin ( m , n , index_myFamily + i , myStructure )
enddo
enddo
dLp_dTstar = math_Plain3333to99 ( dLp_dTstar3333 )
!if ((ip==1).and.(el==1)) then
! write(6,*) '#LP/TANGENT#'
! write(6,*)
! write(6,*) 'Tstar_v', Tstar_v
! write(6,*) 'tau_slip', tau_slip
2012-02-02 01:50:05 +05:30
! write(6,'(a10,/,4(3(e20.8,1x),/))') 'state',state(1,1,1)%p
! write(6,'(a,/,3(3(f10.4,1x)/))') 'Lp',Lp
! write(6,'(a,/,9(9(f10.4,1x)/))') 'dLp_dTstar',dLp_dTstar
2011-04-13 17:21:46 +05:30
!endif
end subroutine
function constitutive_dislotwin_dotState ( Tstar_v , Temperature , state , g , ip , el )
!*********************************************************************
!* rate of change of microstructure *
!* INPUT: *
!* - Temperature : temperature *
!* - state : microstructure quantities *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - ipc : component-ID at current integration point *
!* - ip : current integration point *
!* - el : current element *
!* OUTPUT: *
!* - constitutive_dotState : evolution of state variable *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
use math , only : pi
use mesh , only : mesh_NcpElems , mesh_maxNips
2012-03-12 19:39:37 +05:30
use material , only : homogenization_maxNgrains , material_phase , phase_plasticityInstance
2012-02-21 21:30:00 +05:30
use lattice , only : lattice_Sslip_v , lattice_Stwin_v , &
2011-04-13 17:21:46 +05:30
lattice_maxNslipFamily , lattice_maxNtwinFamily , &
2012-02-21 21:30:00 +05:30
lattice_NslipSystem , lattice_NtwinSystem
2011-04-13 17:21:46 +05:30
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: g , ip , el
real ( pReal ) , intent ( in ) :: Temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( in ) :: state
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_sizeDotState ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_dotState
!* Local variables
integer ( pInt ) MyInstance , MyStructure , ns , nt , f , i , j , index_myFamily
real ( pReal ) sumf , StressRatio_p , StressRatio_pminus1 , BoltzmannRatio , DotGamma0 , &
EdgeDipMinDistance , AtomicVolume , VacancyDiffusion , StressRatio_r
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNslip ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
gdot_slip , tau_slip , DotRhoMultiplication , EdgeDipDistance , DotRhoEdgeEdgeAnnihilation , DotRhoEdgeDipAnnihilation , &
ClimbVelocity , DotRhoEdgeDipClimb , DotRhoDipFormation
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_totalNtwin ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
tau_twin
!* Shortened notation
2012-03-12 19:39:37 +05:30
myInstance = phase_plasticityInstance ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
MyStructure = constitutive_dislotwin_structure ( myInstance )
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
!* Total twin volume fraction
2012-02-21 21:30:00 +05:30
sumf = sum ( state ( g , ip , el ) % p ( ( 2_pInt * ns + 1_pInt ) : ( 2_pInt * ns + nt ) ) ) ! safe for nt == 0
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_dotState = 0.0_pReal
!* Dislocation density evolution
gdot_slip = 0.0_pReal
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , MyStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Resolved shear stress on slip system
2013-01-22 04:41:16 +05:30
tau_slip ( j ) = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) )
2011-04-13 17:21:46 +05:30
!* Stress ratios
2012-02-21 21:30:00 +05:30
StressRatio_p = ( abs ( tau_slip ( j ) ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
constitutive_dislotwin_p ( myInstance )
StressRatio_pminus1 = ( abs ( tau_slip ( j ) ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
2011-04-13 17:21:46 +05:30
!* Boltzmann ratio
2013-02-06 14:15:08 +05:30
BoltzmannRatio = constitutive_dislotwin_QedgePerSlipSystem ( j , myInstance ) / ( kB * Temperature )
2011-04-13 17:21:46 +05:30
!* Initial shear rates
DotGamma0 = &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( j ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) * &
constitutive_dislotwin_v0PerSlipSystem ( j , myInstance )
2011-04-13 17:21:46 +05:30
!* Shear rates due to slip
2012-02-21 21:30:00 +05:30
gdot_slip ( j ) = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** constitutive_dislotwin_q ( myInstance ) ) * &
2011-04-13 17:21:46 +05:30
sign ( 1.0_pReal , tau_slip ( j ) )
!* Multiplication
DotRhoMultiplication ( j ) = abs ( gdot_slip ( j ) ) / &
2013-02-06 14:15:08 +05:30
( constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) * state ( g , ip , el ) % p ( 4 * ns + 2 * nt + j ) )
2011-04-13 17:21:46 +05:30
!* Dipole formation
EdgeDipMinDistance = &
2013-02-06 14:15:08 +05:30
constitutive_dislotwin_CEdgeDipMinDistance ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance )
2011-04-13 17:21:46 +05:30
if ( tau_slip ( j ) == 0.0_pReal ) then
DotRhoDipFormation ( j ) = 0.0_pReal
else
EdgeDipDistance ( j ) = &
2013-02-06 14:15:08 +05:30
( 3.0_pReal * constitutive_dislotwin_Gmod ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ) / &
2011-04-13 17:21:46 +05:30
( 1 6.0_pReal * pi * abs ( tau_slip ( j ) ) )
if ( EdgeDipDistance ( j ) > state ( g , ip , el ) % p ( 4 * ns + 2 * nt + j ) ) EdgeDipDistance ( j ) = state ( g , ip , el ) % p ( 4 * ns + 2 * nt + j )
if ( EdgeDipDistance ( j ) < EdgeDipMinDistance ) EdgeDipDistance ( j ) = EdgeDipMinDistance
DotRhoDipFormation ( j ) = &
2013-02-06 14:15:08 +05:30
( ( 2.0_pReal * EdgeDipDistance ( j ) ) / constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ) * &
2011-04-13 17:21:46 +05:30
state ( g , ip , el ) % p ( j ) * abs ( gdot_slip ( j ) )
endif
!* Spontaneous annihilation of 2 single edge dislocations
DotRhoEdgeEdgeAnnihilation ( j ) = &
2013-02-06 14:15:08 +05:30
( ( 2.0_pReal * EdgeDipMinDistance ) / constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ) * &
2011-04-13 17:21:46 +05:30
state ( g , ip , el ) % p ( j ) * abs ( gdot_slip ( j ) )
!* Spontaneous annihilation of a single edge dislocation with a dipole constituent
DotRhoEdgeDipAnnihilation ( j ) = &
2013-02-06 14:15:08 +05:30
( ( 2.0_pReal * EdgeDipMinDistance ) / constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ) * &
2011-04-13 17:21:46 +05:30
state ( g , ip , el ) % p ( ns + j ) * abs ( gdot_slip ( j ) )
!* Dislocation dipole climb
AtomicVolume = &
2013-02-06 14:15:08 +05:30
constitutive_dislotwin_CAtomicVolume ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ** ( 3.0_pReal )
2011-04-13 17:21:46 +05:30
VacancyDiffusion = &
constitutive_dislotwin_D0 ( myInstance ) * exp ( - constitutive_dislotwin_Qsd ( myInstance ) / ( kB * Temperature ) )
if ( tau_slip ( j ) == 0.0_pReal ) then
DotRhoEdgeDipClimb ( j ) = 0.0_pReal
else
ClimbVelocity ( j ) = &
( ( 3.0_pReal * constitutive_dislotwin_Gmod ( myInstance ) * VacancyDiffusion * AtomicVolume ) / ( 2.0_pReal * pi * kB * Temperature ) ) * &
( 1 / ( EdgeDipDistance ( j ) + EdgeDipMinDistance ) )
DotRhoEdgeDipClimb ( j ) = &
( 4.0_pReal * ClimbVelocity ( j ) * state ( g , ip , el ) % p ( ns + j ) ) / ( EdgeDipDistance ( j ) - EdgeDipMinDistance )
endif
!* Edge dislocation density rate of change
constitutive_dislotwin_dotState ( j ) = &
DotRhoMultiplication ( j ) - DotRhoDipFormation ( j ) - DotRhoEdgeEdgeAnnihilation ( j )
!* Edge dislocation dipole density rate of change
constitutive_dislotwin_dotState ( ns + j ) = &
DotRhoDipFormation ( j ) - DotRhoEdgeDipAnnihilation ( j ) - DotRhoEdgeDipClimb ( j )
enddo
enddo
!* Twin volume fraction evolution
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all twin families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , MyStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Ntwin ( f , myInstance ) ! process each (active) twin system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Resolved shear stress on twin system
tau_twin ( j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , myStructure ) )
!* Stress ratios
StressRatio_r = ( state ( g , ip , el ) % p ( 6 * ns + 3 * nt + j ) / tau_twin ( j ) ) ** constitutive_dislotwin_r ( myInstance )
!* Shear rates and their derivatives due to twin
if ( tau_twin ( j ) > 0.0_pReal ) then
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_dotState ( 2_pInt * ns + j ) = &
2011-04-13 17:21:46 +05:30
( constitutive_dislotwin_MaxTwinFraction ( myInstance ) - sumf ) * &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( 6_pInt * ns + 4_pInt * nt + j ) * constitutive_dislotwin_Ndot0PerTwinSystem ( j , myInstance ) * exp ( - StressRatio_r )
2011-04-13 17:21:46 +05:30
endif
enddo
enddo
!write(6,*) '#DOTSTATE#'
!write(6,*)
2012-02-02 01:50:05 +05:30
!write(6,'(a,/,4(3(f30.20,1x)/))') 'tau slip',tau_slip
!write(6,'(a,/,4(3(f30.20,1x)/))') 'gamma slip',gdot_slip
!write(6,'(a,/,4(3(f30.20,1x)/))') 'RhoEdge',state(g,ip,el)%p(1:ns)
!write(6,'(a,/,4(3(f30.20,1x)/))') 'Threshold Slip', state(g,ip,el)%p(5*ns+3*nt+1:6*ns+3*nt)
!write(6,'(a,/,4(3(f30.20,1x)/))') 'Multiplication',DotRhoMultiplication
!write(6,'(a,/,4(3(f30.20,1x)/))') 'DipFormation',DotRhoDipFormation
!write(6,'(a,/,4(3(f30.20,1x)/))') 'SingleSingle',DotRhoEdgeEdgeAnnihilation
!write(6,'(a,/,4(3(f30.20,1x)/))') 'SingleDipole',DotRhoEdgeDipAnnihilation
!write(6,'(a,/,4(3(f30.20,1x)/))') 'DipClimb',DotRhoEdgeDipClimb
2011-04-13 17:21:46 +05:30
end function
2012-05-16 20:13:26 +05:30
!*********************************************************************
!* (instantaneous) incremental change of microstructure *
!*********************************************************************
function constitutive_dislotwin_deltaState ( Tstar_v , Temperature , state , g , ip , el )
use prec , only : pReal , &
pInt , &
p_vec
use mesh , only : mesh_NcpElems , &
mesh_maxNips
use material , only : homogenization_maxNgrains , &
material_phase , &
phase_plasticityInstance
implicit none
!*** input variables
integer ( pInt ) , intent ( in ) :: g , & ! current grain number
ip , & ! current integration point
el ! current element number
real ( pReal ) , intent ( in ) :: Temperature ! temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v ! current 2nd Piola-Kirchhoff stress in Mandel notation
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( in ) :: &
state ! current microstructural state
!*** output variables
real ( pReal ) , dimension ( constitutive_dislotwin_sizeDotState ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
constitutive_dislotwin_deltaState ! change of state variables / microstructure
!*** local variables
constitutive_dislotwin_deltaState = 0.0_pReal
2012-11-14 20:03:41 +05:30
end function
2012-05-16 20:13:26 +05:30
2011-04-13 17:21:46 +05:30
pure function constitutive_dislotwin_dotTemperature ( Tstar_v , Temperature , state , g , ip , el )
!*********************************************************************
!* rate of change of microstructure *
!* INPUT: *
!* - Temperature : temperature *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - ipc : component-ID at current integration point *
!* - ip : current integration point *
!* - el : current element *
!* OUTPUT: *
!* - constitutive_dotTemperature : evolution of Temperature *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
use mesh , only : mesh_NcpElems , mesh_maxNips
use material , only : homogenization_maxNgrains
implicit none
!* Input-Output variables
integer ( pInt ) , intent ( in ) :: g , ip , el
real ( pReal ) , intent ( in ) :: Temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( in ) :: state
real ( pReal ) constitutive_dislotwin_dotTemperature
constitutive_dislotwin_dotTemperature = 0.0_pReal
end function
2011-09-16 21:25:18 +05:30
function constitutive_dislotwin_postResults ( Tstar_v , Temperature , dt , state , g , ip , el )
2011-04-13 17:21:46 +05:30
!*********************************************************************
!* return array of constitutive results *
!* INPUT: *
!* - Temperature : temperature *
!* - Tstar_v : 2nd Piola Kirchhoff stress tensor (Mandel) *
!* - dt : current time increment *
!* - ipc : component-ID at current integration point *
!* - ip : current integration point *
!* - el : current element *
!*********************************************************************
use prec , only : pReal , pInt , p_vec
2012-01-26 19:20:00 +05:30
use math , only : pi , math_Mandel6to33 , math_spectralDecompositionSym33
2011-04-13 17:21:46 +05:30
use mesh , only : mesh_NcpElems , mesh_maxNips
2012-03-12 19:39:37 +05:30
use material , only : homogenization_maxNgrains , material_phase , phase_plasticityInstance , phase_Noutput
2011-04-13 17:21:46 +05:30
use lattice , only : lattice_Sslip_v , lattice_Stwin_v , lattice_maxNslipFamily , lattice_maxNtwinFamily , &
2012-02-21 21:30:00 +05:30
lattice_NslipSystem , lattice_NtwinSystem
2011-04-13 17:21:46 +05:30
implicit none
!* Definition of variables
integer ( pInt ) , intent ( in ) :: g , ip , el
real ( pReal ) , intent ( in ) :: dt , Temperature
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: Tstar_v
type ( p_vec ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) , intent ( in ) :: state
integer ( pInt ) myInstance , myStructure , ns , nt , f , o , i , c , j , index_myFamily
real ( pReal ) sumf , tau , StressRatio_p , StressRatio_pminus1 , BoltzmannRatio , DotGamma0 , StressRatio_r , gdot_slip , dgdot_dtauslip
2011-09-16 21:25:18 +05:30
real ( pReal ) , dimension ( 3 , 3 ) :: eigVectors
real ( pReal ) , dimension ( 3 ) :: eigValues
logical error
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_dislotwin_sizePostResults ( phase_plasticityInstance ( material_phase ( g , ip , el ) ) ) ) :: &
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_postResults
!* Shortened notation
2012-03-12 19:39:37 +05:30
myInstance = phase_plasticityInstance ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
myStructure = constitutive_dislotwin_structure ( myInstance )
ns = constitutive_dislotwin_totalNslip ( myInstance )
nt = constitutive_dislotwin_totalNtwin ( myInstance )
!* Total twin volume fraction
sumf = sum ( state ( g , ip , el ) % p ( ( 2 * ns + 1 ) : ( 2 * ns + nt ) ) ) ! safe for nt == 0
!* Required output
c = 0_pInt
constitutive_dislotwin_postResults = 0.0_pReal
2011-09-16 21:25:18 +05:30
!* Spectral decomposition of stress
2012-01-26 19:20:00 +05:30
call math_spectralDecompositionSym33 ( math_Mandel6to33 ( Tstar_v ) , eigValues , eigVectors , error )
2011-09-16 21:25:18 +05:30
2012-02-21 21:30:00 +05:30
do o = 1_pInt , phase_Noutput ( material_phase ( g , ip , el ) )
2011-04-13 17:21:46 +05:30
select case ( constitutive_dislotwin_output ( o , myInstance ) )
case ( 'edge_density' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + ns ) = state ( g , ip , el ) % p ( 1 : ns )
2011-04-13 17:21:46 +05:30
c = c + ns
case ( 'dipole_density' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + ns ) = state ( g , ip , el ) % p ( ns + 1 : 2_pInt * ns )
2011-04-13 17:21:46 +05:30
c = c + ns
case ( 'shear_rate_slip' )
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Resolved shear stress on slip system
2013-01-22 04:41:16 +05:30
tau = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) )
2011-04-13 17:21:46 +05:30
!* Stress ratios
2012-02-21 21:30:00 +05:30
StressRatio_p = ( abs ( tau ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
constitutive_dislotwin_p ( myInstance )
StressRatio_pminus1 = ( abs ( tau ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
2011-04-13 17:21:46 +05:30
!* Boltzmann ratio
2013-02-06 14:15:08 +05:30
BoltzmannRatio = constitutive_dislotwin_QedgePerSlipSystem ( j , myInstance ) / ( kB * Temperature )
2011-04-13 17:21:46 +05:30
!* Initial shear rates
DotGamma0 = &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( j ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) * &
constitutive_dislotwin_v0PerSlipSystem ( j , myInstance )
2011-04-13 17:21:46 +05:30
!* Shear rates due to slip
constitutive_dislotwin_postResults ( c + j ) = &
2012-02-21 21:30:00 +05:30
DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
constitutive_dislotwin_q ( myInstance ) ) * sign ( 1.0_pReal , tau )
2011-04-13 17:21:46 +05:30
enddo ; enddo
c = c + ns
case ( 'mfp_slip' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + ns ) = &
state ( g , ip , el ) % p ( ( 4_pInt * ns + 2_pInt * nt + 1_pInt ) : ( 5_pInt * ns + 2_pInt * nt ) )
2011-04-13 17:21:46 +05:30
c = c + ns
case ( 'resolved_stress_slip' )
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + j ) = &
2013-01-22 04:41:16 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) )
2011-04-13 17:21:46 +05:30
enddo ; enddo
c = c + ns
case ( 'threshold_stress_slip' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + ns ) = &
state ( g , ip , el ) % p ( ( 5_pInt * ns + 3_pInt * nt + 1_pInt ) : ( 6_pInt * ns + 3_pInt * nt ) )
2011-04-13 17:21:46 +05:30
c = c + ns
case ( 'edge_dipole_distance' )
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
constitutive_dislotwin_postResults ( c + j ) = &
2013-02-06 14:15:08 +05:30
( 3.0_pReal * constitutive_dislotwin_Gmod ( myInstance ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) ) / &
2013-01-22 04:41:16 +05:30
( 1 6.0_pReal * pi * abs ( dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) ) ) )
2011-04-13 17:21:46 +05:30
constitutive_dislotwin_postResults ( c + j ) = min ( constitutive_dislotwin_postResults ( c + j ) , state ( g , ip , el ) % p ( 4 * ns + 2 * nt + j ) )
! constitutive_dislotwin_postResults(c+j) = max(constitutive_dislotwin_postResults(c+j),state(g,ip,el)%p(4*ns+2*nt+j))
enddo ; enddo
c = c + ns
2011-09-16 21:25:18 +05:30
case ( 'resolved_stress_shearband' )
2012-02-21 21:30:00 +05:30
do j = 1_pInt , 6_pInt ! loop over all shearband families
2011-09-16 21:25:18 +05:30
constitutive_dislotwin_postResults ( c + j ) = dot_product ( Tstar_v , constitutive_dislotwin_sbSv ( 1 : 6 , j , g , ip , el ) )
enddo
2012-02-21 21:30:00 +05:30
c = c + 6_pInt
2011-09-16 21:25:18 +05:30
case ( 'schmid_factor_shearband' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + 6_pInt ) = constitutive_dislotwin_sbSv ( 1 : 6 , j , g , ip , el )
c = c + 6_pInt
2011-09-16 21:25:18 +05:30
case ( 'shear_rate_shearband' )
2012-02-21 21:30:00 +05:30
do j = 1_pInt , 6_pInt ! loop over all shearband families
2011-09-16 21:25:18 +05:30
!* Resolved shear stress on shearband system
tau = dot_product ( Tstar_v , constitutive_dislotwin_sbSv ( 1 : 6 , j , g , ip , el ) )
!* Stress ratios
StressRatio_p = ( abs ( tau ) / constitutive_dislotwin_sbResistance ( myInstance ) ) ** constitutive_dislotwin_p ( myInstance )
2011-12-06 22:28:17 +05:30
StressRatio_pminus1 = ( abs ( tau ) / constitutive_dislotwin_sbResistance ( myInstance ) ) &
** ( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
2011-09-16 21:25:18 +05:30
!* Boltzmann ratio
2012-05-22 21:40:28 +05:30
BoltzmannRatio = constitutive_dislotwin_sbQedge ( myInstance ) / ( kB * Temperature )
2011-09-16 21:25:18 +05:30
!* Initial shear rates
DotGamma0 = constitutive_dislotwin_sbVelocity ( myInstance )
!* Shear rates due to slip
constitutive_dislotwin_postResults ( c + j ) = &
2012-02-21 21:30:00 +05:30
DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** constitutive_dislotwin_q ( myInstance ) ) * sign ( 1.0_pReal , tau )
2011-09-16 21:25:18 +05:30
enddo
2012-02-21 21:30:00 +05:30
c = c + 6_pInt
2011-04-13 17:21:46 +05:30
case ( 'twin_fraction' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( g , ip , el ) % p ( ( 2_pInt * ns + 1_pInt ) : ( 2_pInt * ns + nt ) )
2011-04-13 17:21:46 +05:30
c = c + nt
case ( 'shear_rate_twin' )
if ( nt > 0_pInt ) then
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all twin families
2013-02-06 14:15:08 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1 , constitutive_dislotwin_Ntwin ( f , myInstance ) ! process each (active) twin system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Resolved shear stress on twin system
tau = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , myStructure ) )
!* Stress ratios
2012-02-21 21:30:00 +05:30
StressRatio_r = ( state ( g , ip , el ) % p ( 6_pInt * ns + 3_pInt * nt + j ) / tau ) ** constitutive_dislotwin_r ( myInstance )
2011-04-13 17:21:46 +05:30
!* Shear rates and their derivatives due to twin
if ( tau > 0.0_pReal ) then
constitutive_dislotwin_postResults ( c + j ) = &
( constitutive_dislotwin_MaxTwinFraction ( myInstance ) - sumf ) * &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( 6_pInt * ns + 4_pInt * nt + j ) * constitutive_dislotwin_Ndot0PerTwinSystem ( j , myInstance ) * exp ( - StressRatio_r )
2011-04-13 17:21:46 +05:30
endif
enddo ; enddo
endif
c = c + nt
case ( 'mfp_twin' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( g , ip , el ) % p ( ( 5_pInt * ns + 2_pInt * nt + 1_pInt ) : ( 5_pInt * ns + 3_pInt * nt ) )
2011-04-13 17:21:46 +05:30
c = c + nt
case ( 'resolved_stress_twin' )
if ( nt > 0_pInt ) then
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! loop over all slip families
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Ntwin ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
constitutive_dislotwin_postResults ( c + j ) = dot_product ( Tstar_v , lattice_Stwin_v ( : , index_myFamily + i , myStructure ) )
enddo ; enddo
endif
c = c + nt
case ( 'threshold_stress_twin' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + nt ) = state ( g , ip , el ) % p ( ( 6_pInt * ns + 3_pInt * nt + 1_pInt ) : ( 6_pInt * ns + 4_pInt * nt ) )
2011-04-13 17:21:46 +05:30
c = c + nt
case ( 'stress_exponent' )
j = 0_pInt
2012-02-21 21:30:00 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! loop over all slip families
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , myStructure ) ) ! at which index starts my family
do i = 1_pInt , constitutive_dislotwin_Nslip ( f , myInstance ) ! process each (active) slip system in family
2011-04-13 17:21:46 +05:30
j = j + 1_pInt
!* Resolved shear stress on slip system
2013-01-22 04:41:16 +05:30
tau = dot_product ( Tstar_v , lattice_Sslip_v ( : , 1 , index_myFamily + i , myStructure ) )
2011-04-13 17:21:46 +05:30
!* Stress ratios
2012-02-21 21:30:00 +05:30
StressRatio_p = ( abs ( tau ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
constitutive_dislotwin_p ( myInstance )
StressRatio_pminus1 = ( abs ( tau ) / state ( g , ip , el ) % p ( 5_pInt * ns + 3_pInt * nt + j ) ) ** &
( constitutive_dislotwin_p ( myInstance ) - 1.0_pReal )
2011-04-13 17:21:46 +05:30
!* Boltzmann ratio
2013-02-06 14:15:08 +05:30
BoltzmannRatio = constitutive_dislotwin_QedgePerSlipSystem ( j , myInstance ) / ( kB * Temperature )
2011-04-13 17:21:46 +05:30
!* Initial shear rates
DotGamma0 = &
2013-02-06 14:15:08 +05:30
state ( g , ip , el ) % p ( j ) * constitutive_dislotwin_burgersPerSlipSystem ( j , myInstance ) * &
constitutive_dislotwin_v0PerSlipSystem ( j , myInstance )
2011-04-13 17:21:46 +05:30
!* Shear rates due to slip
2012-02-21 21:30:00 +05:30
gdot_slip = DotGamma0 * exp ( - BoltzmannRatio * ( 1_pInt - StressRatio_p ) ** &
constitutive_dislotwin_q ( myInstance ) ) * sign ( 1.0_pReal , tau )
2011-04-13 17:21:46 +05:30
!* Derivatives of shear rates
dgdot_dtauslip = &
( ( abs ( gdot_slip ) * BoltzmannRatio * &
constitutive_dislotwin_p ( myInstance ) * constitutive_dislotwin_q ( myInstance ) ) / state ( g , ip , el ) % p ( 5 * ns + 3 * nt + j ) ) * &
2012-02-21 21:30:00 +05:30
StressRatio_pminus1 * ( 1_pInt - StressRatio_p ) ** ( constitutive_dislotwin_q ( myInstance ) - 1.0_pReal )
2011-04-13 17:21:46 +05:30
!* Stress exponent
if ( gdot_slip == 0.0_pReal ) then
constitutive_dislotwin_postResults ( c + j ) = 0.0_pReal
else
constitutive_dislotwin_postResults ( c + j ) = ( tau / gdot_slip ) * dgdot_dtauslip
endif
enddo ; enddo
c = c + ns
2011-09-16 21:25:18 +05:30
case ( 'sb_eigenvalues' )
2012-02-21 21:30:00 +05:30
forall ( j = 1_pInt : 3_pInt ) &
2011-09-16 21:25:18 +05:30
constitutive_dislotwin_postResults ( c + j ) = eigValues ( j )
2012-02-21 21:30:00 +05:30
c = c + 3_pInt
2011-09-16 21:25:18 +05:30
case ( 'sb_eigenvectors' )
2012-02-21 21:30:00 +05:30
constitutive_dislotwin_postResults ( c + 1_pInt : c + 9_pInt ) = reshape ( eigVectors , ( / 9 / ) )
c = c + 9_pInt
2011-04-13 17:21:46 +05:30
end select
enddo
end function
END MODULE