问题标签 [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.
fortran - 为什么常见的块变量不会保留它们的值?
首先,我知道在 fortran(和一般编程)中使用公共块是一个坏主意。但是,我正在更新别人的代码,我不想弄乱已知有效的东西。
其次,我知道我应该发布一些更具体的内容。如果我知道如何将其减少为小东西,我会的。但是,由于我知道,而且我认为您不会欣赏 2500 行代码,因此我无法发布具体示例。
考虑到这一点,我无法描述我的问题。
我正在更新别人的 fortran 代码。这家伙使用了几 (4) 个通用块来设置全局变量。出于某种原因,当我调用使用这样一个块的函数时,它的所有值都是 0。以前有人遇到过吗?有谁知道为什么会发生这种情况?如何重现这个?检查这一点的任何起点都会有所帮助。
对于它的价值,所述公共块被声明为
block
是一个 4D 数组。x
, y
, 和z
是一维数组。llx
, lly
, 和llz
, 是double precision
类型。其余的都是integer
类型。
在调用任何函数之前,在主程序中声明和初始化公共块。
fortran - 从 Fortran 77 代码(公共块和等价的组合)转移到 Fortran 90
在 Fortran 77 代码中,有共同块和等价语句的组合使用。例如,
谁能提供一个可行的解决方案,将这种 Fortran 77 代码转换为 Fortran 90 代码?
fortran - Fortran 77 -> Fortran 90+:常见块,MPI_Bcast
我正在将 F77 程序重构为更新的 Fortran 标准(90 甚至更新)。
我有一个模块,其中定义了一些变量。这些变量当前被放入公共块中,因为在外部子程序中,所有这些变量仅使用一个 MPI_BCAST 调用并利用该公共块中变量的连续存储来广播。
问题是公共块的长度com_length
是手动计算的,容易出错。如果缺少 COMMON 块定义,调试将需要很长时间,因为即使 valgrind 也不会注意到 OOB。另一方面,为每个变量单独调用 MPI_BCAST 会对性能产生负面影响。
我会很感激你关于如何重构它的建议。
fortran - 将 F77 公共块更改为 F90 或 F95
我有一个旧的 fortran 程序,像这样
我想把它转换成fortran 90或95。我不知道blc0、blc1和blc2是什么意思。最后一行的 1 和 ro_ks 是什么意思?任何人都可以将其更改为 fortran 90 或 95,好吗???
fortran - How can I share user space static memory with a PCI device?
Context
Hi, I'm porting an ancient 1977 flight simulator program from a SEL computer to a Windows 7 x64 PC system. The program is 500.000 lines written in Fortran, with a large /common/ memory block that is accessed across all modules. This memory is allocated statically.
Additionally, and there my problems begin, there is also a hardware device, that used to access the /common/ block using DMA. We've successfully ported the hardware device to a FPGA PCI device, written a device driver for it and DMA works well.
The problem:
I want to share the static memory of the Fortran application with the PCI device.
Possible solutions
Things I have considered:
Allocate memory in the driver and re-map the user space Fortran common block to that area.
Lock the user space common block in physical memory and tell the PCI device where to read/write.
My preference would be the fist option, because that will avoid lifetime issues. So far I haven't found an acceptable solution. Any tips you could share with me?
Henk.
Note: we have full control over hardware and driver, since we built it ourselves, so exotic ideas might help too...
fortran - 使用 MPI_Bcast 传递 3d 数组
我正在尝试使用MPI_Bcast
. v1
是一个普通的块数组。我也不确定是否需要将公共数组的计算值广播v1
给所有其他进程,否则它们会因为通用而在每个进程中更改。以下是相关的一段代码:
我收到错误消息:
传入的数组的大小是正确的。任何意见?
我更正了代码并遍历了排名并计算了每个排名中 rcount 和 displs 的所有元素:
但仍然是错误的结果。1-在我的情况下,每个部分的结果都用于下一部分,尤其是在之后。所以mpi_allgatherv
我需要在每个部分之后添加mpi_barrier
吗mpi_allgatherv
?2-应该使用 mpi_in_place 吗?考虑我只有一个 3d 数组v1
,每个子数组v1(1,1,i)
都是通过某个过程计算的,我想将计算出的子数组放在同一数组的适当部分。3-我想我应该displs(i) = sum(rcount(1:i-1))+1
为 i=>2 考虑到在 fortran77 中总是 displs(1)=1。所以我更正了这一点:循环之前,循环displs(1)=1
内部和循环displs(rank+2)=rank*scount+1
之后displs(nprocz+1)=0
。我对吗?
gcc - Fortran 77 抱怨常见块
我在 FreeBSD 9.2 上使用 gfortran 4.8.2 来创建一些可执行文件。有三个文件,一个 C 文件和两个 Fortran 77 文件,其中我使用两个例程和一个公共块。
问题是我从 gfortran 编译器收到多个定义的错误。
我发送到服务器的请求:
di8810.c
gds100.f
gds102.f
错误是:
它快把我逼疯了。有任何想法吗?
fortran - Fortran 中 SAVE 和 COMMON 一起使用的目的
Fortran 中的公共块是否用于全局变量的目的?
如果是这种情况,那么这些值可以通过子程序修改吗?
将SAVE
在子程序中存储修改后的参数以供子程序内部以外的用途使用?
parallel-processing - 将变量直接传递到线程子程序
我有一个教科书示例,演示了通过参数修复数据范围。我想知道为什么在下面的代码片段中作者使用 COMMON 块来定义两个变量,istart和iend,** 应该是每个线程私有的?具有 COMMON 属性的变量的“共享”属性与作者将 **istart和iend指定为私有的意图是否冲突?还是我们应该简单地删除公共块?
作者说:“我们使用一个名为 bounds 的通用块,其中包含 istart 和 iend,本质上包含主程序和子程序中使用的值。” 我想知道公共属性是否会被每个线程的调用子例程继承并干扰istart和iend应该承担的“私有”属性。
李
在另一个示例中,作者出于相同目的编写了以下代码片段。在这种情况下,我应该在主程序和子程序中都保留公共块,对吗?
如果我喜欢以现代方式传递变量istart和iend,我是否正确地进行了以下修订(这对我来说看起来有点奇怪,因为 threadprivate 子句的参数不是公共块的名称):
module - 将公共块转换为模块
我是一名研究人员,正在使用用 Fortran 编写的程序。我有非常基本的编码技能,所以我需要一些帮助才能正确编译一些代码。
在显示代码之前,我将提供一些背景知识。我正在处理大量数据,这将需要 64 位编译和大于 2 GB 的内存。我在代码中注意到的第一件事是许多变量被写成“真实”,但在我的研究中我发现“双精度”允许更大的变量,并且会是一个更灵活的选择,所以我改变了所有“真实”变量到“双精度”变量。
还有一个包含在 fortran 构建文件“dist.f”的编译中的文件,称为“geocoord.inc”。我发现变量被保存到一个公共块中,但我再次需要可以容纳大量数据的东西。正如我被引导相信的那样,一个模块将是一个更好的程序。我需要一些建议来将此包含文件转换为与模块程序一起正常工作,我将在下面列出。
区 f:
Geocoord.inc:
感谢您提供的任何建议,并为我对 Fortran 的所有事情的相对无知表示歉意!