【问题标题】:Why are the calculated variable not being accepted by the fortran subroutine and functions?为什么 fortran 子例程和函数不接受计算的变量?
【发布时间】: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_logT_st 的值。但是,在尝试将新计算的变量包含到子例程 STRT 和函数 FDX。这些函数不采用在主子程序中计算的 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


【解决方案1】:

一个过程不能“看到”另一个过程中的变量。将这些参数传递给 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多