Tag: fortran

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

我有一个很大的现有Fortran95代码。 它用 real(dp), dimension(num) :: array 声明数组。 我想加入一些C代码,发现我可以通过将接口写入C函数并将数组声明为 use iso_c_binding real(c_double), allocatable, target :: array(:) 我有工作的fortran函数,它们将C函数称为 call myfunction(c_loc(array)); 将real(dp)数组传递给myfunction需要什么? 显然,我需要从它做一个C指针(如何?)。 除了复制数组之外还有其他方法吗? 是否可以确保两种类型确实引用兼容的双精度数据块? 最重要的是,该解决方案必须与GNU编译器一起使用。 注意,在现有的Fortran代码中用real(c_double)替换real(dp)并不是我现在的选择。 如果没有其他方法可以复制整个arrays,我将如何在界面中正确执行此操作?

从C ++拦截Fortran STOP

我为传统的Fortran库准备了一个C ++接口。 遗留库中的一些子例程遵循一个丑陋但可用的状态代码约定来报告错误,我使用这样的状态代码从我的C ++代码中抛出一个可读的exception:它工作得很好。 另一方面,有时遗留库会调用STOP (终止程序)。 即使条件可以恢复,它也经常这样做。 我想从C ++中捕获这个STOP ,到目前为止我一直没有成功。 以下代码很简单,但完全代表了手头的问题: Fortran遗留库fmodule.f90 : module fmodule use iso_c_binding contains subroutine fsub(x) bind(c, name=”fsub”) real(c_double) x if(x>=5) then stop ‘x >=5 : this kills the program’ else print*, x end if end subroutine fsub end module fmodule C ++接口main.cpp : #include // prototype for the external Fortran […]

R:使用带有.Call和C / C ++包装器的Fortran子例程代替.Fortran的优点?

我有一个R包,它使用大量的Fortran子程序来进行递归线性代数计算的嵌套循环(严重依赖于BLAS和LAPACK例程)。 作为Fortran的接口,我使用.Fortran函数。 我刚刚阅读了Jonathan Callahan关于在C / C ++编写的子程序中使用.Call而不是.C 的博客文章 ,它让我觉得在使用Fortran子程序时,通过写一个简单的方法也可以更好地使用.Call接口C中的包装器然后调用Fortran子例程? 如上所述,我的Fortran代码非常简单,因为我只使用double或integer类型的多维数组。 但是我已经知道我必须在R端编写相当多的检查以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等。 子程序写为F90 / 95。

将libc回溯转换为源行号

我有一个MPI应用程序,它结合了C和Fortran源。 偶尔它会因为与内存相关的bug而崩溃,但是我很难找到这个bug(它是在别人的代码中的某个地方,目前我并不是很熟悉)。 我还没有能够用gdb捕获它,但有时会输出glibc backtrace,如下所示。 该错误可能接近“(main_main_ + 0x3bca)[0x804d5ce]”,(但有内存错误,我知道情况可能并非如此)。 我的问题是,有没有人知道如何将+ 0x3bca或0x804d5ce转换为代码的特定行? 关于追踪这个错误的任何其他建议也将受到赞赏。 我对gdb的基础知识非常熟悉。 *** glibc detected *** /home/…/src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 *** ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42] /lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525] /home/…/src/finite_element(main_main_+0x3bca)[0x804d5ce] /home/…/src/finite_element[0x804e195] /home/…/src/finite_element(main+0x34)[0x804e1e8] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3] /home/davepc/finite-element/src/finite_element[0x8049971] ======= Memory map: ======== 08048000-08056000 r-xp 00000000 08:05 1346306 /home/…/src/finite_element 08056000-08057000 r–p 0000d000 08:05 1346306 /home/…/src/finite_element 08057000-08058000 rw-p 0000e000 08:05 1346306 /home/…/src/finite_element 09d1b000-09d8f000 rw-p […]

如何在C中访问(动态分配)Fortran数组

我的主要问题是为什么数组做了如此奇怪的事情以及是否有任何方式以“干净”的方式执行以下操作。 我目前有一个C程序foo.c通过dlopen/dlsym连接Fortran程序bar.f90 ,大致类似于下面的代码: foo.c的: #include #include int main() { int i, k = 4; double arr[k]; char * e; void * bar = dlopen(“Code/Test/bar.so”, RTLD_NOW | RTLD_LOCAL); void (*allocArray)(int*); *(void **)(&allocArray) = dlsym(bar, “__bar_MOD_allocarray”); void (*fillArray)(double*); *(void **)(&fillArray) = dlsym(bar, “__bar_MOD_fillarray”); void (*printArray)(void); *(void **)(&printArray) = dlsym(bar, “__bar_MOD_printarray”); double *a = (double*)dlsym(bar, “__bar_MOD_a”); for(i = […]

