为什么fortran子程序和函数不接受计算的变量



在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_logT_st的值。但是,当我试图将新计算的变量包括到子程序STRT和函数F>DX中时,我遇到了错误。这些函数不采用在主子程序中计算的de_log和T_st的值我不明白为什么函数看不到de_log和t_st的值

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,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子例程并不能使它们在fdx函数中可用。您还必须将它们作为参数传递给这些函数。然后您的代码变为:

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,POP,de_log,T_st)
DSP(I)=DX(X,POP,de_log,T_st)
END DO
RETURN
END

REAL*8 FUNCTION F(X, POP,de_log,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, POP,de_log,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

最新更新