Как дифференцировать определяющее уравнение относительно переменной в Фортране? - PullRequest
0 голосов
/ 03 декабря 2018

Я использую фортран для написания подпрограммы для реализации определяющего уравнения, заданного (A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log) в ABAQUS.Я получаю значение yield для каждой итерации, добавляя значения штаммов, T_star и edot_log из предыдущей итерации.Тем не менее, мой код также включает в себя три дифференциации

1). выход (км) относительно штамм

2). выход (км) относительно фильтрата

3). выход (км) относительно T

В настоящее время я нахожу производную вручную, а затем записываю уравнения:

        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)

Это прекрасно работает, но есть ли способ найти производные непосредственно из уравнения доходности (A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log).

Любая помощь или предложение будет наиболее полезным.Я не знаю, как это сделать?

Соответствующие части подпрограммы Фортран:

    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))*

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

2               *(one + C*edot_log)
...