├── LICENSE ├── README.md ├── cube_explicit.inp └── vumat_nh.for /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Eoin McEvoy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Neo-Hooke-VUMAT 2 | Abaqus VUMAT fortran subroutine for a Neo-Hookean material 3 | 4 | Download the subroutine and run with the .inp file in Abaqus 5 | ``` 6 | abaqus inp=cube_explicit.inp user=vumat.for job=test01 7 | ``` 8 | 9 | Alter neo-hookean material properties (C10, D1) within the input file as required 10 | 11 | Subroutine has not been robustly tested but computes the same stress as the in-built Abaqus material law for several single-element deformations 12 | 13 | 14 | 15 | **MIT License** 16 | 17 | Permission is hereby granted, free of charge, to any person obtaining a copy 18 | of this software and associated documentation files (the "Software"), to deal 19 | in the Software without restriction, including without limitation the rights 20 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 21 | copies of the Software, and to permit persons to whom the Software is 22 | furnished to do so, subject to the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be included in all 25 | copies or substantial portions of the Software. 26 | 27 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 28 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 29 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 30 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 31 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 32 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 33 | SOFTWARE. 34 | -------------------------------------------------------------------------------- /cube_explicit.inp: -------------------------------------------------------------------------------- 1 | *Heading 2 | ** Job name: test_explicit Model name: Model-1 3 | ** Generated by: Abaqus/CAE 2017 4 | *Preprint, echo=NO, model=NO, history=NO, contact=NO 5 | ** 6 | ** PARTS 7 | ** 8 | *Part, name=Part-1 9 | *Node 10 | 1, 1., 1., 1. 11 | 2, 1., 0., 1. 12 | 3, 1., 1., 0. 13 | 4, 1., 0., 0. 14 | 5, 0., 1., 1. 15 | 6, 0., 0., 1. 16 | 7, 0., 1., 0. 17 | 8, 0., 0., 0. 18 | *Element, type=C3D8 19 | 1, 5, 6, 8, 7, 1, 2, 4, 3 20 | *Nset, nset=Set-1, generate 21 | 1, 8, 1 22 | *Elset, elset=Set-1 23 | 1, 24 | *Nset, nset=Control 25 | 1, 26 | *Nset, nset=Set-x, generate 27 | 2, 4, 1 28 | *Nset, nset=Set-y, generate 29 | 3, 7, 2 30 | *Nset, nset=Set-z 31 | 2, 5, 6 32 | ** Section: Section-1 33 | *Solid Section, elset=Set-1, material=Material-user 34 | , 35 | *End Part 36 | ** 37 | ** 38 | ** ASSEMBLY 39 | ** 40 | *Assembly, name=Assembly 41 | ** 42 | *Instance, name=Part-1-1, part=Part-1 43 | *End Instance 44 | ** 45 | *Nset, nset=Control, instance=Part-1-1 46 | 1, 47 | *Nset, nset=Set-1, instance=Part-1-1, generate 48 | 5, 8, 1 49 | *Elset, elset=Set-1, instance=Part-1-1 50 | 1, 51 | *Nset, nset=Set-2, instance=Part-1-1, generate 52 | 2, 8, 2 53 | *Elset, elset=Set-2, instance=Part-1-1 54 | 1, 55 | *Nset, nset=Set-3, instance=Part-1-1 56 | 3, 4, 7, 8 57 | *Elset, elset=Set-3, instance=Part-1-1 58 | 1, 59 | ** Constraint: Constraint-1 60 | *Equation 61 | 2 62 | Part-1-1.Set-x, 1, -1. 63 | Part-1-1.Control, 1, 1. 64 | *Equation 65 | 2 66 | Part-1-1.Set-y, 2, -1. 67 | Part-1-1.Control, 2, 1. 68 | *Equation 69 | 2 70 | Part-1-1.Set-z, 3, -1. 71 | Part-1-1.Control, 3, 1. 72 | ** 73 | *End Assembly 74 | ** 75 | *Amplitude, name=Amp-1 76 | 0., 0., 1., 1. 77 | ** MATERIALS 78 | ** 79 | *Material, name=Material-inbuilt 80 | *Density 81 | 1e-06, 82 | *Hyperelastic, neo hooke 83 | 0.179, 1.2 84 | ** 85 | *Material, name=Material-user 86 | *Density 87 | 1e-06, 88 | *Depvar 89 | 1, 90 | *User Material, constants=2 91 | **C10, D1 92 | 0.179, 1.2 93 | ** 94 | ** INITIAL BOUNDARY CONDITIONS 95 | ** Name: BC-1 Type: Displacement/Rotation 96 | *Boundary 97 | Set-1, 1, 1 98 | Set-2, 2, 2 99 | Set-3, 3, 3 100 | ** 101 | ** ---------------------------------------------------------------- 102 | ** 103 | ** STEP: Step-1 104 | ** 105 | *Step, name=Step-stretch, nlgeom=YES 106 | *Dynamic, Explicit 107 | , 1. 108 | *Bulk Viscosity 109 | 0.06, 1.2 110 | ** Mass Scaling: Semi-Automatic 111 | ** Whole Model 112 | *Variable Mass Scaling, dt=1e-06, type=below min, frequency=500 113 | ** 114 | ** BOUNDARY CONDITIONS 115 | ** 116 | ** Name: BC-1 Type: Displacement/Rotation 117 | *Boundary, amplitude=Amp-1 118 | Part-1-1.Control, 1, 1, .5 119 | ** 120 | ** OUTPUT REQUESTS 121 | *Restart, write, number interval=1, time marks=NO 122 | ** 123 | ** FIELD OUTPUT: F-Output-1 124 | *Output, field, variable=ALL 125 | ** 126 | ** HISTORY OUTPUT: H-Output-1 127 | *Output, history, variable=ALL 128 | *End Step 129 | ** ---------------------------------------------------------------- 130 | ** 131 | ** STEP: Step-2 132 | ** 133 | *Step, name=Step-hold, nlgeom=YES 134 | *Dynamic, Explicit 135 | , 1. 136 | *Bulk Viscosity 137 | 0.06, 1.2 138 | ** 139 | ** OUTPUT REQUESTS 140 | *Restart, write, number interval=1, time marks=NO 141 | ** 142 | ** FIELD OUTPUT: F-Output-1 143 | *Output, field, variable=ALL 144 | ** 145 | ** HISTORY OUTPUT: H-Output-1 146 | *Output, history, variable=ALL 147 | *End Step -------------------------------------------------------------------------------- /vumat_nh.for: -------------------------------------------------------------------------------- 1 | SUBROUTINE vumat( 2 | C Read only (unmodifiable)variables - 3 | 1 nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal, 4 | 2 stepTime, totalTime, dt, cmname, coordMp, charLength, 5 | 3 props, density, strainInc, relSpinInc, 6 | 4 tempOld, stretchOld, defgradOld, fieldOld, 7 | 5 stressOld, stateOld, enerInternOld, enerInelasOld, 8 | 6 tempNew, stretchNew, defgradNew, fieldNew, 9 | C Write only (modifiable) variables - 10 | 7 stressNew, stateNew, enerInternNew, enerInelasNew ) 11 | C 12 | INCLUDE 'vaba_param.inc' 13 | C 14 | c DEFAULT 15 | DIMENSION props(nprops), density(nblock), coordMp(nblock,*), 16 | 1 charLength(nblock), strainInc(nblock,ndir+nshr), 17 | 2 relSpinInc(nblock,nshr), tempOld(nblock), 18 | 3 stretchOld(nblock,ndir+nshr), 19 | 4 defgradOld(nblock,ndir+nshr+nshr), 20 | 5 fieldOld(nblock,nfieldv), stressOld(nblock,ndir+nshr), 21 | 6 stateOld(nblock,nstatev), enerInternOld(nblock), 22 | 7 enerInelasOld(nblock), tempNew(nblock), 23 | 8 stretchNew(nblock,ndir+nshr), 24 | 8 defgradNew(nblock,ndir+nshr+nshr), 25 | 9 fieldNew(nblock,nfieldv), 26 | 1 stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev), 27 | 2 enerInternNew(nblock), enerInelasNew(nblock) 28 | 29 | c ADDITIONAL 30 | DIMENSION dgrad9(ndir+nshr+nshr),dgrad(ndir,ndir),bmat(ndir,ndir), 31 | 1 b2mat(ndir,ndir),xkirch(ndir,ndir),xkirchV(ndir+nshr) 32 | C 33 | CHARACTER*80 cmname 34 | C 35 | C Neo-hooke hyperelasticity for 3D elements 36 | C Props(1) = C10 37 | C Props(2) = D1 38 | C 39 | C The state variables are stored as: 40 | C STATE(*,1) = invariant I1 41 | C 42 | PARAMETER( zero = 0., one = 1., two = 2., three = 3., 43 | 1 four=4., five=5., six=6.) 44 | C 45 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 46 | 47 | c10 = props(1) 48 | d1 = props(2) 49 | 50 | C START NBLOCK LOOP 51 | DO km = 1, nblock 52 | 53 | C CONVERT DEFORMATION GRADIENT TO 3x3 MATRIX 54 | DO i = 1,ndir+2*nshr 55 | dgrad9(i) = defgradNew(km,i) 56 | END DO 57 | CALL k9vector2matrix(dgrad9, dgrad, nshr) 58 | 59 | C CALCULATE DETERMINANT OF DEFORMATION GRADIENT 60 | 61 | xJ = dgrad(1,1) * dgrad(2,2) * dgrad(3,3) - 62 | 1 dgrad(1,2) * dgrad(2,1) * dgrad(3,3) 63 | xJ = xJ + dgrad(1,2) * dgrad(2,3) * dgrad(3,1) + 64 | 1 dgrad(1,3) * dgrad(3,2) * dgrad(2,1) - 65 | 2 dgrad(1,3) * dgrad(3,1) * dgrad(2,2) - 66 | 3 dgrad(2,3) * dgrad(3,2) * dgrad(1,1) 67 | 68 | C ZERO MATRICES 69 | DO I=1,3 70 | DO J=1,3 71 | bmat(I,J) = zero 72 | END DO 73 | END DO 74 | 75 | C CALCULATE LEFT CAUCHY-GREEN DEFORMATION TENSOR 76 | DO I=1,3 77 | DO J=1,3 78 | DO K = 1,3 79 | bmat(I,J) = bmat(I,J) + dgrad(I,K)*dgrad(J,K) 80 | END DO 81 | END DO 82 | END DO 83 | 84 | C----------------------------------------------------------------------- 85 | C CALCULCATE THE INVARIANTS 86 | C----------------------------------------------------------------------- 87 | C 88 | xI1 = bmat(1,1)+bmat(2,2)+bmat(3,3) 89 | C 90 | C kmtms (M, N, L, A, KA, B, KB, C, KC) 91 | CALL kmtms(3, 3, 3, bmat, 3, bmat, 3, b2mat, 3) 92 | C 93 | trb2 = b2mat(1,1)+b2mat(2,2)+b2mat(3,3) 94 | C 95 | xI2 = ((xI1**two) - trb2)/two 96 | C 97 | xI3=xJ**two 98 | 99 | C-------------------------------------------------------------------- 100 | C CALCULATE KIRCH STRESS 101 | C-------------------------------------------------------------------- 102 | C 103 | C PART 1 104 | coeff1 = two*c10/(xJ**(two/three)) 105 | 106 | C KIRCHHOFF STRESS PART 2 107 | trbmat= coeff1*(bmat(1,1)+bmat(2,2)+bmat(3,3))/three 108 | 109 | C KIRCHHOFF STRESS PART 1 110 | DO I=1,3 111 | DO J=1,3 112 | xkirch(I,J) = bmat(I,J) * coeff1 113 | END DO 114 | END DO 115 | 116 | C SUBTRACT THE PART 2 117 | DO I = 1,3 118 | xkirch(I,I) = xkirch(I,I) - trbmat 119 | END DO 120 | 121 | C FORM PART 3 122 | coeff3 = two*(xJ-one)*xJ/d1 123 | 124 | C ADD TO THE PREVIOUS PARTS 125 | DO I = 1,3 126 | xkirch(I,I) = xkirch(I,I) + coeff3 127 | END DO 128 | 129 | C EXPLICIT REQUIRES STRESS AS (11,22,33,12,23,31) 130 | CALL kmatrix2vector_explicit(xkirch, xkirchV, nshr) 131 | 132 | C CONVERT TO CAUCHY STRESS 133 | DO I = 1,ndir+nshr 134 | stressNew(km,I) = (one/xJ)*xkirchV(I) 135 | END DO 136 | 137 | stateNew(km,1) = xI1 138 | 139 | xener=c10*(xI1-three)+(one/d1)*((xJ-one)**two) 140 | enerInternNew(km) = xener/density(km) 141 | 142 | C END NBLOCK LOOP 143 | END DO 144 | 145 | 146 | RETURN 147 | CONTAINS 148 | 149 | 150 | 151 | 152 | C------------------------------------------------------------------ 153 | C SUBROUTINES 154 | C------------------------------------------------------------------ 155 | C 156 | C * kmatrix2vector_explicit - Convert a 3x3 matrix to a 6x1 vector 157 | C 158 | C * k9vector2matrix - Convert a 9x1 vector to a 3x3 matrix 159 | C 160 | C * kmtms - Multiply two 2nd order tensors 161 | c----------------------------------------------------------------------------------------------- 162 | 163 | SUBROUTINE kmatrix2vector_explicit(xmat, vec, nshr) 164 | 165 | INCLUDE 'vaba_param.inc' 166 | 167 | INTENT(IN) :: xmat, nshr 168 | INTENT(OUT):: vec 169 | 170 | C Explicit requires stress as (11,22,33,12,23,31) 171 | 172 | DIMENSION xmat(3,3), vec(6) 173 | 174 | DO i=1,3 175 | vec(i) = xmat(i,i) 176 | END DO 177 | 178 | vec(4) = xmat(1,2) 179 | 180 | IF (nshr==3) THEN 181 | vec(5) = xmat(2,3) 182 | vec(6) = xmat(3,1) 183 | END IF 184 | 185 | END SUBROUTINE kmatrix2vector_explicit 186 | 187 | c----------------------------------------------------------------------------------------------- 188 | c----------------------------------------------------------------------------------------------- 189 | 190 | SUBROUTINE k9vector2matrix(vec, xmat, nshr) 191 | 192 | INCLUDE 'vaba_param.inc' 193 | 194 | INTENT(IN) :: vec, nshr 195 | INTENT(OUT):: xmat 196 | 197 | DIMENSION xmat(3,3), vec(9) 198 | 199 | DO i=1,3 200 | xmat(i,i) = vec(i) 201 | END DO 202 | 203 | xmat(1,2) = vec(4) 204 | 205 | IF (nshr==1) THEN 206 | xmat(2,1) = vec(5) 207 | ELSE 208 | xmat(2,3) = vec(5) 209 | xmat(3,1) = vec(6) 210 | xmat(2,1) = vec(7) 211 | xmat(3,2) = vec(8) 212 | xmat(1,3) = vec(9) 213 | END IF 214 | 215 | END SUBROUTINE k9vector2matrix 216 | 217 | c----------------------------------------------------------------------------------------------- 218 | c----------------------------------------------------------------------------------------------- 219 | 220 | SUBROUTINE kmtms (M, N, L, A, KA, B, KB, C, KC) 221 | 222 | INCLUDE 'vaba_param.inc' 223 | C 224 | INTENT(IN) :: M, N, L, A, KA, B, KB, KC 225 | INTENT(OUT):: C 226 | C 227 | C PRODUCT OF REAL MATRICES 228 | C 229 | DIMENSION A(KA,N), B(KB,L), C(KC,L) 230 | DOUBLE PRECISION W 231 | C 232 | C 233 | DO 30 J = 1,L 234 | DO 20 I = 1,M 235 | W = 0.D0 236 | DO 10 K = 1,N 237 | W = W + A(I,K) * B(K,J) 238 | 10 CONTINUE 239 | C(I,J) = W 240 | 20 CONTINUE 241 | 30 CONTINUE 242 | 243 | RETURN 244 | 245 | END SUBROUTINE kmtms 246 | 247 | c----------------------------------------------------------------------------------------------- 248 | 249 | 250 | END --------------------------------------------------------------------------------