Merge branch 'rotate-Voigt' into 'development'
Rotate voigt See merge request damask/DAMASK!463
This commit is contained in:
commit
7e7098baf7
|
@ -405,7 +405,7 @@ module lattice
|
|||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief module initialization
|
||||
!> @brief Module initialization
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine lattice_init
|
||||
|
||||
|
@ -417,7 +417,7 @@ end subroutine lattice_init
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief characteristic shear for twinning
|
||||
!> @brief Characteristic shear for twinning
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_characteristicShear_Twin(Ntwin,lattice,CoverA) result(characteristicShear)
|
||||
|
||||
|
@ -491,7 +491,7 @@ end function lattice_characteristicShear_Twin
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief rotated elasticity matrices for twinning in 6x6-matrix notation
|
||||
!> @brief Rotated elasticity matrices for twinning in 6x6-matrix notation
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_C66_twin(Ntwin,C66,lattice,CoverA)
|
||||
|
||||
|
@ -522,14 +522,14 @@ function lattice_C66_twin(Ntwin,C66,lattice,CoverA)
|
|||
|
||||
do i = 1, sum(Ntwin)
|
||||
call R%fromAxisAngle([coordinateSystem(1:3,2,i),PI],P=1) ! ToDo: Why always 180 deg?
|
||||
lattice_C66_twin(1:6,1:6,i) = math_3333toVoigt66(R%rotTensor4(math_Voigt66to3333(C66)))
|
||||
lattice_C66_twin(1:6,1:6,i) = R%rotStiffness(C66)
|
||||
enddo
|
||||
|
||||
end function lattice_C66_twin
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief rotated elasticity matrices for transformation in 6x6-matrix notation
|
||||
!> @brief Rotated elasticity matrices for transformation in 6x6-matrix notation
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_C66_trans(Ntrans,C_parent66,lattice_target, &
|
||||
cOverA_trans,a_bcc,a_fcc)
|
||||
|
@ -548,6 +548,8 @@ function lattice_C66_trans(Ntrans,C_parent66,lattice_target, &
|
|||
!--------------------------------------------------------------------------------------------------
|
||||
! elasticity matrix of the target phase in cube orientation
|
||||
if (lattice_target == 'hP') then
|
||||
! https://doi.org/10.1063/1.1663858 eq. (16), eq. (18), eq. (19)
|
||||
! https://doi.org/10.1016/j.actamat.2016.07.032 eq. (47), eq. (48)
|
||||
if (cOverA_trans < 1.0_pReal .or. cOverA_trans > 2.0_pReal) &
|
||||
call IO_error(131,ext_msg='lattice_C66_trans: '//trim(lattice_target))
|
||||
C_bar66(1,1) = (C_parent66(1,1) + C_parent66(1,2) + 2.0_pReal*C_parent66(4,4))/2.0_pReal
|
||||
|
@ -581,14 +583,14 @@ function lattice_C66_trans(Ntrans,C_parent66,lattice_target, &
|
|||
|
||||
do i = 1,sum(Ntrans)
|
||||
call R%fromMatrix(Q(1:3,1:3,i))
|
||||
lattice_C66_trans(1:6,1:6,i) = math_3333toVoigt66(R%rotTensor4(math_Voigt66to3333(C_target_unrotated66)))
|
||||
lattice_C66_trans(1:6,1:6,i) = R%rotStiffness(C_target_unrotated66)
|
||||
enddo
|
||||
|
||||
end function lattice_C66_trans
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief non-Schmid projections for bcc with up to 6 coefficients
|
||||
!> @brief Non-schmid projections for bcc with up to 6 coefficients
|
||||
! Koester et al. 2012, Acta Materialia 60 (2012) 3894–3901, eq. (17)
|
||||
! Gröger et al. 2008, Acta Materialia 56 (2008) 5412–5425, table 1
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -635,7 +637,7 @@ end function lattice_nonSchmidMatrix
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief slip-slip interaction matrix
|
||||
!> @brief Slip-slip interaction matrix
|
||||
!> details only active slip systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_SlipBySlip(Nslip,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -884,7 +886,7 @@ end function lattice_interaction_SlipBySlip
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief twin-twin interaction matrix
|
||||
!> @brief Twin-twin interaction matrix
|
||||
!> details only active twin systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_TwinByTwin(Ntwin,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -983,7 +985,7 @@ end function lattice_interaction_TwinByTwin
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief trans-trans interaction matrix
|
||||
!> @brief Trans-trans interaction matrix
|
||||
!> details only active trans systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_TransByTrans(Ntrans,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -1025,7 +1027,7 @@ end function lattice_interaction_TransByTrans
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief slip-twin interaction matrix
|
||||
!> @brief Slip-twin interaction matrix
|
||||
!> details only active slip and twin systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_SlipByTwin(Nslip,Ntwin,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -1189,7 +1191,7 @@ end function lattice_interaction_SlipByTwin
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief slip-trans interaction matrix
|
||||
!> @brief Slip-trans interaction matrix
|
||||
!> details only active slip and trans systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_SlipByTrans(Nslip,Ntrans,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -1242,7 +1244,7 @@ function lattice_interaction_SlipByTrans(Nslip,Ntrans,interactionValues,lattice)
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief twin-slip interaction matrix
|
||||
!> @brief Twin-slip interaction matrix
|
||||
!> details only active twin and slip systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_interaction_TwinBySlip(Ntwin,Nslip,interactionValues,lattice) result(interactionMatrix)
|
||||
|
@ -1487,7 +1489,7 @@ end function lattice_SchmidMatrix_cleavage
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief slip direction of slip systems (|| b)
|
||||
!> @brief Slip direction of slip systems (|| b)
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_slip_direction(Nslip,lattice,cOverA) result(d)
|
||||
|
||||
|
@ -1505,7 +1507,7 @@ end function lattice_slip_direction
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief normal direction of slip systems (|| n)
|
||||
!> @brief Normal direction of slip systems (|| n)
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_slip_normal(Nslip,lattice,cOverA) result(n)
|
||||
|
||||
|
@ -1523,7 +1525,7 @@ end function lattice_slip_normal
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief transverse direction of slip systems (|| t = b x n)
|
||||
!> @brief Transverse direction of slip systems (|| t = b x n)
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_slip_transverse(Nslip,lattice,cOverA) result(t)
|
||||
|
||||
|
@ -1541,7 +1543,7 @@ end function lattice_slip_transverse
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief labels of slip systems
|
||||
!> @brief Labels of slip systems
|
||||
!> details only active slip systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_labels_slip(Nslip,lattice) result(labels)
|
||||
|
@ -1582,7 +1584,7 @@ end function lattice_labels_slip
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief return 3x3 tensor with symmetry according to given Bravais lattice
|
||||
!> @brief Return 3x3 tensor with symmetry according to given Bravais lattice
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function lattice_symmetrize_33(T,lattice) result(T_sym)
|
||||
|
||||
|
@ -1609,7 +1611,7 @@ end function lattice_symmetrize_33
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief return stiffness matrix in 6x6 notation with symmetry according to given Bravais lattice
|
||||
!> @brief Return stiffness matrix in 6x6 notation with symmetry according to given Bravais lattice
|
||||
!> @details J. A. Rayne and B. S. Chandrasekhar Phys. Rev. 120, 1658 Erratum Phys. Rev. 122, 1962
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function lattice_symmetrize_C66(C66,lattice) result(C66_sym)
|
||||
|
@ -1655,7 +1657,7 @@ end function lattice_symmetrize_C66
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief labels of twin systems
|
||||
!> @brief Labels for twin systems
|
||||
!> details only active twin systems are considered
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_labels_twin(Ntwin,lattice) result(labels)
|
||||
|
@ -1693,7 +1695,7 @@ end function lattice_labels_twin
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief projection of the transverse direction onto the slip plane
|
||||
!> @brief Projection of the transverse direction onto the slip plane
|
||||
!> @details: This projection is used to calculate forest hardening for edge dislocations
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function slipProjection_transverse(Nslip,lattice,cOverA) result(projection)
|
||||
|
@ -1717,7 +1719,7 @@ end function slipProjection_transverse
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief projection of the slip direction onto the slip plane
|
||||
!> @brief Projection of the slip direction onto the slip plane
|
||||
!> @details: This projection is used to calculate forest hardening for screw dislocations
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function slipProjection_direction(Nslip,lattice,cOverA) result(projection)
|
||||
|
@ -1783,7 +1785,7 @@ end function coordinateSystem_slip
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief populate reduced interaction matrix
|
||||
!> @brief Populate reduced interaction matrix
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function buildInteraction(reacting_used,acting_used,reacting_max,acting_max,values,matrix)
|
||||
|
||||
|
@ -1826,7 +1828,7 @@ end function buildInteraction
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief build a local coordinate system on slip, twin, trans, cleavage systems
|
||||
!> @brief Build a local coordinate system on slip, twin, trans, cleavage systems
|
||||
!> @details Order: Direction, plane (normal), and common perpendicular
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function buildCoordinateSystem(active,potential,system,lattice,cOverA)
|
||||
|
@ -1893,7 +1895,7 @@ end function buildCoordinateSystem
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief helper function to define transformation systems
|
||||
!> @brief Helper function to define transformation systems
|
||||
! Needed to calculate Schmid matrix and rotated stiffness matrices.
|
||||
! @details: set c/a = 0.0 for fcc -> bcc transformation
|
||||
! set a_Xcc = 0.0 for fcc -> hex transformation
|
||||
|
@ -2077,7 +2079,7 @@ end function getlabels
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief equivalent Poisson's ratio (ν)
|
||||
!> @brief Equivalent Poisson's ratio (ν)
|
||||
!> @details https://doi.org/10.1143/JPSJ.20.635
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_equivalent_nu(C,assumption) result(nu)
|
||||
|
@ -2110,7 +2112,7 @@ end function lattice_equivalent_nu
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief equivalent shear modulus (μ)
|
||||
!> @brief Equivalent shear modulus (μ)
|
||||
!> @details https://doi.org/10.1143/JPSJ.20.635
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
function lattice_equivalent_mu(C,assumption) result(mu)
|
||||
|
@ -2139,7 +2141,7 @@ end function lattice_equivalent_mu
|
|||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief check correctness of some lattice functions
|
||||
!> @brief Check correctness of some lattice functions.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine selfTest
|
||||
|
||||
|
|
77
src/math.f90
77
src/math.f90
|
@ -806,7 +806,7 @@ pure function math_sym3333to66(m3333,weighted)
|
|||
w = merge(NRMMANDEL,1.0_pReal,weighted)
|
||||
else
|
||||
w = NRMMANDEL
|
||||
endif
|
||||
end if
|
||||
|
||||
#ifndef __INTEL_COMPILER
|
||||
do concurrent(i=1:6, j=1:6)
|
||||
|
@ -841,20 +841,83 @@ pure function math_66toSym3333(m66,weighted)
|
|||
w = merge(INVNRMMANDEL,1.0_pReal,weighted)
|
||||
else
|
||||
w = INVNRMMANDEL
|
||||
endif
|
||||
end if
|
||||
|
||||
do i=1,6; do j=1,6
|
||||
math_66toSym3333(MAPNYE(1,i),MAPNYE(2,i),MAPNYE(1,j),MAPNYE(2,j)) = w(i)*w(j)*m66(i,j)
|
||||
math_66toSym3333(MAPNYE(2,i),MAPNYE(1,i),MAPNYE(1,j),MAPNYE(2,j)) = w(i)*w(j)*m66(i,j)
|
||||
math_66toSym3333(MAPNYE(1,i),MAPNYE(2,i),MAPNYE(2,j),MAPNYE(1,j)) = w(i)*w(j)*m66(i,j)
|
||||
math_66toSym3333(MAPNYE(2,i),MAPNYE(1,i),MAPNYE(2,j),MAPNYE(1,j)) = w(i)*w(j)*m66(i,j)
|
||||
enddo; enddo
|
||||
end do; end do
|
||||
|
||||
end function math_66toSym3333
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief convert 6x6 Voigt matrix into symmetric 3x3x3x3 matrix
|
||||
!> @brief Convert 6 Voigt stress vector into symmetric 3x3 tensor.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_Voigt6to33_stress(sigma_tilde) result(sigma)
|
||||
|
||||
real(pReal), dimension(3,3) :: sigma
|
||||
real(pReal), dimension(6), intent(in) :: sigma_tilde
|
||||
|
||||
|
||||
sigma = reshape([sigma_tilde(1), sigma_tilde(6), sigma_tilde(5), &
|
||||
sigma_tilde(6), sigma_tilde(2), sigma_tilde(4), &
|
||||
sigma_tilde(5), sigma_tilde(4), sigma_tilde(3)],[3,3])
|
||||
|
||||
end function math_Voigt6to33_stress
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Convert 6 Voigt strain vector into symmetric 3x3 tensor.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_Voigt6to33_strain(epsilon_tilde) result(epsilon)
|
||||
|
||||
real(pReal), dimension(3,3) :: epsilon
|
||||
real(pReal), dimension(6), intent(in) :: epsilon_tilde
|
||||
|
||||
|
||||
epsilon = reshape([ epsilon_tilde(1), 0.5_pReal*epsilon_tilde(6), 0.5_pReal*epsilon_tilde(5), &
|
||||
0.5_pReal*epsilon_tilde(6), epsilon_tilde(2), 0.5_pReal*epsilon_tilde(4), &
|
||||
0.5_pReal*epsilon_tilde(5), 0.5_pReal*epsilon_tilde(4), epsilon_tilde(3)],[3,3])
|
||||
|
||||
end function math_Voigt6to33_strain
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Convert 3x3 tensor into 6 Voigt stress vector.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_33toVoigt6_stress(sigma) result(sigma_tilde)
|
||||
|
||||
real(pReal), dimension(6) :: sigma_tilde
|
||||
real(pReal), dimension(3,3), intent(in) :: sigma
|
||||
|
||||
|
||||
sigma_tilde = [sigma(1,1), sigma(2,2), sigma(3,3), &
|
||||
sigma(3,2), sigma(3,1), sigma(1,2)]
|
||||
|
||||
end function math_33toVoigt6_stress
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Convert 3x3 tensor into 6 Voigt strain vector.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_33toVoigt6_strain(epsilon) result(epsilon_tilde)
|
||||
|
||||
real(pReal), dimension(6) :: epsilon_tilde
|
||||
real(pReal), dimension(3,3), intent(in) :: epsilon
|
||||
|
||||
|
||||
epsilon_tilde = [ epsilon(1,1), epsilon(2,2), epsilon(3,3), &
|
||||
2.0_pReal*epsilon(3,2), 2.0_pReal*epsilon(3,1), 2.0_pReal*epsilon(1,2)]
|
||||
|
||||
end function math_33toVoigt6_strain
|
||||
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief Convert 6x6 Voigt matrix into symmetric 3x3x3x3 matrix.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_Voigt66to3333(m66)
|
||||
|
||||
|
@ -864,18 +927,18 @@ pure function math_Voigt66to3333(m66)
|
|||
integer :: i,j
|
||||
|
||||
|
||||
do i=1,6; do j=1, 6
|
||||
do i=1,6; do j=1,6
|
||||
math_Voigt66to3333(MAPVOIGT(1,i),MAPVOIGT(2,i),MAPVOIGT(1,j),MAPVOIGT(2,j)) = m66(i,j)
|
||||
math_Voigt66to3333(MAPVOIGT(2,i),MAPVOIGT(1,i),MAPVOIGT(1,j),MAPVOIGT(2,j)) = m66(i,j)
|
||||
math_Voigt66to3333(MAPVOIGT(1,i),MAPVOIGT(2,i),MAPVOIGT(2,j),MAPVOIGT(1,j)) = m66(i,j)
|
||||
math_Voigt66to3333(MAPVOIGT(2,i),MAPVOIGT(1,i),MAPVOIGT(2,j),MAPVOIGT(1,j)) = m66(i,j)
|
||||
enddo; enddo
|
||||
end do; end do
|
||||
|
||||
end function math_Voigt66to3333
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @brief convert symmetric 3x3x3x3 matrix into 6x6 Voigt matrix
|
||||
!> @brief Convert symmetric 3x3x3x3 matrix into 6x6 Voigt matrix.
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
pure function math_3333toVoigt66(m3333)
|
||||
|
||||
|
|
|
@ -193,15 +193,17 @@ module subroutine phase_hooke_SandItsTangents(S, dS_dFe, dS_dFi, &
|
|||
dS_dFi !< derivative of 2nd P-K stress with respect to intermediate deformation gradient
|
||||
|
||||
real(pReal), dimension(3,3) :: E
|
||||
real(pReal), dimension(6,6) :: C66
|
||||
real(pReal), dimension(3,3,3,3) :: C
|
||||
integer :: &
|
||||
i, j
|
||||
|
||||
|
||||
C = math_Voigt66to3333(phase_damage_C66(phase_homogenizedC66(ph,en),ph,en))
|
||||
C66 = phase_damage_C66(phase_homogenizedC66(ph,en),ph,en)
|
||||
C = math_Voigt66to3333(C66)
|
||||
|
||||
E = 0.5_pReal*(matmul(transpose(Fe),Fe)-math_I3) !< Green-Lagrange strain in unloaded configuration
|
||||
S = math_mul3333xx33(C,matmul(matmul(transpose(Fi),E),Fi)) !< 2PK stress in lattice configuration in work conjugate with GL strain pulled back to lattice configuration
|
||||
S = math_Voigt6to33_stress(matmul(C66,math_33toVoigt6_strain(matmul(matmul(transpose(Fi),E),Fi))))!< 2PK stress in lattice configuration in work conjugate with GL strain pulled back to lattice configuration
|
||||
|
||||
do i =1,3; do j=1,3
|
||||
dS_dFe(i,j,1:3,1:3) = matmul(Fe,matmul(matmul(Fi,C(i,j,1:3,1:3)),transpose(Fi))) !< dS_ij/dFe_kl = C_ijmn * Fi_lm * Fi_on * Fe_ko
|
||||
|
|
|
@ -75,6 +75,7 @@ module rotations
|
|||
procedure, public :: rotVector
|
||||
procedure, public :: rotTensor2
|
||||
procedure, public :: rotTensor4
|
||||
procedure, public :: rotStiffness
|
||||
procedure, public :: misorientation
|
||||
procedure, public :: standardize
|
||||
end type rotation
|
||||
|
@ -339,8 +340,7 @@ end function rotTensor2
|
|||
|
||||
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||
!> @brief rotate a rank-4 tensor passively (default) or actively
|
||||
!> @brief Rotate a rank-4 tensor passively (default) or actively.
|
||||
!> @details: rotation is based on rotation matrix
|
||||
!! ToDo: Need to check active/passive !!!
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
|
@ -354,6 +354,7 @@ pure function rotTensor4(self,T,active) result(tRot)
|
|||
real(pReal), dimension(3,3) :: R
|
||||
integer :: i,j,k,l,m,n,o,p
|
||||
|
||||
|
||||
if (present(active)) then
|
||||
R = merge(transpose(self%asMatrix()),self%asMatrix(),active)
|
||||
else
|
||||
|
@ -371,7 +372,47 @@ end function rotTensor4
|
|||
|
||||
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
!> @brief misorientation
|
||||
!> @brief Rotate a rank-4 tensor in Voigt 6x6 notation passively (default) or actively.
|
||||
!> @details: https://scicomp.stackexchange.com/questions/35600
|
||||
!! ToDo: Need to check active/passive !!!
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
pure function rotStiffness(self,C,active) result(cRot)
|
||||
|
||||
real(pReal), dimension(6,6) :: cRot
|
||||
class(rotation), intent(in) :: self
|
||||
real(pReal), intent(in), dimension(6,6) :: C
|
||||
logical, intent(in), optional :: active
|
||||
|
||||
real(pReal), dimension(3,3) :: R
|
||||
real(pReal), dimension(6,6) :: M
|
||||
|
||||
|
||||
if (present(active)) then
|
||||
R = merge(transpose(self%asMatrix()),self%asMatrix(),active)
|
||||
else
|
||||
R = self%asMatrix()
|
||||
endif
|
||||
|
||||
M = reshape([R(1,1)**2.0_pReal, R(2,1)**2.0_pReal, R(3,1)**2.0_pReal, &
|
||||
R(2,1)*R(3,1), R(1,1)*R(3,1), R(1,1)*R(2,1), &
|
||||
R(1,2)**2.0_pReal, R(2,2)**2.0_pReal, R(3,2)**2.0_pReal, &
|
||||
R(2,2)*R(3,2), R(1,2)*R(3,2), R(1,2)*R(2,2), &
|
||||
R(1,3)**2.0_pReal, R(2,3)**2.0_pReal, R(3,3)**2.0_pReal, &
|
||||
R(2,3)*R(3,3), R(1,3)*R(3,3), R(1,3)*R(2,3), &
|
||||
2.0_pReal*R(1,2)*R(1,3), 2.0_pReal*R(2,2)*R(2,3), 2.0_pReal*R(3,2)*R(3,3), &
|
||||
R(2,2)*R(3,3)+R(2,3)*R(3,2), R(1,2)*R(3,3)+R(1,3)*R(3,2), R(1,2)*R(2,3)+R(1,3)*R(2,2), &
|
||||
2.0_pReal*R(1,3)*R(1,1), 2.0_pReal*R(2,3)*R(2,1), 2.0_pReal*R(3,3)*R(3,1), &
|
||||
R(2,3)*R(3,1)+R(2,1)*R(3,3), R(1,3)*R(3,1)+R(1,1)*R(3,3), R(1,3)*R(2,1)+R(1,1)*R(2,3), &
|
||||
2.0_pReal*R(1,1)*R(1,2), 2.0_pReal*R(2,1)*R(2,2), 2.0_pReal*R(3,1)*R(3,2), &
|
||||
R(2,1)*R(3,2)+R(2,2)*R(3,1), R(1,1)*R(3,2)+R(1,2)*R(3,1), R(1,1)*R(2,2)+R(1,2)*R(2,1)],[6,6])
|
||||
|
||||
cRot = matmul(M,matmul(C,transpose(M)))
|
||||
|
||||
end function rotStiffness
|
||||
|
||||
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
!> @brief Misorientation.
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
pure elemental function misorientation(self,other)
|
||||
|
||||
|
@ -386,7 +427,7 @@ end function misorientation
|
|||
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
!> @author Marc De Graef, Carnegie Mellon University
|
||||
!> @brief convert unit quaternion to rotation matrix
|
||||
!> @brief Convert unit quaternion to rotation matrix.
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
pure function qu2om(qu) result(om)
|
||||
|
||||
|
@ -395,8 +436,8 @@ pure function qu2om(qu) result(om)
|
|||
|
||||
real(pReal) :: qq
|
||||
|
||||
qq = qu(1)**2-sum(qu(2:4)**2)
|
||||
|
||||
qq = qu(1)**2-sum(qu(2:4)**2)
|
||||
|
||||
om(1,1) = qq+2.0_pReal*qu(2)**2
|
||||
om(2,2) = qq+2.0_pReal*qu(3)**2
|
||||
|
@ -416,7 +457,7 @@ end function qu2om
|
|||
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
!> @author Marc De Graef, Carnegie Mellon University
|
||||
!> @brief convert unit quaternion to Euler angles
|
||||
!> @brief Convert unit quaternion to Euler angles.
|
||||
!---------------------------------------------------------------------------------------------------
|
||||
pure function qu2eu(qu) result(eu)
|
||||
|
||||
|
@ -425,6 +466,7 @@ pure function qu2eu(qu) result(eu)
|
|||
|
||||
real(pReal) :: q12, q03, chi
|
||||
|
||||
|
||||
q03 = qu(1)**2+qu(4)**2
|
||||
q12 = qu(2)**2+qu(3)**2
|
||||
chi = sqrt(q03*q12)
|
||||
|
@ -1379,6 +1421,7 @@ subroutine selfTest()
|
|||
real(pReal), dimension(3) :: x, eu, ho, v3
|
||||
real(pReal), dimension(3,3) :: om, t33
|
||||
real(pReal), dimension(3,3,3,3) :: t3333
|
||||
real(pReal), dimension(6,6) :: C
|
||||
real :: A,B
|
||||
integer :: i
|
||||
|
||||
|
@ -1412,6 +1455,7 @@ subroutine selfTest()
|
|||
if(qu(1)<0.0_pReal) qu = qu * (-1.0_pReal)
|
||||
endif
|
||||
|
||||
|
||||
if(.not. quaternion_equal(om2qu(qu2om(qu)),qu)) error stop 'om2qu/qu2om'
|
||||
if(.not. quaternion_equal(eu2qu(qu2eu(qu)),qu)) error stop 'eu2qu/qu2eu'
|
||||
if(.not. quaternion_equal(ax2qu(qu2ax(qu)),qu)) error stop 'ax2qu/qu2ax'
|
||||
|
@ -1447,20 +1491,25 @@ subroutine selfTest()
|
|||
call R%fromMatrix(om)
|
||||
|
||||
call random_number(v3)
|
||||
if(all(dNeq(R%rotVector(R%rotVector(v3),active=.true.),v3,1.0e-12_pReal))) &
|
||||
if (any(dNeq(R%rotVector(R%rotVector(v3),active=.true.),v3,1.0e-12_pReal))) &
|
||||
error stop 'rotVector'
|
||||
|
||||
call random_number(t33)
|
||||
if(all(dNeq(R%rotTensor2(R%rotTensor2(t33),active=.true.),t33,1.0e-12_pReal))) &
|
||||
if (any(dNeq(R%rotTensor2(R%rotTensor2(t33),active=.true.),t33,1.0e-12_pReal))) &
|
||||
error stop 'rotTensor2'
|
||||
|
||||
call random_number(t3333)
|
||||
if(all(dNeq(R%rotTensor4(R%rotTensor4(t3333),active=.true.),t3333,1.0e-12_pReal))) &
|
||||
if (any(dNeq(R%rotTensor4(R%rotTensor4(t3333),active=.true.),t3333,1.0e-12_pReal))) &
|
||||
error stop 'rotTensor4'
|
||||
|
||||
call random_number(C)
|
||||
C = C+transpose(C)
|
||||
if (any(dNeq(R%rotStiffness(C),math_3333toVoigt66(R%rotate(math_Voigt66to3333(C))),1.0e-12_pReal))) &
|
||||
error stop 'rotStiffness'
|
||||
|
||||
call R%fromQuaternion(qu * (1.0_pReal + merge(+5.e-9_pReal,-5.e-9_pReal, mod(i,2) == 0))) ! allow reasonable tolerance for ASCII/YAML
|
||||
|
||||
enddo
|
||||
end do
|
||||
|
||||
contains
|
||||
|
||||
|
|
Loading…
Reference in New Issue