Merge branch 'development' into 53-separate-mesh-for-different-solvers-3
This commit is contained in:
commit
fbd8912237
49
src/IO.f90
49
src/IO.f90
|
@ -177,11 +177,10 @@ recursive function IO_recursiveRead(fileName,cnt) result(fileContent)
|
||||||
fileUnit, &
|
fileUnit, &
|
||||||
startPos, endPos, &
|
startPos, endPos, &
|
||||||
myTotalLines, & !< # lines read from file without include statements
|
myTotalLines, & !< # lines read from file without include statements
|
||||||
includedLines, & !< # lines included from other file(s)
|
|
||||||
missingLines, & !< # lines missing from current file
|
|
||||||
l,i, &
|
l,i, &
|
||||||
myStat
|
myStat
|
||||||
|
logical :: warned
|
||||||
|
|
||||||
if (present(cnt)) then
|
if (present(cnt)) then
|
||||||
if (cnt>10_pInt) call IO_error(106_pInt,ext_msg=trim(fileName))
|
if (cnt>10_pInt) call IO_error(106_pInt,ext_msg=trim(fileName))
|
||||||
endif
|
endif
|
||||||
|
@ -198,37 +197,39 @@ recursive function IO_recursiveRead(fileName,cnt) result(fileContent)
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! count lines to allocate string array
|
! count lines to allocate string array
|
||||||
myTotalLines = 0_pInt
|
myTotalLines = 1_pInt
|
||||||
do l=1_pInt, len(rawData)
|
do l=1_pInt, len(rawData)
|
||||||
if (rawData(l:l) == new_line('') .or. l==len(rawData)) myTotalLines = myTotalLines+1 ! end of line or end of file without new line
|
if (rawData(l:l) == new_line('')) myTotalLines = myTotalLines+1
|
||||||
enddo
|
enddo
|
||||||
allocate(fileContent(myTotalLines))
|
allocate(fileContent(myTotalLines))
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! split raw data at end of line and handle includes
|
! split raw data at end of line and handle includes
|
||||||
|
warned = .false.
|
||||||
startPos = 1_pInt
|
startPos = 1_pInt
|
||||||
endPos = 0_pInt
|
l = 1_pInt
|
||||||
|
do while (l <= myTotalLines)
|
||||||
|
endPos = merge(startPos + scan(rawData(startPos:),new_line('')) - 2_pInt,len(rawData),l /= myTotalLines)
|
||||||
|
if (endPos - startPos > 255_pInt) then
|
||||||
|
line = rawData(startPos:startPos+255_pInt)
|
||||||
|
if (.not. warned) then
|
||||||
|
call IO_warning(207_pInt,ext_msg=trim(fileName),el=l)
|
||||||
|
warned = .true.
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
line = rawData(startPos:endpos)
|
||||||
|
endif
|
||||||
|
startPos = endPos + 2_pInt ! jump to next line start
|
||||||
|
|
||||||
includedLines=0_pInt
|
recursion: if (scan(trim(adjustl(line)),'{') == 1 .and. scan(trim(line),'}') > 2) then
|
||||||
l=0_pInt
|
|
||||||
do while (startPos <= len(rawData))
|
|
||||||
l = l + 1_pInt
|
|
||||||
endPos = endPos + scan(rawData(startPos:),new_line(''))
|
|
||||||
if(endPos < startPos) endPos = len(rawData) ! end of file without end of line
|
|
||||||
if(endPos - startPos >256) call IO_error(107_pInt,ext_msg=trim(fileName))
|
|
||||||
line = rawData(startPos:endPos-1_pInt)
|
|
||||||
startPos = endPos + 1_pInt
|
|
||||||
|
|
||||||
recursion: if(scan(trim(line),'{') < scan(trim(line),'}')) then
|
|
||||||
myTotalLines = myTotalLines - 1_pInt
|
|
||||||
includedContent = IO_recursiveRead(trim(line(scan(line,'{')+1_pInt:scan(line,'}')-1_pInt)), &
|
includedContent = IO_recursiveRead(trim(line(scan(line,'{')+1_pInt:scan(line,'}')-1_pInt)), &
|
||||||
merge(cnt,1_pInt,present(cnt))) ! to track recursion depth
|
merge(cnt,1_pInt,present(cnt))) ! to track recursion depth
|
||||||
includedLines = includedLines + size(includedContent)
|
fileContent = [ fileContent(1:l-1_pInt), includedContent, [(dummy,i=1,myTotalLines-l)] ] ! add content and grow array
|
||||||
missingLines = myTotalLines + includedLines - size(fileContent(1:l-1)) -size(includedContent)
|
myTotalLines = myTotalLines - 1_pInt + size(includedContent)
|
||||||
fileContent = [ fileContent(1:l-1_pInt), includedContent, [(dummy,i=1,missingLines)] ] ! add content and grow array
|
l = l - 1_pInt + size(includedContent)
|
||||||
l = l - 1_pInt + size(includedContent)
|
|
||||||
else recursion
|
else recursion
|
||||||
fileContent(l) = line
|
fileContent(l) = line
|
||||||
|
l = l + 1_pInt
|
||||||
endif recursion
|
endif recursion
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
@ -1483,6 +1484,8 @@ subroutine IO_warning(warning_ID,el,ip,g,ext_msg)
|
||||||
msg = 'invalid character in string chunk'
|
msg = 'invalid character in string chunk'
|
||||||
case (203_pInt)
|
case (203_pInt)
|
||||||
msg = 'interpretation of string chunk failed'
|
msg = 'interpretation of string chunk failed'
|
||||||
|
case (207_pInt)
|
||||||
|
msg = 'line truncated'
|
||||||
case (600_pInt)
|
case (600_pInt)
|
||||||
msg = 'crystallite responds elastically'
|
msg = 'crystallite responds elastically'
|
||||||
case (601_pInt)
|
case (601_pInt)
|
||||||
|
|
1051
src/crystallite.f90
1051
src/crystallite.f90
File diff suppressed because it is too large
Load Diff
|
@ -45,10 +45,10 @@ module homogenization
|
||||||
materialpoint_stressAndItsTangent, &
|
materialpoint_stressAndItsTangent, &
|
||||||
materialpoint_postResults
|
materialpoint_postResults
|
||||||
private :: &
|
private :: &
|
||||||
homogenization_partitionDeformation, &
|
partitionDeformation, &
|
||||||
homogenization_updateState, &
|
updateState, &
|
||||||
homogenization_averageStressAndItsTangent, &
|
averageStressAndItsTangent, &
|
||||||
homogenization_postResults
|
postResults
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -118,12 +118,9 @@ subroutine homogenization_init
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! parse homogenization from config file
|
! parse homogenization from config file
|
||||||
if (any(homogenization_type == HOMOGENIZATION_NONE_ID)) &
|
if (any(homogenization_type == HOMOGENIZATION_NONE_ID)) call homogenization_none_init
|
||||||
call homogenization_none_init()
|
if (any(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID)) call homogenization_isostrain_init
|
||||||
if (any(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID)) &
|
if (any(homogenization_type == HOMOGENIZATION_RGC_ID)) call homogenization_RGC_init
|
||||||
call homogenization_isostrain_init(FILEUNIT)
|
|
||||||
if (any(homogenization_type == HOMOGENIZATION_RGC_ID)) &
|
|
||||||
call homogenization_RGC_init(FILEUNIT)
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! parse thermal from config file
|
! parse thermal from config file
|
||||||
|
@ -156,17 +153,14 @@ subroutine homogenization_init
|
||||||
select case(homogenization_type(p)) ! split per homogenization type
|
select case(homogenization_type(p)) ! split per homogenization type
|
||||||
case (HOMOGENIZATION_NONE_ID)
|
case (HOMOGENIZATION_NONE_ID)
|
||||||
outputName = HOMOGENIZATION_NONE_label
|
outputName = HOMOGENIZATION_NONE_label
|
||||||
thisNoutput => null()
|
|
||||||
thisOutput => null()
|
thisOutput => null()
|
||||||
thisSize => null()
|
thisSize => null()
|
||||||
case (HOMOGENIZATION_ISOSTRAIN_ID)
|
case (HOMOGENIZATION_ISOSTRAIN_ID)
|
||||||
outputName = HOMOGENIZATION_ISOSTRAIN_label
|
outputName = HOMOGENIZATION_ISOSTRAIN_label
|
||||||
thisNoutput => homogenization_isostrain_Noutput
|
thisOutput => null()
|
||||||
thisOutput => homogenization_isostrain_output
|
thisSize => null()
|
||||||
thisSize => homogenization_isostrain_sizePostResult
|
|
||||||
case (HOMOGENIZATION_RGC_ID)
|
case (HOMOGENIZATION_RGC_ID)
|
||||||
outputName = HOMOGENIZATION_RGC_label
|
outputName = HOMOGENIZATION_RGC_label
|
||||||
thisNoutput => homogenization_RGC_Noutput
|
|
||||||
thisOutput => homogenization_RGC_output
|
thisOutput => homogenization_RGC_output
|
||||||
thisSize => homogenization_RGC_sizePostResult
|
thisSize => homogenization_RGC_sizePostResult
|
||||||
case default
|
case default
|
||||||
|
@ -176,8 +170,9 @@ subroutine homogenization_init
|
||||||
if (valid) then
|
if (valid) then
|
||||||
write(FILEUNIT,'(a)') '(type)'//char(9)//trim(outputName)
|
write(FILEUNIT,'(a)') '(type)'//char(9)//trim(outputName)
|
||||||
write(FILEUNIT,'(a,i4)') '(ngrains)'//char(9),homogenization_Ngrains(p)
|
write(FILEUNIT,'(a,i4)') '(ngrains)'//char(9),homogenization_Ngrains(p)
|
||||||
if (homogenization_type(p) /= HOMOGENIZATION_NONE_ID) then
|
if (homogenization_type(p) /= HOMOGENIZATION_NONE_ID .and. &
|
||||||
do e = 1,thisNoutput(i)
|
homogenization_type(p) /= HOMOGENIZATION_ISOSTRAIN_ID) then
|
||||||
|
do e = 1,size(thisOutput(:,i))
|
||||||
write(FILEUNIT,'(a,i4)') trim(thisOutput(e,i))//char(9),thisSize(e,i)
|
write(FILEUNIT,'(a,i4)') trim(thisOutput(e,i))//char(9),thisSize(e,i)
|
||||||
enddo
|
enddo
|
||||||
endif
|
endif
|
||||||
|
@ -605,7 +600,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt)
|
||||||
IpLooping2: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
IpLooping2: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
||||||
if ( materialpoint_requested(i,e) .and. & ! process requested but...
|
if ( materialpoint_requested(i,e) .and. & ! process requested but...
|
||||||
.not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points
|
.not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points
|
||||||
call homogenization_partitionDeformation(i,e) ! partition deformation onto constituents
|
call partitionDeformation(i,e) ! partition deformation onto constituents
|
||||||
crystallite_dt(1:myNgrains,i,e) = materialpoint_subdt(i,e) ! propagate materialpoint dt to grains
|
crystallite_dt(1:myNgrains,i,e) = materialpoint_subdt(i,e) ! propagate materialpoint dt to grains
|
||||||
crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents
|
crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents
|
||||||
else
|
else
|
||||||
|
@ -631,7 +626,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt)
|
||||||
if (.not. materialpoint_converged(i,e)) then
|
if (.not. materialpoint_converged(i,e)) then
|
||||||
materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.]
|
materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.]
|
||||||
else
|
else
|
||||||
materialpoint_doneAndHappy(1:2,i,e) = homogenization_updateState(i,e)
|
materialpoint_doneAndHappy(1:2,i,e) = updateState(i,e)
|
||||||
materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy
|
materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -652,7 +647,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt)
|
||||||
!$OMP PARALLEL DO
|
!$OMP PARALLEL DO
|
||||||
elementLooping4: do e = FEsolving_execElem(1),FEsolving_execElem(2)
|
elementLooping4: do e = FEsolving_execElem(1),FEsolving_execElem(2)
|
||||||
IpLooping4: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
IpLooping4: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e)
|
||||||
call homogenization_averageStressAndItsTangent(i,e)
|
call averageStressAndItsTangent(i,e)
|
||||||
enddo IpLooping4
|
enddo IpLooping4
|
||||||
enddo elementLooping4
|
enddo elementLooping4
|
||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
|
@ -710,7 +705,7 @@ subroutine materialpoint_postResults
|
||||||
thePos = thePos + 1_pInt
|
thePos = thePos + 1_pInt
|
||||||
|
|
||||||
if (theSize > 0_pInt) then ! any homogenization results to mention?
|
if (theSize > 0_pInt) then ! any homogenization results to mention?
|
||||||
materialpoint_results(thePos+1:thePos+theSize,i,e) = homogenization_postResults(i,e) ! tell homogenization results
|
materialpoint_results(thePos+1:thePos+theSize,i,e) = postResults(i,e) ! tell homogenization results
|
||||||
thePos = thePos + theSize
|
thePos = thePos + theSize
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -734,12 +729,12 @@ end subroutine materialpoint_postResults
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief partition material point def grad onto constituents
|
!> @brief partition material point def grad onto constituents
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine homogenization_partitionDeformation(ip,el)
|
subroutine partitionDeformation(ip,el)
|
||||||
use mesh, only: &
|
use mesh, only: &
|
||||||
mesh_element
|
mesh_element
|
||||||
use material, only: &
|
use material, only: &
|
||||||
homogenization_type, &
|
homogenization_type, &
|
||||||
homogenization_maxNgrains, &
|
homogenization_Ngrains, &
|
||||||
HOMOGENIZATION_NONE_ID, &
|
HOMOGENIZATION_NONE_ID, &
|
||||||
HOMOGENIZATION_ISOSTRAIN_ID, &
|
HOMOGENIZATION_ISOSTRAIN_ID, &
|
||||||
HOMOGENIZATION_RGC_ID
|
HOMOGENIZATION_RGC_ID
|
||||||
|
@ -758,38 +753,36 @@ subroutine homogenization_partitionDeformation(ip,el)
|
||||||
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
||||||
|
|
||||||
case (HOMOGENIZATION_NONE_ID) chosenHomogenization
|
case (HOMOGENIZATION_NONE_ID) chosenHomogenization
|
||||||
crystallite_partionedF(1:3,1:3,1:homogenization_maxNgrains,ip,el) = 0.0_pReal
|
crystallite_partionedF(1:3,1:3,1,ip,el) = materialpoint_subF(1:3,1:3,ip,el)
|
||||||
crystallite_partionedF(1:3,1:3,1:1,ip,el) = &
|
|
||||||
spread(materialpoint_subF(1:3,1:3,ip,el),3,1)
|
|
||||||
|
|
||||||
case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization
|
case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization
|
||||||
call homogenization_isostrain_partitionDeformation(&
|
call homogenization_isostrain_partitionDeformation(&
|
||||||
crystallite_partionedF(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
materialpoint_subF(1:3,1:3,ip,el),&
|
materialpoint_subF(1:3,1:3,ip,el))
|
||||||
el)
|
|
||||||
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
||||||
call homogenization_RGC_partitionDeformation(&
|
call homogenization_RGC_partitionDeformation(&
|
||||||
crystallite_partionedF(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
materialpoint_subF(1:3,1:3,ip,el),&
|
materialpoint_subF(1:3,1:3,ip,el),&
|
||||||
ip, &
|
ip, &
|
||||||
el)
|
el)
|
||||||
end select chosenHomogenization
|
end select chosenHomogenization
|
||||||
|
|
||||||
end subroutine homogenization_partitionDeformation
|
end subroutine partitionDeformation
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief update the internal state of the homogenization scheme and tell whether "done" and
|
!> @brief update the internal state of the homogenization scheme and tell whether "done" and
|
||||||
!> "happy" with result
|
!> "happy" with result
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
function homogenization_updateState(ip,el)
|
function updateState(ip,el)
|
||||||
use mesh, only: &
|
use mesh, only: &
|
||||||
mesh_element
|
mesh_element
|
||||||
use material, only: &
|
use material, only: &
|
||||||
homogenization_type, &
|
homogenization_type, &
|
||||||
thermal_type, &
|
thermal_type, &
|
||||||
damage_type, &
|
damage_type, &
|
||||||
homogenization_maxNgrains, &
|
homogenization_Ngrains, &
|
||||||
HOMOGENIZATION_RGC_ID, &
|
HOMOGENIZATION_RGC_ID, &
|
||||||
THERMAL_adiabatic_ID, &
|
THERMAL_adiabatic_ID, &
|
||||||
DAMAGE_local_ID
|
DAMAGE_local_ID
|
||||||
|
@ -809,27 +802,27 @@ function homogenization_updateState(ip,el)
|
||||||
integer(pInt), intent(in) :: &
|
integer(pInt), intent(in) :: &
|
||||||
ip, & !< integration point
|
ip, & !< integration point
|
||||||
el !< element number
|
el !< element number
|
||||||
logical, dimension(2) :: homogenization_updateState
|
logical, dimension(2) :: updateState
|
||||||
|
|
||||||
homogenization_updateState = .true.
|
updateState = .true.
|
||||||
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
||||||
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
||||||
homogenization_updateState = &
|
updateState = &
|
||||||
homogenization_updateState .and. &
|
updateState .and. &
|
||||||
homogenization_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
homogenization_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
crystallite_partionedF(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
crystallite_partionedF0(1:3,1:3,1:homogenization_maxNgrains,ip,el),&
|
crystallite_partionedF0(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el),&
|
||||||
materialpoint_subF(1:3,1:3,ip,el),&
|
materialpoint_subF(1:3,1:3,ip,el),&
|
||||||
materialpoint_subdt(ip,el), &
|
materialpoint_subdt(ip,el), &
|
||||||
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
ip, &
|
ip, &
|
||||||
el)
|
el)
|
||||||
end select chosenHomogenization
|
end select chosenHomogenization
|
||||||
|
|
||||||
chosenThermal: select case (thermal_type(mesh_element(3,el)))
|
chosenThermal: select case (thermal_type(mesh_element(3,el)))
|
||||||
case (THERMAL_adiabatic_ID) chosenThermal
|
case (THERMAL_adiabatic_ID) chosenThermal
|
||||||
homogenization_updateState = &
|
updateState = &
|
||||||
homogenization_updateState .and. &
|
updateState .and. &
|
||||||
thermal_adiabatic_updateState(materialpoint_subdt(ip,el), &
|
thermal_adiabatic_updateState(materialpoint_subdt(ip,el), &
|
||||||
ip, &
|
ip, &
|
||||||
el)
|
el)
|
||||||
|
@ -837,25 +830,26 @@ function homogenization_updateState(ip,el)
|
||||||
|
|
||||||
chosenDamage: select case (damage_type(mesh_element(3,el)))
|
chosenDamage: select case (damage_type(mesh_element(3,el)))
|
||||||
case (DAMAGE_local_ID) chosenDamage
|
case (DAMAGE_local_ID) chosenDamage
|
||||||
homogenization_updateState = &
|
updateState = &
|
||||||
homogenization_updateState .and. &
|
updateState .and. &
|
||||||
damage_local_updateState(materialpoint_subdt(ip,el), &
|
damage_local_updateState(materialpoint_subdt(ip,el), &
|
||||||
ip, &
|
ip, &
|
||||||
el)
|
el)
|
||||||
end select chosenDamage
|
end select chosenDamage
|
||||||
|
|
||||||
end function homogenization_updateState
|
end function updateState
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief derive average stress and stiffness from constituent quantities
|
!> @brief derive average stress and stiffness from constituent quantities
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine homogenization_averageStressAndItsTangent(ip,el)
|
subroutine averageStressAndItsTangent(ip,el)
|
||||||
use mesh, only: &
|
use mesh, only: &
|
||||||
mesh_element
|
mesh_element
|
||||||
use material, only: &
|
use material, only: &
|
||||||
homogenization_type, &
|
homogenization_type, &
|
||||||
homogenization_maxNgrains, &
|
homogenization_typeInstance, &
|
||||||
|
homogenization_Ngrains, &
|
||||||
HOMOGENIZATION_NONE_ID, &
|
HOMOGENIZATION_NONE_ID, &
|
||||||
HOMOGENIZATION_ISOSTRAIN_ID, &
|
HOMOGENIZATION_ISOSTRAIN_ID, &
|
||||||
HOMOGENIZATION_RGC_ID
|
HOMOGENIZATION_RGC_ID
|
||||||
|
@ -873,36 +867,39 @@ subroutine homogenization_averageStressAndItsTangent(ip,el)
|
||||||
|
|
||||||
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
chosenHomogenization: select case(homogenization_type(mesh_element(3,el)))
|
||||||
case (HOMOGENIZATION_NONE_ID) chosenHomogenization
|
case (HOMOGENIZATION_NONE_ID) chosenHomogenization
|
||||||
materialpoint_P(1:3,1:3,ip,el) = sum(crystallite_P(1:3,1:3,1:1,ip,el),3)
|
materialpoint_P(1:3,1:3,ip,el) = crystallite_P(1:3,1:3,1,ip,el)
|
||||||
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el) &
|
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el) = crystallite_dPdF(1:3,1:3,1:3,1:3,1,ip,el)
|
||||||
= sum(crystallite_dPdF(1:3,1:3,1:3,1:3,1:1,ip,el),5)
|
|
||||||
|
|
||||||
case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization
|
case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization
|
||||||
call homogenization_isostrain_averageStressAndItsTangent(&
|
call homogenization_isostrain_averageStressAndItsTangent(&
|
||||||
materialpoint_P(1:3,1:3,ip,el), &
|
materialpoint_P(1:3,1:3,ip,el), &
|
||||||
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),&
|
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),&
|
||||||
crystallite_P(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_P(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
el)
|
homogenization_typeInstance(mesh_element(3,el)))
|
||||||
|
|
||||||
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
||||||
call homogenization_RGC_averageStressAndItsTangent(&
|
call homogenization_RGC_averageStressAndItsTangent(&
|
||||||
materialpoint_P(1:3,1:3,ip,el), &
|
materialpoint_P(1:3,1:3,ip,el), &
|
||||||
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),&
|
materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),&
|
||||||
crystallite_P(1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_P(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_maxNgrains,ip,el), &
|
crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)),ip,el), &
|
||||||
el)
|
homogenization_typeInstance(mesh_element(3,el)))
|
||||||
end select chosenHomogenization
|
end select chosenHomogenization
|
||||||
|
|
||||||
end subroutine homogenization_averageStressAndItsTangent
|
end subroutine averageStressAndItsTangent
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief return array of homogenization results for post file inclusion. call only,
|
!> @brief return array of homogenization results for post file inclusion. call only,
|
||||||
!> if homogenization_sizePostResults(i,e) > 0 !!
|
!> if homogenization_sizePostResults(i,e) > 0 !!
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
function homogenization_postResults(ip,el)
|
function postResults(ip,el)
|
||||||
use mesh, only: &
|
use mesh, only: &
|
||||||
mesh_element
|
mesh_element
|
||||||
use material, only: &
|
use material, only: &
|
||||||
|
material_homogenizationAt, &
|
||||||
|
homogenization_typeInstance,&
|
||||||
mappingHomogenization, &
|
mappingHomogenization, &
|
||||||
homogState, &
|
homogState, &
|
||||||
thermalState, &
|
thermalState, &
|
||||||
|
@ -919,8 +916,6 @@ function homogenization_postResults(ip,el)
|
||||||
DAMAGE_none_ID, &
|
DAMAGE_none_ID, &
|
||||||
DAMAGE_local_ID, &
|
DAMAGE_local_ID, &
|
||||||
DAMAGE_nonlocal_ID
|
DAMAGE_nonlocal_ID
|
||||||
use homogenization_isostrain, only: &
|
|
||||||
homogenization_isostrain_postResults
|
|
||||||
use homogenization_RGC, only: &
|
use homogenization_RGC, only: &
|
||||||
homogenization_RGC_postResults
|
homogenization_RGC_postResults
|
||||||
use thermal_adiabatic, only: &
|
use thermal_adiabatic, only: &
|
||||||
|
@ -939,60 +934,46 @@ function homogenization_postResults(ip,el)
|
||||||
real(pReal), dimension( homogState (mappingHomogenization(2,ip,el))%sizePostResults &
|
real(pReal), dimension( homogState (mappingHomogenization(2,ip,el))%sizePostResults &
|
||||||
+ thermalState (mappingHomogenization(2,ip,el))%sizePostResults &
|
+ thermalState (mappingHomogenization(2,ip,el))%sizePostResults &
|
||||||
+ damageState (mappingHomogenization(2,ip,el))%sizePostResults) :: &
|
+ damageState (mappingHomogenization(2,ip,el))%sizePostResults) :: &
|
||||||
homogenization_postResults
|
postResults
|
||||||
integer(pInt) :: &
|
integer(pInt) :: &
|
||||||
startPos, endPos
|
startPos, endPos ,&
|
||||||
|
of, instance
|
||||||
|
|
||||||
homogenization_postResults = 0.0_pReal
|
|
||||||
|
|
||||||
|
postResults = 0.0_pReal
|
||||||
startPos = 1_pInt
|
startPos = 1_pInt
|
||||||
endPos = homogState(mappingHomogenization(2,ip,el))%sizePostResults
|
endPos = homogState(mappingHomogenization(2,ip,el))%sizePostResults
|
||||||
chosenHomogenization: select case (homogenization_type(mesh_element(3,el)))
|
chosenHomogenization: select case (homogenization_type(mesh_element(3,el)))
|
||||||
case (HOMOGENIZATION_NONE_ID) chosenHomogenization
|
|
||||||
|
|
||||||
case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization
|
|
||||||
homogenization_postResults(startPos:endPos) = &
|
|
||||||
homogenization_isostrain_postResults(&
|
|
||||||
ip, &
|
|
||||||
el, &
|
|
||||||
materialpoint_P(1:3,1:3,ip,el), &
|
|
||||||
materialpoint_F(1:3,1:3,ip,el))
|
|
||||||
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
case (HOMOGENIZATION_RGC_ID) chosenHomogenization
|
||||||
homogenization_postResults(startPos:endPos) = &
|
instance = homogenization_typeInstance(material_homogenizationAt(el))
|
||||||
homogenization_RGC_postResults(&
|
of = mappingHomogenization(1,ip,el)
|
||||||
ip, &
|
postResults(startPos:endPos) = homogenization_RGC_postResults(instance,of)
|
||||||
el, &
|
|
||||||
materialpoint_P(1:3,1:3,ip,el), &
|
|
||||||
materialpoint_F(1:3,1:3,ip,el))
|
|
||||||
end select chosenHomogenization
|
end select chosenHomogenization
|
||||||
|
|
||||||
startPos = endPos + 1_pInt
|
startPos = endPos + 1_pInt
|
||||||
endPos = endPos + thermalState(mappingHomogenization(2,ip,el))%sizePostResults
|
endPos = endPos + thermalState(mappingHomogenization(2,ip,el))%sizePostResults
|
||||||
chosenThermal: select case (thermal_type(mesh_element(3,el)))
|
chosenThermal: select case (thermal_type(mesh_element(3,el)))
|
||||||
case (THERMAL_isothermal_ID) chosenThermal
|
|
||||||
|
|
||||||
case (THERMAL_adiabatic_ID) chosenThermal
|
case (THERMAL_adiabatic_ID) chosenThermal
|
||||||
homogenization_postResults(startPos:endPos) = &
|
postResults(startPos:endPos) = thermal_adiabatic_postResults(ip, el)
|
||||||
thermal_adiabatic_postResults(ip, el)
|
|
||||||
case (THERMAL_conduction_ID) chosenThermal
|
case (THERMAL_conduction_ID) chosenThermal
|
||||||
homogenization_postResults(startPos:endPos) = &
|
postResults(startPos:endPos) = thermal_conduction_postResults(ip, el)
|
||||||
thermal_conduction_postResults(ip, el)
|
|
||||||
end select chosenThermal
|
end select chosenThermal
|
||||||
|
|
||||||
startPos = endPos + 1_pInt
|
startPos = endPos + 1_pInt
|
||||||
endPos = endPos + damageState(mappingHomogenization(2,ip,el))%sizePostResults
|
endPos = endPos + damageState(mappingHomogenization(2,ip,el))%sizePostResults
|
||||||
chosenDamage: select case (damage_type(mesh_element(3,el)))
|
chosenDamage: select case (damage_type(mesh_element(3,el)))
|
||||||
case (DAMAGE_none_ID) chosenDamage
|
|
||||||
|
|
||||||
case (DAMAGE_local_ID) chosenDamage
|
case (DAMAGE_local_ID) chosenDamage
|
||||||
homogenization_postResults(startPos:endPos) = &
|
postResults(startPos:endPos) = damage_local_postResults(ip, el)
|
||||||
damage_local_postResults(ip, el)
|
|
||||||
|
|
||||||
case (DAMAGE_nonlocal_ID) chosenDamage
|
case (DAMAGE_nonlocal_ID) chosenDamage
|
||||||
homogenization_postResults(startPos:endPos) = &
|
postResults(startPos:endPos) = damage_nonlocal_postResults(ip, el)
|
||||||
damage_nonlocal_postResults(ip, el)
|
|
||||||
end select chosenDamage
|
end select chosenDamage
|
||||||
|
|
||||||
end function homogenization_postResults
|
end function postResults
|
||||||
|
|
||||||
end module homogenization
|
end module homogenization
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,5 @@
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @brief Isostrain (full constraint Taylor assuption) homogenization scheme
|
!> @brief Isostrain (full constraint Taylor assuption) homogenization scheme
|
||||||
|
@ -6,220 +7,119 @@
|
||||||
module homogenization_isostrain
|
module homogenization_isostrain
|
||||||
use prec, only: &
|
use prec, only: &
|
||||||
pInt
|
pInt
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
private
|
private
|
||||||
integer(pInt), dimension(:), allocatable, public, protected :: &
|
|
||||||
homogenization_isostrain_sizePostResults
|
|
||||||
integer(pInt), dimension(:,:), allocatable, target, public :: &
|
|
||||||
homogenization_isostrain_sizePostResult
|
|
||||||
|
|
||||||
character(len=64), dimension(:,:), allocatable, target, public :: &
|
|
||||||
homogenization_isostrain_output !< name of each post result output
|
|
||||||
integer(pInt), dimension(:), allocatable, target, public :: &
|
|
||||||
homogenization_isostrain_Noutput !< number of outputs per homog instance
|
|
||||||
integer(pInt), dimension(:), allocatable, private :: &
|
|
||||||
homogenization_isostrain_Ngrains
|
|
||||||
enum, bind(c)
|
enum, bind(c)
|
||||||
enumerator :: undefined_ID, &
|
enumerator :: &
|
||||||
nconstituents_ID, &
|
parallel_ID, &
|
||||||
ipcoords_ID, &
|
average_ID
|
||||||
avgdefgrad_ID, &
|
|
||||||
avgfirstpiola_ID
|
|
||||||
end enum
|
end enum
|
||||||
enum, bind(c)
|
|
||||||
enumerator :: parallel_ID, &
|
|
||||||
average_ID
|
|
||||||
end enum
|
|
||||||
integer(kind(undefined_ID)), dimension(:,:), allocatable, private :: &
|
|
||||||
homogenization_isostrain_outputID !< ID of each post result output
|
|
||||||
integer(kind(average_ID)), dimension(:), allocatable, private :: &
|
|
||||||
homogenization_isostrain_mapping !< mapping type
|
|
||||||
|
|
||||||
|
type, private :: tParameters !< container type for internal constitutive parameters
|
||||||
|
integer(pInt) :: &
|
||||||
|
Nconstituents
|
||||||
|
integer(kind(average_ID)) :: &
|
||||||
|
mapping
|
||||||
|
end type
|
||||||
|
|
||||||
|
type(tParameters), dimension(:), allocatable, private :: param !< containers of constitutive parameters (len Ninstance)
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
homogenization_isostrain_init, &
|
homogenization_isostrain_init, &
|
||||||
homogenization_isostrain_partitionDeformation, &
|
homogenization_isostrain_partitionDeformation, &
|
||||||
homogenization_isostrain_averageStressAndItsTangent, &
|
homogenization_isostrain_averageStressAndItsTangent
|
||||||
homogenization_isostrain_postResults
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief allocates all neccessary fields, reads information from material configuration file
|
!> @brief allocates all neccessary fields, reads information from material configuration file
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine homogenization_isostrain_init(fileUnit)
|
subroutine homogenization_isostrain_init()
|
||||||
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
|
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
|
||||||
use, intrinsic :: iso_fortran_env, only: &
|
use, intrinsic :: iso_fortran_env, only: &
|
||||||
compiler_version, &
|
compiler_version, &
|
||||||
compiler_options
|
compiler_options
|
||||||
#endif
|
#endif
|
||||||
use prec, only: &
|
|
||||||
pReal
|
|
||||||
use debug, only: &
|
use debug, only: &
|
||||||
debug_HOMOGENIZATION, &
|
debug_HOMOGENIZATION, &
|
||||||
debug_level, &
|
debug_level, &
|
||||||
debug_levelBasic
|
debug_levelBasic
|
||||||
use IO
|
use IO, only: &
|
||||||
use material
|
IO_timeStamp, &
|
||||||
use config
|
IO_error
|
||||||
|
use material, only: &
|
||||||
|
homogenization_type, &
|
||||||
|
material_homog, &
|
||||||
|
homogState, &
|
||||||
|
HOMOGENIZATION_ISOSTRAIN_ID, &
|
||||||
|
HOMOGENIZATION_ISOSTRAIN_LABEL, &
|
||||||
|
homogenization_typeInstance
|
||||||
|
use config, only: &
|
||||||
|
config_homogenization
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
integer(pInt), intent(in) :: fileUnit
|
|
||||||
integer(pInt), allocatable, dimension(:) :: chunkPos
|
|
||||||
integer(pInt) :: &
|
integer(pInt) :: &
|
||||||
section = 0_pInt, i, mySize, o
|
Ninstance, &
|
||||||
integer :: &
|
h, &
|
||||||
maxNinstance, &
|
NofMyHomog
|
||||||
homog, &
|
|
||||||
instance
|
|
||||||
integer :: &
|
|
||||||
NofMyHomog ! no pInt (stores a system dependen value from 'count'
|
|
||||||
character(len=65536) :: &
|
character(len=65536) :: &
|
||||||
tag = '', &
|
tag = ''
|
||||||
line = ''
|
|
||||||
|
|
||||||
write(6,'(/,a)') ' <<<+- homogenization_'//HOMOGENIZATION_ISOSTRAIN_label//' init -+>>>'
|
write(6,'(/,a)') ' <<<+- homogenization_'//HOMOGENIZATION_ISOSTRAIN_label//' init -+>>>'
|
||||||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||||
#include "compilation_info.f90"
|
#include "compilation_info.f90"
|
||||||
|
|
||||||
maxNinstance = count(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID)
|
Ninstance = int(count(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID),pInt)
|
||||||
if (maxNinstance == 0) return
|
|
||||||
|
|
||||||
if (iand(debug_level(debug_HOMOGENIZATION),debug_levelBasic) /= 0_pInt) &
|
if (iand(debug_level(debug_HOMOGENIZATION),debug_levelBasic) /= 0_pInt) &
|
||||||
write(6,'(a16,1x,i5,/)') '# instances:',maxNinstance
|
write(6,'(a16,1x,i5,/)') '# instances:',Ninstance
|
||||||
allocate(homogenization_isostrain_sizePostResults(maxNinstance), source=0_pInt)
|
|
||||||
allocate(homogenization_isostrain_sizePostResult(maxval(homogenization_Noutput),maxNinstance), &
|
allocate(param(Ninstance)) ! one container of parameters per instance
|
||||||
source=0_pInt)
|
|
||||||
allocate(homogenization_isostrain_Noutput(maxNinstance), source=0_pInt)
|
do h = 1_pInt, size(homogenization_type)
|
||||||
allocate(homogenization_isostrain_Ngrains(maxNinstance), source=0_pInt)
|
if (homogenization_type(h) /= HOMOGENIZATION_ISOSTRAIN_ID) cycle
|
||||||
allocate(homogenization_isostrain_mapping(maxNinstance), source=average_ID)
|
|
||||||
allocate(homogenization_isostrain_output(maxval(homogenization_Noutput),maxNinstance))
|
associate(prm => param(homogenization_typeInstance(h)),&
|
||||||
homogenization_isostrain_output = ''
|
config => config_homogenization(h))
|
||||||
allocate(homogenization_isostrain_outputID(maxval(homogenization_Noutput),maxNinstance), &
|
|
||||||
source=undefined_ID)
|
prm%Nconstituents = config_homogenization(h)%getInt('nconstituents')
|
||||||
|
tag = 'sum'
|
||||||
|
select case(trim(config%getString('mapping',defaultVal = tag)))
|
||||||
|
case ('sum')
|
||||||
|
prm%mapping = parallel_ID
|
||||||
|
case ('avg')
|
||||||
|
prm%mapping = average_ID
|
||||||
|
case default
|
||||||
|
call IO_error(211_pInt,ext_msg=trim(tag)//' ('//HOMOGENIZATION_isostrain_label//')')
|
||||||
|
end select
|
||||||
|
|
||||||
|
NofMyHomog = count(material_homog == h)
|
||||||
|
homogState(h)%sizeState = 0_pInt
|
||||||
|
homogState(h)%sizePostResults = 0_pInt
|
||||||
|
allocate(homogState(h)%state0 (0_pInt,NofMyHomog))
|
||||||
|
allocate(homogState(h)%subState0(0_pInt,NofMyHomog))
|
||||||
|
allocate(homogState(h)%state (0_pInt,NofMyHomog))
|
||||||
|
|
||||||
|
end associate
|
||||||
|
|
||||||
rewind(fileUnit)
|
|
||||||
do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= material_partHomogenization)! wind forward to <homogenization>
|
|
||||||
line = IO_read(fileUnit)
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
parsingFile: do while (trim(line) /= IO_EOF) ! read through sections of homogenization part
|
|
||||||
line = IO_read(fileUnit)
|
|
||||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
|
||||||
if (IO_getTag(line,'<','>') /= '') then ! stop at next part
|
|
||||||
line = IO_read(fileUnit, .true.) ! reset IO_read
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
if (IO_getTag(line,'[',']') /= '') then ! next section
|
|
||||||
section = section + 1_pInt
|
|
||||||
cycle
|
|
||||||
endif
|
|
||||||
if (section > 0_pInt ) then ! do not short-circuit here (.and. with next if-statement). It's not safe in Fortran
|
|
||||||
if (homogenization_type(section) == HOMOGENIZATION_ISOSTRAIN_ID) then ! one of my sections
|
|
||||||
i = homogenization_typeInstance(section) ! which instance of my type is present homogenization
|
|
||||||
chunkPos = IO_stringPos(line)
|
|
||||||
tag = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key
|
|
||||||
select case(tag)
|
|
||||||
case ('(output)')
|
|
||||||
select case(IO_lc(IO_stringValue(line,chunkPos,2_pInt)))
|
|
||||||
case('nconstituents','ngrains')
|
|
||||||
homogenization_isostrain_Noutput(i) = homogenization_isostrain_Noutput(i) + 1_pInt
|
|
||||||
homogenization_isostrain_outputID(homogenization_isostrain_Noutput(i),i) = nconstituents_ID
|
|
||||||
homogenization_isostrain_output(homogenization_isostrain_Noutput(i),i) = &
|
|
||||||
IO_lc(IO_stringValue(line,chunkPos,2_pInt))
|
|
||||||
case('ipcoords')
|
|
||||||
homogenization_isostrain_Noutput(i) = homogenization_isostrain_Noutput(i) + 1_pInt
|
|
||||||
homogenization_isostrain_outputID(homogenization_isostrain_Noutput(i),i) = ipcoords_ID
|
|
||||||
homogenization_isostrain_output(homogenization_isostrain_Noutput(i),i) = &
|
|
||||||
IO_lc(IO_stringValue(line,chunkPos,2_pInt))
|
|
||||||
case('avgdefgrad','avgf')
|
|
||||||
homogenization_isostrain_Noutput(i) = homogenization_isostrain_Noutput(i) + 1_pInt
|
|
||||||
homogenization_isostrain_outputID(homogenization_isostrain_Noutput(i),i) = avgdefgrad_ID
|
|
||||||
homogenization_isostrain_output(homogenization_isostrain_Noutput(i),i) = &
|
|
||||||
IO_lc(IO_stringValue(line,chunkPos,2_pInt))
|
|
||||||
case('avgp','avgfirstpiola','avg1stpiola')
|
|
||||||
homogenization_isostrain_Noutput(i) = homogenization_isostrain_Noutput(i) + 1_pInt
|
|
||||||
homogenization_isostrain_outputID(homogenization_isostrain_Noutput(i),i) = avgfirstpiola_ID
|
|
||||||
homogenization_isostrain_output(homogenization_isostrain_Noutput(i),i) = &
|
|
||||||
IO_lc(IO_stringValue(line,chunkPos,2_pInt))
|
|
||||||
|
|
||||||
end select
|
|
||||||
case ('nconstituents','ngrains')
|
|
||||||
homogenization_isostrain_Ngrains(i) = IO_intValue(line,chunkPos,2_pInt)
|
|
||||||
case ('mapping')
|
|
||||||
select case(IO_lc(IO_stringValue(line,chunkPos,2_pInt)))
|
|
||||||
case ('parallel','sum')
|
|
||||||
homogenization_isostrain_mapping(i) = parallel_ID
|
|
||||||
case ('average','mean','avg')
|
|
||||||
homogenization_isostrain_mapping(i) = average_ID
|
|
||||||
case default
|
|
||||||
call IO_error(211_pInt,ext_msg=trim(tag)//' ('//HOMOGENIZATION_isostrain_label//')')
|
|
||||||
end select
|
|
||||||
|
|
||||||
end select
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
enddo parsingFile
|
|
||||||
|
|
||||||
initializeInstances: do homog = 1_pInt, material_Nhomogenization
|
|
||||||
myHomog: if (homogenization_type(homog) == HOMOGENIZATION_ISOSTRAIN_ID) then
|
|
||||||
NofMyHomog = count(material_homog == homog)
|
|
||||||
instance = homogenization_typeInstance(homog)
|
|
||||||
|
|
||||||
! * Determine size of postResults array
|
|
||||||
outputsLoop: do o = 1_pInt, homogenization_isostrain_Noutput(instance)
|
|
||||||
select case(homogenization_isostrain_outputID(o,instance))
|
|
||||||
case(nconstituents_ID)
|
|
||||||
mySize = 1_pInt
|
|
||||||
case(ipcoords_ID)
|
|
||||||
mySize = 3_pInt
|
|
||||||
case(avgdefgrad_ID, avgfirstpiola_ID)
|
|
||||||
mySize = 9_pInt
|
|
||||||
case default
|
|
||||||
mySize = 0_pInt
|
|
||||||
end select
|
|
||||||
|
|
||||||
outputFound: if (mySize > 0_pInt) then
|
|
||||||
homogenization_isostrain_sizePostResult(o,instance) = mySize
|
|
||||||
homogenization_isostrain_sizePostResults(instance) = &
|
|
||||||
homogenization_isostrain_sizePostResults(instance) + mySize
|
|
||||||
endif outputFound
|
|
||||||
enddo outputsLoop
|
|
||||||
|
|
||||||
! allocate state arrays
|
|
||||||
homogState(homog)%sizeState = 0_pInt
|
|
||||||
homogState(homog)%sizePostResults = homogenization_isostrain_sizePostResults(instance)
|
|
||||||
allocate(homogState(homog)%state0 (0_pInt,NofMyHomog), source=0.0_pReal)
|
|
||||||
allocate(homogState(homog)%subState0(0_pInt,NofMyHomog), source=0.0_pReal)
|
|
||||||
allocate(homogState(homog)%state (0_pInt,NofMyHomog), source=0.0_pReal)
|
|
||||||
|
|
||||||
endif myHomog
|
|
||||||
enddo initializeInstances
|
|
||||||
|
|
||||||
end subroutine homogenization_isostrain_init
|
end subroutine homogenization_isostrain_init
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief partitions the deformation gradient onto the constituents
|
!> @brief partitions the deformation gradient onto the constituents
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine homogenization_isostrain_partitionDeformation(F,avgF,el)
|
subroutine homogenization_isostrain_partitionDeformation(F,avgF)
|
||||||
use prec, only: &
|
use prec, only: &
|
||||||
pReal
|
pReal
|
||||||
use mesh, only: &
|
|
||||||
mesh_element
|
|
||||||
use material, only: &
|
|
||||||
homogenization_maxNgrains, &
|
|
||||||
homogenization_Ngrains
|
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
real(pReal), dimension (3,3,homogenization_maxNgrains), intent(out) :: F !< partioned def grad per grain
|
real(pReal), dimension (:,:,:), intent(out) :: F !< partitioned deformation gradient
|
||||||
real(pReal), dimension (3,3), intent(in) :: avgF !< my average def grad
|
|
||||||
integer(pInt), intent(in) :: &
|
real(pReal), dimension (3,3), intent(in) :: avgF !< average deformation gradient at material point
|
||||||
el !< element number
|
|
||||||
F=0.0_pReal
|
F = spread(avgF,3,size(F,3))
|
||||||
F(1:3,1:3,1:homogenization_Ngrains(mesh_element(3,el)))= &
|
|
||||||
spread(avgF,3,homogenization_Ngrains(mesh_element(3,el)))
|
|
||||||
|
|
||||||
end subroutine homogenization_isostrain_partitionDeformation
|
end subroutine homogenization_isostrain_partitionDeformation
|
||||||
|
|
||||||
|
@ -227,90 +127,31 @@ end subroutine homogenization_isostrain_partitionDeformation
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief derive average stress and stiffness from constituent quantities
|
!> @brief derive average stress and stiffness from constituent quantities
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine homogenization_isostrain_averageStressAndItsTangent(avgP,dAvgPdAvgF,P,dPdF,el)
|
subroutine homogenization_isostrain_averageStressAndItsTangent(avgP,dAvgPdAvgF,P,dPdF,instance)
|
||||||
use prec, only: &
|
use prec, only: &
|
||||||
pReal
|
pReal
|
||||||
use mesh, only: &
|
|
||||||
mesh_element
|
|
||||||
use material, only: &
|
|
||||||
homogenization_maxNgrains, &
|
|
||||||
homogenization_Ngrains, &
|
|
||||||
homogenization_typeInstance
|
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
real(pReal), dimension (3,3), intent(out) :: avgP !< average stress at material point
|
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,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) :: el !< element number
|
|
||||||
integer(pInt) :: &
|
|
||||||
homID, &
|
|
||||||
Ngrains
|
|
||||||
|
|
||||||
homID = homogenization_typeInstance(mesh_element(3,el))
|
real(pReal), dimension (:,:,:), intent(in) :: P !< partitioned stresses
|
||||||
Ngrains = homogenization_Ngrains(mesh_element(3,el))
|
real(pReal), dimension (:,:,:,:,:), intent(in) :: dPdF !< partitioned stiffnesses
|
||||||
|
integer(pInt), intent(in) :: instance
|
||||||
|
|
||||||
select case (homogenization_isostrain_mapping(homID))
|
associate(prm => param(instance))
|
||||||
|
|
||||||
|
select case (prm%mapping)
|
||||||
case (parallel_ID)
|
case (parallel_ID)
|
||||||
avgP = sum(P,3)
|
avgP = sum(P,3)
|
||||||
dAvgPdAvgF = sum(dPdF,5)
|
dAvgPdAvgF = sum(dPdF,5)
|
||||||
case (average_ID)
|
case (average_ID)
|
||||||
avgP = sum(P,3) /real(Ngrains,pReal)
|
avgP = sum(P,3) /real(prm%Nconstituents,pReal)
|
||||||
dAvgPdAvgF = sum(dPdF,5)/real(Ngrains,pReal)
|
dAvgPdAvgF = sum(dPdF,5)/real(prm%Nconstituents,pReal)
|
||||||
end select
|
end select
|
||||||
|
|
||||||
|
end associate
|
||||||
|
|
||||||
end subroutine homogenization_isostrain_averageStressAndItsTangent
|
end subroutine homogenization_isostrain_averageStressAndItsTangent
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief return array of homogenization results for post file inclusion
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
pure function homogenization_isostrain_postResults(ip,el,avgP,avgF)
|
|
||||||
use prec, only: &
|
|
||||||
pReal
|
|
||||||
use mesh, only: &
|
|
||||||
mesh_element, &
|
|
||||||
mesh_ipCoordinates
|
|
||||||
use material, only: &
|
|
||||||
homogenization_typeInstance, &
|
|
||||||
homogenization_Noutput
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
integer(pInt), intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), dimension(3,3), intent(in) :: &
|
|
||||||
avgP, & !< average stress at material point
|
|
||||||
avgF !< average deformation gradient at material point
|
|
||||||
real(pReal), dimension(homogenization_isostrain_sizePostResults &
|
|
||||||
(homogenization_typeInstance(mesh_element(3,el)))) :: &
|
|
||||||
homogenization_isostrain_postResults
|
|
||||||
|
|
||||||
integer(pInt) :: &
|
|
||||||
homID, &
|
|
||||||
o, c
|
|
||||||
|
|
||||||
c = 0_pInt
|
|
||||||
homID = homogenization_typeInstance(mesh_element(3,el))
|
|
||||||
homogenization_isostrain_postResults = 0.0_pReal
|
|
||||||
|
|
||||||
do o = 1_pInt,homogenization_Noutput(mesh_element(3,el))
|
|
||||||
select case(homogenization_isostrain_outputID(o,homID))
|
|
||||||
case (nconstituents_ID)
|
|
||||||
homogenization_isostrain_postResults(c+1_pInt) = real(homogenization_isostrain_Ngrains(homID),pReal)
|
|
||||||
c = c + 1_pInt
|
|
||||||
case (avgdefgrad_ID)
|
|
||||||
homogenization_isostrain_postResults(c+1_pInt:c+9_pInt) = reshape(transpose(avgF),[9])
|
|
||||||
c = c + 9_pInt
|
|
||||||
case (avgfirstpiola_ID)
|
|
||||||
homogenization_isostrain_postResults(c+1_pInt:c+9_pInt) = reshape(transpose(avgP),[9])
|
|
||||||
c = c + 9_pInt
|
|
||||||
case (ipcoords_ID)
|
|
||||||
homogenization_isostrain_postResults(c+1_pInt:c+3_pInt) = mesh_ipCoordinates(1:3,ip,el) ! current ip coordinates
|
|
||||||
c = c + 3_pInt
|
|
||||||
end select
|
|
||||||
enddo
|
|
||||||
|
|
||||||
end function homogenization_isostrain_postResults
|
|
||||||
|
|
||||||
end module homogenization_isostrain
|
end module homogenization_isostrain
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @brief dummy homogenization homogenization scheme
|
!> @brief dummy homogenization homogenization scheme for 1 constituent per material point
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module homogenization_none
|
module homogenization_none
|
||||||
|
|
||||||
|
@ -24,35 +24,46 @@ subroutine homogenization_none_init()
|
||||||
compiler_options
|
compiler_options
|
||||||
#endif
|
#endif
|
||||||
use prec, only: &
|
use prec, only: &
|
||||||
pReal, &
|
pInt
|
||||||
pInt
|
use debug, only: &
|
||||||
|
debug_HOMOGENIZATION, &
|
||||||
|
debug_level, &
|
||||||
|
debug_levelBasic
|
||||||
use IO, only: &
|
use IO, only: &
|
||||||
IO_timeStamp
|
IO_timeStamp
|
||||||
use material
|
|
||||||
use config
|
use material, only: &
|
||||||
|
homogenization_type, &
|
||||||
|
material_homog, &
|
||||||
|
homogState, &
|
||||||
|
HOMOGENIZATION_NONE_LABEL, &
|
||||||
|
HOMOGENIZATION_NONE_ID
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
integer(pInt) :: &
|
integer(pInt) :: &
|
||||||
homog, &
|
Ninstance, &
|
||||||
|
h, &
|
||||||
NofMyHomog
|
NofMyHomog
|
||||||
|
|
||||||
write(6,'(/,a)') ' <<<+- homogenization_'//HOMOGENIZATION_NONE_label//' init -+>>>'
|
write(6,'(/,a)') ' <<<+- homogenization_'//HOMOGENIZATION_NONE_label//' init -+>>>'
|
||||||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||||
#include "compilation_info.f90"
|
#include "compilation_info.f90"
|
||||||
|
|
||||||
initializeInstances: do homog = 1_pInt, material_Nhomogenization
|
Ninstance = int(count(homogenization_type == HOMOGENIZATION_NONE_ID),pInt)
|
||||||
|
if (iand(debug_level(debug_HOMOGENIZATION),debug_levelBasic) /= 0_pInt) &
|
||||||
|
write(6,'(a16,1x,i5,/)') '# instances:',Ninstance
|
||||||
|
|
||||||
|
do h = 1_pInt, size(homogenization_type)
|
||||||
|
if (homogenization_type(h) /= HOMOGENIZATION_NONE_ID) cycle
|
||||||
|
|
||||||
myhomog: if (homogenization_type(homog) == HOMOGENIZATION_none_ID) then
|
NofMyHomog = count(material_homog == h)
|
||||||
NofMyHomog = count(material_homog == homog)
|
homogState(h)%sizeState = 0_pInt
|
||||||
homogState(homog)%sizeState = 0_pInt
|
homogState(h)%sizePostResults = 0_pInt
|
||||||
homogState(homog)%sizePostResults = 0_pInt
|
allocate(homogState(h)%state0 (0_pInt,NofMyHomog))
|
||||||
allocate(homogState(homog)%state0 (0_pInt,NofMyHomog), source=0.0_pReal)
|
allocate(homogState(h)%subState0(0_pInt,NofMyHomog))
|
||||||
allocate(homogState(homog)%subState0(0_pInt,NofMyHomog), source=0.0_pReal)
|
allocate(homogState(h)%state (0_pInt,NofMyHomog))
|
||||||
allocate(homogState(homog)%state (0_pInt,NofMyHomog), source=0.0_pReal)
|
|
||||||
|
|
||||||
endif myhomog
|
|
||||||
enddo initializeInstances
|
|
||||||
|
|
||||||
|
enddo
|
||||||
|
|
||||||
end subroutine homogenization_none_init
|
end subroutine homogenization_none_init
|
||||||
|
|
||||||
|
|
|
@ -327,19 +327,19 @@ subroutine material_init()
|
||||||
#include "compilation_info.f90"
|
#include "compilation_info.f90"
|
||||||
|
|
||||||
call material_parsePhase()
|
call material_parsePhase()
|
||||||
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Phase parsed'; flush(6)
|
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Phase parsed'; flush(6)
|
||||||
|
|
||||||
call material_parseMicrostructure()
|
call material_parseMicrostructure()
|
||||||
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Microstructure parsed'; flush(6)
|
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Microstructure parsed'; flush(6)
|
||||||
|
|
||||||
call material_parseCrystallite()
|
call material_parseCrystallite()
|
||||||
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Crystallite parsed'; flush(6)
|
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Crystallite parsed'; flush(6)
|
||||||
|
|
||||||
call material_parseHomogenization()
|
call material_parseHomogenization()
|
||||||
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Homogenization parsed'; flush(6)
|
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Homogenization parsed'; flush(6)
|
||||||
|
|
||||||
call material_parseTexture()
|
call material_parseTexture()
|
||||||
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Texture parsed'; flush(6)
|
if (iand(myDebug,debug_levelBasic) /= 0_pInt) write(6,'(a)') ' Texture parsed'; flush(6)
|
||||||
|
|
||||||
allocate(plasticState (size(config_phase)))
|
allocate(plasticState (size(config_phase)))
|
||||||
allocate(sourceState (size(config_phase)))
|
allocate(sourceState (size(config_phase)))
|
||||||
|
|
|
@ -1998,6 +1998,7 @@ end function math_symmetricEulers
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief eigenvalues and eigenvectors of symmetric matrix m
|
!> @brief eigenvalues and eigenvectors of symmetric matrix m
|
||||||
|
! ToDo: has wrong oder of arguments
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine math_eigenValuesVectorsSym(m,values,vectors,error)
|
subroutine math_eigenValuesVectorsSym(m,values,vectors,error)
|
||||||
|
|
||||||
|
@ -2021,9 +2022,10 @@ end subroutine math_eigenValuesVectorsSym
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief eigenvalues and eigenvectors of symmetric 33 matrix m using an analytical expression
|
!> @brief eigenvalues and eigenvectors of symmetric 33 matrix m using an analytical expression
|
||||||
!> and the general LAPACK powered version for arbritrary sized matrices as fallback
|
!> and the general LAPACK powered version for arbritrary sized matrices as fallback
|
||||||
!> @author Joachim Kopp, Max–Planck–Institut für Kernphysik, Heidelberg (Copyright (C) 2006)
|
!> @author Joachim Kopp, Max-Planck-Institut für Kernphysik, Heidelberg (Copyright (C) 2006)
|
||||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||||
!> @details See http://arxiv.org/abs/physics/0610206 (DSYEVH3)
|
!> @details See http://arxiv.org/abs/physics/0610206 (DSYEVH3)
|
||||||
|
! ToDo: has wrong oder of arguments
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine math_eigenValuesVectorsSym33(m,values,vectors)
|
subroutine math_eigenValuesVectorsSym33(m,values,vectors)
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ module plastic_dislotwin
|
||||||
real(pReal) :: &
|
real(pReal) :: &
|
||||||
mu, &
|
mu, &
|
||||||
nu, &
|
nu, &
|
||||||
CAtomicVolume, & !< atomic volume in Bugers vector unit
|
|
||||||
D0, & !< prefactor for self-diffusion coefficient
|
D0, & !< prefactor for self-diffusion coefficient
|
||||||
Qsd, & !< activation energy for dislocation climb
|
Qsd, & !< activation energy for dislocation climb
|
||||||
GrainSize, & !<grain size
|
GrainSize, & !<grain size
|
||||||
|
@ -86,7 +85,8 @@ module plastic_dislotwin
|
||||||
Ndot0_trans, & !< trans nucleation rate [1/m³s] for each trans system
|
Ndot0_trans, & !< trans nucleation rate [1/m³s] for each trans system
|
||||||
twinsize, & !< twin thickness [m] for each twin system
|
twinsize, & !< twin thickness [m] for each twin system
|
||||||
CLambdaSlip, & !< Adj. parameter for distance between 2 forest dislocations for each slip system
|
CLambdaSlip, & !< Adj. parameter for distance between 2 forest dislocations for each slip system
|
||||||
lamellarsize, & !< martensite lamellar thickness [m] for each trans system and instance
|
atomicVolume, &
|
||||||
|
lamellarsize, & !< martensite lamellar thickness [m] for each trans system and instance
|
||||||
p, & !< p-exponent in glide velocity
|
p, & !< p-exponent in glide velocity
|
||||||
q, & !< q-exponent in glide velocity
|
q, & !< q-exponent in glide velocity
|
||||||
r, & !< r-exponent in twin nucleation rate
|
r, & !< r-exponent in twin nucleation rate
|
||||||
|
@ -150,8 +150,8 @@ module plastic_dislotwin
|
||||||
threshold_stress_trans, &
|
threshold_stress_trans, &
|
||||||
twinVolume, &
|
twinVolume, &
|
||||||
martensiteVolume, &
|
martensiteVolume, &
|
||||||
tau_r_twin, & !< stress to bring partial close together for each twin system and instance
|
tau_r_twin, & !< stress to bring partials close together (twin)
|
||||||
tau_r_trans !< stress to bring partial close together for each trans system and instance
|
tau_r_trans !< stress to bring partials close together (trans)
|
||||||
end type tDislotwinMicrostructure
|
end type tDislotwinMicrostructure
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -269,6 +269,10 @@ subroutine plastic_dislotwin_init
|
||||||
dst => microstructure(phase_plasticityInstance(p)), &
|
dst => microstructure(phase_plasticityInstance(p)), &
|
||||||
config => config_phase(p))
|
config => config_phase(p))
|
||||||
|
|
||||||
|
prm%aTolRho = config%getFloat('atol_rho', defaultVal=0.0_pReal)
|
||||||
|
prm%aTolTwinFrac = config%getFloat('atol_twinfrac', defaultVal=0.0_pReal)
|
||||||
|
prm%aTolTransFrac = config%getFloat('atol_transfrac', defaultVal=0.0_pReal)
|
||||||
|
|
||||||
! This data is read in already in lattice
|
! This data is read in already in lattice
|
||||||
prm%mu = lattice_mu(p)
|
prm%mu = lattice_mu(p)
|
||||||
prm%nu = lattice_nu(p)
|
prm%nu = lattice_nu(p)
|
||||||
|
@ -307,6 +311,9 @@ subroutine plastic_dislotwin_init
|
||||||
defaultVal=[(0.0_pReal, i=1,size(prm%Nslip))]) ! Deprecated
|
defaultVal=[(0.0_pReal, i=1,size(prm%Nslip))]) ! Deprecated
|
||||||
|
|
||||||
prm%CEdgeDipMinDistance = config%getFloat('cedgedipmindistance')
|
prm%CEdgeDipMinDistance = config%getFloat('cedgedipmindistance')
|
||||||
|
prm%D0 = config%getFloat('d0')
|
||||||
|
prm%Qsd = config%getFloat('qsd')
|
||||||
|
prm%atomicVolume = config%getFloat('catomicvolume') * prm%burgers_slip**3.0_pReal
|
||||||
|
|
||||||
! expand: family => system
|
! expand: family => system
|
||||||
prm%rho0 = math_expand(prm%rho0, prm%Nslip)
|
prm%rho0 = math_expand(prm%rho0, prm%Nslip)
|
||||||
|
@ -318,19 +325,22 @@ subroutine plastic_dislotwin_init
|
||||||
prm%p = math_expand(prm%p, prm%Nslip)
|
prm%p = math_expand(prm%p, prm%Nslip)
|
||||||
prm%q = math_expand(prm%q, prm%Nslip)
|
prm%q = math_expand(prm%q, prm%Nslip)
|
||||||
prm%B = math_expand(prm%B, prm%Nslip)
|
prm%B = math_expand(prm%B, prm%Nslip)
|
||||||
prm%tau_peierls = math_expand(prm%tau_peierls, prm%Nslip)
|
prm%tau_peierls = math_expand(prm%tau_peierls, prm%Nslip)
|
||||||
|
prm%atomicVolume = math_expand(prm%atomicVolume,prm%Nslip)
|
||||||
|
|
||||||
! sanity checks
|
! sanity checks
|
||||||
if (any(prm%rho0 < 0.0_pReal)) extmsg = trim(extmsg)//'rho0 '
|
if ( prm%D0 <= 0.0_pReal) extmsg = trim(extmsg)//' D0'
|
||||||
if (any(prm%rhoDip0 < 0.0_pReal)) extmsg = trim(extmsg)//'rhoDip0 '
|
if ( prm%Qsd <= 0.0_pReal) extmsg = trim(extmsg)//' Qsd'
|
||||||
if (any(prm%v0 < 0.0_pReal)) extmsg = trim(extmsg)//'v0 '
|
if (any(prm%rho0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho0'
|
||||||
if (any(prm%burgers_slip <= 0.0_pReal)) extmsg = trim(extmsg)//'burgers_slip '
|
if (any(prm%rhoDip0 < 0.0_pReal)) extmsg = trim(extmsg)//' rhoDip0'
|
||||||
if (any(prm%Qedge <= 0.0_pReal)) extmsg = trim(extmsg)//'Qedge '
|
if (any(prm%v0 < 0.0_pReal)) extmsg = trim(extmsg)//' v0'
|
||||||
if (any(prm%CLambdaSlip <= 0.0_pReal)) extmsg = trim(extmsg)//'CLambdaSlip '
|
if (any(prm%burgers_slip <= 0.0_pReal)) extmsg = trim(extmsg)//' burgers_slip'
|
||||||
if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//'B '
|
if (any(prm%Qedge <= 0.0_pReal)) extmsg = trim(extmsg)//' Qedge'
|
||||||
if (any(prm%tau_peierls < 0.0_pReal)) extmsg = trim(extmsg)//'tau_peierls '
|
if (any(prm%CLambdaSlip <= 0.0_pReal)) extmsg = trim(extmsg)//' CLambdaSlip'
|
||||||
if (any(prm%p<=0.0_pReal .or. prm%p>1.0_pReal)) extmsg = trim(extmsg)//'p '
|
if (any(prm%B < 0.0_pReal)) extmsg = trim(extmsg)//' B'
|
||||||
if (any(prm%q< 1.0_pReal .or. prm%q>2.0_pReal)) extmsg = trim(extmsg)//'q '
|
if (any(prm%tau_peierls < 0.0_pReal)) extmsg = trim(extmsg)//' tau_peierls'
|
||||||
|
if (any(prm%p<=0.0_pReal .or. prm%p>1.0_pReal)) extmsg = trim(extmsg)//' p'
|
||||||
|
if (any(prm%q< 1.0_pReal .or. prm%q>2.0_pReal)) extmsg = trim(extmsg)//' q'
|
||||||
|
|
||||||
else slipActive
|
else slipActive
|
||||||
allocate(prm%burgers_slip(0))
|
allocate(prm%burgers_slip(0))
|
||||||
|
@ -443,67 +453,48 @@ subroutine plastic_dislotwin_init
|
||||||
config%getFloats('interaction_sliptrans'), &
|
config%getFloats('interaction_sliptrans'), &
|
||||||
config%getString('lattice_structure'))
|
config%getString('lattice_structure'))
|
||||||
if (prm%fccTwinTransNucleation .and. prm%totalNtrans > 12_pInt) write(6,*) 'mist' ! ToDo: implement better test. The model will fail also if ntrans is [6,6]
|
if (prm%fccTwinTransNucleation .and. prm%totalNtrans > 12_pInt) write(6,*) 'mist' ! ToDo: implement better test. The model will fail also if ntrans is [6,6]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
prm%aTolRho = config%getFloat('atol_rho', defaultVal=0.0_pReal)
|
! shearband related parameters
|
||||||
prm%aTolTwinFrac = config%getFloat('atol_twinfrac', defaultVal=0.0_pReal)
|
prm%sbVelocity = config%getFloat('shearbandvelocity',defaultVal=0.0_pReal)
|
||||||
prm%aTolTransFrac = config%getFloat('atol_transfrac', defaultVal=0.0_pReal)
|
|
||||||
|
|
||||||
prm%CAtomicVolume = config%getFloat('catomicvolume')
|
|
||||||
prm%GrainSize = config%getFloat('grainsize')
|
|
||||||
|
|
||||||
|
|
||||||
prm%D0 = config%getFloat('d0')
|
|
||||||
prm%Qsd = config%getFloat('qsd')
|
|
||||||
prm%SolidSolutionStrength = config%getFloat('solidsolutionstrength') ! Deprecated
|
|
||||||
if (config%keyExists('dipoleformationfactor')) call IO_error(1,ext_msg='use /nodipoleformation/')
|
|
||||||
prm%dipoleformation = .not. config%keyExists('/nodipoleformation/')
|
|
||||||
prm%sbVelocity = config%getFloat('shearbandvelocity',defaultVal=0.0_pReal)
|
|
||||||
if (prm%sbVelocity > 0.0_pReal) then
|
if (prm%sbVelocity > 0.0_pReal) then
|
||||||
prm%sbResistance = config%getFloat('shearbandresistance')
|
prm%sbResistance = config%getFloat('shearbandresistance')
|
||||||
prm%sbQedge = config%getFloat('qedgepersbsystem')
|
prm%sbQedge = config%getFloat('qedgepersbsystem')
|
||||||
prm%pShearBand = config%getFloat('p_shearband')
|
prm%pShearBand = config%getFloat('p_shearband')
|
||||||
prm%qShearBand = config%getFloat('q_shearband')
|
prm%qShearBand = config%getFloat('q_shearband')
|
||||||
|
|
||||||
|
! sanity checks
|
||||||
|
if (prm%sbResistance < 0.0_pReal) extmsg = trim(extmsg)//' shearbandresistance'
|
||||||
|
if (prm%sbQedge < 0.0_pReal) extmsg = trim(extmsg)//' qedgepersbsystem'
|
||||||
|
if (prm%pShearBand <= 0.0_pReal) extmsg = trim(extmsg)//' p_shearband'
|
||||||
|
if (prm%qShearBand <= 0.0_pReal) extmsg = trim(extmsg)//' q_shearband'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
prm%GrainSize = config%getFloat('grainsize')
|
||||||
|
prm%SolidSolutionStrength = config%getFloat('solidsolutionstrength') ! Deprecated
|
||||||
|
|
||||||
|
if (config%keyExists('dipoleformationfactor')) call IO_error(1,ext_msg='use /nodipoleformation/')
|
||||||
|
prm%dipoleformation = .not. config%keyExists('/nodipoleformation/')
|
||||||
|
|
||||||
|
|
||||||
!if (Ndot0PerTwinFamily(f,p) < 0.0_pReal) &
|
!if (Ndot0PerTwinFamily(f,p) < 0.0_pReal) &
|
||||||
! call IO_error(211_pInt,el=p,ext_msg='ndot0_twin ('//PLASTICITY_DISLOTWIN_label//')')
|
! call IO_error(211_pInt,el=p,ext_msg='ndot0_twin ('//PLASTICITY_DISLOTWIN_label//')')
|
||||||
|
|
||||||
if (prm%CAtomicVolume <= 0.0_pReal) &
|
if (any(prm%atomicVolume <= 0.0_pReal)) &
|
||||||
call IO_error(211_pInt,el=p,ext_msg='cAtomicVolume ('//PLASTICITY_DISLOTWIN_label//')')
|
call IO_error(211_pInt,el=p,ext_msg='cAtomicVolume ('//PLASTICITY_DISLOTWIN_label//')')
|
||||||
if (prm%D0 <= 0.0_pReal) &
|
|
||||||
call IO_error(211_pInt,el=p,ext_msg='D0 ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
if (prm%Qsd <= 0.0_pReal) &
|
|
||||||
call IO_error(211_pInt,el=p,ext_msg='Qsd ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
if (prm%totalNtwin > 0_pInt) then
|
if (prm%totalNtwin > 0_pInt) then
|
||||||
if (dEq0(prm%SFE_0K) .and. &
|
|
||||||
dEq0(prm%dSFE_dT) .and. &
|
|
||||||
lattice_structure(p) == LATTICE_fcc_ID) &
|
|
||||||
call IO_error(211_pInt,el=p,ext_msg='SFE0K ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
if (prm%aTolRho <= 0.0_pReal) &
|
if (prm%aTolRho <= 0.0_pReal) &
|
||||||
call IO_error(211_pInt,el=p,ext_msg='aTolRho ('//PLASTICITY_DISLOTWIN_label//')')
|
call IO_error(211_pInt,el=p,ext_msg='aTolRho ('//PLASTICITY_DISLOTWIN_label//')')
|
||||||
if (prm%aTolTwinFrac <= 0.0_pReal) &
|
if (prm%aTolTwinFrac <= 0.0_pReal) &
|
||||||
call IO_error(211_pInt,el=p,ext_msg='aTolTwinFrac ('//PLASTICITY_DISLOTWIN_label//')')
|
call IO_error(211_pInt,el=p,ext_msg='aTolTwinFrac ('//PLASTICITY_DISLOTWIN_label//')')
|
||||||
endif
|
endif
|
||||||
if (prm%totalNtrans > 0_pInt) then
|
if (prm%totalNtrans > 0_pInt) then
|
||||||
if (dEq0(prm%SFE_0K) .and. &
|
|
||||||
dEq0(prm%dSFE_dT) .and. &
|
|
||||||
lattice_structure(p) == LATTICE_fcc_ID) &
|
|
||||||
call IO_error(211_pInt,el=p,ext_msg='SFE0K ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
if (prm%aTolTransFrac <= 0.0_pReal) &
|
if (prm%aTolTransFrac <= 0.0_pReal) &
|
||||||
call IO_error(211_pInt,el=p,ext_msg='aTolTransFrac ('//PLASTICITY_DISLOTWIN_label//')')
|
call IO_error(211_pInt,el=p,ext_msg='aTolTransFrac ('//PLASTICITY_DISLOTWIN_label//')')
|
||||||
endif
|
endif
|
||||||
!if (prm%sbResistance < 0.0_pReal) &
|
|
||||||
! call IO_error(211_pInt,el=p,ext_msg='sbResistance ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
!if (prm%sbVelocity < 0.0_pReal) &
|
|
||||||
! call IO_error(211_pInt,el=p,ext_msg='sbVelocity ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
!if (prm%sbVelocity > 0.0_pReal .and. &
|
|
||||||
! prm%pShearBand <= 0.0_pReal) &
|
|
||||||
! call IO_error(211_pInt,el=p,ext_msg='pShearBand ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
if (prm%sbVelocity > 0.0_pReal .and. &
|
|
||||||
prm%qShearBand <= 0.0_pReal) &
|
|
||||||
call IO_error(211_pInt,el=p,ext_msg='qShearBand ('//PLASTICITY_DISLOTWIN_label//')')
|
|
||||||
|
|
||||||
outputs = config%getStrings('(output)', defaultVal=emptyStringArray)
|
outputs = config%getStrings('(output)', defaultVal=emptyStringArray)
|
||||||
allocate(prm%outputID(0))
|
allocate(prm%outputID(0))
|
||||||
|
@ -598,13 +589,13 @@ subroutine plastic_dislotwin_init
|
||||||
plasticState(p)%accumulatedSlip => plasticState(p)%state(startIndex:endIndex,:)
|
plasticState(p)%accumulatedSlip => plasticState(p)%state(startIndex:endIndex,:)
|
||||||
|
|
||||||
startIndex = endIndex + 1_pInt
|
startIndex = endIndex + 1_pInt
|
||||||
endIndex=endIndex+prm%totalNtwin
|
endIndex = endIndex + prm%totalNtwin
|
||||||
stt%twinFraction=>plasticState(p)%state(startIndex:endIndex,:)
|
stt%twinFraction=>plasticState(p)%state(startIndex:endIndex,:)
|
||||||
dot%twinFraction=>plasticState(p)%dotState(startIndex:endIndex,:)
|
dot%twinFraction=>plasticState(p)%dotState(startIndex:endIndex,:)
|
||||||
plasticState(p)%aTolState(startIndex:endIndex) = prm%aTolTwinFrac
|
plasticState(p)%aTolState(startIndex:endIndex) = prm%aTolTwinFrac
|
||||||
|
|
||||||
startIndex = endIndex + 1_pInt
|
startIndex = endIndex + 1_pInt
|
||||||
endIndex=endIndex+prm%totalNtrans
|
endIndex = endIndex + prm%totalNtrans
|
||||||
stt%strainTransFraction=>plasticState(p)%state(startIndex:endIndex,:)
|
stt%strainTransFraction=>plasticState(p)%state(startIndex:endIndex,:)
|
||||||
dot%strainTransFraction=>plasticState(p)%dotState(startIndex:endIndex,:)
|
dot%strainTransFraction=>plasticState(p)%dotState(startIndex:endIndex,:)
|
||||||
plasticState(p)%aTolState(startIndex:endIndex) = prm%aTolTransFrac
|
plasticState(p)%aTolState(startIndex:endIndex) = prm%aTolTransFrac
|
||||||
|
@ -618,13 +609,13 @@ subroutine plastic_dislotwin_init
|
||||||
allocate(dst%invLambdaTwin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
allocate(dst%invLambdaTwin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%mfp_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
allocate(dst%mfp_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%threshold_stress_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
allocate(dst%threshold_stress_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%tau_r_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal) !* equilibrium separation of partial dislocations (twin)
|
allocate(dst%tau_r_twin (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%twinVolume (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
allocate(dst%twinVolume (prm%totalNtwin, NipcMyPhase),source=0.0_pReal)
|
||||||
|
|
||||||
allocate(dst%invLambdaTrans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
allocate(dst%invLambdaTrans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%mfp_trans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
allocate(dst%mfp_trans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%threshold_stress_trans(prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
allocate(dst%threshold_stress_trans(prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%tau_r_trans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal) !* equilibrium separation of partial dislocations (trans)
|
allocate(dst%tau_r_trans (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
||||||
allocate(dst%martensiteVolume (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
allocate(dst%martensiteVolume (prm%totalNtrans,NipcMyPhase),source=0.0_pReal)
|
||||||
|
|
||||||
|
|
||||||
|
@ -814,8 +805,9 @@ subroutine plastic_dislotwin_dotState(Mp,Temperature,instance,of)
|
||||||
tol_math_check, &
|
tol_math_check, &
|
||||||
dEq0
|
dEq0
|
||||||
use math, only: &
|
use math, only: &
|
||||||
|
math_clip, &
|
||||||
math_mul33xx33, &
|
math_mul33xx33, &
|
||||||
pi
|
PI
|
||||||
use material, only: &
|
use material, only: &
|
||||||
plasticState
|
plasticState
|
||||||
|
|
||||||
|
@ -830,11 +822,13 @@ subroutine plastic_dislotwin_dotState(Mp,Temperature,instance,of)
|
||||||
|
|
||||||
integer(pInt) :: i
|
integer(pInt) :: i
|
||||||
real(pReal) :: f_unrotated,&
|
real(pReal) :: f_unrotated,&
|
||||||
EdgeDipMinDistance,AtomicVolume,VacancyDiffusion,&
|
VacancyDiffusion,&
|
||||||
EdgeDipDistance, ClimbVelocity,DotRhoEdgeDipClimb,DotRhoEdgeDipAnnihilation, &
|
EdgeDipDistance, ClimbVelocity,DotRhoEdgeDipClimb,DotRhoEdgeDipAnnihilation, &
|
||||||
DotRhoDipFormation,DotRhoMultiplication,DotRhoEdgeEdgeAnnihilation, &
|
DotRhoDipFormation,DotRhoEdgeEdgeAnnihilation, &
|
||||||
tau
|
tau
|
||||||
real(pReal), dimension(plasticState(instance)%Nslip) :: &
|
real(pReal), dimension(plasticState(instance)%Nslip) :: &
|
||||||
|
EdgeDipMinDistance, &
|
||||||
|
DotRhoMultiplication, &
|
||||||
gdot_slip
|
gdot_slip
|
||||||
real(pReal), dimension(plasticState(instance)%Ntwin) :: &
|
real(pReal), dimension(plasticState(instance)%Ntwin) :: &
|
||||||
gdot_twin
|
gdot_twin
|
||||||
|
@ -847,55 +841,51 @@ subroutine plastic_dislotwin_dotState(Mp,Temperature,instance,of)
|
||||||
f_unrotated = 1.0_pReal &
|
f_unrotated = 1.0_pReal &
|
||||||
- sum(stt%twinFraction(1_pInt:prm%totalNtwin,of)) &
|
- sum(stt%twinFraction(1_pInt:prm%totalNtwin,of)) &
|
||||||
- sum(stt%strainTransFraction(1_pInt:prm%totalNtrans,of))
|
- sum(stt%strainTransFraction(1_pInt:prm%totalNtrans,of))
|
||||||
|
VacancyDiffusion = prm%D0*exp(-prm%Qsd/(kB*Temperature))
|
||||||
|
|
||||||
call kinetics_slip(Mp,temperature,instance,of,gdot_slip)
|
call kinetics_slip(Mp,temperature,instance,of,gdot_slip)
|
||||||
|
dot%accshear_slip(:,of) = abs(gdot_slip)
|
||||||
|
|
||||||
|
DotRhoMultiplication = abs(gdot_slip)/(prm%burgers_slip*dst%mfp_slip(:,of))
|
||||||
|
EdgeDipMinDistance = prm%CEdgeDipMinDistance*prm%burgers_slip
|
||||||
|
|
||||||
slipState: do i = 1_pInt, prm%totalNslip
|
slipState: do i = 1_pInt, prm%totalNslip
|
||||||
tau = math_mul33xx33(Mp,prm%Schmid_slip(1:3,1:3,i))
|
tau = math_mul33xx33(Mp,prm%Schmid_slip(1:3,1:3,i))
|
||||||
|
|
||||||
DotRhoMultiplication = abs(gdot_slip(i))/(prm%burgers_slip(i)*dst%mfp_slip(i,of))
|
significantSlipStress: if (dEq0(tau)) then
|
||||||
EdgeDipMinDistance = prm%CEdgeDipMinDistance*prm%burgers_slip(i)
|
|
||||||
|
|
||||||
significantSlipStress2: if (dEq0(tau)) then
|
|
||||||
DotRhoDipFormation = 0.0_pReal
|
DotRhoDipFormation = 0.0_pReal
|
||||||
else significantSlipStress2
|
DotRhoEdgeDipClimb = 0.0_pReal
|
||||||
EdgeDipDistance = (3.0_pReal*prm%mu*prm%burgers_slip(i))/(16.0_pReal*PI*abs(tau))
|
else significantSlipStress
|
||||||
if (EdgeDipDistance>dst%mfp_slip(i,of)) EdgeDipDistance = dst%mfp_slip(i,of)
|
EdgeDipDistance = 3.0_pReal*prm%mu*prm%burgers_slip(i)/(16.0_pReal*PI*abs(tau))
|
||||||
if (EdgeDipDistance<EdgeDipMinDistance) EdgeDipDistance = EdgeDipMinDistance
|
EdgeDipDistance = math_clip(EdgeDipDistance, right = dst%mfp_slip(i,of))
|
||||||
|
EdgeDipDistance = math_clip(EdgeDipDistance, left = EdgeDipMinDistance(i))
|
||||||
|
|
||||||
if (prm%dipoleFormation) then
|
if (prm%dipoleFormation) then
|
||||||
DotRhoDipFormation = ((2.0_pReal*(EdgeDipDistance-EdgeDipMinDistance))/prm%burgers_slip(i)) &
|
DotRhoDipFormation = 2.0_pReal*(EdgeDipDistance-EdgeDipMinDistance(i))/prm%burgers_slip(i) &
|
||||||
* stt%rhoEdge(i,of)*abs(gdot_slip(i))
|
* stt%rhoEdge(i,of)*abs(gdot_slip(i))
|
||||||
else
|
else
|
||||||
DotRhoDipFormation = 0.0_pReal
|
DotRhoDipFormation = 0.0_pReal
|
||||||
endif
|
endif
|
||||||
endif significantSlipStress2
|
|
||||||
|
|
||||||
!* Spontaneous annihilation of 2 single edge dislocations
|
|
||||||
DotRhoEdgeEdgeAnnihilation = 2.0_pReal*EdgeDipMinDistance/prm%burgers_slip(i) &
|
|
||||||
* stt%rhoEdge(i,of)*abs(gdot_slip(i))
|
|
||||||
!* Spontaneous annihilation of a single edge dislocation with a dipole constituent
|
|
||||||
DotRhoEdgeDipAnnihilation = 2.0_pReal*EdgeDipMinDistance/prm%burgers_slip(i) &
|
|
||||||
* stt%rhoEdgeDip(i,of)*abs(gdot_slip(i))
|
|
||||||
|
|
||||||
!* Dislocation dipole climb
|
|
||||||
AtomicVolume = prm%CAtomicVolume*prm%burgers_slip(i)**(3.0_pReal) ! no need to calculate this over and over again
|
|
||||||
VacancyDiffusion = prm%D0*exp(-prm%Qsd/(kB*Temperature))
|
|
||||||
|
|
||||||
if (dEq0(tau)) then
|
if (dEq0(EdgeDipDistance-EdgeDipMinDistance(i))) then
|
||||||
DotRhoEdgeDipClimb = 0.0_pReal
|
|
||||||
else
|
|
||||||
if (dEq0(EdgeDipDistance-EdgeDipMinDistance)) then
|
|
||||||
DotRhoEdgeDipClimb = 0.0_pReal
|
DotRhoEdgeDipClimb = 0.0_pReal
|
||||||
else
|
else
|
||||||
ClimbVelocity = 3.0_pReal*prm%mu*VacancyDiffusion*AtomicVolume/ &
|
ClimbVelocity = 3.0_pReal*prm%mu*VacancyDiffusion*prm%atomicVolume(i) &
|
||||||
(2.0_pReal*pi*kB*Temperature*(EdgeDipDistance+EdgeDipMinDistance))
|
/ (2.0_pReal*PI*kB*Temperature*(EdgeDipDistance+EdgeDipMinDistance(i)))
|
||||||
DotRhoEdgeDipClimb = 4.0_pReal*ClimbVelocity*stt%rhoEdgeDip(i,of)/ &
|
DotRhoEdgeDipClimb = 4.0_pReal*ClimbVelocity*stt%rhoEdgeDip(i,of) &
|
||||||
(EdgeDipDistance-EdgeDipMinDistance)
|
/ (EdgeDipDistance-EdgeDipMinDistance(i))
|
||||||
endif
|
endif
|
||||||
endif
|
endif significantSlipStress
|
||||||
dot%rhoEdge(i,of) = DotRhoMultiplication-DotRhoDipFormation-DotRhoEdgeEdgeAnnihilation
|
|
||||||
|
!* Spontaneous annihilation of 2 single edge dislocations
|
||||||
|
DotRhoEdgeEdgeAnnihilation = 2.0_pReal*EdgeDipMinDistance(i)/prm%burgers_slip(i) &
|
||||||
|
* stt%rhoEdge(i,of)*abs(gdot_slip(i))
|
||||||
|
!* Spontaneous annihilation of a single edge dislocation with a dipole constituent
|
||||||
|
DotRhoEdgeDipAnnihilation = 2.0_pReal*EdgeDipMinDistance(i)/prm%burgers_slip(i) &
|
||||||
|
* stt%rhoEdgeDip(i,of)*abs(gdot_slip(i))
|
||||||
|
|
||||||
|
dot%rhoEdge(i,of) = DotRhoMultiplication(i)-DotRhoDipFormation-DotRhoEdgeEdgeAnnihilation
|
||||||
dot%rhoEdgeDip(i,of) = DotRhoDipFormation-DotRhoEdgeDipAnnihilation-DotRhoEdgeDipClimb
|
dot%rhoEdgeDip(i,of) = DotRhoDipFormation-DotRhoEdgeDipAnnihilation-DotRhoEdgeDipClimb
|
||||||
dot%accshear_slip(i,of) = abs(gdot_slip(i))
|
|
||||||
enddo slipState
|
enddo slipState
|
||||||
|
|
||||||
call kinetics_twin(Mp,temperature,gdot_slip,instance,of,gdot_twin)
|
call kinetics_twin(Mp,temperature,gdot_slip,instance,of,gdot_twin)
|
||||||
|
@ -918,10 +908,10 @@ subroutine plastic_dislotwin_dependentState(temperature,instance,of)
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
integer(pInt), intent(in) :: &
|
integer(pInt), intent(in) :: &
|
||||||
instance, & !< component-ID of integration point
|
instance, &
|
||||||
of
|
of
|
||||||
real(pReal), intent(in) :: &
|
real(pReal), intent(in) :: &
|
||||||
temperature !< temperature at IP
|
temperature
|
||||||
|
|
||||||
integer(pInt) :: &
|
integer(pInt) :: &
|
||||||
i
|
i
|
||||||
|
@ -940,7 +930,7 @@ subroutine plastic_dislotwin_dependentState(temperature,instance,of)
|
||||||
sumf_twin = sum(stt%twinFraction(1:prm%totalNtwin,of))
|
sumf_twin = sum(stt%twinFraction(1:prm%totalNtwin,of))
|
||||||
sumf_trans = sum(stt%strainTransFraction(1:prm%totalNtrans,of))
|
sumf_trans = sum(stt%strainTransFraction(1:prm%totalNtrans,of))
|
||||||
|
|
||||||
sfe = prm%SFE_0K + prm%dSFE_dT * Temperature
|
SFE = prm%SFE_0K + prm%dSFE_dT * Temperature
|
||||||
|
|
||||||
!* rescaled volume fraction for topology
|
!* rescaled volume fraction for topology
|
||||||
fOverStacksize = stt%twinFraction(1_pInt:prm%totalNtwin,of)/prm%twinsize !ToDo: this is per system
|
fOverStacksize = stt%twinFraction(1_pInt:prm%totalNtwin,of)/prm%twinsize !ToDo: this is per system
|
||||||
|
@ -999,11 +989,11 @@ subroutine plastic_dislotwin_dependentState(temperature,instance,of)
|
||||||
!* threshold stress for growing twin/martensite
|
!* threshold stress for growing twin/martensite
|
||||||
if(prm%totalNtwin == prm%totalNslip) &
|
if(prm%totalNtwin == prm%totalNslip) &
|
||||||
dst%threshold_stress_twin(:,of) = prm%Cthresholdtwin* &
|
dst%threshold_stress_twin(:,of) = prm%Cthresholdtwin* &
|
||||||
(sfe/(3.0_pReal*prm%burgers_twin)+ 3.0_pReal*prm%burgers_twin*prm%mu/ &
|
(SFE/(3.0_pReal*prm%burgers_twin)+ 3.0_pReal*prm%burgers_twin*prm%mu/ &
|
||||||
(prm%L0_twin*prm%burgers_slip)) ! slip burgers here correct?
|
(prm%L0_twin*prm%burgers_slip)) ! slip burgers here correct?
|
||||||
if(prm%totalNtrans == prm%totalNslip) &
|
if(prm%totalNtrans == prm%totalNslip) &
|
||||||
dst%threshold_stress_trans(:,of) = prm%Cthresholdtrans* &
|
dst%threshold_stress_trans(:,of) = prm%Cthresholdtrans* &
|
||||||
(sfe/(3.0_pReal*prm%burgers_trans) + 3.0_pReal*prm%burgers_trans*prm%mu/&
|
(SFE/(3.0_pReal*prm%burgers_trans) + 3.0_pReal*prm%burgers_trans*prm%mu/&
|
||||||
(prm%L0_trans*prm%burgers_slip) + prm%transStackHeight*prm%deltaG/ (3.0_pReal*prm%burgers_trans) )
|
(prm%L0_trans*prm%burgers_slip) + prm%transStackHeight*prm%deltaG/ (3.0_pReal*prm%burgers_trans) )
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue