Function in fortran, passing array in, receiving array out

匿名 (未验证) 提交于 2019-12-03 01:58:03

问题:

I have this function, depicted below. It passes in two vectors with three values each, and should pass out one vector with three values as well. I call the function like this:

Fr       = Flux(W(:,i),W(:,i+1))

What I have realized through messing around with the code, trying pure functions, and modules, and researching the error statement (that I will include at the bottom), is that fortran is reading my function Flux, and thinks that the input vectors are an attempt to call an entry from the array. That is my best guess as to what is going on. I asked around the lab and most people suggested using subroutines, but that seemed clunky, and I figured there should probably be a more elegant way, but I have not yet found it. I tried to define a result by saying:

 DOUBLE PRECISION FUNCTION Flux(W1,W2) Result(FluxArray(3))

and then returning fluxarray but that does not work, as fortran cannot understand the syntax

The actual Function is this:

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

Here is the error statement:

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))

The last error occurs for both Fr and Fl. Thank

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!