code follows modular structure
This commit is contained in:
parent
830a61a9ff
commit
11d7f034e4
|
@ -152,6 +152,12 @@ module constitutive
|
||||||
integer, intent(in) :: ph
|
integer, intent(in) :: ph
|
||||||
end subroutine mech_results
|
end subroutine mech_results
|
||||||
|
|
||||||
|
module subroutine damage_results(group,ph)
|
||||||
|
character(len=*), intent(in) :: group
|
||||||
|
integer, intent(in) :: ph
|
||||||
|
end subroutine damage_results
|
||||||
|
|
||||||
|
|
||||||
module subroutine mech_restart_read(fileHandle)
|
module subroutine mech_restart_read(fileHandle)
|
||||||
integer(HID_T), intent(in) :: fileHandle
|
integer(HID_T), intent(in) :: fileHandle
|
||||||
end subroutine mech_restart_read
|
end subroutine mech_restart_read
|
||||||
|
@ -314,10 +320,6 @@ end function constitutive_deltaState
|
||||||
C
|
C
|
||||||
end subroutine source_damage_isoBrittle_deltaState
|
end subroutine source_damage_isoBrittle_deltaState
|
||||||
|
|
||||||
module subroutine damage_results
|
|
||||||
end subroutine damage_results
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module subroutine constitutive_plastic_LpAndItsTangents(Lp, dLp_dS, dLp_dFi, &
|
module subroutine constitutive_plastic_LpAndItsTangents(Lp, dLp_dS, dLp_dFi, &
|
||||||
S, Fi, ipc, ip, el)
|
S, Fi, ipc, ip, el)
|
||||||
|
@ -468,7 +470,7 @@ end subroutine constitutive_init
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief checks if a source mechanism is active or not
|
!> @brief checks if a source mechanism is active or not
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module function source_active(source_label,src_length) result(active_source)
|
function source_active(source_label,src_length) result(active_source)
|
||||||
|
|
||||||
character(len=*), intent(in) :: source_label !< name of source mechanism
|
character(len=*), intent(in) :: source_label !< name of source mechanism
|
||||||
integer, intent(in) :: src_length !< max. number of sources in system
|
integer, intent(in) :: src_length !< max. number of sources in system
|
||||||
|
@ -499,8 +501,7 @@ end function source_active
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief checks if a kinematic mechanism is active or not
|
!> @brief checks if a kinematic mechanism is active or not
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function kinematics_active(kinematics_label,kinematics_length) result(active_kinematics)
|
||||||
module function kinematics_active(kinematics_label,kinematics_length) result(active_kinematics)
|
|
||||||
|
|
||||||
character(len=*), intent(in) :: kinematics_label !< name of kinematic mechanism
|
character(len=*), intent(in) :: kinematics_label !< name of kinematic mechanism
|
||||||
integer, intent(in) :: kinematics_length !< max. number of kinematics in system
|
integer, intent(in) :: kinematics_length !< max. number of kinematics in system
|
||||||
|
@ -631,13 +632,10 @@ subroutine constitutive_LiAndItsTangents(Li, dLi_dS, dLi_dFi, &
|
||||||
end subroutine constitutive_LiAndItsTangents
|
end subroutine constitutive_LiAndItsTangents
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief contains the constitutive equation for calculating the rate of change of microstructure
|
!> @brief contains the constitutive equation for calculating the rate of change of microstructure
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
function constitutive_source_collectDotState(S, ipc, ip, el,phase,of) result(broken)
|
function constitutive_damage_collectDotState(S, ipc, ip, el,phase,of) result(broken)
|
||||||
|
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: &
|
||||||
ipc, & !< component-ID of integration point
|
ipc, & !< component-ID of integration point
|
||||||
|
@ -667,6 +665,39 @@ function constitutive_source_collectDotState(S, ipc, ip, el,phase,of) result(bro
|
||||||
case (SOURCE_damage_anisoDuctile_ID) sourceType
|
case (SOURCE_damage_anisoDuctile_ID) sourceType
|
||||||
call source_damage_anisoDuctile_dotState(ipc, ip, el)
|
call source_damage_anisoDuctile_dotState(ipc, ip, el)
|
||||||
|
|
||||||
|
end select sourceType
|
||||||
|
|
||||||
|
broken = broken .or. any(IEEE_is_NaN(sourceState(phase)%p(i)%dotState(:,of)))
|
||||||
|
|
||||||
|
enddo SourceLoop
|
||||||
|
|
||||||
|
end function constitutive_damage_collectDotState
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief contains the constitutive equation for calculating the rate of change of microstructure
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
function constitutive_thermal_collectDotState(S, ipc, ip, el,phase,of) result(broken)
|
||||||
|
|
||||||
|
integer, intent(in) :: &
|
||||||
|
ipc, & !< component-ID of integration point
|
||||||
|
ip, & !< integration point
|
||||||
|
el, & !< element
|
||||||
|
phase, &
|
||||||
|
of
|
||||||
|
real(pReal), intent(in), dimension(3,3) :: &
|
||||||
|
S !< 2nd Piola Kirchhoff stress (vector notation)
|
||||||
|
integer :: &
|
||||||
|
i !< counter in source loop
|
||||||
|
logical :: broken
|
||||||
|
|
||||||
|
|
||||||
|
broken = .false.
|
||||||
|
|
||||||
|
SourceLoop: do i = 1, phase_Nsources(phase)
|
||||||
|
|
||||||
|
sourceType: select case (phase_source(i,phase))
|
||||||
|
|
||||||
case (SOURCE_thermal_externalheat_ID) sourceType
|
case (SOURCE_thermal_externalheat_ID) sourceType
|
||||||
call source_thermal_externalheat_dotState(phase,of)
|
call source_thermal_externalheat_dotState(phase,of)
|
||||||
|
|
||||||
|
@ -676,7 +707,7 @@ function constitutive_source_collectDotState(S, ipc, ip, el,phase,of) result(bro
|
||||||
|
|
||||||
enddo SourceLoop
|
enddo SourceLoop
|
||||||
|
|
||||||
end function constitutive_source_collectDotState
|
end function constitutive_thermal_collectDotState
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
@ -805,20 +836,18 @@ subroutine constitutive_results
|
||||||
character(len=:), allocatable :: group
|
character(len=:), allocatable :: group
|
||||||
|
|
||||||
|
|
||||||
group = '/current/phase/'
|
call results_closeGroup(results_addGroup('/current/phase/'))
|
||||||
call results_closeGroup(results_addGroup(group))
|
|
||||||
|
|
||||||
do ph = 1, size(material_name_phase)
|
do ph = 1, size(material_name_phase)
|
||||||
|
|
||||||
group = group//trim(material_name_phase(ph))//'/'
|
group = '/current/phase/'//trim(material_name_phase(ph))//'/'
|
||||||
call results_closeGroup(results_addGroup(group))
|
call results_closeGroup(results_addGroup(group))
|
||||||
|
|
||||||
call mech_results(group,ph)
|
call mech_results(group,ph)
|
||||||
|
call damage_results(group,ph)
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
call damage_results
|
|
||||||
|
|
||||||
end subroutine constitutive_results
|
end subroutine constitutive_results
|
||||||
|
|
||||||
|
|
||||||
|
@ -1453,7 +1482,8 @@ subroutine integrateSourceState(g,i,e)
|
||||||
p = material_phaseAt(g,e)
|
p = material_phaseAt(g,e)
|
||||||
c = material_phaseMemberAt(g,i,e)
|
c = material_phaseMemberAt(g,i,e)
|
||||||
|
|
||||||
broken = constitutive_source_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
broken = constitutive_thermal_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
||||||
|
broken = broken .or. constitutive_damage_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
||||||
if(broken) return
|
if(broken) return
|
||||||
|
|
||||||
do s = 1, phase_Nsources(p)
|
do s = 1, phase_Nsources(p)
|
||||||
|
@ -1471,7 +1501,8 @@ subroutine integrateSourceState(g,i,e)
|
||||||
source_dotState(1:size_so(s),1,s) = sourceState(p)%p(s)%dotState(:,c)
|
source_dotState(1:size_so(s),1,s) = sourceState(p)%p(s)%dotState(:,c)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
broken = constitutive_source_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
broken = constitutive_thermal_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
||||||
|
broken = broken .or. constitutive_damage_collectDotState(crystallite_S(1:3,1:3,g,i,e), g,i,e,p,c)
|
||||||
if(broken) exit iteration
|
if(broken) exit iteration
|
||||||
|
|
||||||
do s = 1, phase_Nsources(p)
|
do s = 1, phase_Nsources(p)
|
||||||
|
|
|
@ -217,32 +217,35 @@ end subroutine constitutive_damage_getRateAndItsTangents
|
||||||
!----------------------------------------------------------------------------------------------
|
!----------------------------------------------------------------------------------------------
|
||||||
!< @brief writes damage sources results to HDF5 output file
|
!< @brief writes damage sources results to HDF5 output file
|
||||||
!----------------------------------------------------------------------------------------------
|
!----------------------------------------------------------------------------------------------
|
||||||
module subroutine damage_results
|
module subroutine damage_results(group,ph)
|
||||||
|
|
||||||
integer :: p,i
|
character(len=*), intent(in) :: group
|
||||||
character(len=pStringLen) :: group
|
integer, intent(in) :: ph
|
||||||
|
|
||||||
do p = 1, size(material_name_phase)
|
integer :: so
|
||||||
|
|
||||||
sourceLoop: do i = 1, phase_Nsources(p)
|
sourceLoop: do so = 1, phase_Nsources(ph)
|
||||||
group = trim('current/phase')//'/'//trim(material_name_phase(p))
|
|
||||||
group = trim(group)//'/sources'
|
|
||||||
call results_closeGroup(results_addGroup(group))
|
|
||||||
|
|
||||||
sourceType: select case (phase_source(i,p))
|
if (phase_source(so,ph) /= SOURCE_UNDEFINED_ID) &
|
||||||
|
call results_closeGroup(results_addGroup(group//'damage/'))
|
||||||
|
|
||||||
case (SOURCE_damage_anisoBrittle_ID) sourceType
|
sourceType: select case (phase_source(so,ph))
|
||||||
call source_damage_anisoBrittle_results(p,group)
|
|
||||||
case (SOURCE_damage_anisoDuctile_ID) sourceType
|
|
||||||
call source_damage_anisoDuctile_results(p,group)
|
|
||||||
case (SOURCE_damage_isoBrittle_ID) sourceType
|
|
||||||
call source_damage_isoBrittle_results(p,group)
|
|
||||||
case (SOURCE_damage_isoDuctile_ID) sourceType
|
|
||||||
call source_damage_isoDuctile_results(p,group)
|
|
||||||
end select sourceType
|
|
||||||
|
|
||||||
enddo SourceLoop
|
case (SOURCE_damage_anisoBrittle_ID) sourceType
|
||||||
enddo
|
call source_damage_anisoBrittle_results(ph,group//'damage/')
|
||||||
|
|
||||||
|
case (SOURCE_damage_anisoDuctile_ID) sourceType
|
||||||
|
call source_damage_anisoDuctile_results(ph,group//'damage/')
|
||||||
|
|
||||||
|
case (SOURCE_damage_isoBrittle_ID) sourceType
|
||||||
|
call source_damage_isoBrittle_results(ph,group//'damage/')
|
||||||
|
|
||||||
|
case (SOURCE_damage_isoDuctile_ID) sourceType
|
||||||
|
call source_damage_isoDuctile_results(ph,group//'damage/')
|
||||||
|
|
||||||
|
end select sourceType
|
||||||
|
|
||||||
|
enddo SourceLoop
|
||||||
|
|
||||||
end subroutine damage_results
|
end subroutine damage_results
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue