From 508c7148fe8573e9d776dd3a177ad794993dcc2d Mon Sep 17 00:00:00 2001 From: achalhp Date: Mon, 4 Mar 2024 11:50:03 +0530 Subject: [PATCH] Correspondence Matrix applied --- src/crystal.f90 | 58 ++++++++++++++++++ src/math.f90 | 42 +++++++++++++ ...phase_mechanical_plastic_phenopowerlaw.f90 | 9 ++- src/prec.mod | Bin 0 -> 13810 bytes 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 src/prec.mod diff --git a/src/crystal.f90 b/src/crystal.f90 index ff3291010..455f7ed1a 100644 --- a/src/crystal.f90 +++ b/src/crystal.f90 @@ -404,6 +404,7 @@ module crystal crystal_slip_direction, & crystal_slip_transverse, & crystal_labels_slip, & + crystal_CorrespondenceMatrix_twin, & crystal_labels_twin contains @@ -2111,6 +2112,60 @@ function getlabels(active,potential,system) result(labels) 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 (ν) @@ -2307,4 +2362,7 @@ subroutine crystal_selfTest() end subroutine crystal_selfTest + + + end module crystal diff --git a/src/math.f90 b/src/math.f90 index ec97846c0..c119f323a 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -1470,4 +1470,46 @@ 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 diff --git a/src/phase_mechanical_plastic_phenopowerlaw.f90 b/src/phase_mechanical_plastic_phenopowerlaw.f90 index c1767184b..034b41b84 100644 --- a/src/phase_mechanical_plastic_phenopowerlaw.f90 +++ b/src/phase_mechanical_plastic_phenopowerlaw.f90 @@ -32,7 +32,8 @@ submodule(phase:plastic) phenopowerlaw P_sl, & P_tw, & P_nS_pos, & - P_nS_neg + P_nS_neg, & + CorrespondenceMatrix integer :: & sum_N_sl, & !< total number of active slip system sum_N_tw !< total number of active twin systems @@ -203,12 +204,13 @@ module function plastic_phenopowerlaw_init() result(myPlasticity) prm%c_4 = math_expand(pl%get_as1dReal('c_4', requiredSize=size(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%h_tw_tw = crystal_interaction_TwinByTwin(N_tw,pl%get_as1dReal('h_tw-tw'),phase_lattice(ph)) prm%P_tw = crystal_SchmidMatrix_twin(N_tw,phase_lattice(ph),phase_cOverA(ph)) prm%systems_tw = crystal_labels_twin(N_tw,phase_lattice(ph)) - + ! sanity checks if (any(prm%dot_gamma_0_tw <= 0.0_pREAL)) extmsg = trim(extmsg)//' dot_gamma_0_tw' if (any(prm%n_tw <= 0.0_pREAL)) extmsg = trim(extmsg)//' n_tw' @@ -225,6 +227,7 @@ module function plastic_phenopowerlaw_init() result(myPlasticity) prm%h_0_tw_tw, & source=emptyRealArray) allocate(prm%h_tw_tw(0,0)) + allocate(prm%CorrespondenceMatrix(0,0,0)) end if twinActive !-------------------------------------------------------------------------------------------------- @@ -511,7 +514,7 @@ pure subroutine kinetics_tw(Mp,ph,en,& 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) dot_gamma_tw = (1.0_pREAL-sum(stt%gamma_tw(:,en)/prm%gamma_char)) & ! only twin in untwinned volume fraction diff --git a/src/prec.mod b/src/prec.mod new file mode 100644 index 0000000000000000000000000000000000000000..5fe4cd9e886353aba5b99362c5d64c0ca737c7b7 GIT binary patch literal 13810 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 o83X1r?etN&!UBg$1120QRspsQ>@~ literal 0 HcmV?d00001