使用gdb进行gfortran调试:w_powf.c:没有这样的文件或目录

我有一个Fortran程序,我正在调试。 我有一个可变数据列表,其中一个预期变量几乎是其预期值的两倍。 所以我用调试标志编译了程序,并开始调试:程序名称是hfock $gdb hfock (gdb) break hfock (gdb) run Starting program: /home/e/Desktop/hfock hfock Breakpoint 1, hfock () at hfock.f:16 16 ZETA1 = 2.173171 (gdb) s 17 ZETA2 = 1.188530 (gdb) s 18 WRITE (*, ‘( “Zeta1:”, F7.4 / “Zeta2:”, F7.4 )’ ) ZETA1, ZETA2 (gdb) s Zeta1: 2.1732 Zeta2: 1.1885 21 PLUS=ZETA1+ZETA2 (gdb) s […]

对’d1mach_’的未定义引用

我正在尝试将一个fortran子例程与c ++链接起来,但是不能完全弄清楚这里到底出了什么问题:fortran子例程调用了一些函数,例如。 d1mach或xermsg,它们未在fortran子例程中定义,但在外部调用。 编译时,错误是“对d1mach _”(或xermsg)的未定义引用。 我试图链接一个我认为可能包含所述函数的库(在库中似乎有一个名为d1mach.o和xermsg.o的文件),但同样的错误仍然存​​在。 我可能做错了什么? extern”C” { void drc3jm_(double *L1,double *L2,double *L3,double *M1,double *M2MIN, double *M2MAX,double *THRCOF,int *NDIM,int *IER); } 这是我用来调用子例程的函数,并没有在iostream旁边使用任何新的头文件 *DECK DRC3JM SUBROUTINE DRC3JM (L1, L2, L3, M1, M2MIN, M2MAX, THRCOF, NDIM, + IER) CALL XERMSG(‘SLATEC’,’DRC3JM’,’L1-ABS(M1) less than zero or ‘// + ‘L1+ABS(M1) not integer.’,IER,1) 这是fortran子例程的声明,它调用未声明的函数xermsg。 我使用-L / path / lib指令链接库但无济于事。 子程序用于计算数学函数,是slatec代码的一部分。 […]

Fortran接口调用返回指针的C函数

我有一个C函数, double* foofunc() { /* Function Body */ } 我不知道如何在Fortran声明一个接口来调用这个C函数。 此外,如果指针应该指向GPU device memory ,我怎么能在Fortran界面中定义它? 我是否需要使用DEVICE属性。 请使用Fortran支持的function,直到2003年。 有什么建议?

从Fortran调用C函数,其中C函数名最初是从C传入的

由于不相关的原因,我需要将一个C / C ++函数名称传递给一个Fortran子程序,该子程序又调用该C函数。 我发现我可以成功地将函数名称传递给Fortran子例程。 在那个子程序中,我可以调用正确的C函数。 但是,C函数的参数在此调用中被破坏(当直接从C调用时它工作正常)。 我已经使用ISO C Binding试图让它工作,但无济于事。 这是一个MWE: fortranRoutine.h: extern “C” { void fortranRoutine_(void(int status)); }; calledfromFortran.h: void calledfromFortran(int status); main.cpp中: #include “fortranRoutine.h” #include “calledfromFortran.h” using namespace std; int main(int argc, char** argv) { calledfromFortran(12); fortranRoutine_(calledfromFortran); return 0; } fortranRoutine.f90: subroutine fortranRoutine(calledfromFortran) use iso_c_binding implicit none interface subroutine calledfromFortran(status) bind (c) use […]

在Fortran中,对于REAL(KIND = real_normal),C中的等价类型是什么?

我有一个从Fortran传递数组到ac函数的问题:在fortran中,数组被定义为 REAL(KIND=real_normal) , DIMENSION(:), ALLOCATABLE :: array call cFunc(array) 如果将cFunc定义为 void cFunc(double *data){…} 比数据只包含“垃圾”值。 在这种情况下问题在哪里? (用整数很好地解决这个问题)。 谢谢。 编辑:我的平台:编译器:VS 2008,英特尔编译器11版操作系统:Win7 编辑2:我为这样的c函数定义了接口(代码被简化为一个元素,这会产生问题,真正的函数有更多的参数): interface c_interface subroutine cFunc(array) bind (C, name = “cFunc”) use iso_c_binding REAL(c_double), DIMENSION(*)::array end subroutine cFunc fortran中的内存被分配 ALLOCATE (array(numberOfElements)) call cFunc(array) 目前我得到一个运行时错误“浮点溢出”。 在某些情况下,数组是正确的元素。