问题标签 [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.
fortran - Fortran 2008 C 互操作错误:在 (1) 处的过程调用中比形式参数更实际
我有这个已关闭的特定主题问题,试图从 Fortran 的 libcurl 简单 API 调用 C: https ://stackoverflow.com/questions/44891188/calling-libcurl-from-fortran-2008
根据评论的建议,我仍然收到有关如何从 Fortran 正确调用 C 指针和 C 函数的错误。
这里的代码不多,但主要问题是警告:
和错误:
这是我的最小示例:
还引用了这个:
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,因为我事先不知道整数的宽度。
fortran - 现代 Fortran 的 Scalapack 包装器
我正在寻找一个 Fortran 库,它可以更轻松地在我的项目中使用 Scalapack。似乎在没有任何东西的情况下使用 Scalapack 非常冗长,我想知道是否有人将其打包到 Fortran 2003 对象中。我在 C++ 或 Python 中看到过类似的东西。这种尝试似乎在不久前就死了:
https://github.com/dftbplus/scalapackfx
是否有任何库可以更轻松地使用 Scalapack?
fortran - 默认访问 Fortran 自定义类型属性
现代 Fortran(90、2003 甚至 2008)是否有可能拥有一个自定义类型,默认情况下会访问其中一个属性:
constructor - 抽象类的Fortran构造函数初始化私有变量
我从 Fortran 开始,我想尝试一个非常简单的示例 - 一个抽象类 Connection,然后是它的派生类 IntervalConnection,而 Connection 类将定义一个构造函数,而 IntervalConnection 将继承此构造函数。
在这个构造函数中,我有几个私有变量,我需要对其进行初始化。
问题是,在尝试创建新对象时出现以下错误:Connection.f08:152:10:
我想我没有new_connection
正确定义构造函数。请您告诉我,我应该如何以更好的方式实施它?
我的代码
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=ilun
为unit=ilun
, 例如ilun=10
之前,它在任何情况下都有效
系统详情
操作系统:GNU Linux 发行版:Arch Linux(截至 2017 年 12 月 15 日的最新版本)
fortran - forrtl:严重(104):不正确的状态 = 连接文件的说明符值,单位 -1,文件 CONOUT$
我有一个 Fortran 例程,它打开很多文本文件,从时间循环中写入数据。此例程open
与newunit
选项一起使用,此单元存储在一个对象中,以便以后将内容写入文件中。这在大多数情况下都可以正常工作,但是当程序需要同时打开大量 N 个文件时,我收到以下错误:
指子程序中的第一个open
函数createFiles
。无论文件是否已存在,都会发生此错误。我不知道这是否有帮助,但在这个阶段应该生成的新单位是-32768
.
我包含一个带有“timeSeries”类的最小代码示例,其中包括一个创建两个文件的例程:
- 第一个文件
fileName1
在里面写东西后直接打开和关闭 - 第二个文件
fileName2
保持打开状态,以便写入稍后在时间循环中计算的内容,并在时间循环结束时关闭
该示例由以下两个文件组成。它因 i=32639 而中断。
main.f90 :
模块.f90:
关于这个错误的原因的任何想法?同时打开的文件数量有限制吗?它可能与内存问题有关吗?
我正在使用 Intel(R) Visual Fortran 编译器 17.0.4.210
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_Isend
并MPI_Irecv
导致警告?如何修复它以便不再触发警告? - 这个警告是我在 rank-6 数组中看到的数组损坏的原因吗?
- 如何避免损坏 rank-6 数组?
我在这个 gist中放了一个失败的例子。
fortran - Fortran 2008 中使用非多态过程重载延迟过程
是否可以用非多态过程重载延迟过程?
我想创建一个Parent
带有过程 ( foo
) 的抽象类 (),它必须由扩展的每个类重载Parent
。当我想再次扩展时遇到了问题,例如一个类 ( Grandchild
) 扩展了一个扩展的类 ( Child
) Parent
。
由于 Child 不是抽象的,它的 foo( foo_Child
) 必须是多态的。而是Grandchild
继承foo_Child
,而不是被迫定义foo_Grandchild
。此外,由于我不想foo_Child
成为多态,我希望能够Child
在foo_Child
.
总结一下:
有什么方法可以使foo_Child
非多态但也超载foo_Parent
?或者有没有办法在多态过程中调用非多态函数(至少Child=Child
分配非多态rhs)?如果没有,是否有解决方法?
(我不想定义class(Child)=type(Child)
,但如果它是唯一的选择)。
pointers - 如何将 Fortran 过程指针作为派生类型的组件,该类型指向该类型扩展中的类型绑定过程?
我检查了类似的问题和相关的教科书,但找不到解决这个问题的方法。
注意:这是使用现代 Fortran。
所以,我想要一个基类型,例如base
,它包含一个类型绑定过程,例如run
,它委托给扩展基类型的子例程,例如type, extends(base) :: my_extension
。让我们调用我们希望委托给的子例程my_procedure
。
我可以通过一种相当复杂的方式来实现这一点,方法是base
抽象化,base
包含一个延迟的过程,例如delegate
,run
委托给delegate
,然后实现delegate
并my_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
不使用接口的情况下获得指向扩展程序的指针?或者我怎样才能实现我正在尝试做的其他方式(例如不使用指针)但仍然避免顶部描述的混乱抽象类型方法?