相关疑难解决方法(0)

函数在fortran中,传入数组,接收数组

我有这个功能,如下所示.它传递两个向量,每个向量具有三个值,并且应该传递出一个具有三个值的向量.我把这个函数称为:

Fr       = Flux(W(:,i),W(:,i+1))
Run Code Online (Sandbox Code Playgroud)

我通过搞乱代码,尝试纯函数和模块,以及研究错误陈述(我将包括在底部)来实现的是,fortran正在读取我的函数Flux,并认为输入向量是一个尝试从数组中调用一个条目.对于发生的事情,这是我最好的猜测.我问实验室周围,大多数人建议使用子程序,但这看起来很笨重,我认为应该有更优雅的方式,但我还没有找到它.我试着通过说:

 DOUBLE PRECISION FUNCTION Flux(W1,W2) Result(FluxArray(3))
Run Code Online (Sandbox Code Playgroud)

然后返回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
Run Code Online (Sandbox Code Playgroud)

这是错误声明:

Quasi1DEuler.f90:191.51:

DOUBLE PRECISION, DIMENSION(3), INTENT(OUT):: Flux
                                               1
Error: Symbol 'flux' at (1) already has …
Run Code Online (Sandbox Code Playgroud)

fortran fortran90

5
推荐指数
1
解决办法
1215
查看次数

Fortran-C 互操作性和浮点数组

我有一个很大的现有 Fortran95 代码。它用

real(dp), dimension(num) :: array
Run Code Online (Sandbox Code Playgroud)

声明数组。

我想加入一些 C 代码,发现我可以通过编写 C 函数的接口并将数组声明为

use iso_c_binding
real(c_double), allocatable, target :: array(:)
Run Code Online (Sandbox Code Playgroud)

我有调用 C 函数的工作 fortran 函数

call myfunction(c_loc(array));
Run Code Online (Sandbox Code Playgroud)

real(dp)数组传递给 myfunction需要什么?显然,我需要从中制作一个 C 指针(如何?)。除了复制数组还有其他方法吗?是否可以确保两种类型确实引用兼容的双精度数据块?最重要的是,该解决方案必须适用于 GNU 编译器。请注意,在现有 Fortran 代码中替换real(dp)real(c_double)任何地方现在对我来说不是一个选择。

如果没有复制整个数组的替代方法,我将如何在界面中正确执行此操作?

c fortran fortran-iso-c-binding

3
推荐指数
1
解决办法
502
查看次数

ISO_C_BINDING从Fortran调用C例程(带有双精度和数组)

几个星期前我发布了一个类似的问题(iso_c_binding调用带有数组的Fortran指针的C例程),我找到了解决问题的方法.现在我修改了一些东西,我又遇到了一些问题.在下面是我的问题的简化版本.

我在fortran有一个主程序:

program main_dummy
! compile: gcc -c dummy_trace.c 
! f95 raytracing.f90 main_dummy.f90 dummy_trace.o -o main
use, intrinsic :: ISO_C_BINDING
use raytracing

implicit none

!real(kind=8) :: x_in(4), x_fin(4)
real(C_DOUBLE), dimension(0:3) :: x_in, x_fin
real(C_DOUBLE) :: spin
integer :: rt_ok

x_in = (/1,2,3,4/)
x_fin = (/0,0,0,0/)
spin = 0.7

write(*,*)'x_in, x_fin before = ', x_in, x_fin
rt_ok = photon_trace(spin,x_in,x_fin)
write(*,*)'return rt = ', rt_ok
write(*,*)'x_in, x_fin after = ', x_in, x_fin


end program main_dummy
Run Code Online (Sandbox Code Playgroud)

哪个使用包含C例程接口的子例程:

module raytracing
  Interface
  integer …
Run Code Online (Sandbox Code Playgroud)

fortran fortran-iso-c-binding

1
推荐指数
1
解决办法
318
查看次数

标签 统计

fortran ×3

fortran-iso-c-binding ×2

c ×1

fortran90 ×1