我有这个功能,如下所示。它传递两个向量,每个向量具有三个值,并且应该传递出一个具有三个值的向量。我把这个函数称为:
Fr = Flux(W(:,i),W(:,i+1))
我通过搞乱代码,尝试纯函数和模块以及研究错误陈述(我将在底部包含)来实现的是,fortran正在阅读我的函数Flux,并认为输入向量是尝试从数组中调用条目。对于发生的事情,这是我最好的猜测。我问实验室周围,大多数人建议使用子程序,但这看起来很笨重,我认为应该有更优雅的方式,但我还没有找到它。我试着通过说:
来定义结果 DOUBLE PRECISION FUNCTION Flux(W1,W2) Result(FluxArray(3))
然后返回fluxarray但这不起作用,因为fortran无法理解语法
实际功能如下:
DOUBLE PRECISION FUNCTION Flux(W1,W2)
USE parameters
IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(3), INTENT(IN)::W1, W2
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT):: Flux
DOUBLE PRECISION, DIMENSION(3):: F1, F2
DOUBLE PRECISION::U1,U2,Rh1,Rh2,P1,P2,E1,E2,Rh,P,u,c,Lambda
INTEGER:: k
U1=W1(2)/W1(1)
U2=W2(2)/W2(1)
Rh1=W1(1)
Rh2=W2(1)
P1=(gamma_constant-1.d0)*(W1(3)-.5d0*Rh1*U1**2)
P2=(gamma_constant-1.d0)*(W2(3)-.5d0*Rh2*U2**2)
E1=W1(3)
E2=W2(3)
F1=[Rh1*U1,Rh1*U1**2+P1,(E1+P1)*U1]
F2=[Rh2*U2,Rh2*U2**2+P2,(E2+P2)*U2]
Rh=.5d0*(Rh1+Rh2)
P=.5d0*(P1+P2)
u=.5d0*(U1+U2)
c=sqrt(gamma_constant*P/Rh)
Lambda=max(u, u+c, u-c)
do k=1,3,1
Flux(k)=.5d0*(F1(k)+F2(k))-.5d0*eps*Lambda*(W2(k)-W1(k))
end do
RETURN
END FUNCTION Flux
以下是错误陈述:
Quasi1DEuler.f90:191.51:
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT):: Flux
1
Error: Symbol 'flux' at (1) already has basic type of REAL
Quasi1DEuler.f90:217.58:
Flux(k)=.5d0*(F1(k)+F2(k))-.5d0*eps*Lambda*(W2(k)-W1(k))
1
Error: Unexpected STATEMENT FUNCTION statement at (1)
Quasi1DEuler.f90:76.18:
Fr = Flux(W(:,i),W(:,i+1))
Fr和Fl都发生了最后一个错误。感谢您的时间和任何帮助或考虑!
EDIT /后续:: 感谢您的帮助,我不知道更好的方式来展示这个,所以我要编辑最初的问题。
我按照你的建议做了,它解决了这个问题,现在说:
Fr = Flux(W(:,i),W(:,i+1))
1
Error: The reference to function 'flux' at (1) either needs an explicit INTERFACE or the rank is incorrect
我在这个链接上看到了类似的问题:
Computing the cross product of two vectors in Fortran 90
他们建议他将所有功能都放入模块中。有没有更好/更简单的方法来解决这个错误?
答案 0 :(得分:5)
使用RESULT(FluxArray)
,fluxArray
是结果变量的名称。因此,您在结果子句中声明特征的尝试是错误的。
相反,应在函数体中指定结果变量:
function Flux(W1,W2) result(fluxArray)
double precision, dimension(3), intent(in)::W1, W2
double precision, dimension(3) :: fluxArray ! Note, no intent for result.
end function Flux
是的,可以在function
语句中声明结果变量的类型,但不能在那里声明数组。我不建议在函数体中为结果变量添加一个明确的dimension
语句。
请注意,在引用返回数组的函数时,要求调用者可以使用显式接口。一种方法是将函数放在use
d的模块中。有关更多详细信息,请参阅SO上的其他内容或语言教程。
在没有result
的情况下从您的问题中收到错误。
DOUBLE PRECISION FUNCTION Flux(W1,W2)
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT):: Flux
此处Flux
的类型已声明两次。此外,它不是函数的伪参数,因此如上所述它不需要intent
属性。
可以写
FUNCTION Flux(W1,W2)
DOUBLE PRECISION, DIMENSION(3) :: Flux ! Deleting intent
或(颤抖)
DOUBLE PRECISION FUNCTION Flux(W1,W2)
DIMENSION :: Flux(3)
关于声明功能的投诉在这里是不重要的,继承了不好的声明。