为什么计算的变量不能被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_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子例程后,这些参数将无法在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,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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...