【发布时间】:2020-08-31 15:41:03
【问题描述】:
在 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, 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
【问题讨论】:
-
为什么你认为de_log的值应该出现在这些函数中?您没有将它作为参数或类似参数传递,因此它只是一个局部变量。请告诉我这不是新代码...
-
@IanBush 主要代码并不新鲜。我已经修改了原始代码以在主子程序中计算 de_log 和 T_st。我希望函数 F 和 DX 在方程中使用 de_log 和 T_st 的值。我尝试将值传递为 FIP(I)=F(X,POP, de_log, T_st) DSP(I)=DX(X,POP, de_log, T_st) 但无济于事。如何将这些作为参数传递?
-
就像您在 Fortran 中传递任何其他参数一样,通过调用函数时的实际参数(如您所拥有的)和函数本身中的虚拟参数(您没有)。很抱歉,但我不得不说这是非常基础的 Fortran - 如果您不了解这门课程或学习一本书,那将是非常值得的。
-
如果这是新代码,那真的很糟糕。忘记隐含的陈述。仅使用
implicit none。这非常很重要。并阅读一些关于 Fortran 95 甚至更现代的 Fortran 的教程。您的代码看起来像是 1960 年代或 1970 年代的代码。
标签: function fortran subroutine abaqus