【问题标题】:How to create function inside a Fortran subroutine?如何在 Fortran 子例程中创建函数?
【发布时间】:2015-12-14 01:40:49
【问题描述】:

当我编译我的代码时,结果很奇怪(非常大,如 -1.112E+09)。当我用 Matlab 计算时,答案是 -0.0873。

program test
real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2
real :: Y

call J(X11,X22,X33,BE1A1,BE1B1,M)
Y = M
print *,Y

end program test

  subroutine J(X1,X2,X3,BE1A1,BE1B1,M)

    real, intent(in) :: X1,X2,X3,BE1A1,BE1B1
    real, intent(out) :: M

    M = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1)

    contains

    real function J1(X1,X2,X3,EPS1,EPS2)

    real, intent(in) :: X1,X2,X3,EPS1,EPS2
    real :: R
    R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2)
    J1 = log(R+X2-EPS2)

    end function J1

  end subroutine J

【问题讨论】:

  • 您应该注意隐式输入规则。特别是对于主程序中的m
  • 谢谢,我想我明白了重点。

标签: function fortran call subroutine


【解决方案1】:
program test

real, parameter :: X11=10,X22=5,X33=5,BE1A1=2,BE1B1=2
real :: Y

call J(X11,X22,X33,BE1A1,BE1B1,CM)
Y = CM
print *,Y

end program test

  subroutine J(X1,X2,X3,BE1A1,BE1B1,CM)

    real, intent(in) :: X1,X2,X3,BE1A1,BE1B1
    real, intent(out) :: CM

    CM = J1(X1,X2,X3,BE1A1,BE1B1)-J1(X1,X2,X3,BE1A1,-BE1B1)-J1(X1,X2,X3,-BE1A1,BE1B1)+J1(X1,X2,X3,-BE1A1,-BE1B1)

    contains

    real function J1(X1,X2,X3,EPS1,EPS2)

    real, intent(in) :: X1,X2,X3,EPS1,EPS2
    real :: R
    R = sqrt((X1-EPS1)**2+(X2-EPS2)**2+(X3)**2)
    J1 = log(R+X2-EPS2)

    end function J1

  end subroutine J

现在我可以用 Matlab 得到同样的结果了!

【讨论】:

  • @VladimirF 感谢您的建议。我很感激
  • 使用implicit none 仍然会更安全。并且请以某种方式清楚您更改了什么,在代码中很难找到它。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多