From 2c13ca53bcf160b74290468c178ab50ffff39c72 Mon Sep 17 00:00:00 2001 From: achalhp Date: Thu, 2 Nov 2023 22:15:15 +0530 Subject: [PATCH] Added correspondance matrix --- src/io.mod | Bin 0 -> 2912 bytes src/lattice.f90 | 67 +++++++++++++++++- src/math.f90 | 42 +++++++++++ ...phase_mechanical_plastic_phenopowerlaw.f90 | 38 +++++----- src/prec.mod | Bin 0 -> 13783 bytes 5 files changed, 127 insertions(+), 20 deletions(-) create mode 100644 src/io.mod create mode 100644 src/prec.mod diff --git a/src/io.mod b/src/io.mod new file mode 100644 index 0000000000000000000000000000000000000000..c51696395dd8014009ed8e1067b4eae9a192e6c9 GIT binary patch literal 2912 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 KipsbBTL1vRo3zvb literal 0 HcmV?d00001 diff --git a/src/lattice.f90 b/src/lattice.f90 index 7bd846d0f..0fda143d1 100644 --- a/src/lattice.f90 +++ b/src/lattice.f90 @@ -400,7 +400,8 @@ module lattice lattice_slip_direction, & lattice_slip_transverse, & lattice_labels_slip, & - lattice_labels_twin + lattice_labels_twin, & + lattice_CorrespondanceMatrix_twin !< Achal contains @@ -2283,4 +2284,68 @@ subroutine selfTest end subroutine selfTest +!-------------------------------------------------------------------------------------------------- +!> @brief correspondance matrix for twinning +!> details only active twin systems are considered +!-------------------------------------------------------------------------------------------------- +function lattice_CorrespondanceMatrix_twin(Ntwin,structure,cOverA) result(CorrespondanceMatrix) + use prec, only: & + tol_math_check + use IO, only: & + IO_error + use math, only: & + math_mul3333xx33, & + math_axisAngleToR, & + INRAD, & + math_I3 + + implicit none + integer, dimension(:), intent(in) :: Ntwin !< number of active twin systems per family + character(len=*), intent(in) :: structure !< lattice structure + real(pReal), intent(in) :: cOverA !< c/a ratio + real(pReal), dimension(3,3,sum(Ntwin)) :: CorrespondanceMatrix + + 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 + + if (len_trim(structure) /= 3) & + call IO_error(137,ext_msg='lattice_CorrespondanceMatrix_twin: '//trim(structure)) + + select case(structure(1:3)) + case('fcc') + NtwinMax = CF_NTWINSYSTEM + twinSystems = CF_SYSTEMTWIN + case('bcc') + NtwinMax = CI_NTWINSYSTEM + twinSystems = CI_SYSTEMTWIN + case('hex') + NtwinMax = HP_NTWINSYSTEM + twinSystems = HP_SYSTEMTWIN !< the twin system matrix is different from V2.0 + case default + call IO_error(137,ext_msg='lattice_CorrespondanceMatrix_twin: '//trim(structure)) + end select + + if (any(NtwinMax(1:size(Ntwin)) - Ntwin < 0)) & + call IO_error(145,ext_msg='Ntwin '//trim(structure)) + if (any(Ntwin < 0)) & + call IO_error(144,ext_msg='Ntwin '//trim(structure)) + + coordinateSystem = buildCoordinateSystem(Ntwin,NtwinMax,twinSystems,structure,cOverA) + ! characteristicShearTwin = 0.0_pReal*lattice_characteristicShear_Twin(Ntwin,structure,cOverA) ! for removing shear from CorrespondanceMatrix + characteristicShearTwin = lattice_characteristicShear_Twin(Ntwin,structure,cOverA) + SchmidMatrixTwin = lattice_SchmidMatrix_twin(Ntwin,structure,cOverA) + + do i = 1, sum(Ntwin) + CorrespondanceMatrix(1:3,1:3,i) = math_mul3333xx33(math_axisAngleToR(coordinateSystem(1:3,2,i), & + 180.0_pReal*INRAD), MATH_I3 + characteristicShearTwin(i)* & + SchmidMatrixTwin(1:3,1:3,i)) + enddo + +end function lattice_CorrespondanceMatrix_twin + + end module lattice diff --git a/src/math.f90 b/src/math.f90 index a875741b3..2902ed430 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -1488,4 +1488,46 @@ subroutine selfTest() end subroutine 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 63f7aa37f..1005a9912 100644 --- a/src/phase_mechanical_plastic_phenopowerlaw.f90 +++ b/src/phase_mechanical_plastic_phenopowerlaw.f90 @@ -280,18 +280,18 @@ module function plastic_phenopowerlaw_init() result(myPlasticity) Nmembers = count(material_phaseID == ph) sizeDotState = size(['xi_sl ','gamma_sl']) * prm%sum_N_sl & + size(['xi_tw ','gamma_tw']) * prm%sum_N_tw & - + size(['xi_tw_nucl','xi_tw_grow']) * prm%sum_N_tw !& ! Why not size(['xi_tw_nucl','gamma_tw'])? + + size(['xi_tw_nucl','xi_tw_grow']) * prm%sum_N_tw !& ! Achal Why not size(['xi_tw_nucl','gamma_tw'])? !+ size(['f_tw_nucl','f_tw_grow']) * prm%sum_N_tw & !+ size(['variant_twin','frozen']) * prm%sum_N_tw & sizeState = size(['xi_sl ','gamma_sl']) * prm%sum_N_sl & + size(['xi_tw ','gamma_tw']) * prm%sum_N_tw & - + size(['xi_tw_nucl','xi_tw_grow']) * prm%sum_N_tw !& ! Why not size(['xi_tw_nucl','gamma_tw'])? - !+ size(['f_tw_nucl','f_tw_grow']) * prm%sum_N_tw & - !+ size(['fmc_tw_nucl','fmc_tw_grow']) * prm%sum_N_tw & - !+ size(['variant_twin','frozen']) * prm%sum_N_tw & + + size(['xi_tw_nucl','xi_tw_grow']) * prm%sum_N_tw !& ! Achal Why not size(['xi_tw_nucl','gamma_tw'])? + !+ size(['f_tw_nucl','f_tw_grow']) * prm%sum_N_tw & !Achal + !+ size(['fmc_tw_nucl','fmc_tw_grow']) * prm%sum_N_tw & !Achal + !+ size(['variant_twin','frozen']) * prm%sum_N_tw & !Achal call phase_allocateState(plasticState(ph),Nmembers,sizeState,sizeDotState,0) - deallocate(plasticState(ph)%dotState) ! ToDo: remove dotState completely + deallocate(plasticState(ph)%dotState) ! ToDo: remove dotState completely !-------------------------------------------------------------------------------------------------- ! state aliases and initialization @@ -323,19 +323,19 @@ module function plastic_phenopowerlaw_init() result(myPlasticity) stt%gamma_tw => plasticState(ph)%state(startIndex:endIndex,:) plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) - startIndex = endIndex + 1 - endIndex = endIndex + prm%sum_N_tw - idx_dot%xi_tw_nucl = [startIndex,endIndex] - stt%xi_tw_nucl => plasticState(ph)%state(startIndex:endIndex,:) - stt%xi_tw_nucl = spread(xi_0_tw, 2, Nmembers) - plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) + startIndex = endIndex + 1 !Achal + endIndex = endIndex + prm%sum_N_tw !Achal + idx_dot%xi_tw_nucl = [startIndex,endIndex] !Achal + stt%xi_tw_nucl => plasticState(ph)%state(startIndex:endIndex,:) !Achal + stt%xi_tw_nucl = spread(xi_0_tw, 2, Nmembers) !Achal + plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) !Achal - startIndex = endIndex + 1 - endIndex = endIndex + prm%sum_N_tw - idx_dot%xi_tw_grow = [startIndex,endIndex] - stt%xi_tw_grow => plasticState(ph)%state(startIndex:endIndex,:) - stt%xi_tw_grow = spread(xi_0_tw, 2, Nmembers) - plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) + startIndex = endIndex + 1 !Achal + endIndex = endIndex + prm%sum_N_tw !Achal + idx_dot%xi_tw_grow = [startIndex,endIndex] !Achal + stt%xi_tw_grow => plasticState(ph)%state(startIndex:endIndex,:) !Achal + stt%xi_tw_grow = spread(xi_0_tw, 2, Nmembers) !Achal + plasticState(ph)%atol(startIndex:endIndex) = pl%get_asFloat('atol_gamma',defaultVal=1.0e-6_pReal) !Achal !startIndex = endIndex + 1 !endIndex = endIndex + prm%sum_N_tw @@ -601,7 +601,7 @@ module subroutine plastic_kinematic_deltaFp(twinJump,deltaFp,ipc, ip, el) ! ! enddo TwinLooptest -! !Saving the neighbor information in an array + !Saving the neighbor information in an array ! NeighborLoop1: do n = 1_pInt,FE_NipNeighbors(FE_celltype(FE_geomtype(mesh_element(2,el)))) ! only 4 neighbors for quasi 2D (1 element in z direction) ! neighbor_el = mesh_ipNeighborhood(1,n,ip,el) ! neighbor_ip = mesh_ipNeighborhood(2,n,ip,el) diff --git a/src/prec.mod b/src/prec.mod new file mode 100644 index 0000000000000000000000000000000000000000..9a27e158eb7089d9769aa65b1568b6bd837c33f9 GIT binary patch literal 13783 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 N{U6rWWu5Le0s#C>EJ6SP literal 0 HcmV?d00001