问题标签 [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.
module - Fortran 中嵌套模块和子模块的使用有什么区别?
我有一个名为“mainmodule.f08”的模块和两个模块“module1.f08”和“module2.f08”。在“mainmodule.f08”中,我有:
我只能在我的程序中使用“module1”和“module2”use mainmodule
中的程序。
使用子模块可以做同样的事情,但这要复杂得多,因为我需要在“mainmodule”上重新定义“module1”和“module2”中的所有程序作为接口,将“module1”和“module2”视为子模块:
如果两者都以相同的方式工作,那么两种模块的使用模式有什么区别?
fortran - 现代 Fortran 中的静态数组元素
为方便起见,我希望能够引用实现为一维数组的静态查找表的元素,如下所示
其中 I 是方括号中静态数组的整数索引。我知道我可以声明一个命名数组并使用它,但我想知道是否有适合上述意图的语法。
oop - Fortran 构造函数返回指向已分配对象的指针
在这个问题中:Fortran Functions with a pointer result in a normal assignment,指出不推荐使用返回指针的函数。
我的问题涉及用户定义类型的构造函数。考虑下面的代码:
在代码中,我定义了一个带有构造函数的类型,该构造函数分配对象,然后在对象中分配一个数组。然后它返回一个指向该对象的指针。
如果构造函数只返回对象,则对象和数组将被复制然后释放(至少使用标准兼容编译器)。这可能会导致开销并扰乱我们的内存跟踪。
使用 ifort 编译上面的代码不会使用 -warn all 发出警告(终结器中未使用的变量除外),并且代码的行为方式符合我的预期。它也适用于 gfortran,除了我在使用 -Wall 时收到警告
使用这样的构造函数有什么风险?据我所知,不会有悬空指针,我们将对何时分配对象有更多控制权。可以达到相同结果的一种解决方法是显式分配对象并将构造函数转换为设置变量并分配数组的子例程,但它看起来不那么优雅。还有其他解决方案吗?我们的代码采用 Fortran 2008 标准。
module - 在创建单独的模块过程时,您会在什么情况下在子模块中使用“模块过程”?
我了解 Fortran 2008+ 中子模块的一般好处,但我无法理解其中一种语法选项的好处。
如果我想创建单独的模块过程(过程主体在子模块中),我需要在父模块中创建一个接口。该接口必须包含子例程或函数标识符以及参数列表和意图。这一切都说得通。
然后子模块包含过程的实现,但是可以选择语法:我可以重复子例程或函数的签名,或者,我可以简单地使用“模块过程”之后的接口名称。我打算打出一个例子,但fortran wiki完美地显示了它。
我的问题是:使用“模块过程”而不是“模块函数”或“模块子例程”的替代语法有什么好处,即过程类型、参数和意图在子模块文件中不重复?似乎这只会使代码维护复杂化,因为现在需要打开两个文件才能理解子例程或函数。我是否在这里遗漏了一些隐藏的好处(除了保存副本/粘贴)?
pointers - 指向数组的指针作为 Fortran 派生类型中的成员变量
在 Fortran 中,不可能将派生类型的成员变量作为目标。(我想这与标准没有指定派生类型如何存储在内存中有关?)但是,我可以将指针作为成员变量并将指针与指针相关联。就像我在下面的示例中所做的那样。
在 set 例程中,我使用一个 if 语句来设置一个指针,以决定它是否应该将传入的矩阵转储到 A 或 B 中。在我目前正在处理的程序中,我必须决定四个不同矩阵的哪个组合相乘并且设置一对指针比编写 16 个几乎相同的 dgemm 调用要好得多。
我的问题是,除了悬挂指针等的正常危险之外,这种方法是否存在任何问题,或者没有指针的方法?不应从对象外部访问数组。是否存在性能问题?
concurrency - 为什么 DO CONCURRENT 语句会给出奇怪的结果?
让我们编译以下 Fortran 程序:
ifort (ver. 19.0.4.243) 没有选项。然后,我们得到结果:
第一个和第二个结果符合预期。为什么 DO CONCURRENT 不给出相同的结果?
fortran - “gfortran -Wconversion”的奇怪行为
考虑以下代码。
gfortran
使用以下方式编译时:
我收到以下警告:
请注意,gfortran
对前两次转换感到满意,但对最后一次转换不满意。
问题:上面说明的警告是预期的行为gfortran
吗?我认为在这三种情况下都不应该产生任何警告,因为转换是由REAL( , INT64)
.
这是我的版本信息gfortran
:
作为参考,ifort
19.1.127 编译 test.f90 没有任何抱怨:
非常感谢您的任何评论或批评。
fortran - 结合子模块、过程参数和多态类型
我目前正在尝试将我的代码拆分为模块和子模块。我有许多将过程作为参数的过程,在某些情况下,这些过程参数的参数是多态的。将这些过程拆分为子模块时,我的代码不再编译。
作为一个最小的工作示例,我有一个模块文件m.f90
:
和一个子模块文件m_sub.f90
:
并且,为了完整起见,一个程序文件main.f90
:
我正在使用 CMake 编译它,并带有一个CMakeLists.txt
文件:
如果我使用gfortran 10.1.0
thenfoo
编译,则可以自行编译并运行良好,但尝试编译bar
会出现错误
如果我改为编译,ifort 2021.1
我会收到编译时警告(对于foo
和bar
)
然后是链接器错误(对于foo
和bar
)
据我所知,我正在做的是有效的 Fortran。那么我是否看到编译器错误/未实现的功能?还是我试图做一些标准不允许的事情?
unit-testing - 如何对接口定义在子模块中的函数进行单元测试
在我看来,子模块的一个很好的特性是您可以在子模块中创建一个辅助函数,而程序员的成本很低;您不会触发编译级联,不会弄乱命名空间或文档,并且可以立即清楚地知道该函数在哪里可以使用和不能使用。它们就像更好的private
函数版本。
但是,子模块中的函数不能是use
d。虽然这按预期工作,但似乎这也阻止了该功能进行单元测试。我知道的两个单元测试框架pFUnit和fruit都需要use
语法才能运行。
对于如何访问 fortran 模块中的私有变量private
?,但是这些解决方案似乎都不适用于子模块中的函数,至少在没有否定将这些函数放在子模块中的所有好处的情况下。
那么这个问题有什么解决方案吗?