-
Notifications
You must be signed in to change notification settings - Fork 5
/
kslipPowerLaw.f
150 lines (116 loc) · 5.45 KB
/
kslipPowerLaw.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
** Nicolo Grilli
** 28th January 2019
** alpha-Uranium
** AWE project
**
** including twinning
** NO rotation of slip systems due to twinning
** but slip is allowed inside twins
**
** for full twin developement a characteristic
** time is introduced if twin volume fraction > 0.5
** This leads the twin volume fraction to reach 1.0
** after about the characteristic time
**
subroutine kslipPowerLaw(xNorm,xDir,xTwinNorm,xTwinDir,
+ tau,tautwin,signtau,signtautwin,tauc,tauctwin,
+ burgerv,dtime,nSys,nTwin,iphase,irradiate,
+ gndcut,gndtot,rhossd,twinvolfrac,twinvolfractotal,
+ Lp,tmat,gammaDot,gammaTwinDot,twinon,
+ nTwinStart,nTwinEnd)
implicit none
integer,intent(in) :: nSys,nTwin,iphase,irradiate,twinon
integer,intent(in) :: nTwinStart,nTwinEnd
real*8, intent(in) :: dtime, signtau(nSys),signtautwin(nTwin), gndcut(nSys), gndtot,rhossd
real*8, intent(in) :: xNorm(nSys,3),xDir(nSys,3),tau(nSys),tauc(nSys),burgerv(nSys)
real*8, intent(in) :: xTwinNorm(nTwin,3),xTwinDir(nTwin,3),tautwin(nTwin),tauctwin(nTwin)
real*8, intent(in) :: twinvolfrac(nTwin), twinvolfractotal ! twin volume fraction
real*8, intent(inout) :: gammaTwinDot(nTwin)
real*8, intent(out) :: Lp(3,3),tmat(6,6), gammaDot(nSys)
integer :: i, j
real*8 :: alpha,beta,result1, rhom,dF,f,T,k,gamma0,b,psi,V,
+ SNij(3,3),sni(6),nsi(6),SNNS(6,6),NSij(3,3),result4(6,6),
+ tempNorm(3), tempDir(3)
! alpha-Uranium shear strain rate law
real*8 :: gamma0dot, gamma0dottwin ! slip rate prefactor
real*8 :: nsliprate ! slip rate exponent
real*8 :: xtau ! ratio: resolved shear stress / CRSS
C
C *** CALCULATE THE DERIVATIVE OF PLASTIC STRAIN INCREMENT WITH
C RESPECT TO THE STRESS DEFINED AS tmat***
C
gamma0dot = 1.0e-3
gamma0dottwin = 1.0e-3
nsliprate = 20.0
!ne = microns, stress = MPa, F = microN, therefore E = pJ
C
tmat=0.; Lp = 0.;result4=0.
Do I=1,nSys ! shear due to slip without twinning
xtau = tau(I) / tauc(I)
! 0.5 for alpha-Uranium model due to the exponent 20 in the shear rate law
! slip is allowed inside twins
if (xtau >= 0.5) THEN
gammaDot(I)=gamma0dot*(xtau**nsliprate)*signtau(I) ! signed
tempNorm = xNorm(I,:);
tempDir = xDir(I,:)
SNij = spread(tempDir,2,3)*spread(tempNorm,1,3) ! b_i tensor product n_j
NSij = spread(tempNorm,2,3)*spread(tempDir,1,3) ! n_i b_j
CALL KGMATVEC6(SNij,sni)
CALL KGMATVEC6(NSij,nsi)
! nsi and sni are the same thing
SNNS = spread(sni,2,6)*spread(nsi,1,6)
result1 = xtau**(nsliprate-1.0)
! result4 = dt dL_{ij}/dsigma_{kl} with indices in Voigt notation
! such that 4,5,6 components contributes as (b_i n_j + b_j n_i)
! slip inside twin is allowed
result4=result4+(gamma0dot*nsliprate/tauc(I))*dtime*result1*SNNS
! update plastic velocity gradient
! slip is allowed inside twins
Lp = Lp + gammaDot(I)*SNij
else
gammaDot(I)=0.0
end if
C
END DO
if (twinon == 1) then ! twin active
Do I=nTwinStart,nTwinEnd ! shear due to twinning
xtau = tautwin(I) / tauctwin(I)
! 0.5 for alpha-Uranium model due to the exponent 20 in the shear rate law
! if twins have already occupied the whole volume
! no additional plastic strain from twinning is possible
if ((xtau >= 0.5 .or. twinvolfrac(I) > 0.5) .and. twinvolfrac(I) < 1.0) THEN
gammaTwinDot(I)=gamma0dottwin*(xtau**nsliprate)*signtautwin(I) ! signtautwin always positive
if (gammaTwinDot(I) > 1000.0*gamma0dottwin) then
gammaTwinDot(I) = 1000.0*gamma0dottwin
end if
! add contribution if activation threshold 0.5 has been passed
! here characteristic time is 1s
if (twinvolfrac(I) > 0.5) then
gammaTwinDot(I)=gammaTwinDot(I)+0.299*(1.0-twinvolfrac(I))
end if
tempNorm = xTwinNorm(I,:);
tempDir = xTwinDir(I,:)
SNij = spread(tempDir,2,3)*spread(tempNorm,1,3) ! b_i tensor product n_j
NSij = spread(tempNorm,2,3)*spread(tempDir,1,3) ! n_i b_j
CALL KGMATVEC6(SNij,sni)
CALL KGMATVEC6(NSij,nsi)
! nsi and sni are the same thing
SNNS = spread(sni,2,6)*spread(nsi,1,6)
if (gammaTwinDot(I) > 999.0*gamma0dottwin) then
result1 = 707.9
else
result1 = xtau**(nsliprate-1.0)
end if
! result4 = dt dL_{ij}/dsigma_{kl} with indices in Voigt notation
! such that 4,5,6 components contributes as (b_i n_j + b_j n_i)
result4 = result4 + (gamma0dottwin*nsliprate/tauctwin(I))*dtime*result1*SNNS
! update plastic velocity gradient
Lp = Lp + gammaTwinDot(I)*SNij
else
gammaTwinDot(I)=0.0
end if
END DO
end if ! twin active
tmat = 0.5*(result4+transpose(result4))
return
end