{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Abaqus umat interface" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Author(s): Tero Frondelius" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Abstract:** making the initial version to call Abaqus umat" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "--2015-07-25 22:07:34-- http://www.eng.ox.ac.uk/NP/ICP/plasticity_imp/code_imp.f\n", "Resolving www.eng.ox.ac.uk (www.eng.ox.ac.uk)... 163.1.223.199\n", "Connecting to www.eng.ox.ac.uk (www.eng.ox.ac.uk)|163.1.223.199|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 7458 (7,3K) [text/plain]\n", "Saving to: ‘code_imp.f.1’\n", "\n", " 0K ....... 100% 282M=0s\n", "\n", "2015-07-25 22:07:34 (282 MB/s) - ‘code_imp.f.1’ saved [7458/7458]\n", "\n" ] } ], "source": [ "run(`wget http://www.eng.ox.ac.uk/NP/ICP/plasticity_imp/code_imp.f`)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "***********************************************************************************\n", "** UMAT, FOR ABAQUS/STANDARD INCORPORATING ELASTIC-PLASTIC LINEAR **\n", "** ISOTROPIC HARDENING. LARGE DEFORMATION FORMULATION FOR PLANE STRAIN **\n", "** AND AXI-SYMMETRIC ELEMENTS. IMPLICIT INTEGRATION WITH CONSISTENT JACOBIAN **\n", "***********************************************************************************\n", "***********************************************************************************\n", "**\n", "**\n", "**\n", "*USER SUBROUTINE\n", " SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,\n", " 1 RPL,DDSDDT,DRPLDE,DRPLDT,\n", " 2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,\n", " 3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,\n", " 4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC)\n", "C\n", " INCLUDE 'ABA_PARAM.INC'\n", "C\n", " CHARACTER*80 CMNAME\n", "C\n", "C\n", " DIMENSION STRESS(NTENS),STATEV(NSTATV),\n", " 1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),\n", " 2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),\n", " 3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3)\n", "C\n", "C\n", " PARAMETER (M=3,N=3,ID=3,ZERO=0.D0,ONE=1.D0,TWO=2.D0,THREE=3.D0,\n", " + SIX=6.D0, NINE=9.D0, TOLER=1.D-5)\n", "C\n" ] } ], "source": [ "run(`head -30 code_imp.f`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## some implicit type castings" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = open(\"ABA_PARAM.INC\",\"w\")\n", "write(f,\" implicit real*8(a-h,o-z)\\n\")\n", "write(f,\" parameter (nprecd=2)\\n\")\n", "close(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's compile the shared library" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "run(`gfortran -shared -fPIC -o libumat.so code_imp.f`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some Abaqus umat interface definitions\n", "\n", "|variable | explanation |\n", "|--------------------|------------------------------------------|\n", "|DDSDDE(NTENS,NTENS) | Jacobian matrix of the constitutive model|\n", "|STRESS(NTENS) | the stress tensor (in vector format) |\n", "|STATEV(NSTATV) | An array containing the solution-dependent state variables. |\n", "|SSE | Specific elastic strain energy |\n", "|SPD | plastic dissipation |\n", "|SCD | “creep” dissipation |\n", "|RPL | Volumetric heat generation per unit time |\n", "|DDSDDT(NTENS) | Variation of the stress increments with respect to the temperature. |\n", "|DRPLDE(NTENS) | Variation of RPL with respect to the strain increments.|\n", "|DRPLDT | Variation of RPL with respect to the temperature. |\n", "|RPL | RPL is used to indicate whether or not a cohesive element is open to the tangential flow of pore fluid.|\n", "|PNEWDT | Ratio of suggested new time increment to the time increment being used |\n", "|STRAN(NTENS) | An array containing the total strains at the beginning of the increment. |\n", "|DSTRAN(NTENS) | Array of strain increments. |\n", "|TIME(1) | Value of step time at the beginning of the current increment. |\n", "|TIME(2) | Value of total time at the beginning of the current increment. |\n", "|DTIME | Time increment.|\n", "|TEMP | Temperature at the start of the increment. |\n", "|DTEMP | Increment of temperature. |\n", "|PREDEF | Array of interpolated values of predefined field variables at this point at the start of the increment, based on the values read in at the nodes.|\n", "|DPRED | Array of increments of predefined field variables. |\n", "|CMNAME | User-defined material name, left justified. |\n", "|NDI | Number of direct stress components at this point. |\n", "|NSHR | Number of engineering shear stress components at this point. |\n", "|NTENS | Size of the stress or strain component array (NDI + NSHR). |\n", "|NSTATV | Number of solution-dependent state variables that are associated with this material type |\n", "|PROPS(NPROPS) | User-specified array of material constants associated with this user material. |\n", "|NPROPS | User-defined number of material constants associated with this user material. |\n", "|COORDS | An array containing the coordinates of this point. |\n", "|DROT(3,3) | Rotation increment matrix. |\n", "|CELENT | Characteristic element length |\n", "|DFGRD0(3,3) | Array containing the deformation gradient at the beginning of the increment. |\n", "|DFGRD1(3,3) | Array containing the deformation gradient at the end of the increment. |\n", "|NOEL | Element number. |\n", "|NPT | Integration point number. |\n", "|LAYER | Layer number (for composite shells and layered solids). |\n", "|KSPT | Section point number within the current layer. |\n", "|KSTEP | Step number. |\n", "|KINC | Increment number. |" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0-element Array{Any,1}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "STRESS = [0. 0. 0. 0.]\n", "p = 0. # EFFECTIVE PLASTIC STRAIN\n", "r = 0. # ISOTROPIC HARDENING VARIABLE\n", "STATEV = [p r]\n", "NTENS = 4 \n", "DDSDDE = zeros(NTENS,NTENS)\n", "SSE = {} # Not used in this example\n", "SPD = {} # Not used in this example\n", "SCD = {} # Not used in this example\n", "RPL = {} # Not used in this example\n", "DDSDDT = {} # Not used in this example\n", "DRPLDE = {} # Not used in this example\n", "DRPLDT = {} # Not used in this example\n", "STRAN = [0. 0. 0. 0.]\n", "DSTRAN = [0. 0. 0. 0.]\n", "TIME = [0. 0.1] # CHECK TIME(2)\n", "DTIME = {} # Not used in this example\n", "TEMP = {} # Not used in this example\n", "DTEMP = {} # Not used in this example\n", "PREDEF = {} # Not used in this example\n", "DPRED = {} # Not used in this example\n", "CMNAME = {} # Not used in this example CHARACTER*80 CMNAME\n", "NDI = {} # Not used in this example\n", "NSHR = {} # Not used in this example\n", "#NTENS correct place\n", "NSTATV = length(STATEV)\n", "PROPS = {} # Not used in this example\n", "NPROPS = {} # Not used in this example\n", "COORDS = {} # Not used in this example\n", "DROT = {} # Not used in this example\n", "PNEWDT = {} # Not used in this example EXPLANATION MISSING\n", "CELENT = {} # Not used in this example\n", "DFGRD0 = {} # Not used in this example\n", "DFGRD1 = {} # Not used in this example\n", "NOEL = {} # Not used in this example\n", "NPT = {} # Not used in this example\n", "LAYER = {} # Not used in this example\n", "KSPT = {} # Not used in this example\n", "KSTEP = {} # Not used in this example\n", "KINC = {} # Not used in this example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Finally the ccall of the umat" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ccall((:umat_, \"./libumat\"), Int64, \n", " (Ptr{Float64},Ptr{Float64},Ptr{Float64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Float64},Ptr{Float64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Int64},Ptr{Int64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void}),\n", " STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT,DRPLDE,DRPLDT,\n", " STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,NDI,NSHR,\n", " &NTENS,&NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT,DFGRD0,DFGRD1,\n", " NOEL,NPT,LAYER,KSPT,KSTEP,KINC)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Something happened" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4x4 Array{Float64,2}:\n", " 282692.0 121154.0 121154.0 0.0\n", " 121154.0 282692.0 121154.0 0.0\n", " 121154.0 121154.0 282692.0 0.0\n", " 0.0 0.0 0.0 80769.2" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DDSDDE" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1x2 Array{Float64,2}:\n", " 0.0 0.0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "STATEV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's wrap this to simplified Julia function for testing" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "isotropichardening! (generic function with 2 methods)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function isotropichardening!(stress,p,r,jacobian,strain,DSTRAN)\n", " local STRESS = stress\n", " local STATEV = [p r]\n", " local DDSDDE = jacobian\n", " local STRAN = strain\n", " o = ccall((:umat_, \"./libumat\"), Int64, \n", " (Ptr{Float64},Ptr{Float64},Ptr{Float64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Float64},Ptr{Float64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Void},Ptr{Int64},Ptr{Int64},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},\n", " Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void},Ptr{Void}),\n", " STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT,DRPLDE,DRPLDT,\n", " STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,NDI,\n", " NSHR,&NTENS,&NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT,DFGRD0,DFGRD1,\n", " NOEL,NPT,LAYER,KSPT,KSTEP,KINC)\n", " stress = STRESS\n", " p = STATEV[1]\n", " r = STATEV[2]\n", " jacobian = DDSDDE\n", " strain = STRAN + DSTRAN\n", " if o != 0 \n", " throw(\"UMAT failed. Return code is $o\")\n", " end\n", " return o\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Now somebody should know how to use this function (help needed)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0[0.0 0.0 0.0 0.0]0.00.0[0.0 0.0 0.0 0.0]\n", "0[28.269231713558856 12.11538570784259 12.11538570784259 0.0]0.00.0[0.0001 0.0 0.0 0.0]\n", "0[84.80769514067657 36.34615712352777 36.34615712352777 0.0]0.00.0[0.0002 0.0 0.0 0.0]\n", "0[169.61539028135314 72.69231424705553 72.69231424705553 0.0]0.00.0[0.00030000000000000003 0.0 0.0 0.0]\n", "0[282.69231713558855 121.15385707842589 121.15385707842589 0.0]0.00.0[0.0004 0.0 0.0 0.0]\n" ] }, { "ename": "LoadError", "evalue": "\"UMAT failed. Return code is 62421072\"\nwhile loading In[30], in expression starting on line 5", "output_type": "error", "traceback": [ "\"UMAT failed. Return code is 62421072\"\nwhile loading In[30], in expression starting on line 5", "", " in isotropichardening! at In[29]:21", " in anonymous at no file:7" ] } ], "source": [ "p = 0.0\n", "r = 0.0\n", "S = [0. 0. 0. 0.]\n", "strain = [0. 0. 0. 0.]\n", "for i in range(0,0.0001,11)\n", " DSTRAN = [i 0. 0. 0.]\n", " out = isotropichardening!(S,p,r,DDSDDE,strain,DSTRAN)\n", " println(out,S,p,r, DSTRAN)\n", " #println(i)\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's find out how many different funtions & subroutines are called" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "fil = open(\"code_imp.f\")\n", "sub_list = Set{ASCIIString}()\n", "for line in readlines(fil)\n", " # Fortran comment = something non whitespce at the firts character\n", " if ismatch(r\"^[^\\s]\",line)\n", " #println(line)\n", " continue\n", " end\n", " if ismatch(r\"call\",lowercase(line))\n", " call = split(lowercase(line))[2] #divede by white space\n", " sub = split(call,\"(\")[1] #divide by \"(\"\n", " #println(sub)\n", " push!(sub_list,sub)\n", " end\n", "end\n", "close(fil)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Set{ASCIIString}({\"keffp\",\"kdevia\",\"kmlt1\"})" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sub_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Next let's find out how many functions and subroutines are defined" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "fil = open(\"code_imp.f\")\n", "fun_list = Set{ASCIIString}()\n", "for line in readlines(fil)\n", " if ismatch(r\"^[^\\s]\",line)\n", " #println(line)\n", " continue\n", " end\n", " comp = lowercase(line)\n", " if ismatch(r\"subroutine\",comp) || ismatch(r\"funtion\",comp) || ismatch(r\"external\",comp)\n", " #println(line)\n", " call = split(lowercase(line),\"(\")[1] #divede by white space\n", " sub = split(call)[end] #divide by \"(\"\n", " #if length(sub) > 1\n", " # sub = sub[2]\n", " #end\n", " #println(sub)\n", " push!(fun_list,sub)\n", " end\n", "end\n", "close(fil)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Set{ASCIIString}({\"keffp\",\"dyadicprod\",\"umat\",\"kdevia\",\"dotprod\",\"kmlt1\"})" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fun_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## And Finally are all called subroutines defined" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Set{ASCIIString}({})" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "setdiff(sub_list,fun_list)" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 0.3.8", "language": "julia", "name": "julia-0.3" }, "language_info": { "name": "julia", "version": "0.3.10" } }, "nbformat": 4, "nbformat_minor": 0 }