Merge branch 'development' of magit1.mpie.de:damask/DAMASK into development
This commit is contained in:
commit
2254746177
|
@ -39,7 +39,7 @@ def srepr(arg,glue = '\n'):
|
||||||
if (not hasattr(arg, "strip") and
|
if (not hasattr(arg, "strip") and
|
||||||
hasattr(arg, "__getitem__") or
|
hasattr(arg, "__getitem__") or
|
||||||
hasattr(arg, "__iter__")):
|
hasattr(arg, "__iter__")):
|
||||||
return glue.join(srepr(x) for x in arg)
|
return glue.join(str(x) for x in arg)
|
||||||
return arg if isinstance(arg,str) else repr(arg)
|
return arg if isinstance(arg,str) else repr(arg)
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
|
@ -233,6 +233,7 @@ def leastsqBound(func, x0, args=(), bounds=None, Dfun=None, full_output=0,
|
||||||
|
|
||||||
def _check_func(checker, argname, thefunc, x0, args, numinputs,
|
def _check_func(checker, argname, thefunc, x0, args, numinputs,
|
||||||
output_shape=None):
|
output_shape=None):
|
||||||
|
from numpy import shape
|
||||||
"""The same as that of minpack.py"""
|
"""The same as that of minpack.py"""
|
||||||
res = np.atleast_1d(thefunc(*((x0[:numinputs],) + args)))
|
res = np.atleast_1d(thefunc(*((x0[:numinputs],) + args)))
|
||||||
if (output_shape is not None) and (shape(res) != output_shape):
|
if (output_shape is not None) and (shape(res) != output_shape):
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -78,7 +78,8 @@ program DAMASK_spectral
|
||||||
FIELD_UNDEFINED_ID, &
|
FIELD_UNDEFINED_ID, &
|
||||||
FIELD_MECH_ID, &
|
FIELD_MECH_ID, &
|
||||||
FIELD_THERMAL_ID, &
|
FIELD_THERMAL_ID, &
|
||||||
FIELD_DAMAGE_ID
|
FIELD_DAMAGE_ID, &
|
||||||
|
utilities_calcPlasticity
|
||||||
use spectral_mech_Basic
|
use spectral_mech_Basic
|
||||||
use spectral_mech_AL
|
use spectral_mech_AL
|
||||||
use spectral_mech_Polarisation
|
use spectral_mech_Polarisation
|
||||||
|
@ -156,6 +157,19 @@ program DAMASK_spectral
|
||||||
MPI_finalize, &
|
MPI_finalize, &
|
||||||
MPI_allreduce, &
|
MPI_allreduce, &
|
||||||
PETScFinalize
|
PETScFinalize
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
! variables related to stop criterion for yielding
|
||||||
|
real(pReal) :: plasticWorkOld, plasticWorkNew, & ! plastic work
|
||||||
|
eqTotalStrainOld, eqTotalStrainNew, & ! total equivalent strain
|
||||||
|
eqPlasticStrainOld, eqPlasticStrainNew, & ! total equivalent plastic strain
|
||||||
|
eqStressOld, eqStressNew , & ! equivalent stress
|
||||||
|
yieldStopValue
|
||||||
|
real(pReal), dimension(3,3) :: yieldStress,yieldStressOld,yieldStressNew, &
|
||||||
|
plasticStrainOld, plasticStrainNew, plasticStrainRate
|
||||||
|
integer(pInt) :: yieldResUnit = 0_pInt
|
||||||
|
integer(pInt) :: stressstrainUnit = 0_pInt
|
||||||
|
character(len=13) :: stopFlag
|
||||||
|
logical :: yieldStop, yieldStopSatisfied
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! init DAMASK (all modules)
|
! init DAMASK (all modules)
|
||||||
|
@ -213,6 +227,8 @@ program DAMASK_spectral
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! reading the load case and assign values to the allocated data structure
|
! reading the load case and assign values to the allocated data structure
|
||||||
|
yieldStop = .False.
|
||||||
|
yieldStopSatisfied = .False.
|
||||||
rewind(FILEUNIT)
|
rewind(FILEUNIT)
|
||||||
do
|
do
|
||||||
line = IO_read(FILEUNIT)
|
line = IO_read(FILEUNIT)
|
||||||
|
@ -287,10 +303,30 @@ program DAMASK_spectral
|
||||||
temp_valueVector(j) = IO_floatValue(line,chunkPos,i+j)
|
temp_valueVector(j) = IO_floatValue(line,chunkPos,i+j)
|
||||||
enddo
|
enddo
|
||||||
loadCases(currentLoadCase)%rotation = math_plain9to33(temp_valueVector)
|
loadCases(currentLoadCase)%rotation = math_plain9to33(temp_valueVector)
|
||||||
|
case('totalstrain')
|
||||||
|
yieldStop = .True.
|
||||||
|
stopFlag = 'totalStrain'
|
||||||
|
yieldStopValue = IO_floatValue(line,chunkPos,i+1_pInt)
|
||||||
|
case('plasticstrain')
|
||||||
|
yieldStop = .True.
|
||||||
|
stopFlag = 'plasticStrain'
|
||||||
|
yieldStopValue = IO_floatValue(line,chunkPos,i+1_pInt)
|
||||||
|
case('plasticwork')
|
||||||
|
yieldStop = .True.
|
||||||
|
stopFlag = 'plasticWork'
|
||||||
|
yieldStopValue = IO_floatValue(line,chunkPos,i+1_pInt)
|
||||||
end select
|
end select
|
||||||
enddo; enddo
|
enddo; enddo
|
||||||
close(FILEUNIT)
|
close(FILEUNIT)
|
||||||
|
|
||||||
|
if(yieldStop) then ! initialize variables related to yield stop
|
||||||
|
yieldStressNew = 0.0_pReal
|
||||||
|
plasticStrainNew = 0.0_pReal
|
||||||
|
eqStressNew = 0.0_pReal
|
||||||
|
eqTotalStrainNew = 0.0_pReal
|
||||||
|
eqPlasticStrainNew = 0.0_pReal
|
||||||
|
plasticWorkNew = 0.0_pReal
|
||||||
|
endif
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! consistency checks and output of load case
|
! consistency checks and output of load case
|
||||||
loadCases(1)%followFormerTrajectory = .false. ! cannot guess along trajectory for first inc of first currentLoadCase
|
loadCases(1)%followFormerTrajectory = .false. ! cannot guess along trajectory for first inc of first currentLoadCase
|
||||||
|
@ -662,9 +698,75 @@ program DAMASK_spectral
|
||||||
guess = .true.
|
guess = .true.
|
||||||
endif forwarding
|
endif forwarding
|
||||||
|
|
||||||
|
yieldCheck: if(yieldStop) then ! check if it yields or satisfies the certain stop condition
|
||||||
|
yieldStressOld = yieldStressNew
|
||||||
|
plasticStrainOld = plasticStrainNew
|
||||||
|
eqStressOld = eqStressNew
|
||||||
|
eqTotalStrainOld = eqTotalStrainNew
|
||||||
|
eqPlasticStrainOld = eqPlasticStrainNew
|
||||||
|
plasticWorkOld = plasticWorkNew
|
||||||
|
|
||||||
|
call utilities_calcPlasticity(yieldStressNew, plasticStrainNew, eqStressNew, eqTotalStrainNew, &
|
||||||
|
eqPlasticStrainNew, plasticWorkNew, loadCases(currentLoadCase)%rotation)
|
||||||
|
|
||||||
|
if (worldrank == 0) then ! output the stress-strain curve to file if yield stop criterion is used
|
||||||
|
if ((currentLoadCase == 1_pInt) .and. (inc == 1_pInt)) then
|
||||||
|
open(newunit=stressstrainUnit,file=trim(getSolverWorkingDirectoryName())//trim(getSolverJobName())//&
|
||||||
|
'.stressstrain',form='FORMATTED',status='REPLACE')
|
||||||
|
write(stressstrainUnit,*) 0.0_pReal, 0.0_pReal
|
||||||
|
write(stressstrainUnit,*) eqTotalStrainNew, eqStressNew
|
||||||
|
close(stressstrainUnit)
|
||||||
|
else
|
||||||
|
open(newunit=stressstrainUnit,file=trim(getSolverWorkingDirectoryName())//trim(getSolverJobName())//&
|
||||||
|
'.stressstrain',form='FORMATTED', position='APPEND', status='OLD')
|
||||||
|
write(stressstrainUnit,*) eqTotalStrainNew, eqStressNew
|
||||||
|
close(stressstrainUnit)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if(stopFlag == 'totalStrain') then
|
||||||
|
if(eqTotalStrainNew > yieldStopValue) then
|
||||||
|
yieldStress = yieldStressOld * (eqTotalStrainNew - yieldStopValue)/(eqTotalStrainNew - eqTotalStrainOld) & ! linear interpolation of stress values
|
||||||
|
+ yieldStressNew * (yieldStopValue - eqTotalStrainOld)/(eqTotalStrainNew - eqTotalStrainOld)
|
||||||
|
plasticStrainRate = (plasticStrainNew - plasticStrainOld)/(time - time0) ! calculate plastic strain rate
|
||||||
|
yieldStopSatisfied = .True.
|
||||||
|
endif
|
||||||
|
elseif(stopFlag == 'plasticStrain') then
|
||||||
|
if(eqPlasticStrainNew > yieldStopValue) then
|
||||||
|
yieldStress = yieldStressOld * (eqPlasticStrainNew - yieldStopValue)/(eqPlasticStrainNew - eqPlasticStrainOld) &
|
||||||
|
+ yieldStressNew * (yieldStopValue - eqPlasticStrainOld)/(eqPlasticStrainNew - eqPlasticStrainOld)
|
||||||
|
plasticStrainRate = (plasticStrainNew - plasticStrainOld)/(time - time0)
|
||||||
|
yieldStopSatisfied = .True.
|
||||||
|
endif
|
||||||
|
elseif(stopFlag == 'plasticWork') then
|
||||||
|
if(plasticWorkNew > yieldStopValue) then
|
||||||
|
yieldStress = yieldStressOld * (plasticWorkNew - yieldStopValue)/(plasticWorkNew - plasticWorkOld) &
|
||||||
|
+ yieldStressNew * (yieldStopValue - plasticWorkOld)/(plasticWorkNew - plasticWorkOld)
|
||||||
|
plasticStrainRate = (plasticStrainNew - plasticStrainOld)/(time - time0)
|
||||||
|
yieldStopSatisfied = .True.
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif yieldCheck
|
||||||
|
|
||||||
|
if (yieldStopSatisfied) then ! when yield, write the yield stress and strain rate to file and quit the job
|
||||||
|
if (worldrank == 0) then
|
||||||
|
open(newunit=yieldResUnit,file=trim(getSolverWorkingDirectoryName())//trim(getSolverJobName())//&
|
||||||
|
'.yield',form='FORMATTED',status='REPLACE')
|
||||||
|
do i = 1_pInt,3_pInt
|
||||||
|
write(yieldResUnit,*) (yieldStress(i,j), j=1,3)
|
||||||
|
enddo
|
||||||
|
do i = 1_pInt,3_pInt
|
||||||
|
write(yieldResUnit,*) (plasticStrainRate(i,j), j=1,3)
|
||||||
|
enddo
|
||||||
|
close(yieldResUnit)
|
||||||
|
call quit(0_pInt)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
enddo incLooping
|
enddo incLooping
|
||||||
enddo loadCaseLooping
|
enddo loadCaseLooping
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! report summary of whole calculation
|
! report summary of whole calculation
|
||||||
write(6,'(/,a)') ' ###########################################################################'
|
write(6,'(/,a)') ' ###########################################################################'
|
||||||
|
|
|
@ -55,14 +55,14 @@ module crystallite
|
||||||
crystallite_Li0, & !< intermediate velocitiy grad at start of FE inc
|
crystallite_Li0, & !< intermediate velocitiy grad at start of FE inc
|
||||||
crystallite_partionedLi0,& !< intermediate velocity grad at start of homog inc
|
crystallite_partionedLi0,& !< intermediate velocity grad at start of homog inc
|
||||||
crystallite_Fe, & !< current "elastic" def grad (end of converged time step)
|
crystallite_Fe, & !< current "elastic" def grad (end of converged time step)
|
||||||
crystallite_P !< 1st Piola-Kirchhoff stress per grain
|
crystallite_P, & !< 1st Piola-Kirchhoff stress per grain
|
||||||
|
crystallite_subF !< def grad to be reached at end of crystallite inc
|
||||||
real(pReal), dimension(:,:,:,:,:), allocatable, private :: &
|
real(pReal), dimension(:,:,:,:,:), allocatable, private :: &
|
||||||
crystallite_subFe0,& !< "elastic" def grad at start of crystallite inc
|
crystallite_subFe0,& !< "elastic" def grad at start of crystallite inc
|
||||||
crystallite_invFp, & !< inverse of current plastic def grad (end of converged time step)
|
crystallite_invFp, & !< inverse of current plastic def grad (end of converged time step)
|
||||||
crystallite_subFp0,& !< plastic def grad at start of crystallite inc
|
crystallite_subFp0,& !< plastic def grad at start of crystallite inc
|
||||||
crystallite_invFi, & !< inverse of current intermediate def grad (end of converged time step)
|
crystallite_invFi, & !< inverse of current intermediate def grad (end of converged time step)
|
||||||
crystallite_subFi0,& !< intermediate def grad at start of crystallite inc
|
crystallite_subFi0,& !< intermediate def grad at start of crystallite inc
|
||||||
crystallite_subF, & !< def grad to be reached at end of crystallite inc
|
|
||||||
crystallite_subF0, & !< def grad at start of crystallite inc
|
crystallite_subF0, & !< def grad at start of crystallite inc
|
||||||
crystallite_subLp0,& !< plastic velocity grad at start of crystallite inc
|
crystallite_subLp0,& !< plastic velocity grad at start of crystallite inc
|
||||||
crystallite_subLi0,& !< intermediate velocity grad at start of crystallite inc
|
crystallite_subLi0,& !< intermediate velocity grad at start of crystallite inc
|
||||||
|
|
|
@ -144,6 +144,7 @@ module math
|
||||||
math_sampleGaussVar, &
|
math_sampleGaussVar, &
|
||||||
math_symmetricEulers, &
|
math_symmetricEulers, &
|
||||||
math_eigenvectorBasisSym33, &
|
math_eigenvectorBasisSym33, &
|
||||||
|
math_eigenvectorBasisSym33_log, &
|
||||||
math_eigenvectorBasisSym, &
|
math_eigenvectorBasisSym, &
|
||||||
math_eigenValuesVectorsSym33, &
|
math_eigenValuesVectorsSym33, &
|
||||||
math_eigenValuesVectorsSym, &
|
math_eigenValuesVectorsSym, &
|
||||||
|
@ -2117,6 +2118,70 @@ function math_eigenvectorBasisSym33(m)
|
||||||
end function math_eigenvectorBasisSym33
|
end function math_eigenvectorBasisSym33
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief logarithm eigenvector basis of symmetric 33 matrix m
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function math_eigenvectorBasisSym33_log(m)
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
real(pReal), dimension(3,3) :: math_eigenvectorBasisSym33_log
|
||||||
|
real(pReal), dimension(3) :: invariants, values
|
||||||
|
real(pReal), dimension(3,3), intent(in) :: m
|
||||||
|
real(pReal) :: P, Q, rho, phi
|
||||||
|
real(pReal), parameter :: TOL=1.e-14_pReal
|
||||||
|
real(pReal), dimension(3,3,3) :: N, EB
|
||||||
|
|
||||||
|
invariants = math_invariantsSym33(m)
|
||||||
|
EB = 0.0_pReal
|
||||||
|
|
||||||
|
P = invariants(2)-invariants(1)**2.0_pReal/3.0_pReal
|
||||||
|
Q = -2.0_pReal/27.0_pReal*invariants(1)**3.0_pReal+product(invariants(1:2))/3.0_pReal-invariants(3)
|
||||||
|
|
||||||
|
threeSimilarEigenvalues: if(all(abs([P,Q]) < TOL)) then
|
||||||
|
values = invariants(1)/3.0_pReal
|
||||||
|
! this is not really correct, but at least the basis is correct
|
||||||
|
EB(1,1,1)=1.0_pReal
|
||||||
|
EB(2,2,2)=1.0_pReal
|
||||||
|
EB(3,3,3)=1.0_pReal
|
||||||
|
else threeSimilarEigenvalues
|
||||||
|
rho=sqrt(-3.0_pReal*P**3.0_pReal)/9.0_pReal
|
||||||
|
phi=acos(math_limit(-Q/rho*0.5_pReal,-1.0_pReal,1.0_pReal))
|
||||||
|
values = 2.0_pReal*rho**(1.0_pReal/3.0_pReal)* &
|
||||||
|
[cos(phi/3.0_pReal), &
|
||||||
|
cos((phi+2.0_pReal*PI)/3.0_pReal), &
|
||||||
|
cos((phi+4.0_pReal*PI)/3.0_pReal) &
|
||||||
|
] + invariants(1)/3.0_pReal
|
||||||
|
N(1:3,1:3,1) = m-values(1)*math_I3
|
||||||
|
N(1:3,1:3,2) = m-values(2)*math_I3
|
||||||
|
N(1:3,1:3,3) = m-values(3)*math_I3
|
||||||
|
twoSimilarEigenvalues: if(abs(values(1)-values(2)) < TOL) then
|
||||||
|
EB(1:3,1:3,3)=math_mul33x33(N(1:3,1:3,1),N(1:3,1:3,2))/ &
|
||||||
|
((values(3)-values(1))*(values(3)-values(2)))
|
||||||
|
EB(1:3,1:3,1)=math_I3-EB(1:3,1:3,3)
|
||||||
|
elseif(abs(values(2)-values(3)) < TOL) then twoSimilarEigenvalues
|
||||||
|
EB(1:3,1:3,1)=math_mul33x33(N(1:3,1:3,2),N(1:3,1:3,3))/ &
|
||||||
|
((values(1)-values(2))*(values(1)-values(3)))
|
||||||
|
EB(1:3,1:3,2)=math_I3-EB(1:3,1:3,1)
|
||||||
|
elseif(abs(values(3)-values(1)) < TOL) then twoSimilarEigenvalues
|
||||||
|
EB(1:3,1:3,2)=math_mul33x33(N(1:3,1:3,1),N(1:3,1:3,3))/ &
|
||||||
|
((values(2)-values(1))*(values(2)-values(3)))
|
||||||
|
EB(1:3,1:3,1)=math_I3-EB(1:3,1:3,2)
|
||||||
|
else twoSimilarEigenvalues
|
||||||
|
EB(1:3,1:3,1)=math_mul33x33(N(1:3,1:3,2),N(1:3,1:3,3))/ &
|
||||||
|
((values(1)-values(2))*(values(1)-values(3)))
|
||||||
|
EB(1:3,1:3,2)=math_mul33x33(N(1:3,1:3,1),N(1:3,1:3,3))/ &
|
||||||
|
((values(2)-values(1))*(values(2)-values(3)))
|
||||||
|
EB(1:3,1:3,3)=math_mul33x33(N(1:3,1:3,1),N(1:3,1:3,2))/ &
|
||||||
|
((values(3)-values(1))*(values(3)-values(2)))
|
||||||
|
endif twoSimilarEigenvalues
|
||||||
|
endif threeSimilarEigenvalues
|
||||||
|
|
||||||
|
math_eigenvectorBasisSym33_log = log(sqrt(values(1))) * EB(1:3,1:3,1) &
|
||||||
|
+ log(sqrt(values(2))) * EB(1:3,1:3,2) &
|
||||||
|
+ log(sqrt(values(3))) * EB(1:3,1:3,3)
|
||||||
|
|
||||||
|
end function math_eigenvectorBasisSym33_log
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief rotational part from polar decomposition of 33 tensor m
|
!> @brief rotational part from polar decomposition of 33 tensor m
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -145,7 +145,8 @@ module spectral_utilities
|
||||||
FIELD_UNDEFINED_ID, &
|
FIELD_UNDEFINED_ID, &
|
||||||
FIELD_MECH_ID, &
|
FIELD_MECH_ID, &
|
||||||
FIELD_THERMAL_ID, &
|
FIELD_THERMAL_ID, &
|
||||||
FIELD_DAMAGE_ID
|
FIELD_DAMAGE_ID, &
|
||||||
|
utilities_calcPlasticity
|
||||||
private :: &
|
private :: &
|
||||||
utilities_getFreqDerivative
|
utilities_getFreqDerivative
|
||||||
|
|
||||||
|
@ -1047,6 +1048,125 @@ subroutine utilities_constitutiveResponse(F_lastInc,F,timeinc, &
|
||||||
|
|
||||||
end subroutine utilities_constitutiveResponse
|
end subroutine utilities_constitutiveResponse
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief calculates yield stress, plastic strain, total strain and their equivalent values
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine utilities_calcPlasticity(yieldStress, plasticStrain, eqStress, eqTotalStrain, &
|
||||||
|
eqPlasticStrain, plasticWork, rotation_BC)
|
||||||
|
use crystallite, only: &
|
||||||
|
crystallite_Fe, &
|
||||||
|
crystallite_P, &
|
||||||
|
crystallite_subF
|
||||||
|
use material, only: &
|
||||||
|
homogenization_maxNgrains
|
||||||
|
use mesh, only: &
|
||||||
|
mesh_maxNips,&
|
||||||
|
mesh_NcpElems
|
||||||
|
use math, only: &
|
||||||
|
math_det33, &
|
||||||
|
math_inv33, &
|
||||||
|
math_mul33x33, &
|
||||||
|
math_trace33, &
|
||||||
|
math_transpose33, &
|
||||||
|
math_equivStrain33, &
|
||||||
|
math_equivStress33, &
|
||||||
|
math_rotate_forward33, &
|
||||||
|
math_identity2nd, &
|
||||||
|
math_crossproduct, &
|
||||||
|
math_eigenvectorBasisSym, &
|
||||||
|
math_eigenvectorBasisSym33, &
|
||||||
|
math_eigenvectorBasisSym33_log, &
|
||||||
|
math_eigenValuesVectorsSym33
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real(pReal), intent(inout) :: eqStress, eqPlasticStrain, plasticWork
|
||||||
|
real(pReal), intent(out) :: eqTotalStrain
|
||||||
|
real(pReal), dimension(3,3),intent(out) :: yieldStress, plasticStrain
|
||||||
|
real(pReal), intent(in), dimension(3,3) :: rotation_BC !< rotation of load frame
|
||||||
|
real(pReal), dimension(3,3) :: cauchy, P_av, F_av, Ve_av !< average
|
||||||
|
real(pReal), dimension(3) :: Values, S
|
||||||
|
real(pReal), dimension(3,3) :: Vectors, diag
|
||||||
|
real(pReal), dimension(3,3) :: &
|
||||||
|
Vp, F_temp, U, VT, R, V, V_total
|
||||||
|
real(pReal), dimension(3,3,homogenization_maxNgrains,mesh_maxNips,mesh_NcpElems) :: &
|
||||||
|
Be, Ve, Fe
|
||||||
|
real(pReal), dimension(15) :: WORK !< previous deformation gradient
|
||||||
|
integer(pInt) :: INFO, i, j, k, l, ierr
|
||||||
|
real(pReal) :: wgtm
|
||||||
|
real(pReal) :: eqStressOld, eqPlasticStrainOld, plasticWorkOld
|
||||||
|
|
||||||
|
external :: dgesvd
|
||||||
|
|
||||||
|
eqStressOld = eqStress
|
||||||
|
eqPlasticStrainOld = eqPlasticStrain
|
||||||
|
plasticWorkOld = plasticWork
|
||||||
|
wgtm = 1.0_pReal/real(mesh_NcpElems*mesh_maxNips*homogenization_maxNgrains,pReal)
|
||||||
|
diag = 0.0_pReal
|
||||||
|
|
||||||
|
P_av = sum(sum(sum(crystallite_P,dim=5),dim=4),dim=3) * wgtm
|
||||||
|
call MPI_Allreduce(MPI_IN_PLACE,P_av,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||||
|
P_av = math_rotate_forward33(P_av,rotation_BC)
|
||||||
|
|
||||||
|
F_av = sum(sum(sum(crystallite_subF,dim=5),dim=4),dim=3) * wgtm
|
||||||
|
call MPI_Allreduce(MPI_IN_PLACE,F_av,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||||
|
F_av = math_rotate_forward33(F_av,rotation_BC)
|
||||||
|
|
||||||
|
cauchy = 1.0_pReal/math_det33(F_av)*math_mul33x33(P_av,transpose(F_av))
|
||||||
|
yieldStress = cauchy
|
||||||
|
eqStress = math_equivStress33(cauchy)
|
||||||
|
|
||||||
|
F_temp = F_av
|
||||||
|
call dgesvd ('A', 'A', 3, 3, F_temp, 3, S, U, 3, VT, 3, WORK, 15, INFO) ! singular value decomposition
|
||||||
|
|
||||||
|
R = math_mul33x33(U, VT) ! rotation of polar decomposition
|
||||||
|
V = math_mul33x33(F_av,math_inv33(R))
|
||||||
|
|
||||||
|
call math_eigenValuesVectorsSym33(V,Values,Vectors)
|
||||||
|
do l = 1_pInt, 3_pInt
|
||||||
|
if (Values(l) < 0.0_pReal) then
|
||||||
|
Values(l) = -Values(l)
|
||||||
|
Vectors(1:3, l) = -Vectors(1:3, l)
|
||||||
|
endif
|
||||||
|
Values(l) = log(Values(l))
|
||||||
|
diag(l,l) = Values(l)
|
||||||
|
enddo
|
||||||
|
if (dot_product(Vectors(1:3,1),Vectors(1:3,2)) /= 0) then
|
||||||
|
Vectors(1:3,2) = math_crossproduct(Vectors(1:3,3), Vectors(1:3,1))
|
||||||
|
Vectors(1:3,2) = Vectors(1:3,2)/sqrt(dot_product(Vectors(1:3,2),Vectors(1:3,2)))
|
||||||
|
endif
|
||||||
|
if (dot_product(Vectors(1:3,2),Vectors(1:3,3)) /= 0) then
|
||||||
|
Vectors(1:3,3) = math_crossproduct(Vectors(1:3,1), Vectors(1:3,2))
|
||||||
|
Vectors(1:3,3) = Vectors(1:3,3)/sqrt(dot_product(Vectors(1:3,3),Vectors(1:3,3)))
|
||||||
|
endif
|
||||||
|
if (dot_product(Vectors(1:3,3),Vectors(1:3,1)) /= 0) then
|
||||||
|
Vectors(1:3,1) = math_crossproduct(Vectors(1:3,2), Vectors(1:3,3))
|
||||||
|
Vectors(1:3,1) = Vectors(1:3,1)/sqrt(dot_product(Vectors(1:3,1),Vectors(1:3,1)))
|
||||||
|
endif
|
||||||
|
|
||||||
|
V_total = REAL(math_mul33x33(Vectors, math_mul33x33(diag, transpose(Vectors))))
|
||||||
|
eqTotalStrain = math_equivStrain33(V_total)
|
||||||
|
|
||||||
|
do k = 1_pInt, mesh_NcpElems; do j = 1_pInt, mesh_maxNips; do i = 1_pInt,homogenization_maxNgrains
|
||||||
|
Fe(1:3,1:3,i,j,k) = crystallite_Fe(1:3,1:3,i,j,k)
|
||||||
|
Fe(1:3,1:3,i,j,k) = math_rotate_forward33(Fe(1:3,1:3,i,j,k),rotation_BC)
|
||||||
|
Be(1:3,1:3,i,j,k) = math_mul33x33(Fe(1:3,1:3,i,j,k),math_transpose33(Fe(1:3,1:3,i,j,k))) ! elastic part of left Cauchy–Green deformation tensor
|
||||||
|
Ve(1:3,1:3,i,j,k) = math_eigenvectorBasisSym33_log(Be(1:3,1:3,i,j,k))
|
||||||
|
enddo; enddo; enddo
|
||||||
|
|
||||||
|
Ve_av = sum(sum(sum(Ve,dim=5),dim=4),dim=3) * wgtm
|
||||||
|
call MPI_Allreduce(MPI_IN_PLACE,Ve_av,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||||
|
|
||||||
|
Vp = V_total - Ve_av
|
||||||
|
|
||||||
|
eqPlasticStrain = math_equivStrain33(Vp)
|
||||||
|
|
||||||
|
plasticStrain = Vp
|
||||||
|
|
||||||
|
plasticWork = plasticWorkOld + 0.5*(eqStressOld + eqStress) * (eqPlasticStrain - eqPlasticStrainOld)
|
||||||
|
|
||||||
|
end subroutine utilities_calcPlasticity
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief calculates forward rate, either guessing or just add delta/timeinc
|
!> @brief calculates forward rate, either guessing or just add delta/timeinc
|
||||||
|
|
Loading…
Reference in New Issue