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

module - 在 Fortran 90 中使用通用块和模块在内存方面是否存在差异

我最近在没有任何指导的情况下学习 Fortran,并尝试了不同的版本。我从这个网站发现:

MODULE 比 COMMON 块好吗?

几乎总是是的。使用 COMMON 块的唯一原因是如果您希望在只有 FORTRAN 77 编译器的计算机上使用您的程序(它们仍然存在),或者如果您控制数据在内存中存储的顺序非常重要。

好吧,使用模块在语法上肯定比使用通用块更甜。但是在这两种情况下,内存使用和分配有什么区别?它在性能和访问速度方面也有影响吗?这个问题有意义吗?

0 投票
1 回答
370 浏览

fortran - Fortran 77 中的字符数组尺寸标注混淆

我的子程序中有以下代码:

好吧,我实际上并没有写这个。所以我不了解这里的尺寸。是y一个 999 元素宽的 80 个字符的长字符串数组吗?

如果是这样,我如何在没有公共块的情况下在 Fortran 90 中正确定义它?

0 投票
0 回答
840 浏览

c++ - 加载没有 RTLD_PRIVATE 或多个副本的共享库的两个实例

在 C++ 中,我需要运行使用 COMMON BLOCK 变量的旧 FORTRAN 库(我无法控制)的多个实例。我可以按照问题 3433522的规定成功地做到这一点,在那里我创建了库的 2 个物理副本,并在运行时使用dlopen(参见下面的示例代码)加载这些副本。

但是,我想避免创建库的两个物理副本,因为它可能相当大。正如问题 3433522中所建议的,使用RTLD_PRIVATE会起作用,但这在libgcGCC 中不可用(据我所知)。我也研究过使用RTLD_DEEPBIND而不是RTLD_LOCAL,但这没有区别。知道如何使用 GCC 来实现这一点吗?

我的示例代码如下:

  1. 生成文件

    /li>
  2. gen.f

    /li>
  3. 运行.cpp

    /li>
0 投票
3 回答
2288 浏览

c++ - C++ 中的公共块等价物

我正在尝试将旧的 Fortran 77 代码转换为 C++,并且大多数变量都在 Common 块中声明,例如:

据我了解,通用块仅用于使变量在整个程序中的不同子例程中可访问。因此,在 C++ 程序中,我是否能够使用变量(在主程序之外)创建结构并以这种方式将变量作为结构的成员调用?

0 投票
1 回答
318 浏览

c++ - C ++ - 将数据传递给结构

我正在将 Fortran 77 代码翻译成 C++,而 Fortran 77 使用通用块。我正在尝试用结构替换公共块,然后我将用函数中的值填充这些块,然后调用两者以在我的主程序中使用。目前我的代码如下所示:

这只是一个测试,因为目前我的 main 除了打印一个值之外什么也没做。我想要的是在我的data函数中给定值的变量能够在整个代码中使用。目前,有两件事我很困惑:

1) 我的Pierson-Moskowitz功能没有为 Ug 打印任何内容。我不明白为什么不呢?2)我不确定我什至需要这个data功能。本质上,我正在翻译的 Fortran 代码使用子例程将值分配给公共块中的变量。我正在尝试通过使用结构然后使用函数来填充值来做类似的事情。

这段代码很短,我打算将所有内容都保存在一个文件中。任何帮助都非常感谢!

0 投票
1 回答
254 浏览

fortran - Fortran 77 代码中 EQUIVALENCE 语句的问题

我正在努力让光线追踪代码正常工作,我想我可能已经隔离了这个问题。我是使用 Fortran 77 的新手,但想获得更多使用这种语言的经验(即使它已经过时了)。我在其中一个子例程中有一些 EQUIVALENCE 语句,可用于将变量传递到子例程中(这可能是问题的一半)。

子程序:

在调用子例程或条目 ELECTX 之前,我在 RINDEX 子例程/条目中放置了一些打印语句。
我在调用 RINDEX 之前检查了一些输入

我从这段代码中得到的是:

