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
2014-10-28 08:12:25 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , public , protected :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_totalNslip , & !< no. of slip system used in simulation
plastic_phenopowerlaw_totalNtwin , & !< no. of twin system used in simulation
plastic_phenopowerlaw_totalNtrans !< no. of trans system used in simulation
2012-03-09 01:55:28 +05:30
2013-12-12 03:33:09 +05:30
integer ( pInt ) , dimension ( : , : ) , allocatable , private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Nslip , & !< active number of slip systems per family (input parameter, per family)
plastic_phenopowerlaw_Ntwin , & !< active number of twin systems per family (input parameter, per family)
plastic_phenopowerlaw_Ntrans !< active number of trans systems per family (input parameter, per family)
2012-03-09 01:55:28 +05:30
2013-12-12 03:33:09 +05:30
real ( pReal ) , dimension ( : ) , allocatable , private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_gdot0_slip , & !< reference shear strain rate for slip (input parameter)
plastic_phenopowerlaw_gdot0_twin , & !< reference shear strain rate for twin (input parameter)
plastic_phenopowerlaw_n_slip , & !< stress exponent for slip (input parameter)
plastic_phenopowerlaw_n_twin , & !< stress exponent for twin (input parameter)
plastic_phenopowerlaw_spr , & !< push-up factor for slip saturation due to twinning
plastic_phenopowerlaw_twinB , &
plastic_phenopowerlaw_twinC , &
plastic_phenopowerlaw_twinD , &
plastic_phenopowerlaw_twinE , &
plastic_phenopowerlaw_h0_SlipSlip , & !< reference hardening slip - slip (input parameter)
plastic_phenopowerlaw_h0_TwinSlip , & !< reference hardening twin - slip (input parameter)
plastic_phenopowerlaw_h0_TwinTwin , & !< reference hardening twin - twin (input parameter)
plastic_phenopowerlaw_a_slip , &
plastic_phenopowerlaw_aTolResistance , &
plastic_phenopowerlaw_aTolShear , &
plastic_phenopowerlaw_aTolTwinfrac , &
plastic_phenopowerlaw_aTolTransfrac , &
2015-10-14 00:22:01 +05:30
plastic_phenopowerlaw_Cnuc , & !< coefficient for strain-induced martensite nucleation
plastic_phenopowerlaw_Cdwp , & !< coefficient for double well potential
plastic_phenopowerlaw_Cgro , & !< coefficient for stress-assisted martensite growth
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_deltaG !< free energy difference between austensite and martensite [MPa]
2012-03-09 01:55:28 +05:30
2013-12-12 03:33:09 +05:30
real ( pReal ) , dimension ( : , : ) , allocatable , private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_tau0_slip , & !< initial critical shear stress for slip (input parameter, per family)
plastic_phenopowerlaw_tau0_twin , & !< initial critical shear stress for twin (input parameter, per family)
plastic_phenopowerlaw_tausat_slip , & !< maximum critical shear stress for slip (input parameter, per family)
2016-05-12 00:23:05 +05:30
plastic_phenopowerlaw_H_int , & !< per family hardening activity(input parameter(optional), per family)
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_nonSchmidCoeff , &
2013-07-01 11:40:42 +05:30
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_interaction_SlipSlip , & !< interaction factors slip - slip (input parameter)
plastic_phenopowerlaw_interaction_SlipTwin , & !< interaction factors slip - twin (input parameter)
plastic_phenopowerlaw_interaction_TwinSlip , & !< interaction factors twin - slip (input parameter)
plastic_phenopowerlaw_interaction_TwinTwin !< interaction factors twin - twin (input parameter)
2012-03-09 01:55:28 +05:30
2013-12-12 03:33:09 +05:30
real ( pReal ) , dimension ( : , : , : ) , allocatable , private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_hardeningMatrix_SlipSlip , &
plastic_phenopowerlaw_hardeningMatrix_SlipTwin , &
plastic_phenopowerlaw_hardeningMatrix_TwinSlip , &
plastic_phenopowerlaw_hardeningMatrix_TwinTwin
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
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 , &
state , &
state0
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
private :: &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_aTolState , &
plastic_phenopowerlaw_stateInit
2014-07-02 17:57:39 +05:30
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 )
2017-10-05 20:05:34 +05:30
#ifdef __GFORTRAN__
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 , &
math_Voigt66to3333
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 ) :: &
tag = '' , &
2014-05-22 20:46:05 +05:30
line = ''
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 )
allocate ( plastic_phenopowerlaw_Noutput ( maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_Nslip ( lattice_maxNslipFamily , maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_Ntwin ( lattice_maxNtwinFamily , maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_Ntrans ( lattice_maxNtransFamily , maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_totalNslip ( maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_totalNtwin ( maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_totalNtrans ( maxNinstance ) , source = 0_pInt )
allocate ( plastic_phenopowerlaw_gdot0_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_n_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_tau0_slip ( lattice_maxNslipFamily , maxNinstance ) , source = 0.0_pReal )
2015-10-30 21:18:30 +05:30
allocate ( plastic_phenopowerlaw_tausat_slip ( lattice_maxNslipFamily , maxNinstance ) , source = 0.0_pReal )
2016-05-12 00:23:05 +05:30
allocate ( plastic_phenopowerlaw_H_int ( lattice_maxNslipFamily , maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_gdot0_twin ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_n_twin ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_tau0_twin ( lattice_maxNtwinFamily , maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_spr ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_twinB ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_twinC ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_twinD ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_twinE ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_h0_SlipSlip ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_h0_TwinSlip ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_h0_TwinTwin ( maxNinstance ) , source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_interaction_SlipSlip ( lattice_maxNinteraction , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_interaction_SlipTwin ( lattice_maxNinteraction , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_interaction_TwinSlip ( lattice_maxNinteraction , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_interaction_TwinTwin ( lattice_maxNinteraction , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_a_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_aTolResistance ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_aTolShear ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_aTolTwinfrac ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_aTolTransfrac ( maxNinstance ) , source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_nonSchmidCoeff ( lattice_maxNnonSchmid , maxNinstance ) , &
2015-10-30 21:18:30 +05:30
source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_Cnuc ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_Cdwp ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_Cgro ( maxNinstance ) , source = 0.0_pReal )
allocate ( plastic_phenopowerlaw_deltaG ( maxNinstance ) , source = 0.0_pReal )
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
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
Nchunks_TransFamilies = count ( lattice_NtransSystem ( : , phase ) > 0_pInt ) ! maximum number of trans 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 )
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
instance = phase_plasticityInstance ( phase ) ! which instance of my plasticity is present phase
2015-08-28 13:08:48 +05:30
chunkPos = IO_stringPos ( line )
tag = IO_lc ( IO_stringValue ( line , chunkPos , 1_pInt ) ) ! extract key
2014-02-10 20:01:19 +05:30
select case ( tag )
case ( '(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_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_slip_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2015-03-09 16:59:44 +05:30
case ( 'accumulatedshear_slip' , 'accumulated_shear_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_slip_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'shearrate_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_slip_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_slip_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'totalshear' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = totalshear_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resistance_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_twin_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2015-03-09 16:59:44 +05:30
case ( 'accumulatedshear_twin' , 'accumulated_shear_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_twin_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'shearrate_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_twin_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_twin_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( line , chunkPos , 2_pInt ) )
2014-11-21 14:24:20 +05:30
case ( 'totalvolfrac_twin' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Noutput ( instance ) = plastic_phenopowerlaw_Noutput ( instance ) + 1_pInt
plastic_phenopowerlaw_outputID ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = totalvolfrac_twin_ID
plastic_phenopowerlaw_output ( plastic_phenopowerlaw_Noutput ( instance ) , instance ) = &
2015-08-28 13:08:48 +05:30
IO_lc ( IO_stringValue ( 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
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' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_SlipFamilies + 1_pInt ) &
2014-02-10 20:01:19 +05:30
call IO_warning ( 50_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_SlipFamilies + 1_pInt ) &
2014-04-29 23:20:59 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_SlipFamilies = chunkPos ( 1 ) - 1_pInt ! user specified number of (possibly) active slip families (e.g. 6 0 6 --> 3)
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_SlipFamilies
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Nslip ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
2016-05-12 00:23:05 +05:30
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
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_Nslip ( j , instance ) > 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
2014-04-29 23:20:59 +05:30
select case ( tag )
case ( 'tausat_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_tausat_slip ( 1 : Nchunks_SlipFamilies , instance ) = tempPerSlip ( 1 : Nchunks_SlipFamilies )
2014-04-29 23:20:59 +05:30
case ( 'tau0_slip' )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_tau0_slip ( 1 : Nchunks_SlipFamilies , instance ) = tempPerSlip ( 1 : Nchunks_SlipFamilies )
2016-05-12 00:23:05 +05:30
case ( 'H_int' )
plastic_phenopowerlaw_H_int ( 1 : Nchunks_SlipFamilies , instance ) = tempPerSlip ( 1 : Nchunks_SlipFamilies )
2014-04-29 23:20:59 +05:30
end select
!--------------------------------------------------------------------------------------------------
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' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_TwinFamilies + 1_pInt ) &
2014-06-17 20:54:44 +05:30
call IO_warning ( 51_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_TwinFamilies + 1_pInt ) &
2014-04-29 23:20:59 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_TwinFamilies = chunkPos ( 1 ) - 1_pInt
2014-02-10 20:01:19 +05:30
do j = 1_pInt , Nchunks_TwinFamilies
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Ntwin ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
case ( 'tau0_twin' )
do j = 1_pInt , Nchunks_TwinFamilies
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_Ntwin ( j , instance ) > 0_pInt ) &
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_tau0_twin ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
2014-04-29 23:20:59 +05:30
!--------------------------------------------------------------------------------------------------
2014-11-18 16:16:02 +05:30
! parameters depending on number of transformation families
case ( 'ntrans' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < Nchunks_TransFamilies + 1_pInt ) &
2016-05-19 16:31:13 +05:30
call IO_warning ( 53_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) > Nchunks_TransFamilies + 1_pInt ) &
2014-11-18 16:16:02 +05:30
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2015-08-28 13:08:48 +05:30
Nchunks_TransFamilies = chunkPos ( 1 ) - 1_pInt
2014-11-18 16:16:02 +05:30
do j = 1_pInt , Nchunks_TransFamilies
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Ntrans ( j , instance ) = IO_intValue ( line , chunkPos , 1_pInt + j )
2014-11-18 16:16:02 +05:30
enddo
!--------------------------------------------------------------------------------------------------
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' )
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipSlip ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_SlipSlip
plastic_phenopowerlaw_interaction_SlipSlip ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
enddo
2014-04-29 23:20:59 +05:30
case ( 'interaction_sliptwin' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_SlipTwin ) &
2014-04-29 23:20:59 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_SlipTwin
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_interaction_SlipTwin ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
case ( 'interaction_twinslip' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinSlip ) &
2014-04-29 23:20:59 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_TwinSlip
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_interaction_TwinSlip ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
case ( 'interaction_twintwin' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_TwinTwin ) &
2014-04-29 23:20:59 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_TwinTwin
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_interaction_TwinTwin ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
case ( 'nonschmid_coefficients' )
2015-08-28 13:08:48 +05:30
if ( chunkPos ( 1 ) < 1_pInt + Nchunks_nonSchmid ) &
2014-04-29 23:20:59 +05:30
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_nonSchmid
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_nonSchmidCoeff ( j , instance ) = IO_floatValue ( line , chunkPos , 1_pInt + j )
2014-04-29 23:20:59 +05:30
enddo
!--------------------------------------------------------------------------------------------------
! parameters independent of number of slip/twin systems
case ( 'gdot0_slip' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_gdot0_slip ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'n_slip' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_n_slip ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'a_slip' , 'w0_slip' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_a_slip ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'gdot0_twin' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_gdot0_twin ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-04-29 23:20:59 +05:30
case ( 'n_twin' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_n_twin ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 's_pr' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_spr ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_b' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_twinB ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_c' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_twinC ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_d' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_twinD ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_e' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_twinE ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_slipslip' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_h0_SlipSlip ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_twinslip' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_h0_TwinSlip ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_twintwin' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_h0_TwinTwin ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_resistance' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_aTolResistance ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_shear' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_aTolShear ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_twinfrac' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_aTolTwinfrac ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-11-18 16:16:02 +05:30
case ( 'atol_transfrac' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_aTolTransfrac ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-11-21 14:24:20 +05:30
case ( 'cnuc' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Cnuc ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-11-21 14:24:20 +05:30
case ( 'cdwp' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Cdwp ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-11-21 14:24:20 +05:30
case ( 'cgro' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_Cgro ( instance ) = IO_floatValue ( line , chunkPos , 2_pInt )
2014-11-21 14:24:20 +05:30
case ( 'deltag' )
2015-08-28 13:08:48 +05:30
plastic_phenopowerlaw_deltaG ( instance ) = 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 )
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Nslip ( 1 : lattice_maxNslipFamily , instance ) = &
2014-06-18 14:40:16 +05:30
min ( lattice_NslipSystem ( 1 : lattice_maxNslipFamily , phase ) , & ! limit active slip systems per family to min of available and requested
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Nslip ( 1 : lattice_maxNslipFamily , instance ) )
plastic_phenopowerlaw_Ntwin ( 1 : lattice_maxNtwinFamily , instance ) = &
2014-06-18 14:40:16 +05:30
min ( lattice_NtwinSystem ( 1 : lattice_maxNtwinFamily , phase ) , & ! limit active twin systems per family to min of available and requested
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_Ntwin ( : , instance ) )
plastic_phenopowerlaw_totalNslip ( instance ) = sum ( plastic_phenopowerlaw_Nslip ( : , instance ) ) ! how many slip systems altogether
plastic_phenopowerlaw_totalNtwin ( instance ) = sum ( plastic_phenopowerlaw_Ntwin ( : , instance ) ) ! how many twin systems altogether
plastic_phenopowerlaw_totalNtrans ( instance ) = sum ( plastic_phenopowerlaw_Ntrans ( : , instance ) ) ! how many trans systems altogether
2014-03-09 02:20:31 +05:30
2014-12-08 21:25:30 +05:30
if ( any ( plastic_phenopowerlaw_tau0_slip ( : , instance ) < 0.0_pReal . and . &
plastic_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'tau0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_gdot0_slip ( instance ) < = 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'gdot0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_n_slip ( instance ) < = 0.0_pReal ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'n_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( any ( plastic_phenopowerlaw_tausat_slip ( : , instance ) < = 0.0_pReal . and . &
plastic_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'tausat_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2016-10-29 13:09:08 +05:30
if ( any ( dEq0 ( plastic_phenopowerlaw_a_slip ( instance ) ) . and . plastic_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'a_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( any ( plastic_phenopowerlaw_tau0_twin ( : , instance ) < 0.0_pReal . and . &
plastic_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'tau0_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_gdot0_twin ( instance ) < = 0.0_pReal . and . &
any ( plastic_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'gdot0_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_n_twin ( instance ) < = 0.0_pReal . and . &
any ( plastic_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
2014-03-09 02:20:31 +05:30
call IO_error ( 211_pInt , el = instance , ext_msg = 'n_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-12-08 21:25:30 +05:30
if ( plastic_phenopowerlaw_aTolResistance ( instance ) < = 0.0_pReal ) &
plastic_phenopowerlaw_aTolResistance ( instance ) = 1.0_pReal ! default absolute tolerance 1 Pa
if ( plastic_phenopowerlaw_aTolShear ( instance ) < = 0.0_pReal ) &
plastic_phenopowerlaw_aTolShear ( instance ) = 1.0e-6_pReal ! default absolute tolerance 1e-6
if ( plastic_phenopowerlaw_aTolTwinfrac ( instance ) < = 0.0_pReal ) &
plastic_phenopowerlaw_aTolTwinfrac ( instance ) = 1.0e-6_pReal ! default absolute tolerance 1e-6
if ( plastic_phenopowerlaw_aTolTransfrac ( instance ) < = 0.0_pReal ) &
plastic_phenopowerlaw_aTolTransfrac ( instance ) = 1.0e-6_pReal ! default absolute tolerance 1e-6
2014-03-09 02:20:31 +05:30
endif myPhase
2013-07-01 11:40:42 +05:30
enddo sanityChecks
2009-10-22 14:28:14 +05:30
2013-07-12 12:27:15 +05:30
!--------------------------------------------------------------------------------------------------
! allocation of variables whose size depends on the total number of active slip systems
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_hardeningMatrix_SlipSlip ( maxval ( plastic_phenopowerlaw_totalNslip ) , & ! slip resistance from slip activity
maxval ( plastic_phenopowerlaw_totalNslip ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_hardeningMatrix_SlipTwin ( maxval ( plastic_phenopowerlaw_totalNslip ) , & ! slip resistance from twin activity
maxval ( plastic_phenopowerlaw_totalNtwin ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_hardeningMatrix_TwinSlip ( maxval ( plastic_phenopowerlaw_totalNtwin ) , & ! twin resistance from slip activity
maxval ( plastic_phenopowerlaw_totalNslip ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2014-12-08 21:25:30 +05:30
allocate ( plastic_phenopowerlaw_hardeningMatrix_TwinTwin ( maxval ( plastic_phenopowerlaw_totalNtwin ) , & ! twin resistance from twin activity
maxval ( plastic_phenopowerlaw_totalNtwin ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2015-10-30 21:18:30 +05:30
allocate ( state ( maxNinstance ) )
allocate ( state0 ( 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
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 &
)
2014-12-08 21:25:30 +05:30
mySize = plastic_phenopowerlaw_totalNslip ( instance )
2014-03-09 02:20:31 +05:30
case ( resistance_twin_ID , &
shearrate_twin_ID , &
accumulatedshear_twin_ID , &
resolvedstress_twin_ID &
)
2014-12-08 21:25:30 +05:30
mySize = plastic_phenopowerlaw_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
2014-12-08 21:25:30 +05:30
sizeState = plastic_phenopowerlaw_totalNslip ( instance ) & ! s_slip
+ plastic_phenopowerlaw_totalNtwin ( instance ) & ! s_twin
2014-12-09 23:53:48 +05:30
+ 2_pInt & ! sum(gamma) + sum(f)
2014-12-08 21:25:30 +05:30
+ plastic_phenopowerlaw_totalNslip ( instance ) & ! accshear_slip
+ plastic_phenopowerlaw_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 )
2015-01-05 00:56:33 +05:30
plasticState ( phase ) % nSlip = plastic_phenopowerlaw_totalNslip ( instance )
plasticState ( phase ) % nTwin = plastic_phenopowerlaw_totalNtwin ( instance )
plasticState ( phase ) % nTrans = plastic_phenopowerlaw_totalNtrans ( instance )
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
2014-05-08 20:25:19 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! >>> interaction slip -- X
2014-12-08 21:25:30 +05:30
index_myFamily = sum ( plastic_phenopowerlaw_Nslip ( 1 : f - 1_pInt , instance ) )
do j = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance ) ! loop over (active) systems in my family (slip)
2014-03-09 02:20:31 +05:30
do o = 1_pInt , lattice_maxNslipFamily
2014-12-08 21:25:30 +05:30
index_otherFamily = sum ( plastic_phenopowerlaw_Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , plastic_phenopowerlaw_Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
plastic_phenopowerlaw_hardeningMatrix_SlipSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
plastic_phenopowerlaw_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 , &
phase ) , instance )
enddo ; enddo
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
do o = 1_pInt , lattice_maxNtwinFamily
2014-12-08 21:25:30 +05:30
index_otherFamily = sum ( plastic_phenopowerlaw_Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , plastic_phenopowerlaw_Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
plastic_phenopowerlaw_hardeningMatrix_SlipTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
plastic_phenopowerlaw_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 , &
phase ) , instance )
enddo ; enddo
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
enddo ; enddo
2015-10-14 00:22:01 +05:30
2014-05-08 20:25:19 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! >>> interaction twin -- X
2014-12-08 21:25:30 +05:30
index_myFamily = sum ( plastic_phenopowerlaw_Ntwin ( 1 : f - 1_pInt , instance ) )
do j = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance ) ! loop over (active) systems in my family (twin)
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
do o = 1_pInt , lattice_maxNslipFamily
2014-12-08 21:25:30 +05:30
index_otherFamily = sum ( plastic_phenopowerlaw_Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , plastic_phenopowerlaw_Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
plastic_phenopowerlaw_hardeningMatrix_TwinSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
plastic_phenopowerlaw_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 , &
phase ) , instance )
enddo ; enddo
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
do o = 1_pInt , lattice_maxNtwinFamily
2014-12-08 21:25:30 +05:30
index_otherFamily = sum ( plastic_phenopowerlaw_Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , plastic_phenopowerlaw_Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
plastic_phenopowerlaw_hardeningMatrix_TwinTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
plastic_phenopowerlaw_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 , &
phase ) , instance )
enddo ; enddo
2015-10-14 00:22:01 +05:30
2014-03-09 02:20:31 +05:30
enddo ; enddo
2015-10-30 21:18:30 +05:30
startIndex = 1_pInt
endIndex = plastic_phenopowerlaw_totalNslip ( instance )
state ( instance ) % s_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
state0 ( instance ) % s_slip = > plasticState ( phase ) % state0 ( startIndex : endIndex , : )
dotState ( instance ) % s_slip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
startIndex = endIndex + 1_pInt
endIndex = endIndex + plastic_phenopowerlaw_totalNtwin ( instance )
state ( instance ) % s_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
state0 ( instance ) % s_twin = > plasticState ( phase ) % state0 ( startIndex : endIndex , : )
dotState ( instance ) % s_twin = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
startIndex = endIndex + 1_pInt
endIndex = endIndex + 1_pInt
state ( instance ) % sumGamma = > plasticState ( phase ) % state ( startIndex , : )
state0 ( instance ) % sumGamma = > plasticState ( phase ) % state0 ( startIndex , : )
dotState ( instance ) % sumGamma = > plasticState ( phase ) % dotState ( startIndex , : )
startIndex = endIndex + 1_pInt
endIndex = endIndex + 1_pInt
state ( instance ) % sumF = > plasticState ( phase ) % state ( startIndex , : )
state0 ( instance ) % sumF = > plasticState ( phase ) % state0 ( startIndex , : )
dotState ( instance ) % sumF = > plasticState ( phase ) % dotState ( startIndex , : )
startIndex = endIndex + 1_pInt
endIndex = endIndex + plastic_phenopowerlaw_totalNslip ( instance )
state ( instance ) % accshear_slip = > plasticState ( phase ) % state ( startIndex : endIndex , : )
state0 ( instance ) % accshear_slip = > plasticState ( phase ) % state0 ( startIndex : endIndex , : )
dotState ( instance ) % accshear_slip = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
startIndex = endIndex + 1_pInt
endIndex = endIndex + plastic_phenopowerlaw_totalNtwin ( instance )
2016-05-19 16:31:13 +05:30
state ( instance ) % accshear_twin = > plasticState ( phase ) % state ( startIndex : endIndex , : )
state0 ( instance ) % accshear_twin = > plasticState ( phase ) % state0 ( startIndex : endIndex , : )
dotState ( instance ) % accshear_twin = > plasticState ( phase ) % dotState ( startIndex : endIndex , : )
2015-10-30 21:18:30 +05:30
2014-07-07 19:51:58 +05:30
2014-12-08 21:25:30 +05:30
call plastic_phenopowerlaw_stateInit ( phase , instance )
call plastic_phenopowerlaw_aTolState ( phase , instance )
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
2014-12-08 21:25:30 +05:30
end subroutine plastic_phenopowerlaw_init
2009-07-22 21:37:19 +05:30
2014-05-22 20:46:05 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief sets the initial microstructural state for a given instance of this plasticity
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
subroutine plastic_phenopowerlaw_stateInit ( ph , instance )
2014-05-22 20:46:05 +05:30
use lattice , only : &
lattice_maxNslipFamily , &
lattice_maxNtwinFamily
use material , only : &
2014-11-06 13:57:48 +05:30
plasticState
2015-10-14 00:22:01 +05:30
2014-05-22 20:46:05 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
instance , & !< number specifying the instance of the plasticity
2015-10-14 00:22:01 +05:30
ph
2014-05-22 20:46:05 +05:30
integer ( pInt ) :: &
i
2014-07-02 17:57:39 +05:30
real ( pReal ) , dimension ( plasticState ( ph ) % sizeState ) :: &
tempState
2014-08-04 23:20:01 +05:30
2014-07-07 19:51:58 +05:30
tempState = 0.0_pReal
2014-05-22 20:46:05 +05:30
do i = 1_pInt , lattice_maxNslipFamily
2014-12-08 21:25:30 +05:30
tempState ( 1 + sum ( plastic_phenopowerlaw_Nslip ( 1 : i - 1 , instance ) ) : &
sum ( plastic_phenopowerlaw_Nslip ( 1 : i , instance ) ) ) = &
plastic_phenopowerlaw_tau0_slip ( i , instance )
2014-05-22 20:46:05 +05:30
enddo
do i = 1_pInt , lattice_maxNtwinFamily
2014-12-08 21:25:30 +05:30
tempState ( 1 + sum ( plastic_phenopowerlaw_Nslip ( : , instance ) ) + &
sum ( plastic_phenopowerlaw_Ntwin ( 1 : i - 1 , instance ) ) : &
sum ( plastic_phenopowerlaw_Nslip ( : , instance ) ) + &
sum ( plastic_phenopowerlaw_Ntwin ( 1 : i , instance ) ) ) = &
plastic_phenopowerlaw_tau0_twin ( i , instance )
2014-05-22 20:46:05 +05:30
enddo
2014-11-27 02:53:02 +05:30
plasticState ( ph ) % state0 ( : , : ) = spread ( tempState , & ! spread single tempstate array
2 , & ! along dimension 2
size ( plasticState ( ph ) % state0 ( 1 , : ) ) ) ! number of copies (number of IPCs)
2014-05-22 20:46:05 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_phenopowerlaw_stateInit
2014-05-22 20:46:05 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief sets the relevant state values for a given instance of this plasticity
!--------------------------------------------------------------------------------------------------
2014-12-08 21:25:30 +05:30
subroutine plastic_phenopowerlaw_aTolState ( ph , instance )
2014-05-22 20:46:05 +05:30
use material , only : &
plasticState
implicit none
2015-10-14 00:22:01 +05:30
integer ( pInt ) , intent ( in ) :: &
2014-05-22 20:46:05 +05:30
instance , & !< number specifying the instance of the plasticity
2014-07-02 17:57:39 +05:30
ph
2014-12-08 21:25:30 +05:30
plasticState ( ph ) % aTolState ( 1 : plastic_phenopowerlaw_totalNslip ( instance ) + &
plastic_phenopowerlaw_totalNtwin ( instance ) ) = &
plastic_phenopowerlaw_aTolResistance ( instance )
plasticState ( ph ) % aTolState ( 1 + plastic_phenopowerlaw_totalNslip ( instance ) + &
plastic_phenopowerlaw_totalNtwin ( instance ) ) = &
plastic_phenopowerlaw_aTolShear ( instance )
plasticState ( ph ) % aTolState ( 2 + plastic_phenopowerlaw_totalNslip ( instance ) + &
plastic_phenopowerlaw_totalNtwin ( instance ) ) = &
plastic_phenopowerlaw_aTolTwinFrac ( instance )
plasticState ( ph ) % aTolState ( 3 + plastic_phenopowerlaw_totalNslip ( instance ) + &
plastic_phenopowerlaw_totalNtwin ( instance ) : &
2 + 2 * ( plastic_phenopowerlaw_totalNslip ( instance ) + &
plastic_phenopowerlaw_totalNtwin ( instance ) ) ) = &
plastic_phenopowerlaw_aTolShear ( instance )
2014-05-22 20:46:05 +05:30
2014-12-08 21:25:30 +05:30
end subroutine plastic_phenopowerlaw_aTolState
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
2014-11-06 13:57:48 +05:30
slipFamilies : do f = 1_pInt , lattice_maxNslipFamily
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
slipSystems : do i = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance )
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 )
2014-12-08 21:25:30 +05:30
tau_slip_pos = tau_slip_pos + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2014-12-08 21:25:30 +05:30
tau_slip_neg = tau_slip_neg + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
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-12-08 21:25:30 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
2014-07-02 17:57:39 +05:30
lattice_Sslip ( 1 : 3 , 1 : 3 , 2 * k , index_myFamily + i , ph )
2014-12-08 21:25:30 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
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
2014-12-08 21:25:30 +05:30
gdot_slip_pos = 0.5_pReal * plastic_phenopowerlaw_gdot0_slip ( instance ) * &
2015-10-30 21:18:30 +05:30
( ( abs ( tau_slip_pos ) / ( state ( instance ) % s_slip ( j , of ) ) ) &
2014-12-08 21:25:30 +05:30
** plastic_phenopowerlaw_n_slip ( instance ) ) * sign ( 1.0_pReal , tau_slip_pos )
2014-05-22 20:46:05 +05:30
2014-12-08 21:25:30 +05:30
gdot_slip_neg = 0.5_pReal * plastic_phenopowerlaw_gdot0_slip ( instance ) * &
2015-10-30 21:18:30 +05:30
( ( abs ( tau_slip_neg ) / ( state ( instance ) % s_slip ( j , of ) ) ) &
2014-12-08 21:25:30 +05:30
** plastic_phenopowerlaw_n_slip ( instance ) ) * 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
2014-12-08 21:25:30 +05:30
dgdot_dtauslip_pos = gdot_slip_pos * plastic_phenopowerlaw_n_slip ( instance ) / 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
2014-12-08 21:25:30 +05:30
dgdot_dtauslip_neg = gdot_slip_neg * plastic_phenopowerlaw_n_slip ( instance ) / 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
2014-11-06 13:57:48 +05:30
twinFamilies : do f = 1_pInt , lattice_maxNtwinFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
twinSystems : do i = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance )
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
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_gdot0_twin ( instance ) * &
2015-10-30 21:18:30 +05:30
( abs ( tau_twin ) / state ( instance ) % s_twin ( j , of ) ) ** &
2015-10-14 00:22:01 +05:30
plastic_phenopowerlaw_n_twin ( instance ) * 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
2014-12-08 21:25:30 +05:30
dgdot_dtautwin = gdot_twin * plastic_phenopowerlaw_n_twin ( instance ) / 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
2014-12-08 21:25:30 +05:30
real ( pReal ) , dimension ( plastic_phenopowerlaw_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
2014-12-08 21:25:30 +05:30
real ( pReal ) , dimension ( plastic_phenopowerlaw_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
2014-12-08 21:25:30 +05:30
nSlip = plastic_phenopowerlaw_totalNslip ( instance )
nTwin = plastic_phenopowerlaw_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
2014-12-08 21:25:30 +05:30
c_SlipSlip = plastic_phenopowerlaw_h0_SlipSlip ( instance ) * &
( 1.0_pReal + plastic_phenopowerlaw_twinC ( instance ) * plasticState ( ph ) % state ( index_F , of ) ** &
plastic_phenopowerlaw_twinB ( instance ) )
c_TwinSlip = plastic_phenopowerlaw_h0_TwinSlip ( instance ) * &
plasticState ( ph ) % state ( index_Gamma , of ) ** plastic_phenopowerlaw_twinE ( instance )
c_TwinTwin = plastic_phenopowerlaw_h0_TwinTwin ( instance ) * &
plasticState ( ph ) % state ( index_F , of ) ** plastic_phenopowerlaw_twinD ( instance )
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
2014-12-08 21:25:30 +05:30
ssat_offset = plastic_phenopowerlaw_spr ( instance ) * sqrt ( plasticState ( ph ) % state ( index_F , of ) )
2009-07-22 21:37:19 +05:30
j = 0_pInt
2014-11-06 13:57:48 +05:30
slipFamilies1 : do f = 1_pInt , lattice_maxNslipFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
slipSystems1 : do i = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2016-05-12 00:23:05 +05:30
left_SlipSlip ( j ) = 1.0_pReal + plastic_phenopowerlaw_H_int ( f , instance ) ! 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 ) / &
2014-12-08 21:25:30 +05:30
( plastic_phenopowerlaw_tausat_slip ( f , instance ) + ssat_offset ) ) &
** plastic_phenopowerlaw_a_slip ( instance ) &
2014-07-02 17:57:39 +05:30
* sign ( 1.0_pReal , 1.0_pReal - plasticState ( ph ) % state ( j , of ) / &
2014-12-08 21:25:30 +05:30
( plastic_phenopowerlaw_tausat_slip ( f , instance ) + 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 )
2014-12-08 21:25:30 +05:30
tau_slip_pos = tau_slip_pos + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
2014-11-06 13:57:48 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2014-12-08 21:25:30 +05:30
tau_slip_neg = tau_slip_neg + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
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
2014-12-08 21:25:30 +05:30
gdot_slip ( j ) = plastic_phenopowerlaw_gdot0_slip ( instance ) * 0.5_pReal * &
2015-01-29 19:26:09 +05:30
( ( abs ( tau_slip_pos ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** plastic_phenopowerlaw_n_slip ( instance ) &
2016-06-15 01:40:24 +05:30
* sign ( 1.0_pReal , tau_slip_pos ) &
2016-06-15 01:36:04 +05:30
+ ( abs ( tau_slip_neg ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** plastic_phenopowerlaw_n_slip ( instance ) &
* 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
2014-11-06 13:57:48 +05:30
twinFamilies1 : do f = 1_pInt , lattice_maxNtwinFamily
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
twinSystems1 : do i = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance )
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
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_gdot0_twin ( instance ) * &
2014-11-06 13:57:48 +05:30
( abs ( tau_twin ) / plasticState ( ph ) % state ( nslip + j , of ) ) ** &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_n_twin ( instance ) * 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
2014-11-06 13:57:48 +05:30
slipFamilies2 : do f = 1_pInt , lattice_maxNslipFamily
2014-12-08 21:25:30 +05:30
slipSystems2 : do i = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance )
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 ) * &
2014-12-08 21:25:30 +05:30
dot_product ( plastic_phenopowerlaw_hardeningMatrix_SlipSlip ( j , 1 : nSlip , instance ) , &
2012-11-14 15:52:34 +05:30
right_SlipSlip * abs ( gdot_slip ) ) + & ! dot gamma_slip modulated by right-side slip factor
2014-12-08 21:25:30 +05:30
dot_product ( plastic_phenopowerlaw_hardeningMatrix_SlipTwin ( j , 1 : nTwin , 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
2014-11-06 13:57:48 +05:30
twinFamilies2 : do f = 1_pInt , lattice_maxNtwinFamily
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
twinSystems2 : do i = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance )
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 ) * &
2014-12-08 21:25:30 +05:30
dot_product ( plastic_phenopowerlaw_hardeningMatrix_TwinSlip ( j , 1 : nSlip , 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 ) * &
2014-12-08 21:25:30 +05:30
dot_product ( plastic_phenopowerlaw_hardeningMatrix_TwinTwin ( j , 1 : nTwin , 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
2014-12-08 21:25:30 +05:30
nSlip = plastic_phenopowerlaw_totalNslip ( instance )
nTwin = plastic_phenopowerlaw_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
2014-11-06 13:57:48 +05:30
slipFamilies1 : do f = 1_pInt , lattice_maxNslipFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
slipSystems1 : do i = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance )
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 )
2014-12-08 21:25:30 +05:30
tau_slip_pos = tau_slip_pos + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
2014-07-02 17:57:39 +05:30
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
2014-12-08 21:25:30 +05:30
tau_slip_neg = tau_slip_neg + plastic_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
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
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( c + j ) = plastic_phenopowerlaw_gdot0_slip ( instance ) * 0.5_pReal * &
( ( abs ( tau_slip_pos ) / plasticState ( ph ) % state ( j , of ) ) ** plastic_phenopowerlaw_n_slip ( instance ) &
2016-07-18 16:33:23 +05:30
* sign ( 1.0_pReal , tau_slip_pos ) &
+ ( abs ( tau_slip_neg ) / ( plasticState ( ph ) % state ( j , of ) ) ) ** plastic_phenopowerlaw_n_slip ( instance ) &
* 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
2014-11-06 13:57:48 +05:30
slipFamilies2 : do f = 1_pInt , lattice_maxNslipFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NslipSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
slipSystems2 : do i = 1_pInt , plastic_phenopowerlaw_Nslip ( f , instance )
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
2014-11-06 13:57:48 +05:30
twinFamilies1 : do f = 1_pInt , lattice_maxNtwinFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
twinSystems1 : do i = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance )
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
plastic_phenopowerlaw_gdot0_twin ( instance ) * &
2014-08-15 14:39:31 +05:30
( abs ( tau ) / plasticState ( ph ) % state ( j + nSlip , of ) ) ** &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_n_twin ( instance ) * 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
2014-11-06 13:57:48 +05:30
twinFamilies2 : do f = 1_pInt , lattice_maxNtwinFamily
2014-07-02 17:57:39 +05:30
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
2014-12-08 21:25:30 +05:30
twinSystems2 : do i = 1_pInt , plastic_phenopowerlaw_Ntwin ( f , instance )
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