Tag: fortran

包括fortran子例程中的ac / c ++头文件

我有一个用C / C ++编写的库,它的开发人员声明它有一个Fortran接口。 将启用该接口,包括头文件* .h并调用经典子例程。 我想编译我的Fortran程序,也链接该库。 该库已经过测试,可以正常使用。 这是主程序: ! Main program INCLUDE ‘pastix_fortran.h’ Program TEST IMPLICIT NONE call GO_PASTIX END PROGRAM TEST 例程GO_PASTIX是 SUBROUTINE GO_PASTIX IMPLICIT NONE pastix_data_ptr_t :: pastix_data integer :: pastix_comm pastix_int_t :: n, rhs, ia(NCOLS+1), ja(NNZER) pastix_float_t :: avals(NNZER), b(NROWS) pastix_int_t :: perm(NROWS), invp(NROWS), iparm(64) real*8 :: dparm(64) call pastix_fortran(pastix_data,pastix_comm,n,ia,ja,avals,perm,invp,b,rhs,iparm,dparm) END […]

在Fortran和C之间传递字符串

我在Fortran和C之间传递字符串时遇到问题。 Fortran子例程调用如下所示: CALL MMEINITWRAPPER(TRIM(ADJUSTL(PRMTOP)), 0, SALTCON, RGBMAX, CUT) 使用它的C有签名: int mmeinitwrapper_(char *name, int *igb, REAL_T *saltcon, REAL_T *rgbmax1, REAL_T *cutoff1) 我在一些地方放了一些打印语句,一切正常,直到用ifort编译。 在这种情况下,输出如下所示: Topology file name: coords.prmtop coords.prmtop Topology file name length: 81 13 length in C: 8 read argument: coords.prmtop * Reading parm file (coords.prmtop *) coords.prmtop *, coords.prmtop *.Z: does not exist Cannot read […]

应该如何将多个Fortran字符串传递给C?

要将Fortran字符串传递给C,还会使用变量的大小传递隐藏参数。 这是一个有效的fortran定义,以及C(实际上是C ++ / CLI)方法: interface subroutine AppendExtension( + Filename) + bind(C, name=”AppendExtension”) character *1, intent(inout):: Filename end subroutine AppendExtension end interface 这是被调用的C ++ / CLI: extern “C” { void __declspec(dllexport) __cdecl AppendExtension( char * name, int buffersize) { String^ clistr = gcnew String(name); clistr = System::IO::Path::ChangeExtension(clistr->Trim(), gcnew String(“OUT”)); IntPtr p = Marshal::StringToHGlobalAnsi(clistr); char *pNewCharStr […]

如何在Fortran中调用C函数并正确传递uint32_t参数

您好我使用Fortran 90代码来调用C函数。 由于我在操作地址,因此应该在Fortran中正确匹配C函数的参数。 我正在使用ifort和icc来编译代码并在64位机器上工作。 一些测试显示这也适用于int32_t ,虽然为了防止最终的陷阱,我想保留uint32_t 我调用的C函数有以下原型 uint32_t encode_(uint32_t x, uint32_t y) uint32_t decode_(uint32_t dec) 我不能仅仅通过做类似的事情来调用这些函数 integer :: cod,encode cod = encode(i,j) 这会产生胡言乱语。 因此我使用了一种解决方法: void code2d_(uint32_t j[] ){ uint32_t i; i=encode_(j[0],j[1]); // the underscore is due to the FORTRAN naming convention printf(“Coded %10d \n”,i); } 随后在Fortran integer :: cod,code2d cod = code2d(i,j) 显然,我对参数类型的不匹配有一些问题。 不幸的是我不知道如何解决这个问题。 由于在我的解码/编码函数中完成了二进制地址算法,因此保留uint32_t非常重要。

如何获取MPI中的物理机数量

我可以使用MPI_Comm_size来获取总处理器的数量。 但是如何获得真实物理机的数量?

将Fortran转换为C或C ++

我有一些我需要转换为C或C ++的数字代码。 我尝试使用f2c,但它不适用于Fortran代码。 f2c抱怨,因为代码使用C样式预处理器指令(#include)。 该代码的自述文件声明它是Fortran77,与fort77链接器一起使用,可以扩展这些包含。 有谁知道如何成功转换此代码? 我的最后一招是编写一个简单的预处理器来扩展这些包含,然后将代码提供给f2c。 注意:我在这里的Windows / Visual C ++环境中工作,所以任何gcc恶作剧都可能比它们的价值更麻烦……

C可变函数与Fortran的互操作性

有没有办法声明一个C variadic函数并从Fortran调用它? 我需要调用此函数来计算用字符串标记的向量之间的一些点积。 我的想法是声明类似下面的内容,其中变量参数列表包含字符串文字。 如果变量参数列表为空,那么我将在标准标签之间进行查找并执行计算。 如果用户指定了两个标签,我会检索这两个向量并得到它们的点积: extern “C” void compute_dot_product(double * dot_product, …) { va_list args; va_start(args, NULL); char * label1 = va_arg(args, char *); if (!label1) { // Do standard label lookup and compute dot product } else { // Compute dot product between the vectors with the specified labels char * label2 = […]

在编译时重命名符号,而不以跨平台方式更改代码

在创建静态对象时,是否可以在跨平台的方式在编译时重命名符号(不更改代码)? 我最近推荐使用objcopy,但linux并不是唯一一个必须在mac上工作的目标平台。 我正在使用gcc编译,所以我希望有某种gcc选项。 我听说过.def文件,但这可能会产生误导,因为我发现的有关它们的信息似乎是针对Windows的。 编辑:我正在尝试更改C和Fortran函数的名称,特别是使用“wrap”一词预先挂起它们,以避免链接时出现符号冲突。

混合编程Fortran和C.

我是理论物理研究专业的学生,​​从事宇宙学研究。 在我的研究过程中,我使用了相当庞大的Fortran代码库,并使用C来满足我的编程需求。 我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色。 但对于他们来说,我一直在使用目标文件将它们全部链接起来。 但是当我尝试通过C运行真正的交易时,包括对Fortran头文件的引用。 它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误。 例如,Fortran头文件使用real * 8定义双变量,因此当C读取它们时会抛出错误。 文件中的注释也是如此。 所以,我想问一下,有什么方法可以解决这个问题吗? 即通过C使fortran格式头文件可读。 我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个。 任何有关此事的帮助将不胜感激:)

fortran77,iso_c_binding和c string

我试图从C调用一些Fortran77代码,但我没有找到传递C char数组的正确方法。 SUBROUTINE My_F_Code (c_message) BIND(C, NAME=’my_f_code’) USE ISO_C_BINDING IMPLICIT NONE CHARACTER*(C_CHAR) c_message CHARACTER*(256) f_message CALL C_F_POINTER( C_LOC(c_message), f_message) WRITE(*,*) f_message,LEN(f_message) END 这个方法适用于Fortran 90和target,指针说明符,但Fortran 77似乎没有这样的东西。 所以,上面的代码不编译。 BIND(C)强制参数c_message为大小1.如何访问c_message字符串的其他元素? 编译:GCC 4.8.2