From 320f39925ae884f0492946679ddf2ff3c24b828f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 Mar 2019 11:18:59 +0100 Subject: [PATCH] modernized - no pInt - consistent indentation by 2 spaces - no leftovers from old file parsing --- src/constitutive.f90 | 3 +- src/source_thermal_externalheat.f90 | 135 +++++++++++++--------------- 2 files changed, 64 insertions(+), 74 deletions(-) diff --git a/src/constitutive.f90 b/src/constitutive.f90 index dfe8679c3..96b29d846 100644 --- a/src/constitutive.f90 +++ b/src/constitutive.f90 @@ -877,7 +877,8 @@ subroutine constitutive_collectDotState(S, FeArray, Fi, FpArray, subdt, ipc, ip, call source_damage_anisoDuctile_dotState ( ipc, ip, el) case (SOURCE_thermal_externalheat_ID) sourceType - call source_thermal_externalheat_dotState( ipc, ip, el) + of = phasememberAt(ipc,ip,el) + call source_thermal_externalheat_dotState(material_phase(ipc,ip,el),of) end select sourceType diff --git a/src/source_thermal_externalheat.f90 b/src/source_thermal_externalheat.f90 index 3723d6196..377513c57 100644 --- a/src/source_thermal_externalheat.f90 +++ b/src/source_thermal_externalheat.f90 @@ -6,29 +6,28 @@ !-------------------------------------------------------------------------------------------------- module source_thermal_externalheat use prec, only: & - pReal, & - pInt + pReal implicit none private - integer(pInt), dimension(:), allocatable, public, protected :: & + integer, dimension(:), allocatable, public, protected :: & source_thermal_externalheat_offset, & !< which source is my current thermal dissipation mechanism? source_thermal_externalheat_instance !< instance of thermal dissipation source mechanism - integer(pInt), dimension(:,:), allocatable, target, public :: & + integer, dimension(:,:), allocatable, target, public :: & source_thermal_externalheat_sizePostResult !< size of each post result output - character(len=64), dimension(:,:), allocatable, target, public :: & + character(len=64), dimension(:,:), allocatable, target, public :: & source_thermal_externalheat_output !< name of each post result output - integer(pInt), dimension(:), allocatable, target, public :: & + integer, dimension(:), allocatable, target, public :: & source_thermal_externalheat_Noutput !< number of outputs per instance of this source type, private :: tParameters !< container type for internal constitutive parameters real(pReal), dimension(:), allocatable :: & time, & heat_rate - integer(pInt) :: & + integer :: & nIntervals end type tParameters @@ -66,20 +65,18 @@ subroutine source_thermal_externalheat_init implicit none - real(pReal), allocatable, dimension(:) :: tempVar - integer(pInt) :: maxNinstance,instance,source,sourceOffset - integer(pInt) :: NofMyPhase,p + integer :: maxNinstance,instance,source,sourceOffset,NofMyPhase,p write(6,'(/,a)') ' <<<+- source_'//SOURCE_thermal_externalheat_label//' init -+>>>' - maxNinstance = int(count(phase_source == SOURCE_thermal_externalheat_ID),pInt) - if (maxNinstance == 0_pInt) return - if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0_pInt) & + maxNinstance = count(phase_source == SOURCE_thermal_externalheat_ID) + if (maxNinstance == 0) return + if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0) & write(6,'(a16,1x,i5,/)') '# instances:',maxNinstance - allocate(source_thermal_externalheat_offset(material_Nphase), source=0_pInt) - allocate(source_thermal_externalheat_instance(material_Nphase), source=0_pInt) + allocate(source_thermal_externalheat_offset(material_Nphase), source=0) + allocate(source_thermal_externalheat_instance(material_Nphase), source=0) do p = 1, material_Nphase source_thermal_externalheat_instance(p) = count(phase_source(:,1:p) == SOURCE_thermal_externalheat_ID) @@ -89,10 +86,10 @@ subroutine source_thermal_externalheat_init enddo enddo - allocate(source_thermal_externalheat_sizePostResult(maxval(phase_Noutput),maxNinstance),source=0_pInt) + allocate(source_thermal_externalheat_sizePostResult(maxval(phase_Noutput),maxNinstance),source=0) allocate(source_thermal_externalheat_output (maxval(phase_Noutput),maxNinstance)) source_thermal_externalheat_output = '' - allocate(source_thermal_externalheat_Noutput(maxNinstance), source=0_pInt) + allocate(source_thermal_externalheat_Noutput(maxNinstance), source=0) allocate(param(maxNinstance)) @@ -102,15 +99,13 @@ subroutine source_thermal_externalheat_init sourceOffset = source_thermal_externalheat_offset(p) NofMyPhase=count(material_phase==p) - tempVar = config_phase(p)%getFloats('externalheat_time') - param(instance)%nIntervals = size(tempVar) - 1_pInt + param(instance)%time = config_phase(p)%getFloats('externalheat_time') + param(instance)%nIntervals = size(param(instance)%time) - 1 - param(instance)%time= tempVar - tempVar = config_phase(p)%getFloats('externalheat_rate',requiredSize = size(tempVar)) - param(instance)%heat_rate = tempVar + param(instance)%heat_rate = config_phase(p)%getFloats('externalheat_rate',requiredSize = size(param(instance)%time)) - call material_allocateSourceState(p,sourceOffset,NofMyPhase,1_pInt,1_pInt,0_pInt) + call material_allocateSourceState(p,sourceOffset,NofMyPhase,1,1,0) enddo @@ -121,64 +116,58 @@ end subroutine source_thermal_externalheat_init !> @brief rate of change of state !> @details state only contains current time to linearly interpolate given heat powers !-------------------------------------------------------------------------------------------------- -subroutine source_thermal_externalheat_dotState(ipc, ip, el) - use material, only: & - phaseAt, phasememberAt, & - sourceState - - implicit none - integer(pInt), intent(in) :: & - ipc, & !< component-ID of integration point - ip, & !< integration point - el !< element - integer(pInt) :: & - phase, & - constituent, & - sourceOffset - - phase = phaseAt(ipc,ip,el) - constituent = phasememberAt(ipc,ip,el) - sourceOffset = source_thermal_externalheat_offset(phase) +subroutine source_thermal_externalheat_dotState(phase, of) + use material, only: & + sourceState - sourceState(phase)%p(sourceOffset)%dotState(1,constituent) = 1.0_pReal ! state is current time + implicit none + integer, intent(in) :: & + phase, & + of + integer :: & + sourceOffset + + sourceOffset = source_thermal_externalheat_offset(phase) + + sourceState(phase)%p(sourceOffset)%dotState(1,of) = 1.0_pReal ! state is current time end subroutine source_thermal_externalheat_dotState !-------------------------------------------------------------------------------------------------- !> @brief returns local heat generation rate !-------------------------------------------------------------------------------------------------- -subroutine source_thermal_externalheat_getRateAndItsTangent(TDot, dTDot_dT, phase, constituent) - use material, only: & - sourceState - - implicit none - integer(pInt), intent(in) :: & - phase, & - constituent - real(pReal), intent(out) :: & - TDot, & - dTDot_dT - integer(pInt) :: & - instance, sourceOffset, interval - real(pReal) :: & - frac_time - - instance = source_thermal_externalheat_instance(phase) - sourceOffset = source_thermal_externalheat_offset(phase) - - do interval = 1, param(instance)%nIntervals ! scan through all rate segments - frac_time = (sourceState(phase)%p(sourceOffset)%state(1,constituent) - & - param(instance)%time(interval)) / & - (param(instance)%time(interval+1) - & - param(instance)%time(interval)) ! fractional time within segment - if ( (frac_time < 0.0_pReal .and. interval == 1) & - .or. (frac_time >= 1.0_pReal .and. interval == param(instance)%nIntervals) & - .or. (frac_time >= 0.0_pReal .and. frac_time < 1.0_pReal) ) & - TDot = param(instance)%heat_rate(interval ) * (1.0_pReal - frac_time) + & - param(instance)%heat_rate(interval+1) * frac_time ! interpolate heat rate between segment boundaries... +subroutine source_thermal_externalheat_getRateAndItsTangent(TDot, dTDot_dT, phase, of) + use material, only: & + sourceState + + implicit none + integer, intent(in) :: & + phase, & + of + real(pReal), intent(out) :: & + TDot, & + dTDot_dT + integer :: & + instance, sourceOffset, interval + real(pReal) :: & + frac_time + + instance = source_thermal_externalheat_instance(phase) + sourceOffset = source_thermal_externalheat_offset(phase) + + do interval = 1, param(instance)%nIntervals ! scan through all rate segments + frac_time = (sourceState(phase)%p(sourceOffset)%state(1,of) - & + param(instance)%time(interval)) / & + (param(instance)%time(interval+1) - & + param(instance)%time(interval)) ! fractional time within segment + if ( (frac_time < 0.0_pReal .and. interval == 1) & + .or. (frac_time >= 1.0_pReal .and. interval == param(instance)%nIntervals) & + .or. (frac_time >= 0.0_pReal .and. frac_time < 1.0_pReal) ) & + TDot = param(instance)%heat_rate(interval ) * (1.0_pReal - frac_time) + & + param(instance)%heat_rate(interval+1) * frac_time ! interpolate heat rate between segment boundaries... ! ...or extrapolate if outside of bounds - enddo - dTDot_dT = 0.0 + enddo + dTDot_dT = 0.0 end subroutine source_thermal_externalheat_getRateAndItsTangent