WIP: Calculation of elasticity matrices for twin and trans
This commit is contained in:
parent
3a2f86df1c
commit
032c35a499
197
src/lattice.f90
197
src/lattice.f90
|
@ -2085,6 +2085,10 @@ pure function lattice_qDisorientation(Q1, Q2, struct)
|
||||||
|
|
||||||
end function lattice_qDisorientation
|
end function lattice_qDisorientation
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Provides characteristtic shear for twinning
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(characteristicShear)
|
function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(characteristicShear)
|
||||||
use IO, only: &
|
use IO, only: &
|
||||||
IO_error
|
IO_error
|
||||||
|
@ -2107,10 +2111,13 @@ function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(charact
|
||||||
ig = sum(LATTICE_HEX_NTWINSYSTEM(1:mf-1))+ms
|
ig = sum(LATTICE_HEX_NTWINSYSTEM(1:mf-1))+ms
|
||||||
select case(structure)
|
select case(structure)
|
||||||
case('fcc')
|
case('fcc')
|
||||||
|
ig = sum(LATTICE_FCC_NTWINSYSTEM(1:mf-1))+ms
|
||||||
characteristicShear(ir) = LATTICE_FCC_SHEARTWIN(ig)
|
characteristicShear(ir) = LATTICE_FCC_SHEARTWIN(ig)
|
||||||
case('bcc')
|
case('bcc')
|
||||||
|
ig = sum(LATTICE_BCC_NTWINSYSTEM(1:mf-1))+ms
|
||||||
characteristicShear(ir) = LATTICE_BCC_SHEARTWIN(ig)
|
characteristicShear(ir) = LATTICE_BCC_SHEARTWIN(ig)
|
||||||
case('hex')
|
case('hex')
|
||||||
|
ig = sum(LATTICE_HEX_NTWINSYSTEM(1:mf-1))+ms
|
||||||
select case(LATTICE_HEX_SHEARTWIN(ig)) ! from Christian & Mahajan 1995 p.29
|
select case(LATTICE_HEX_SHEARTWIN(ig)) ! from Christian & Mahajan 1995 p.29
|
||||||
case (1_pInt) ! <-10.1>{10.2}
|
case (1_pInt) ! <-10.1>{10.2}
|
||||||
characteristicShear(ir) = (3.0_pReal-cOverA*cOverA)/sqrt(3.0_pReal)/CoverA
|
characteristicShear(ir) = (3.0_pReal-cOverA*cOverA)/sqrt(3.0_pReal)/CoverA
|
||||||
|
@ -2130,8 +2137,9 @@ function lattice_characteristicShear_Twin(Ntwin,structure,CoverA) result(charact
|
||||||
end function lattice_characteristicShear_Twin
|
end function lattice_characteristicShear_Twin
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Calculates rotated elasticity matrices for twinning
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
function lattice_C66_twin(Ntwin,C66,structure,CoverA)
|
function lattice_C66_twin(Ntwin,C66,structure,CoverA)
|
||||||
use IO, only: &
|
use IO, only: &
|
||||||
IO_error
|
IO_error
|
||||||
|
@ -2172,109 +2180,126 @@ function lattice_C66_twin(Ntwin,C66,structure,CoverA)
|
||||||
end function
|
end function
|
||||||
|
|
||||||
|
|
||||||
function lattice_C66_trans(Ntrans,C66_parent,structure_parent,cOverA_parent, &
|
!--------------------------------------------------------------------------------------------------
|
||||||
C66_target,structure_target,cOverA_target)
|
!> @brief Calculates rotated elasticity matrices for transformation
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function lattice_C66_trans(Ntrans,C_parent66,structure_parent, &
|
||||||
|
C_target66,structure_target)
|
||||||
|
use prec, only: &
|
||||||
|
tol_math_check
|
||||||
use IO, only: &
|
use IO, only: &
|
||||||
IO_error
|
IO_error
|
||||||
use math, only: &
|
use math, only: &
|
||||||
INRAD, &
|
INRAD, &
|
||||||
|
MATH_I3, &
|
||||||
math_axisAngleToR, &
|
math_axisAngleToR, &
|
||||||
math_Mandel3333to66, &
|
math_Mandel3333to66, &
|
||||||
math_Mandel66to3333, &
|
math_Mandel66to3333, &
|
||||||
math_rotate_forward3333
|
math_rotate_forward3333, &
|
||||||
|
math_mul33x33, &
|
||||||
|
math_tensorproduct33, &
|
||||||
|
math_crossproduct
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
integer(pInt), dimension(:), intent(in) :: Ntrans !< number of active twin systems per family
|
integer(pInt), dimension(:), intent(in) :: Ntrans !< number of active twin systems per family
|
||||||
character(len=*), intent(in) :: &
|
character(len=*), intent(in) :: &
|
||||||
structure_target, & !< lattice structure
|
structure_target, & !< lattice structure
|
||||||
structure_parent !< lattice structure
|
structure_parent !< lattice structure
|
||||||
real(pReal), dimension(6,6), intent(in) :: C66_target, C66_parent
|
real(pReal), dimension(6,6), intent(in) :: C_parent66, C_target66
|
||||||
real(pReal), intent(in) :: cOverA_parent, cOverA_target
|
real(pReal), dimension(6,6) :: C_bar66, C_target_unrotated66
|
||||||
real(pReal), dimension(6,6,sum(Ntrans)) :: lattice_C66_trans, C_bar66, C_target_unrotated66
|
real(pReal), dimension(6,6,sum(Ntrans)) :: lattice_C66_trans
|
||||||
|
|
||||||
real(pReal), dimension(3,3,sum(Ntrans)) :: coordinateSystem
|
real(pReal), dimension(3,3) :: R,B,U,Q,S,ss,sd,st
|
||||||
|
real(pReal), dimension(3) :: x,y,z
|
||||||
real(pReal), dimension(3,3) :: R
|
real(pReal) :: a_bcc, a_fcc, CoverA_trans
|
||||||
real(pReal) :: A, B
|
|
||||||
integer(pInt) :: i
|
integer(pInt) :: i
|
||||||
|
|
||||||
! if (trim(structure_parent) == 'fcc' .and. trim(structure_target) == 'hex') then
|
if (trim(structure_parent) /= 'hex') write(6,*) "Mist"
|
||||||
! C_bar66(1,1) = (C66_parent(1,1) + C66_parent(1,2) + 2.0_pReal*C66_parent(4,4))/2.0_pReal
|
|
||||||
! C_bar66(1,2) = (C66_parent(1,1) + 5.0_pReal*C66_parent(1,2) - 2.0_pReal*C66_parent(4,4))/6.0_pReal
|
!--------------------------------------------------------------------------------------------------
|
||||||
! C_bar66(3,3) = (C66_parent(1,1) + 2.0_pReal*C66_parent(1,2) + 4.0_pReal*C66_parent(4,4))/3.0_pReal
|
! elasticity matrix of the target phase in cube orientation
|
||||||
! C_bar66(1,3) = (C66_parent(1,1) + 2.0_pReal*C66_parent(1,2) - 2.0_pReal*C66_parent(4,4))/3.0_pReal
|
if (trim(structure_target) == 'hex') then
|
||||||
! C_bar66(4,4) = (C66_parent(1,1) - C66_parent(1,2) + C66_parent(4,4))/3.0_pReal
|
C_bar66(1,1) = (C_parent66(1,1) + C_parent66(1,2) + 2.0_pReal*C_parent66(4,4))/2.0_pReal
|
||||||
! C_bar66(1,4) = (C66_parent(1,1) - C66_parent(1,2) - 2.0_pReal*C66_parent(4,4)) /(3.0_pReal*sqrt(2.0_pReal))
|
C_bar66(1,2) = (C_parent66(1,1) + 5.0_pReal*C_parent66(1,2) - 2.0_pReal*C_parent66(4,4))/6.0_pReal
|
||||||
! A = C_bar(1,4)**2.0_pReal/C_bar66(4,4)
|
C_bar66(3,3) = (C_parent66(1,1) + 2.0_pReal*C_parent66(1,2) + 4.0_pReal*C_parent66(4,4))/3.0_pReal
|
||||||
! B = C_bar(1,4)**2.0_pReal/(0.5_pReal*(C_bar66(1,1) - C_bar66(1,2)))
|
C_bar66(1,3) = (C_parent66(1,1) + 2.0_pReal*C_parent66(1,2) - 2.0_pReal*C_parent66(4,4))/3.0_pReal
|
||||||
! C_target_unrotated66(1,1) = C_bar66(1,1) - A
|
C_bar66(4,4) = (C_parent66(1,1) - C_parent66(1,2) + C_parent66(4,4))/3.0_pReal
|
||||||
! C_target_unrotated66(1,2) = C_bar66(1,2) + A
|
C_bar66(1,4) = (C_parent66(1,1) - C_parent66(1,2) - 2.0_pReal*C_parent66(4,4)) /(3.0_pReal*sqrt(2.0_pReal))
|
||||||
! C_target_unrotated66(1,3) = C_bar66(1,3)
|
|
||||||
! C_target_unrotated66(3,3) = C_bar66(3,3)
|
C_target_unrotated66 = 0.0_pReal
|
||||||
! C_target_unrotated66(4,4) = C_bar66(4,4) - B
|
C_target_unrotated66(1,1) = C_bar66(1,1) - C_bar66(1,4)**2.0_pReal/C_bar66(4,4)
|
||||||
! C_target_unrotated66 = lattice_symmetrizeC66(LATTICE_HEX_ID,C_target_unrotated)
|
C_target_unrotated66(1,2) = C_bar66(1,2) + C_bar66(1,4)**2.0_pReal/C_bar66(4,4)
|
||||||
! elseif (trim(structure_parent) == 'fcc' .and. trim(structure_target) == 'bcc') then
|
C_target_unrotated66(1,3) = C_bar66(1,3)
|
||||||
! C_target_unrotated66 = C_parent66
|
C_target_unrotated66(3,3) = C_bar66(3,3)
|
||||||
! endif
|
C_target_unrotated66(4,4) = C_bar66(4,4) - C_bar66(1,4)**2.0_pReal/(0.5_pReal*(C_bar66(1,1) - C_bar66(1,2)))
|
||||||
! do i = 1_pInt, 6_pInt
|
C_target_unrotated66 = lattice_symmetrizeC66(LATTICE_HEX_ID,C_target_unrotated66)
|
||||||
! if (abs(C_target_unrotated66(i,i))<tol_math_check) &
|
elseif (trim(structure_target) == 'bcc') then
|
||||||
! call IO_error(135_pInt,el=i,ext_msg='matrix diagonal "el"ement in transformation')
|
C_target_unrotated66 = C_parent66
|
||||||
! enddo
|
else
|
||||||
!
|
write(6,*) "Mist"
|
||||||
! do i = 1, sum(Ntwin)
|
endif
|
||||||
|
|
||||||
|
do i = 1_pInt, 6_pInt
|
||||||
|
if (abs(C_target_unrotated66(i,i))<tol_math_check) &
|
||||||
|
call IO_error(135_pInt,el=i,ext_msg='matrix diagonal "el"ement in transformation')
|
||||||
|
enddo
|
||||||
|
|
||||||
|
if (trim(structure_parent) == 'fcc' .and. trim(structure_target) == 'hex') then
|
||||||
|
do i = 1_pInt,sum(Ntrans)!!!!!!!!!!!!!! NEED TO BE FIXED
|
||||||
|
R = math_axisAngleToR(lattice_fccTobcc_systemTrans(1:3,i), & ! Pitsch rotation
|
||||||
|
lattice_fccTobcc_systemTrans(4,i)*INRAD)
|
||||||
|
B = math_axisAngleToR(lattice_fccTobcc_bainRot(1:3,i), & ! Rotation of fcc to Bain coordinate system
|
||||||
|
lattice_fccTobcc_bainRot(4,i)*INRAD)
|
||||||
|
x = real(LATTICE_fccTobcc_bainVariant(1:3,i),pReal)
|
||||||
|
y = real(LATTICE_fccTobcc_bainVariant(4:6,i),pReal)
|
||||||
|
z = real(LATTICE_fccTobcc_bainVariant(7:9,i),pReal)
|
||||||
|
|
||||||
|
BainDeformation: if ((a_fcc > 0.0_pReal) .and. (a_bcc > 0.0_pReal)) then
|
||||||
|
U = (a_bcc/a_fcc)*math_tensorproduct33(x,x) + &
|
||||||
|
(a_bcc/a_fcc)*math_tensorproduct33(y,y) * sqrt(2.0_pReal) + &
|
||||||
|
(a_bcc/a_fcc)*math_tensorproduct33(z,z) * sqrt(2.0_pReal)
|
||||||
|
else BainDeformation
|
||||||
|
U = 0.0_pReal
|
||||||
|
endif BainDeformation
|
||||||
|
Q = math_mul33x33(R,B)
|
||||||
|
S = math_mul33x33(R,U) - MATH_I3
|
||||||
|
enddo
|
||||||
|
elseif (trim(structure_target) == 'bcc') then
|
||||||
|
ss = MATH_I3
|
||||||
|
ss(1,3) = sqrt(0.125_pReal)
|
||||||
|
sd = MATH_I3
|
||||||
|
if (CoverA_trans > 1.0_pReal .and. CoverA_trans < 2.0_pReal) then
|
||||||
|
sd(3,3) = CoverA_trans/sqrt(8.0_pReal/3.0_pReal)
|
||||||
|
endif
|
||||||
|
st = math_mul33x33(sd,ss)
|
||||||
|
do i = 1_pInt,sum(Ntrans)!!!!!!!!!!!!!! NEED TO BE FIXED
|
||||||
|
R(1:3,1) = lattice_fccTohex_systemTrans(1:3,i)/norm2(lattice_fccTohex_systemTrans(1:3,i))
|
||||||
|
R(1:3,3) = lattice_fccTohex_systemTrans(4:6,i)/norm2(lattice_fccTohex_systemTrans(4:6,i))
|
||||||
|
R(1:3,2) = -math_crossproduct(R(1:3,1),R(1:3,3))
|
||||||
|
Q = R
|
||||||
|
S = math_mul33x33(R, math_mul33x33(st, transpose(R))) - MATH_I3
|
||||||
|
! trs(i) = lattice_fccTohex_shearTrans(i)
|
||||||
|
enddo
|
||||||
|
else
|
||||||
|
write(6,*) "Mist"
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
do i = 1, sum(Ntrans)
|
||||||
! R = math_axisAngleToR(coordinateSystem(1:3,2,i), 180.0_pReal * INRAD) ! ToDo: Why always 180 deg?
|
! R = math_axisAngleToR(coordinateSystem(1:3,2,i), 180.0_pReal * INRAD) ! ToDo: Why always 180 deg?
|
||||||
! lattice_C66_trans(1:6,1:6,i) = math_Mandel3333to66(math_rotate_forward3333(math_Mandel66to3333(C66),R))
|
! lattice_C66_trans(1:6,1:6,i) = math_Mandel3333to66(math_rotate_forward3333(math_Mandel66to3333(C66),R))
|
||||||
! enddo
|
enddo
|
||||||
! ! Phase transformation
|
end function
|
||||||
! select case(trans_lattice_structure(myPhase))
|
|
||||||
! case (LATTICE_bcc_ID) ! fcc to bcc transformation
|
|
||||||
! do i = 1_pInt,myNtrans
|
|
||||||
! Rtr(1:3,1:3,i) = math_axisAngleToR(lattice_fccTobcc_systemTrans(1:3,i), & ! Pitsch rotation
|
|
||||||
! lattice_fccTobcc_systemTrans(4,i)*INRAD)
|
|
||||||
! Btr(1:3,1:3,i) = math_axisAngleToR(lattice_fccTobcc_bainRot(1:3,i), & ! Rotation of fcc to Bain coordinate system
|
|
||||||
! lattice_fccTobcc_bainRot(4,i)*INRAD)
|
|
||||||
! xtr(1:3,i) = real(LATTICE_fccTobcc_bainVariant(1:3,i),pReal)
|
|
||||||
! ytr(1:3,i) = real(LATTICE_fccTobcc_bainVariant(4:6,i),pReal)
|
|
||||||
! ztr(1:3,i) = real(LATTICE_fccTobcc_bainVariant(7:9,i),pReal)
|
|
||||||
! Utr(1:3,1:3,i) = 0.0_pReal ! Bain deformation
|
|
||||||
! if ((a_fcc > 0.0_pReal) .and. (a_bcc > 0.0_pReal)) then
|
|
||||||
! Utr(1:3,1:3,i) = (a_bcc/a_fcc)*math_tensorproduct33(xtr(1:3,i), xtr(1:3,i)) + &
|
|
||||||
! sqrt(2.0_pReal)*(a_bcc/a_fcc)*math_tensorproduct33(ytr(1:3,i), ytr(1:3,i)) + &
|
|
||||||
! sqrt(2.0_pReal)*(a_bcc/a_fcc)*math_tensorproduct33(ztr(1:3,i), ztr(1:3,i))
|
|
||||||
! endif
|
|
||||||
! Qtr(1:3,1:3,i) = math_mul33x33(Rtr(1:3,1:3,i), Btr(1:3,1:3,i))
|
|
||||||
! Str(1:3,1:3,i) = math_mul33x33(Rtr(1:3,1:3,i), Utr(1:3,1:3,i)) - MATH_I3
|
|
||||||
! enddo
|
|
||||||
! case (LATTICE_hex_ID)
|
|
||||||
! sstr(1:3,1:3) = MATH_I3
|
|
||||||
! sstr(1,3) = sqrt(2.0_pReal)/4.0_pReal
|
|
||||||
! sdtr(1:3,1:3) = MATH_I3
|
|
||||||
! if (CoverA_trans > 1.0_pReal .and. CoverA_trans < 2.0_pReal) then
|
|
||||||
! sdtr(3,3) = CoverA_trans/sqrt(8.0_pReal/3.0_pReal)
|
|
||||||
! endif
|
|
||||||
! sttr = math_mul33x33(sdtr, sstr)
|
|
||||||
! do i = 1_pInt,myNtrans
|
|
||||||
! xtr(1:3,i) = lattice_fccTohex_systemTrans(1:3,i)/norm2(lattice_fccTohex_systemTrans(1:3,i))
|
|
||||||
! ztr(1:3,i) = lattice_fccTohex_systemTrans(4:6,i)/norm2(lattice_fccTohex_systemTrans(4:6,i))
|
|
||||||
! ytr(1:3,i) = -math_crossproduct(xtr(1:3,i), ztr(1:3,i))
|
|
||||||
! Rtr(1:3,1,i) = xtr(1:3,i)
|
|
||||||
! Rtr(1:3,2,i) = ytr(1:3,i)
|
|
||||||
! Rtr(1:3,3,i) = ztr(1:3,i)
|
|
||||||
! Qtr(1:3,1:3,i) = Rtr(1:3,1:3,i)
|
|
||||||
! Str(1:3,1:3,i) = math_mul33x33(Rtr(1:3,1:3,i), math_mul33x33(sttr, math_transpose33(Rtr(1:3,1:3,i))))
|
|
||||||
! Str(1:3,1:3,i) = Str(1:3,1:3,i) - MATH_I3
|
|
||||||
! trs(i) = lattice_fccTohex_shearTrans(i)
|
|
||||||
! enddo
|
|
||||||
! case default
|
|
||||||
! Qtr = 0.0_pReal
|
|
||||||
! Str = 0.0_pReal
|
|
||||||
! end select
|
|
||||||
|
|
||||||
end function
|
|
||||||
|
|
||||||
! ! Schmid matrices with non-Schmid contributions according to Koester_etal2012, Acta Materialia 60 (2012) 3894–3901, eq. (17) ("n1" is replaced by either "np" or "nn" according to either positive or negative slip direction)
|
|
||||||
! ! "np" and "nn" according to Gröger_etal2008, Acta Materialia 56 (2008) 5412–5425, table 1 (corresponds to their "n1" for positive and negative slip direction respectively)
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Non-schmid tensor
|
||||||
|
! Schmid matrices with non-Schmid contributions according to Koester_etal2012, Acta Materialia 60 (2012)
|
||||||
|
! 3894–3901, eq. (17) ("n1" is replaced by either "np" or "nn" according to either positive or negative slip direction)
|
||||||
|
! "np" and "nn" according to Gröger_etal2008, Acta Materialia 56 (2008) 5412–5425, table 1
|
||||||
|
! (corresponds to their "n1" for positive and negative slip direction respectively)
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
function lattice_nonSchmidMatrix(Nslip,nonSchmidCoefficients,sense) result(nonSchmidMatrix)
|
function lattice_nonSchmidMatrix(Nslip,nonSchmidCoefficients,sense) result(nonSchmidMatrix)
|
||||||
use math, only: &
|
use math, only: &
|
||||||
INRAD, &
|
INRAD, &
|
||||||
|
@ -2700,8 +2725,8 @@ pure function buildCoordinateSystem(active,system,structure,cOverA)
|
||||||
|
|
||||||
end select
|
end select
|
||||||
|
|
||||||
buildCoordinateSystem(1:3,1,ir) = direction/norm2(direction) ! make unit vector
|
buildCoordinateSystem(1:3,1,ir) = direction/norm2(direction)
|
||||||
buildCoordinateSystem(1:3,2,ir) = normal/norm2(normal) ! make unit vector
|
buildCoordinateSystem(1:3,2,ir) = normal/norm2(normal)
|
||||||
buildCoordinateSystem(1:3,3,ir) = math_crossproduct(direction,normal)
|
buildCoordinateSystem(1:3,3,ir) = math_crossproduct(direction,normal)
|
||||||
|
|
||||||
enddo mySystems
|
enddo mySystems
|
||||||
|
|
Loading…
Reference in New Issue