functions only used within updatestate
This commit is contained in:
parent
c16fdec749
commit
0aa21e507a
|
@ -74,11 +74,6 @@ module homogenization_RGC
|
||||||
homogenization_RGC_updateState, &
|
homogenization_RGC_updateState, &
|
||||||
homogenization_RGC_postResults
|
homogenization_RGC_postResults
|
||||||
private :: &
|
private :: &
|
||||||
stressPenalty, &
|
|
||||||
volumePenalty, &
|
|
||||||
grainDeformation, &
|
|
||||||
surfaceCorrection, &
|
|
||||||
equivalentModuli, &
|
|
||||||
relaxationVector, &
|
relaxationVector, &
|
||||||
interfaceNormal, &
|
interfaceNormal, &
|
||||||
getInterface, &
|
getInterface, &
|
||||||
|
@ -798,95 +793,7 @@ function homogenization_RGC_updateState(P,F,F0,avgF,dt,dPdF,ip,el)
|
||||||
!$OMP END CRITICAL (write2out)
|
!$OMP END CRITICAL (write2out)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
end function homogenization_RGC_updateState
|
contains
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief derive average stress and stiffness from constituent quantities
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine homogenization_RGC_averageStressAndItsTangent(avgP,dAvgPdAvgF,P,dPdF,instance)
|
|
||||||
use material, only: &
|
|
||||||
homogenization_maxNgrains
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
real(pReal), dimension (3,3), intent(out) :: avgP !< average stress at material point
|
|
||||||
real(pReal), dimension (3,3,3,3), intent(out) :: dAvgPdAvgF !< average stiffness at material point
|
|
||||||
real(pReal), dimension (3,3,homogenization_maxNgrains), intent(in) :: P !< array of current grain stresses
|
|
||||||
real(pReal), dimension (3,3,3,3,homogenization_maxNgrains), intent(in) :: dPdF !< array of current grain stiffnesses
|
|
||||||
integer(pInt), intent(in) :: instance
|
|
||||||
|
|
||||||
avgP = sum(P,3) /real(product(param(instance)%Nconstituents),pReal)
|
|
||||||
dAvgPdAvgF = sum(dPdF,5)/real(product(param(instance)%Nconstituents),pReal)
|
|
||||||
|
|
||||||
end subroutine homogenization_RGC_averageStressAndItsTangent
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief return array of homogenization results for post file inclusion
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
pure function homogenization_RGC_postResults(ip,el) result(postResults)
|
|
||||||
use mesh, only: &
|
|
||||||
mesh_homogenizationAt
|
|
||||||
use material, only: &
|
|
||||||
homogenization_typeInstance,&
|
|
||||||
homogState, &
|
|
||||||
mappingHomogenization, &
|
|
||||||
homogenization_Noutput
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
integer(pInt), intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
|
|
||||||
integer(pInt) instance,o,c,nIntFaceTot
|
|
||||||
type(tParameters) :: prm
|
|
||||||
real(pReal), dimension(homogenization_RGC_sizePostResults(homogenization_typeInstance(mesh_homogenizationAt(el)))) :: &
|
|
||||||
postResults
|
|
||||||
|
|
||||||
instance = homogenization_typeInstance(mesh_homogenizationAt(el))
|
|
||||||
associate(prm => param(instance))
|
|
||||||
nIntFaceTot=(prm%Nconstituents(1)-1_pInt)*prm%Nconstituents(2)* prm%Nconstituents(3)&
|
|
||||||
+ prm%Nconstituents(1)* (prm%Nconstituents(2)-1_pInt)*prm%Nconstituents(3)&
|
|
||||||
+ prm%Nconstituents(1)* prm%Nconstituents(2)* (prm%Nconstituents(3)-1_pInt)
|
|
||||||
|
|
||||||
c = 0_pInt
|
|
||||||
postResults = 0.0_pReal
|
|
||||||
outputsLoop: do o = 1_pInt,size(prm%outputID)
|
|
||||||
select case(prm%outputID(o))
|
|
||||||
case (constitutivework_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+1,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 1_pInt
|
|
||||||
case (magnitudemismatch_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+2,mappingHomogenization(1,ip,el))
|
|
||||||
postResults(c+2) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+3,mappingHomogenization(1,ip,el))
|
|
||||||
postResults(c+3) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+4,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 3_pInt
|
|
||||||
case (penaltyenergy_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+5,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 1_pInt
|
|
||||||
case (volumediscrepancy_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+6,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 1_pInt
|
|
||||||
case (averagerelaxrate_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+7,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 1_pInt
|
|
||||||
case (maximumrelaxrate_ID)
|
|
||||||
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
|
||||||
state(3*nIntFaceTot+8,mappingHomogenization(1,ip,el))
|
|
||||||
c = c + 1_pInt
|
|
||||||
end select
|
|
||||||
enddo outputsLoop
|
|
||||||
end associate
|
|
||||||
end function homogenization_RGC_postResults
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief calculate stress-like penalty due to deformation mismatch
|
!> @brief calculate stress-like penalty due to deformation mismatch
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -1168,6 +1075,138 @@ function equivalentModuli(grainID,ip,el)
|
||||||
end function equivalentModuli
|
end function equivalentModuli
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief calculating the grain deformation gradient (the same with
|
||||||
|
! homogenization_RGC_partionDeformation, but used only for perturbation scheme)
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine grainDeformation(F, avgF, ip, el)
|
||||||
|
use mesh, only: &
|
||||||
|
mesh_homogenizationAt
|
||||||
|
use material, only: &
|
||||||
|
homogenization_maxNgrains,&
|
||||||
|
homogenization_typeInstance
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
real(pReal), dimension (3,3,homogenization_maxNgrains), intent(out) :: F !< partioned F per grain
|
||||||
|
real(pReal), dimension (3,3), intent(in) :: avgF !<
|
||||||
|
integer(pInt), intent(in) :: &
|
||||||
|
el, & !< element number
|
||||||
|
ip !< integration point number
|
||||||
|
real(pReal), dimension (3) :: aVect,nVect
|
||||||
|
integer(pInt), dimension (4) :: intFace
|
||||||
|
integer(pInt), dimension (3) :: iGrain3
|
||||||
|
integer(pInt) :: instance, iGrain,iFace,i,j
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
! compute the deformation gradient of individual grains due to relaxations
|
||||||
|
instance = homogenization_typeInstance(mesh_homogenizationAt(el))
|
||||||
|
F = 0.0_pReal
|
||||||
|
do iGrain = 1_pInt,product(param(instance)%Nconstituents)
|
||||||
|
iGrain3 = grain1to3(iGrain,instance)
|
||||||
|
do iFace = 1_pInt,6_pInt
|
||||||
|
intFace = getInterface(iFace,iGrain3)
|
||||||
|
aVect = relaxationVector(intFace,instance, ip, el)
|
||||||
|
nVect = interfaceNormal(intFace,ip,el)
|
||||||
|
forall (i=1_pInt:3_pInt,j=1_pInt:3_pInt) &
|
||||||
|
F(i,j,iGrain) = F(i,j,iGrain) + aVect(i)*nVect(j) ! effective relaxations
|
||||||
|
enddo
|
||||||
|
F(1:3,1:3,iGrain) = F(1:3,1:3,iGrain) + avgF ! relaxed deformation gradient
|
||||||
|
enddo
|
||||||
|
|
||||||
|
end subroutine grainDeformation
|
||||||
|
|
||||||
|
end function homogenization_RGC_updateState
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief derive average stress and stiffness from constituent quantities
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
subroutine homogenization_RGC_averageStressAndItsTangent(avgP,dAvgPdAvgF,P,dPdF,instance)
|
||||||
|
use material, only: &
|
||||||
|
homogenization_maxNgrains
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
real(pReal), dimension (3,3), intent(out) :: avgP !< average stress at material point
|
||||||
|
real(pReal), dimension (3,3,3,3), intent(out) :: dAvgPdAvgF !< average stiffness at material point
|
||||||
|
real(pReal), dimension (3,3,homogenization_maxNgrains), intent(in) :: P !< array of current grain stresses
|
||||||
|
real(pReal), dimension (3,3,3,3,homogenization_maxNgrains), intent(in) :: dPdF !< array of current grain stiffnesses
|
||||||
|
integer(pInt), intent(in) :: instance
|
||||||
|
|
||||||
|
avgP = sum(P,3) /real(product(param(instance)%Nconstituents),pReal)
|
||||||
|
dAvgPdAvgF = sum(dPdF,5)/real(product(param(instance)%Nconstituents),pReal)
|
||||||
|
|
||||||
|
end subroutine homogenization_RGC_averageStressAndItsTangent
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief return array of homogenization results for post file inclusion
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
pure function homogenization_RGC_postResults(ip,el) result(postResults)
|
||||||
|
use mesh, only: &
|
||||||
|
mesh_homogenizationAt
|
||||||
|
use material, only: &
|
||||||
|
homogenization_typeInstance,&
|
||||||
|
homogState, &
|
||||||
|
mappingHomogenization, &
|
||||||
|
homogenization_Noutput
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
integer(pInt), intent(in) :: &
|
||||||
|
ip, & !< integration point number
|
||||||
|
el !< element number
|
||||||
|
|
||||||
|
integer(pInt) instance,o,c,nIntFaceTot
|
||||||
|
type(tParameters) :: prm
|
||||||
|
real(pReal), dimension(homogenization_RGC_sizePostResults(homogenization_typeInstance(mesh_homogenizationAt(el)))) :: &
|
||||||
|
postResults
|
||||||
|
|
||||||
|
instance = homogenization_typeInstance(mesh_homogenizationAt(el))
|
||||||
|
associate(prm => param(instance))
|
||||||
|
nIntFaceTot=(prm%Nconstituents(1)-1_pInt)*prm%Nconstituents(2)* prm%Nconstituents(3)&
|
||||||
|
+ prm%Nconstituents(1)* (prm%Nconstituents(2)-1_pInt)*prm%Nconstituents(3)&
|
||||||
|
+ prm%Nconstituents(1)* prm%Nconstituents(2)* (prm%Nconstituents(3)-1_pInt)
|
||||||
|
|
||||||
|
c = 0_pInt
|
||||||
|
postResults = 0.0_pReal
|
||||||
|
outputsLoop: do o = 1_pInt,size(prm%outputID)
|
||||||
|
select case(prm%outputID(o))
|
||||||
|
case (constitutivework_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+1,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 1_pInt
|
||||||
|
case (magnitudemismatch_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+2,mappingHomogenization(1,ip,el))
|
||||||
|
postResults(c+2) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+3,mappingHomogenization(1,ip,el))
|
||||||
|
postResults(c+3) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+4,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 3_pInt
|
||||||
|
case (penaltyenergy_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+5,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 1_pInt
|
||||||
|
case (volumediscrepancy_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+6,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 1_pInt
|
||||||
|
case (averagerelaxrate_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+7,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 1_pInt
|
||||||
|
case (maximumrelaxrate_ID)
|
||||||
|
postResults(c+1) = homogState(mappingHomogenization(2,ip,el))% &
|
||||||
|
state(3*nIntFaceTot+8,mappingHomogenization(1,ip,el))
|
||||||
|
c = c + 1_pInt
|
||||||
|
end select
|
||||||
|
enddo outputsLoop
|
||||||
|
end associate
|
||||||
|
end function homogenization_RGC_postResults
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief collect relaxation vectors of an interface
|
!> @brief collect relaxation vectors of an interface
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -1394,44 +1433,4 @@ pure function interface1to4(iFace1D, instance)
|
||||||
end function interface1to4
|
end function interface1to4
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief calculating the grain deformation gradient (the same with
|
|
||||||
! homogenization_RGC_partionDeformation, but used only for perturbation scheme)
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine grainDeformation(F, avgF, ip, el)
|
|
||||||
use mesh, only: &
|
|
||||||
mesh_homogenizationAt
|
|
||||||
use material, only: &
|
|
||||||
homogenization_maxNgrains,&
|
|
||||||
homogenization_typeInstance
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
real(pReal), dimension (3,3,homogenization_maxNgrains), intent(out) :: F !< partioned F per grain
|
|
||||||
real(pReal), dimension (3,3), intent(in) :: avgF !<
|
|
||||||
integer(pInt), intent(in) :: &
|
|
||||||
el, & !< element number
|
|
||||||
ip !< integration point number
|
|
||||||
real(pReal), dimension (3) :: aVect,nVect
|
|
||||||
integer(pInt), dimension (4) :: intFace
|
|
||||||
integer(pInt), dimension (3) :: iGrain3
|
|
||||||
integer(pInt) :: instance, iGrain,iFace,i,j
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
! compute the deformation gradient of individual grains due to relaxations
|
|
||||||
instance = homogenization_typeInstance(mesh_homogenizationAt(el))
|
|
||||||
F = 0.0_pReal
|
|
||||||
do iGrain = 1_pInt,product(param(instance)%Nconstituents)
|
|
||||||
iGrain3 = grain1to3(iGrain,instance)
|
|
||||||
do iFace = 1_pInt,6_pInt
|
|
||||||
intFace = getInterface(iFace,iGrain3)
|
|
||||||
aVect = relaxationVector(intFace,instance, ip, el)
|
|
||||||
nVect = interfaceNormal(intFace,ip,el)
|
|
||||||
forall (i=1_pInt:3_pInt,j=1_pInt:3_pInt) &
|
|
||||||
F(i,j,iGrain) = F(i,j,iGrain) + aVect(i)*nVect(j) ! effective relaxations
|
|
||||||
enddo
|
|
||||||
F(1:3,1:3,iGrain) = F(1:3,1:3,iGrain) + avgF ! relaxed deformation gradient
|
|
||||||
enddo
|
|
||||||
|
|
||||||
end subroutine grainDeformation
|
|
||||||
|
|
||||||
end module homogenization_RGC
|
end module homogenization_RGC
|
||||||
|
|
Loading…
Reference in New Issue