问题描述
在FORTRAN UMAT子例程中,我正在使用
SRT 子例程
CALL STRT (STATEV(N),STATEV(N),2 STATEV(N),NIP(N),FIP(N),DSP(N),3 POP(65),de_log,T_st)
在UMAT主子例程中,我正在计算 de_log 和 T_st 的值。但是,在尝试将新计算的变量包含到子例程 STRT 和函数 F 中时,我遇到了错误 DX 。这些函数不采用在主子例程中计算的de_log和T_st的值。 我不知道为什么函数无法看到de_log和T_st的值。
SUbroUTINE STRT (GMA,TLP,GIP,NIP,FIP,2 DSP,POP,T_st)
C
IMPLICIT REAL*8 (A-H,O-Z)
EXTERNAL F,DFDX
DIMENSION GMA(N),TLP(N),GIP(N),2 FIP(N),POP(8)
DO I=1,N
X=TLP(I)/GIP(I)
FIP(I)=F(X,POP)
DSP(I)=DX(X,POP)
END DO
RETURN
END
REAL*8 FUNCTION F(X,POP)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION POP(8)
TERM1= (POP(3)*de_log)
TERM2= (T_st**POP(4))
F=POP(2)*(ABS(X))**POP(1)*DSIGN(1.D0,X)
F= F*TERM1*TERM2
RETURN
END
REAL*8 FUNCTION DX(X,POP)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION POP(8)
TERM1= (POP(3)*de_log)
TERM2= (T_st**POP(4))
DX=POP(1)*POP(2)*(ABS(X))**(POP(1)-1.)
DX= DFDX*TERM1*TERM2
RETURN
END
解决方法
一个过程无法“看到”另一个过程内部的变量。将这些参数传递给strt
子例程后,这些参数将无法在f
和dx
函数中使用。您还必须将它们作为这些函数的参数传递。您的代码将变为:
SUBROUTINE STRT (GMA,TLP,GIP,NIP,FIP,2 DSP,POP,de_log,T_st)
C
IMPLICIT REAL*8 (A-H,O-Z)
EXTERNAL F,DFDX
DIMENSION GMA(N),TLP(N),GIP(N),2 FIP(N),DSP(N),POP(8)
DO I=1,N
X=TLP(I)/GIP(I)
FIP(I)=F(X,T_st)
DSP(I)=DX(X,T_st)
END DO
RETURN
END
REAL*8 FUNCTION F(X,T_st)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION POP(8)
TERM1= (POP(3)*de_log)
TERM2= (T_st**POP(4))
F=POP(2)*(ABS(X))**POP(1)*DSIGN(1.D0,X)
F= F*TERM1*TERM2
RETURN
END
REAL*8 FUNCTION DX(X,T_st)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION POP(8)
TERM1= (POP(3)*de_log)
TERM2= (T_st**POP(4))
DX=POP(1)*POP(2)*(ABS(X))**(POP(1)-1.)
DX= DFDX*TERM1*TERM2
RETURN
END