问题标签 [fortran2008]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2792 浏览

fortran - Fortran 2008 C 互操作错误:在 (1) 处的过程调用中比形式参数更实际

我有这个已关闭的特定主题问题,试图从 Fortran 的 libcurl 简单 API 调用 C: https ://stackoverflow.com/questions/44891188/calling-libcurl-from-fortran-2008

根据评论的建议,我仍然收到有关如何从 Fortran 正确调用 C 指针和 C 函数的错误。

这里的代码不多,但主要问题是警告:

和错误:

这是我的最小示例:

还引用了这个:

0 投票
1 回答
683 浏览

fortran - 在 Fortran 中读取未知宽度的整数

我正在尝试读取这一行中的整数:

在 Fortran 2008 中。

我试图使用这段代码:

但这不符合标准。Intel Fortran 发出警告“ Fortran 2008 does not allow this edit descriptor. [I]”,其他问题解释了这个问题:Nonnegative width required in format string Error: Nonnegative width required in format string at (1)

如何使用 Fortran 2008 正确读取未知宽度的整数?我不能简单地指定I2,因为我事先不知道整数的宽度。

0 投票
1 回答
110 浏览

fortran - 现代 Fortran 的 Scalapack 包装器

我正在寻找一个 Fortran 库,它可以更轻松地在我的项目中使用 Scalapack。似乎在没有任何东西的情况下使用 Scalapack 非常冗长,我想知道是否有人将其打包到 Fortran 2003 对象中。我在 C++ 或 Python 中看到过类似的东西。这种尝试似乎在不久前就死了:

https://github.com/dftbplus/scalapackfx

是否有任何库可以更轻松地使用 Scalapack?

0 投票
1 回答
150 浏览

fortran - 默认访问 Fortran 自定义类型属性

现代 Fortran(90、2003 甚至 2008)是否有可能拥有一个自定义类型,默认情况下会访问其中一个属性:

0 投票
1 回答
467 浏览

constructor - 抽象类的Fortran构造函数初始化私有变量

我从 Fortran 开始,我想尝试一个非常简单的示例 - 一个抽象类 Connection,然后是它的派生类 IntervalConnection,而 Connection 类将定义一个构造函数,而 IntervalConnection 将继承此构造函数。

在这个构造函数中,我有几个私有变量,我需要对其进行初始化。

问题是,在尝试创建新对象时出现以下错误:Connection.f08:152:10:

我想我没有new_connection正确定义构造函数。请您告诉我,我应该如何以更好的方式实施它?


我的代码

0 投票
1 回答
966 浏览

fortran - 写入时出现“Fortran 运行时错误:文件结尾”

我编写了一段代码,在 Arch Linux 上使用 GNU Fortran (GCC) 7.2.1 20171128 编译,尝试写入文件。该单元使用newunit=...Fortran 2008 功能打开

尝试写入文件时,代码崩溃,引发错误Fortran runtime error: End of file

非工作代码

这是代码的最小非工作版本。如果文件不存在,代码会在 gfortran 7.2.1 中崩溃

这是我正在使用的命令rm -f 00001.txt; gfortran foo.f90 -o a.out && ./a.out

工作代码

相比之下,以下代码在同一台机器上编译并完美运行

程序 foo

这是我正在使用的命令rm -f 00001.txt; gfortran foo.f90 -o a.out && ./a.out

重要的提示

使用 ifort(在 ifort15 和 ifort18 之间尝试的任何版本)以及 GNU Fortran (GCC) 6.4.1 20171003 和 GNU Fortran (GCC) 7.2.0 编译时,这两个代码都运行良好,因此版本 7.2 中似乎引入了一个问题.1 的 gfortran 或与 Arch Linux 捆绑的版本。

几点评论

  • 如果您nchar = '00001'在非工作示例中取消注释,它仍然不起作用。
  • 如果您更改newunit=ilununit=ilun, 例如ilun=10之前,它在任何情况下都有效

系统详情

操作系统:GNU Linux 发行版:Arch Linux(截至 2017 年 12 月 15 日的最新版本)

0 投票
1 回答
1022 浏览

fortran - forrtl:严重(104):不正确的状态 = 连接文件的说明符值,单位 -1,文件 CONOUT$

我有一个 Fortran 例程,它打开很多文本文件,从时间循环中写入数据。此例程opennewunit选项一起使用,此单元存储在一个对象中,以便以后将内容写入文件中。这在大多数情况下都可以正常工作,但是当程序需要同时打开大量 N 个文件时,我收到以下错误:

指子程序中的第一个open函数createFiles。无论文件是否已存在,都会发生此错误。我不知道这是否有帮助,但在这个阶段应该生成的新单位是-32768.

