问题标签 [fortran-common-block]

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 投票
2 回答
424 浏览

fortran - 从电站 (4) 移植到英特尔 fortran 编译器 (11/2003)

将fortran代码从电站移植到fortran编译器(2003)时,我需要注意哪些必要条件?

我观察到的是,在电站中,所有变量都被视为全局变量(甚至局部变量也是如此)。与 intel fortran(2003) 一样,它们具有单独的本地和全局范围。所以我需要将所有局部变量设置为全局变量。在fortran 2003中是否有任何选项(来自属性)可以将所有局部变量设为全局变量。因为我的代码中有数百个变量。与其将所有局部变量分配给全局(在 COMMON 块中的意思),任何人都可以提出一个好的解决方案吗?

除此之外,在将代码从 powerstation 移植到 intel fortran 编译器(11/2003)时,我还需要注意任何其他问题吗?

0 投票
2 回答
1275 浏览

fortran - Fortran 中的常见块用法

我是 Fortran 新手,只是为工作做一些简单的事情。作为一个新程序员,一般来说,不确定这是如何工作的,如果我的解释或符号不是最好的,请原谅。在 .F 文件的顶部有常见的声明。向我解释它的人说把它想象成 C 中的结构,并且它们是全局的。同样在同一个 .F 文件中,他们用什么类型声明了它。所以它是这样的:

然后当我实际看到它在其他文件中使用时,他们声明局部变量(例如 SOMEVAR_LOCAL)并根据条件设置 SOMEVAR_LOCAL = 1 或 0。

然后还有另一个条件稍后会说类似

(如果这不是正确的 Fortran,我再次道歉,但我现在无法访问代码)。所以在我看来,有一个类似于“结构”的变量,叫做 SOMEVAR,它有一定的长度(2 个字节的数据?),然后有一个局部变量用作标志,这样以后就可以使用全局变量了struct SOMEVAR 可以设置为该值。但是因为有(PARAM),它就像那个特定实例的数组?谢谢。抱歉我的解释不好,但希望您能理解我的要求。

0 投票
1 回答
1135 浏览

dll - 公共块、FORTRAN 和 DLL

我是一名编程的建模师……我永远不会称自己为程序员,但我使用 C# 和 FORTRAN 进行编程。我有一个 FORTRAN 模型,我通过 dll 连接到一些 C# 代码。我发现我必须有一个公共块才能将变量保存在 dll 的内存中。我还发现我不能使用多个包含语句......我的公共变量的包含文件都是未标记的。Chapman (2008) “科学家和工程师的 FORTRAN 95/2003”声明“不应该使用未标记的 COMMON 语句......”。

如何确保我的公用文件中没有损坏的内存?我想我可以进行实验,但我希望对此有一些合理的建议。我在 Microsoft Visual Studio 2008 中使用 Lahey-F 版本 7.2

任何人,有什么想法吗?

0 投票
1 回答
583 浏览

fortran - 整数和内存容量的块或变量定义

有谁知道这个问题,我有一个代码可以很好地运行 3000 元素网格但是当我想为 17000 元素网格运行它时,它会显示这个错误:一个公共块或变量可能不超过 2147483647 字节

这是部分代码:

它显示了错误

为什么会这样?

0 投票
1 回答
3568 浏览

fortran - 如何使用 *.h 文件编译此旧版 FORTRAN 77 代码?

我有一组构成 FORTRAN 代码的 .F 和 .H 文件。我在编译 .H 文件时遇到了麻烦。.H 文件包含一堆公共块。.H 文件之一的示例是:

当我在谷歌上搜索答案时,据说 .h 文件是 c/c++ 文件,但它们看起来不像是用 c/c++ 编写的。gfortran 似乎也认为它们是 C 文件。

当我尝试编译时:

gfortran-4.5 -fdefault-real-8 -fbacktrace -fno-align-commons HEAD.h

我得到错误:

我试图注释掉第一行 '*AC HEAD',但错误是关于在 *. 我是否需要在最后一列中使用 HEAD # 值来注释它,我是否需要使用 C++ 编译器构建 .H 文件或什么?

0 投票
4 回答
480 浏览

function - Fortran:如何在公共块中传递函数名

在 Fortran 中,是否可以将函数放在一个公共块中,如下所示:COMMON /myblock/ func(其中 x 是某个变量,func 是一个函数)。

我的问题是我想创建一个函数 s(x),它调用外部函数 func(x) 但没有在 s(x) 中传递 func。对于我的项目,s(x) 必须是只有一个变量的函数,即我不想这样做:function s(x,func) s=func(x)

相反,我希望我能做到:function s(x) common /myblock/ func s=func(x)

