Fortran 函数乘法过程

Fortran 函数乘法过程,fortran,Fortran,我试图写一个程序,它接受一个预定义的函数程序,并在某个域上执行高斯正交积分。我不仅要集成单个函数(比如f(x)),还要集成2和3个函数的乘积(f(x)*g(x)) 我已经成功地编写了执行高斯积分的程序,并用预定义的函数程序对其进行了测试。但是,当我将两个过程的乘积作为输入传递时,它不起作用。当我通过int=integral(S*phi,E_min,E_max,1)(参见下面的积分过程)时,我得到的错误是函数的“S”需要一个参数列表 为了解决这个问题,我试图编写一个程序,它包含3个函数程序并输出它

我试图写一个程序,它接受一个预定义的函数程序,并在某个域上执行高斯正交积分。我不仅要集成单个函数(比如f(x)),还要集成2和3个函数的乘积(f(x)*g(x))

我已经成功地编写了执行高斯积分的程序,并用预定义的函数程序对其进行了测试。但是,当我将两个过程的乘积作为输入传递时,它不起作用。当我通过
int=integral(S*phi,E_min,E_max,1)
(参见下面的积分过程)时,我得到的错误是
函数的“S”需要一个参数列表

为了解决这个问题,我试图编写一个程序,它包含3个函数程序并输出它们的乘积。我这样做的方式如下

real(dp) function prod(func1,func2,func3)

    interface
       function func1(E,on)
         use f90_kind
         real(dp),intent(in)::E
         logical,intent(in)::on
         real(dp)::func1
       end function func1

       function func2(E,on)
         use f90_kind
         real(dp),intent(in)::E
         logical,intent(in)::on
         real(dp)::func2
       end function func2

       function func3(E,on)
         use f90_kind
         real(dp),intent(in)::E
         logical,intent(in)::on
         real(dp)::func3
       end function func3
    end interface

    prod = func1(E,on) * func2(E,on) * func3(E,on)

    end function prod
导致参数“e”在(1)中的类型不匹配;将实数(4)传递到实数(8)。这就是我被卡住的地方。我如何使我的集成过程函数接受两个或更多预定义函数过程的任何产品作为输入

下面是高斯积分函数程序

  real(dp) function integral(func,a,b,int_pts)

    interface
       function func(E,on)
         use f90_kind
         real(dp), intent(in) :: E
         logical,intent(in)   :: on
         real(dp)             :: func 
       end function func
    end interface

    real(dp),intent(in) :: a,b
    integer, intent(in) :: int_pts
    integer  :: idx1, idx2
    real(dp) :: dx,F1,F2,S,I,up_lim,low_lim
    logical  :: on

    real(dp),allocatable,dimension(:) :: point,weight
    integer, parameter :: nqp = 7
    allocate(point(nqp))
    allocate(weight(nqp))
    call legendre_set(point,weight)

    dx = (b-a)/int_pts
    I = 0.0_dp
    on = .false.

    do idx1 = 1,int_pts

       low_lim = a + (idx1-1)*dx
       up_lim  = a + idx1*dx
       F1 = (up_lim - low_lim)/2.0_dp
       F2 = (up_lim + low_lim)/2.0_dp
       S = 0.0_dp
       do idx2 = 1,nqp
          S = S + weight(idx2) * func(F1*point(idx2)+F2,on)
          !print *,"idx2 is",idx2,"func is",func(F1*point(idx2)+F2,on)
       enddo
       I = I + S * F1
       !print *,"Sum is",S
    enddo

    integral = I 

  end function integral
当我用
积分(S,E_min,E_max,1)
调用它时,它工作得很好,其中S是一个预定义的函数

谢谢

“当我通过
int=integral(S*phi,E_min,E_max,1)
(参见下面的积分过程)时,我得到的错误是
函数的'需要一个参数列表

不能将函数相乘,只能将函数结果相乘。此外,Fortran中没有lambda表达式。您必须构造要集成的实际函数,并将其传递给集成过程

您可以(但不必)将其作为内部功能来执行

int = integral(new_function,E_min,E_max,1)

contains

  function new_function(E,on)
         real(dp), intent(in) :: E
         logical,intent(in)   :: on
         real(dp)             :: new_function
     new_function = S(E, on) *phi

end ...
请参阅相关的

“当我传递
int=integral(S*phi,E_min,E_max,1)
(有关积分过程,请参见下文)时,我得到的错误是
函数的'S'需要参数列表

不能将函数相乘,只能将函数结果相乘。此外,Fortran中没有lambda表达式。您必须构造要集成的实际函数,并将其传递给集成过程

您可以(但不必)将其作为内部功能来执行

int = integral(new_function,E_min,E_max,1)

contains

  function new_function(E,on)
         real(dp), intent(in) :: E
         logical,intent(in)   :: on
         real(dp)             :: new_function
     new_function = S(E, on) *phi

end ...

请参阅相关的内部函数
prod
您不声明变量
e
的类型。它要么隐式类型化
real(4)
,要么通过其他方式显式类型化(如主机关联)。函数
func1
func2
func(3)
希望参数的类型为
real(8)
。在函数
prod
中,您不声明变量
e
的类型。它要么隐式类型化
real(4)
,要么通过其他方式显式类型化(如主机关联)。函数
func1
func2
func(3)
希望参数的类型为
real(8)
。代码中的错误消息看起来是隐式的键入错误。@francescalus是的,我并没有真正尝试解决这个问题,我认为处理第一个错误和第一次尝试更有用。或者至少它更简单,结果也更容易维护。代码中的错误消息看起来是一个隐式键入错误。@francescalus是的,我并没有真正尝试解决这个问题,我认为处理第一个错误和第一次尝试更有用。或者至少它更直接,结果更容易维护。