Correspondence Matrix applied
This commit is contained in:
parent
23a9db6f09
commit
508c7148fe
|
@ -404,6 +404,7 @@ module crystal
|
||||||
crystal_slip_direction, &
|
crystal_slip_direction, &
|
||||||
crystal_slip_transverse, &
|
crystal_slip_transverse, &
|
||||||
crystal_labels_slip, &
|
crystal_labels_slip, &
|
||||||
|
crystal_CorrespondenceMatrix_twin, &
|
||||||
crystal_labels_twin
|
crystal_labels_twin
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
@ -2111,6 +2112,60 @@ function getlabels(active,potential,system) result(labels)
|
||||||
|
|
||||||
end function getlabels
|
end function getlabels
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief correspondence matrix for twinning
|
||||||
|
!> details only active twin systems are considered
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function crystal_CorrespondenceMatrix_twin(Ntwin,lattice,cOverA) result(CorrespondenceMatrix)
|
||||||
|
|
||||||
|
integer, dimension(:), intent(in) :: Ntwin !< number of active twin systems per family
|
||||||
|
character(len=*), intent(in) :: lattice !< lattice structure
|
||||||
|
real(pReal), intent(in) :: cOverA !< c/a ratio
|
||||||
|
real(pReal), dimension(3,3,sum(Ntwin)) :: CorrespondenceMatrix
|
||||||
|
|
||||||
|
real(pReal), dimension(3,3,sum(Ntwin)) :: coordinateSystem
|
||||||
|
real(pReal), dimension(sum(Ntwin)) :: characteristicShearTwin
|
||||||
|
real(pReal), dimension(3,3,sum(Ntwin)) :: SchmidMatrixTwin
|
||||||
|
real(pReal), dimension(:,:), allocatable :: twinSystems
|
||||||
|
integer, dimension(:), allocatable :: NtwinMax
|
||||||
|
integer :: i
|
||||||
|
|
||||||
|
select case(lattice)
|
||||||
|
case('cF')
|
||||||
|
NtwinMax = CF_NTWINSYSTEM
|
||||||
|
twinSystems = CF_SYSTEMTWIN
|
||||||
|
case('cI')
|
||||||
|
NtwinMax = CI_NTWINSYSTEM
|
||||||
|
twinSystems = CI_SYSTEMTWIN
|
||||||
|
case('hP')
|
||||||
|
NtwinMax = HP_NTWINSYSTEM
|
||||||
|
twinSystems = HP_SYSTEMTWIN !< the twin system matrix is different from V2.0
|
||||||
|
case default
|
||||||
|
allocate(NtwinMax(0))
|
||||||
|
call IO_error(137,ext_msg='crystal_CorrespondenceMatrix_twin: '//trim(lattice))
|
||||||
|
end select
|
||||||
|
|
||||||
|
if (any(NtwinMax(1:size(Ntwin)) - Ntwin < 0)) &
|
||||||
|
call IO_error(145,ext_msg='Ntwin '//trim(lattice))
|
||||||
|
if (any(Ntwin < 0)) &
|
||||||
|
call IO_error(144,ext_msg='Ntwin '//trim(lattice))
|
||||||
|
|
||||||
|
coordinateSystem = buildCoordinateSystem(Ntwin,NtwinMax,twinSystems,lattice,cOverA)
|
||||||
|
! characteristicShearTwin = 0.0_pReal*lattice_characteristicShear_Twin(Ntwin,lattice,cOverA) ! for removing shear from CorrespondenceMatrix
|
||||||
|
characteristicShearTwin = crystal_characteristicShear_Twin(Ntwin,lattice,cOverA)
|
||||||
|
SchmidMatrixTwin = crystal_SchmidMatrix_twin(Ntwin,lattice,cOverA)
|
||||||
|
|
||||||
|
!write(6,*)'coordinate system', coordinateSystem(1:3,2,1)
|
||||||
|
|
||||||
|
!CorrespondenceMatrix(1:3,1:3,1) = math_axisAngleToR(coordinateSystem(1:3,2,6), 180.0_pReal*INRAD) ! delete this
|
||||||
|
|
||||||
|
do i = 1, sum(Ntwin)
|
||||||
|
CorrespondenceMatrix(1:3,1:3,i) = matmul(math_axisAngleToR(coordinateSystem(1:3,2,i), &
|
||||||
|
180.0_pReal*INRAD), MATH_I3 + characteristicShearTwin(i)* &
|
||||||
|
SchmidMatrixTwin(1:3,1:3,i))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
end function crystal_CorrespondenceMatrix_twin
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief Equivalent Poisson's ratio (ν)
|
!> @brief Equivalent Poisson's ratio (ν)
|
||||||
|
@ -2307,4 +2362,7 @@ subroutine crystal_selfTest()
|
||||||
|
|
||||||
end subroutine crystal_selfTest
|
end subroutine crystal_selfTest
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end module crystal
|
end module crystal
|
||||||
|
|
42
src/math.f90
42
src/math.f90
|
@ -1470,4 +1470,46 @@ subroutine math_selfTest()
|
||||||
|
|
||||||
end subroutine math_selfTest
|
end subroutine math_selfTest
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief rotation matrix from axis and angle (in radians)
|
||||||
|
!> @details rotation matrix is meant to represent a ACTIVE rotation
|
||||||
|
!> @details (see http://en.wikipedia.org/wiki/Euler_angles for definitions)
|
||||||
|
!> @details formula for active rotation taken from http://mathworld.wolfram.com/RodriguesRotationFormula.html
|
||||||
|
!> @details equivalent to eu2om (P=-1) from "D Rowenhorst et al. Consistent representations of and
|
||||||
|
!> @details conversions between 3D rotations, Model. Simul. Mater. Sci. Eng. 23-8 (2015)"
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
pure function math_axisAngleToR(axis,omega)
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
real(pReal), dimension(3,3) :: math_axisAngleToR
|
||||||
|
real(pReal), dimension(3), intent(in) :: axis
|
||||||
|
real(pReal), intent(in) :: omega
|
||||||
|
real(pReal), dimension(3) :: n
|
||||||
|
real(pReal) :: norm,s,c,c1
|
||||||
|
|
||||||
|
norm = norm2(axis)
|
||||||
|
wellDefined: if (norm > 1.0e-8_pReal) then
|
||||||
|
n = axis/norm ! normalize axis to be sure
|
||||||
|
|
||||||
|
s = sin(omega)
|
||||||
|
c = cos(omega)
|
||||||
|
c1 = 1.0_pReal - c
|
||||||
|
|
||||||
|
math_axisAngleToR(1,1) = c + c1*n(1)**2.0_pReal
|
||||||
|
math_axisAngleToR(1,2) = c1*n(1)*n(2) - s*n(3)
|
||||||
|
math_axisAngleToR(1,3) = c1*n(1)*n(3) + s*n(2)
|
||||||
|
|
||||||
|
math_axisAngleToR(2,1) = c1*n(1)*n(2) + s*n(3)
|
||||||
|
math_axisAngleToR(2,2) = c + c1*n(2)**2.0_pReal
|
||||||
|
math_axisAngleToR(2,3) = c1*n(2)*n(3) - s*n(1)
|
||||||
|
|
||||||
|
math_axisAngleToR(3,1) = c1*n(1)*n(3) - s*n(2)
|
||||||
|
math_axisAngleToR(3,2) = c1*n(2)*n(3) + s*n(1)
|
||||||
|
math_axisAngleToR(3,3) = c + c1*n(3)**2.0_pReal
|
||||||
|
else wellDefined
|
||||||
|
math_axisAngleToR = math_I3
|
||||||
|
endif wellDefined
|
||||||
|
|
||||||
|
end function math_axisAngleToR
|
||||||
|
|
||||||
end module math
|
end module math
|
||||||
|
|
|
@ -32,7 +32,8 @@ submodule(phase:plastic) phenopowerlaw
|
||||||
P_sl, &
|
P_sl, &
|
||||||
P_tw, &
|
P_tw, &
|
||||||
P_nS_pos, &
|
P_nS_pos, &
|
||||||
P_nS_neg
|
P_nS_neg, &
|
||||||
|
CorrespondenceMatrix
|
||||||
integer :: &
|
integer :: &
|
||||||
sum_N_sl, & !< total number of active slip system
|
sum_N_sl, & !< total number of active slip system
|
||||||
sum_N_tw !< total number of active twin systems
|
sum_N_tw !< total number of active twin systems
|
||||||
|
@ -203,6 +204,7 @@ module function plastic_phenopowerlaw_init() result(myPlasticity)
|
||||||
prm%c_4 = math_expand(pl%get_as1dReal('c_4', requiredSize=size(N_tw), &
|
prm%c_4 = math_expand(pl%get_as1dReal('c_4', requiredSize=size(N_tw), &
|
||||||
defaultVal=misc_zeros(size(N_tw))), N_tw)
|
defaultVal=misc_zeros(size(N_tw))), N_tw)
|
||||||
|
|
||||||
|
prm%CorrespondenceMatrix = crystal_CorrespondenceMatrix_twin(N_tw,phase_lattice(ph),phase_cOverA(ph))
|
||||||
prm%gamma_char = crystal_characteristicShear_twin(N_tw,phase_lattice(ph),phase_cOverA(ph))
|
prm%gamma_char = crystal_characteristicShear_twin(N_tw,phase_lattice(ph),phase_cOverA(ph))
|
||||||
prm%h_tw_tw = crystal_interaction_TwinByTwin(N_tw,pl%get_as1dReal('h_tw-tw'),phase_lattice(ph))
|
prm%h_tw_tw = crystal_interaction_TwinByTwin(N_tw,pl%get_as1dReal('h_tw-tw'),phase_lattice(ph))
|
||||||
|
|
||||||
|
@ -225,6 +227,7 @@ module function plastic_phenopowerlaw_init() result(myPlasticity)
|
||||||
prm%h_0_tw_tw, &
|
prm%h_0_tw_tw, &
|
||||||
source=emptyRealArray)
|
source=emptyRealArray)
|
||||||
allocate(prm%h_tw_tw(0,0))
|
allocate(prm%h_tw_tw(0,0))
|
||||||
|
allocate(prm%CorrespondenceMatrix(0,0,0))
|
||||||
end if twinActive
|
end if twinActive
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -511,7 +514,7 @@ pure subroutine kinetics_tw(Mp,ph,en,&
|
||||||
|
|
||||||
associate(prm => param(ph), stt => state(ph))
|
associate(prm => param(ph), stt => state(ph))
|
||||||
|
|
||||||
tau_tw = [(math_tensordot(Mp,prm%P_tw(1:3,1:3,i)),i=1,prm%sum_N_tw)]
|
tau_tw = [(math_tensordot(Mp,prm%CorrespondenceMatrix(1:3,1:3,i)),i=1,prm%sum_N_tw)]
|
||||||
|
|
||||||
where(tau_tw > 0.0_pREAL)
|
where(tau_tw > 0.0_pREAL)
|
||||||
dot_gamma_tw = (1.0_pREAL-sum(stt%gamma_tw(:,en)/prm%gamma_char)) & ! only twin in untwinned volume fraction
|
dot_gamma_tw = (1.0_pREAL-sum(stt%gamma_tw(:,en)/prm%gamma_char)) & ! only twin in untwinned volume fraction
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue