2012-10-02 18:23:25 +05:30
!--------------------------------------------------------------------------------------------------
2013-03-06 20:11:15 +05:30
! $Id$
2012-10-02 18:23:25 +05:30
!--------------------------------------------------------------------------------------------------
!> @author Franz Roters, Max-Planck-Institut für Eisenforschung GmbH
2013-03-06 20:11:15 +05:30
!> @author Philip Eisenlohr, Max-Planck-Institut für Eisenforschung GmbH
2012-10-02 18:23:25 +05:30
!> @brief elasticity, plasticity, internal microstructure state
!--------------------------------------------------------------------------------------------------
module constitutive
2013-01-16 15:44:57 +05:30
use prec , only : &
2014-07-02 17:57:39 +05:30
pInt
2013-01-16 15:44:57 +05:30
implicit none
private
2014-05-27 20:16:03 +05:30
integer ( pInt ) , public , protected :: &
constitutive_maxSizePostResults , &
2014-09-23 16:08:20 +05:30
constitutive_maxSizeDotState , &
constitutive_damage_maxSizePostResults , &
constitutive_damage_maxSizeDotState , &
constitutive_thermal_maxSizePostResults , &
2014-10-11 02:25:09 +05:30
constitutive_thermal_maxSizeDotState , &
constitutive_vacancy_maxSizePostResults , &
constitutive_vacancy_maxSizeDotState
2014-06-26 19:23:12 +05:30
2013-01-16 15:44:57 +05:30
public :: &
constitutive_init , &
constitutive_homogenizedC , &
2014-10-27 21:03:35 +05:30
constitutive_damagedC , &
2013-01-16 15:44:57 +05:30
constitutive_microstructure , &
constitutive_LpAndItsTangent , &
2014-11-01 00:33:08 +05:30
constitutive_LiAndItsTangent , &
2013-01-16 15:44:57 +05:30
constitutive_TandItsTangent , &
constitutive_collectDotState , &
constitutive_collectDeltaState , &
2014-09-05 22:01:27 +05:30
constitutive_getLocalDamage , &
2014-09-22 23:45:19 +05:30
constitutive_putLocalDamage , &
2014-09-26 23:37:48 +05:30
constitutive_getDamage , &
2014-10-11 15:39:36 +05:30
constitutive_getDamageDiffusion33 , &
2014-09-26 23:37:48 +05:30
constitutive_getAdiabaticTemperature , &
constitutive_putAdiabaticTemperature , &
constitutive_getTemperature , &
2014-12-17 19:07:13 +05:30
constitutive_getHeatGeneration , &
2014-10-11 02:25:09 +05:30
constitutive_getLocalVacancyConcentration , &
constitutive_putLocalVacancyConcentration , &
constitutive_getVacancyConcentration , &
2014-10-11 16:09:44 +05:30
constitutive_getVacancyDiffusion33 , &
2014-11-25 22:53:37 +05:30
constitutive_getVacancyMobility33 , &
2015-01-16 22:34:01 +05:30
constitutive_getVacancyEnergy , &
2013-01-16 15:44:57 +05:30
constitutive_postResults
private :: &
2015-01-05 00:56:33 +05:30
constitutive_hooke_TandItsTangent
2013-01-16 15:44:57 +05:30
2012-03-09 01:55:28 +05:30
contains
2012-10-02 18:23:25 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief allocates arrays pointing to array of the various constitutive modules
!--------------------------------------------------------------------------------------------------
2014-10-13 23:24:27 +05:30
subroutine constitutive_init ( temperature_init )
2014-03-12 13:03:51 +05:30
#ifdef HDF
use hdf5 , only : &
HID_T
use IO , only : &
2014-03-12 22:21:01 +05:30
HDF5_mappingConstitutive
2014-03-12 13:03:51 +05:30
#endif
2012-10-02 18:23:25 +05:30
use , intrinsic :: iso_fortran_env ! to get compiler_version and compiler_options (at least for gfortran 4.6 at the moment)
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
2013-01-16 15:44:57 +05:30
use debug , only : &
debug_constitutive , &
debug_levelBasic
use numerics , only : &
2015-04-21 21:41:30 +05:30
worldrank
2013-01-16 15:44:57 +05:30
use IO , only : &
IO_error , &
IO_open_file , &
IO_open_jobFile_stat , &
IO_write_jobFile , &
2013-09-18 19:37:55 +05:30
IO_write_jobIntFile , &
2013-02-25 22:04:59 +05:30
IO_timeStamp
2013-01-16 15:44:57 +05:30
use mesh , only : &
FE_geomtype
use material , only : &
material_phase , &
material_Nphase , &
material_localFileExt , &
material_configFile , &
phase_name , &
phase_plasticity , &
phase_plasticityInstance , &
2014-09-23 16:08:20 +05:30
phase_damage , &
phase_damageInstance , &
phase_thermal , &
phase_thermalInstance , &
2014-10-11 02:25:09 +05:30
phase_vacancy , &
phase_vacancyInstance , &
2014-10-09 19:38:32 +05:30
ELASTICITY_hooke_ID , &
PLASTICITY_none_ID , &
PLASTICITY_j2_ID , &
PLASTICITY_phenopowerlaw_ID , &
PLASTICITY_dislotwin_ID , &
PLASTICITY_dislokmc_ID , &
2015-01-15 16:26:15 +05:30
PLASTICITY_disloucla_ID , &
2014-10-09 19:38:32 +05:30
PLASTICITY_titanmod_ID , &
PLASTICITY_nonlocal_ID , &
2013-11-27 13:34:05 +05:30
ELASTICITY_HOOKE_label , &
PLASTICITY_NONE_label , &
PLASTICITY_J2_label , &
PLASTICITY_PHENOPOWERLAW_label , &
PLASTICITY_DISLOTWIN_label , &
2014-08-08 16:34:40 +05:30
PLASTICITY_DISLOKMC_label , &
2015-01-15 16:26:15 +05:30
PLASTICITY_DISLOUCLA_label , &
2013-11-27 13:34:05 +05:30
PLASTICITY_TITANMOD_label , &
2014-08-08 16:34:40 +05:30
PLASTICITY_NONLOCAL_label , &
2014-10-09 19:38:32 +05:30
LOCAL_DAMAGE_none_ID , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-05 23:11:08 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-10-10 18:12:12 +05:30
LOCAL_DAMAGE_gurson_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-10-09 19:38:32 +05:30
LOCAL_THERMAL_isothermal_ID , &
LOCAL_THERMAL_adiabatic_ID , &
2014-10-11 02:25:09 +05:30
LOCAL_VACANCY_constant_ID , &
LOCAL_VACANCY_generation_ID , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_none_LABEL , &
LOCAL_DAMAGE_isoBrittle_LABEL , &
LOCAL_DAMAGE_isoDuctile_LABEL , &
LOCAL_DAMAGE_anisoBrittle_LABEL , &
2014-11-05 23:11:08 +05:30
LOCAL_DAMAGE_anisoDuctile_LABEL , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_gurson_LABEL , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_label , &
2014-10-10 18:12:12 +05:30
LOCAL_THERMAL_isothermal_label , &
LOCAL_THERMAL_adiabatic_label , &
2014-10-11 02:25:09 +05:30
LOCAL_VACANCY_constant_label , &
LOCAL_VACANCY_generation_label , &
2014-05-08 20:25:19 +05:30
plasticState , &
2014-09-23 16:08:20 +05:30
damageState , &
thermalState , &
2015-04-21 21:41:30 +05:30
vacancyState
2014-08-08 16:34:40 +05:30
2014-12-08 21:25:30 +05:30
use plastic_none
use plastic_j2
use plastic_phenopowerlaw
use plastic_dislotwin
use plastic_dislokmc
2015-01-15 16:26:15 +05:30
use plastic_disloucla
2014-12-08 21:25:30 +05:30
use plastic_titanmod
use plastic_nonlocal
2014-09-23 16:08:20 +05:30
use damage_none
2014-10-28 16:19:12 +05:30
use damage_isoBrittle
use damage_isoDuctile
2014-11-05 23:11:08 +05:30
use damage_anisoDuctile
2014-10-28 16:19:12 +05:30
use damage_anisoBrittle
2014-10-10 18:12:12 +05:30
use damage_gurson
2014-11-25 22:53:37 +05:30
use damage_phaseField
2014-09-26 21:37:26 +05:30
use thermal_isothermal
2014-10-09 19:38:32 +05:30
use thermal_adiabatic
2014-10-11 02:25:09 +05:30
use vacancy_constant
use vacancy_generation
2013-01-16 15:44:57 +05:30
implicit none
2014-10-13 23:24:27 +05:30
real ( pReal ) , intent ( in ) :: temperature_init !< initial temperature
2013-12-12 22:39:59 +05:30
integer ( pInt ) , parameter :: FILEUNIT = 200_pInt
2013-01-16 15:44:57 +05:30
integer ( pInt ) :: &
2014-10-13 23:24:27 +05:30
e , & !< maximum number of elements
2014-02-28 15:48:40 +05:30
phase , &
2014-07-03 18:47:29 +05:30
instance
2014-05-08 20:25:19 +05:30
2013-01-16 15:44:57 +05:30
integer ( pInt ) , dimension ( : , : ) , pointer :: thisSize
2014-09-26 15:55:26 +05:30
integer ( pInt ) , dimension ( : ) , pointer :: thisNoutput
2013-01-16 15:44:57 +05:30
character ( len = 64 ) , dimension ( : , : ) , pointer :: thisOutput
2013-11-27 13:34:05 +05:30
character ( len = 32 ) :: outputName !< name of output, intermediate fix until HDF5 output is ready
2014-10-11 02:25:09 +05:30
logical :: knownPlasticity , knownDamage , knownThermal , knownVacancy , nonlocalConstitutionPresent
2013-05-24 19:13:44 +05:30
nonlocalConstitutionPresent = . false .
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
! parse plasticities from config file
2013-12-12 22:39:59 +05:30
if ( . not . IO_open_jobFile_stat ( FILEUNIT , material_localFileExt ) ) & ! no local material configuration present...
call IO_open_file ( FILEUNIT , material_configFile ) ! ... open material.config file
2014-12-08 21:25:30 +05:30
if ( any ( phase_plasticity == PLASTICITY_NONE_ID ) ) call plastic_none_init
if ( any ( phase_plasticity == PLASTICITY_J2_ID ) ) call plastic_j2_init ( FILEUNIT )
if ( any ( phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID ) ) call plastic_phenopowerlaw_init ( FILEUNIT )
if ( any ( phase_plasticity == PLASTICITY_DISLOTWIN_ID ) ) call plastic_dislotwin_init ( FILEUNIT )
if ( any ( phase_plasticity == PLASTICITY_DISLOKMC_ID ) ) call plastic_dislokmc_init ( FILEUNIT )
2015-01-15 16:26:15 +05:30
if ( any ( phase_plasticity == PLASTICITY_DISLOUCLA_ID ) ) call plastic_disloucla_init ( FILEUNIT )
2014-12-08 21:25:30 +05:30
if ( any ( phase_plasticity == PLASTICITY_TITANMOD_ID ) ) call plastic_titanmod_init ( FILEUNIT )
2014-07-08 20:28:23 +05:30
if ( any ( phase_plasticity == PLASTICITY_NONLOCAL_ID ) ) then
2014-12-08 21:25:30 +05:30
call plastic_nonlocal_init ( FILEUNIT )
call plastic_nonlocal_stateInit ( )
2014-07-08 20:28:23 +05:30
endif
2013-12-12 22:39:59 +05:30
close ( FILEUNIT )
2014-09-23 16:08:20 +05:30
!--------------------------------------------------------------------------------------------------
! parse damage from config file
if ( . not . IO_open_jobFile_stat ( FILEUNIT , material_localFileExt ) ) & ! no local material configuration present...
call IO_open_file ( FILEUNIT , material_configFile ) ! ... open material.config file
2014-11-07 17:45:28 +05:30
if ( any ( phase_damage == LOCAL_DAMAGE_none_ID ) ) call damage_none_init
2014-10-28 16:19:12 +05:30
if ( any ( phase_damage == LOCAL_DAMAGE_isoBrittle_ID ) ) call damage_isoBrittle_init ( FILEUNIT )
if ( any ( phase_damage == LOCAL_DAMAGE_isoductile_ID ) ) call damage_isoDuctile_init ( FILEUNIT )
if ( any ( phase_damage == LOCAL_DAMAGE_anisoBrittle_ID ) ) call damage_anisoBrittle_init ( FILEUNIT )
2014-11-05 23:11:08 +05:30
if ( any ( phase_damage == LOCAL_DAMAGE_anisoductile_ID ) ) call damage_anisoDuctile_init ( FILEUNIT )
if ( any ( phase_damage == LOCAL_DAMAGE_gurson_ID ) ) call damage_gurson_init ( FILEUNIT )
2014-11-25 22:53:37 +05:30
if ( any ( phase_damage == LOCAL_DAMAGE_phaseField_ID ) ) call damage_phaseField_init ( FILEUNIT )
2014-09-23 16:08:20 +05:30
close ( FILEUNIT )
2013-01-16 15:44:57 +05:30
2014-09-23 16:08:20 +05:30
!--------------------------------------------------------------------------------------------------
! parse thermal from config file
if ( . not . IO_open_jobFile_stat ( FILEUNIT , material_localFileExt ) ) & ! no local material configuration present...
call IO_open_file ( FILEUNIT , material_configFile ) ! ... open material.config file
2014-11-07 17:45:28 +05:30
if ( any ( phase_thermal == LOCAL_THERMAL_isothermal_ID ) ) call thermal_isothermal_init ( temperature_init )
2014-10-13 23:24:27 +05:30
if ( any ( phase_thermal == LOCAL_THERMAL_adiabatic_ID ) ) call thermal_adiabatic_init ( FILEUNIT , temperature_init )
2014-10-11 02:25:09 +05:30
close ( FILEUNIT )
!--------------------------------------------------------------------------------------------------
! parse vacancy model from config file
if ( . not . IO_open_jobFile_stat ( FILEUNIT , material_localFileExt ) ) & ! no local material configuration present...
call IO_open_file ( FILEUNIT , material_configFile ) ! ... open material.config file
2014-11-07 17:45:28 +05:30
if ( any ( phase_vacancy == LOCAL_VACANCY_constant_ID ) ) call vacancy_constant_init
2014-10-11 02:25:09 +05:30
if ( any ( phase_vacancy == LOCAL_VACANCY_generation_ID ) ) call vacancy_generation_init ( FILEUNIT )
2014-09-23 16:08:20 +05:30
close ( FILEUNIT )
2014-10-10 22:15:14 +05:30
mainProcess : if ( worldrank == 0 ) then
write ( 6 , '(/,a)' ) ' <<<+- constitutive init -+>>>'
write ( 6 , '(a)' ) ' $Id$'
write ( 6 , '(a15,a)' ) ' Current time: ' , IO_timeStamp ( )
2012-10-09 18:04:57 +05:30
#include "compilation_info.f90"
2014-10-10 22:15:14 +05:30
endif mainProcess
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
! write description file for constitutive phase output
2015-03-25 21:32:30 +05:30
if ( worldrank == 0_pInt ) then
call IO_write_jobFile ( FILEUNIT , 'outputConstitutive' )
do phase = 1_pInt , material_Nphase
2015-04-21 21:41:30 +05:30
if ( any ( material_phase == phase ) ) then ! is this phase active?
instance = phase_plasticityInstance ( phase ) ! which instance of a plasticity is present phase
knownPlasticity = . true . ! assume valid
select case ( phase_plasticity ( phase ) ) ! split per constititution
case ( PLASTICITY_NONE_ID )
outputName = PLASTICITY_NONE_label
thisNoutput = > null ( )
thisOutput = > null ( ) ! plastic_none_output
thisSize = > null ( ) ! plastic_none_sizePostResult
case ( PLASTICITY_J2_ID )
outputName = PLASTICITY_J2_label
thisNoutput = > plastic_j2_Noutput
thisOutput = > plastic_j2_output
thisSize = > plastic_j2_sizePostResult
case ( PLASTICITY_PHENOPOWERLAW_ID )
outputName = PLASTICITY_PHENOPOWERLAW_label
thisNoutput = > plastic_phenopowerlaw_Noutput
thisOutput = > plastic_phenopowerlaw_output
thisSize = > plastic_phenopowerlaw_sizePostResult
case ( PLASTICITY_DISLOTWIN_ID )
outputName = PLASTICITY_DISLOTWIN_label
thisNoutput = > plastic_dislotwin_Noutput
thisOutput = > plastic_dislotwin_output
thisSize = > plastic_dislotwin_sizePostResult
case ( PLASTICITY_DISLOKMC_ID )
outputName = PLASTICITY_DISLOKMC_label
thisNoutput = > plastic_dislokmc_Noutput
thisOutput = > plastic_dislokmc_output
thisSize = > plastic_dislokmc_sizePostResult
case ( PLASTICITY_DISLOUCLA_ID )
outputName = PLASTICITY_DISLOUCLA_label
thisNoutput = > plastic_disloucla_Noutput
thisOutput = > plastic_disloucla_output
thisSize = > plastic_disloucla_sizePostResult
case ( PLASTICITY_TITANMOD_ID )
outputName = PLASTICITY_TITANMOD_label
thisNoutput = > plastic_titanmod_Noutput
thisOutput = > plastic_titanmod_output
thisSize = > plastic_titanmod_sizePostResult
case ( PLASTICITY_NONLOCAL_ID )
outputName = PLASTICITY_NONLOCAL_label
thisNoutput = > plastic_nonlocal_Noutput
thisOutput = > plastic_nonlocal_output
thisSize = > plastic_nonlocal_sizePostResult
case default
knownPlasticity = . false .
end select
write ( FILEUNIT , '(/,a,/)' ) '[' / / trim ( phase_name ( phase ) ) / / ']'
if ( knownPlasticity ) then
write ( FILEUNIT , '(a)' ) '(plasticity)' / / char ( 9 ) / / trim ( outputName )
if ( phase_plasticity ( phase ) / = PLASTICITY_NONE_ID ) then
do e = 1_pInt , thisNoutput ( instance )
write ( FILEUNIT , '(a,i4)' ) trim ( thisOutput ( e , instance ) ) / / char ( 9 ) , thisSize ( e , instance )
enddo
endif
2015-03-25 21:32:30 +05:30
endif
2015-04-21 21:41:30 +05:30
instance = phase_damageInstance ( phase ) ! which instance of a plasticity is present phase
knownDamage = . true .
select case ( phase_damage ( phase ) ) ! split per constititution
case ( LOCAL_DAMAGE_none_ID )
outputName = LOCAL_DAMAGE_NONE_label
thisNoutput = > null ( )
thisOutput = > null ( )
thisSize = > null ( )
case ( LOCAL_DAMAGE_isoBrittle_ID )
outputName = LOCAL_DAMAGE_isoBrittle_LABEL
thisNoutput = > damage_isoBrittle_Noutput
thisOutput = > damage_isoBrittle_output
thisSize = > damage_isoBrittle_sizePostResult
case ( LOCAL_DAMAGE_isoDuctile_ID )
outputName = LOCAL_DAMAGE_isoDuctile_LABEL
thisNoutput = > damage_isoDuctile_Noutput
thisOutput = > damage_isoDuctile_output
thisSize = > damage_isoDuctile_sizePostResult
case ( LOCAL_DAMAGE_anisoBrittle_ID )
outputName = LOCAL_DAMAGE_anisoBrittle_label
thisNoutput = > damage_anisoBrittle_Noutput
thisOutput = > damage_anisoBrittle_output
thisSize = > damage_anisoBrittle_sizePostResult
case ( LOCAL_DAMAGE_anisoDuctile_ID )
outputName = LOCAL_DAMAGE_anisoDuctile_LABEL
thisNoutput = > damage_anisoDuctile_Noutput
thisOutput = > damage_anisoDuctile_output
thisSize = > damage_anisoDuctile_sizePostResult
case ( LOCAL_DAMAGE_gurson_ID )
outputName = LOCAL_DAMAGE_gurson_label
thisNoutput = > damage_gurson_Noutput
thisOutput = > damage_gurson_output
thisSize = > damage_gurson_sizePostResult
case ( LOCAL_DAMAGE_phaseField_ID )
outputName = LOCAL_DAMAGE_phaseField_label
thisNoutput = > damage_phaseField_Noutput
thisOutput = > damage_phaseField_output
thisSize = > damage_phaseField_sizePostResult
case default
knownDamage = . false .
end select
if ( knownDamage ) then
write ( FILEUNIT , '(a)' ) '(damage)' / / char ( 9 ) / / trim ( outputName )
if ( phase_damage ( phase ) / = LOCAL_DAMAGE_none_ID ) then
do e = 1_pInt , thisNoutput ( instance )
write ( FILEUNIT , '(a,i4)' ) trim ( thisOutput ( e , instance ) ) / / char ( 9 ) , thisSize ( e , instance )
enddo
endif
2015-03-25 21:32:30 +05:30
endif
2015-04-21 21:41:30 +05:30
instance = phase_thermalInstance ( phase ) ! which instance is present phase
knownThermal = . true .
select case ( phase_thermal ( phase ) ) ! split per constititution
case ( LOCAL_THERMAL_isothermal_ID )
outputName = LOCAL_THERMAL_ISOTHERMAL_label
thisNoutput = > null ( )
thisOutput = > null ( )
thisSize = > null ( )
case ( LOCAL_THERMAL_adiabatic_ID )
outputName = LOCAL_THERMAL_ADIABATIC_label
thisNoutput = > thermal_adiabatic_Noutput
thisOutput = > thermal_adiabatic_output
thisSize = > thermal_adiabatic_sizePostResult
case default
knownThermal = . false .
end select
if ( knownThermal ) then
write ( FILEUNIT , '(a)' ) '(thermal)' / / char ( 9 ) / / trim ( outputName )
if ( phase_thermal ( phase ) / = LOCAL_THERMAL_isothermal_ID ) then
do e = 1_pInt , thisNoutput ( instance )
write ( FILEUNIT , '(a,i4)' ) trim ( thisOutput ( e , instance ) ) / / char ( 9 ) , thisSize ( e , instance )
enddo
endif
2015-03-25 21:32:30 +05:30
endif
2015-04-21 21:41:30 +05:30
instance = phase_vacancyInstance ( phase ) ! which instance is present phase
knownVacancy = . true .
select case ( phase_vacancy ( phase ) ) ! split per constititution
case ( LOCAL_VACANCY_constant_ID )
outputName = LOCAL_VACANCY_constant_label
thisNoutput = > null ( )
thisOutput = > null ( )
thisSize = > null ( )
case ( LOCAL_VACANCY_generation_ID )
outputName = LOCAL_VACANCY_generation_label
thisNoutput = > vacancy_generation_Noutput
thisOutput = > vacancy_generation_output
thisSize = > vacancy_generation_sizePostResult
case default
knownVacancy = . false .
end select
if ( knownVacancy ) then
write ( FILEUNIT , '(a)' ) '(vacancy)' / / char ( 9 ) / / trim ( outputName )
if ( phase_vacancy ( phase ) / = LOCAL_VACANCY_constant_ID ) then
do e = 1_pInt , thisNoutput ( instance )
write ( FILEUNIT , '(a,i4)' ) trim ( thisOutput ( e , instance ) ) / / char ( 9 ) , thisSize ( e , instance )
enddo
endif
2015-03-25 21:32:30 +05:30
endif
2014-10-11 02:25:09 +05:30
endif
2015-03-25 21:32:30 +05:30
enddo
close ( FILEUNIT )
endif
2013-01-16 15:44:57 +05:30
2014-07-03 18:47:29 +05:30
constitutive_maxSizeDotState = 0_pInt
constitutive_maxSizePostResults = 0_pInt
2014-09-23 16:08:20 +05:30
constitutive_damage_maxSizePostResults = 0_pInt
constitutive_damage_maxSizeDotState = 0_pInt
constitutive_thermal_maxSizePostResults = 0_pInt
constitutive_thermal_maxSizeDotState = 0_pInt
2014-10-11 02:25:09 +05:30
constitutive_vacancy_maxSizePostResults = 0_pInt
constitutive_vacancy_maxSizeDotState = 0_pInt
2014-07-03 18:47:29 +05:30
PhaseLoop2 : do phase = 1_pInt , material_Nphase
plasticState ( phase ) % partionedState0 = plasticState ( phase ) % State0
plasticState ( phase ) % State = plasticState ( phase ) % State0
constitutive_maxSizeDotState = max ( constitutive_maxSizeDotState , plasticState ( phase ) % sizeDotState )
constitutive_maxSizePostResults = max ( constitutive_maxSizePostResults , plasticState ( phase ) % sizePostResults )
2014-09-23 16:08:20 +05:30
damageState ( phase ) % partionedState0 = damageState ( phase ) % State0
damageState ( phase ) % State = damageState ( phase ) % State0
constitutive_damage_maxSizeDotState = max ( constitutive_damage_maxSizeDotState , damageState ( phase ) % sizeDotState )
constitutive_damage_maxSizePostResults = max ( constitutive_damage_maxSizePostResults , damageState ( phase ) % sizePostResults )
thermalState ( phase ) % partionedState0 = thermalState ( phase ) % State0
thermalState ( phase ) % State = thermalState ( phase ) % State0
constitutive_thermal_maxSizeDotState = max ( constitutive_thermal_maxSizeDotState , thermalState ( phase ) % sizeDotState )
constitutive_thermal_maxSizePostResults = max ( constitutive_thermal_maxSizePostResults , thermalState ( phase ) % sizePostResults )
2014-10-11 02:25:09 +05:30
vacancyState ( phase ) % partionedState0 = vacancyState ( phase ) % State0
vacancyState ( phase ) % State = vacancyState ( phase ) % State0
constitutive_vacancy_maxSizeDotState = max ( constitutive_vacancy_maxSizeDotState , vacancyState ( phase ) % sizeDotState )
constitutive_vacancy_maxSizePostResults = max ( constitutive_vacancy_maxSizePostResults , vacancyState ( phase ) % sizePostResults )
2014-07-03 18:47:29 +05:30
enddo PhaseLoop2
2014-06-24 14:54:59 +05:30
2014-03-12 13:03:51 +05:30
#ifdef HDF
2014-03-26 14:11:45 +05:30
call HDF5_mappingConstitutive ( mappingConstitutive )
2014-04-15 15:39:20 +05:30
do phase = 1_pInt , material_Nphase
instance = phase_plasticityInstance ( phase ) ! which instance of a plasticity is present phase
select case ( phase_plasticity ( phase ) ) ! split per constititution
case ( PLASTICITY_NONE_ID )
case ( PLASTICITY_J2_ID )
end select
enddo
2014-03-12 13:03:51 +05:30
#endif
2014-05-08 20:25:19 +05:30
2014-07-02 17:57:39 +05:30
#ifdef TODO
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
! report
constitutive_maxSizeState = maxval ( constitutive_sizeState )
constitutive_maxSizeDotState = maxval ( constitutive_sizeDotState )
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) then
2013-11-27 13:34:05 +05:30
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_state0: ' , shape ( constitutive_state0 )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_partionedState0: ' , shape ( constitutive_partionedState0 )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_subState0: ' , shape ( constitutive_subState0 )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_state: ' , shape ( constitutive_state )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_aTolState: ' , shape ( constitutive_aTolState )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_dotState: ' , shape ( constitutive_dotState )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_deltaState: ' , shape ( constitutive_deltaState )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_sizeState: ' , shape ( constitutive_sizeState )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'constitutive_sizeDotState: ' , shape ( constitutive_sizeDotState )
write ( 6 , '(a32,1x,7(i8,1x),/)' ) 'constitutive_sizePostResults: ' , shape ( constitutive_sizePostResults )
write ( 6 , '(a32,1x,7(i8,1x))' ) 'maxSizeState: ' , constitutive_maxSizeState
write ( 6 , '(a32,1x,7(i8,1x))' ) 'maxSizeDotState: ' , constitutive_maxSizeDotState
write ( 6 , '(a32,1x,7(i8,1x))' ) 'maxSizePostResults: ' , constitutive_maxSizePostResults
2013-01-16 15:44:57 +05:30
endif
flush ( 6 )
2014-07-02 17:57:39 +05:30
#endif
2012-10-02 18:23:25 +05:30
end subroutine constitutive_init
2009-03-06 15:32:36 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns the homogenize elasticity matrix
!--------------------------------------------------------------------------------------------------
2014-07-02 17:57:39 +05:30
function constitutive_homogenizedC ( ipc , ip , el )
use prec , only : &
pReal
2013-01-16 15:44:57 +05:30
use material , only : &
phase_plasticity , &
2013-11-27 13:34:05 +05:30
material_phase , &
PLASTICITY_TITANMOD_ID , &
2014-08-08 16:34:40 +05:30
PLASTICITY_DISLOTWIN_ID , &
PLASTICITY_DISLOKMC_ID , &
2015-04-21 21:41:30 +05:30
PLASTICITY_DISLOUCLA_ID
2014-12-08 21:25:30 +05:30
use plastic_titanmod , only : &
plastic_titanmod_homogenizedC
use plastic_dislotwin , only : &
plastic_dislotwin_homogenizedC
use plastic_dislokmc , only : &
plastic_dislokmc_homogenizedC
2015-01-15 16:26:15 +05:30
use plastic_disloucla , only : &
plastic_disloucla_homogenizedC
2014-03-09 02:20:31 +05:30
use lattice , only : &
lattice_C66
2009-03-04 19:31:36 +05:30
implicit none
real ( pReal ) , dimension ( 6 , 6 ) :: constitutive_homogenizedC
2013-01-16 15:44:57 +05:30
integer ( pInt ) , intent ( in ) :: &
2013-09-19 13:16:01 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2009-03-06 15:32:36 +05:30
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2014-06-03 19:16:42 +05:30
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_DISLOTWIN_ID )
2014-12-08 21:25:30 +05:30
constitutive_homogenizedC = plastic_dislotwin_homogenizedC ( ipc , ip , el )
2014-08-08 16:34:40 +05:30
case ( PLASTICITY_DISLOKMC_ID )
2014-12-08 21:25:30 +05:30
constitutive_homogenizedC = plastic_dislokmc_homogenizedC ( ipc , ip , el )
2015-01-15 16:26:15 +05:30
case ( PLASTICITY_DISLOUCLA_ID )
constitutive_homogenizedC = plastic_disloucla_homogenizedC ( ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_TITANMOD_ID )
2014-12-08 21:25:30 +05:30
constitutive_homogenizedC = plastic_titanmod_homogenizedC ( ipc , ip , el )
2014-03-09 02:20:31 +05:30
case default
2014-07-02 17:57:39 +05:30
constitutive_homogenizedC = lattice_C66 ( 1 : 6 , 1 : 6 , material_phase ( ipc , ip , el ) )
2009-08-11 22:01:57 +05:30
2009-03-04 19:31:36 +05:30
end select
2009-03-06 15:32:36 +05:30
2012-10-02 18:23:25 +05:30
end function constitutive_homogenizedC
2014-10-27 21:03:35 +05:30
!--------------------------------------------------------------------------------------------------
2014-10-28 06:48:10 +05:30
!> @brief returns the damaged elasticity matrix if relevant
2014-10-27 21:03:35 +05:30
!--------------------------------------------------------------------------------------------------
function constitutive_damagedC ( ipc , ip , el )
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
2015-01-13 15:16:25 +05:30
LOCAL_DAMAGE_isoDuctile_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-10-27 21:03:35 +05:30
phase_damage
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
2015-01-13 15:16:25 +05:30
damage_isoBrittle_getDamagedC66
use damage_isoDuctile , only : &
damage_isoDuctile_getDamagedC66
2014-11-25 22:53:37 +05:30
use damage_phaseField , only : &
damage_phaseField_getDamagedC66
2014-10-27 21:03:35 +05:30
implicit none
real ( pReal ) , dimension ( 6 , 6 ) :: constitutive_damagedC
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
2014-10-28 06:48:10 +05:30
el
2014-10-27 21:03:35 +05:30
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
2014-11-12 04:16:41 +05:30
constitutive_damagedC = damage_isoBrittle_getDamagedC66 ( constitutive_homogenizedC ( ipc , ip , el ) , &
ipc , ip , el )
2015-01-13 15:16:25 +05:30
case ( LOCAL_DAMAGE_isoDuctile_ID )
constitutive_damagedC = damage_isoDuctile_getDamagedC66 ( constitutive_homogenizedC ( ipc , ip , el ) , &
ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
constitutive_damagedC = damage_phaseField_getDamagedC66 ( constitutive_homogenizedC ( ipc , ip , el ) , &
ipc , ip , el )
2014-10-28 06:48:10 +05:30
case default
constitutive_damagedC = constitutive_homogenizedC ( ipc , ip , el )
2014-10-27 21:03:35 +05:30
end select
end function constitutive_damagedC
2009-03-06 15:32:36 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief calls microstructure function of the different constitutive models
!--------------------------------------------------------------------------------------------------
2015-03-18 23:33:18 +05:30
subroutine constitutive_microstructure ( Tstar_v , Fe , Fp , Lp , subdt , ipc , ip , el )
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
2013-01-16 15:44:57 +05:30
use material , only : &
phase_plasticity , &
2014-09-23 16:08:20 +05:30
phase_damage , &
2015-03-18 23:33:18 +05:30
phase_thermal , &
2014-12-11 18:37:15 +05:30
phase_vacancy , &
2013-11-27 13:34:05 +05:30
material_phase , &
2014-10-10 18:12:12 +05:30
PLASTICITY_dislotwin_ID , &
PLASTICITY_dislokmc_ID , &
2015-01-15 16:26:15 +05:30
PLASTICITY_disloucla_ID , &
2014-10-10 18:12:12 +05:30
PLASTICITY_titanmod_ID , &
PLASTICITY_nonlocal_ID , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
2014-11-26 05:26:52 +05:30
LOCAL_DAMAGE_anisoBrittle_ID , &
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_gurson_ID , &
2014-12-10 19:10:30 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2015-03-18 23:33:18 +05:30
LOCAL_VACANCY_generation_ID , &
LOCAL_THERMAL_adiabatic_ID
2014-12-08 21:25:30 +05:30
use plastic_titanmod , only : &
plastic_titanmod_microstructure
use plastic_nonlocal , only : &
plastic_nonlocal_microstructure
use plastic_dislotwin , only : &
plastic_dislotwin_microstructure
use plastic_dislokmc , only : &
plastic_dislokmc_microstructure
2015-01-15 16:26:15 +05:30
use plastic_disloucla , only : &
plastic_disloucla_microstructure
2014-11-26 05:26:52 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_microstructure
use damage_isoDuctile , only : &
damage_isoDuctile_microstructure
use damage_anisoBrittle , only : &
damage_anisoBrittle_microstructure
use damage_anisoDuctile , only : &
damage_anisoDuctile_microstructure
2014-11-25 22:53:37 +05:30
use damage_gurson , only : &
damage_gurson_microstructure
use damage_phaseField , only : &
2014-12-10 19:10:30 +05:30
damage_phaseField_microstructure
use vacancy_generation , only : &
vacancy_generation_microstructure
2015-03-18 23:33:18 +05:30
use thermal_adiabatic , only : &
thermal_adiabatic_microstructure
2014-06-03 19:16:42 +05:30
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2014-11-03 16:13:36 +05:30
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
2014-09-23 16:08:20 +05:30
Tstar_v !< 2nd Piola Kirchhoff stress tensor (Mandel)
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
Fe , & !< elastic deformation gradient
2015-03-18 23:33:18 +05:30
Fp , & !< plastic deformation gradient
Lp
2014-11-29 01:36:24 +05:30
real ( pReal ) , intent ( in ) :: &
subdt !< timestep
2014-10-10 22:04:51 +05:30
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_DISLOTWIN_ID )
2014-12-08 21:25:30 +05:30
call plastic_dislotwin_microstructure ( constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2014-08-08 16:34:40 +05:30
case ( PLASTICITY_DISLOKMC_ID )
2014-12-08 21:25:30 +05:30
call plastic_dislokmc_microstructure ( constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2015-01-15 16:26:15 +05:30
case ( PLASTICITY_DISLOUCLA_ID )
call plastic_disloucla_microstructure ( constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_TITANMOD_ID )
2014-12-08 21:25:30 +05:30
call plastic_titanmod_microstructure ( constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_NONLOCAL_ID )
2014-12-08 21:25:30 +05:30
call plastic_nonlocal_microstructure ( Fe , Fp , ip , el )
2014-07-02 17:57:39 +05:30
2014-06-03 19:16:42 +05:30
end select
2014-09-23 16:08:20 +05:30
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-11-26 05:26:52 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
2014-11-29 01:36:24 +05:30
call damage_isoBrittle_microstructure ( constitutive_homogenizedC ( ipc , ip , el ) , Fe , subdt , &
2014-11-26 05:26:52 +05:30
ipc , ip , el )
case ( LOCAL_DAMAGE_isoDuctile_ID )
2015-01-05 00:56:33 +05:30
call damage_isoDuctile_microstructure ( subdt , ipc , ip , el )
2014-11-26 05:26:52 +05:30
case ( LOCAL_DAMAGE_anisoBrittle_ID )
2014-11-29 01:36:24 +05:30
call damage_anisoBrittle_microstructure ( Tstar_v , subdt , ipc , ip , el )
2014-11-26 05:26:52 +05:30
case ( LOCAL_DAMAGE_anisoDuctile_ID )
2015-01-05 00:56:33 +05:30
call damage_anisoDuctile_microstructure ( subdt , ipc , ip , el )
2014-10-10 18:12:12 +05:30
case ( LOCAL_DAMAGE_gurson_ID )
call damage_gurson_microstructure ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
call damage_phaseField_microstructure ( constitutive_homogenizedC ( ipc , ip , el ) , Fe , &
constitutive_getVacancyConcentration ( ipc , ip , el ) , &
2014-11-29 01:36:24 +05:30
subdt , ipc , ip , el )
2014-09-23 16:08:20 +05:30
end select
2014-06-03 19:16:42 +05:30
2015-03-18 23:33:18 +05:30
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_THERMAL_adiabatic_ID )
call thermal_adiabatic_microstructure ( Tstar_v , Lp , subdt , ipc , ip , el )
end select
2014-12-11 18:37:15 +05:30
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
2014-12-10 19:10:30 +05:30
case ( LOCAL_VACANCY_generation_ID )
2015-01-16 22:34:01 +05:30
call vacancy_generation_microstructure ( Tstar_v , &
2015-01-05 00:56:33 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
2015-01-16 22:34:01 +05:30
constitutive_getDamage ( ipc , ip , el ) , &
2014-12-10 19:10:30 +05:30
subdt , ipc , ip , el )
end select
2013-01-16 15:44:57 +05:30
end subroutine constitutive_microstructure
openmp parallelization working again (at least for j2 and nonlocal constitutive model).
In order to keep it like that, please follow these simple rules:
DON'T use implicit array subscripts:
example: real, dimension(3,3) :: A,B
A(:,2) = B(:,1) <--- DON'T USE
A(1:3,2) = B(1:3,1) <--- BETTER USE
In many cases the use of explicit array subscripts is inevitable for parallelization. Additionally, it is an easy means to prevent memory leaks.
Enclose all write statements with the following:
!$OMP CRITICAL (write2out)
<your write statement>
!$OMP END CRITICAL (write2out)
Whenever you change something in the code and are not sure if it affects parallelization and leads to nonconforming behavior, please ask me and/or Franz to check this.
2011-03-17 16:16:17 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2013-09-19 13:16:01 +05:30
!> @brief contains the constitutive equation for calculating the velocity gradient
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2015-03-06 18:39:00 +05:30
subroutine constitutive_LpAndItsTangent ( Lp , dLp_dTstar3333 , dLp_dFi3333 , Tstar_v , Fi , ipc , ip , el )
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
2013-10-16 18:34:59 +05:30
use math , only : &
2015-03-06 18:39:00 +05:30
math_transpose33 , &
math_mul33x33 , &
math_Mandel6to33 , &
math_Mandel33to6 , &
math_Plain99to3333
2013-01-16 15:44:57 +05:30
use material , only : &
phase_plasticity , &
2013-11-27 13:34:05 +05:30
material_phase , &
PLASTICITY_NONE_ID , &
PLASTICITY_J2_ID , &
PLASTICITY_PHENOPOWERLAW_ID , &
PLASTICITY_DISLOTWIN_ID , &
2014-08-08 16:34:40 +05:30
PLASTICITY_DISLOKMC_ID , &
2015-01-15 16:26:15 +05:30
PLASTICITY_DISLOUCLA_ID , &
2013-11-27 13:34:05 +05:30
PLASTICITY_TITANMOD_ID , &
PLASTICITY_NONLOCAL_ID
2014-12-08 21:25:30 +05:30
use plastic_j2 , only : &
plastic_j2_LpAndItsTangent
use plastic_phenopowerlaw , only : &
2015-01-29 19:26:09 +05:30
plastic_phenopowerlaw_LpAndItsTangent
2014-12-08 21:25:30 +05:30
use plastic_dislotwin , only : &
2015-01-29 19:26:09 +05:30
plastic_dislotwin_LpAndItsTangent
2014-12-08 21:25:30 +05:30
use plastic_dislokmc , only : &
2015-01-29 19:26:09 +05:30
plastic_dislokmc_LpAndItsTangent
2015-01-15 16:26:15 +05:30
use plastic_disloucla , only : &
2015-01-29 19:26:09 +05:30
plastic_disloucla_LpAndItsTangent
2014-12-08 21:25:30 +05:30
use plastic_titanmod , only : &
2015-01-29 19:26:09 +05:30
plastic_titanmod_LpAndItsTangent
2014-12-08 21:25:30 +05:30
use plastic_nonlocal , only : &
2015-01-29 19:26:09 +05:30
plastic_nonlocal_LpAndItsTangent
2014-06-14 02:23:17 +05:30
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola-Kirchhoff stress
2015-03-06 18:39:00 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
Fi !< intermediate deformation gradient
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 ) :: &
Lp !< plastic velocity gradient
2015-03-06 18:39:00 +05:30
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 , 3 , 3 ) :: &
dLp_dTstar3333 , & !< derivative of Lp with respect to Tstar (4th-order tensor)
dLp_dFi3333 !< derivative of Lp with respect to Fi (4th-order tensor)
real ( pReal ) , dimension ( 6 ) :: &
Mstar_v !< Mandel stress work conjugate with Lp
real ( pReal ) , dimension ( 9 , 9 ) :: &
dLp_dMstar !< derivative of Lp with respect to Mstar (4th-order tensor)
real ( pReal ) , dimension ( 3 , 3 ) :: &
temp_33
integer ( pInt ) :: &
i , j
2014-10-28 08:12:25 +05:30
2015-03-06 18:39:00 +05:30
Mstar_v = math_Mandel33to6 ( math_mul33x33 ( math_mul33x33 ( math_transpose33 ( Fi ) , Fi ) , &
math_Mandel6to33 ( Tstar_v ) ) )
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2013-01-16 15:44:57 +05:30
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_NONE_ID )
2013-10-16 18:34:59 +05:30
Lp = 0.0_pReal
2015-03-06 18:39:00 +05:30
dLp_dMstar = 0.0_pReal
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_J2_ID )
2015-03-06 18:39:00 +05:30
call plastic_j2_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_PHENOPOWERLAW_ID )
2015-03-06 18:39:00 +05:30
call plastic_phenopowerlaw_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , ipc , ip , el )
2014-07-02 17:57:39 +05:30
case ( PLASTICITY_NONLOCAL_ID )
2015-03-06 18:39:00 +05:30
call plastic_nonlocal_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , &
2014-12-09 23:53:48 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
2015-04-11 17:17:33 +05:30
ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_DISLOTWIN_ID )
2015-03-06 18:39:00 +05:30
call plastic_dislotwin_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , &
2014-12-09 23:53:48 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2014-08-08 16:34:40 +05:30
case ( PLASTICITY_DISLOKMC_ID )
2015-03-06 18:39:00 +05:30
call plastic_dislokmc_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , &
2014-12-09 23:53:48 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2015-01-15 16:26:15 +05:30
case ( PLASTICITY_DISLOUCLA_ID )
2015-03-06 18:39:00 +05:30
call plastic_disloucla_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , &
2015-01-15 16:26:15 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_TITANMOD_ID )
2015-03-06 18:39:00 +05:30
call plastic_titanmod_LpAndItsTangent ( Lp , dLp_dMstar , Mstar_v , &
2014-12-09 23:53:48 +05:30
constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2014-07-02 17:57:39 +05:30
2013-01-16 15:44:57 +05:30
end select
2015-03-06 18:39:00 +05:30
dLp_dTstar3333 = math_Plain99to3333 ( dLp_dMstar )
temp_33 = math_mul33x33 ( Fi , math_Mandel6to33 ( Tstar_v ) )
do i = 1_pInt , 3_pInt ; do j = 1_pInt , 3_pInt
dLp_dFi3333 ( i , j , 1 : 3 , 1 : 3 ) = math_mul33x33 ( temp_33 , math_transpose33 ( dLp_dTstar3333 ( i , j , 1 : 3 , 1 : 3 ) ) ) + &
math_mul33x33 ( math_mul33x33 ( Fi , dLp_dTstar3333 ( i , j , 1 : 3 , 1 : 3 ) ) , math_Mandel6to33 ( Tstar_v ) )
enddo ; enddo
temp_33 = math_mul33x33 ( math_transpose33 ( Fi ) , Fi )
do i = 1_pInt , 3_pInt ; do j = 1_pInt , 3_pInt
dLp_dTstar3333 ( i , j , 1 : 3 , 1 : 3 ) = math_mul33x33 ( temp_33 , dLp_dTstar3333 ( i , j , 1 : 3 , 1 : 3 ) )
enddo ; enddo
2013-01-16 15:44:57 +05:30
2012-10-02 18:23:25 +05:30
end subroutine constitutive_LpAndItsTangent
2009-03-06 15:32:36 +05:30
2014-11-01 00:33:08 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief contains the constitutive equation for calculating the velocity gradient
!--------------------------------------------------------------------------------------------------
2015-03-06 18:39:00 +05:30
subroutine constitutive_LiAndItsTangent ( Li , dLi_dTstar3333 , dLi_dFi3333 , Tstar_v , Fi , Lp , ipc , ip , el )
2014-11-01 00:33:08 +05:30
use prec , only : &
pReal
2015-03-06 18:39:00 +05:30
use math , only : &
math_I3 , &
math_inv33 , &
math_det33 , &
math_transpose33 , &
math_mul33x33
2014-11-01 00:33:08 +05:30
use material , only : &
phase_damage , &
phase_thermal , &
material_phase , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2015-01-19 19:09:47 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-11-01 00:33:08 +05:30
LOCAL_THERMAL_adiabatic_ID
use damage_anisoBrittle , only : &
damage_anisoBrittle_LdAndItsTangent
2015-01-19 19:09:47 +05:30
use damage_anisoDuctile , only : &
damage_anisoDuctile_LdAndItsTangent
2014-11-01 00:33:08 +05:30
use thermal_adiabatic , only : &
thermal_adiabatic_LTAndItsTangent
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola-Kirchhoff stress
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
2015-03-06 18:39:00 +05:30
Fi , & !< intermediate deformation gradient
2014-11-01 00:33:08 +05:30
Lp !< plastic velocity gradient
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 ) :: &
Li !< intermediate velocity gradient
2015-03-06 18:39:00 +05:30
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 , 3 , 3 ) :: &
dLi_dTstar3333 , & !< derivative of Li with respect to Tstar (4th-order tensor)
dLi_dFi3333
2014-11-01 00:33:08 +05:30
real ( pReal ) , dimension ( 3 , 3 ) :: &
Li_temp !< intermediate velocity gradient
2015-03-06 18:39:00 +05:30
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) :: &
dLi_dTstar_temp
real ( pReal ) , dimension ( 3 , 3 ) :: &
FiInv , &
temp_33
real ( pReal ) :: &
detFi
integer ( pInt ) :: &
i , j
2014-11-01 00:33:08 +05:30
Li = 0.0_pReal
2015-03-06 18:39:00 +05:30
dLi_dTstar3333 = 0.0_pReal
dLi_dFi3333 = 0.0_pReal
2014-11-01 00:33:08 +05:30
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_DAMAGE_anisoBrittle_ID )
call damage_anisoBrittle_LdAndItsTangent ( Li_temp , dLi_dTstar_temp , Tstar_v , ipc , ip , el )
Li = Li + Li_temp
2015-03-06 18:39:00 +05:30
dLi_dTstar3333 = dLi_dTstar3333 + dLi_dTstar_temp
2015-01-19 19:09:47 +05:30
case ( LOCAL_DAMAGE_anisoDuctile_ID )
call damage_anisoDuctile_LdAndItsTangent ( Li_temp , dLi_dTstar_temp , Tstar_v , ipc , ip , el )
Li = Li + Li_temp
2015-03-06 18:39:00 +05:30
dLi_dTstar3333 = dLi_dTstar3333 + dLi_dTstar_temp
2014-11-01 00:33:08 +05:30
end select
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_THERMAL_adiabatic_ID )
call thermal_adiabatic_LTAndItsTangent ( Li_temp , dLi_dTstar_temp , Tstar_v , Lp , ipc , ip , el )
Li = Li + Li_temp
2015-03-06 18:39:00 +05:30
dLi_dTstar3333 = dLi_dTstar3333 + dLi_dTstar_temp
2014-11-01 00:33:08 +05:30
end select
2015-03-06 18:39:00 +05:30
FiInv = math_inv33 ( Fi )
detFi = math_det33 ( Fi )
Li = math_mul33x33 ( math_mul33x33 ( Fi , Li ) , FiInv ) * detFi !< push forward to intermediate configuration
temp_33 = math_mul33x33 ( FiInv , Li )
do i = 1_pInt , 3_pInt ; do j = 1_pInt , 3_pInt
dLi_dTstar3333 ( 1 : 3 , 1 : 3 , i , j ) = math_mul33x33 ( math_mul33x33 ( Fi , dLi_dTstar3333 ( 1 : 3 , 1 : 3 , i , j ) ) , FiInv ) * detFi
dLi_dFi3333 ( 1 : 3 , 1 : 3 , i , j ) = dLi_dFi3333 ( 1 : 3 , 1 : 3 , i , j ) + Li * FiInv ( j , i )
dLi_dFi3333 ( 1 : 3 , i , 1 : 3 , j ) = dLi_dFi3333 ( 1 : 3 , i , 1 : 3 , j ) + math_I3 * temp_33 ( j , i ) + Li * FiInv ( j , i )
enddo ; enddo
2014-11-01 00:33:08 +05:30
2015-03-06 18:39:00 +05:30
end subroutine constitutive_LiAndItsTangent
2014-11-01 00:33:08 +05:30
openmp parallelization working again (at least for j2 and nonlocal constitutive model).
In order to keep it like that, please follow these simple rules:
DON'T use implicit array subscripts:
example: real, dimension(3,3) :: A,B
A(:,2) = B(:,1) <--- DON'T USE
A(1:3,2) = B(1:3,1) <--- BETTER USE
In many cases the use of explicit array subscripts is inevitable for parallelization. Additionally, it is an easy means to prevent memory leaks.
Enclose all write statements with the following:
!$OMP CRITICAL (write2out)
<your write statement>
!$OMP END CRITICAL (write2out)
Whenever you change something in the code and are not sure if it affects parallelization and leads to nonconforming behavior, please ask me and/or Franz to check this.
2011-03-17 16:16:17 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns the 2nd Piola-Kirchhoff stress tensor and its tangent with respect to
2013-10-14 16:24:45 +05:30
!> the elastic deformation gradient depending on the selected elastic law (so far no case switch
!! because only hooke is implemented
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2015-03-06 18:39:00 +05:30
subroutine constitutive_TandItsTangent ( T , dT_dFe , dT_dFi , Fe , Fi , ipc , ip , el )
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
2015-03-06 18:39:00 +05:30
Fe , & !< elastic deformation gradient
Fi !< intermediate deformation gradient
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 ) :: &
T !< 2nd Piola-Kirchhoff stress tensor
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 , 3 , 3 ) :: &
2015-03-06 18:39:00 +05:30
dT_dFe , & !< derivative of 2nd P-K stress with respect to elastic deformation gradient
dT_dFi !< derivative of 2nd P-K stress with respect to intermediate deformation gradient
2013-01-16 15:44:57 +05:30
2015-03-06 18:39:00 +05:30
call constitutive_hooke_TandItsTangent ( T , dT_dFe , dT_dFi , Fe , Fi , ipc , ip , el )
2013-10-14 16:24:45 +05:30
2013-01-16 15:44:57 +05:30
2012-10-02 18:23:25 +05:30
end subroutine constitutive_TandItsTangent
2012-03-15 15:21:33 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns the 2nd Piola-Kirchhoff stress tensor and its tangent with respect to
2013-10-14 20:05:41 +05:30
!> the elastic deformation gradient using hookes law
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2015-03-06 18:39:00 +05:30
subroutine constitutive_hooke_TandItsTangent ( T , dT_dFe , dT_dFi , Fe , Fi , ipc , ip , el )
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
use math , only : &
math_mul3x3 , &
math_mul33x33 , &
math_mul3333xx33 , &
math_Mandel66to3333 , &
math_transpose33 , &
2014-08-09 03:59:38 +05:30
math_trace33 , &
math_I3
2012-11-07 21:13:29 +05:30
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
2015-03-06 18:39:00 +05:30
Fe , & !< elastic deformation gradient
Fi !< intermediate deformation gradient
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 ) :: &
2015-03-06 18:39:00 +05:30
T !< 2nd Piola-Kirchhoff stress tensor in lattice configuration
real ( pReal ) , intent ( out ) , dimension ( 3 , 3 , 3 , 3 ) :: &
dT_dFe , & !< derivative of 2nd P-K stress with respect to elastic deformation gradient
dT_dFi !< derivative of 2nd P-K stress with respect to intermediate deformation gradient
2013-01-16 15:44:57 +05:30
2015-03-06 18:39:00 +05:30
integer ( pInt ) :: i , j
real ( pReal ) , dimension ( 3 , 3 ) :: E
2014-08-09 03:59:38 +05:30
real ( pReal ) , dimension ( 3 , 3 , 3 , 3 ) :: C
2015-03-06 18:39:00 +05:30
C = math_Mandel66to3333 ( constitutive_damagedC ( ipc , ip , el ) ) !< elastic stiffness in lattice configuration
E = 0.5_pReal * ( math_mul33x33 ( math_transpose33 ( Fe ) , Fe ) - math_I3 ) !< Green-Lagrange strain in unloaded configuration
T = math_mul3333xx33 ( C , math_mul33x33 ( math_mul33x33 ( math_transpose33 ( Fi ) , E ) , Fi ) ) !< 2PK stress in lattice configuration in work conjugate with GL strain pulled back to lattice configuration
2014-08-10 16:15:07 +05:30
2014-09-23 02:08:19 +05:30
dT_dFe = 0.0_pReal
2015-03-06 18:39:00 +05:30
forall ( i = 1_pInt : 3_pInt , j = 1_pInt : 3_pInt )
dT_dFe ( i , j , 1 : 3 , 1 : 3 ) = &
math_mul33x33 ( Fe , math_mul33x33 ( math_mul33x33 ( Fi , C ( i , j , 1 : 3 , 1 : 3 ) ) , math_transpose33 ( Fi ) ) ) !< dT_ij/dFe_kl = C_ijmn * Fi_lm * Fi_on * Fe_ko
dT_dFi ( i , j , 1 : 3 , 1 : 3 ) = 2.0_pReal * math_mul33x33 ( math_mul33x33 ( E , Fi ) , C ( i , j , 1 : 3 , 1 : 3 ) ) !< dT_ij/dFi_kl = C_ijln * E_km * Fe_mn
end forall
2014-08-10 16:15:07 +05:30
2012-03-15 15:21:33 +05:30
end subroutine constitutive_hooke_TandItsTangent
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief contains the constitutive equation for calculating the rate of change of microstructure
!--------------------------------------------------------------------------------------------------
2014-10-10 17:58:57 +05:30
subroutine constitutive_collectDotState ( Tstar_v , Lp , FeArray , FpArray , subdt , subfracArray , &
2014-03-13 12:13:49 +05:30
ipc , ip , el )
2013-01-16 15:44:57 +05:30
use prec , only : &
2014-07-02 17:57:39 +05:30
pReal , &
2013-01-16 15:44:57 +05:30
pLongInt
use debug , only : &
debug_cumDotStateCalls , &
debug_cumDotStateTicks , &
debug_level , &
debug_constitutive , &
debug_levelBasic
use mesh , only : &
mesh_NcpElems , &
2013-05-08 14:53:47 +05:30
mesh_maxNips
2013-01-16 15:44:57 +05:30
use material , only : &
phase_plasticity , &
2014-09-23 16:08:20 +05:30
phase_damage , &
2013-01-16 15:44:57 +05:30
material_phase , &
2013-11-27 13:34:05 +05:30
homogenization_maxNgrains , &
2014-10-09 19:38:32 +05:30
PLASTICITY_none_ID , &
PLASTICITY_j2_ID , &
PLASTICITY_phenopowerlaw_ID , &
PLASTICITY_dislotwin_ID , &
PLASTICITY_dislokmc_ID , &
2015-01-15 16:26:15 +05:30
PLASTICITY_disloucla_ID , &
2014-10-09 19:38:32 +05:30
PLASTICITY_titanmod_ID , &
PLASTICITY_nonlocal_ID , &
2014-12-10 19:10:30 +05:30
LOCAL_DAMAGE_gurson_ID
2014-12-08 21:25:30 +05:30
use plastic_j2 , only : &
plastic_j2_dotState
use plastic_phenopowerlaw , only : &
2015-01-29 19:26:09 +05:30
plastic_phenopowerlaw_dotState
2014-12-08 21:25:30 +05:30
use plastic_dislotwin , only : &
2015-01-29 19:26:09 +05:30
plastic_dislotwin_dotState
2014-12-08 21:25:30 +05:30
use plastic_dislokmc , only : &
2015-01-29 19:26:09 +05:30
plastic_dislokmc_dotState
2015-01-15 16:26:15 +05:30
use plastic_disloucla , only : &
2015-01-29 19:26:09 +05:30
plastic_disloucla_dotState
2014-12-08 21:25:30 +05:30
use plastic_titanmod , only : &
2015-01-29 19:26:09 +05:30
plastic_titanmod_dotState
2014-12-08 21:25:30 +05:30
use plastic_nonlocal , only : &
2015-01-29 19:26:09 +05:30
plastic_nonlocal_dotState
2014-11-05 23:11:08 +05:30
use damage_gurson , only : &
damage_gurson_dotState
2014-06-14 02:23:17 +05:30
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) :: &
subdt !< timestep
real ( pReal ) , intent ( in ) , dimension ( homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) :: &
2014-03-13 12:13:49 +05:30
subfracArray !< subfraction of timestep
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 , homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) :: &
2014-03-13 12:13:49 +05:30
FeArray , & !< elastic deformation gradient
FpArray !< plastic deformation gradient
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola Kirchhoff stress tensor (Mandel)
2014-09-27 02:19:25 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
Lp !< plastic velocity gradient
2013-01-16 15:44:57 +05:30
integer ( pLongInt ) :: &
tick , tock , &
tickrate , &
maxticks
2012-07-03 16:46:38 +05:30
2013-01-16 15:44:57 +05:30
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) &
call system_clock ( count = tick , count_rate = tickrate , count_max = maxticks )
2009-12-15 13:50:31 +05:30
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_J2_ID )
2015-01-29 19:26:09 +05:30
call plastic_j2_dotState ( Tstar_v , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_PHENOPOWERLAW_ID )
2015-01-29 19:26:09 +05:30
call plastic_phenopowerlaw_dotState ( Tstar_v , ipc , ip , el )
2014-06-03 19:16:42 +05:30
case ( PLASTICITY_DISLOTWIN_ID )
2014-12-09 23:53:48 +05:30
call plastic_dislotwin_dotState ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , &
2015-01-29 19:26:09 +05:30
ipc , ip , el )
2014-08-08 16:34:40 +05:30
case ( PLASTICITY_DISLOKMC_ID )
2014-12-09 23:53:48 +05:30
call plastic_dislokmc_dotState ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , &
2015-01-29 19:26:09 +05:30
ipc , ip , el )
2015-01-15 16:26:15 +05:30
case ( PLASTICITY_DISLOUCLA_ID )
2015-01-29 19:26:09 +05:30
call plastic_disloucla_dotState ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_TITANMOD_ID )
2014-12-09 23:53:48 +05:30
call plastic_titanmod_dotState ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_NONLOCAL_ID )
2014-12-08 21:25:30 +05:30
call plastic_nonlocal_dotState ( Tstar_v , FeArray , FpArray , constitutive_getTemperature ( ipc , ip , el ) , &
2015-01-29 19:26:09 +05:30
subdt , subfracArray , ip , el )
2013-01-16 15:44:57 +05:30
end select
2014-09-23 16:08:20 +05:30
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-11-05 23:11:08 +05:30
case ( LOCAL_DAMAGE_gurson_ID )
call damage_gurson_dotState ( Tstar_v , Lp , ipc , ip , el )
2014-09-23 16:08:20 +05:30
end select
2013-01-16 15:44:57 +05:30
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) then
call system_clock ( count = tock , count_rate = tickrate , count_max = maxticks )
!$OMP CRITICAL (debugTimingDotState)
debug_cumDotStateCalls = debug_cumDotStateCalls + 1_pInt
debug_cumDotStateTicks = debug_cumDotStateTicks + tock - tick
!$OMP FLUSH (debug_cumDotStateTicks)
if ( tock < tick ) debug_cumDotStateTicks = debug_cumDotStateTicks + maxticks
!$OMP END CRITICAL (debugTimingDotState)
endif
2012-10-02 18:23:25 +05:30
end subroutine constitutive_collectDotState
2009-03-06 15:32:36 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2014-06-17 12:24:49 +05:30
!> @brief for constitutive models having an instantaneous change of state (so far, only nonlocal)
!> will return false if delta state is not needed/supported by the constitutive model
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
2014-06-17 12:24:49 +05:30
logical function constitutive_collectDeltaState ( Tstar_v , ipc , ip , el )
2013-01-16 15:44:57 +05:30
use prec , only : &
2014-07-02 17:57:39 +05:30
pReal , &
2013-01-16 15:44:57 +05:30
pLongInt
use debug , only : &
debug_cumDeltaStateCalls , &
debug_cumDeltaStateTicks , &
debug_level , &
debug_constitutive , &
debug_levelBasic
use material , only : &
phase_plasticity , &
2013-11-27 13:34:05 +05:30
material_phase , &
2014-06-14 02:23:17 +05:30
PLASTICITY_NONLOCAL_ID
2014-12-08 21:25:30 +05:30
use plastic_nonlocal , only : &
plastic_nonlocal_deltaState
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola-Kirchhoff stress
integer ( pLongInt ) :: &
tick , tock , &
tickrate , &
maxticks
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) &
call system_clock ( count = tick , count_rate = tickrate , count_max = maxticks )
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2012-05-16 20:13:26 +05:30
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_NONLOCAL_ID )
2014-06-17 12:24:49 +05:30
constitutive_collectDeltaState = . true .
2014-12-08 21:25:30 +05:30
call plastic_nonlocal_deltaState ( Tstar_v , ip , el )
2013-10-14 16:24:45 +05:30
case default
2014-06-17 12:24:49 +05:30
constitutive_collectDeltaState = . false .
2014-07-02 17:57:39 +05:30
2013-01-16 15:44:57 +05:30
end select
2012-05-16 20:13:26 +05:30
2013-01-16 15:44:57 +05:30
if ( iand ( debug_level ( debug_constitutive ) , debug_levelBasic ) / = 0_pInt ) then
call system_clock ( count = tock , count_rate = tickrate , count_max = maxticks )
!$OMP CRITICAL (debugTimingDeltaState)
debug_cumDeltaStateCalls = debug_cumDeltaStateCalls + 1_pInt
debug_cumDeltaStateTicks = debug_cumDeltaStateTicks + tock - tick
!$OMP FLUSH (debug_cumDeltaStateTicks)
if ( tock < tick ) debug_cumDeltaStateTicks = debug_cumDeltaStateTicks + maxticks
!$OMP END CRITICAL (debugTimingDeltaState)
endif
2012-05-16 20:13:26 +05:30
2014-06-17 12:24:49 +05:30
end function constitutive_collectDeltaState
2014-09-10 23:56:12 +05:30
2014-09-22 23:45:19 +05:30
2014-09-05 22:01:27 +05:30
!--------------------------------------------------------------------------------------------------
2014-10-15 20:32:29 +05:30
!> @brief Returns the local(regularised) damage
2014-09-05 22:01:27 +05:30
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getLocalDamage ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-05 23:11:08 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-09-05 22:01:27 +05:30
phase_damage
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_getLocalDamage
use damage_isoDuctile , only : &
damage_isoDuctile_getLocalDamage
use damage_anisoBrittle , only : &
damage_anisoBrittle_getLocalDamage
2014-11-05 23:11:08 +05:30
use damage_anisoDuctile , only : &
damage_anisoDuctile_getLocalDamage
2014-11-25 22:53:37 +05:30
use damage_phaseField , only : &
damage_phaseField_getLocalDamage
2014-09-05 22:01:27 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) :: constitutive_getLocalDamage
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2015-04-21 21:41:30 +05:30
case default
2014-09-05 22:01:27 +05:30
constitutive_getLocalDamage = 1.0_pReal
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
constitutive_getLocalDamage = damage_isoBrittle_getLocalDamage ( ipc , ip , el )
2014-09-26 16:08:13 +05:30
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoDuctile_ID )
constitutive_getLocalDamage = damage_isoDuctile_getLocalDamage ( ipc , ip , el )
2014-10-10 18:12:12 +05:30
2014-11-05 23:11:08 +05:30
case ( LOCAL_DAMAGE_anisoBrittle_ID )
constitutive_getLocalDamage = damage_anisoBrittle_getLocalDamage ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_anisoDuctile_ID )
2014-11-05 23:11:08 +05:30
constitutive_getLocalDamage = damage_anisoDuctile_getLocalDamage ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
constitutive_getLocalDamage = damage_phaseField_getLocalDamage ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
end select
end function constitutive_getLocalDamage
2014-09-22 23:45:19 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief Returns the local(unregularised) damage
!--------------------------------------------------------------------------------------------------
subroutine constitutive_putLocalDamage ( ipc , ip , el , localDamage )
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-05 23:11:08 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-10-10 18:12:12 +05:30
LOCAL_DAMAGE_gurson_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-09-22 23:45:19 +05:30
phase_damage
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_putLocalDamage
use damage_isoDuctile , only : &
damage_isoDuctile_putLocalDamage
use damage_anisoBrittle , only : &
damage_anisoBrittle_putLocalDamage
2014-11-05 23:11:08 +05:30
use damage_anisoDuctile , only : &
damage_anisoDuctile_putLocalDamage
use damage_gurson , only : &
damage_gurson_putLocalDamage
2014-11-25 22:53:37 +05:30
use damage_phaseField , only : &
damage_phaseField_putLocalDamage
2014-09-22 23:45:19 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , intent ( in ) :: &
localDamage
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
call damage_isoBrittle_putLocalDamage ( ipc , ip , el , localDamage )
2014-10-06 22:31:39 +05:30
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoDuctile_ID )
call damage_isoDuctile_putLocalDamage ( ipc , ip , el , localDamage )
2014-10-10 18:12:12 +05:30
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_anisoBrittle_ID )
call damage_anisoBrittle_putLocalDamage ( ipc , ip , el , localDamage )
2014-09-22 23:45:19 +05:30
2014-11-05 23:11:08 +05:30
case ( LOCAL_DAMAGE_anisoDuctile_ID )
call damage_anisoDuctile_putLocalDamage ( ipc , ip , el , localDamage )
case ( LOCAL_DAMAGE_gurson_ID )
call damage_gurson_putLocalDamage ( ipc , ip , el , localDamage )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
call damage_phaseField_putLocalDamage ( ipc , ip , el , localDamage )
2014-09-22 23:45:19 +05:30
end select
end subroutine constitutive_putLocalDamage
2014-09-10 23:56:12 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns nonlocal (regularised) damage
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getDamage ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
use prec , only : &
pReal
use material , only : &
2014-10-28 06:48:10 +05:30
material_phase , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-05 23:11:08 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-10-28 06:48:10 +05:30
phase_damage
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_getDamage
use damage_isoDuctile , only : &
damage_isoDuctile_getDamage
use damage_anisoBrittle , only : &
damage_anisoBrittle_getDamage
2014-11-05 23:11:08 +05:30
use damage_anisoDuctile , only : &
damage_anisoDuctile_getDamage
2014-11-25 22:53:37 +05:30
use damage_phaseField , only : &
damage_phaseField_getDamage
2014-09-05 22:01:27 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2014-09-26 23:37:48 +05:30
real ( pReal ) :: constitutive_getDamage
2014-09-05 22:01:27 +05:30
2014-10-28 06:48:10 +05:30
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2015-04-21 21:41:30 +05:30
case default
2014-10-28 06:48:10 +05:30
constitutive_getDamage = 1.0_pReal
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
constitutive_getDamage = damage_isoBrittle_getDamage ( ipc , ip , el )
2014-10-28 06:48:10 +05:30
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoDuctile_ID )
constitutive_getDamage = damage_isoDuctile_getDamage ( ipc , ip , el )
2014-10-28 06:48:10 +05:30
2014-11-05 23:11:08 +05:30
case ( LOCAL_DAMAGE_anisoBrittle_ID )
constitutive_getDamage = damage_anisoBrittle_getDamage ( ipc , ip , el )
case ( LOCAL_DAMAGE_anisoDuctile_ID )
constitutive_getDamage = damage_anisoDuctile_getDamage ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
constitutive_getDamage = damage_phaseField_getDamage ( ipc , ip , el )
2014-09-23 17:52:34 +05:30
end select
2014-09-05 22:01:27 +05:30
2014-09-26 23:37:48 +05:30
end function constitutive_getDamage
2014-10-11 15:39:36 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns damage diffusion tensor
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getDamageDiffusion33 ( ipc , ip , el )
2014-10-11 15:39:36 +05:30
use prec , only : &
pReal
use lattice , only : &
lattice_DamageDiffusion33
use material , only : &
material_phase , &
2014-11-25 22:53:37 +05:30
phase_damage , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
2015-03-06 18:39:00 +05:30
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-25 22:53:37 +05:30
LOCAL_DAMAGE_phaseField_ID
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_getDamageDiffusion33
2015-03-06 18:39:00 +05:30
use damage_anisoBrittle , only : &
damage_anisoBrittle_getDamageDiffusion33
2014-11-25 22:53:37 +05:30
use damage_phaseField , only : &
damage_phaseField_getDamageDiffusion33
2014-10-11 15:39:36 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , dimension ( 3 , 3 ) :: &
constitutive_getDamageDiffusion33
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
constitutive_getDamageDiffusion33 = damage_isoBrittle_getDamageDiffusion33 ( ipc , ip , el )
2015-03-06 18:39:00 +05:30
case ( LOCAL_DAMAGE_anisoBrittle_ID )
constitutive_getDamageDiffusion33 = damage_anisoBrittle_getDamageDiffusion33 ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
case ( LOCAL_DAMAGE_phaseField_ID )
constitutive_getDamageDiffusion33 = damage_phaseField_getDamageDiffusion33 ( ipc , ip , el )
2015-01-29 19:26:09 +05:30
case default
constitutive_getDamageDiffusion33 = lattice_DamageDiffusion33 ( 1 : 3 , 1 : 3 , material_phase ( ipc , ip , el ) )
2014-10-11 15:39:36 +05:30
end select
end function constitutive_getDamageDiffusion33
2014-09-10 23:56:12 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns local (unregularised) temperature
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getAdiabaticTemperature ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-10-09 19:38:32 +05:30
LOCAL_THERMAL_adiabatic_ID , &
2014-10-13 23:24:27 +05:30
phase_thermal , &
phase_thermalInstance
use thermal_isothermal , only : &
thermal_isothermal_temperature
2014-10-09 19:38:32 +05:30
use thermal_adiabatic , only : &
2015-04-21 21:41:30 +05:30
thermal_adiabatic_getLocalTemperature
2014-09-05 22:01:27 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2014-09-26 23:37:48 +05:30
real ( pReal ) :: constitutive_getAdiabaticTemperature
2014-09-05 22:01:27 +05:30
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
2015-04-21 21:41:30 +05:30
case ( LOCAL_THERMAL_adiabatic_ID )
constitutive_getAdiabaticTemperature = thermal_adiabatic_getLocalTemperature ( ipc , ip , el )
case default
2014-10-13 23:24:27 +05:30
constitutive_getAdiabaticTemperature = &
thermal_isothermal_temperature ( phase_thermalInstance ( material_phase ( ipc , ip , el ) ) )
2014-09-05 22:01:27 +05:30
end select
2014-09-26 23:37:48 +05:30
end function constitutive_getAdiabaticTemperature
2014-09-05 22:01:27 +05:30
2014-09-22 23:45:19 +05:30
!--------------------------------------------------------------------------------------------------
2014-10-28 16:19:12 +05:30
!> @brief assigns the local/nonlocal value of temperature to local thermal state
2014-09-22 23:45:19 +05:30
!--------------------------------------------------------------------------------------------------
2014-09-26 23:37:48 +05:30
subroutine constitutive_putAdiabaticTemperature ( ipc , ip , el , localTemperature )
2014-09-22 23:45:19 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-10-09 19:38:32 +05:30
LOCAL_THERMAL_adiabatic_ID , &
2014-09-22 23:45:19 +05:30
phase_thermal
2014-10-09 19:38:32 +05:30
use thermal_adiabatic , only : &
2015-04-21 21:41:30 +05:30
thermal_adiabatic_putLocalTemperature
2014-09-22 23:45:19 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , intent ( in ) :: &
localTemperature
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
2014-10-09 19:38:32 +05:30
case ( LOCAL_THERMAL_adiabatic_ID )
2015-04-21 21:41:30 +05:30
call thermal_adiabatic_putLocalTemperature ( ipc , ip , el , localTemperature )
2014-09-22 23:45:19 +05:30
end select
2014-09-26 23:37:48 +05:30
end subroutine constitutive_putAdiabaticTemperature
2014-09-22 23:45:19 +05:30
2014-09-10 23:56:12 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns nonlocal (regularised) temperature
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getTemperature ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
use prec , only : &
pReal
use material , only : &
2014-09-10 20:42:14 +05:30
material_phase , &
2015-04-21 21:41:30 +05:30
LOCAL_THERMAL_adiabatic_ID , &
phase_thermal
use thermal_adiabatic , only : &
thermal_adiabatic_getTemperature
use thermal_isothermal , only : &
thermal_isothermal_temperature
2014-09-05 22:01:27 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2014-09-26 23:37:48 +05:30
real ( pReal ) :: constitutive_getTemperature
2014-09-05 22:01:27 +05:30
2015-04-21 21:41:30 +05:30
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_THERMAL_adiabatic_ID )
constitutive_getTemperature = thermal_adiabatic_getTemperature ( ipc , ip , el )
2014-09-05 22:01:27 +05:30
2015-04-21 21:41:30 +05:30
case default
constitutive_getTemperature = thermal_isothermal_temperature ( material_phase ( ipc , ip , el ) )
2014-10-28 06:48:10 +05:30
end select
2014-09-05 22:01:27 +05:30
2014-09-26 23:37:48 +05:30
end function constitutive_getTemperature
2014-10-10 22:04:51 +05:30
2014-12-17 19:07:13 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns heat generation rate
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getHeatGeneration ( Tstar_v , Lp , ipc , ip , el )
2014-12-17 19:07:13 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_THERMAL_adiabatic_ID , &
phase_thermal
use thermal_adiabatic , only : &
thermal_adiabatic_getHeatGeneration
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola-Kirchhoff stress
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 ) :: &
Lp !< plastic velocity gradient
real ( pReal ) :: constitutive_getHeatGeneration
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_THERMAL_adiabatic_ID )
constitutive_getHeatGeneration = thermal_adiabatic_getHeatGeneration ( Tstar_v , Lp )
2015-04-21 21:41:30 +05:30
case default
constitutive_getHeatGeneration = 0.0_pReal
2014-12-17 19:07:13 +05:30
end select
end function constitutive_getHeatGeneration
2014-10-11 02:25:09 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns local vacancy concentration
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getLocalVacancyConcentration ( ipc , ip , el )
2014-10-11 02:25:09 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
2014-11-25 22:53:37 +05:30
vacancy_generation_getLocalConcentration
2014-10-11 02:25:09 +05:30
use lattice , only : &
lattice_equilibriumVacancyConcentration
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) :: constitutive_getLocalVacancyConcentration
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
2015-04-21 21:41:30 +05:30
case ( LOCAL_VACANCY_generation_ID )
constitutive_getLocalVacancyConcentration = vacancy_generation_getLocalConcentration ( ipc , ip , el )
case default
2014-10-11 02:25:09 +05:30
constitutive_getLocalVacancyConcentration = &
lattice_equilibriumVacancyConcentration ( material_phase ( ipc , ip , el ) )
end select
end function constitutive_getLocalVacancyConcentration
!--------------------------------------------------------------------------------------------------
!> @brief Puts local vacancy concentration
!--------------------------------------------------------------------------------------------------
subroutine constitutive_putLocalVacancyConcentration ( ipc , ip , el , localVacancyConcentration )
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
2014-11-25 22:53:37 +05:30
vacancy_generation_putLocalConcentration
2014-10-11 02:25:09 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , intent ( in ) :: &
localVacancyConcentration
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
2014-11-25 22:53:37 +05:30
call vacancy_generation_putLocalConcentration ( ipc , ip , el , localVacancyConcentration )
2014-10-11 02:25:09 +05:30
end select
end subroutine constitutive_putLocalVacancyConcentration
!--------------------------------------------------------------------------------------------------
!> @brief returns nonlocal vacancy concentration
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getVacancyConcentration ( ipc , ip , el )
2014-10-11 02:25:09 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
2014-11-25 22:53:37 +05:30
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
vacancy_generation_getConcentration
2014-10-11 02:25:09 +05:30
use lattice , only : &
lattice_equilibriumVacancyConcentration
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) :: constitutive_getVacancyConcentration
2014-11-25 22:53:37 +05:30
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
constitutive_getVacancyConcentration = vacancy_generation_getConcentration ( ipc , ip , el )
2015-04-21 21:41:30 +05:30
case default
constitutive_getVacancyConcentration = &
lattice_equilibriumVacancyConcentration ( material_phase ( ipc , ip , el ) )
2014-11-25 22:53:37 +05:30
end select
2014-10-11 02:25:09 +05:30
end function constitutive_getVacancyConcentration
2014-10-11 16:09:44 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns vacancy diffusion tensor
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getVacancyDiffusion33 ( ipc , ip , el )
2014-10-11 16:09:44 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
vacancy_generation_getVacancyDiffusion33
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , dimension ( 3 , 3 ) :: &
constitutive_getVacancyDiffusion33
2014-11-25 22:53:37 +05:30
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
constitutive_getVacancyDiffusion33 = &
vacancy_generation_getVacancyDiffusion33 ( ipc , ip , el )
end select
end function constitutive_getVacancyDiffusion33
!--------------------------------------------------------------------------------------------------
!> @brief returns vacancy diffusion tensor
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure function constitutive_getVacancyMobility33 ( ipc , ip , el )
2014-11-25 22:53:37 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
vacancy_generation_getVacancyMobility33
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
real ( pReal ) , dimension ( 3 , 3 ) :: &
constitutive_getVacancyMobility33
2014-10-11 16:09:44 +05:30
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
2014-11-25 22:53:37 +05:30
constitutive_getVacancyMobility33 = &
2015-01-16 22:34:01 +05:30
vacancy_generation_getVacancyMobility33 ( constitutive_getTemperature ( ipc , ip , el ) , &
ipc , ip , el )
2014-10-11 16:09:44 +05:30
end select
2014-11-25 22:53:37 +05:30
end function constitutive_getVacancyMobility33
2014-10-11 16:09:44 +05:30
2014-11-26 01:43:33 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns vacancy chemical potential driving force
!--------------------------------------------------------------------------------------------------
2015-04-21 21:41:30 +05:30
pure real ( pReal ) function constitutive_getVacancyEnergy ( ipc , ip , el )
2014-11-26 01:43:33 +05:30
use prec , only : &
pReal
use material , only : &
material_phase , &
LOCAL_VACANCY_generation_ID , &
phase_vacancy
use vacancy_generation , only : &
2015-01-16 22:34:01 +05:30
vacancy_generation_getVacancyEnergy
2014-11-26 01:43:33 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
ipc , & !< grain number
ip , & !< integration point number
el !< element number
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
2015-01-16 22:34:01 +05:30
constitutive_getVacancyEnergy = &
vacancy_generation_getVacancyEnergy ( ipc , ip , el )
2015-04-21 21:41:30 +05:30
case default
constitutive_getVacancyEnergy = 0.0_pReal
2014-11-26 01:43:33 +05:30
end select
2015-01-16 22:34:01 +05:30
end function constitutive_getVacancyEnergy
2014-11-26 01:43:33 +05:30
2014-10-11 15:15:30 +05:30
2013-01-16 15:44:57 +05:30
!--------------------------------------------------------------------------------------------------
!> @brief returns array of constitutive results
!--------------------------------------------------------------------------------------------------
2014-10-10 17:58:57 +05:30
function constitutive_postResults ( Tstar_v , FeArray , ipc , ip , el )
2014-07-02 17:57:39 +05:30
use prec , only : &
pReal
2013-01-16 15:44:57 +05:30
use mesh , only : &
mesh_NcpElems , &
mesh_maxNips
use material , only : &
2014-05-22 20:54:12 +05:30
plasticState , &
2014-09-23 16:08:20 +05:30
damageState , &
thermalState , &
2014-10-11 02:25:09 +05:30
vacancyState , &
2013-01-16 15:44:57 +05:30
phase_plasticity , &
2014-09-23 16:08:20 +05:30
phase_damage , &
phase_thermal , &
2014-10-11 02:25:09 +05:30
phase_vacancy , &
2013-01-16 15:44:57 +05:30
material_phase , &
2013-11-27 13:34:05 +05:30
homogenization_maxNgrains , &
PLASTICITY_NONE_ID , &
PLASTICITY_J2_ID , &
PLASTICITY_PHENOPOWERLAW_ID , &
PLASTICITY_DISLOTWIN_ID , &
2014-08-08 16:34:40 +05:30
PLASTICITY_DISLOKMC_ID , &
2015-01-15 16:26:15 +05:30
PLASTICITY_DISLOUCLA_ID , &
2013-11-27 13:34:05 +05:30
PLASTICITY_TITANMOD_ID , &
2014-09-23 16:08:20 +05:30
PLASTICITY_NONLOCAL_ID , &
2014-10-28 16:19:12 +05:30
LOCAL_DAMAGE_isoBrittle_ID , &
LOCAL_DAMAGE_isoDuctile_ID , &
LOCAL_DAMAGE_anisoBrittle_ID , &
2014-11-26 17:02:19 +05:30
LOCAL_DAMAGE_anisoDuctile_ID , &
2014-10-10 18:12:12 +05:30
LOCAL_DAMAGE_gurson_ID , &
2014-11-26 17:02:19 +05:30
LOCAL_DAMAGE_phaseField_ID , &
2014-10-11 02:25:09 +05:30
LOCAL_THERMAL_ADIABATIC_ID , &
LOCAL_VACANCY_generation_ID
2014-12-08 21:25:30 +05:30
use plastic_j2 , only : &
2014-04-15 15:39:20 +05:30
#ifdef HDF
2014-12-08 21:25:30 +05:30
plastic_j2_postResults2 , &
2014-04-15 15:39:20 +05:30
#endif
2014-12-08 21:25:30 +05:30
plastic_j2_postResults
use plastic_phenopowerlaw , only : &
plastic_phenopowerlaw_postResults
use plastic_dislotwin , only : &
plastic_dislotwin_postResults
use plastic_dislokmc , only : &
plastic_dislokmc_postResults
2015-01-15 16:26:15 +05:30
use plastic_disloucla , only : &
plastic_disloucla_postResults
2014-12-08 21:25:30 +05:30
use plastic_titanmod , only : &
plastic_titanmod_postResults
use plastic_nonlocal , only : &
plastic_nonlocal_postResults
2014-10-28 16:19:12 +05:30
use damage_isoBrittle , only : &
damage_isoBrittle_postResults
use damage_isoDuctile , only : &
damage_isoDuctile_postResults
use damage_anisoBrittle , only : &
damage_anisoBrittle_postResults
2014-11-26 17:02:19 +05:30
use damage_anisoDuctile , only : &
damage_anisoDuctile_postResults
use damage_gurson , only : &
damage_gurson_postResults
use damage_phaseField , only : &
damage_phaseField_postResults
2014-10-09 19:38:32 +05:30
use thermal_adiabatic , only : &
thermal_adiabatic_postResults
2014-10-11 02:25:09 +05:30
use vacancy_generation , only : &
vacancy_generation_postResults
2014-09-23 16:08:20 +05:30
2013-01-16 15:44:57 +05:30
implicit none
integer ( pInt ) , intent ( in ) :: &
2013-10-14 16:24:45 +05:30
ipc , & !< grain number
ip , & !< integration point number
el !< element number
2014-09-23 16:08:20 +05:30
real ( pReal ) , dimension ( plasticState ( material_phase ( ipc , ip , el ) ) % sizePostResults + &
damageState ( material_phase ( ipc , ip , el ) ) % sizePostResults + &
2014-10-11 02:25:09 +05:30
thermalState ( material_phase ( ipc , ip , el ) ) % sizePostResults + &
vacancyState ( material_phase ( ipc , ip , el ) ) % sizePostResults ) :: &
2014-09-23 16:08:20 +05:30
constitutive_postResults
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 3 , 3 , homogenization_maxNgrains , mesh_maxNips , mesh_NcpElems ) :: &
2014-03-13 12:13:49 +05:30
FeArray !< elastic deformation gradient
2013-01-16 15:44:57 +05:30
real ( pReal ) , intent ( in ) , dimension ( 6 ) :: &
Tstar_v !< 2nd Piola Kirchhoff stress tensor (Mandel)
2014-10-28 08:12:25 +05:30
integer ( pInt ) :: &
startPos , endPos
2014-09-23 02:08:19 +05:30
2013-01-16 15:44:57 +05:30
constitutive_postResults = 0.0_pReal
2014-09-23 16:08:20 +05:30
startPos = 1_pInt
endPos = plasticState ( material_phase ( ipc , ip , el ) ) % sizePostResults
2013-09-19 13:16:01 +05:30
select case ( phase_plasticity ( material_phase ( ipc , ip , el ) ) )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_TITANMOD_ID )
2014-12-08 21:25:30 +05:30
constitutive_postResults ( startPos : endPos ) = plastic_titanmod_postResults ( ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_J2_ID )
2014-12-08 21:25:30 +05:30
constitutive_postResults ( startPos : endPos ) = plastic_j2_postResults ( Tstar_v , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_PHENOPOWERLAW_ID )
2014-09-23 16:08:20 +05:30
constitutive_postResults ( startPos : endPos ) = &
2014-12-08 21:25:30 +05:30
plastic_phenopowerlaw_postResults ( Tstar_v , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_DISLOTWIN_ID )
2014-09-23 16:08:20 +05:30
constitutive_postResults ( startPos : endPos ) = &
2014-12-08 21:25:30 +05:30
plastic_dislotwin_postResults ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2014-08-08 16:34:40 +05:30
case ( PLASTICITY_DISLOKMC_ID )
2014-09-23 16:08:20 +05:30
constitutive_postResults ( startPos : endPos ) = &
2014-12-08 21:25:30 +05:30
plastic_dislokmc_postResults ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2015-01-15 16:26:15 +05:30
case ( PLASTICITY_DISLOUCLA_ID )
constitutive_postResults ( startPos : endPos ) = &
plastic_disloucla_postResults ( Tstar_v , constitutive_getTemperature ( ipc , ip , el ) , ipc , ip , el )
2013-11-27 13:34:05 +05:30
case ( PLASTICITY_NONLOCAL_ID )
2014-09-23 16:08:20 +05:30
constitutive_postResults ( startPos : endPos ) = &
2014-12-08 21:25:30 +05:30
plastic_nonlocal_postResults ( Tstar_v , FeArray , ip , el )
2013-01-16 15:44:57 +05:30
end select
2014-09-23 16:08:20 +05:30
startPos = endPos + 1_pInt
endPos = endPos + damageState ( material_phase ( ipc , ip , el ) ) % sizePostResults
select case ( phase_damage ( material_phase ( ipc , ip , el ) ) )
2014-10-28 16:19:12 +05:30
case ( LOCAL_DAMAGE_isoBrittle_ID )
constitutive_postResults ( startPos : endPos ) = damage_isoBrittle_postResults ( ipc , ip , el )
case ( LOCAL_DAMAGE_isoDuctile_ID )
constitutive_postResults ( startPos : endPos ) = damage_isoDuctile_postResults ( ipc , ip , el )
case ( LOCAL_DAMAGE_anisoBrittle_ID )
constitutive_postResults ( startPos : endPos ) = damage_anisoBrittle_postResults ( ipc , ip , el )
2014-11-26 17:02:19 +05:30
case ( LOCAL_DAMAGE_anisoDuctile_ID )
constitutive_postResults ( startPos : endPos ) = damage_anisoDuctile_postResults ( ipc , ip , el )
case ( LOCAL_DAMAGE_gurson_ID )
constitutive_postResults ( startPos : endPos ) = damage_gurson_postResults ( ipc , ip , el )
case ( LOCAL_DAMAGE_phaseField_ID )
constitutive_postResults ( startPos : endPos ) = damage_phaseField_postResults ( ipc , ip , el )
2014-09-23 16:08:20 +05:30
end select
startPos = endPos + 1_pInt
endPos = endPos + thermalState ( material_phase ( ipc , ip , el ) ) % sizePostResults
select case ( phase_thermal ( material_phase ( ipc , ip , el ) ) )
2014-10-09 19:38:32 +05:30
case ( LOCAL_THERMAL_ADIABATIC_ID )
constitutive_postResults ( startPos : endPos ) = thermal_adiabatic_postResults ( ipc , ip , el )
2014-09-23 16:08:20 +05:30
end select
2014-10-11 02:25:09 +05:30
startPos = endPos + 1_pInt
endPos = endPos + vacancyState ( material_phase ( ipc , ip , el ) ) % sizePostResults
select case ( phase_vacancy ( material_phase ( ipc , ip , el ) ) )
case ( LOCAL_VACANCY_generation_ID )
constitutive_postResults ( startPos : endPos ) = vacancy_generation_postResults ( ipc , ip , el )
end select
openmp parallelization working again (at least for j2 and nonlocal constitutive model).
In order to keep it like that, please follow these simple rules:
DON'T use implicit array subscripts:
example: real, dimension(3,3) :: A,B
A(:,2) = B(:,1) <--- DON'T USE
A(1:3,2) = B(1:3,1) <--- BETTER USE
In many cases the use of explicit array subscripts is inevitable for parallelization. Additionally, it is an easy means to prevent memory leaks.
Enclose all write statements with the following:
!$OMP CRITICAL (write2out)
<your write statement>
!$OMP END CRITICAL (write2out)
Whenever you change something in the code and are not sure if it affects parallelization and leads to nonconforming behavior, please ask me and/or Franz to check this.
2011-03-17 16:16:17 +05:30
2012-10-02 18:23:25 +05:30
end function constitutive_postResults
2009-03-06 15:32:36 +05:30
2012-03-14 21:46:11 +05:30
2013-02-11 16:13:45 +05:30
end module constitutive