Is it possible to differentiate an equation with respect to a variable in VUHARD subroutine?

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Is it possible to differentiate an equation with respect to a variable in VUHARD subroutine?

rohan6989
I am using fortran to write a VUHARD subroutine to implement an constitutive equation (Johnson-Cook model) given by (A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log) in ABAQUS. I am getting the value of yield for each iteration by putting in the values of strain, T_star and edot_log from previous iteration. However, my code also involves three differentiation
 1). yield(km) with respect to strain
 2). yield(km) with respect to strainrate
 3). yield(km) with respect to T
 Currently, I am finding out the derivative by hand and then writing down the equations:
         dyieldDeqps(km,1) = (B*xn*(strain**(xn-one)))*

1               (one - T_star**xm) * (one + C*edot_log)

        dyieldDeqps(km,2) = (A + B*(strain**xn))*

1               (one - T_star**xm) * (C/strainrate)

        dyieldDtemp(km) = (-xm)*(one/(T - T_trans))*

1               (T_star**(xm))*(A + B*(strain**xn))

2               *(one + C*edot_log)
 This works fine, but, is there a way where I can find the derivatives directly from the yield equation?(A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log)

 Any help or suggestion would be most helpful. I don't know how to do this?
 The reason I would like to do this is because I have another long constitutive equation that I want implement as a VUHARD. However, the derivatives of the yield equation becomes very long to write in the form given in the example. Is there a way to automatically do the procedure?
 The relevant parts of the FORTRAN subroutine:
 
     T_star = (T - T_trans)/(T_melt - T_trans)
    strainrate = eqpsRate(km)/epsdot0
    edot_log = LOG( strainrate )


    yield(km) = (A + B*(strain**xn))*(one - T_star**xm)

1               * (one + C*edot_log)



    IF( strain .le. zero) THEN
        dyieldDeqps(km,1) = zero

    ELSE

        dyieldDeqps(km,1) = (B*xn*(strain**(xn-one)))*

1               (one - T_star**xm) * (one + C*edot_log)

    ENDIF

    IF(strainrate .ge. epsdot0) then

        dyieldDeqps(km,2) = (A + B*(strain**xn))*

1               (one - T_star**xm) * (C/strainrate)

    ELSE

        dyieldDeqps(km,2) = one

    ENDIF

    IF (T .gt. T_trans) THEN

        dyieldDtemp(km) = (-xm)*(one/(T - T_trans))*