Merge branch 'clean-thermal-2' into 'development'
Clean thermal 2 See merge request damask/DAMASK!326
This commit is contained in:
commit
bd9bb5c7c3
|
@ -180,9 +180,9 @@ subroutine CPFEM_general(mode, ffn, ffn1, temperature_inp, dt, elFE, ip, cauchyS
|
||||||
if (iand(mode, CPFEM_AGERESULTS) /= 0_pInt) call CPFEM_forward
|
if (iand(mode, CPFEM_AGERESULTS) /= 0_pInt) call CPFEM_forward
|
||||||
|
|
||||||
chosenThermal1: select case (thermal_type(material_homogenizationAt(elCP)))
|
chosenThermal1: select case (thermal_type(material_homogenizationAt(elCP)))
|
||||||
case (THERMAL_conduction_ID) chosenThermal1
|
!case (THERMAL_conduction_ID) chosenThermal1
|
||||||
temperature(material_homogenizationAt(elCP))%p(material_homogenizationMemberAt(ip,elCP)) = &
|
! temperature(material_homogenizationAt(elCP))%p(material_homogenizationMemberAt(ip,elCP)) = &
|
||||||
temperature_inp
|
! temperature_inp
|
||||||
end select chosenThermal1
|
end select chosenThermal1
|
||||||
homogenization_F0(1:3,1:3,ma) = ffn
|
homogenization_F0(1:3,1:3,ma) = ffn
|
||||||
homogenization_F(1:3,1:3,ma) = ffn1
|
homogenization_F(1:3,1:3,ma) = ffn1
|
||||||
|
|
|
@ -351,7 +351,7 @@ end subroutine hypela2
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine flux(f,ts,n,time)
|
subroutine flux(f,ts,n,time)
|
||||||
use prec
|
use prec
|
||||||
use thermal_conduction
|
use homogenization
|
||||||
use discretization_marc
|
use discretization_marc
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
|
|
|
@ -42,8 +42,6 @@
|
||||||
#include "source_damage_anisoDuctile.f90"
|
#include "source_damage_anisoDuctile.f90"
|
||||||
#include "kinematics_cleavage_opening.f90"
|
#include "kinematics_cleavage_opening.f90"
|
||||||
#include "kinematics_slipplane_opening.f90"
|
#include "kinematics_slipplane_opening.f90"
|
||||||
#include "thermal_isothermal.f90"
|
|
||||||
#include "thermal_conduction.f90"
|
|
||||||
#include "damage_none.f90"
|
#include "damage_none.f90"
|
||||||
#include "damage_nonlocal.f90"
|
#include "damage_nonlocal.f90"
|
||||||
#include "homogenization.f90"
|
#include "homogenization.f90"
|
||||||
|
|
|
@ -120,10 +120,6 @@ module constitutive
|
||||||
integer, intent(in) :: ph, me
|
integer, intent(in) :: ph, me
|
||||||
end subroutine mech_initializeRestorationPoints
|
end subroutine mech_initializeRestorationPoints
|
||||||
|
|
||||||
module subroutine constitutive_thermal_initializeRestorationPoints(ph,me)
|
|
||||||
integer, intent(in) :: ph, me
|
|
||||||
end subroutine constitutive_thermal_initializeRestorationPoints
|
|
||||||
|
|
||||||
|
|
||||||
module subroutine mech_windForward(ph,me)
|
module subroutine mech_windForward(ph,me)
|
||||||
integer, intent(in) :: ph, me
|
integer, intent(in) :: ph, me
|
||||||
|
@ -137,8 +133,8 @@ module constitutive
|
||||||
end subroutine thermal_forward
|
end subroutine thermal_forward
|
||||||
|
|
||||||
|
|
||||||
module subroutine mech_restore(ip,el,includeL)
|
module subroutine mech_restore(ce,includeL)
|
||||||
integer, intent(in) :: ip, el
|
integer, intent(in) :: ce
|
||||||
logical, intent(in) :: includeL
|
logical, intent(in) :: includeL
|
||||||
end subroutine mech_restore
|
end subroutine mech_restore
|
||||||
|
|
||||||
|
@ -204,10 +200,10 @@ module constitutive
|
||||||
integer, intent(in) :: co, ip, el
|
integer, intent(in) :: co, ip, el
|
||||||
end subroutine constitutive_mech_setF
|
end subroutine constitutive_mech_setF
|
||||||
|
|
||||||
module subroutine constitutive_thermal_setT(T,co,ce)
|
module subroutine constitutive_thermal_setField(T,dot_T, co,ce)
|
||||||
real(pReal), intent(in) :: T
|
real(pReal), intent(in) :: T, dot_T
|
||||||
integer, intent(in) :: co, ce
|
integer, intent(in) :: ce, co
|
||||||
end subroutine constitutive_thermal_setT
|
end subroutine constitutive_thermal_setField
|
||||||
|
|
||||||
module subroutine constitutive_damage_set_phi(phi,co,ce)
|
module subroutine constitutive_damage_set_phi(phi,co,ce)
|
||||||
real(pReal), intent(in) :: phi
|
real(pReal), intent(in) :: phi
|
||||||
|
@ -245,9 +241,6 @@ module constitutive
|
||||||
end function constitutive_homogenizedC
|
end function constitutive_homogenizedC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module subroutine constitutive_damage_getRateAndItsTangents(phiDot, dPhiDot_dPhi, phi, ip, el)
|
module subroutine constitutive_damage_getRateAndItsTangents(phiDot, dPhiDot_dPhi, phi, ip, el)
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: &
|
||||||
ip, & !< integration point number
|
ip, & !< integration point number
|
||||||
|
@ -317,11 +310,9 @@ module constitutive
|
||||||
dLd_dTstar !< derivative of Ld with respect to Tstar (4th-order tensor)
|
dLd_dTstar !< derivative of Ld with respect to Tstar (4th-order tensor)
|
||||||
end subroutine kinematics_slipplane_opening_LiAndItsTangent
|
end subroutine kinematics_slipplane_opening_LiAndItsTangent
|
||||||
|
|
||||||
module subroutine kinematics_thermal_expansion_LiAndItsTangent(Li, dLi_dTstar, co, ip, el)
|
module subroutine kinematics_thermal_expansion_LiAndItsTangent(Li, dLi_dTstar, ph,me)
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: ph, me
|
||||||
co, & !< grain number
|
!< element number
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), intent(out), dimension(3,3) :: &
|
real(pReal), intent(out), dimension(3,3) :: &
|
||||||
Li !< thermal velocity gradient
|
Li !< thermal velocity gradient
|
||||||
real(pReal), intent(out), dimension(3,3,3,3) :: &
|
real(pReal), intent(out), dimension(3,3,3,3) :: &
|
||||||
|
@ -362,14 +353,13 @@ module constitutive
|
||||||
constitutive_restartWrite, &
|
constitutive_restartWrite, &
|
||||||
constitutive_restartRead, &
|
constitutive_restartRead, &
|
||||||
integrateDamageState, &
|
integrateDamageState, &
|
||||||
constitutive_thermal_setT, &
|
constitutive_thermal_setField, &
|
||||||
constitutive_damage_set_phi, &
|
constitutive_damage_set_phi, &
|
||||||
constitutive_damage_get_phi, &
|
constitutive_damage_get_phi, &
|
||||||
constitutive_mech_getP, &
|
constitutive_mech_getP, &
|
||||||
constitutive_mech_setF, &
|
constitutive_mech_setF, &
|
||||||
constitutive_mech_getF, &
|
constitutive_mech_getF, &
|
||||||
constitutive_initializeRestorationPoints, &
|
constitutive_initializeRestorationPoints, &
|
||||||
constitutive_thermal_initializeRestorationPoints, &
|
|
||||||
constitutive_windForward, &
|
constitutive_windForward, &
|
||||||
KINEMATICS_UNDEFINED_ID ,&
|
KINEMATICS_UNDEFINED_ID ,&
|
||||||
KINEMATICS_CLEAVAGE_OPENING_ID, &
|
KINEMATICS_CLEAVAGE_OPENING_ID, &
|
||||||
|
@ -497,26 +487,24 @@ end subroutine constitutive_allocateState
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief Restore data after homog cutback.
|
!> @brief Restore data after homog cutback.
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
subroutine constitutive_restore(ip,el,includeL)
|
subroutine constitutive_restore(ce,includeL)
|
||||||
|
|
||||||
logical, intent(in) :: includeL
|
logical, intent(in) :: includeL
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: ce
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
|
|
||||||
integer :: &
|
integer :: &
|
||||||
co, & !< constituent number
|
co, & !< constituent number
|
||||||
so
|
so
|
||||||
|
|
||||||
|
|
||||||
do co = 1,homogenization_Nconstituents(material_homogenizationAt(el))
|
do co = 1,homogenization_Nconstituents(material_homogenizationAt2(ce))
|
||||||
do so = 1, phase_Nsources(material_phaseAt(co,el))
|
do so = 1, phase_Nsources(material_phaseAt2(co,ce))
|
||||||
damageState(material_phaseAt(co,el))%p(so)%state( :,material_phasememberAt(co,ip,el)) = &
|
damageState(material_phaseAt2(co,ce))%p(so)%state( :,material_phasememberAt2(co,ce)) = &
|
||||||
damageState(material_phaseAt(co,el))%p(so)%partitionedState0(:,material_phasememberAt(co,ip,el))
|
damageState(material_phaseAt2(co,ce))%p(so)%partitionedState0(:,material_phasememberAt2(co,ce))
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
call mech_restore(ip,el,includeL)
|
call mech_restore(ce,includeL)
|
||||||
|
|
||||||
end subroutine constitutive_restore
|
end subroutine constitutive_restore
|
||||||
|
|
||||||
|
@ -638,9 +626,6 @@ subroutine crystallite_init()
|
||||||
do so = 1, phase_Nsources(ph)
|
do so = 1, phase_Nsources(ph)
|
||||||
allocate(damageState(ph)%p(so)%subState0,source=damageState(ph)%p(so)%state0) ! ToDo: hack
|
allocate(damageState(ph)%p(so)%subState0,source=damageState(ph)%p(so)%state0) ! ToDo: hack
|
||||||
enddo
|
enddo
|
||||||
do so = 1, thermal_Nsources(ph)
|
|
||||||
allocate(thermalState(ph)%p(so)%subState0,source=thermalState(ph)%p(so)%state0) ! ToDo: hack
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
print'(a42,1x,i10)', ' # of elements: ', eMax
|
print'(a42,1x,i10)', ' # of elements: ', eMax
|
||||||
|
@ -766,9 +751,6 @@ function crystallite_push33ToRef(co,ip,el, tensor33)
|
||||||
end function crystallite_push33ToRef
|
end function crystallite_push33ToRef
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief determines whether a point is converged
|
!> @brief determines whether a point is converged
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -1586,9 +1586,6 @@ module function crystallite_stress(dt,co,ip,el) result(converged_)
|
||||||
do so = 1, phase_Nsources(ph)
|
do so = 1, phase_Nsources(ph)
|
||||||
damageState(ph)%p(so)%subState0(:,me) = damageState(ph)%p(so)%partitionedState0(:,me)
|
damageState(ph)%p(so)%subState0(:,me) = damageState(ph)%p(so)%partitionedState0(:,me)
|
||||||
enddo
|
enddo
|
||||||
do so = 1, thermal_Nsources(ph)
|
|
||||||
thermalState(ph)%p(so)%subState0(:,me) = thermalState(ph)%p(so)%partitionedState0(:,me)
|
|
||||||
enddo
|
|
||||||
subFp0 = constitutive_mech_partitionedFp0(ph)%data(1:3,1:3,me)
|
subFp0 = constitutive_mech_partitionedFp0(ph)%data(1:3,1:3,me)
|
||||||
subFi0 = constitutive_mech_partitionedFi0(ph)%data(1:3,1:3,me)
|
subFi0 = constitutive_mech_partitionedFi0(ph)%data(1:3,1:3,me)
|
||||||
subF0 = constitutive_mech_partitionedF0(ph)%data(1:3,1:3,me)
|
subF0 = constitutive_mech_partitionedF0(ph)%data(1:3,1:3,me)
|
||||||
|
@ -1656,11 +1653,9 @@ end function crystallite_stress
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief Restore data after homog cutback.
|
!> @brief Restore data after homog cutback.
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module subroutine mech_restore(ip,el,includeL)
|
module subroutine mech_restore(ce,includeL)
|
||||||
|
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: ce
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
logical, intent(in) :: &
|
logical, intent(in) :: &
|
||||||
includeL !< protect agains fake cutback
|
includeL !< protect agains fake cutback
|
||||||
|
|
||||||
|
@ -1668,9 +1663,9 @@ module subroutine mech_restore(ip,el,includeL)
|
||||||
co, ph, me
|
co, ph, me
|
||||||
|
|
||||||
|
|
||||||
do co = 1,homogenization_Nconstituents(material_homogenizationAt(el))
|
do co = 1,homogenization_Nconstituents(material_homogenizationAt2(ce))
|
||||||
ph = material_phaseAt(co,el)
|
ph = material_phaseAt2(co,ce)
|
||||||
me = material_phaseMemberAt(co,ip,el)
|
me = material_phaseMemberAt2(co,ce)
|
||||||
if (includeL) then
|
if (includeL) then
|
||||||
constitutive_mech_Lp(ph)%data(1:3,1:3,me) = constitutive_mech_partitionedLp0(ph)%data(1:3,1:3,me)
|
constitutive_mech_Lp(ph)%data(1:3,1:3,me) = constitutive_mech_partitionedLp0(ph)%data(1:3,1:3,me)
|
||||||
constitutive_mech_Li(ph)%data(1:3,1:3,me) = constitutive_mech_partitionedLi0(ph)%data(1:3,1:3,me)
|
constitutive_mech_Li(ph)%data(1:3,1:3,me) = constitutive_mech_partitionedLi0(ph)%data(1:3,1:3,me)
|
||||||
|
@ -1961,7 +1956,7 @@ subroutine constitutive_LiAndItsTangents(Li, dLi_dS, dLi_dFi, &
|
||||||
detFi
|
detFi
|
||||||
integer :: &
|
integer :: &
|
||||||
k, i, j, &
|
k, i, j, &
|
||||||
instance, of
|
instance, of, me, ph
|
||||||
|
|
||||||
Li = 0.0_pReal
|
Li = 0.0_pReal
|
||||||
dLi_dS = 0.0_pReal
|
dLi_dS = 0.0_pReal
|
||||||
|
@ -1987,7 +1982,9 @@ subroutine constitutive_LiAndItsTangents(Li, dLi_dS, dLi_dFi, &
|
||||||
case (KINEMATICS_slipplane_opening_ID) kinematicsType
|
case (KINEMATICS_slipplane_opening_ID) kinematicsType
|
||||||
call kinematics_slipplane_opening_LiAndItsTangent(my_Li, my_dLi_dS, S, co, ip, el)
|
call kinematics_slipplane_opening_LiAndItsTangent(my_Li, my_dLi_dS, S, co, ip, el)
|
||||||
case (KINEMATICS_thermal_expansion_ID) kinematicsType
|
case (KINEMATICS_thermal_expansion_ID) kinematicsType
|
||||||
call kinematics_thermal_expansion_LiAndItsTangent(my_Li, my_dLi_dS, co, ip, el)
|
me = material_phaseMemberAt(co,ip,el)
|
||||||
|
ph = material_phaseAt(co,el)
|
||||||
|
call kinematics_thermal_expansion_LiAndItsTangent(my_Li, my_dLi_dS, ph,me)
|
||||||
case default kinematicsType
|
case default kinematicsType
|
||||||
my_Li = 0.0_pReal
|
my_Li = 0.0_pReal
|
||||||
my_dLi_dS = 0.0_pReal
|
my_dLi_dS = 0.0_pReal
|
||||||
|
|
|
@ -10,7 +10,7 @@ submodule(constitutive) constitutive_thermal
|
||||||
end enum
|
end enum
|
||||||
|
|
||||||
type :: tDataContainer
|
type :: tDataContainer
|
||||||
real(pReal), dimension(:), allocatable :: T
|
real(pReal), dimension(:), allocatable :: T, dot_T
|
||||||
end type tDataContainer
|
end type tDataContainer
|
||||||
integer(kind(THERMAL_UNDEFINED_ID)), dimension(:,:), allocatable :: &
|
integer(kind(THERMAL_UNDEFINED_ID)), dimension(:,:), allocatable :: &
|
||||||
thermal_source
|
thermal_source
|
||||||
|
@ -94,6 +94,7 @@ module subroutine thermal_init(phases)
|
||||||
Nconstituents = count(material_phaseAt == ph) * discretization_nIPs
|
Nconstituents = count(material_phaseAt == ph) * discretization_nIPs
|
||||||
|
|
||||||
allocate(current(ph)%T(Nconstituents),source=300.0_pReal)
|
allocate(current(ph)%T(Nconstituents),source=300.0_pReal)
|
||||||
|
allocate(current(ph)%dot_T(Nconstituents),source=0.0_pReal)
|
||||||
phase => phases%get(ph)
|
phase => phases%get(ph)
|
||||||
if(phase%contains('thermal')) then
|
if(phase%contains('thermal')) then
|
||||||
thermal => phase%get('thermal')
|
thermal => phase%get('thermal')
|
||||||
|
@ -115,8 +116,8 @@ module subroutine thermal_init(phases)
|
||||||
PhaseLoop2:do ph = 1,phases%length
|
PhaseLoop2:do ph = 1,phases%length
|
||||||
|
|
||||||
do so = 1,thermal_Nsources(ph)
|
do so = 1,thermal_Nsources(ph)
|
||||||
thermalState(ph)%p(so)%partitionedState0 = thermalState(ph)%p(so)%state0
|
deallocate(thermalState(ph)%p(so)%partitionedState0)
|
||||||
thermalState(ph)%p(so)%state = thermalState(ph)%p(so)%partitionedState0
|
thermalState(ph)%p(so)%state = thermalState(ph)%p(so)%state0
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
thermal_source_maxSizeDotState = max(thermal_source_maxSizeDotState, &
|
thermal_source_maxSizeDotState = max(thermal_source_maxSizeDotState, &
|
||||||
|
@ -147,13 +148,11 @@ module subroutine constitutive_thermal_getRate(TDot, ip, el)
|
||||||
integer :: &
|
integer :: &
|
||||||
ph, &
|
ph, &
|
||||||
homog, &
|
homog, &
|
||||||
instance, &
|
|
||||||
me, &
|
me, &
|
||||||
so, &
|
so, &
|
||||||
co
|
co
|
||||||
|
|
||||||
homog = material_homogenizationAt(el)
|
homog = material_homogenizationAt(el)
|
||||||
instance = thermal_typeInstance(homog)
|
|
||||||
|
|
||||||
TDot = 0.0_pReal
|
TDot = 0.0_pReal
|
||||||
do co = 1, homogenization_Nconstituents(homog)
|
do co = 1, homogenization_Nconstituents(homog)
|
||||||
|
@ -211,9 +210,6 @@ module function thermal_stress(Delta_t,ph,me) result(converged_)
|
||||||
integer :: so
|
integer :: so
|
||||||
|
|
||||||
|
|
||||||
do so = 1, thermal_Nsources(ph)
|
|
||||||
thermalState(ph)%p(so)%state(:,me) = thermalState(ph)%p(so)%subState0(:,me)
|
|
||||||
enddo
|
|
||||||
converged_ = .not. integrateThermalState(Delta_t,ph,me)
|
converged_ = .not. integrateThermalState(Delta_t,ph,me)
|
||||||
|
|
||||||
end function thermal_stress
|
end function thermal_stress
|
||||||
|
@ -238,28 +234,13 @@ function integrateThermalState(Delta_t, ph,me) result(broken)
|
||||||
|
|
||||||
do so = 1, thermal_Nsources(ph)
|
do so = 1, thermal_Nsources(ph)
|
||||||
sizeDotState = thermalState(ph)%p(so)%sizeDotState
|
sizeDotState = thermalState(ph)%p(so)%sizeDotState
|
||||||
thermalState(ph)%p(so)%state(1:sizeDotState,me) = thermalState(ph)%p(so)%subState0(1:sizeDotState,me) &
|
thermalState(ph)%p(so)%state(1:sizeDotState,me) = thermalState(ph)%p(so)%state0(1:sizeDotState,me) &
|
||||||
+ thermalState(ph)%p(so)%dotState(1:sizeDotState,me) * Delta_t
|
+ thermalState(ph)%p(so)%dotState(1:sizeDotState,me) * Delta_t
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
end function integrateThermalState
|
end function integrateThermalState
|
||||||
|
|
||||||
|
|
||||||
module subroutine constitutive_thermal_initializeRestorationPoints(ph,me)
|
|
||||||
|
|
||||||
integer, intent(in) :: ph, me
|
|
||||||
|
|
||||||
integer :: so
|
|
||||||
|
|
||||||
|
|
||||||
do so = 1, size(thermalState(ph)%p)
|
|
||||||
thermalState(ph)%p(so)%partitionedState0(:,me) = thermalState(ph)%p(so)%state0(:,me)
|
|
||||||
enddo
|
|
||||||
|
|
||||||
end subroutine constitutive_thermal_initializeRestorationPoints
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module subroutine thermal_forward()
|
module subroutine thermal_forward()
|
||||||
|
|
||||||
integer :: ph, so
|
integer :: ph, so
|
||||||
|
@ -291,15 +272,16 @@ end function thermal_T
|
||||||
!----------------------------------------------------------------------------------------------
|
!----------------------------------------------------------------------------------------------
|
||||||
!< @brief Set temperature
|
!< @brief Set temperature
|
||||||
!----------------------------------------------------------------------------------------------
|
!----------------------------------------------------------------------------------------------
|
||||||
module subroutine constitutive_thermal_setT(T,co,ce)
|
module subroutine constitutive_thermal_setField(T,dot_T, co,ce)
|
||||||
|
|
||||||
real(pReal), intent(in) :: T
|
real(pReal), intent(in) :: T, dot_T
|
||||||
integer, intent(in) :: ce, co
|
integer, intent(in) :: ce, co
|
||||||
|
|
||||||
|
|
||||||
current(material_phaseAt2(co,ce))%T(material_phaseMemberAt2(co,ce)) = T
|
current(material_phaseAt2(co,ce))%T(material_phaseMemberAt2(co,ce)) = T
|
||||||
|
current(material_phaseAt2(co,ce))%dot_T(material_phaseMemberAt2(co,ce)) = dot_T
|
||||||
|
|
||||||
end subroutine constitutive_thermal_setT
|
end subroutine constitutive_thermal_setField
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -425,7 +425,7 @@ program DAMASK_grid
|
||||||
guess = .true. ! start guessing after first converged (sub)inc
|
guess = .true. ! start guessing after first converged (sub)inc
|
||||||
if (worldrank == 0) then
|
if (worldrank == 0) then
|
||||||
write(statUnit,*) totalIncsCounter, time, cutBackLevel, &
|
write(statUnit,*) totalIncsCounter, time, cutBackLevel, &
|
||||||
solres%converged, solres%iterationsNeeded
|
solres(1)%converged, solres(1)%iterationsNeeded
|
||||||
flush(statUnit)
|
flush(statUnit)
|
||||||
endif
|
endif
|
||||||
elseif (cutBackLevel < maxCutBack) then ! further cutbacking tolerated?
|
elseif (cutBackLevel < maxCutBack) then ! further cutbacking tolerated?
|
||||||
|
|
|
@ -15,7 +15,6 @@ module grid_thermal_spectral
|
||||||
use IO
|
use IO
|
||||||
use spectral_utilities
|
use spectral_utilities
|
||||||
use discretization_grid
|
use discretization_grid
|
||||||
use thermal_conduction
|
|
||||||
use homogenization
|
use homogenization
|
||||||
use YAML_types
|
use YAML_types
|
||||||
use config
|
use config
|
||||||
|
@ -132,7 +131,7 @@ subroutine grid_thermal_spectral_init
|
||||||
ce = 0
|
ce = 0
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
||||||
ce = ce + 1
|
ce = ce + 1
|
||||||
T_current(i,j,k) = temperature(material_homogenizationAt(ce))%p(material_homogenizationMemberAt(1,ce))
|
T_current(i,j,k) = homogenization_thermal_T(ce)
|
||||||
T_lastInc(i,j,k) = T_current(i,j,k)
|
T_lastInc(i,j,k) = T_current(i,j,k)
|
||||||
T_stagInc(i,j,k) = T_current(i,j,k)
|
T_stagInc(i,j,k) = T_current(i,j,k)
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
@ -188,10 +187,9 @@ function grid_thermal_spectral_solution(timeinc) result(solution)
|
||||||
ce = 0
|
ce = 0
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
||||||
ce = ce + 1
|
ce = ce + 1
|
||||||
call thermal_conduction_putTemperatureAndItsRate(T_current(i,j,k), &
|
call homogenization_thermal_setField(T_current(i,j,k), &
|
||||||
(T_current(i,j,k)-T_lastInc(i,j,k))/params%timeinc, &
|
(T_current(i,j,k)-T_lastInc(i,j,k))/params%timeinc, &
|
||||||
1,ce)
|
ce)
|
||||||
homogenization_T(ce) = T_current(i,j,k)
|
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
|
||||||
call VecMin(solution_vec,devNull,T_min,ierr); CHKERRQ(ierr)
|
call VecMin(solution_vec,devNull,T_min,ierr); CHKERRQ(ierr)
|
||||||
|
@ -229,11 +227,9 @@ subroutine grid_thermal_spectral_forward(cutBack)
|
||||||
call DMDAVecRestoreArrayF90(dm_local,solution_vec,x_scal,ierr); CHKERRQ(ierr)
|
call DMDAVecRestoreArrayF90(dm_local,solution_vec,x_scal,ierr); CHKERRQ(ierr)
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
||||||
ce = ce + 1
|
ce = ce + 1
|
||||||
call thermal_conduction_putTemperatureAndItsRate(T_current(i,j,k), &
|
call homogenization_thermal_setField(T_current(i,j,k), &
|
||||||
(T_current(i,j,k) - &
|
(T_current(i,j,k)-T_lastInc(i,j,k))/params%timeinc, &
|
||||||
T_lastInc(i,j,k))/params%timeinc, &
|
ce)
|
||||||
1,ce)
|
|
||||||
homogenization_T(ce) = T_current(i,j,k)
|
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
else
|
else
|
||||||
T_lastInc = T_current
|
T_lastInc = T_current
|
||||||
|
@ -283,8 +279,8 @@ subroutine formResidual(in,x_scal,f_scal,dummy,ierr)
|
||||||
ce = ce + 1
|
ce = ce + 1
|
||||||
call thermal_conduction_getSource(Tdot, 1,ce)
|
call thermal_conduction_getSource(Tdot, 1,ce)
|
||||||
scalarField_real(i,j,k) = params%timeinc*(scalarField_real(i,j,k) + Tdot) &
|
scalarField_real(i,j,k) = params%timeinc*(scalarField_real(i,j,k) + Tdot) &
|
||||||
+ thermal_conduction_getMassDensity (1,ce)* &
|
+ thermal_conduction_getMassDensity (ce)* &
|
||||||
thermal_conduction_getSpecificHeat(1,ce)*(T_lastInc(i,j,k) - &
|
thermal_conduction_getSpecificHeat(ce)*(T_lastInc(i,j,k) - &
|
||||||
T_current(i,j,k))&
|
T_current(i,j,k))&
|
||||||
+ mu_ref*T_current(i,j,k)
|
+ mu_ref*T_current(i,j,k)
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
|
@ -315,7 +311,7 @@ subroutine updateReference
|
||||||
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
do k = 1, grid3; do j = 1, grid(2); do i = 1,grid(1)
|
||||||
ce = ce + 1
|
ce = ce + 1
|
||||||
K_ref = K_ref + thermal_conduction_getConductivity(1,ce)
|
K_ref = K_ref + thermal_conduction_getConductivity(1,ce)
|
||||||
mu_ref = mu_ref + thermal_conduction_getMassDensity(1,ce)* thermal_conduction_getSpecificHeat(1,ce)
|
mu_ref = mu_ref + thermal_conduction_getMassDensity(ce)* thermal_conduction_getSpecificHeat(ce)
|
||||||
enddo; enddo; enddo
|
enddo; enddo; enddo
|
||||||
K_ref = K_ref*wgt
|
K_ref = K_ref*wgt
|
||||||
call MPI_Allreduce(MPI_IN_PLACE,K_ref,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
call MPI_Allreduce(MPI_IN_PLACE,K_ref,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||||
|
|
|
@ -12,8 +12,6 @@ module homogenization
|
||||||
use material
|
use material
|
||||||
use constitutive
|
use constitutive
|
||||||
use discretization
|
use discretization
|
||||||
use thermal_isothermal
|
|
||||||
use thermal_conduction
|
|
||||||
use damage_none
|
use damage_none
|
||||||
use damage_nonlocal
|
use damage_nonlocal
|
||||||
use HDF5_utilities
|
use HDF5_utilities
|
||||||
|
@ -28,8 +26,6 @@ module homogenization
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! General variables for the homogenization at a material point
|
! General variables for the homogenization at a material point
|
||||||
real(pReal), dimension(:), allocatable, public :: &
|
real(pReal), dimension(:), allocatable, public :: &
|
||||||
homogenization_T, &
|
|
||||||
homogenization_dot_T, &
|
|
||||||
homogenization_phi, &
|
homogenization_phi, &
|
||||||
homogenization_dot_phi
|
homogenization_dot_phi
|
||||||
real(pReal), dimension(:,:,:), allocatable, public :: &
|
real(pReal), dimension(:,:,:), allocatable, public :: &
|
||||||
|
@ -75,8 +71,7 @@ module homogenization
|
||||||
el !< element number
|
el !< element number
|
||||||
end subroutine mech_partition
|
end subroutine mech_partition
|
||||||
|
|
||||||
module subroutine thermal_partition(T,ce)
|
module subroutine thermal_partition(ce)
|
||||||
real(pReal), intent(in) :: T
|
|
||||||
integer, intent(in) :: ce
|
integer, intent(in) :: ce
|
||||||
end subroutine thermal_partition
|
end subroutine thermal_partition
|
||||||
|
|
||||||
|
@ -112,11 +107,59 @@ module homogenization
|
||||||
logical, dimension(2) :: doneAndHappy
|
logical, dimension(2) :: doneAndHappy
|
||||||
end function mech_updateState
|
end function mech_updateState
|
||||||
|
|
||||||
|
|
||||||
|
module function thermal_conduction_getConductivity(ip,el) result(K)
|
||||||
|
|
||||||
|
integer, intent(in) :: &
|
||||||
|
ip, & !< integration point number
|
||||||
|
el !< element number
|
||||||
|
real(pReal), dimension(3,3) :: K
|
||||||
|
|
||||||
|
end function thermal_conduction_getConductivity
|
||||||
|
|
||||||
|
module function thermal_conduction_getSpecificHeat(ce) result(c_P)
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: c_P
|
||||||
|
end function thermal_conduction_getSpecificHeat
|
||||||
|
|
||||||
|
module function thermal_conduction_getMassDensity(ce) result(rho)
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: rho
|
||||||
|
end function thermal_conduction_getMassDensity
|
||||||
|
|
||||||
|
module subroutine homogenization_thermal_setField(T,dot_T, ce)
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal), intent(in) :: T, dot_T
|
||||||
|
end subroutine homogenization_thermal_setField
|
||||||
|
|
||||||
|
module subroutine thermal_conduction_results(ho,group)
|
||||||
|
integer, intent(in) :: ho
|
||||||
|
character(len=*), intent(in) :: group
|
||||||
|
end subroutine thermal_conduction_results
|
||||||
|
|
||||||
|
module function homogenization_thermal_T(ce) result(T)
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: T
|
||||||
|
end function homogenization_thermal_T
|
||||||
|
|
||||||
|
module subroutine thermal_conduction_getSource(Tdot, ip,el)
|
||||||
|
integer, intent(in) :: &
|
||||||
|
ip, & !< integration point number
|
||||||
|
el !< element number
|
||||||
|
real(pReal), intent(out) :: Tdot
|
||||||
|
end subroutine thermal_conduction_getSource
|
||||||
|
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
homogenization_init, &
|
homogenization_init, &
|
||||||
materialpoint_stressAndItsTangent, &
|
materialpoint_stressAndItsTangent, &
|
||||||
|
thermal_conduction_getSpecificHeat, &
|
||||||
|
thermal_conduction_getConductivity, &
|
||||||
|
thermal_conduction_getMassDensity, &
|
||||||
|
thermal_conduction_getSource, &
|
||||||
|
homogenization_thermal_setfield, &
|
||||||
|
homogenization_thermal_T, &
|
||||||
homogenization_forward, &
|
homogenization_forward, &
|
||||||
homogenization_results, &
|
homogenization_results, &
|
||||||
homogenization_restartRead, &
|
homogenization_restartRead, &
|
||||||
|
@ -154,9 +197,6 @@ subroutine homogenization_init()
|
||||||
call thermal_init()
|
call thermal_init()
|
||||||
call damage_init()
|
call damage_init()
|
||||||
|
|
||||||
if (any(thermal_type == THERMAL_isothermal_ID)) call thermal_isothermal_init(homogenization_T)
|
|
||||||
if (any(thermal_type == THERMAL_conduction_ID)) call thermal_conduction_init(homogenization_T)
|
|
||||||
|
|
||||||
if (any(damage_type == DAMAGE_none_ID)) call damage_none_init
|
if (any(damage_type == DAMAGE_none_ID)) call damage_none_init
|
||||||
if (any(damage_type == DAMAGE_nonlocal_ID)) call damage_nonlocal_init
|
if (any(damage_type == DAMAGE_nonlocal_ID)) call damage_nonlocal_init
|
||||||
|
|
||||||
|
@ -190,9 +230,9 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
|
||||||
ho = material_homogenizationAt(el)
|
ho = material_homogenizationAt(el)
|
||||||
myNgrains = homogenization_Nconstituents(ho)
|
myNgrains = homogenization_Nconstituents(ho)
|
||||||
do ip = FEsolving_execIP(1),FEsolving_execIP(2)
|
do ip = FEsolving_execIP(1),FEsolving_execIP(2)
|
||||||
me = material_homogenizationMemberAt(ip,el)
|
ce = (el-1)*discretization_nIPs + ip
|
||||||
!--------------------------------------------------------------------------------------------------
|
me = material_homogenizationMemberAt2(ce)
|
||||||
! initialize restoration points
|
|
||||||
call constitutive_initializeRestorationPoints(ip,el)
|
call constitutive_initializeRestorationPoints(ip,el)
|
||||||
|
|
||||||
subFrac = 0.0_pReal
|
subFrac = 0.0_pReal
|
||||||
|
@ -226,7 +266,7 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
|
||||||
else ! cutback makes sense
|
else ! cutback makes sense
|
||||||
subStep = num%subStepSizeHomog * subStep ! crystallite had severe trouble, so do a significant cutback
|
subStep = num%subStepSizeHomog * subStep ! crystallite had severe trouble, so do a significant cutback
|
||||||
|
|
||||||
call constitutive_restore(ip,el,subStep < 1.0_pReal)
|
call constitutive_restore(ce,subStep < 1.0_pReal)
|
||||||
|
|
||||||
if(homogState(ho)%sizeState > 0) homogState(ho)%State(:,me) = homogState(ho)%subState0(:,me)
|
if(homogState(ho)%sizeState > 0) homogState(ho)%State(:,me) = homogState(ho)%subState0(:,me)
|
||||||
if(damageState_h(ho)%sizeState > 0) damageState_h(ho)%State(:,me) = damageState_h(ho)%subState0(:,me)
|
if(damageState_h(ho)%sizeState > 0) damageState_h(ho)%State(:,me) = damageState_h(ho)%subState0(:,me)
|
||||||
|
@ -243,7 +283,6 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
|
||||||
! deformation partitioning
|
! deformation partitioning
|
||||||
|
|
||||||
if (.not. doneAndHappy(1)) then
|
if (.not. doneAndHappy(1)) then
|
||||||
ce = (el-1)*discretization_nIPs + ip
|
|
||||||
call mech_partition( homogenization_F0(1:3,1:3,ce) &
|
call mech_partition( homogenization_F0(1:3,1:3,ce) &
|
||||||
+ (homogenization_F(1:3,1:3,ce)-homogenization_F0(1:3,1:3,ce))*(subStep+subFrac), &
|
+ (homogenization_F(1:3,1:3,ce)-homogenization_F0(1:3,1:3,ce))*(subStep+subFrac), &
|
||||||
ip,el)
|
ip,el)
|
||||||
|
@ -255,7 +294,6 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
|
||||||
if (.not. converged) then
|
if (.not. converged) then
|
||||||
doneAndHappy = [.true.,.false.]
|
doneAndHappy = [.true.,.false.]
|
||||||
else
|
else
|
||||||
ce = (el-1)*discretization_nIPs + ip
|
|
||||||
doneAndHappy = mech_updateState(dt*subStep, &
|
doneAndHappy = mech_updateState(dt*subStep, &
|
||||||
homogenization_F0(1:3,1:3,ce) &
|
homogenization_F0(1:3,1:3,ce) &
|
||||||
+ (homogenization_F(1:3,1:3,ce)-homogenization_F0(1:3,1:3,ce)) &
|
+ (homogenization_F(1:3,1:3,ce)-homogenization_F0(1:3,1:3,ce)) &
|
||||||
|
@ -278,10 +316,9 @@ subroutine materialpoint_stressAndItsTangent(dt,FEsolving_execIP,FEsolving_execE
|
||||||
ho = material_homogenizationAt(el)
|
ho = material_homogenizationAt(el)
|
||||||
do ip = FEsolving_execIP(1),FEsolving_execIP(2)
|
do ip = FEsolving_execIP(1),FEsolving_execIP(2)
|
||||||
ce = (el-1)*discretization_nIPs + ip
|
ce = (el-1)*discretization_nIPs + ip
|
||||||
call thermal_partition(homogenization_T(ce),ce)
|
call thermal_partition(ce)
|
||||||
do co = 1, homogenization_Nconstituents(ho)
|
do co = 1, homogenization_Nconstituents(ho)
|
||||||
ph = material_phaseAt(co,el)
|
ph = material_phaseAt(co,el)
|
||||||
call constitutive_thermal_initializeRestorationPoints(ph,material_phaseMemberAt(co,ip,el))
|
|
||||||
if (.not. thermal_stress(dt,ph,material_phaseMemberAt(co,ip,el))) then
|
if (.not. thermal_stress(dt,ph,material_phaseMemberAt(co,ip,el))) then
|
||||||
if (.not. terminallyIll) & ! so first signals terminally ill...
|
if (.not. terminallyIll) & ! so first signals terminally ill...
|
||||||
print*, ' Integration point ', ip,' at element ', el, ' terminally ill'
|
print*, ' Integration point ', ip,' at element ', el, ' terminally ill'
|
||||||
|
|
|
@ -3,6 +3,22 @@
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
submodule(homogenization) homogenization_thermal
|
submodule(homogenization) homogenization_thermal
|
||||||
|
|
||||||
|
use lattice
|
||||||
|
|
||||||
|
type :: tDataContainer
|
||||||
|
real(pReal), dimension(:), allocatable :: T, dot_T
|
||||||
|
end type tDataContainer
|
||||||
|
|
||||||
|
type(tDataContainer), dimension(:), allocatable :: current
|
||||||
|
|
||||||
|
type :: tParameters
|
||||||
|
character(len=pStringLen), allocatable, dimension(:) :: &
|
||||||
|
output
|
||||||
|
end type tParameters
|
||||||
|
|
||||||
|
type(tparameters), dimension(:), allocatable :: &
|
||||||
|
param
|
||||||
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
|
@ -11,11 +27,37 @@ contains
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module subroutine thermal_init()
|
module subroutine thermal_init()
|
||||||
|
|
||||||
|
class(tNode), pointer :: &
|
||||||
|
configHomogenizations, &
|
||||||
|
configHomogenization, &
|
||||||
|
configHomogenizationThermal
|
||||||
|
integer :: ho
|
||||||
|
|
||||||
|
|
||||||
print'(/,a)', ' <<<+- homogenization_thermal init -+>>>'
|
print'(/,a)', ' <<<+- homogenization_thermal init -+>>>'
|
||||||
|
|
||||||
allocate(homogenization_T(discretization_nIPs*discretization_Nelems))
|
|
||||||
allocate(homogenization_dot_T(discretization_nIPs*discretization_Nelems))
|
configHomogenizations => config_material%get('homogenization')
|
||||||
|
allocate(param(configHomogenizations%length))
|
||||||
|
allocate(current(configHomogenizations%length))
|
||||||
|
|
||||||
|
do ho = 1, configHomogenizations%length
|
||||||
|
allocate(current(ho)%T(count(material_homogenizationAt2==ho)), source=thermal_initialT(ho))
|
||||||
|
allocate(current(ho)%dot_T(count(material_homogenizationAt2==ho)), source=0.0_pReal)
|
||||||
|
configHomogenization => configHomogenizations%get(ho)
|
||||||
|
associate(prm => param(ho))
|
||||||
|
if (configHomogenization%contains('thermal')) then
|
||||||
|
configHomogenizationThermal => configHomogenization%get('thermal')
|
||||||
|
#if defined (__GFORTRAN__)
|
||||||
|
prm%output = output_asStrings(configHomogenizationThermal)
|
||||||
|
#else
|
||||||
|
prm%output = configHomogenizationThermal%get_asStrings('output',defaultVal=emptyStringArray)
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
prm%output = emptyStringArray
|
||||||
|
endif
|
||||||
|
end associate
|
||||||
|
enddo
|
||||||
|
|
||||||
end subroutine thermal_init
|
end subroutine thermal_init
|
||||||
|
|
||||||
|
@ -23,15 +65,18 @@ end subroutine thermal_init
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief Partition temperature onto the individual constituents.
|
!> @brief Partition temperature onto the individual constituents.
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module subroutine thermal_partition(T,ce)
|
module subroutine thermal_partition(ce)
|
||||||
|
|
||||||
real(pReal), intent(in) :: T
|
|
||||||
integer, intent(in) :: ce
|
integer, intent(in) :: ce
|
||||||
|
|
||||||
|
real(pReal) :: T, dot_T
|
||||||
integer :: co
|
integer :: co
|
||||||
|
|
||||||
|
|
||||||
|
T = current(material_homogenizationAt2(ce))%T(material_homogenizationMemberAt2(ce))
|
||||||
|
dot_T = current(material_homogenizationAt2(ce))%dot_T(material_homogenizationMemberAt2(ce))
|
||||||
do co = 1, homogenization_Nconstituents(material_homogenizationAt2(ce))
|
do co = 1, homogenization_Nconstituents(material_homogenizationAt2(ce))
|
||||||
call constitutive_thermal_setT(T,co,ce)
|
call constitutive_thermal_setField(T,dot_T,co,ce)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
end subroutine thermal_partition
|
end subroutine thermal_partition
|
||||||
|
@ -44,9 +89,151 @@ module subroutine thermal_homogenize(ip,el)
|
||||||
|
|
||||||
integer, intent(in) :: ip,el
|
integer, intent(in) :: ip,el
|
||||||
|
|
||||||
call constitutive_thermal_getRate(homogenization_dot_T((el-1)*discretization_nIPs+ip), ip,el)
|
!call constitutive_thermal_getRate(homogenization_dot_T((el-1)*discretization_nIPs+ip), ip,el)
|
||||||
|
|
||||||
end subroutine thermal_homogenize
|
end subroutine thermal_homogenize
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief return homogenized thermal conductivity in reference configuration
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module function thermal_conduction_getConductivity(ip,el) result(K)
|
||||||
|
|
||||||
|
integer, intent(in) :: &
|
||||||
|
ip, & !< integration point number
|
||||||
|
el !< element number
|
||||||
|
real(pReal), dimension(3,3) :: K
|
||||||
|
|
||||||
|
integer :: &
|
||||||
|
co
|
||||||
|
|
||||||
|
|
||||||
|
K = 0.0_pReal
|
||||||
|
|
||||||
|
do co = 1, homogenization_Nconstituents(material_homogenizationAt(el))
|
||||||
|
K = K + crystallite_push33ToRef(co,ip,el,lattice_K(:,:,material_phaseAt(co,el)))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
K = K / real(homogenization_Nconstituents(material_homogenizationAt(el)),pReal)
|
||||||
|
|
||||||
|
end function thermal_conduction_getConductivity
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief returns homogenized specific heat capacity
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module function thermal_conduction_getSpecificHeat(ce) result(c_P)
|
||||||
|
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: c_P
|
||||||
|
|
||||||
|
integer :: co
|
||||||
|
|
||||||
|
|
||||||
|
c_P = 0.0_pReal
|
||||||
|
|
||||||
|
do co = 1, homogenization_Nconstituents(material_homogenizationAt2(ce))
|
||||||
|
c_P = c_P + lattice_c_p(material_phaseAt2(co,ce))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
c_P = c_P / real(homogenization_Nconstituents(material_homogenizationAt2(ce)),pReal)
|
||||||
|
|
||||||
|
end function thermal_conduction_getSpecificHeat
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief returns homogenized mass density
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module function thermal_conduction_getMassDensity(ce) result(rho)
|
||||||
|
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: rho
|
||||||
|
|
||||||
|
integer :: co
|
||||||
|
|
||||||
|
|
||||||
|
rho = 0.0_pReal
|
||||||
|
|
||||||
|
do co = 1, homogenization_Nconstituents(material_homogenizationAt2(ce))
|
||||||
|
rho = rho + lattice_rho(material_phaseAt2(co,ce))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
rho = rho / real(homogenization_Nconstituents(material_homogenizationAt2(ce)),pReal)
|
||||||
|
|
||||||
|
end function thermal_conduction_getMassDensity
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief Set thermal field and its rate (T and dot_T)
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module subroutine homogenization_thermal_setField(T,dot_T, ce)
|
||||||
|
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal), intent(in) :: T, dot_T
|
||||||
|
|
||||||
|
|
||||||
|
current(material_homogenizationAt2(ce))%T(material_homogenizationMemberAt2(ce)) = T
|
||||||
|
current(material_homogenizationAt2(ce))%dot_T(material_homogenizationMemberAt2(ce)) = dot_T
|
||||||
|
|
||||||
|
|
||||||
|
end subroutine homogenization_thermal_setField
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief writes results to HDF5 output file
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module subroutine thermal_conduction_results(ho,group)
|
||||||
|
|
||||||
|
integer, intent(in) :: ho
|
||||||
|
character(len=*), intent(in) :: group
|
||||||
|
|
||||||
|
integer :: o
|
||||||
|
|
||||||
|
associate(prm => param(ho))
|
||||||
|
outputsLoop: do o = 1,size(prm%output)
|
||||||
|
select case(trim(prm%output(o)))
|
||||||
|
case('T')
|
||||||
|
call results_writeDataset(group,current(ho)%T,'T','temperature','K')
|
||||||
|
end select
|
||||||
|
enddo outputsLoop
|
||||||
|
end associate
|
||||||
|
|
||||||
|
end subroutine thermal_conduction_results
|
||||||
|
|
||||||
|
|
||||||
|
module function homogenization_thermal_T(ce) result(T)
|
||||||
|
|
||||||
|
integer, intent(in) :: ce
|
||||||
|
real(pReal) :: T
|
||||||
|
|
||||||
|
T = current(material_homogenizationAt2(ce))%T(material_homogenizationMemberAt2(ce))
|
||||||
|
|
||||||
|
end function homogenization_thermal_T
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
!> @brief return heat generation rate
|
||||||
|
!--------------------------------------------------------------------------------------------------
|
||||||
|
module subroutine thermal_conduction_getSource(Tdot, ip,el)
|
||||||
|
|
||||||
|
integer, intent(in) :: &
|
||||||
|
ip, & !< integration point number
|
||||||
|
el !< element number
|
||||||
|
real(pReal), intent(out) :: &
|
||||||
|
Tdot
|
||||||
|
|
||||||
|
integer :: &
|
||||||
|
homog
|
||||||
|
|
||||||
|
homog = material_homogenizationAt(el)
|
||||||
|
call constitutive_thermal_getRate(TDot, ip,el)
|
||||||
|
|
||||||
|
Tdot = Tdot/real(homogenization_Nconstituents(homog),pReal)
|
||||||
|
|
||||||
|
end subroutine thermal_conduction_getSource
|
||||||
|
|
||||||
|
|
||||||
end submodule homogenization_thermal
|
end submodule homogenization_thermal
|
||||||
|
|
|
@ -84,12 +84,9 @@ end function kinematics_thermal_expansion_init
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
!> @brief constitutive equation for calculating the velocity gradient
|
!> @brief constitutive equation for calculating the velocity gradient
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
module subroutine kinematics_thermal_expansion_LiAndItsTangent(Li, dLi_dTstar, co, ip, el)
|
module subroutine kinematics_thermal_expansion_LiAndItsTangent(Li, dLi_dTstar, ph,me)
|
||||||
|
|
||||||
integer, intent(in) :: &
|
integer, intent(in) :: ph, me
|
||||||
co, & !< grain number
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), intent(out), dimension(3,3) :: &
|
real(pReal), intent(out), dimension(3,3) :: &
|
||||||
Li !< thermal velocity gradient
|
Li !< thermal velocity gradient
|
||||||
real(pReal), intent(out), dimension(3,3,3,3) :: &
|
real(pReal), intent(out), dimension(3,3,3,3) :: &
|
||||||
|
@ -98,16 +95,13 @@ module subroutine kinematics_thermal_expansion_LiAndItsTangent(Li, dLi_dTstar, c
|
||||||
integer :: &
|
integer :: &
|
||||||
phase, &
|
phase, &
|
||||||
homog
|
homog
|
||||||
real(pReal) :: &
|
real(pReal) :: T, dot_T
|
||||||
T, TDot
|
|
||||||
|
|
||||||
phase = material_phaseAt(co,el)
|
T = current(ph)%T(me)
|
||||||
homog = material_homogenizationAt(el)
|
dot_T = current(ph)%dot_T(me)
|
||||||
T = temperature(homog)%p(material_homogenizationMemberAt(ip,el))
|
|
||||||
TDot = temperatureRate(homog)%p(material_homogenizationMemberAt(ip,el))
|
|
||||||
|
|
||||||
associate(prm => param(kinematics_thermal_expansion_instance(phase)))
|
associate(prm => param(kinematics_thermal_expansion_instance(ph)))
|
||||||
Li = TDot * ( &
|
Li = dot_T * ( &
|
||||||
prm%A(1:3,1:3,1)*(T - prm%T_ref)**0 & ! constant coefficient
|
prm%A(1:3,1:3,1)*(T - prm%T_ref)**0 & ! constant coefficient
|
||||||
+ prm%A(1:3,1:3,2)*(T - prm%T_ref)**1 & ! linear coefficient
|
+ prm%A(1:3,1:3,2)*(T - prm%T_ref)**1 & ! linear coefficient
|
||||||
+ prm%A(1:3,1:3,3)*(T - prm%T_ref)**2 & ! quadratic coefficient
|
+ prm%A(1:3,1:3,3)*(T - prm%T_ref)**2 & ! quadratic coefficient
|
||||||
|
|
|
@ -71,9 +71,7 @@ module material
|
||||||
material_orientation0 !< initial orientation of each grain,IP,element
|
material_orientation0 !< initial orientation of each grain,IP,element
|
||||||
|
|
||||||
type(group_float), allocatable, dimension(:), public :: &
|
type(group_float), allocatable, dimension(:), public :: &
|
||||||
temperature, & !< temperature field
|
damage !< damage field
|
||||||
damage, & !< damage field
|
|
||||||
temperatureRate !< temperature change rate field
|
|
||||||
|
|
||||||
public :: &
|
public :: &
|
||||||
material_init, &
|
material_init, &
|
||||||
|
@ -107,9 +105,7 @@ subroutine material_init(restart)
|
||||||
allocate(homogState (size(material_name_homogenization)))
|
allocate(homogState (size(material_name_homogenization)))
|
||||||
allocate(damageState_h (size(material_name_homogenization)))
|
allocate(damageState_h (size(material_name_homogenization)))
|
||||||
|
|
||||||
allocate(temperature (size(material_name_homogenization)))
|
|
||||||
allocate(damage (size(material_name_homogenization)))
|
allocate(damage (size(material_name_homogenization)))
|
||||||
allocate(temperatureRate (size(material_name_homogenization)))
|
|
||||||
|
|
||||||
|
|
||||||
if (.not. restart) then
|
if (.not. restart) then
|
||||||
|
|
|
@ -1,242 +0,0 @@
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @author Pratheek Shanthraj, Max-Planck-Institut für Eisenforschung GmbH
|
|
||||||
!> @brief material subroutine for temperature evolution from heat conduction
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
module thermal_conduction
|
|
||||||
use prec
|
|
||||||
use material
|
|
||||||
use config
|
|
||||||
use lattice
|
|
||||||
use results
|
|
||||||
use constitutive
|
|
||||||
use YAML_types
|
|
||||||
use discretization
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
private
|
|
||||||
|
|
||||||
type :: tParameters
|
|
||||||
character(len=pStringLen), allocatable, dimension(:) :: &
|
|
||||||
output
|
|
||||||
end type tParameters
|
|
||||||
|
|
||||||
type(tparameters), dimension(:), allocatable :: &
|
|
||||||
param
|
|
||||||
|
|
||||||
public :: &
|
|
||||||
thermal_conduction_init, &
|
|
||||||
thermal_conduction_getSource, &
|
|
||||||
thermal_conduction_getConductivity, &
|
|
||||||
thermal_conduction_getSpecificHeat, &
|
|
||||||
thermal_conduction_getMassDensity, &
|
|
||||||
thermal_conduction_putTemperatureAndItsRate, &
|
|
||||||
thermal_conduction_results
|
|
||||||
|
|
||||||
contains
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief module initialization
|
|
||||||
!> @details reads in material parameters, allocates arrays, and does sanity checks
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine thermal_conduction_init(T)
|
|
||||||
|
|
||||||
real(pReal), dimension(:), intent(inout) :: T
|
|
||||||
|
|
||||||
integer :: Ninstances,Nmaterialpoints,ho,ip,el,ce
|
|
||||||
class(tNode), pointer :: &
|
|
||||||
material_homogenization, &
|
|
||||||
homog, &
|
|
||||||
homogThermal
|
|
||||||
|
|
||||||
|
|
||||||
print'(/,a)', ' <<<+- thermal_conduction init -+>>>'; flush(6)
|
|
||||||
|
|
||||||
Ninstances = count(thermal_type == THERMAL_conduction_ID)
|
|
||||||
allocate(param(Ninstances))
|
|
||||||
|
|
||||||
material_homogenization => config_material%get('homogenization')
|
|
||||||
do ho = 1, size(material_name_homogenization)
|
|
||||||
if (thermal_type(ho) /= THERMAL_conduction_ID) cycle
|
|
||||||
homog => material_homogenization%get(ho)
|
|
||||||
homogThermal => homog%get('thermal')
|
|
||||||
associate(prm => param(thermal_typeInstance(ho)))
|
|
||||||
|
|
||||||
#if defined (__GFORTRAN__)
|
|
||||||
prm%output = output_asStrings(homogThermal)
|
|
||||||
#else
|
|
||||||
prm%output = homogThermal%get_asStrings('output',defaultVal=emptyStringArray)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Nmaterialpoints=count(material_homogenizationAt==ho)
|
|
||||||
|
|
||||||
allocate (temperature (ho)%p(Nmaterialpoints), source=thermal_initialT(ho))
|
|
||||||
allocate (temperatureRate(ho)%p(Nmaterialpoints), source=0.0_pReal)
|
|
||||||
|
|
||||||
end associate
|
|
||||||
enddo
|
|
||||||
|
|
||||||
ce = 0
|
|
||||||
do el = 1, discretization_Nelems
|
|
||||||
do ip = 1, discretization_nIPs
|
|
||||||
ce = ce + 1
|
|
||||||
ho = material_homogenizationAt(el)
|
|
||||||
if (thermal_type(ho) == THERMAL_conduction_ID) T(ce) = thermal_initialT(ho)
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
end subroutine thermal_conduction_init
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief return heat generation rate
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine thermal_conduction_getSource(Tdot, ip,el)
|
|
||||||
|
|
||||||
integer, intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), intent(out) :: &
|
|
||||||
Tdot
|
|
||||||
|
|
||||||
integer :: &
|
|
||||||
homog
|
|
||||||
|
|
||||||
homog = material_homogenizationAt(el)
|
|
||||||
call constitutive_thermal_getRate(TDot, ip,el)
|
|
||||||
|
|
||||||
Tdot = Tdot/real(homogenization_Nconstituents(homog),pReal)
|
|
||||||
|
|
||||||
end subroutine thermal_conduction_getSource
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief return homogenized thermal conductivity in reference configuration
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
function thermal_conduction_getConductivity(ip,el)
|
|
||||||
|
|
||||||
integer, intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), dimension(3,3) :: &
|
|
||||||
thermal_conduction_getConductivity
|
|
||||||
|
|
||||||
integer :: &
|
|
||||||
co
|
|
||||||
|
|
||||||
|
|
||||||
thermal_conduction_getConductivity = 0.0_pReal
|
|
||||||
|
|
||||||
do co = 1, homogenization_Nconstituents(material_homogenizationAt(el))
|
|
||||||
thermal_conduction_getConductivity = thermal_conduction_getConductivity + &
|
|
||||||
crystallite_push33ToRef(co,ip,el,lattice_K(:,:,material_phaseAt(co,el)))
|
|
||||||
enddo
|
|
||||||
|
|
||||||
thermal_conduction_getConductivity = thermal_conduction_getConductivity &
|
|
||||||
/ real(homogenization_Nconstituents(material_homogenizationAt(el)),pReal)
|
|
||||||
|
|
||||||
end function thermal_conduction_getConductivity
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief returns homogenized specific heat capacity
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
function thermal_conduction_getSpecificHeat(ip,el)
|
|
||||||
|
|
||||||
integer, intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal) :: &
|
|
||||||
thermal_conduction_getSpecificHeat
|
|
||||||
|
|
||||||
integer :: &
|
|
||||||
co
|
|
||||||
|
|
||||||
|
|
||||||
thermal_conduction_getSpecificHeat = 0.0_pReal
|
|
||||||
|
|
||||||
do co = 1, homogenization_Nconstituents(material_homogenizationAt(el))
|
|
||||||
thermal_conduction_getSpecificHeat = thermal_conduction_getSpecificHeat &
|
|
||||||
+ lattice_c_p(material_phaseAt(co,el))
|
|
||||||
enddo
|
|
||||||
|
|
||||||
thermal_conduction_getSpecificHeat = thermal_conduction_getSpecificHeat &
|
|
||||||
/ real(homogenization_Nconstituents(material_homogenizationAt(el)),pReal)
|
|
||||||
|
|
||||||
end function thermal_conduction_getSpecificHeat
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief returns homogenized mass density
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
function thermal_conduction_getMassDensity(ip,el)
|
|
||||||
|
|
||||||
integer, intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal) :: &
|
|
||||||
thermal_conduction_getMassDensity
|
|
||||||
|
|
||||||
integer :: &
|
|
||||||
co
|
|
||||||
|
|
||||||
|
|
||||||
thermal_conduction_getMassDensity = 0.0_pReal
|
|
||||||
|
|
||||||
do co = 1, homogenization_Nconstituents(material_homogenizationAt(el))
|
|
||||||
thermal_conduction_getMassDensity = thermal_conduction_getMassDensity &
|
|
||||||
+ lattice_rho(material_phaseAt(co,el))
|
|
||||||
enddo
|
|
||||||
|
|
||||||
thermal_conduction_getMassDensity = thermal_conduction_getMassDensity &
|
|
||||||
/ real(homogenization_Nconstituents(material_homogenizationAt(el)),pReal)
|
|
||||||
|
|
||||||
end function thermal_conduction_getMassDensity
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief updates thermal state with solution from heat conduction PDE
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine thermal_conduction_putTemperatureAndItsRate(T,Tdot,ip,el)
|
|
||||||
|
|
||||||
integer, intent(in) :: &
|
|
||||||
ip, & !< integration point number
|
|
||||||
el !< element number
|
|
||||||
real(pReal), intent(in) :: &
|
|
||||||
T, &
|
|
||||||
Tdot
|
|
||||||
integer :: &
|
|
||||||
homog, &
|
|
||||||
offset
|
|
||||||
|
|
||||||
homog = material_homogenizationAt(el)
|
|
||||||
offset = material_homogenizationMemberAt(ip,el)
|
|
||||||
temperature (homog)%p(offset) = T
|
|
||||||
temperatureRate(homog)%p(offset) = Tdot
|
|
||||||
|
|
||||||
end subroutine thermal_conduction_putTemperatureAndItsRate
|
|
||||||
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief writes results to HDF5 output file
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine thermal_conduction_results(homog,group)
|
|
||||||
|
|
||||||
integer, intent(in) :: homog
|
|
||||||
character(len=*), intent(in) :: group
|
|
||||||
|
|
||||||
integer :: o
|
|
||||||
|
|
||||||
associate(prm => param(damage_typeInstance(homog)))
|
|
||||||
outputsLoop: do o = 1,size(prm%output)
|
|
||||||
select case(trim(prm%output(o)))
|
|
||||||
case('T')
|
|
||||||
call results_writeDataset(group,temperature(homog)%p,'T',&
|
|
||||||
'temperature','K')
|
|
||||||
end select
|
|
||||||
enddo outputsLoop
|
|
||||||
end associate
|
|
||||||
|
|
||||||
end subroutine thermal_conduction_results
|
|
||||||
|
|
||||||
end module thermal_conduction
|
|
|
@ -1,48 +0,0 @@
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @author Pratheek Shanthraj, Max-Planck-Institut für Eisenforschung GmbH
|
|
||||||
!> @brief material subroutine for isothermal temperature field
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
module thermal_isothermal
|
|
||||||
use prec
|
|
||||||
use config
|
|
||||||
use material
|
|
||||||
use discretization
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
public
|
|
||||||
|
|
||||||
contains
|
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
!> @brief allocates fields, reads information from material configuration file
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
|
||||||
subroutine thermal_isothermal_init(T)
|
|
||||||
|
|
||||||
real(pReal), dimension(:), intent(inout) :: T
|
|
||||||
|
|
||||||
integer :: Ninstances,Nmaterialpoints,ho,ip,el,ce
|
|
||||||
|
|
||||||
print'(/,a)', ' <<<+- thermal_isothermal init -+>>>'; flush(6)
|
|
||||||
|
|
||||||
do ho = 1, size(thermal_type)
|
|
||||||
if (thermal_type(ho) /= THERMAL_isothermal_ID) cycle
|
|
||||||
|
|
||||||
Nmaterialpoints = count(material_homogenizationAt == ho)
|
|
||||||
|
|
||||||
allocate(temperature (ho)%p(Nmaterialpoints),source=thermal_initialT(ho))
|
|
||||||
allocate(temperatureRate(ho)%p(Nmaterialpoints),source = 0.0_pReal)
|
|
||||||
|
|
||||||
enddo
|
|
||||||
|
|
||||||
ce = 0
|
|
||||||
do el = 1, discretization_Nelems
|
|
||||||
do ip = 1, discretization_nIPs
|
|
||||||
ce = ce + 1
|
|
||||||
ho = material_homogenizationAt(el)
|
|
||||||
if (thermal_type(ho) == THERMAL_isothermal_ID) T(ce) = thermal_initialT(ho)
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
end subroutine thermal_isothermal_init
|
|
||||||
|
|
||||||
end module thermal_isothermal
|
|
Loading…
Reference in New Issue