问题标签 [fortran90]
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 - 保存扩展名为 .f90 的文件
我在写字板中输入源代码并将其保存为addition.f90,但不幸的是,Windows 提供的唯一选项是文本文件、rtf 文件等。
我正在为 Windows 使用 G95 编译器。
module - 你如何使用 Fortran 90 模块数据
假设您有一个包含大量变量、函数和子例程的 Fortran 90 模块。在您的USE
陈述中,您遵循哪种约定:
- 使用语法显式声明您正在使用哪些变量/函数/子例程
, only :
,例如USE [module_name], only : variable1, variable2, ...
? - 插入毯子
USE [module_name]
?
一方面,该only
子句使代码更加冗长。但是,它会迫使您在代码中重复自己,并且如果您的模块包含大量变量/函数/子例程,事情就会开始变得不规则。
这是一个例子:
更新 希望有人说“Fortran?只需用 C# 重新编码!” 所以我可以否决你。
更新
我喜欢Tim Whitcomb 的回答,它将 FortranUSE modulename
与 Python 的from modulename import *
. 之前在 Stack Overflow 上的一个话题:
-
- Mark Roddy
在回答中提到:
不要使用“从模块导入 *”。对于任何合理的大型代码集,如果您“导入 *”,您可能会将其固定到模块中,无法删除。这是因为很难确定代码中使用的哪些项目来自“模块”,这使得它向东到达您认为不再使用导入但很难确定的地步。
- Mark Roddy
在回答中提到:
-
- dbr 的答案包含
不要这样做 from x import * - 它使您的代码很难理解,因为您无法轻易看到方法的来源(from x import *; from y import *; my_func() - my_func 定义在哪里?)
- dbr 的答案包含
因此,我倾向于达成共识,即通过以下方式明确说明我在模块中使用的所有项目
正如Stefano Borini所说,
[如果]你有一个太大的模块,以至于你不得不只添加,这意味着你的模块太大了。拆分它。
pointers - Fortran 指针函数:为什么此代码的行为取决于函数调用的顺序?
语境
下面发布的玩具 Fortran 代码调用了两个指针函数。也就是说,两个函数都返回一个指针。事实上,它们都是数组指针。它们都试图做同样的事情,即返回一个整数数组指针,该指针引用一个具有三个元素 1、2 和 3 的整数数组。第一个函数使用指针赋值运算符 (=>) 将函数指针指向保存数据的可分配数组。第二个函数通过指针直接分配一块动态内存,用于存储数据。调用程序只打印返回数组的元素。
这就是我觉得奇怪的地方。
- 如果我指向
a
的结果function1
,则结果不正确。的第一个元素a
似乎被“破坏”了:a
has0
,2
,3
. - 如果我指向
b
的结果function2
,则结果是正确的。b
得到1
,2
,3
. - 更奇怪的是,指向改变后的
b
结果,使其变得正确。 然后有, , .function2
a
function1
a
a
1
2
3
问题
为什么会出现这种情况?更准确地说,为什么返回指向可分配数组的指针的指针函数会为调用者破坏该数组的第一个元素?更准确地说,为什么指向一个指针 ( b
) 会对另一个指针 ( ) 产生副作用a
,其中目标来自不同的函数,这些函数被编写为根本不相互交互?
注意事项
我使用 GNU Fortran 编译器 v.4.3.3 获得此行为,运行带有 Ubuntu (Jaunty) 的英特尔笔记本电脑。您的结果可能会有所不同,这可能会更有趣。最后,和往常一样,这可能是我的操作员错误,这至少对我来说很有趣。
代码
arrays - 定义整数数组 fortran
我是 Fortran 的新手。any1 可以告诉我如何在之前定义一个整数数组。例如,我想定义一个 12 个月内没有天数的数组。喜欢...
这个语法正确吗?如果不是,请告诉我正确的。
谢谢普拉文
fortran - fortran 90 用户定义类型,按值传递?
我在 Fortran 90 中有一个问题。
我有一个用户定义的类型,当我调用其中一个 MPI 子例程时,数据看起来是按值传递的(不是地址,我认为它应该)。输出参数未修改。它似乎特定于 MPI 调用。我在一个简单的测试中尝试了同样的事情,我可以在调用范围内更改传入的值。我不确定为什么会这样,因为我认为 Fortran 总是通过地址传递。知道会发生什么吗?
为了清楚起见,注释片段显示了调用是如何进行的。在第一次调用中,c%NSubDomains
是一个输出参数,应该在调用范围内修改,但不是。当我使用数组而不是用户定义类型的成员调用时,它在未注释的代码段中起作用。
fortran - MPI_SCATTER Fortran 矩阵(按行)
按行而不是列分散 Fortran 90 矩阵的最佳方法是什么?也就是说,假设我有一个矩阵 a(4,50),我想将 MPI_SCATTER 分配到两个进程上,其中每个部分都是 alocal(2,50),其中等级 0 有第 1 行和第 2 行,等级 1 有 3 和4. 现在,在 C 中,这很简单,因为数组是行优先的,但在 Fortran 90 中,它们是列优先的。
我试图避免在散射之前使用 TRANSPOSE 来翻转 a(即,内存使用量加倍),我认为 MPI 中必须有一种方法可以做到这一点。会是 MPI_TYPE_VECTOR 吗?MPI_TYPE_CREATE_SUBARRAY?
同样,如果我有一个 3d 数组 b(4,50,3) 并且我想要两个分散的 blocal(2,50,3) 矩阵,如上分布?
string - 读取内容取决于第一个字符的行
在 Fortran 中,阅读的实用方法是什么:
如果第一个字符是“A”,但不读取:
例如,如果第一个字符是“Z”,则休息。
如果我尝试完整阅读该行:
如果缺少数字,则会发生错误。所以我需要一种方法来读取该行上的“A”停留,如果需要其余部分,则取决于读取的“A”或“Z”。
debugging - 没有附加调试器的错误
我正在使用英特尔的 FORTRAN 编译器来编译一个数值库。测试用例在 libc.so.6 中提供了错误。当我附加英特尔的调试器 (IDB) 时,应用程序成功运行。如何调试调试器阻止错误的错误?请注意,gfortran 也出现了相同的错误。
我在 OpenSUSE 11.2 x64 中工作。
错误是:
forrtl:严重(408):fort:(3):数组 B 的下标 #1 的值 -534829264 小于 1 的下限
fortran - Fortran 意图(inout)与省略意图
良好实践规定 Fortran 中的子例程参数每个都应具有指定的意图(即intent(in)
,intent(out)
或intent(inout)
如本问题所述):
但是,不指定意图是有效的 Fortran:
除了编译时检查指定为intent(inout)
的参数和没有指定意图的参数之外,是否有任何真正的区别?如果我将意图改造为旧的、无意图的代码,我应该担心什么?