2012-10-11 20:19:12 +05:30
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
2015-10-14 00:22:01 +05:30
!> @brief material subroutine for phenomenological crystal plasticity formulation using a powerlaw
2013-07-01 11:40:42 +05:30
!! fitting
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
module plastic_phenopowerlaw
2013-07-01 11:40:42 +05:30
use prec , only : &
pReal , &
2013-09-18 19:37:55 +05:30
pInt
2009-07-22 21:37:19 +05:30
2012-03-09 01:55:28 +05:30
implicit none
2012-04-11 19:31:02 +05:30
private
2013-12-12 03:33:09 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , public , protected :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_sizePostResults !< cumulative size of post results
2012-04-11 19:31:02 +05:30
2013-12-12 03:33:09 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable , target , public :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_sizePostResult !< size of each post result output
2013-07-01 11:40:42 +05:30
2015-10-14 00:22:01 +05:30
character ( len = 64 ) , dimension ( : , : ) , allocatable , target , public :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_output !< name of each post result output
2013-07-01 11:40:42 +05:30
2014-09-26 15:55:26 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , target , public :: &
2015-10-14 00:22:01 +05:30
plastic_phenopowerlaw_Noutput !< number of outputs per instance of this constitution
2014-09-26 15:55:26 +05:30
2018-04-25 23:11:18 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , private :: &
totalNslip , & !< no. of slip system used in simulation
totalNtwin !< no. of twin system used in simulation
2012-03-09 01:55:28 +05:30
2018-04-24 21:01:05 +05:30
2012-03-09 01:55:28 +05:30
2018-04-25 23:11:18 +05:30
real ( pReal ) , dimension ( : , : , : ) , allocatable , private :: &
interaction_SlipSlip , & !< interaction factors slip - slip (input parameter)
interaction_SlipTwin , & !< interaction factors slip - twin (input parameter)
interaction_TwinSlip , & !< interaction factors twin - slip (input parameter)
interaction_TwinTwin !< interaction factors twin - twin (input parameter)
2012-03-09 01:55:28 +05:30
2014-03-09 02:20:31 +05:30
2015-10-14 00:22:01 +05:30
enum , bind ( c )
2013-12-12 03:33:09 +05:30
enumerator :: undefined_ID , &
resistance_slip_ID , &
2013-11-27 17:09:28 +05:30
accumulatedshear_slip_ID , &
shearrate_slip_ID , &
resolvedstress_slip_ID , &
totalshear_ID , &
resistance_twin_ID , &
accumulatedshear_twin_ID , &
shearrate_twin_ID , &
resolvedstress_twin_ID , &
2014-11-21 14:24:20 +05:30
totalvolfrac_twin_ID
2013-11-27 17:09:28 +05:30
end enum
2015-10-14 00:22:01 +05:30
integer ( kind ( undefined_ID ) ) , dimension ( : , : ) , allocatable , private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID !< ID of each post result output
2015-10-14 00:22:01 +05:30
2018-04-24 21:01:05 +05:30
type , private :: tParameters !< container type for internal constitutive parameters
real ( pReal ) :: &
gdot0_slip , & !< reference shear strain rate for slip
gdot0_twin , & !< reference shear strain rate for twin
n_slip , & !< stress exponent for slip
n_twin , & !< stress exponent for twin
spr , & !< push-up factor for slip saturation due to twinning
twinB , &
twinC , &
twinD , &
twinE , &
h0_SlipSlip , & !< reference hardening slip - slip
h0_TwinSlip , & !< reference hardening twin - slip
h0_TwinTwin , & !< reference hardening twin - twin
a_slip , &
aTolResistance = 1.0_pReal , & ! default absolute tolerance 1 Pa
aTolShear = 1.0e-6_pReal , & ! default absolute tolerance 1e-6
aTolTwinfrac = 1.0e-6_pReal ! default absolute tolerance 1e-6
integer ( pInt ) , dimension ( : ) , allocatable :: &
Nslip , & !< active number of slip systems per family
Ntwin !< active number of twin systems per family
real ( pReal ) , dimension ( : ) , allocatable :: &
tau0_slip , & !< initial critical shear stress for slip
tau0_twin , & !< initial critical shear stress for twin
tausat_slip , & !< maximum critical shear stress for slip
nonSchmidCoeff , &
H_int , & !< per family hardening activity (optional)
interaction_SlipSlip , & !< slip resistance from slip activity
interaction_SlipTwin , & !< slip resistance from twin activity
interaction_TwinSlip , & !< twin resistance from slip activity
interaction_TwinTwin !< twin resistance from twin activity
end type
type ( tParameters ) , dimension ( : ) , allocatable , private :: param !< containers of constitutive parameters (len Ninstance)
2015-10-30 21:18:30 +05:30
type , private :: tPhenopowerlawState
real ( pReal ) , pointer , dimension ( : , : ) :: &
s_slip , &
s_twin , &
accshear_slip , &
accshear_twin
real ( pReal ) , pointer , dimension ( : ) :: &
sumGamma , &
sumF
end type
type ( tPhenopowerlawState ) , allocatable , dimension ( : ) , private :: &
dotState , &
2018-04-25 23:11:18 +05:30
state
2015-10-30 21:18:30 +05:30
2012-04-11 19:31:02 +05:30
public :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_init , &
plastic_phenopowerlaw_LpAndItsTangent , &
plastic_phenopowerlaw_dotState , &
plastic_phenopowerlaw_postResults
2014-05-22 20:46:05 +05:30
2012-03-09 01:55:28 +05:30
contains
2009-07-22 21:37:19 +05:30
2013-07-01 11:40:42 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2013-07-01 11:40:42 +05:30
!> @brief module initialization
!> @details reads in material parameters, allocates arrays, and does sanity checks
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
subroutine plastic_phenopowerlaw_init ( fileUnit )
2018-02-02 17:06:09 +05:30
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
2017-10-05 20:05:34 +05:30
use , intrinsic :: iso_fortran_env , only : &
compiler_version , &
compiler_options
#endif
2016-05-29 14:15:03 +05:30
use prec , only : &
2016-10-29 13:09:08 +05:30
dEq0
2013-07-01 11:40:42 +05:30
use debug , only : &
debug_level , &
debug_constitutive , &
debug_levelBasic
2013-12-19 14:19:47 +05:30
use math , only : &
math_Mandel3333to66 , &
2018-04-25 23:11:18 +05:30
math_Voigt66to3333 , &
math_expand
2013-12-19 14:19:47 +05:30
use IO , only : &
IO_read , &
IO_lc , &
IO_getTag , &
IO_isBlank , &
IO_stringPos , &
IO_stringValue , &
IO_floatValue , &
IO_intValue , &
IO_warning , &
IO_error , &
IO_timeStamp , &
IO_EOF
use material , only : &
phase_plasticity , &
phase_plasticityInstance , &
phase_Noutput , &
PLASTICITY_PHENOPOWERLAW_label , &
PLASTICITY_PHENOPOWERLAW_ID , &
2014-07-02 17:57:39 +05:30
material_phase , &
2014-05-22 20:46:05 +05:30
plasticState , &
2013-12-19 14:19:47 +05:30
MATERIAL_partPhase
2013-02-08 21:25:53 +05:30
use lattice
2014-05-22 20:46:05 +05:30
use numerics , only : &
numerics_integrator
2009-10-21 18:40:12 +05:30
2012-03-09 01:55:28 +05:30
implicit none
2013-12-12 03:33:09 +05:30
integer ( pInt ) , intent ( in ) :: fileUnit
2013-07-01 11:40:42 +05:30
2015-08-28 13:08:48 +05:30
integer ( pInt ) , allocatable , dimension ( : ) :: chunkPos
2013-07-01 11:40:42 +05:30
integer ( pInt ) :: &
maxNinstance , &
2014-03-09 02:20:31 +05:30
instance , phase , j , k , f , o , &
2015-04-21 20:46:13 +05:30
Nchunks_SlipSlip = 0_pInt , Nchunks_SlipTwin = 0_pInt , &
Nchunks_TwinSlip = 0_pInt , Nchunks_TwinTwin = 0_pInt , &
Nchunks_SlipFamilies = 0_pInt , Nchunks_TwinFamilies = 0_pInt , &
Nchunks_TransFamilies = 0_pInt , Nchunks_nonSchmid = 0_pInt , &
2014-11-27 02:53:02 +05:30
NipcMyPhase , &
2015-01-05 00:56:33 +05:30
offset_slip , index_myFamily , index_otherFamily , &
2015-10-30 21:18:30 +05:30
mySize = 0_pInt , sizeState , sizeDotState , sizeDeltaState , &
startIndex , endIndex
2013-07-01 11:40:42 +05:30
character ( len = 65536 ) :: &
2018-04-25 23:11:18 +05:30
tag = '' , &
line = '' , &
extmsg = ''
character ( len = 64 ) :: &
2018-04-24 21:01:05 +05:30
outputtag = ''
2014-04-29 23:20:59 +05:30
real ( pReal ) , dimension ( : ) , allocatable :: tempPerSlip
2015-10-14 00:22:01 +05:30
2016-07-25 23:42:00 +05:30
write ( 6 , '(/,a)' ) ' <<<+- constitutive_' / / PLASTICITY_PHENOPOWERLAW_label / / ' init -+>>>'
write ( 6 , '(a15,a)' ) ' Current time: ' , IO_timeStamp ( )
2012-02-01 00:48:55 +05:30
#include "compilation_info.f90"
2015-10-14 00:22:01 +05:30
2013-11-27 13:34:05 +05:30
maxNinstance = int ( count ( phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID ) , pInt )
2013-07-01 11:40:42 +05:30
if ( maxNinstance == 0_pInt ) return
2009-10-16 01:32:52 +05:30
2013-07-01 11:40:42 +05:30
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) &
write ( 6 , '(a16,1x,i5,/)' ) '# instances:' , maxNinstance
2014-07-02 17:57:39 +05:30
2015-10-30 21:18:30 +05:30
allocate ( plastic_phenopowerlaw_sizePostResults ( maxNinstance ) , source = 0_pInt )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_sizePostResult ( maxval ( phase_Noutput ) , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0_pInt )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_output ( maxval ( phase_Noutput ) , maxNinstance ) )
plastic_phenopowerlaw_output = ''
2016-05-12 00:23:05 +05:30
allocate ( plastic_phenopowerlaw_outputID ( maxval ( phase_Noutput ) , maxNinstance ) , source = undefined_ID )
2018-04-24 21:01:05 +05:30
2016-05-12 00:23:05 +05:30
allocate ( plastic_phenopowerlaw_Noutput ( maxNinstance ) , source = 0_pInt )
2018-04-25 23:11:18 +05:30
allocate ( totalNslip ( maxNinstance ) , source = 0_pInt )
allocate ( totalNtwin ( maxNinstance ) , source = 0_pInt )
allocate ( param ( maxNinstance ) ) ! one container of parameters per instance
2013-12-12 03:33:09 +05:30
rewind ( fileUnit )
2014-03-09 02:20:31 +05:30
phase = 0_pInt
2013-12-19 14:19:47 +05:30
do while ( trim ( line ) / = IO_EOF . and . IO_lc ( IO_getTag ( line , '<' , '>' ) ) / = material_partPhase ) ! wind forward to <phase>
2013-12-12 03:33:09 +05:30
line = IO_read ( fileUnit )
2009-07-22 21:37:19 +05:30
enddo
2013-12-12 22:39:59 +05:30
2014-03-09 02:20:31 +05:30
parsingFile : do while ( trim ( line ) / = IO_EOF ) ! read through sections of phase part
2013-12-12 03:33:09 +05:30
line = IO_read ( fileUnit )
2012-10-11 20:19:12 +05:30
if ( IO_isBlank ( line ) ) cycle ! skip empty lines
2013-12-12 22:39:59 +05:30
if ( IO_getTag ( line , '<' , '>' ) / = '' ) then ! stop at next part
line = IO_read ( fileUnit , . true . ) ! reset IO_read
2015-10-14 00:22:01 +05:30
exit
2013-12-12 22:39:59 +05:30
endif
2014-03-09 02:20:31 +05:30
if ( IO_getTag ( line , '[' , ']' ) / = '' ) then ! next phase
phase = phase + 1_pInt ! advance phase section counter
if ( phase_plasticity ( phase ) == PLASTICITY_PHENOPOWERLAW_ID ) then
2018-04-25 23:11:18 +05:30
instance = phase_plasticityInstance ( phase ) ! which instance of my plasticity is present phase
2014-11-27 02:53:02 +05:30
Nchunks_SlipFamilies = count ( lattice_NslipSystem ( : , phase ) > 0_pInt ) ! maximum number of slip families according to lattice type of current phase
Nchunks_TwinFamilies = count ( lattice_NtwinSystem ( : , phase ) > 0_pInt ) ! maximum number of twin families according to lattice type of current phase
2014-03-09 02:20:31 +05:30
Nchunks_SlipSlip = maxval ( lattice_interactionSlipSlip ( : , : , phase ) )
Nchunks_SlipTwin = maxval ( lattice_interactionSlipTwin ( : , : , phase ) )
Nchunks_TwinSlip = maxval ( lattice_interactionTwinSlip ( : , : , phase ) )
Nchunks_TwinTwin = maxval ( lattice_interactionTwinTwin ( : , : , phase ) )
Nchunks_nonSchmid = lattice_NnonSchmid ( phase )
2014-04-29 23:20:59 +05:30
if ( allocated ( tempPerSlip ) ) deallocate ( tempPerSlip )
2018-04-25 23:11:18 +05:30
!allocate(param(instance)%H_int,source=tempPerSlip) gfortran 5 does not support this
allocate ( param ( instance ) % H_int ( Nchunks_SlipFamilies ) , source = 0.0_pReal )
allocate ( param ( instance ) % interaction_SlipSlip ( Nchunks_SlipSlip ) , source = 0.0_pReal )
allocate ( param ( instance ) % interaction_SlipTwin ( Nchunks_SlipTwin ) , source = 0.0_pReal )
allocate ( param ( instance ) % interaction_TwinSlip ( Nchunks_TwinSlip ) , source = 0.0_pReal )
allocate ( param ( instance ) % interaction_TwinTwin ( Nchunks_TwinTwin ) , source = 0.0_pReal )
allocate ( param ( instance ) % nonSchmidCoeff ( Nchunks_nonSchmid ) , source = 0.0_pReal )
2014-04-29 23:20:59 +05:30
allocate ( tempPerSlip ( Nchunks_SlipFamilies ) )
2013-06-12 01:46:40 +05:30
endif
2014-02-10 20:01:19 +05:30
cycle ! skip to next line
2009-07-22 21:37:19 +05:30
endif
2014-03-09 02:20:31 +05:30
if ( phase > 0_pInt ) then ; if ( phase_plasticity ( phase ) == PLASTICITY_PHENOPOWERLAW_ID ) then ! one of my phases. Do not short-circuit here (.and. between if-statements), it's not safe in Fortran
2018-04-25 23:11:18 +05:30
2015-08-28 13:08:48 +05:30
chunkPos = IO_stringPos ( line )
tag = IO_lc ( IO_stringValue ( line , chunkPos , 1_pInt ) ) ! extract key
2018-04-25 23:11:18 +05:30
select case ( tag )
2014-02-10 20:01:19 +05:30
case ( '(output)' )
2018-04-24 21:01:05 +05:30
outputtag = IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt ! assume valid output
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = outputtag ! assume valid output
2015-08-28 13:08:48 +05:30
select case ( IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) ) )
2014-02-10 20:01:19 +05:30
case ( 'resistance_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_slip_ID
2018-04-24 21:01:05 +05:30
2015-03-09 16:59:44 +05:30
case ( 'accumulatedshear_slip' , 'accumulated_shear_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_slip_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'shearrate_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_slip_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_slip_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'totalshear' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = totalshear_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'resistance_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_twin_ID
2018-04-24 21:01:05 +05:30
2015-03-09 16:59:44 +05:30
case ( 'accumulatedshear_twin' , 'accumulated_shear_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_twin_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'shearrate_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_twin_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_twin' )
2018-04-24 21:01:05 +05:30
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_twin_ID
2018-04-24 21:01:05 +05:30
2014-11-21 14:24:20 +05:30
case ( 'totalvolfrac_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = totalvolfrac_twin_ID
2018-04-24 21:01:05 +05:30
2014-02-10 20:01:19 +05:30
case default
2018-04-24 21:01:05 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) - 1_pInt ! correct for invalid
2014-06-25 04:23:25 +05:30
2014-02-10 20:01:19 +05:30
end select
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
!--------------------------------------------------------------------------------------------------
2014-05-22 20:46:05 +05:30
! parameters depending on number of slip families
2014-02-10 20:01:19 +05:30
case ( 'nslip' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < Nchunks_SlipFamilies + 1_pInt ) call IO_warning ( 50_pInt , ext_msg = extmsg )
if ( chunkPos ( 1 ) > Nchunks_SlipFamilies + 1_pInt ) call IO_error ( 150_pInt , ext_msg = extmsg )
Nchunks_SlipFamilies = chunkPos ( 1 ) - 1_pInt ! user specified number of (possibly) active slip families (e.g. 6 0 6 --> 3)
allocate ( param ( instance ) % Nslip ( Nchunks_SlipFamilies ) , source = - 1_pInt )
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_SlipFamilies
2018-04-25 23:11:18 +05:30
param ( instance ) % Nslip ( j ) = min ( IO_intValue ( line , chunkPos , 1_pInt + j ) , &
lattice_NslipSystem ( j , phase ) ) ! limit active slip systems per family to min of available and requested
2014-02-10 20:01:19 +05:30
enddo
2018-04-25 23:11:18 +05:30
totalNslip ( instance ) = sum ( param ( instance ) % Nslip ) ! how many slip systems altogether
case ( 'tausat_slip' , 'tau0_slip' , 'h_int' )
2014-11-27 02:53:02 +05:30
tempPerSlip = 0.0_pReal
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_SlipFamilies
2018-04-25 23:11:18 +05:30
if ( param ( instance ) % Nslip ( j ) > 0_pInt ) &
2015-08-28 13:08:48 +05:30
tempPerSlip ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
2018-04-25 23:11:18 +05:30
select case ( tag ) ! here, all arrays are allocated automatically
2014-04-29 23:20:59 +05:30
case ( 'tausat_slip' )
2018-04-25 23:11:18 +05:30
param ( instance ) % tausat_slip = tempPerSlip
2014-04-29 23:20:59 +05:30
case ( 'tau0_slip' )
2018-04-25 23:11:18 +05:30
param ( instance ) % tau0_slip = tempPerSlip
case ( 'h_int' )
param ( instance ) % H_int = tempPerSlip
2014-04-29 23:20:59 +05:30
end select
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
!--------------------------------------------------------------------------------------------------
2014-05-22 20:46:05 +05:30
! parameters depending on number of twin families
2014-02-10 20:01:19 +05:30
case ( 'ntwin' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < Nchunks_TwinFamilies + 1_pInt ) call IO_warning ( 51_pInt , ext_msg = extmsg )
if ( chunkPos ( 1 ) > Nchunks_TwinFamilies + 1_pInt ) call IO_error ( 150_pInt , ext_msg = extmsg )
2015-08-28 13:08:48 +05:30
Nchunks_TwinFamilies = chunkPos ( 1 ) - 1_pInt
2018-04-25 23:11:18 +05:30
allocate ( param ( instance ) % Ntwin ( Nchunks_TwinFamilies ) , source = - 1_pInt )
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_TwinFamilies
2018-04-25 23:11:18 +05:30
param ( instance ) % Ntwin ( j ) = min ( IO_intValue ( line , chunkPos , 1_pInt + j ) , &
lattice_NtwinSystem ( j , phase ) ) ! limit active twin systems per family to min of available and requested
2014-02-10 20:01:19 +05:30
enddo
2018-04-25 23:11:18 +05:30
totalNtwin ( instance ) = sum ( param ( instance ) % Ntwin ) ! how many twin systems altogether
2014-02-10 20:01:19 +05:30
case ( 'tau0_twin' )
2018-04-25 23:11:18 +05:30
allocate ( param ( instance ) % tau0_twin ( Nchunks_TwinFamilies ) , source = 0.0_pReal )
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_TwinFamilies
2018-04-25 23:11:18 +05:30
if ( param ( instance ) % Ntwin ( j ) > 0_pInt ) &
param ( instance ) % tau0_twin ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
!--------------------------------------------------------------------------------------------------
! parameters depending on number of interactions
2015-09-09 01:14:32 +05:30
case ( 'interaction_slipslip' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipSlip ) call IO_warning ( 52_pInt , ext_msg = extmsg )
2015-09-09 01:14:32 +05:30
do j = 1_pInt , Nchunks_SlipSlip
2018-04-25 23:11:18 +05:30
param ( instance ) % interaction_SlipSlip ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2015-09-09 01:14:32 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
case ( 'interaction_sliptwin' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipTwin ) call IO_warning ( 52_pInt , ext_msg = extmsg )
2014-04-29 23:20:59 +05:30
do j = 1_pInt , Nchunks_SlipTwin
2018-04-25 23:11:18 +05:30
param ( instance ) % interaction_SlipTwin ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
case ( 'interaction_twinslip' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinSlip ) call IO_warning ( 52_pInt , ext_msg = extmsg )
2014-04-29 23:20:59 +05:30
do j = 1_pInt , Nchunks_TwinSlip
2018-04-25 23:11:18 +05:30
param ( instance ) % interaction_TwinSlip ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
case ( 'interaction_twintwin' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinTwin ) call IO_warning ( 52_pInt , ext_msg = extmsg )
2014-04-29 23:20:59 +05:30
do j = 1_pInt , Nchunks_TwinTwin
2018-04-25 23:11:18 +05:30
param ( instance ) % interaction_TwinTwin ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
case ( 'nonschmid_coefficients' )
2018-04-25 23:11:18 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_nonSchmid ) call IO_warning ( 52_pInt , ext_msg = extmsg )
2014-04-29 23:20:59 +05:30
do j = 1_pInt , Nchunks_nonSchmid
2018-04-25 23:11:18 +05:30
param ( instance ) % nonSchmidCoeff ( j ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
2018-04-25 23:11:18 +05:30
2014-04-29 23:20:59 +05:30
!--------------------------------------------------------------------------------------------------
! parameters independent of number of slip/twin systems
case ( 'gdot0_slip' )
2018-04-24 21:01:05 +05:30
param ( instance ) % gdot0_slip = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'n_slip' )
2018-04-24 21:01:05 +05:30
param ( instance ) % n_slip = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'a_slip' , 'w0_slip' )
2018-04-24 21:01:05 +05:30
param ( instance ) % a_slip = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'gdot0_twin' )
2018-04-24 21:01:05 +05:30
param ( instance ) % gdot0_twin = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'n_twin' )
2018-04-24 21:01:05 +05:30
param ( instance ) % n_twin = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 's_pr' )
2018-04-24 21:01:05 +05:30
param ( instance ) % spr = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_b' )
2018-04-24 21:01:05 +05:30
param ( instance ) % twinB = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_c' )
2018-04-24 21:01:05 +05:30
param ( instance ) % twinC = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_d' )
2018-04-24 21:01:05 +05:30
param ( instance ) % twinD = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_e' )
2018-04-24 21:01:05 +05:30
param ( instance ) % twinE = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_slipslip' )
2018-04-24 21:01:05 +05:30
param ( instance ) % h0_SlipSlip = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_twinslip' )
2018-04-24 21:01:05 +05:30
param ( instance ) % h0_TwinSlip = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_twintwin' )
2018-04-24 21:01:05 +05:30
param ( instance ) % h0_TwinTwin = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_resistance' )
2018-04-24 21:01:05 +05:30
param ( instance ) % aTolResistance = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_shear' )
2018-04-24 21:01:05 +05:30
param ( instance ) % aTolShear = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_twinfrac' )
2018-04-24 21:01:05 +05:30
param ( instance ) % aTolTwinfrac = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case default
2014-06-25 04:23:25 +05:30
2014-02-10 20:01:19 +05:30
end select
endif ; endif
2014-03-09 02:20:31 +05:30
enddo parsingFile
2009-07-22 21:37:19 +05:30
2014-03-09 02:20:31 +05:30
sanityChecks : do phase = 1_pInt , size ( phase_plasticity )
myPhase : if ( phase_plasticity ( phase ) == PLASTICITY_phenopowerlaw_ID ) then
2015-10-14 00:22:01 +05:30
instance = phase_plasticityInstance ( phase )
2018-04-25 23:11:18 +05:30
totalNslip ( instance ) = sum ( param ( instance ) % Nslip ) ! how many slip systems altogether. ToDo: ok for unallocated Nslip
totalNtwin ( instance ) = sum ( param ( instance ) % Ntwin ) ! how many twin systems altogether. ToDo: ok for unallocated Ntwin
slipActive : if ( allocated ( param ( instance ) % Nslip ) ) then
if ( any ( param ( instance ) % tau0_slip < 0.0_pReal . and . &
param ( instance ) % Nslip ( : ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'tau0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( param ( instance ) % gdot0_slip < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'gdot0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( param ( instance ) % n_slip < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'n_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( any ( param ( instance ) % tausat_slip < = 0.0_pReal . and . &
param ( instance ) % Nslip ( : ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'tausat_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( any ( dEq0 ( param ( instance ) % a_slip ) . and . param ( instance ) % Nslip ( : ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'a_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
endif slipActive
twinActive : if ( allocated ( param ( instance ) % Ntwin ) ) then
! if (any(param(instance)%tau0_twin < 0.0_pReal .and. &
! param(instance)%Ntwin(:) > 0)) &
! call IO_error(211_pInt,el=instance,ext_msg='tau0_twin ('//PLASTICITY_PHENOPOWERLAW_label//')')
! if ( param(instance)%gdot0_twin <= 0.0_pReal .and. &
! any(param(instance)%Ntwin(:) > 0)) &
! call IO_error(211_pInt,el=instance,ext_msg='gdot0_twin ('//PLASTICITY_PHENOPOWERLAW_label//')')
! if ( param(instance)%n_twin <= 0.0_pReal .and. &
! any(param(instance)%Ntwin(:) > 0)) &
! call IO_error(211_pInt,el=instance,ext_msg='n_twin ('//PLASTICITY_PHENOPOWERLAW_label//')')
endif twinActive
2018-04-24 21:01:05 +05:30
if ( param ( instance ) % aTolResistance < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolResistance (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( param ( instance ) % aTolShear < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolShear (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( param ( instance ) % aTolTwinfrac < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'aTolTwinfrac (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-03-09 02:20:31 +05:30
endif myPhase
2013-07-01 11:40:42 +05:30
enddo sanityChecks
2018-04-25 23:11:18 +05:30
2009-10-22 14:28:14 +05:30
2018-04-25 23:11:18 +05:30
!--------------------------------------------------------------------------------------------------
2013-07-12 12:27:15 +05:30
! allocation of variables whose size depends on the total number of active slip systems
2018-04-25 23:11:18 +05:30
allocate ( interaction_SlipSlip ( maxval ( totalNslip ) , maxval ( totalNslip ) , maxNinstance ) , source = 0.0_pReal )
allocate ( interaction_SlipTwin ( maxval ( totalNslip ) , maxval ( totalNtwin ) , maxNinstance ) , source = 0.0_pReal )
allocate ( interaction_TwinSlip ( maxval ( totalNtwin ) , maxval ( totalNslip ) , maxNinstance ) , source = 0.0_pReal )
allocate ( interaction_TwinTwin ( maxval ( totalNtwin ) , maxval ( totalNtwin ) , maxNinstance ) , source = 0.0_pReal )
2015-10-30 21:18:30 +05:30
allocate ( state ( maxNinstance ) )
allocate ( dotState ( maxNinstance ) )
2009-10-16 01:32:52 +05:30
2014-11-27 02:53:02 +05:30
initializeInstances : do phase = 1_pInt , size ( phase_plasticity ) ! loop through all phases in material.config
2018-04-25 23:11:18 +05:30
2014-11-27 02:53:02 +05:30
myPhase2 : if ( phase_plasticity ( phase ) == PLASTICITY_phenopowerlaw_ID ) then ! only consider my phase
NipcMyPhase = count ( material_phase == phase ) ! number of IPCs containing my phase
instance = phase_plasticityInstance ( phase ) ! which instance of my phase
2014-07-02 17:57:39 +05:30
!--------------------------------------------------------------------------------------------------
! Determine size of postResults array
2014-12-08 21:25:30 +05:30
outputsLoop : do o = 1_pInt , plastic_phenopowerlaw_Noutput ( instance )
select case ( plastic_phenopowerlaw_outputID ( o , instance ) )
2014-03-09 02:20:31 +05:30
case ( resistance_slip_ID , &
shearrate_slip_ID , &
accumulatedshear_slip_ID , &
resolvedstress_slip_ID &
)
2018-04-25 23:11:18 +05:30
mySize = totalNslip ( instance )
2014-03-09 02:20:31 +05:30
case ( resistance_twin_ID , &
shearrate_twin_ID , &
accumulatedshear_twin_ID , &
resolvedstress_twin_ID &
)
2018-04-25 23:11:18 +05:30
mySize = totalNtwin ( instance )
2014-03-09 02:20:31 +05:30
case ( totalshear_ID , &
2014-11-21 14:24:20 +05:30
totalvolfrac_twin_ID &
2014-03-09 02:20:31 +05:30
)
mySize = 1_pInt
case default
end select
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
outputFound : if ( mySize > 0_pInt ) then
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_sizePostResult ( o , instance ) = mySize
plastic_phenopowerlaw_sizePostResults ( instance ) = plastic_phenopowerlaw_sizePostResults ( instance ) + mySize
2014-03-09 02:20:31 +05:30
endif outputFound
2015-10-14 00:22:01 +05:30
enddo outputsLoop
2014-07-02 17:57:39 +05:30
!--------------------------------------------------------------------------------------------------
! allocate state arrays
2018-04-25 23:11:18 +05:30
sizeState = totalNslip ( instance ) & ! s_slip
+ totalNtwin ( instance ) & ! s_twin
2014-12-09 23:53:48 +05:30
+ 2_pInt & ! sum(gamma) + sum(f)
2018-04-25 23:11:18 +05:30
+ totalNslip ( instance ) & ! accshear_slip
+ totalNtwin ( instance ) ! accshear_twin
2015-10-14 00:22:01 +05:30
2014-06-11 22:22:18 +05:30
sizeDotState = sizeState
2015-06-01 21:32:27 +05:30
sizeDeltaState = 0_pInt
2014-07-08 20:28:23 +05:30
plasticState ( phase ) % sizeState = sizeState
plasticState ( phase ) % sizeDotState = sizeDotState
2015-06-01 21:32:27 +05:30
plasticState ( phase ) % sizeDeltaState = sizeDeltaState
2014-12-08 21:25:30 +05:30
plasticState ( phase ) % sizePostResults = plastic_phenopowerlaw_sizePostResults ( instance )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % nSlip = totalNslip ( instance )
plasticState ( phase ) % nTwin = totalNtwin ( instance )
2018-04-24 21:01:05 +05:30
plasticState ( phase ) % nTrans = 0_pInt
2014-11-27 02:53:02 +05:30
allocate ( plasticState ( phase ) % aTolState ( sizeState ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % state0 ( sizeState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % partionedState0 ( sizeState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % subState0 ( sizeState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % state ( sizeState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % dotState ( sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
2015-06-01 21:32:27 +05:30
allocate ( plasticState ( phase ) % deltaState ( sizeDeltaState , NipcMyPhase ) , source = 0.0_pReal )
2014-05-22 20:46:05 +05:30
if ( any ( numerics_integrator == 1_pInt ) ) then
2014-11-27 02:53:02 +05:30
allocate ( plasticState ( phase ) % previousDotState ( sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % previousDotState2 ( sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
2014-05-22 20:46:05 +05:30
endif
if ( any ( numerics_integrator == 4_pInt ) ) &
2014-11-27 02:53:02 +05:30
allocate ( plasticState ( phase ) % RK4dotState ( sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
2014-05-22 20:46:05 +05:30
if ( any ( numerics_integrator == 5_pInt ) ) &
2014-11-27 02:53:02 +05:30
allocate ( plasticState ( phase ) % RKCK45dotState ( 6 , sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
2015-10-14 00:22:01 +05:30
2015-01-05 00:56:33 +05:30
offset_slip = plasticState ( phase ) % nSlip + plasticState ( phase ) % nTwin + 2_pInt
plasticState ( phase ) % slipRate = > &
plasticState ( phase ) % dotState ( offset_slip + 1 : offset_slip + plasticState ( phase ) % nSlip , 1 : NipcMyPhase )
plasticState ( phase ) % accumulatedSlip = > &
plasticState ( phase ) % state ( offset_slip + 1 : offset_slip + plasticState ( phase ) % nSlip , 1 : NipcMyPhase )
2015-10-14 00:22:01 +05:30
2018-04-25 23:11:18 +05:30
!--------------------------------------------------------------------------------------------------
! calculate hardening matrices and extend intitial values (per family -> per system)
mySlipFamilies : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 ) ! >>> interaction slip -- X
index_myFamily = sum ( param ( instance ) % Nslip ( 1 : f - 1_pInt ) )
mySlipSystems : do j = 1_pInt , param ( instance ) % Nslip ( f )
otherSlipFamilies : do o = 1_pInt , size ( param ( instance ) % Nslip , 1 )
index_otherFamily = sum ( param ( instance ) % Nslip ( 1 : o - 1_pInt ) )
otherSlipSystems : do k = 1_pInt , param ( instance ) % Nslip ( o )
interaction_SlipSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
param ( instance ) % interaction_SlipSlip ( lattice_interactionSlipSlip ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NslipSystem ( 1 : f - 1 , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1 , phase ) ) + k , &
2018-04-25 23:11:18 +05:30
phase ) )
enddo otherSlipSystems ; enddo otherSlipFamilies
twinFamilies : do o = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
index_otherFamily = sum ( param ( instance ) % Ntwin ( 1 : o - 1_pInt ) )
twinSystems : do k = 1_pInt , param ( instance ) % Ntwin ( o )
interaction_SlipTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
param ( instance ) % interaction_SlipTwin ( lattice_interactionSlipTwin ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NslipSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
2018-04-25 23:11:18 +05:30
phase ) )
enddo twinSystems ; enddo twinFamilies
enddo mySlipSystems
enddo mySlipFamilies
myTwinFamilies : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 ) ! >>> interaction twin -- X
index_myFamily = sum ( param ( instance ) % Ntwin ( 1 : f - 1_pInt ) )
myTwinSystems : do j = 1_pInt , param ( instance ) % Ntwin ( f )
slipFamilies : do o = 1_pInt , size ( param ( instance ) % Nslip , 1 )
index_otherFamily = sum ( param ( instance ) % Nslip ( 1 : o - 1_pInt ) )
slipSystems : do k = 1_pInt , param ( instance ) % Nslip ( o )
interaction_TwinSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
param ( instance ) % interaction_TwinSlip ( lattice_interactionTwinSlip ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1_pInt , phase ) ) + k , &
2018-04-25 23:11:18 +05:30
phase ) )
enddo slipSystems ; enddo slipFamilies
otherTwinFamilies : do o = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
index_otherFamily = sum ( param ( instance ) % Ntwin ( 1 : o - 1_pInt ) )
otherTwinSystems : do k = 1_pInt , param ( instance ) % Ntwin ( o )
interaction_TwinTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
param ( instance ) % interaction_TwinTwin ( lattice_interactionTwinTwin ( &
2014-03-09 02:20:31 +05:30
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
2018-04-25 23:11:18 +05:30
phase ) )
enddo otherTwinSystems ; enddo otherTwinFamilies
enddo myTwinSystems
enddo myTwinFamilies
2015-10-14 00:22:01 +05:30
2018-04-25 23:11:18 +05:30
!--------------------------------------------------------------------------------------------------
! locally defined state aliases and initialization of state0 and aTolState
2015-10-30 21:18:30 +05:30
startIndex = 1_pInt
2018-04-25 23:11:18 +05:30
endIndex = totalNslip ( instance )
2015-10-30 21:18:30 +05:30
state ( instance ) % s_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % s_slip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
spread ( math_expand ( param ( instance ) % tau0_slip , param ( instance ) % Nslip ) , 2 , NipcMyPhase )
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolResistance
2015-10-30 21:18:30 +05:30
startIndex = endIndex + 1_pInt
2018-04-25 23:11:18 +05:30
endIndex = endIndex + totalNtwin ( instance )
2015-10-30 21:18:30 +05:30
state ( instance ) % s_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % s_twin = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % state0 ( startIndex : endIndex , : ) = &
2018-04-26 21:42:45 +05:30
spread ( math_expand ( param ( instance ) % tau0_twin , param ( instance ) % Ntwin ) , 2 , NipcMyPhase )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolResistance
2015-10-30 21:18:30 +05:30
startIndex = endIndex + 1_pInt
endIndex = endIndex + 1_pInt
state ( instance ) % sumGamma = > plasticState ( phase ) % state ( startIndex , : )
dotState ( instance ) % sumGamma = > plasticState ( phase ) % dotState ( startIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolShear
2015-10-30 21:18:30 +05:30
startIndex = endIndex + 1_pInt
endIndex = endIndex + 1_pInt
state ( instance ) % sumF = > plasticState ( phase ) % state ( startIndex , : )
dotState ( instance ) % sumF = > plasticState ( phase ) % dotState ( startIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolTwinFrac
2015-10-30 21:18:30 +05:30
startIndex = endIndex + 1_pInt
2018-04-25 23:11:18 +05:30
endIndex = endIndex + totalNslip ( instance )
2015-10-30 21:18:30 +05:30
state ( instance ) % accshear_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % accshear_slip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolShear
! global alias
plasticState ( phase ) % slipRate = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
plasticState ( phase ) % accumulatedSlip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
2015-10-30 21:18:30 +05:30
startIndex = endIndex + 1_pInt
2018-04-25 23:11:18 +05:30
endIndex = endIndex + totalNtwin ( instance )
2016-05-19 16:31:13 +05:30
state ( instance ) % accshear_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
dotState ( instance ) % accshear_twin = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2018-04-25 23:11:18 +05:30
plasticState ( phase ) % aTolState ( startIndex : endIndex ) = param ( instance ) % aTolShear
2015-10-30 21:18:30 +05:30
2015-10-14 00:22:01 +05:30
endif myPhase2
2014-03-09 02:20:31 +05:30
enddo initializeInstances
2009-07-22 21:37:19 +05:30
2018-04-25 23:11:18 +05:30
end subroutine plastic_phenopowerlaw_init
2009-07-22 21:37:19 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2013-07-01 11:40:42 +05:30
!> @brief calculates plastic velocity gradient and its tangent
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2015-01-29 19:26:09 +05:30
subroutine plastic_phenopowerlaw_LpAndItsTangent ( Lp , dLp_dTstar99 , Tstar_v , ipc , ip , el )
2016-05-29 14:15:03 +05:30
use prec , only : &
2016-10-29 13:09:08 +05:30
dNeq0
2013-07-01 11:40:42 +05:30
use math , only : &
math_Plain3333to99 , &
2014-01-22 21:17:49 +05:30
math_Mandel6to33
2013-07-01 11:40:42 +05:30
use lattice , only : &
lattice_Sslip , &
lattice_Sslip_v , &
lattice_Stwin , &
lattice_Stwin_v , &
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
lattice_NslipSystem , &
lattice_NtwinSystem , &
2013-08-05 14:53:21 +05:30
lattice_NnonSchmid
2013-07-01 11:40:42 +05:30
use material , only : &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt , &
2013-07-01 11:40:42 +05:30
phase_plasticityInstance
2009-07-22 21:37:19 +05:30
implicit none
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 3 , 3 ) , intent ( out ) :: &
2013-07-01 11:40:42 +05:30
Lp !< plastic velocity gradient
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 9 , 9 ) , intent ( out ) :: &
2013-10-08 21:57:26 +05:30
dLp_dTstar99 !< derivative of Lp with respect to 2nd Piola Kirchhoff stress
2013-07-01 11:40:42 +05:30
2014-03-13 12:13:49 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-07-01 11:40:42 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
el !< element
2014-10-28 08:12:25 +05:30
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: &
Tstar_v !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-05-22 20:46:05 +05:30
2013-07-01 11:40:42 +05:30
integer ( pInt ) :: &
2015-10-14 00:22:01 +05:30
instance , &
2015-10-30 21:18:30 +05:30
index_myFamily , &
2014-07-02 17:57:39 +05:30
f , i , j , k , l , m , n , &
of , &
ph
2014-11-06 13:57:48 +05:30
real ( pReal ) :: &
tau_slip_pos , tau_slip_neg , &
gdot_slip_pos , gdot_slip_neg , &
dgdot_dtauslip_pos , dgdot_dtauslip_neg , &
gdot_twin , dgdot_dtautwin , tau_twin
2013-07-01 11:40:42 +05:30
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) :: &
dLp_dTstar3333 !< derivative of Lp with respect to Tstar as 4th order tensor
real ( pReal ) , dimension ( 3 , 3 , 2 ) :: &
nonSchmid_tensor
2015-10-14 00:22:01 +05:30
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2009-07-22 21:37:19 +05:30
Lp = 0.0_pReal
dLp_dTstar3333 = 0.0_pReal
2013-07-12 12:27:15 +05:30
dLp_dTstar99 = 0.0_pReal
2009-10-21 18:40:12 +05:30
2014-11-21 14:24:20 +05:30
!--------------------------------------------------------------------------------------------------
! Slip part
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
slipFamilies : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 )
2014-11-06 13:57:48 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
slipSystems : do i = 1_pInt , param ( instance ) % Nslip ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2015-10-14 00:22:01 +05:30
2014-11-21 14:24:20 +05:30
! Calculation of Lp
2014-11-06 13:57:48 +05:30
tau_slip_pos = dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 1 , index_myFamily + i , ph ) )
tau_slip_neg = tau_slip_pos
2014-07-02 17:57:39 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) = lattice_Sslip ( 1 : 3 , 1 : 3 , 1 , index_myFamily + i , ph )
2013-08-05 14:53:21 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 )
2015-10-14 00:22:01 +05:30
do k = 1 , lattice_NnonSchmid ( ph )
2018-04-25 23:11:18 +05:30
tau_slip_pos = tau_slip_pos + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2018-04-25 23:11:18 +05:30
tau_slip_neg = tau_slip_neg + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k + 1 , index_myFamily + i , ph ) )
2018-04-25 23:11:18 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
lattice_Sslip ( 1 : 3 , 1 : 3 , 2 * k , index_myFamily + i , ph )
2018-04-25 23:11:18 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
lattice_Sslip ( 1 : 3 , 1 : 3 , 2 * k + 1 , index_myFamily + i , ph )
2013-01-22 04:41:16 +05:30
enddo
2018-04-24 21:01:05 +05:30
gdot_slip_pos = 0.5_pReal * param ( instance ) % gdot0_slip * &
2015-10-30 21:18:30 +05:30
( ( abs ( tau_slip_pos ) / ( state ( instance ) % s_slip ( j , of ) ) ) &
2018-04-24 21:01:05 +05:30
** param ( instance ) % n_slip ) * sign ( 1.0_pReal , tau_slip_pos )
2014-05-22 20:46:05 +05:30
2018-04-24 21:01:05 +05:30
gdot_slip_neg = 0.5_pReal * param ( instance ) % gdot0_slip * &
2015-10-30 21:18:30 +05:30
( ( abs ( tau_slip_neg ) / ( state ( instance ) % s_slip ( j , of ) ) ) &
2018-04-24 21:01:05 +05:30
** param ( instance ) % n_slip ) * sign ( 1.0_pReal , tau_slip_neg )
2015-10-14 00:22:01 +05:30
2015-10-30 21:18:30 +05:30
Lp = Lp + ( 1.0_pReal - state ( instance ) % sumF ( of ) ) * & ! 1-F
2014-11-06 13:57:48 +05:30
( gdot_slip_pos + gdot_slip_neg ) * lattice_Sslip ( 1 : 3 , 1 : 3 , 1 , index_myFamily + i , ph )
2014-05-22 20:46:05 +05:30
2014-11-21 14:24:20 +05:30
! Calculation of the tangent of Lp
2016-10-29 13:09:08 +05:30
if ( dNeq0 ( gdot_slip_pos ) ) then
2018-04-24 21:01:05 +05:30
dgdot_dtauslip_pos = gdot_slip_pos * param ( instance ) % n_slip / tau_slip_pos
2013-01-22 04:41:16 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
dLp_dTstar3333 ( k , l , m , n ) = dLp_dTstar3333 ( k , l , m , n ) + &
2014-11-06 13:57:48 +05:30
dgdot_dtauslip_pos * lattice_Sslip ( k , l , 1 , index_myFamily + i , ph ) * &
2013-01-22 04:41:16 +05:30
nonSchmid_tensor ( m , n , 1 )
endif
2015-10-14 00:22:01 +05:30
2016-10-29 13:09:08 +05:30
if ( dNeq0 ( gdot_slip_neg ) ) then
2018-04-24 21:01:05 +05:30
dgdot_dtauslip_neg = gdot_slip_neg * param ( instance ) % n_slip / tau_slip_neg
2012-02-21 21:30:00 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
2009-10-21 18:40:12 +05:30
dLp_dTstar3333 ( k , l , m , n ) = dLp_dTstar3333 ( k , l , m , n ) + &
2014-11-06 13:57:48 +05:30
dgdot_dtauslip_neg * lattice_Sslip ( k , l , 1 , index_myFamily + i , ph ) * &
2013-01-22 04:41:16 +05:30
nonSchmid_tensor ( m , n , 2 )
2009-10-21 18:40:12 +05:30
endif
2014-11-06 13:57:48 +05:30
enddo slipSystems
enddo slipFamilies
2009-07-22 21:37:19 +05:30
2014-11-21 14:24:20 +05:30
!--------------------------------------------------------------------------------------------------
! Twinning part
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
twinFamilies : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
twinSystems : do i = 1_pInt , param ( instance ) % Ntwin ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-11-21 14:24:20 +05:30
! Calculation of Lp
2015-10-14 00:22:01 +05:30
tau_twin = dot_product ( Tstar_v , lattice_Stwin_v ( 1 : 6 , index_myFamily + i , ph ) )
2015-10-30 21:18:30 +05:30
gdot_twin = ( 1.0_pReal - state ( instance ) % sumF ( of ) ) * & ! 1-F
2018-04-24 21:01:05 +05:30
param ( instance ) % gdot0_twin * &
2015-10-30 21:18:30 +05:30
( abs ( tau_twin ) / state ( instance ) % s_twin ( j , of ) ) ** &
2018-04-24 21:01:05 +05:30
param ( instance ) % n_twin * max ( 0.0_pReal , sign ( 1.0_pReal , tau_twin ) )
2014-11-06 13:57:48 +05:30
Lp = Lp + gdot_twin * lattice_Stwin ( 1 : 3 , 1 : 3 , index_myFamily + i , ph )
2009-07-22 21:37:19 +05:30
2014-11-21 14:24:20 +05:30
! Calculation of the tangent of Lp
2016-10-29 13:09:08 +05:30
if ( dNeq0 ( gdot_twin ) ) then
2018-04-24 21:01:05 +05:30
dgdot_dtautwin = gdot_twin * param ( instance ) % n_twin / tau_twin
2012-02-21 21:30:00 +05:30
forall ( k = 1_pInt : 3_pInt , l = 1_pInt : 3_pInt , m = 1_pInt : 3_pInt , n = 1_pInt : 3_pInt ) &
2009-10-21 18:40:12 +05:30
dLp_dTstar3333 ( k , l , m , n ) = dLp_dTstar3333 ( k , l , m , n ) + &
2014-11-06 13:57:48 +05:30
dgdot_dtautwin * lattice_Stwin ( k , l , index_myFamily + i , ph ) * &
lattice_Stwin ( m , n , index_myFamily + i , ph )
2009-10-21 18:40:12 +05:30
endif
2014-11-06 13:57:48 +05:30
enddo twinSystems
enddo twinFamilies
2009-07-22 21:37:19 +05:30
2013-07-12 12:27:15 +05:30
dLp_dTstar99 = math_Plain3333to99 ( dLp_dTstar3333 )
2009-07-22 21:37:19 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_phenopowerlaw_LpAndItsTangent
2009-07-22 21:37:19 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2013-07-01 11:40:42 +05:30
!> @brief calculates the rate of change of microstructure
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2015-01-29 19:26:09 +05:30
subroutine plastic_phenopowerlaw_dotState ( Tstar_v , ipc , ip , el )
2013-07-01 11:40:42 +05:30
use lattice , only : &
lattice_Sslip_v , &
lattice_Stwin_v , &
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
lattice_NslipSystem , &
lattice_NtwinSystem , &
lattice_shearTwin , &
2015-10-14 00:22:01 +05:30
lattice_NnonSchmid
2013-07-01 11:40:42 +05:30
use material , only : &
material_phase , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt , &
2014-07-02 17:57:39 +05:30
plasticState , &
2013-07-01 11:40:42 +05:30
phase_plasticityInstance
2015-10-14 00:22:01 +05:30
2009-07-22 21:37:19 +05:30
implicit none
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: &
2013-07-01 11:40:42 +05:30
Tstar_v !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-03-13 12:13:49 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-07-01 11:40:42 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
2014-05-22 20:46:05 +05:30
el !< element !< microstructure state
2013-07-01 11:40:42 +05:30
2013-10-08 21:57:26 +05:30
integer ( pInt ) :: &
2014-07-02 17:57:39 +05:30
instance , ph , &
2013-10-08 21:57:26 +05:30
nSlip , nTwin , &
f , i , j , k , &
index_Gamma , index_F , index_myFamily , &
2014-07-02 17:57:39 +05:30
offset_accshear_slip , offset_accshear_twin , &
of
2013-10-08 21:57:26 +05:30
real ( pReal ) :: &
2015-05-06 01:47:50 +05:30
c_SlipSlip , c_TwinSlip , c_TwinTwin , &
2014-11-06 13:57:48 +05:30
ssat_offset , &
tau_slip_pos , tau_slip_neg , tau_twin
2013-07-01 11:40:42 +05:30
2018-04-25 23:11:18 +05:30
real ( pReal ) , dimension ( totalNslip ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2014-11-06 13:57:48 +05:30
gdot_slip , left_SlipSlip , left_SlipTwin , right_SlipSlip , right_TwinSlip
2018-04-25 23:11:18 +05:30
real ( pReal ) , dimension ( totalNtwin ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2014-11-06 13:57:48 +05:30
gdot_twin , left_TwinSlip , left_TwinTwin , right_SlipTwin , right_TwinTwin
2015-10-14 00:22:01 +05:30
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2015-10-14 00:22:01 +05:30
2018-04-25 23:11:18 +05:30
nSlip = totalNslip ( instance )
nTwin = totalNtwin ( instance )
2009-07-22 21:37:19 +05:30
2012-02-21 21:30:00 +05:30
index_Gamma = nSlip + nTwin + 1_pInt
index_F = nSlip + nTwin + 2_pInt
2013-02-08 19:03:25 +05:30
offset_accshear_slip = nSlip + nTwin + 2_pInt
offset_accshear_twin = nSlip + nTwin + 2_pInt + nSlip
2014-07-07 19:51:58 +05:30
plasticState ( ph ) % dotState ( : , of ) = 0.0_pReal
2015-10-14 00:22:01 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2012-10-22 20:25:07 +05:30
! system-independent (nonlinear) prefactors to M_Xx (X influenced by x) matrices
2018-04-24 21:01:05 +05:30
c_SlipSlip = param ( instance ) % h0_slipslip * &
( 1.0_pReal + param ( instance ) % twinC * plasticState ( ph ) % state ( index_F , of ) ** &
param ( instance ) % twinB )
c_TwinSlip = param ( instance ) % h0_TwinSlip * &
plasticState ( ph ) % state ( index_Gamma , of ) ** param ( instance ) % twinE
c_TwinTwin = param ( instance ) % h0_TwinTwin * &
plasticState ( ph ) % state ( index_F , of ) ** param ( instance ) % twinD
2014-07-02 17:57:39 +05:30
2013-07-01 11:40:42 +05:30
!--------------------------------------------------------------------------------------------------
! calculate left and right vectors and calculate dot gammas
2018-04-24 21:01:05 +05:30
ssat_offset = param ( instance ) % spr * sqrt ( plasticState ( ph ) % state ( index_F , of ) )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
slipFamilies1 : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
slipSystems1 : do i = 1_pInt , param ( instance ) % Nslip ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2018-04-25 23:11:18 +05:30
left_SlipSlip ( j ) = 1.0_pReal + param ( instance ) % H_int ( f ) ! modified no system-dependent left part
2013-07-01 11:40:42 +05:30
left_SlipTwin ( j ) = 1.0_pReal ! no system-dependent left part
2014-07-02 17:57:39 +05:30
right_SlipSlip ( j ) = abs ( 1.0_pReal - plasticState ( ph ) % state ( j , of ) / &
2018-04-25 23:11:18 +05:30
( param ( instance ) % tausat_slip ( f ) + ssat_offset ) ) &
2018-04-24 21:01:05 +05:30
** param ( instance ) % a_slip &
2014-07-02 17:57:39 +05:30
* sign ( 1.0_pReal , 1.0_pReal - plasticState ( ph ) % state ( j , of ) / &
2018-04-25 23:11:18 +05:30
( param ( instance ) % tausat_slip ( f ) + ssat_offset ) )
2013-07-01 11:40:42 +05:30
right_TwinSlip ( j ) = 1.0_pReal ! no system-dependent part
2015-10-14 00:22:01 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2015-10-14 00:22:01 +05:30
! Calculation of dot gamma
2014-11-06 13:57:48 +05:30
tau_slip_pos = dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 1 , index_myFamily + i , ph ) )
tau_slip_neg = tau_slip_pos
2015-10-14 00:22:01 +05:30
nonSchmidSystems : do k = 1 , lattice_NnonSchmid ( ph )
2018-04-25 23:11:18 +05:30
tau_slip_pos = tau_slip_pos + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-11-06 13:57:48 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2018-04-25 23:11:18 +05:30
tau_slip_neg = tau_slip_neg + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k + 1 , index_myFamily + i , ph ) )
2014-11-06 13:57:48 +05:30
enddo nonSchmidSystems
2018-04-24 21:01:05 +05:30
gdot_slip ( j ) = param ( instance ) % gdot0_slip * 0.5_pReal * &
( ( abs ( tau_slip_pos ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** param ( instance ) % n_slip &
2016-06-15 01:40:24 +05:30
* sign ( 1.0_pReal , tau_slip_pos ) &
2018-04-24 21:01:05 +05:30
+ ( abs ( tau_slip_neg ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** param ( instance ) % n_slip &
2016-06-15 01:36:04 +05:30
* sign ( 1.0_pReal , tau_slip_neg ) )
2014-11-06 13:57:48 +05:30
enddo slipSystems1
enddo slipFamilies1
2009-07-22 21:37:19 +05:30
2014-05-22 20:46:05 +05:30
2016-05-12 00:23:05 +05:30
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
twinFamilies1 : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
2014-11-06 13:57:48 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
twinSystems1 : do i = 1_pInt , param ( instance ) % Ntwin ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2015-09-09 01:14:32 +05:30
left_TwinSlip ( j ) = 1.0_pReal ! no system-dependent left part
left_TwinTwin ( j ) = 1.0_pReal ! no system-dependent left part
2012-11-14 15:52:34 +05:30
right_SlipTwin ( j ) = 1.0_pReal ! no system-dependent right part
right_TwinTwin ( j ) = 1.0_pReal ! no system-dependent right part
2012-10-22 20:25:07 +05:30
2013-07-01 11:40:42 +05:30
!--------------------------------------------------------------------------------------------------
! Calculation of dot vol frac
2015-10-14 00:22:01 +05:30
tau_twin = dot_product ( Tstar_v , lattice_Stwin_v ( 1 : 6 , index_myFamily + i , ph ) )
2014-07-02 17:57:39 +05:30
gdot_twin ( j ) = ( 1.0_pReal - plasticState ( ph ) % state ( index_F , of ) ) * & ! 1-F
2018-04-24 21:01:05 +05:30
param ( instance ) % gdot0_twin * &
2014-11-06 13:57:48 +05:30
( abs ( tau_twin ) / plasticState ( ph ) % state ( nslip + j , of ) ) ** &
2018-04-24 21:01:05 +05:30
param ( instance ) % n_twin * max ( 0.0_pReal , sign ( 1.0_pReal , tau_twin ) )
2014-11-06 13:57:48 +05:30
enddo twinSystems1
enddo twinFamilies1
2009-07-22 21:37:19 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
! calculate the overall hardening based on above
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
slipFamilies2 : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 )
slipSystems2 : do i = 1_pInt , param ( instance ) % Nslip ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-11-06 13:57:48 +05:30
plasticState ( ph ) % dotState ( j , of ) = & ! evolution of slip resistance j
2012-11-14 15:52:34 +05:30
c_SlipSlip * left_SlipSlip ( j ) * &
2018-04-25 23:11:18 +05:30
dot_product ( interaction_SlipSlip ( j , 1 : totalNslip ( instance ) , instance ) , &
2012-11-14 15:52:34 +05:30
right_SlipSlip * abs ( gdot_slip ) ) + & ! dot gamma_slip modulated by right-side slip factor
2018-04-25 23:11:18 +05:30
dot_product ( interaction_SlipTwin ( j , 1 : totalNtwin ( instance ) , instance ) , &
2012-11-14 15:52:34 +05:30
right_SlipTwin * gdot_twin ) ! dot gamma_twin modulated by right-side twin factor
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % dotState ( index_Gamma , of ) = plasticState ( ph ) % dotState ( index_Gamma , of ) + &
2009-07-22 21:37:19 +05:30
abs ( gdot_slip ( j ) )
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % dotState ( offset_accshear_slip + j , of ) = abs ( gdot_slip ( j ) )
2014-11-06 13:57:48 +05:30
enddo slipSystems2
enddo slipFamilies2
2014-05-22 20:46:05 +05:30
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
twinFamilies2 : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
2014-11-06 13:57:48 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
twinSystems2 : do i = 1_pInt , param ( instance ) % Ntwin ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % dotState ( j + nSlip , of ) = & ! evolution of twin resistance j
2012-11-14 15:52:34 +05:30
c_TwinSlip * left_TwinSlip ( j ) * &
2018-04-25 23:11:18 +05:30
dot_product ( interaction_TwinSlip ( j , 1 : totalNslip ( instance ) , instance ) , &
2012-11-14 15:52:34 +05:30
right_TwinSlip * abs ( gdot_slip ) ) + & ! dot gamma_slip modulated by right-side slip factor
c_TwinTwin * left_TwinTwin ( j ) * &
2018-04-25 23:11:18 +05:30
dot_product ( interaction_TwinTwin ( j , 1 : totalNtwin ( instance ) , instance ) , &
2012-11-14 15:52:34 +05:30
right_TwinTwin * gdot_twin ) ! dot gamma_twin modulated by right-side twin factor
2015-03-15 21:00:14 +05:30
if ( plasticState ( ph ) % state ( index_F , of ) < 0.98_pReal ) & ! ensure twin volume fractions stays below 1.0
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % dotState ( index_F , of ) = plasticState ( ph ) % dotState ( index_F , of ) + &
gdot_twin ( j ) / lattice_shearTwin ( index_myFamily + i , ph )
plasticState ( ph ) % dotState ( offset_accshear_twin + j , of ) = abs ( gdot_twin ( j ) )
2014-11-06 13:57:48 +05:30
enddo twinSystems2
enddo twinFamilies2
2014-07-07 19:51:58 +05:30
2015-10-14 00:22:01 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_phenopowerlaw_dotState
2009-07-22 21:37:19 +05:30
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
function plastic_phenopowerlaw_postResults ( Tstar_v , ipc , ip , el )
2013-07-01 11:40:42 +05:30
use material , only : &
material_phase , &
2014-07-02 17:57:39 +05:30
plasticState , &
2016-01-15 05:49:44 +05:30
phaseAt , phasememberAt , &
2014-11-06 13:57:48 +05:30
phase_plasticityInstance
2013-07-01 11:40:42 +05:30
use lattice , only : &
lattice_Sslip_v , &
lattice_Stwin_v , &
lattice_maxNslipFamily , &
lattice_maxNtwinFamily , &
lattice_NslipSystem , &
2013-08-05 14:53:21 +05:30
lattice_NtwinSystem , &
2015-10-14 00:22:01 +05:30
lattice_NnonSchmid
2013-07-01 11:40:42 +05:30
2009-07-22 21:37:19 +05:30
implicit none
2014-03-13 12:13:49 +05:30
real ( pReal ) , dimension ( 6 ) , intent ( in ) :: &
2013-07-01 11:40:42 +05:30
Tstar_v !< 2nd Piola Kirchhoff stress tensor in Mandel notation
2014-03-13 12:13:49 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-07-01 11:40:42 +05:30
ipc , & !< component-ID of integration point
ip , & !< integration point
2014-05-22 20:46:05 +05:30
el !< element !< microstructure state
2013-07-01 11:40:42 +05:30
2014-12-08 21:25:30 +05:30
real ( pReal ) , dimension ( plastic_phenopowerlaw_sizePostResults ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
plastic_phenopowerlaw_postResults
2009-07-22 21:37:19 +05:30
2013-07-01 11:40:42 +05:30
integer ( pInt ) :: &
2014-07-02 17:57:39 +05:30
instance , ph , of , &
2013-07-01 11:40:42 +05:30
nSlip , nTwin , &
o , f , i , c , j , k , &
2015-10-14 00:22:01 +05:30
index_Gamma , index_F , index_accshear_slip , index_accshear_twin , index_myFamily
2013-07-01 11:40:42 +05:30
real ( pReal ) :: &
tau_slip_pos , tau_slip_neg , tau
2016-01-15 05:49:44 +05:30
of = phasememberAt ( ipc , ip , el )
ph = phaseAt ( ipc , ip , el )
2014-07-02 17:57:39 +05:30
instance = phase_plasticityInstance ( ph )
2009-07-22 21:37:19 +05:30
2018-04-25 23:11:18 +05:30
nSlip = totalNslip ( instance )
nTwin = totalNtwin ( instance )
2009-07-22 21:37:19 +05:30
2012-02-21 21:30:00 +05:30
index_Gamma = nSlip + nTwin + 1_pInt
index_F = nSlip + nTwin + 2_pInt
2013-02-06 23:39:11 +05:30
index_accshear_slip = nSlip + nTwin + 3_pInt
index_accshear_twin = nSlip + nTwin + 3_pInt + nSlip
2009-07-22 21:37:19 +05:30
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults = 0.0_pReal
2009-07-22 21:37:19 +05:30
c = 0_pInt
2014-12-08 21:25:30 +05:30
outputsLoop : do o = 1_pInt , plastic_phenopowerlaw_Noutput ( instance )
select case ( plastic_phenopowerlaw_outputID ( o , instance ) )
2013-11-27 17:09:28 +05:30
case ( resistance_slip_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt : c + nSlip ) = plasticState ( ph ) % state ( 1 : nSlip , of )
2009-07-22 21:37:19 +05:30
c = c + nSlip
2013-11-27 17:09:28 +05:30
case ( accumulatedshear_slip_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt : c + nSlip ) = plasticState ( ph ) % state ( index_accshear_slip : &
2014-07-02 17:57:39 +05:30
index_accshear_slip + nSlip - 1_pInt , of )
2013-02-06 23:39:11 +05:30
c = c + nSlip
2013-11-27 17:09:28 +05:30
case ( shearrate_slip_ID )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
slipFamilies1 : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
slipSystems1 : do i = 1_pInt , param ( instance ) % Nslip ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-07-02 17:57:39 +05:30
tau_slip_pos = dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 1 , index_myFamily + i , ph ) )
2013-01-22 04:41:16 +05:30
tau_slip_neg = tau_slip_pos
2015-10-14 00:22:01 +05:30
do k = 1 , lattice_NnonSchmid ( ph )
2018-04-25 23:11:18 +05:30
tau_slip_pos = tau_slip_pos + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2018-04-25 23:11:18 +05:30
tau_slip_neg = tau_slip_neg + param ( instance ) % nonSchmidCoeff ( k ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k + 1 , index_myFamily + i , ph ) )
2013-01-22 04:41:16 +05:30
enddo
2018-04-24 21:01:05 +05:30
plastic_phenopowerlaw_postResults ( c + j ) = param ( instance ) % gdot0_slip * 0.5_pReal * &
( ( abs ( tau_slip_pos ) / plasticState ( ph ) % state ( j , of ) ) ** param ( instance ) % n_slip &
2016-07-18 16:33:23 +05:30
* sign ( 1.0_pReal , tau_slip_pos ) &
2018-04-24 21:01:05 +05:30
+ ( abs ( tau_slip_neg ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** param ( instance ) % n_slip &
2016-07-18 16:33:23 +05:30
* sign ( 1.0_pReal , tau_slip_neg ) )
2014-11-06 13:57:48 +05:30
enddo slipSystems1
enddo slipFamilies1
2009-07-22 21:37:19 +05:30
c = c + nSlip
2013-11-27 17:09:28 +05:30
case ( resolvedstress_slip_ID )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-26 22:05:49 +05:30
slipFamilies2 : do f = 1_pInt , size ( param ( instance ) % Nslip , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
slipSystems2 : do i = 1_pInt , param ( instance ) % Nslip ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + j ) = &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 1 , index_myFamily + i , ph ) )
2014-11-06 13:57:48 +05:30
enddo slipSystems2
enddo slipFamilies2
2009-07-22 21:37:19 +05:30
c = c + nSlip
2013-11-27 17:09:28 +05:30
case ( totalshear_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt ) = &
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % state ( index_Gamma , of )
2012-02-21 21:30:00 +05:30
c = c + 1_pInt
2009-07-22 21:37:19 +05:30
2013-11-27 17:09:28 +05:30
case ( resistance_twin_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt : c + nTwin ) = &
2015-12-24 02:45:49 +05:30
plasticState ( ph ) % state ( 1_pInt + nSlip : 1_pInt + nSlip + nTwin - 1_pInt , of )
2009-07-22 21:37:19 +05:30
c = c + nTwin
2009-10-21 18:40:12 +05:30
2013-11-27 17:09:28 +05:30
case ( accumulatedshear_twin_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt : c + nTwin ) = &
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % state ( index_accshear_twin : index_accshear_twin + nTwin - 1_pInt , of )
2013-02-06 23:39:11 +05:30
c = c + nTwin
2013-11-27 17:09:28 +05:30
case ( shearrate_twin_ID )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
twinFamilies1 : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
twinSystems1 : do i = 1_pInt , param ( instance ) % Ntwin ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-07-02 17:57:39 +05:30
tau = dot_product ( Tstar_v , lattice_Stwin_v ( 1 : 6 , index_myFamily + i , ph ) )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + j ) = ( 1.0_pReal - plasticState ( ph ) % state ( index_F , of ) ) * & ! 1-F
2018-04-24 21:01:05 +05:30
param ( instance ) % gdot0_twin * &
2014-08-15 14:39:31 +05:30
( abs ( tau ) / plasticState ( ph ) % state ( j + nSlip , of ) ) ** &
2018-04-24 21:01:05 +05:30
param ( instance ) % n_twin * max ( 0.0_pReal , sign ( 1.0_pReal , tau ) )
2014-11-06 13:57:48 +05:30
enddo twinSystems1
enddo twinFamilies1
2009-07-22 21:37:19 +05:30
c = c + nTwin
2013-11-27 17:09:28 +05:30
case ( resolvedstress_twin_ID )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2018-04-25 23:11:18 +05:30
twinFamilies2 : do f = 1_pInt , size ( param ( instance ) % Ntwin , 1 )
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2018-04-25 23:11:18 +05:30
twinSystems2 : do i = 1_pInt , param ( instance ) % Ntwin ( f )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + j ) = &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Stwin_v ( 1 : 6 , index_myFamily + i , ph ) )
2014-11-06 13:57:48 +05:30
enddo twinSystems2
enddo twinFamilies2
2009-07-22 21:37:19 +05:30
c = c + nTwin
2014-11-21 14:24:20 +05:30
case ( totalvolfrac_twin_ID )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + 1_pInt ) = plasticState ( ph ) % state ( index_F , of )
2012-02-21 21:30:00 +05:30
c = c + 1_pInt
2009-07-22 21:37:19 +05:30
end select
2013-07-01 11:40:42 +05:30
enddo outputsLoop
2009-07-22 21:37:19 +05:30
2014-12-08 21:25:30 +05:30
end function plastic_phenopowerlaw_postResults
2009-07-22 21:37:19 +05:30
2014-12-08 21:25:30 +05:30
end module plastic_phenopowerlaw