Tag: fortran

使用MPI写入文件

我正在写一个文件如下。 顺序并不一定重要(虽然如果我可以通过K订购它会很好,就像在串行代码中本身一样) CALL MPI_BARRIER(MPI_COMM_WORLD, IERR) OPEN(EIGENVALUES_UP_IO, FILE=EIGENVALUES_UP_PATH, ACCESS=’APPEND’) WRITE(EIGENVALUES_UP_IO, *) K * 0.0001_DP * PI, (EIGENVALUES(J), J = 1, ATOM_COUNT) CLOSE(EIGENVALUES_UP_IO) 我知道这可能是最糟糕的选择。 我已经看过MPI_FILE_WRITE_AT等但是我不确定他们(直接)以我的forms获取数据? 该文件必须采用与此格式相同的格式,该格式为每K行一行,ATOM_COUNT + 1列。 值为REAL(8) 我一遍又一遍地寻找,并且找不到任何关于实现这一点的简单参考。 有帮助吗? 🙂 C中的类似代码(假设它与FORTRAN基本相同)同样有用 谢谢!

使用延迟形状数组从C调用Fortran

是否可以从C / C ++调用Fortran子例程,其中一个Fortran参数是延迟形状数组? (希望我正确使用“延迟形状”一词。) 在下面的示例中, subr1()使用explicit-shape,并且工作正常,但subr2()使用deferred-shape并导致段错误。 这个问题表明需要一个显式接口来从另一个Fortran子例程调用subr2() ,但是我试图从C调用。这样做是不可能的吗? 在真正的问题中,数组的长度会更复杂 – 这就是为什么在理想的世界中,我想使用延迟形状的版本。 (当然,在一个理想的世界里,我根本不会混合使用Fortran和C.) test_array_c.c #include extern void subr1_(int*, int*); extern void subr2_(int*, int*); int main(int argc, char **argv){ int N,i; int *data; // create an array N=3; data=(int*)malloc(N*sizeof(int)); for (i=0;i<N;i++) data[i]=i; // pass array to fortran functions subr1_(&N,data); subr2_(&N,data); // free free(data); } test_array_f90.f90 subroutine […]

混合编程:从C调用FORTRAN

我必须从C / C ++中调用FORTRAN子例程进行概念validation。 我不知道我的方向是什么,请指导我…. 我做的是…… 我写了以下FORTRAN代码 INTEGER*4 FUNCTION Fact (n) INTEGER*4 n INTEGER*4 i, amt amt = 1 DO i = 1, n amt = amt * i END DO Fact = amt END SUBROUTINE Pythagoras (a, b, c) REAL*4 a REAL*4 b REAL*4 cc = SQRT (a * a + b * b) […]

将大量数据从FORTRAN传递到C ++

将大量数据(双数)从FORTRAN程序传递到C ++程序的最佳和最有效的方法是什么? 现在我正在使用二进制文件,但速度不够快! 我试过管道。 我关注了C ++部分的http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx 。 但对于FORTRAN部分(子处理器),我不知道如何正确写入数据。 我是否必须像WRITE(*,*) AllTheNumbers一样在控制台上WRITE(*,*) AllTheNumbers ? 因为在控制台上书写需要花费很多时间! 我的FORTRAN代码写入数据: DO 281 I=1,NDOF DO 280 J=1,UBW IF (S(I,J).NE.0) THEN WRITE (*, 2770) I,(J+I-1) WRITE (*,2760) (S(I,J)) ENDIF 280 CONTINUE 281 CONTINUE

读取已关闭的命名管道块

我试图从Fortran读取命名管道(FIFO)。 读取数据有效,但Fortran程序似乎没有注意到管道在另一端关闭; 读取只是阻止而不是获得EOF。 示例程序: program kitten character(256) :: buf open(22, file=’test’) do read(22, *) buf print*, trim(buf) end do end program kitten 现在用 $ mkfifo test $ echo -e ‘1\n2\n3’ >test & $ ./kitten 程序按预期打印1\n2\n3\n ,但随后挂起。 相反,程序返回EOF错误if test是一个常规文件; 要么 你改变kitten从STDIN读取并做./kitten <test或 echo -e ‘1\n2\n3’ | ./kitten echo -e ‘1\n2\n3’ | ./kitten ; 要么 你在C写一个相当的kitten程序 我使用ifort […]

