问题标签 [allocatable-array]
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 - 我是否需要显式接口来在子例程中分配派生类型的组件?
我有一个派生类型:
现在我想bar
在没有显式接口的子例程中分配数据:
这似乎与 . 一起工作得很好ifort
,但我知道如果 mybar 不是用户定义类型的一部分,我将需要一个显式接口...... ? 此代码与(F90、F95、F2003 ...)兼容的 fortran 标准的哪个版本(如果有)?
fortran - `Allocatable array must have deferred shape` when moving from g95 to gfortran
When transitioning from using the g95 compiler to gfortran I get the following error when I try to compile what previously had been a working code
This happens in all of my subroutines for all of my allocatable arrays. An example is below.
How can I make this code compile with gfortran?
multidimensional-array - 从大小数组中分配数组
假设我有一个这样声明的维度数组:
我怎样才能最简单地使用这个数组来分配另一个数组,使用元素dims
来指定各个维度的大小?假设第二个数组声明如下:
为什么我不能执行以下操作?
Error: Rank mismatch in array reference
当我尝试编译时我得到了。
我意识到我可以做到这一点:
但我正在寻找更容易扩展的东西。
fortran - 为什么这个 Fortran 模块接口会根据使用了多少个函数而给出不同的结果?
我编写了一个模块,其中包含一个名为“push”的接口,该接口将值推送到可分配数组中。我希望它具有通用行为,以便我可以根据需要将给定类型的新函数添加到“推送”接口。问题在于,随着给定接口的函数数量增加,推送接口的奇怪行为也在增加。
模块代码(push_array.f90):
测试代码(test_push_array.f90):
输出以显示编译器标志:
我的编译器版本:
我的系统:
如果我按照给定的方式运行测试代码,它将进入无限循环并且我的系统内存完全耗尽。我试图通过设置断点来跟踪 gdb 中的测试用例,在第一个循环中我将 i 推到 a 上,但 gdb 无法进入模块函数。
如果我只评论我被推到 a 的第一个测试循环,结果如下:
这些都是意料之中的。
如果我只注释掉将 j 推到 b 上的第二个循环,结果如下:
再一次,正如预期的那样。
当我注释掉将 xp 推送到 c 的第三个循环时,事情开始变得奇怪:
当我注释掉我将 xp8 推到 d 上的第四个循环时,模式继续:
我的问题:
当我尝试在同一个程序中使用推送接口中定义的所有四个函数时,为什么主测试程序会进入死循环?
在我注释掉第三个和第四个循环的情况下,为什么 a(100) 和 b(100) 的结果都等于 0?
任何反馈将不胜感激...谢谢!
编辑:
下面给出需要更改的两个函数
c++ - 在 C 中为 Fortran 可分配内存分配内存
我们正在尝试接管 C++ 中遗留 Fortran 代码(+100,000 行代码)的内存分配,因为我们使用 C 库在集群上分区和分配分布式内存。可分配变量在模块中定义。当我们调用使用这些模块的子程序时,索引似乎是错误的(移动了一个)。但是,如果我们将相同的参数传递给另一个子例程,我们会得到我们期望的结果。以下简单示例说明了该问题:
你好.f95:
主文件
我们正在编译:
运行 ./main 的输出是
正如你所看到的,A 的输出是不同的,尽管两个子例程都打印了 A(1) 和 A(2)。因此,HELLO 似乎从 A(0) 而不是 A(1) 开始。这可能是因为 ALLOCATE 从未在 Fortran 中直接调用过,因此它不知道 A 的边界。有什么变通办法吗?
gdb - Fortran:派生类型的可分配数组包含派生类型的数组
我目前正在开发一个大型 Fortran 程序,其中我有一个离散的数值网格,其中包含我在网格范围内跟踪的一系列粒子。为此,我定义了以下三种派生类型:
首先,这是对派生类型的可接受使用(即,具有包含派生类型数组的派生类型的可分配数组)?该代码使用 gfortran 4.8.3 编译得很好。
但是,在 Fedora 下尝试使用 gdb 7.7.1 调试代码时,我遇到了一些奇怪的问题。当试图查看rbin
数组元素中的数据时(例如使用),即使我已将数据分配给(例如) print rbin(10)%bpoints
,gdb 总是会打印出来。如果我使用例如查看数组元素中的数据,那么我得到的正是我所期望的。有人对这个问题有一些见解吗?(0, 0, 0, 0, 0, 0)
bpoints
rbin(10)%bpoints = (/1,2,1,2,1,2/)
pbin
print pbin(10)%bpoints
fortran - 在 mpi 中发送带有可分配数组的派生类型数据时出现 seg 错误
我正在尝试在 mpi 中发送带有可分配数组的派生类型数据,但出现了段错误。
这就是我用 2 个进程打印出来的结果:
它似乎得到了负地址偏移。请帮忙。谢谢。
memory - 带有可分配数组的子程序调用
在我的代码中,由于我使用的机器存在内存问题,因此我想在传递参数期间分配尽可能少的内存。我的示例代码:
在主程序中,我必须使用堆内存。我还想在我的子程序中使用堆内存。根据我所做的搜索,它给出了运行错误(尝试分配已分配的数组'arrayb')。
因此,我的目的是在我的子例程中也使用堆内存,并在参数从程序传递到子例程期间分配尽可能少的内存,就像上面的代码一样。现在,我想我会做复制作业,但据我所知,这并不好。我检查了模块、接口和包含块,但不清楚哪一个可以通过 allocatabel 数组在内存中节省一些空间。我感谢任何符合我目的的帮助。
memory-management - 用户定义类型的 Fortran 可分配数组成员
在以下简单程序中,我在派生类型的可分配数组成员处遇到分段错误。此分段错误仅发生在我尝试过的另一台机器(在 openSUSE 上使用 Intel Fortran 14.0.3)上,但不会出现在另一台机器上(在 Ubuntu 上使用 Intel Fortran 14.0.2)。此外,如果我更改程序中的整数参数之一,程序将正常结束。
有人可以重现这个问题吗?谁能告诉我代码有什么问题?
下面是三个源代码文件。
main_dbg.f90
.. 是否发生分段错误取决于此文件中的n1
和值。n2
strange.f90
.. 分段错误发生在forall
此文件中的构造处。
tktype.f90
下面是一个 shell 脚本,用于编译上面的源代码并运行生成的可执行文件。
compile_run.sh
标准输出如下所示。
编辑 2016-01-30
我发现
ulimit -s unlimited
在的开头(之后#/bin/bash
)添加compile_run.sh
可以防止分段错误。fortran 中的可分配数组是否存储在堆栈中,而不是堆中?
arrays - 派生类型访问时间与数组访问时间
我有一个与多维数组或派生类型的访问时间有关的问题。我写了一个运行良好的算法。但是,该算法的主要部分是%
通过不同的类型引用一些数据。例如,这是我的代码中最昂贵的循环:
正如您所看到的,大多数时候我通过访问一些变量,%
并且大多数数组都有“可分配”的,复数或整数。我读过有时使用派生类型可能会导致计算速度变慢,因此我决定重写我的算法以直接在没有类型的数组上工作。现在只使用数组的相同循环如下所示:
我预计上面的代码会比我使用派生类型的代码运行得更快。所以我检查了时间。以下是这部分代码的 CPU 时间:
- 0.1s 为派生类型方法(第一个代码)
- 数组方法需要 3.2 秒(第二个代码)(慢约 30 倍)
我-O2
在编译期间只使用该选项和 ifort 英特尔编译器。在上面的代码 no_elems >> no_fl 中,大多数数组和类型都很复杂。很明显,两种算法的唯一区别是内存访问时间。
为什么这两种情况的执行时间存在巨大差异?
编辑#1
我试图做一个简短的例子,但是我无法像使用完整代码一样获得类似的结果......两种情况的时间几乎相同——数组稍微快一点。
我可以向您展示对我来说完全陌生的东西:我有一个类型:
然后,在一个大循环的某个时刻,我计算如下值:
在哪里:
elOld 是以另一种类型定义的元素数组
然后我有我已经向你展示过的循环,但如果我会这样做:
而不是:
程序变得明显变慢了...(使用 type(elemen) :: tmp_element),这意味着访问简单数组 e_Gxa(:) 比访问类型数组中的复杂变量 Gxa 慢,即 this%elOld(:)%甲。仅更改几行代码可能会更改可见的执行时间。我已经用 gfortran 检查了它,但结果是一样的。这是我正在谈论的完整代码的一部分:modskminv_fast.f90。很抱歉发布完整的模块,但是当我将代码分成小块时,我无法获得相同的结果。