0% found this document useful (0 votes)
285 views

Supplementary Material: Y. Xu, A.T. Zehnder

The supplementary material includes a sample FORTRAN script for a viscoelastic user material (VUMAT) subroutine for ABAQUS. The script contains the VUMAT subroutine structure, variable declarations, material parameter reading, constitutive equations to update stress, and utility subroutines. The material model accounts for linear viscoelasticity, state variable viscoplasticity, hydrolytic degradation, and plasticization.

Uploaded by

KILARUDIVYA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
285 views

Supplementary Material: Y. Xu, A.T. Zehnder

The supplementary material includes a sample FORTRAN script for a viscoelastic user material (VUMAT) subroutine for ABAQUS. The script contains the VUMAT subroutine structure, variable declarations, material parameter reading, constitutive equations to update stress, and utility subroutines. The material model accounts for linear viscoelasticity, state variable viscoplasticity, hydrolytic degradation, and plasticization.

Uploaded by

KILARUDIVYA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 9

Supplementary Material

Y. Xu, A.T. Zehnder

The supplementary material includes a sample script code for ABAQUS Explicit user material

subroutine (VUMAT) written in FORTRAN 77.


Sample VUMAT Script

**********************************************************************************
! VUMAT Subroutine Written in FORTRAN 77 for Use as ABAQUS Explicit user material
!
! This script works for cases of plane strain, axisymmetric or 3-D. (the
! script for plane stress is written separately.)
!
! To run this script, type “abaqus job=<input file name> user=<vumat file
! name>” in cmd window. In the input file, define all model material
! parameters under *User Material.
!
! The parameters should be provided in the order of (nG, g_i (i=1:nG),
! tao_i (i=1:nG), G_0, K_0, A_v, Q_v, m, h0, g0, omega, eta_cv, s_cvprime,
! s_0prime, beta, temp_ref, C1, C2, phi, a1, b1, a2, b2, Ah1, Qh1, Ah2, Qh2)
! as defined in the above tables. Lines 117-152 of the code below list
! all material parameters read from ABAQUS.
!
! Note that viscoelastic parameters g_i=G_i/G_0. The material moisture
! concentration phi is treated as a material parameter in this vumat, instead
! of a field variable.
!
! The code contains 5 main sections:
! Lines 1-29 : default ABAQUS vumat header;
! Lines 30-89 : variable declarations;
! Lines 90-194 : necessary pre-processing including constant definitions
! (lines 94-99), dimension allocations (lines 100-115),
! material parameter readings (lines 117-152), and solution
! dependent variable readings (lines 153-194);
! Lines 195-319 : main part of vumat, applying constitutive equations to
! update stress;
! Lines 320-412 : utility subroutines.
!
! The material model is used for thermosetting polyimides at high temperature
! and/or high humid environments. The model includes linear viscoelasticity,
! state variable viscoplasticity, hydrolytic degradation and plasticization.
**********************************************************************************
! Default header and interface link to ABAQUS Explicit (DO NOT CHANGE)
**********************************************************************************
1 subroutine vumat(
2 C Read only
3 + nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,
4 + stepTime, totalTime, dt, cmname, coordMp, charLength,
5 + props, density, strainInc, relSpinInc,
6 + tempOld, stretchOld, defgradOld, fieldOld,
7 + stressOld, stateOld, enerInternOld, enerInelasOld,
8 + tempNew, stretchNew, defgradNew, fieldNew,
9 C Write only
10 + stressNew, stateNew, enerInternNew, enerInelasNew )
11 C
12 include 'vaba_param.inc'
13 C
14 C All arrays dimensioned by (*) are not used in this algorithm
15 C
16 dimension props(nprops), density(nblock),
17 + coordMp(nblock,*),
18 + charLength(*), strainInc(nblock,ndir+nshr),
19 + relSpinInc(*), tempOld(nblock),
20 + stretchOld(*), defgradOld(*),
21 + fieldOld(*), stressOld(nblock,ndir+nshr),
22 + stateOld(nblock,nstatev), enerInternOld(nblock),
23 + enerInelasOld(nblock), tempNew(nblock),
24 + stretchNew(*), defgradNew(*), fieldNew(*),
25 + stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev),
26 + enerInternNew(nblock), enerInelasNew(nblock)
27 C
28 character*80 cmname
29 C
30 **********************************************************************************
31 ! VARIABLE DECLARATIONS
32 **********************************************************************************
33 C Constants
34 C
35 real*8 zero, one, two, three, third, half, twoThirds
36 real*8 ten, threeseconds, nearOne
37 real*8 kB, TC2K, RGas
38 C
39 C Material parameters
40 C
41 integer ComN ! Number of stress (strain) components (3D: ComN=6;
42 ! strain or axisymmetric: ComN=4)
43 integer ProN ! Number of terms in Prony series (viscoelasticity)
44 real G0, K0 ! Shear and bulk moduli
45 real, dimension(:) ,allocatable :: gi, taoi ! Normalized Gi and
46 ! time constants
47 C
48 real TempRef, C1, C2 ! WLF parameters
49 real Av, Qv, mm, hh0, gg0, omega, etacv, scvstar, SS0, beta
50 ! parameters for viscoplasticity
51
52 real Phi, a1, b1, a2, b2 ! parameters for plasticization
53 real Ah1, Qh1, Ah2, Qh2 ! parameters for hydrolysis
54 C
55 C Solution dependent state variables
56 C
57 real*8, dimension(:,:) ,allocatable :: eiOld ! viscoelasticity
58 real*8, dimension(:) ,allocatable :: eOld ! viscoelasticity
59 real*8 EQPStrainOld, SSOld, etaOld ! viscoplasticity
60 real*8 hyIntEOld, hyIntpOld ! hydrolysis
61 C
62 C Field variables read from last iteration
63 C
64 real*8 TempNewi, TempOldi
65 real*8, dimension(:) ,allocatable :: StressOldi, StressNewi
66 real*8, dimension(:) ,allocatable :: StrainInci
67 real*8 densityi, EnerInternOldi, EnerInternNewi
68 C
69 C Internal variables for viscoplasticity
70 C
71 real*8 VolEStrainInc, EQStress
72 real*8, dimension(:) ,allocatable :: DevStressOld, DevEStrainInc
73 real*8 scv, seta, dss, deta, EQPStrainInc, Termdep, Saddon, SSOldF
74 integer i,j,k
75 real*8, dimension(:) ,allocatable :: PStrainInc, EStrainInc
76 C
77 C Internal variables for viscoelasticit
78 C
79 real*8 hathOld, hathNew, hathDiff
80 real*8 athInvOld, athInvNew, athOld, athNew
81 real*8 dtao
82 real*8, dimension(:) ,allocatable :: DevStressInc
83 real*8 Termdei1, Termdei2, dei
84 C
85 C Internal variables for plasticization and hydrolysis
86 C
87 real*8 hE, hp, alphap, alphaE, SSOldS, G0S, K0S
88 real*8 lambdaE, lambdap, lambdaInf, kkE, kkp
89 C
90 **********************************************************************************
91 ! ALLOCATIONS
92 **********************************************************************************
93 C
94 parameter( zero = 0.d0, one = 1.d0, two = 2.d0, three = 3.d0,
95 + third = one/three, half = .5d0, twoThirds = two/three,
96 + threeseconds = three/two, ten = 10.d0, kB = 1.3806488e-23,
97 + TC2K = 273.15d0, nearOne = 0.999d0, Rgas = 8.31441d0,
98 + lambdaInf = 0.4d0)
99 C
100 C Dimension allocations
101 C
102 ProN = props(1) ! Number of Prony terms
103 ComN = nshr + ndir ! Number of Components
104 allocate(gi(ProN))
105 allocate(taoi(ProN))
106 allocate(eiOld(ProN,ComN))
107 allocate(eOld(ComN))
108 allocate(StressOldi(ComN))
109 allocate(StressNewi(ComN))
110 allocate(StrainInci(ComN))
111 allocate(DevStressOld(ComN))
112 allocate(DevEStrainInc(ComN))
113 allocate(PStrainInc(ComN))
114 allocate(EStrainInc(ComN))
115 allocate(DevStressInc(ComN))
116 C
117 C Material properties read from Abaqus input file
118 C
119 do j = 1,ProN ! viscoelasticity
120 gi(j) = props(j+1)
121 taoi(j) = props(ProN+j+1)
122 enddo
123 G0 = props(2*ProN+2)
124 K0 = props(2*ProN+3)
125 C
126 Av = props(2*ProN+4) ! viscoplasticity
127 Qv = props(2*ProN+5)
128 mm = props(2*ProN+6)
129 hh0 = props(2*ProN+7)
130 gg0 = props(2*ProN+8)
131 omega = props(2*ProN+9)
132 etacv = props(2*ProN+10)
133 scvstar= props(2*ProN+11)
134 ss0 = props(2*ProN+12)
135 beta = props(2*ProN+13)
136 C
137 TempRef= props(2*ProN+14) ! WLF
138 C1 = props(2*ProN+15)
139 C2 = props(2*ProN+16)
140
141 C
142 Phi = props(2*ProN+17) ! Plasticization
143 a1 = props(2*ProN+18)
144 b1 = props(2*ProN+19)
145 a2 = props(2*ProN+20)
146 b2 = props(2*ProN+21)
147 C
148 Ah1 = props(2*ProN+22) ! Hydrolytic degradation
149 Qh1 = props(2*ProN+23)
150 Ah2 = props(2*ProN+24)
151 Qh2 = props(2*ProN+25)
152 C
153 **********************************************************************************
154 ! PREPROCESSING
155 **********************************************************************************
156 C
157 do i = 1,nblock ! loop over each Gauss point
158 C
159 C Temperature
160 C
161 TempOldi = tempOld(i)
162 TempNewi = tempNew(i)
163 Temp = (TempOldi + TempNewi)/two ! in degree C
164 C
165 C Solution dependent state variables for viscoelasticity
166 C
167 do k = 1,ComN
168 eOld(k) = StateOld(i,ComN*ProN+k)
169 do j = 1,ProN
170 eiOld(j,k) = StateOld(i,(j-1)*ComN+k)
171 enddo
172 enddo
173 C
174 C Solution dependent state variables for viscoplasticity
175 C
176 EQPStrainOld = StateOld(i,ComN*ProN+ComN+1)
177 SSOldF = StateOld(i,ComN*ProN+ComN+2)
178 etaOld = StateOld(i,ComN*ProN+ComN+3)
179 C
180 C Solution dependent state variables for hydrolytic degradation
181 C
182 hyIntEOld = StateOld(i,ComN*ProN+ComN+4)
183 hyIntpOld = StateOld(i,ComN*ProN+ComN+5)
184 C
185 C Other preprocessings
186 C
187 Saddon = ss0 * (one - beta * (Temp - TempRef)) ! state variables
188 ! start from zero
189 SSOld = SSOldF + Saddon ! Old state variable s
190 StressOldi = StressOld(i,1:ComN)
191 StrainInci = StrainInc(i,1:ComN)
192 densityi = density(i)
193 EnerInternOldi = EnerInternOld(i)
194 C
195 **********************************************************************************
196 ! VISCOPLASTICITY
197 **********************************************************************************
198 C
199 call DevCal(StressOldi,DevStressOld,ComN) ! obtain deviatoric stress
200 call EQStressCal(DevStressOld,EQStress,ComN) ! obtain equivalent stress
201 scv = scvstar * (one - beta * (Temp - TempRef))! temperature dependent "s"
202 C
203 C Moisture effect on strength
204 C
205 hp = min(max(ap * Temp + bp, zero),nearOne)
206 alphap = one - hp * Phi ! plasticization
207 lambdap = one/(hyIntpOld + one/(one-lambdaInf)) + lambdaInf ! hydrolysis
208 SSOldS = SSOld * alphap * lambdap
209
210 EQPStrainInc = Av * exp(-Qv/(kB*(Temp + TC2K))) *
211 + (EQStress/SSOldS)**mm*dt ! equivalent strain increment
212 StateNew(i,ComN*ProN+ComN+1) = EQPStrainInc + EQPStrainOld
213 C
214 C Update state variables ss, eta
215 C
216 seta = scv * (one + omega * (etacv - etaOld))
217 dSS = hh0 * (one - SSOld/seta) * EQPStrainInc
218 deta = gg0 * (SSOld/scv - one) * EQPStrainInc
219 StateNew(i,ComN*ProN+ComN+2) = dSS + SSOld - Saddon
220 StateNew(i,ComN*ProN+ComN+3) = deta + etaOld
221 C
222 C Update state variables for hydrolytic degradation
223 C
224 kkE = Ah1 * exp(-Qh1/Rgas/(Temp + TC2K)) ! rate constant for
225 ! modulus degradation
226 kkp = Ah2 * exp(-Qh2/Rgas/(Temp + TC2K)) ! rate constant for
227 ! yield degradation
228 StateNew(i,ComN*ProN+ComN+4) = hyIntEOld + Phi * kkE * dt
229 StateNew(i,ComN*ProN+ComN+5) = hyIntpOld + Phi * kkp * dt
230 C
231 C Zero dividend protection
232 C
233 if (EQStress - zero .le. 1E-10) then
234 Termdep = zero
235 else
236 Termdep = threeseconds/EQStress*EQPStrainInc
237 endif
238 C
239 do j = 1,ComN
240 PStrainInc(j) = Termdep * DevStressOld(j) ! plastic strain increments
241 EStrainInc(j) = StrainInci(j) - PStrainInc(j) ! elastic strain
242 ! increments
243 enddo
244 C
245 **********************************************************************************
246 ! VISCOELASTICITY
247 **********************************************************************************
248 C
249 call DevCal(EStrainInc,DevEStrainInc,ComN) ! obtain deviatoric strain inc.
250 VolEStrainInc = EStrainInc(1) + EStrainInc(2) + EStrainInc(3)
251 ! volumetric strain increment
252 C
253 C Moisture effect on stiffness
254 C
255 hE = min(max(a1 * Temp + b1, zero), nearOne)
256 alphaE = one - hE * Phi ! plasticization
257 lambdaE = one/(hyIntEOld + one) ! hydrolysis
258 G0S = G0 * alphaE * lambdaE ! long term shear moduli
259 K0S = K0 * alphaE * lambdaE ! bulk moduli
260
261 do k = 1,ComN
262 DevStressInc(k) = two * G0S * DevEStrainInc(k)
263 enddo
264 C
265 C Reduced time
266 C
267 hathOld = C1 * (TempOldi - TempRef)/
268 + (C2 + TempOldi - TempRef) ! -log10(atheta)
269 hathNew = C1 * (TempNewi - TempRef)/
270 + (C2 + TempNewi - TempRef) ! -log10(atheta)
271 hathDiff = hathNew - hathOld
272 athInvOld = ten**(hathOld)
273 athInvNew = ten**(hathNew)
274 athOld = one/athInvOld
275 athNew = one/athInvNew
276 if (hathDiff .le.1E-8) then
277 dtao = dt/((athOld + athNew)/two)
278 else
279 ! for highly nonlinearity case
280 dtao = (athInvNew - athInvOld)/hathDiff/log(ten)*dt
281 endif
282 C
283 C Refer to ABAQUS theory manual for detailed algorithms of computational
284 C viscoelasticity
285 C
286 do j = 1,ProN
287 Termdei1 = taoi(j)/dtao*
288 + (dtao/taoi(j) + exp(-dtao/taoi(j)) - one)
289 Termdei2 = one - exp(-dtao/taoi(j))
290 do k = 1,ComN
291 dei = Termdei1 * DevEStrainInc(k)
292 + + Termdei2 * (eold(k) - eiold(j,k))
293 StateNew(i,(j-1)*ComN+k) = eiOld(j,k) + dei
294 DevStressInc(k) = DevStressInc(k) - two * G0S * gi(j) * dei
295 enddo
296 enddo
297 C
298 C Update stress and state variables
299 do k = 1,ComN
300 StateNew(i,ComN*ProN+k) = eOld(k) + DevEStrainInc(k)
301 StressNewi(k) = StressOldi(k) + DevStressInc(k)
302 enddo
303 C
304 do k = 1,3
305 StressNewi(k) = StressNewi(k) + K0S * VolEStrainInc
306 enddo
307 C
308 C Energy calculation
309 C
310 call EnergyCal(StressOldi,StressNewi,
311 + StrainInci,densityi,EnerInternOldi,
312 + EnerInternNewi,ComN)
313 C
314 StressNew(i,1:ComN) = StressNewi
315 EnerInternNew(i) = EnerInternNewi
316 enddo
317 return
318 end subroutine vumat
319 C
320 ***************************************************************************
321 ***************************************************************************
322 ! The following subroutine is used to calculate the strain energy
323 C
324 subroutine EnergyCal(StressOld,StressNew,StrainInc,
325 + density,EnerInternOld,EnerInternNew,N)
326
327 implicit none
328 C
329 integer N
330 real*8 Half, two
331 real*8 StressOld(N),StressNew(N),StrainInc(N)
332 real*8 density, EnerInternOld, EnerInternNew
333 real*8 stressPower
334 parameter(Half = .5, two = 2.0)
335 C
336 stressPower = half * (
337 1 ( stressOld(1)+stressNew(1) )*strainInc(1)
338 1 +( stressOld(2)+stressNew(2) )*strainInc(2)
339 1 +( stressOld(3)+stressNew(3) )*strainInc(3)
340 1 + two*( stressOld(4)+stressNew(4) )*strainInc(4))
341 if (N .gt. 4) then
342 stressPower = stressPower + half * (
343 1 + two*( stressOld(5)+stressNew(5) )*strainInc(5)
344 1 + two*( stressOld(6)+stressNew(6) )*strainInc(6))
345 endif
346
347 enerInternNew = enerInternOld
348 1 + stressPower / density
349 C
350 end subroutine EnergyCal
351
352 ***************************************************************************
353 ***************************************************************************
354 ! The following subroutine is used to calculate the deviatoric matrix from
355 ! a 3*3 or 2*2 symmetric matrices
356 !
357 ! For 3D, 6 independent components are stored as the following way:
358 ! Ma(1;3) are the diagonal terms.
359 ! Ma(4:6) are the off-diagonal terms.
360 C
361 subroutine DevCal(Ma,DevMa,N)
362 implicit none
363 C
364 real*8 one, three, onethird
365 integer i, N
366 real*8 Ma(N), DevMa(N)
367
368 real*8 trace, pressure
369 parameter(one = 1.d0, three = 3.d0, onethird = one/three)
370 C
371 C For 3d, plane strain, axisymmetric
372 C
373 trace = Ma(1) + Ma(2) + Ma(3)
374 pressure = onethird * trace
375 do i = 1,3
376 DevMa(i) = Ma(i) - pressure
377 enddo
378 DevMa(4) = Ma(4)
379 if (N .gt. 4) then
380 DevMa(5) = Ma(5)
381 DevMa(6) = Ma(6)
382 endif
383
384 end subroutine DevCal
385 ****************************************************************************
386 ****************************************************************************
387 ! The following subroutine is used to calculate the equivalent stress.
388 ! Ma has to be symmetric.
389 subroutine EQStressCal(Ma,EQ,N)
390 implicit none
391 C
392 real*8 zero, two, threeseconds
393 integer i, N
394 real*8 Ma(N), Mag, EQ
395 parameter(zero = 0.d0, two = 2.d0, threeseconds = 1.5d0)
396 C
397 Mag = zero
398 C
399 do i = 1,3
400 Mag = Mag + Ma(i) * Ma(i)
401 enddo
402 C
403 Mag = Mag + two * Ma(4) * Ma(4)
404 if (N .gt. 4) then
405 Mag = Mag + two * Ma(5) * Ma(5)
406 Mag = Mag + two * Ma(6) * Ma(6)
407 endif
408
409 C
410 EQ = sqrt(threeseconds * Mag)
411 end subroutine EQStressCal
412 **********************************************************************************

You might also like