编写将函数返回给Fortran的C函数

最后,我试图编写一个IPC计算器,利用Fortran计算和C来传递两个Fortran程序之间的数据。 当我完成它将希望看起来像: Fortran program to pass input -> Client written in C -> Server written in C -> Fortran program to calculate input and pass ans back C客户端/服务器部分已完成,但目前我仍然试图编写一个在Fortran程序中输入的程序,将其传递给计算答案的C程序。 但是,我看到了一些奇怪的行为。 Fortran计划 program calculator !implicit none ! type declaration statements integer x x = 1 ! executable statements x = calc(1,1) print *, x end program calculator […]

在C中为fortran数组分配内存

我是fortran编程的新手。我有一个3维数组声明如下 REAL*4, DIMENSION(:,:,:), ALLOCATABLE :: a1 我想通过引用C或C ++函数传递数组,并在C而不是fortran中分配内存。 在fortran中理解数组概念是否可能或我错了?

Fortran派生类型构造函数通过C函数定义

我想通过C函数定义派生类型构造函数。 在下面的示例中,我设法通过C接口定义了一个重载的加法运算符。 尽管语法非常相似,但构造函数的定义在gfortran 4.9下失败,并出现以下错误: test.f90:7.52: module procedure my_module_fortran_new_my_double 1 Error: ‘my_module_fortran_new_my_double’ at (1) is not a module procedure 经过一段时间花在谷歌搜索或查看堆栈溢出前的post,我没有找到任何解决方案。 如果有人能告诉我是什么触发了这个错误以及如何纠正它,我会很高兴。 这是我的模块的源代码: module my_module use iso_c_binding type, bind(c) :: my_double real(c_double) :: x end type my_double interface my_double module procedure my_module_fortran_new_my_double end interface interface operator (+) module procedure my_module_fortran_add end interface operator (+) interface type(my_double) function […]

将分配的C_PTR传递给Fortran数组到C

我在访问C中的数组时遇到了segfaults的问题,这个数组在下面的Fortran文件中分配。 有一些调试的假象,例如文件写入不写任何有意义的事实,我初始化一个我从未使用的变量i 。 但是,我发现了以下内容: 没有初始化i (但仍然声明它):没有段错误 不在C中打开文件:没有segfault 不在代码中的其他地方打印HESS (不是HESS_COPY ):no segfault 用不同的名称声明和初始化i :segfault 有谁知道什么可能会引起这种行为? 段错误本身出现在ARRAY_PTR = C_LOC(HESS_COPY(1, 1)) 。 我正在使用gfortran和gcc编译调试标志(没有优化)。 valgrind说有一个无效的写(前两个文件是我在下面显示的文件): Invalid write of size 8 at 0xBEEA3E: get_pointer (modsparsehess.f90:34) by 0xA75D7A: print_hess (sparse_hessian_c.c:108) by 0x866C95: quench_ (quench.f:316) by 0x7F2DBE: mc_ (mc.F:368) by 0x4B65E2: mcruns_ (mcruns.f:62) by 0x459245: MAIN__ (main.F:430) by 0x45A33F: main (main.F:21) Address […]

从命令行将参数传递给可执行文件

我正在尝试从命令行向Fortran可执行文件传递参数。 在C中实现此目的的示例程序(取自此处 ): #include int main (int argc, char *argv[]) { int count; printf (“This program was called with \”%s\”.\n”,argv[0]); if (argc > 1) { for (count = 1; count < argc; count++) { printf("argv[%d] = %s\n", count, argv[count]); } } else { printf("The command had no other arguments.\n"); } return 0; } 该程序的输出是: This […]