我包含一个带有“timeSeries”类的最小代码示例,其中包括一个创建两个文件的例程:

  • 第一个文件fileName1在里面写东西后直接打开和关闭
  • 第二个文件fileName2保持打开状态,以便写入稍后在时间循环中计算的内容,并在时间循环结束时关闭

该示例由以下两个文件组成。它因 i=32639 而中断。

main.f90 :

模块.f90:

关于这个错误的原因的任何想法?同时打开的文件数量有限制吗?它可能与内存问题有关吗?

我正在使用 Intel(R) Visual Fortran 编译器 17.0.4.210

0 投票
0 回答
279 浏览

fortran - 将 MPI_Isend 与 mpi_f08 子数组一起用于 ifort 中的高维数组会损坏数据

我正在尝试使用该mpi_f08模块在一系列 4、5 和 6 级阵列上进行光环交换。以前我为此使用了子数组类型,但最终结果如此之多,以至于 ifort 无法跟踪所有这些类型,并在使用-ipo.

我正在使用以下代码

(然后打电话给MPI_WaitAll

带有 Intel MPI 2017 的 ifort 2017 为每个此类行提供以下警告:

尽管如此,halo 交换对于 rank-4 和 -5 阵列都可以正常工作。然而,当涉及到 rank-6 数组时,数组数据的去向和来自完全错误的地方,发送过程中的光环数据(不在传入的数组段MPI_Isend中)出现在接收的大部分中进程(未传递到MPI_Irecv)。

使用 ifort 2018 和 Intel MPI 2019 预览版会产生额外的错误(非警告):

三个相互关联的问题:

  • 调用中我的语法是否有错误MPI_IsendMPI_Irecv导致警告?如何修复它以便不再触发警告?
  • 这个警告是我在 rank-6 数组中看到的数组损坏的原因吗?
  • 如何避免损坏 rank-6 数组?

我在这个 gist中放了一个失败的例子。

0 投票
1 回答
867 浏览

fortran - Fortran 2008 中使用非多态过程重载延迟过程

是否可以用非多态过程重载延迟过程?

我想创建一个Parent带有过程 ( foo) 的抽象类 (),它必须由扩展的每个类重载Parent。当我想再次扩展时遇到了问题,例如一个类 ( Grandchild) 扩展了一个扩展的类 ( Child) Parent

由于 Child 不是抽象的,它的 foo( foo_Child) 必须是多态的。而是Grandchild继承foo_Child,而不是被迫定义foo_Grandchild。此外,由于我不想foo_Child成为多态,我希望能够Childfoo_Child.

总结一下:

有什么方法可以使foo_Child非多态但也超载foo_Parent?或者有没有办法在多态过程中调用非多态函数(至少Child=Child分配非多态rhs)?如果没有,是否有解决方法?

(我不想定义class(Child)=type(Child),但如果它是唯一的选择)。

0 投票
0 回答
345 浏览

pointers - 如何将 Fortran 过程指针作为派生类型的组件,该类型指向该类型扩展中的类型绑定过程?

我检查了类似的问题和相关的教科书,但找不到解决这个问题的方法。

注意:这是使用现代 Fortran。

所以,我想要一个基类型,例如base,它包含一个类型绑定过程,例如run,它委托给扩展基类型的子例程,例如type, extends(base) :: my_extension。让我们调用我们希望委托给的子例程my_procedure

我可以通过一种相当复杂的方式来实现这一点,方法是base抽象化,base包含一个延迟的过程,例如delegaterun委托给delegate,然后实现delegatemy_extension让它委托给my_procedure

但是,这很麻烦,因为它需要扩展base来实现的类型,delegate但所有实现都只是简单地委托给其他一些过程。由于我通常需要多个实例my_extension,每个实例在其中委托给不同的过程,这使情况变得更加复杂my_extension,在这种情况下,我需要在那里保持my_extension抽象、扩展my_extension和实现delegate,因此我最终得到的扩展与我拥有的过程一样多!

所以,我想知道是否有使用过程指针或类似的更清洁的方法。我想要的是这样的东西......

base.f90:

my_extension.f90:

main.f90:

使.sh:

但是,编译器抱怨如下:

这是因为my_interface期望类的对象base作为输入,而my_procedure将类的对象my_extension作为输入,因此从技术上讲接口不匹配。但是,my_extension扩展base所以,在某种程度上,这应该是可以的(但就编译器而言显然不是可以的)。

所以,我的问题是:我怎样才能克服这个问题?我怎样才能拥有一个适用于my_procedure但仍适用于其他扩展类型的其他过程base(例如 中的那些my_other_extension)的接口?或者如何在base不使用接口的情况下获得指向扩展程序的指针?或者我怎样才能实现我正在尝试做的其他方式(例如不使用指针)但仍然避免顶部描述的混乱抽象类型方法?