2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
! $Id$
!--------------------------------------------------------------------------------------------------
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
2013-07-01 11:40:42 +05:30
!> @brief material subroutine for phenomenological crystal plasticity formulation using a powerlaw
!! fitting
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
2012-03-09 01:55:28 +05:30
module constitutive_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-03-09 02:20:31 +05:30
constitutive_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 :: &
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_sizePostResult !< size of each post result output
2013-12-12 03:33:09 +05:30
character ( len = 64 ) , dimension ( : , : ) , allocatable , target , public :: &
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_output !< name of each post result output
2014-09-26 15:55:26 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , target , public :: &
constitutive_phenopowerlaw_Noutput !< number of outputs per instance of this constitution
2014-10-28 08:12:25 +05:30
integer ( pInt ) , dimension ( : ) , allocatable , public , protected :: &
2012-10-11 20:19:12 +05:30
constitutive_phenopowerlaw_totalNslip , & !< no. of slip system used in simulation
2014-11-18 16:16:02 +05:30
constitutive_phenopowerlaw_totalNtwin , & !< no. of twin system used in simulation
constitutive_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 :: &
2012-10-11 20:19:12 +05:30
constitutive_phenopowerlaw_Nslip , & !< active number of slip systems per family (input parameter, per family)
2014-11-18 16:16:02 +05:30
constitutive_phenopowerlaw_Ntwin , & !< active number of twin systems per family (input parameter, per family)
constitutive_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 :: &
2012-10-11 20:19:12 +05:30
constitutive_phenopowerlaw_gdot0_slip , & !< reference shear strain rate for slip (input parameter)
constitutive_phenopowerlaw_gdot0_twin , & !< reference shear strain rate for twin (input parameter)
2012-10-22 20:25:07 +05:30
constitutive_phenopowerlaw_n_slip , & !< stress exponent for slip (input parameter)
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_n_twin , & !< stress exponent for twin (input parameter)
2012-10-11 20:19:12 +05:30
constitutive_phenopowerlaw_spr , & !< push-up factor for slip saturation due to twinning
2012-03-09 01:55:28 +05:30
constitutive_phenopowerlaw_twinB , &
constitutive_phenopowerlaw_twinC , &
constitutive_phenopowerlaw_twinD , &
constitutive_phenopowerlaw_twinE , &
2012-11-14 15:52:34 +05:30
constitutive_phenopowerlaw_h0_SlipSlip , & !< reference hardening slip - slip (input parameter)
constitutive_phenopowerlaw_h0_SlipTwin , & !< reference hardening slip - twin (input parameter, no effect at the moment)
constitutive_phenopowerlaw_h0_TwinSlip , & !< reference hardening twin - slip (input parameter)
constitutive_phenopowerlaw_h0_TwinTwin , & !< reference hardening twin - twin (input parameter)
2012-03-09 01:55:28 +05:30
constitutive_phenopowerlaw_a_slip , &
2012-10-22 20:25:07 +05:30
constitutive_phenopowerlaw_aTolResistance , &
constitutive_phenopowerlaw_aTolShear , &
2014-11-18 16:16:02 +05:30
constitutive_phenopowerlaw_aTolTwinfrac , &
2014-11-21 14:24:20 +05:30
constitutive_phenopowerlaw_aTolTransfrac , &
constitutive_phenopowerlaw_Cnuc , & !< coefficient for strain-induced martensite nucleation
constitutive_phenopowerlaw_Cdwp , & !< coefficient for double well potential
constitutive_phenopowerlaw_Cgro , & !< coefficient for stress-assisted martensite growth
constitutive_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 :: &
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_tau0_slip , & !< initial critical shear stress for slip (input parameter, per family)
constitutive_phenopowerlaw_tau0_twin , & !< initial critical shear stress for twin (input parameter, per family)
constitutive_phenopowerlaw_tausat_slip , & !< maximum critical shear stress for slip (input parameter, per family)
constitutive_phenopowerlaw_nonSchmidCoeff , &
2012-11-14 15:52:34 +05:30
constitutive_phenopowerlaw_interaction_SlipSlip , & !< interaction factors slip - slip (input parameter)
constitutive_phenopowerlaw_interaction_SlipTwin , & !< interaction factors slip - twin (input parameter)
constitutive_phenopowerlaw_interaction_TwinSlip , & !< interaction factors twin - slip (input parameter)
constitutive_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 :: &
2012-11-14 15:52:34 +05:30
constitutive_phenopowerlaw_hardeningMatrix_SlipSlip , &
constitutive_phenopowerlaw_hardeningMatrix_SlipTwin , &
constitutive_phenopowerlaw_hardeningMatrix_TwinSlip , &
2014-03-09 02:20:31 +05:30
constitutive_phenopowerlaw_hardeningMatrix_TwinTwin
2013-11-27 17:09:28 +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
2013-12-12 03:33:09 +05:30
integer ( kind ( undefined_ID ) ) , dimension ( : , : ) , allocatable , private :: &
2013-11-27 17:09:28 +05:30
constitutive_phenopowerlaw_outputID !< ID of each post result output
2012-04-11 19:31:02 +05:30
public :: &
constitutive_phenopowerlaw_init , &
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_LpAndItsTangent , &
2012-04-11 19:31:02 +05:30
constitutive_phenopowerlaw_dotState , &
2014-10-10 22:04:51 +05:30
constitutive_phenopowerlaw_getAccumulatedSlip , &
2014-10-11 15:15:30 +05:30
constitutive_phenopowerlaw_getSlipRate , &
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_postResults
2014-05-22 20:46:05 +05:30
private :: &
constitutive_phenopowerlaw_aTolState , &
constitutive_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
!--------------------------------------------------------------------------------------------------
2013-12-12 03:33:09 +05:30
subroutine constitutive_phenopowerlaw_init ( fileUnit )
2012-10-11 20:19:12 +05:30
use , intrinsic :: iso_fortran_env ! to get compiler_version and compiler_options (at least for gfortran 4.6 at the moment)
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 : &
2014-10-10 01:53:06 +05:30
worldrank , &
2014-05-22 20:46:05 +05:30
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
2013-10-09 11:42:16 +05:30
integer ( pInt ) , parameter :: MAXNCHUNKS = LATTICE_maxNinteraction + 1_pInt
2013-07-01 11:40:42 +05:30
integer ( pInt ) , dimension ( 1_pInt + 2_pInt * MAXNCHUNKS ) :: positions
integer ( pInt ) :: &
maxNinstance , &
2014-03-09 02:20:31 +05:30
instance , phase , j , k , f , o , &
2013-07-01 11:40:42 +05:30
Nchunks_SlipSlip , Nchunks_SlipTwin , Nchunks_TwinSlip , Nchunks_TwinTwin , &
2014-11-18 16:16:02 +05:30
Nchunks_SlipFamilies , Nchunks_TwinFamilies , Nchunks_TransFamilies , Nchunks_nonSchmid , &
2014-11-27 02:53:02 +05:30
NipcMyPhase , &
2014-03-09 02:20:31 +05:30
index_myFamily , index_otherFamily , &
2014-05-27 17:40:16 +05:30
mySize = 0_pInt , sizeState , sizeDotState
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
2013-01-09 03:41:59 +05:30
2014-10-10 22:15:14 +05:30
mainProcess : if ( worldrank == 0 ) then
write ( 6 , '(/,a)' ) ' <<<+- constitutive_' / / PLASTICITY_PHENOPOWERLAW_label / / ' init -+>>>'
write ( 6 , '(a)' ) ' $Id$'
write ( 6 , '(a15,a)' ) ' Current time: ' , IO_timeStamp ( )
2012-02-01 00:48:55 +05:30
#include "compilation_info.f90"
2014-10-10 22:15:14 +05:30
endif mainProcess
2009-07-22 21:37:19 +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
allocate ( constitutive_phenopowerlaw_sizePostResults ( maxNinstance ) , source = 0_pInt )
2013-12-12 03:33:09 +05:30
allocate ( constitutive_phenopowerlaw_sizePostResult ( maxval ( phase_Noutput ) , maxNinstance ) , &
source = 0_pInt )
2012-03-09 01:55:28 +05:30
allocate ( constitutive_phenopowerlaw_output ( maxval ( phase_Noutput ) , maxNinstance ) )
constitutive_phenopowerlaw_output = ''
2013-12-12 03:33:09 +05:30
allocate ( constitutive_phenopowerlaw_outputID ( maxval ( phase_Noutput ) , maxNinstance ) , source = undefined_ID )
allocate ( constitutive_phenopowerlaw_Noutput ( maxNinstance ) , source = 0_pInt )
allocate ( constitutive_phenopowerlaw_Nslip ( lattice_maxNslipFamily , maxNinstance ) , source = 0_pInt )
allocate ( constitutive_phenopowerlaw_Ntwin ( lattice_maxNtwinFamily , maxNinstance ) , source = 0_pInt )
2014-11-18 16:16:02 +05:30
allocate ( constitutive_phenopowerlaw_Ntrans ( lattice_maxNtransFamily , maxNinstance ) , source = 0_pInt )
2013-12-12 03:33:09 +05:30
allocate ( constitutive_phenopowerlaw_totalNslip ( maxNinstance ) , source = 0_pInt )
allocate ( constitutive_phenopowerlaw_totalNtwin ( maxNinstance ) , source = 0_pInt )
2014-11-18 16:16:02 +05:30
allocate ( constitutive_phenopowerlaw_totalNtrans ( maxNinstance ) , source = 0_pInt )
2013-12-12 03:33:09 +05:30
allocate ( constitutive_phenopowerlaw_gdot0_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_n_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_tau0_slip ( lattice_maxNslipFamily , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_tausat_slip ( lattice_maxNslipFamily , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_gdot0_twin ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_n_twin ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_tau0_twin ( lattice_maxNtwinFamily , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_spr ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_twinB ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_twinC ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_twinD ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_twinE ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_h0_SlipSlip ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_h0_SlipTwin ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_h0_TwinSlip ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_h0_TwinTwin ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_interaction_SlipSlip ( lattice_maxNinteraction , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_interaction_SlipTwin ( lattice_maxNinteraction , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_interaction_TwinSlip ( lattice_maxNinteraction , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_interaction_TwinTwin ( lattice_maxNinteraction , maxNinstance ) , &
source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_a_slip ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_aTolResistance ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_aTolShear ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_aTolTwinfrac ( maxNinstance ) , source = 0.0_pReal )
2014-11-18 16:16:02 +05:30
allocate ( constitutive_phenopowerlaw_aTolTransfrac ( maxNinstance ) , source = 0.0_pReal )
2013-12-12 03:33:09 +05:30
allocate ( constitutive_phenopowerlaw_nonSchmidCoeff ( lattice_maxNnonSchmid , maxNinstance ) , &
source = 0.0_pReal )
2014-11-21 14:24:20 +05:30
allocate ( constitutive_phenopowerlaw_Cnuc ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_Cdwp ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_phenopowerlaw_Cgro ( maxNinstance ) , source = 0.0_pReal )
allocate ( constitutive_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
exit
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
2014-02-10 20:01:19 +05:30
positions = IO_stringPos ( line , MAXNCHUNKS )
tag = IO_lc ( IO_stringValue ( line , positions , 1_pInt ) ) ! extract key
select case ( tag )
case ( '(output)' )
select case ( IO_lc ( IO_stringValue ( line , positions , 2_pInt ) ) )
case ( 'resistance_slip' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_slip_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'accumulatedshear_slip' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_slip_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'shearrate_slip' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_slip_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_slip' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_slip_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'totalshear' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = totalshear_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resistance_twin' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = resistance_twin_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'accumulatedshear_twin' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = accumulatedshear_twin_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'shearrate_twin' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = shearrate_twin_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-02-10 20:01:19 +05:30
case ( 'resolvedstress_twin' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-06-26 19:23:12 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = resolvedstress_twin_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 2_pInt ) )
2014-11-21 14:24:20 +05:30
case ( 'totalvolfrac_twin' )
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_Noutput ( instance ) = constitutive_phenopowerlaw_Noutput ( instance ) + 1_pInt
2014-11-21 14:24:20 +05:30
constitutive_phenopowerlaw_outputID ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = totalvolfrac_twin_ID
2014-06-25 04:23:25 +05:30
constitutive_phenopowerlaw_output ( constitutive_phenopowerlaw_Noutput ( instance ) , instance ) = &
IO_lc ( IO_stringValue ( line , positions , 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' )
2014-04-29 23:20:59 +05:30
if ( positions ( 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 / / ')' )
2014-04-29 23:20:59 +05:30
if ( positions ( 1 ) > Nchunks_SlipFamilies + 1_pInt ) &
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-11-27 02:53:02 +05:30
Nchunks_SlipFamilies = positions ( 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
2014-04-29 23:20:59 +05:30
constitutive_phenopowerlaw_Nslip ( j , instance ) = IO_intValue ( line , positions , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
2014-04-29 23:20:59 +05:30
case ( 'tausat_slip' , 'tau0_slip' )
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-11-27 02:53:02 +05:30
if ( constitutive_phenopowerlaw_Nslip ( j , instance ) > 0_pInt ) &
tempPerSlip ( j ) = IO_floatValue ( line , positions , 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' )
constitutive_phenopowerlaw_tausat_slip ( 1 : Nchunks_SlipFamilies , instance ) = tempPerSlip ( 1 : Nchunks_SlipFamilies )
case ( 'tau0_slip' )
constitutive_phenopowerlaw_tau0_slip ( 1 : Nchunks_SlipFamilies , instance ) = tempPerSlip ( 1 : Nchunks_SlipFamilies )
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' )
2014-04-29 23:20:59 +05:30
if ( positions ( 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 / / ')' )
2014-04-29 23:20:59 +05:30
if ( positions ( 1 ) > Nchunks_TwinFamilies + 1_pInt ) &
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
2014-02-10 20:01:19 +05:30
Nchunks_TwinFamilies = positions ( 1 ) - 1_pInt
do j = 1_pInt , Nchunks_TwinFamilies
2014-04-29 23:20:59 +05:30
constitutive_phenopowerlaw_Ntwin ( j , instance ) = IO_intValue ( line , positions , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
case ( 'tau0_twin' )
do j = 1_pInt , Nchunks_TwinFamilies
2014-11-27 02:53:02 +05:30
if ( constitutive_phenopowerlaw_Ntwin ( j , instance ) > 0_pInt ) &
constitutive_phenopowerlaw_tau0_twin ( j , instance ) = IO_floatValue ( line , positions , 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' )
if ( positions ( 1 ) < Nchunks_TransFamilies + 1_pInt ) &
call IO_warning ( 51_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( positions ( 1 ) > Nchunks_TransFamilies + 1_pInt ) &
call IO_error ( 150_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
Nchunks_TransFamilies = positions ( 1 ) - 1_pInt
do j = 1_pInt , Nchunks_TransFamilies
constitutive_phenopowerlaw_Ntrans ( j , instance ) = IO_intValue ( line , positions , 1_pInt + j )
enddo
!--------------------------------------------------------------------------------------------------
2014-04-29 23:20:59 +05:30
! parameters depending on number of interactions
case ( 'interaction_sliptwin' )
if ( positions ( 1 ) < 1_pInt + Nchunks_SlipTwin ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_SlipTwin
constitutive_phenopowerlaw_interaction_SlipTwin ( j , instance ) = IO_floatValue ( line , positions , 1_pInt + j )
enddo
case ( 'interaction_twinslip' )
if ( positions ( 1 ) < 1_pInt + Nchunks_TwinSlip ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_TwinSlip
constitutive_phenopowerlaw_interaction_TwinSlip ( j , instance ) = IO_floatValue ( line , positions , 1_pInt + j )
enddo
case ( 'interaction_twintwin' )
if ( positions ( 1 ) < 1_pInt + Nchunks_TwinTwin ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_TwinTwin
constitutive_phenopowerlaw_interaction_TwinTwin ( j , instance ) = IO_floatValue ( line , positions , 1_pInt + j )
enddo
case ( 'nonschmid_coefficients' )
if ( positions ( 1 ) < 1_pInt + Nchunks_nonSchmid ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_nonSchmid
constitutive_phenopowerlaw_nonSchmidCoeff ( j , instance ) = IO_floatValue ( line , positions , 1_pInt + j )
enddo
!--------------------------------------------------------------------------------------------------
! parameters independent of number of slip/twin systems
case ( 'gdot0_slip' )
constitutive_phenopowerlaw_gdot0_slip ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'n_slip' )
constitutive_phenopowerlaw_n_slip ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'a_slip' , 'w0_slip' )
constitutive_phenopowerlaw_a_slip ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'gdot0_twin' )
constitutive_phenopowerlaw_gdot0_twin ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'n_twin' )
constitutive_phenopowerlaw_n_twin ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 's_pr' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_spr ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_b' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_twinB ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_c' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_twinC ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_d' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_twinD ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'twin_e' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_twinE ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_slipslip' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_h0_SlipSlip ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_sliptwin' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_h0_SlipTwin ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
call IO_warning ( 42_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
case ( 'h0_twinslip' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_h0_TwinSlip ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'h0_twintwin' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_h0_TwinTwin ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_resistance' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_aTolResistance ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_shear' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_aTolShear ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'atol_twinfrac' )
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_aTolTwinfrac ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-11-18 16:16:02 +05:30
case ( 'atol_transfrac' )
constitutive_phenopowerlaw_aTolTransfrac ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-11-21 14:24:20 +05:30
case ( 'cnuc' )
constitutive_phenopowerlaw_Cnuc ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'cdwp' )
constitutive_phenopowerlaw_Cdwp ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'cgro' )
constitutive_phenopowerlaw_Cgro ( instance ) = IO_floatValue ( line , positions , 2_pInt )
case ( 'deltag' )
constitutive_phenopowerlaw_deltaG ( instance ) = IO_floatValue ( line , positions , 2_pInt )
2014-02-10 20:01:19 +05:30
case ( 'interaction_slipslip' )
if ( positions ( 1 ) < 1_pInt + Nchunks_SlipSlip ) &
call IO_warning ( 52_pInt , ext_msg = trim ( tag ) / / ' (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
do j = 1_pInt , Nchunks_SlipSlip
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_interaction_SlipSlip ( j , instance ) = IO_floatValue ( line , positions , 1_pInt + j )
2014-02-10 20:01:19 +05:30
enddo
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
instance = phase_plasticityInstance ( phase )
constitutive_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
constitutive_phenopowerlaw_Nslip ( 1 : lattice_maxNslipFamily , instance ) )
2014-03-09 02:20:31 +05:30
constitutive_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
constitutive_phenopowerlaw_Ntwin ( : , instance ) )
2014-11-18 16:16:02 +05:30
constitutive_phenopowerlaw_totalNslip ( instance ) = sum ( constitutive_phenopowerlaw_Nslip ( : , instance ) ) ! how many slip systems altogether
constitutive_phenopowerlaw_totalNtwin ( instance ) = sum ( constitutive_phenopowerlaw_Ntwin ( : , instance ) ) ! how many twin systems altogether
constitutive_phenopowerlaw_totalNtrans ( instance ) = sum ( constitutive_phenopowerlaw_Ntrans ( : , instance ) ) ! how many trans systems altogether
2014-03-09 02:20:31 +05:30
if ( any ( constitutive_phenopowerlaw_tau0_slip ( : , instance ) < 0.0_pReal . and . &
constitutive_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'tau0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( constitutive_phenopowerlaw_gdot0_slip ( instance ) < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'gdot0_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( constitutive_phenopowerlaw_n_slip ( instance ) < = 0.0_pReal ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'n_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( any ( constitutive_phenopowerlaw_tausat_slip ( : , instance ) < = 0.0_pReal . and . &
constitutive_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'tausat_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( any ( constitutive_phenopowerlaw_a_slip ( instance ) == 0.0_pReal . and . &
constitutive_phenopowerlaw_Nslip ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'a_slip (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( any ( constitutive_phenopowerlaw_tau0_twin ( : , instance ) < 0.0_pReal . and . &
constitutive_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'tau0_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( constitutive_phenopowerlaw_gdot0_twin ( instance ) < = 0.0_pReal . and . &
any ( constitutive_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'gdot0_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( constitutive_phenopowerlaw_n_twin ( instance ) < = 0.0_pReal . and . &
any ( constitutive_phenopowerlaw_Ntwin ( : , instance ) > 0 ) ) &
call IO_error ( 211_pInt , el = instance , ext_msg = 'n_twin (' / / PLASTICITY_PHENOPOWERLAW_label / / ')' )
if ( constitutive_phenopowerlaw_aTolResistance ( instance ) < = 0.0_pReal ) &
constitutive_phenopowerlaw_aTolResistance ( instance ) = 1.0_pReal ! default absolute tolerance 1 Pa
if ( constitutive_phenopowerlaw_aTolShear ( instance ) < = 0.0_pReal ) &
constitutive_phenopowerlaw_aTolShear ( instance ) = 1.0e-6_pReal ! default absolute tolerance 1e-6
if ( constitutive_phenopowerlaw_aTolTwinfrac ( instance ) < = 0.0_pReal ) &
constitutive_phenopowerlaw_aTolTwinfrac ( instance ) = 1.0e-6_pReal ! default absolute tolerance 1e-6
2014-11-18 16:16:02 +05:30
if ( constitutive_phenopowerlaw_aTolTransfrac ( instance ) < = 0.0_pReal ) &
constitutive_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
2012-11-14 15:52:34 +05:30
allocate ( constitutive_phenopowerlaw_hardeningMatrix_SlipSlip ( maxval ( constitutive_phenopowerlaw_totalNslip ) , & ! slip resistance from slip activity
2009-07-22 21:37:19 +05:30
maxval ( constitutive_phenopowerlaw_totalNslip ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2012-11-14 15:52:34 +05:30
allocate ( constitutive_phenopowerlaw_hardeningMatrix_SlipTwin ( maxval ( constitutive_phenopowerlaw_totalNslip ) , & ! slip resistance from twin activity
2011-03-24 22:50:35 +05:30
maxval ( constitutive_phenopowerlaw_totalNtwin ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2012-11-14 15:52:34 +05:30
allocate ( constitutive_phenopowerlaw_hardeningMatrix_TwinSlip ( maxval ( constitutive_phenopowerlaw_totalNtwin ) , & ! twin resistance from slip activity
maxval ( constitutive_phenopowerlaw_totalNslip ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
2012-11-14 15:52:34 +05:30
allocate ( constitutive_phenopowerlaw_hardeningMatrix_TwinTwin ( maxval ( constitutive_phenopowerlaw_totalNtwin ) , & ! twin resistance from twin activity
2009-07-22 21:37:19 +05:30
maxval ( constitutive_phenopowerlaw_totalNtwin ) , &
2013-12-12 22:39:59 +05:30
maxNinstance ) , source = 0.0_pReal )
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-03-09 02:20:31 +05:30
outputsLoop : do o = 1_pInt , constitutive_phenopowerlaw_Noutput ( instance )
select case ( constitutive_phenopowerlaw_outputID ( o , instance ) )
case ( resistance_slip_ID , &
shearrate_slip_ID , &
accumulatedshear_slip_ID , &
resolvedstress_slip_ID &
)
mySize = constitutive_phenopowerlaw_totalNslip ( instance )
case ( resistance_twin_ID , &
shearrate_twin_ID , &
accumulatedshear_twin_ID , &
resolvedstress_twin_ID &
)
mySize = constitutive_phenopowerlaw_totalNtwin ( instance )
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
outputFound : if ( mySize > 0_pInt ) then
constitutive_phenopowerlaw_sizePostResult ( o , instance ) = mySize
constitutive_phenopowerlaw_sizePostResults ( instance ) = constitutive_phenopowerlaw_sizePostResults ( instance ) + mySize
endif outputFound
enddo outputsLoop
2014-07-02 17:57:39 +05:30
!--------------------------------------------------------------------------------------------------
! allocate state arrays
2014-11-27 02:53:02 +05:30
sizeState = constitutive_phenopowerlaw_totalNslip ( instance ) & ! s_slip
+ constitutive_phenopowerlaw_totalNtwin ( instance ) & ! s_twin
+ 2_pInt & ! sum(gamma) + sum(f)
+ constitutive_phenopowerlaw_totalNslip ( instance ) & ! accshear_slip
+ constitutive_phenopowerlaw_totalNtwin ( instance ) ! accshear_twin
2014-06-11 22:22:18 +05:30
sizeDotState = sizeState
2014-07-08 20:28:23 +05:30
plasticState ( phase ) % sizeState = sizeState
plasticState ( phase ) % sizeDotState = sizeDotState
2014-06-30 20:17:30 +05:30
plasticState ( phase ) % sizePostResults = constitutive_phenopowerlaw_sizePostResults ( 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 ) % state_backup ( sizeState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % dotState ( sizeDotState , NipcMyPhase ) , source = 0.0_pReal )
allocate ( plasticState ( phase ) % dotState_backup ( sizeDotState , 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 )
2014-07-02 17:57:39 +05:30
2014-05-08 20:25:19 +05:30
do f = 1_pInt , lattice_maxNslipFamily ! >>> interaction slip -- X
2014-03-09 02:20:31 +05:30
index_myFamily = sum ( constitutive_phenopowerlaw_Nslip ( 1 : f - 1_pInt , instance ) )
do j = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance ) ! loop over (active) systems in my family (slip)
do o = 1_pInt , lattice_maxNslipFamily
index_otherFamily = sum ( constitutive_phenopowerlaw_Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , constitutive_phenopowerlaw_Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
constitutive_phenopowerlaw_hardeningMatrix_SlipSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
constitutive_phenopowerlaw_interaction_SlipSlip ( lattice_interactionSlipSlip ( &
sum ( lattice_NslipSystem ( 1 : f - 1 , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1 , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
index_otherFamily = sum ( constitutive_phenopowerlaw_Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , constitutive_phenopowerlaw_Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
constitutive_phenopowerlaw_hardeningMatrix_SlipTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
constitutive_phenopowerlaw_interaction_SlipTwin ( lattice_interactionSlipTwin ( &
sum ( lattice_NslipSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
enddo ; enddo
2014-05-08 20:25:19 +05:30
do f = 1_pInt , lattice_maxNtwinFamily ! >>> interaction twin -- X
2014-03-09 02:20:31 +05:30
index_myFamily = sum ( constitutive_phenopowerlaw_Ntwin ( 1 : f - 1_pInt , instance ) )
do j = 1_pInt , constitutive_phenopowerlaw_Ntwin ( f , instance ) ! loop over (active) systems in my family (twin)
do o = 1_pInt , lattice_maxNslipFamily
index_otherFamily = sum ( constitutive_phenopowerlaw_Nslip ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , constitutive_phenopowerlaw_Nslip ( o , instance ) ! loop over (active) systems in other family (slip)
constitutive_phenopowerlaw_hardeningMatrix_TwinSlip ( index_myFamily + j , index_otherFamily + k , instance ) = &
constitutive_phenopowerlaw_interaction_TwinSlip ( lattice_interactionTwinSlip ( &
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NslipSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
do o = 1_pInt , lattice_maxNtwinFamily
index_otherFamily = sum ( constitutive_phenopowerlaw_Ntwin ( 1 : o - 1_pInt , instance ) )
do k = 1_pInt , constitutive_phenopowerlaw_Ntwin ( o , instance ) ! loop over (active) systems in other family (twin)
constitutive_phenopowerlaw_hardeningMatrix_TwinTwin ( index_myFamily + j , index_otherFamily + k , instance ) = &
constitutive_phenopowerlaw_interaction_TwinTwin ( lattice_interactionTwinTwin ( &
sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , phase ) ) + j , &
sum ( lattice_NtwinSystem ( 1 : o - 1_pInt , phase ) ) + k , &
phase ) , instance )
enddo ; enddo
enddo ; enddo
2014-07-07 19:51:58 +05:30
2014-05-22 20:46:05 +05:30
call constitutive_phenopowerlaw_stateInit ( phase , instance )
call constitutive_phenopowerlaw_aTolState ( phase , instance )
2014-07-02 17:57:39 +05:30
endif myPhase2
2014-03-09 02:20:31 +05:30
enddo initializeInstances
2009-07-22 21:37:19 +05:30
2012-03-09 01:55:28 +05:30
end subroutine constitutive_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-07-02 17:57:39 +05:30
subroutine constitutive_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
2014-05-22 20:46:05 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
instance , & !< number specifying the instance of the plasticity
2014-07-02 17:57:39 +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-07-02 17:57:39 +05:30
tempState ( 1 + sum ( constitutive_phenopowerlaw_Nslip ( 1 : i - 1 , instance ) ) : &
sum ( constitutive_phenopowerlaw_Nslip ( 1 : i , instance ) ) ) = &
2014-11-27 02:53:02 +05:30
constitutive_phenopowerlaw_tau0_slip ( i , instance )
2014-05-22 20:46:05 +05:30
enddo
do i = 1_pInt , lattice_maxNtwinFamily
tempState ( 1 + sum ( constitutive_phenopowerlaw_Nslip ( : , instance ) ) + &
2014-07-02 17:57:39 +05:30
sum ( constitutive_phenopowerlaw_Ntwin ( 1 : i - 1 , instance ) ) : &
sum ( constitutive_phenopowerlaw_Nslip ( : , instance ) ) + &
sum ( constitutive_phenopowerlaw_Ntwin ( 1 : i , instance ) ) ) = &
2014-11-27 02:53:02 +05:30
constitutive_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-08-04 23:20:01 +05:30
end subroutine constitutive_phenopowerlaw_stateInit
2014-05-22 20:46:05 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief sets the relevant state values for a given instance of this plasticity
!--------------------------------------------------------------------------------------------------
2014-07-02 17:57:39 +05:30
subroutine constitutive_phenopowerlaw_aTolState ( ph , instance )
2014-05-22 20:46:05 +05:30
use material , only : &
plasticState
implicit none
integer ( pInt ) , intent ( in ) :: &
instance , & !< number specifying the instance of the plasticity
2014-07-02 17:57:39 +05:30
ph
plasticState ( ph ) % aTolState ( 1 : constitutive_phenopowerlaw_totalNslip ( instance ) + &
constitutive_phenopowerlaw_totalNtwin ( instance ) ) = &
constitutive_phenopowerlaw_aTolResistance ( instance )
plasticState ( ph ) % aTolState ( 1 + constitutive_phenopowerlaw_totalNslip ( instance ) + &
constitutive_phenopowerlaw_totalNtwin ( instance ) ) = &
constitutive_phenopowerlaw_aTolShear ( instance )
plasticState ( ph ) % aTolState ( 2 + constitutive_phenopowerlaw_totalNslip ( instance ) + &
constitutive_phenopowerlaw_totalNtwin ( instance ) ) = &
constitutive_phenopowerlaw_aTolTwinFrac ( instance )
plasticState ( ph ) % aTolState ( 3 + constitutive_phenopowerlaw_totalNslip ( instance ) + &
constitutive_phenopowerlaw_totalNtwin ( instance ) : &
2 + 2 * ( constitutive_phenopowerlaw_totalNslip ( instance ) + &
constitutive_phenopowerlaw_totalNtwin ( instance ) ) ) = &
constitutive_phenopowerlaw_aTolShear ( instance )
2014-05-22 20:46:05 +05:30
2014-07-02 17:57:39 +05:30
end subroutine constitutive_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
!--------------------------------------------------------------------------------------------------
2014-10-28 08:12:25 +05:30
subroutine constitutive_phenopowerlaw_LpAndItsTangent ( Lp , dLp_dTstar99 , Tstar_v , slipDamage , ipc , ip , el )
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 : &
material_phase , &
2014-07-02 17:57:39 +05:30
plasticState , &
mappingConstitutive , &
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
real ( pReal ) , &
dimension ( constitutive_phenopowerlaw_totalNslip ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) , &
intent ( in ) :: &
slipDamage
2014-05-22 20:46:05 +05:30
2013-07-01 11:40:42 +05:30
integer ( pInt ) :: &
2014-02-28 15:48:40 +05:30
instance , &
2013-07-01 11:40:42 +05:30
nSlip , &
2014-09-23 02:04:42 +05:30
nTwin , index_Gamma , index_F , 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
2014-03-09 02:20:31 +05:30
2014-07-02 17:57:39 +05:30
of = mappingConstitutive ( 1 , ipc , ip , el )
ph = mappingConstitutive ( 2 , ipc , ip , el )
instance = phase_plasticityInstance ( ph )
2014-02-28 15:48:40 +05:30
nSlip = constitutive_phenopowerlaw_totalNslip ( instance )
nTwin = constitutive_phenopowerlaw_totalNtwin ( instance )
2012-02-21 21:30:00 +05:30
index_Gamma = nSlip + nTwin + 1_pInt
index_F = nSlip + nTwin + 2_pInt
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
slipSystems : do i = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2012-10-11 20:19:12 +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 )
2014-07-02 17:57:39 +05:30
do k = 1 , lattice_NnonSchmid ( ph )
2014-11-06 13:57:48 +05:30
tau_slip_pos = tau_slip_pos + constitutive_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-11-06 13:57:48 +05:30
tau_slip_neg = tau_slip_neg + constitutive_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-02-28 15:48:40 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 1 ) + constitutive_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-02-28 15:48:40 +05:30
nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) = nonSchmid_tensor ( 1 : 3 , 1 : 3 , 2 ) + constitutive_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-11-06 13:57:48 +05:30
gdot_slip_pos = 0.5_pReal * constitutive_phenopowerlaw_gdot0_slip ( instance ) * &
( ( abs ( tau_slip_pos ) / ( slipDamage ( j ) * plasticState ( ph ) % state ( j , of ) ) ) &
** constitutive_phenopowerlaw_n_slip ( instance ) ) * sign ( 1.0_pReal , tau_slip_pos )
2014-05-22 20:46:05 +05:30
2014-11-06 13:57:48 +05:30
gdot_slip_neg = 0.5_pReal * constitutive_phenopowerlaw_gdot0_slip ( instance ) * &
( ( abs ( tau_slip_neg ) / ( slipDamage ( j ) * plasticState ( ph ) % state ( j , of ) ) ) &
** constitutive_phenopowerlaw_n_slip ( instance ) ) * sign ( 1.0_pReal , tau_slip_neg )
2014-05-22 20:46:05 +05:30
2014-07-02 17:57:39 +05:30
Lp = Lp + ( 1.0_pReal - plasticState ( ph ) % state ( index_F , 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
2014-11-06 13:57:48 +05:30
if ( gdot_slip_pos / = 0.0_pReal ) then
dgdot_dtauslip_pos = gdot_slip_pos * constitutive_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
2014-11-06 13:57:48 +05:30
if ( gdot_slip_neg / = 0.0_pReal ) then
dgdot_dtauslip_neg = gdot_slip_neg * constitutive_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-11-06 13:57:48 +05:30
twinSystems : do i = 1_pInt , constitutive_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
2014-11-06 13:57:48 +05:30
tau_twin = dot_product ( Tstar_v , lattice_Stwin_v ( 1 : 6 , index_myFamily + i , ph ) )
gdot_twin = ( 1.0_pReal - plasticState ( ph ) % state ( index_F , of ) ) * & ! 1-F
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_gdot0_twin ( instance ) * &
2014-11-06 13:57:48 +05:30
( abs ( tau_twin ) / plasticState ( ph ) % state ( nSlip + j , of ) ) ** &
constitutive_phenopowerlaw_n_twin ( instance ) * max ( 0.0_pReal , sign ( 1.0_pReal , tau_twin ) )
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
2014-11-06 13:57:48 +05:30
if ( gdot_twin / = 0.0_pReal ) then
dgdot_dtautwin = gdot_twin * constitutive_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-07-02 17:57:39 +05:30
end subroutine constitutive_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
!--------------------------------------------------------------------------------------------------
2014-08-10 16:17:12 +05:30
subroutine constitutive_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 , &
2013-08-05 14:53:21 +05:30
lattice_NnonSchmid
2013-07-01 11:40:42 +05:30
use material , only : &
material_phase , &
2014-07-02 17:57:39 +05:30
mappingConstitutive , &
plasticState , &
2013-07-01 11:40:42 +05:30
phase_plasticityInstance
2012-03-09 01:55:28 +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 ) :: &
c_SlipSlip , c_SlipTwin , 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
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_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
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_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
2014-07-02 17:57:39 +05:30
of = mappingConstitutive ( 1 , ipc , ip , el )
ph = mappingConstitutive ( 2 , ipc , ip , el )
instance = phase_plasticityInstance ( ph )
2009-07-22 21:37:19 +05:30
2014-02-28 15:48:40 +05:30
nSlip = constitutive_phenopowerlaw_totalNslip ( instance )
nTwin = constitutive_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
2012-10-11 20:19:12 +05:30
2014-07-02 17:57:39 +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-02-28 15:48:40 +05:30
c_SlipSlip = constitutive_phenopowerlaw_h0_SlipSlip ( instance ) * &
2014-07-02 17:57:39 +05:30
( 1.0_pReal + constitutive_phenopowerlaw_twinC ( instance ) * plasticState ( ph ) % state ( index_F , of ) ** &
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_twinB ( instance ) )
2012-11-14 15:52:34 +05:30
c_SlipTwin = 0.0_pReal
2014-02-28 15:48:40 +05:30
c_TwinSlip = constitutive_phenopowerlaw_h0_TwinSlip ( instance ) * &
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % state ( index_Gamma , of ) ** constitutive_phenopowerlaw_twinE ( instance )
2014-02-28 15:48:40 +05:30
c_TwinTwin = constitutive_phenopowerlaw_h0_TwinTwin ( instance ) * &
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % state ( index_F , of ) ** constitutive_phenopowerlaw_twinD ( instance )
2013-07-01 11:40:42 +05:30
!--------------------------------------------------------------------------------------------------
! calculate left and right vectors and calculate dot gammas
2014-07-02 17:57:39 +05:30
ssat_offset = constitutive_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-11-06 13:57:48 +05:30
slipSystems1 : do i = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2013-07-01 11:40:42 +05:30
left_SlipSlip ( j ) = 1.0_pReal ! no system-dependent left part
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-05-22 20:46:05 +05:30
( constitutive_phenopowerlaw_tausat_slip ( f , instance ) + ssat_offset ) ) &
** constitutive_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-05-22 20:46:05 +05:30
( constitutive_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
2009-07-22 21:37:19 +05:30
2012-10-11 20:19:12 +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
nonSchmidSystems : do k = 1 , lattice_NnonSchmid ( ph )
tau_slip_pos = tau_slip_pos + constitutive_phenopowerlaw_nonSchmidCoeff ( k , instance ) * &
dot_product ( Tstar_v , lattice_Sslip_v ( 1 : 6 , 2 * k , index_myFamily + i , ph ) )
tau_slip_neg = tau_slip_neg + constitutive_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-05-22 20:46:05 +05:30
gdot_slip ( j ) = constitutive_phenopowerlaw_gdot0_slip ( instance ) * 0.5_pReal * &
2014-11-06 13:57:48 +05:30
( ( abs ( tau_slip_pos ) / plasticState ( ph ) % state ( j , of ) ) ** constitutive_phenopowerlaw_n_slip ( instance ) &
+ ( abs ( tau_slip_neg ) / plasticState ( ph ) % state ( j , of ) ) ** constitutive_phenopowerlaw_n_slip ( instance ) ) &
* sign ( 1.0_pReal , tau_slip_pos )
enddo slipSystems1
enddo slipFamilies1
2009-07-22 21:37:19 +05:30
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
twinFamilies1 : do f = 1_pInt , lattice_maxNtwinFamily
index_myFamily = sum ( lattice_NtwinSystem ( 1 : f - 1_pInt , ph ) ) ! at which index starts my family
twinSystems1 : do i = 1_pInt , constitutive_phenopowerlaw_Ntwin ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2012-11-14 15:52:34 +05:30
left_TwinSlip ( j ) = 1.0_pReal ! no system-dependent right part
left_TwinTwin ( j ) = 1.0_pReal ! no system-dependent right part
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
2014-11-06 13:57:48 +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-05-22 20:46:05 +05:30
constitutive_phenopowerlaw_gdot0_twin ( instance ) * &
2014-11-06 13:57:48 +05:30
( abs ( tau_twin ) / plasticState ( ph ) % state ( nslip + j , of ) ) ** &
constitutive_phenopowerlaw_n_twin ( instance ) * max ( 0.0_pReal , sign ( 1.0_pReal , tau_twin ) )
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
slipSystems2 : do i = 1_pInt , constitutive_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-02-28 15:48:40 +05:30
dot_product ( constitutive_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
c_SlipTwin * left_SlipTwin ( j ) * &
2014-02-28 15:48:40 +05:30
dot_product ( constitutive_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
twinSystems2 : do i = 1_pInt , constitutive_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-02-28 15:48:40 +05:30
dot_product ( constitutive_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-02-28 15:48:40 +05:30
dot_product ( constitutive_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
2014-07-02 17:57:39 +05:30
if ( plasticState ( ph ) % state ( index_F , of ) < 0.98_pReal ) & ! ensure twin volume fractions stays below 1.0
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
2014-05-22 20:46:05 +05:30
2014-07-02 17:57:39 +05:30
end subroutine constitutive_phenopowerlaw_dotState
2009-07-22 21:37:19 +05:30
2014-10-10 22:04:51 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip
!--------------------------------------------------------------------------------------------------
2014-11-06 13:57:48 +05:30
subroutine constitutive_phenopowerlaw_getAccumulatedSlip ( nSlip , accumulatedSlip , ipc , ip , el ) ! question: make function, shape (i.e. nslip) is automatically returned
2014-10-10 22:04:51 +05:30
use lattice , only : &
lattice_maxNslipFamily
use material , only : &
mappingConstitutive , &
plasticState , &
phase_plasticityInstance
2014-11-06 13:57:48 +05:30
implicit none
2014-10-10 22:04:51 +05:30
real ( pReal ) , dimension ( : ) , allocatable :: &
accumulatedSlip
integer ( pInt ) :: &
nSlip
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
integer ( pInt ) :: &
offset , &
phase , &
instance , &
offset_accshear_slip , &
nTwin , &
f , j , i
offset = mappingConstitutive ( 1 , ipc , ip , el )
phase = mappingConstitutive ( 2 , ipc , ip , el )
instance = phase_plasticityInstance ( phase )
nSlip = constitutive_phenopowerlaw_totalNslip ( instance )
nTwin = constitutive_phenopowerlaw_totalNtwin ( instance )
offset_accshear_slip = nSlip + nTwin + 2_pInt
allocate ( accumulatedSlip ( nSlip ) )
j = 0_pInt
slipFamiliesLoop : do f = 1_pInt , lattice_maxNslipFamily
do i = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance ) ! process each (active) slip system in family
j = j + 1_pInt
accumulatedSlip ( j ) = plasticState ( phase ) % state ( offset_accshear_slip + j , offset )
enddo
enddo slipFamiliesLoop
end subroutine constitutive_phenopowerlaw_getAccumulatedSlip
2014-10-11 15:15:30 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns accumulated slip rate
!--------------------------------------------------------------------------------------------------
2014-11-06 13:57:48 +05:30
subroutine constitutive_phenopowerlaw_getSlipRate ( nSlip , slipRate , ipc , ip , el ) ! question: make function, shape (i.e. nslip) is automatically returned
2014-10-11 15:15:30 +05:30
use lattice , only : &
lattice_maxNslipFamily
use material , only : &
mappingConstitutive , &
plasticState , &
phase_plasticityInstance
2014-10-13 18:01:04 +05:30
implicit none
2014-10-11 15:15:30 +05:30
real ( pReal ) , dimension ( : ) , allocatable :: &
slipRate
integer ( pInt ) :: &
nSlip
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
integer ( pInt ) :: &
offset , &
phase , &
instance , &
offset_accshear_slip , &
nTwin , &
f , j , i
offset = mappingConstitutive ( 1 , ipc , ip , el )
phase = mappingConstitutive ( 2 , ipc , ip , el )
instance = phase_plasticityInstance ( phase )
nSlip = constitutive_phenopowerlaw_totalNslip ( instance )
nTwin = constitutive_phenopowerlaw_totalNtwin ( instance )
offset_accshear_slip = nSlip + nTwin + 2_pInt
allocate ( slipRate ( nSlip ) )
j = 0_pInt
slipFamiliesLoop : do f = 1_pInt , lattice_maxNslipFamily
do i = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance ) ! process each (active) slip system in family
j = j + 1_pInt
slipRate ( j ) = plasticState ( phase ) % dotState ( offset_accshear_slip + j , offset )
enddo
enddo slipFamiliesLoop
end subroutine constitutive_phenopowerlaw_getSlipRate
2012-10-11 20:19:12 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief return array of constitutive results
!--------------------------------------------------------------------------------------------------
2014-08-15 14:39:31 +05:30
function constitutive_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 , &
mappingConstitutive , &
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 , &
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
2012-03-12 19:39:37 +05:30
real ( pReal ) , dimension ( constitutive_phenopowerlaw_sizePostResults ( phase_plasticityInstance ( material_phase ( ipc , ip , el ) ) ) ) :: &
2009-07-22 21:37:19 +05:30
constitutive_phenopowerlaw_postResults
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 , &
index_Gamma , index_F , index_accshear_slip , index_accshear_twin , index_myFamily
real ( pReal ) :: &
tau_slip_pos , tau_slip_neg , tau
2014-07-02 17:57:39 +05:30
of = mappingConstitutive ( 1 , ipc , ip , el )
ph = mappingConstitutive ( 2 , ipc , ip , el )
instance = phase_plasticityInstance ( ph )
2009-07-22 21:37:19 +05:30
2014-02-28 15:48:40 +05:30
nSlip = constitutive_phenopowerlaw_totalNslip ( instance )
nTwin = constitutive_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
constitutive_phenopowerlaw_postResults = 0.0_pReal
c = 0_pInt
2014-06-25 04:23:25 +05:30
outputsLoop : do o = 1_pInt , constitutive_phenopowerlaw_Noutput ( instance )
2014-02-28 15:48:40 +05:30
select case ( constitutive_phenopowerlaw_outputID ( o , instance ) )
2013-11-27 17:09:28 +05:30
case ( resistance_slip_ID )
2014-07-02 17:57:39 +05:30
constitutive_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-07-02 17:57:39 +05:30
constitutive_phenopowerlaw_postResults ( c + 1_pInt : c + nSlip ) = plasticState ( ph ) % state ( index_accshear_slip : &
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-11-06 13:57:48 +05:30
slipSystems1 : do i = 1_pInt , constitutive_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
2014-07-02 17:57:39 +05:30
do k = 1 , lattice_NnonSchmid ( ph )
2014-02-28 15:48:40 +05:30
tau_slip_pos = tau_slip_pos + constitutive_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-02-28 15:48:40 +05:30
tau_slip_neg = tau_slip_neg + constitutive_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-05-22 20:46:05 +05:30
constitutive_phenopowerlaw_postResults ( c + j ) = constitutive_phenopowerlaw_gdot0_slip ( instance ) * 0.5_pReal * &
2014-08-15 14:39:31 +05:30
( ( abs ( tau_slip_pos ) / plasticState ( ph ) % state ( j , of ) ) ** constitutive_phenopowerlaw_n_slip ( instance ) &
+ ( abs ( tau_slip_neg ) / plasticState ( ph ) % state ( j , of ) ) ** constitutive_phenopowerlaw_n_slip ( instance ) ) &
2014-05-22 20:46:05 +05:30
* sign ( 1.0_pReal , tau_slip_pos )
2014-07-02 17:57:39 +05:30
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-11-06 13:57:48 +05:30
slipSystems2 : do i = 1_pInt , constitutive_phenopowerlaw_Nslip ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2013-07-01 11:40:42 +05:30
constitutive_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-05-22 20:46:05 +05:30
constitutive_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 )
2013-07-01 11:40:42 +05:30
constitutive_phenopowerlaw_postResults ( c + 1_pInt : c + nTwin ) = &
2014-07-02 17:57:39 +05:30
plasticState ( ph ) % state ( 1_pInt + nSlip : nTwin + nSlip - 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-05-22 20:46:05 +05:30
constitutive_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-11-06 13:57:48 +05:30
twinSystems1 : do i = 1_pInt , constitutive_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 ) )
constitutive_phenopowerlaw_postResults ( c + j ) = ( 1.0_pReal - plasticState ( ph ) % state ( index_F , of ) ) * & ! 1-F
2014-02-28 15:48:40 +05:30
constitutive_phenopowerlaw_gdot0_twin ( instance ) * &
2014-08-15 14:39:31 +05:30
( abs ( tau ) / plasticState ( ph ) % state ( j + nSlip , of ) ) ** &
2014-02-28 15:48:40 +05:30
constitutive_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-11-06 13:57:48 +05:30
twinSystems2 : do i = 1_pInt , constitutive_phenopowerlaw_Ntwin ( f , instance )
2009-07-22 21:37:19 +05:30
j = j + 1_pInt
2013-07-01 11:40:42 +05:30
constitutive_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-07-02 17:57:39 +05:30
constitutive_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
2012-03-09 01:55:28 +05:30
end function constitutive_phenopowerlaw_postResults
2009-07-22 21:37:19 +05:30
2012-03-09 01:55:28 +05:30
end module constitutive_phenopowerlaw