或者,如果有人对使用模块或其他东西有其他建议,那就太好了。

提前感谢您的帮助。

○。

然后在调用 s(x) 的子例程中具有相同的公共 (myblock)。

0 投票
1 回答
278 浏览

fortran - 变量在调用子程序后奇怪地取零值

我在尝试将以前用 compaq visual fortran 6.6 编译的代码转换为 gfortran 时遇到了一些问题。
这是我在 gfortran 中遇到的一个具体问题:
有一个名为“et”的变量,其值为 3E+10。然后程序调用一个子程序。“et”没有出现在子程序中,但在回到主程序后,它现在的值为 0。
当使用 compaq visual fortran 进行编译时,我没有遇到这个问题。
我正在编写的代码是一个巨大的科学程序,所以我只在下面放了一小部分:

: "et" 保持良好的值,直到调用子程序 "perm" 之前。就在这个子程序之后,它的值为零。
“et”不在任何公共块中
这段代码是由几个不同子例程调用的子例程的一部分。更奇怪的是,当在代码的其他部分调用它时,我没有这个问题(“et”保持它的值)
所以如果有人遇到过这种问题或对此有任何想法,我会不胜感激

0 投票
3 回答
4702 浏览

performance - 可分配数组性能

有一个程序的 mpi 版本,它使用 COMMON 块来存储通过代码到处使用的数组。不幸的是,没有办法以 COMMON 块大小声明数组,只有运行时才知道该数组的大小。因此,作为一种解决方法,我决定将这些数组移到接受 ALLOCATABLE 数组的模块中。也就是说,COMMON 块中的所有数组都消失了,而是使用了 ALLOCATE。所以,这是我在程序中唯一改变的地方。不幸的是,该程序的性能很糟糕(与 COMMON 块的实现相比)。对于 mpi-settings,每个计算节点上都有一个 mpi-process,每个 mpi-process 都有一个线程。我发现了类似的这里提出的问题但不认为(不明白:))如何将其应用于我的案例(每个进程都有一个线程)。我很感激任何帮助。

这是一个简单的例子,它说明了我在说什么(下面是一个伪代码):

“源文件”:

如您所见, ZEROSET() 没有并行或 MPI 的东西。FILE_1.INC, FILE_2, ... , FILE_N.INC 是在 COMMON 块中定义 ARRAY_1, ARRAY_2 ... ARRAY_N 的文件。类似的东西

其中 NX、NY、NZ 是在 PARAMETER 指令的帮助下定义明确的参数。当我使用模块时,我只是销毁了所有 COMMON 块,所以 FILE_I.INC 看起来像

然后将上面的“INCLUDE 'FILE_I.INC'”语句更改为“USE FILE_I”。实际上,当执行并行程序时,一个特定的进程不需要整个(NX,NY,NZ)域,所以我计算参数然后分配 ARRAY_I(仅 ONCE!)。

子程序 ZEROSET() 使用 COMMON 块执行 0.18 秒,使用模块执行 0.36 秒(当数组的维度在运行时计算时)。因此,性能恶化了两倍。

我希望现在一切都清楚了。我非常感谢你的帮助。

0 投票
1 回答
381 浏览

fortran - Fortran 中的常用块

Fortran 在公共块中有公共块吗?就像结构中有结构一样。例如

上面的代码是不是表示common2,in within common1?

0 投票
1 回答
458 浏览

c - C-Fortran 混合编程

我正在做一个项目,我必须在 C 中使用 Fortran 库。在 Fortran 库中,有一个包含复杂 *16、4x4 数组的公共块。现在在 C 中,复变量只是一个包含两个元素的结构,由于它是复数 *16,因此元素应该是 long double,这是 Fortran 中对应的 C 数据类型。所以我有一个带有两个长双打的结构。

我要访问这个数组的元素。好消息是,我已经可以与库的所有其他常见变量一起执行此操作。问题是我从数组中导入的元素是,

1) 没有按应有的顺序排列,“即使在考虑到 C 和 Fotran 的数组结构的差异之后”。

2)虽然大多数元素是正确的,但有两个与它们应该是完全不同的。

3)只有当我使用双而不是长双时,我才能得到正确的元素(除了两个)。当我使用 long double (和正确的字符转换)时,我得到了完全不同的东西,这清楚地表明了转换的问题。

我已经用尽了所有的解释,但没有任何效果。我在 C 中打印数组的代码如下:

附加信息:因为我必须混合 Fortran 对象文件,所以我使用 gfortran 来编译 C 文件。如果我改用 GNU C 编译器,它会抛出关于无法识别 gfortran 例程的错误。这也可能是问题的根源,可能是 gfortran 无法识别 C 中的长双精度数。

任何帮助都会很有用。