所以这是一种冗长的询问方式——发生了什么事?例如,我希望像 f 这样的变量被传递到子程序 QPARAB 中,所以当我在子程序中打印时,我希望看到 F = 7。我可能从根本上误解了一些简单的东西。正如我所提到的,我似乎无法将 F 之类的变量放入子例程 QPARAB 中,这实际上是一个大问题,因为以下计算结果为 0 或 NaN。我希望它有一些价值。所以也许数据没有以某种方式进入?在某种程度上,其他一切(此时)似乎都在起作用。

这段代码来自哪里:

我正在使用一个小的 shell 脚本(这可能是一团糟):

我正在使用的 g77 例程下载于:http ://hpc.sourceforge.net/最后我使用 gfortran 得到了同样的错误,

0 投票
1 回答
1888 浏览

fortran - fortran中的随机数生成器

我正在测试链接中提到的 RNG 代码(fortran 77 代码):
https
://www.cisl.ucar.edu/zine/96/spring/articles/3.random-6.html 它应用了 Park & Miller 算法.

程序的函数调用是

然而,该程序似乎没有响应 srand() 的播种,即 x 值不受初始播种的影响,并且始终等于 ~0.218。我怀疑这与公共块和数据块的定义有关,因为x的值相当于将种子放置为123456789,这是数据块中定义的初始化值。

有任何想法吗?

我正在用 gfortran 编译。

0 投票
1 回答
1870 浏览

fortran - 将公共变量传递给 Fortran 中的子例程

我正在定制一个商业代码,它深度使用公共块来定义全局变量。

我想做的是只将其中一个变量传递给子例程,但不包含,因为我不需要其他几个定义为通用的变量。

我发现这样做的唯一方法是先前定义一个新的局部变量,为其分配全局变量的值,然后将新变量传递给子例程,但我不喜欢这种继续方式。

是否有解决方案告诉 Fortran 在将变量传递给子例程时将其转换为本地变量?

这里有一个例子:

主程序:

子程序:

0 投票
1 回答
520 浏览

arrays - 具有数组大小的 Gfortran COMMON 块

我想在 gfortran 上编译的旧 fortan 代码遇到一些问题。

代码的问题在于该函数假定 RE 是一个大小为 NEQ 的数组。但是,我无法事先指定数组的大小,因为它来自公共块。

由于代码很长,我希望在不使用模块变量的情况下修复 yhis。我可能想尝试的一件事是将 NEQ 作为参数插入,而不是通过公共块获取它。

0 投票
2 回答
939 浏览

c - 可见性、Fortran 公共变量、共享库的运行时加载

环境:Intel Linux,Red Hat 5。编译器:gcc 3.4.6(旧东西,具有严重基础设施的遗留环境,抱歉)

我有从 Fortran 派生的特定共享库的多个版本(称之为“shared_lib.so”),其中包含一个 COMMON 块和各种计算,并引用了该 COMMON 中的变量。

我需要能够(从最终产品可执行文件中其他地方的 C 代码)在运行时使用 dlclose() 和 dlopen() 在这个库的版本之间切换(其中所有版本的 COMMON 内容都是相同的)。在某些情况下,相同的 COMMON 也出现在作为静态库(称为“static_lib.a”)的一部分的代码中,该库也链接到可执行文件中,并且与我的项目分开维护,但具有与我的共享库。

我似乎看到 COMMON 的多个实例最终出现在可执行文件中,并且(更重要的是)静态库中实例中的变量值与中“相同”变量的值之间没有联系使用 dlopen() 拉入的共享库中的实例。

总之,我需要的是(在整个可执行文件中)加载 dlopen() 的 shared_lib.so 能够在 COMMON ABC 中设置/使用变量 XYZ,以及 static_lib.a 中的代码设置/使用 XYZ,并使其实际上是 XYZ 的同一个实例,或者至少使两者保持同步。这可能吗?

我对 shared_lib.so 中源代码的编译命令格式如下:

我构建 shared_lib.so 的命令形式如下:

我构建可执行文件的命令格式如下:

我需要从表单的 C 代码中做一些事情:

初始启动配置在所需变量方面确实似乎运行正常,但后续 dlclose() 和 dlopen() 序列的结果却没有。也许根本问题是 dlopen() 缺乏 gcc 在链接时拥有的一些智能。