问题标签 [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 回答
236 浏览

module - Fortran 中嵌套模块和子模块的使用有什么区别?

我有一个名为“mainmodule.f08”的模块和两个模块“module1.f08”和“module2.f08”。在“mainmodule.f08”中,我有:

我只能在我的程序中使用“module1”和“module2”use mainmodule中的程序。

使用子模块可以做同样的事情,但这要复杂得多,因为我需要在“mainmodule”上重新定义“module1”和“module2”中的所有程序作为接口,将“module1”和“module2”视为子模块:

如果两者都以相同的方式工作,那么两种模块的使用模式有什么区别?

0 投票
0 回答
35 浏览

fortran - 现代 Fortran 中的静态数组元素

为方便起见,我希望能够引用实现为一维数组的静态查找表的元素,如下所示

其中 I 是方括号中静态数组的整数索引。我知道我可以声明一个命名数组并使用它,但我想知道是否有适合上述意图的语法。

0 投票
1 回答
334 浏览

oop - Fortran 构造函数返回指向已分配对象的指针

在这个问题中:Fortran Functions with a pointer result in a normal assignment,指出不推荐使用返回指针的函数。

我的问题涉及用户定义类型的构造函数。考虑下面的代码:

在代码中,我定义了一个带有构造函数的类型,该构造函数分配对象,然后在对象中分配一个数组。然后它返回一个指向该对象的指针。

如果构造函数只返回对象,则对象和数组将被复制然后释放(至少使用标准兼容编译器)。这可能会导致开销并扰乱我们的内存跟踪。

使用 ifort 编译上面的代码不会使用 -warn all 发出警告(终结器中未使用的变量除外),并且代码的行为方式符合我的预期。它也适用于 gfortran,除了我在使用 -Wall 时收到警告

使用这样的构造函数有什么风险?据我所知,不会有悬空指针,我们将对何时分配对象有更多控制权。可以达到相同结果的一种解决方法是显式分配对象并将构造函数转换为设置变量并分配数组的子例程,但它看起来不那么优雅。还有其他解决方案吗?我们的代码采用 Fortran 2008 标准。

0 投票
1 回答
115 浏览

module - 在创建单独的模块过程时,您会在什么情况下在子模块中使用“模块过程”?

我了解 Fortran 2008+ 中子模块的一般好处,但我无法理解其中一种语法选项的好处。

如果我想创建单独的模块过程(过程主体在子模块中),我需要在父模块中创建一个接口。该接口必须包含子例程或函数标识符以及参数列表和意图。这一切都说得通。

然后子模块包含过程的实现,但是可以选择语法:我可以重复子例程或函数的签名,或者,我可以简单地使用“模块过程”之后的接口名称。我打算打出一个例子,但fortran wiki完美地显示了它。

我的问题是:使用“模块过程”而不是“模块函数”或“模块子例程”的替代语法有什么好处,即过程类型、参数和意图在子模块文件中重复?似乎这只会使代码维护复杂化,因为现在需要打开两个文件才能理解子例程或函数。我是否在这里遗漏了一些隐藏的好处(除了保存副本/粘贴)?

0 投票
1 回答
196 浏览

pointers - 指向数组的指针作为 Fortran 派生类型中的成员变量

在 Fortran 中,不可能将派生类型的成员变量作为目标。(我想这与标准没有指定派生类型如何存储在内存中有关?)但是,我可以将指针作为成员变量并将指针与指针相关联。就像我在下面的示例中所做的那样。

在 set 例程中,我使用一个 if 语句来设置一个指针,以决定它是否应该将传入的矩阵转储到 A 或 B 中。在我目前正在处理的程序中,我必须决定四个不同矩阵的哪个组合相乘并且设置一对指针比编写 16 个几乎相同的 dgemm 调用要好得多。

我的问题是,除了悬挂指针等的正常危险之外,这种方法是否存在任何问题,或者没有指针的方法?不应从对象外部访问数组。是否存在性能问题?

0 投票
0 回答
87 浏览

memory-leaks - fortran 2008 中可分配数组的内存泄漏

我在本教程中读到,可分配变量在超出范围时会自动释放。我写了一个试用程序来测试这个,我发现 valgrind 说有内存泄漏。我的试用计划是:

我编译这个程序(arrays.f90)如下(gfortran版本“GNU Fortran(Ubuntu 5.5.0-12ubuntu1~16.04)5.5.0 20171010”)

然后运行 ​​valgrind (valgrind ./arr) 我发现

我对为什么 valgrind 说程序结束后两个数组没有被释放感到困惑。

valgrid 的输出不依赖于我正在使用的编译器的优化级别,这与这个关于 fortran 内存泄漏的问题不同。

0 投票
0 回答
233 浏览

concurrency - 为什么 DO CONCURRENT 语句会给出奇怪的结果?

让我们编译以下 Fortran 程序:

ifort (ver. 19.0.4.243) 没有选项。然后,我们得到结果:

第一个和第二个结果符合预期。为什么 DO CONCURRENT 不给出相同的结果?

0 投票
1 回答
117 浏览

fortran - “gfortran -Wconversion”的奇怪行为

考虑以下代码。

gfortran使用以下方式编译时:

我收到以下警告:

请注意,gfortran对前两次转换感到满意,但对最后一次转换不满意。

问题:上面说明的警告是预期的行为gfortran吗?我认为在这三种情况下都不应该产生任何警告,因为转换是由REAL( , INT64).

这是我的版本信息gfortran

作为参考,ifort19.1.127 编译 test.f90 没有任何抱怨:

非常感谢您的任何评论或批评。

0 投票
0 回答
126 浏览

fortran - 结合子模块、过程参数和多态类型

我目前正在尝试将我的代码拆分为模块和子模块。我有许多将过程作为参数的过程,在某些情况下,这些过程参数的参数是多态的。将这些过程拆分为子模块时,我的代码不再编译。

作为一个最小的工作示例,我有一个模块文件m.f90

和一个子模块文件m_sub.f90

并且,为了完整起见,一个程序文件main.f90

我正在使用 CMake 编译它,并带有一个CMakeLists.txt文件:

如果我使用gfortran 10.1.0thenfoo编译,则可以自行编译并运行良好,但尝试编译bar会出现错误

如果我改为编译,ifort 2021.1我会收到编译时警告(对于foobar

然后是链接器错误(对于foobar

据我所知,我正在做的是有效的 Fortran。那么我是否看到编译器错误/未实现的功能?还是我试图做一些标准不允许的事情?

0 投票
2 回答
126 浏览

unit-testing - 如何对接口定义在子模块中的函数进行单元测试

在我看来,子模块的一个很好的特性是您可以在子模块中创建一个辅助函数,而程序员的成本很低;您不会触发编译级联,不会弄乱命名空间或文档,并且可以立即清楚地知道该函数在哪里可以使用和不能使用。它们就像更好的private函数版本。

但是,子模块中的函数不能是used。虽然这按预期工作,但似乎这也阻止了该功能进行单元测试。我知道的两个单元测试框架pFUnitfruit都需要use语法才能运行。

对于如何访问 fortran 模块中的私有变量private?,但是这些解决方案似乎都不适用于子模块中的函数,至少在没有否定将这些函数放在子模块中的所有好处的情况下。

那么这个问题有什么解决方案吗?