问题标签 [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.

0 投票
1 回答
252 浏览

fortran - 我是否需要显式接口来在子例程中分配派生类型的组件?

我有一个派生类型:

现在我想bar在没有显式接口的子例程中分配数据:

这似乎与 . 一起工作得很好ifort,但我知道如果 mybar 不是用户定义类型的一部分,我将需要一个显式接口...... ? 此代码与(F90、F95、F2003 ...)兼容的 fortran 标准的哪个版本(如果有)?

0 投票
1 回答
4743 浏览

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?

0 投票
1 回答
443 浏览

multidimensional-array - 从大小数组中分配数组

假设我有一个这样声明的维度数组:

我怎样才能最简单地使用这个数组来分配另一个数组,使用元素dims来指定各个维度的大小?假设第二个数组声明如下:

为什么我不能执行以下操作?

Error: Rank mismatch in array reference当我尝试编译时我得到了。

我意识到我可以做到这一点:

但我正在寻找更容易扩展的东西。

0 投票
2 回答
154 浏览

fortran - 为什么这个 Fortran 模块接口会根据使用了多少个函数而给出不同的结果?

我编写了一个模块,其中包含一个名为“push”的接口,该接口将值推送到可分配数组中。我希望它具有通用行为,以便我可以根据需要将给定类型的新函数添加到“推送”接口。问题在于,随着给定接口的函数数量增加,推送接口的奇怪行为也在增加。

模块代码(push_array.f90):

测试代码(test_push_array.f90):

输出以显示编译器标志:

我的编译器版本:

我的系统:

如果我按照给定的方式运行测试代码,它将进入无限循环并且我的系统内存完全耗尽。我试图通过设置断点来跟踪 gdb 中的测试用例,在第一个循环中我将 i 推到 a 上,但 gdb 无法进入模块函数。

如果我只评论我被推到 a 的第一个测试循环,结果如下:

这些都是意料之中的。

如果我只注释掉将 j 推到 b 上的第二个循环,结果如下:

再一次,正如预期的那样。

当我注释掉将 xp 推送到 c 的第三个循环时,事情开始变得奇怪:

当我注释掉我将 xp8 推到 d 上的第四个循环时,模式继续:

我的问题:

  1. 当我尝试在同一个程序中使用推送接口中定义的所有四个函数时,为什么主测试程序会进入死循环?

  2. 在我注释掉第三个和第四个循环的情况下,为什么 a(100) 和 b(100) 的结果都等于 0?

任何反馈将不胜感激...谢谢!

编辑:

下面给出需要更改的两个函数

0 投票
3 回答
1730 浏览

c++ - 在 C 中为 Fortran 可分配内存分配内存

我们正在尝试接管 C++ 中遗留 Fortran 代码(+100,000 行代码)的内存分配,因为我们使用 C 库在集群上分区和分配分布式内存。可分配变量在模块中定义。当我们调用使用这些模块的子程序时,索引似乎是错误的(移动了一个)。但是,如果我们将相同的参数传递给另一个子例程,我们会得到我们期望的结果。以下简单示例说明了该问题:

你好.f95:

主文件

我们正在编译:

运行 ./main 的输出是

正如你所看到的,A 的输出是不同的,尽管两个子例程都打印了 A(1) 和 A(2)。因此,HELLO 似乎从 A(0) 而不是 A(1) 开始。这可能是因为 ALLOCATE 从未在 Fortran 中直接调用过,因此它不知道 A 的边界。有什么变通办法吗?

0 投票
1 回答
751 浏览

gdb - Fortran:派生类型的可分配数组包含派生类型的数组

我目前正在开发一个大型 Fortran 程序,其中我有一个离散的数值网格,其中包含我在网格范围内跟踪的一系列粒子。为此,我定义了以下三种派生类型:

首先,这是对派生类型的可接受使用(即,具有包含派生类型数组的派生类型的可分配数组)?该代码使用 gfortran 4.8.3 编译得很好。

但是,在 Fedora 下尝试使用 gdb 7.7.1 调试代码时,我遇到了一些奇怪的问题。当试图查看rbin数组元素中的数据时(例如使用),即使我已将数据分配给(例如) print rbin(10)%bpoints,gdb 总是会打印出来。如果我使用例如查看数组元素中的数据,那么我得到的正是我所期望的。有人对这个问题有一些见解吗?(0, 0, 0, 0, 0, 0)bpointsrbin(10)%bpoints = (/1,2,1,2,1,2/)pbinprint pbin(10)%bpoints

0 投票
1 回答
325 浏览

fortran - 在 mpi 中发送带有可分配数组的派生类型数据时出现 seg 错误

我正在尝试在 mpi 中发送带有可分配数组的派生类型数据,但出现了段错误。

这就是我用 2 个进程打印出来的结果:

它似乎得到了负地址偏移。请帮忙。谢谢。

0 投票
3 回答
1065 浏览

memory - 带有可分配数组的子程序调用

在我的代码中,由于我使用的机器存在内存问题,因此我想在传递参数期间分配尽可能少的内存。我的示例代码:

在主程序中,我必须使用堆内存。我还想在我的子程序中使用堆内存。根据我所做的搜索,它给出了运行错误(尝试分配已分配的数组'arrayb')。

因此,我的目的是在我的子例程中也使用堆内存,并在参数从程序传递到子例程期间分配尽可能少的内存,就像上面的代码一样。现在,我想我会做复制作业,但据我所知,这并不好。我检查了模块、接口和包含块,但不清楚哪一个可以通过 allocatabel 数组在内存中节省一些空间。我感谢任何符合我目的的帮助。

0 投票
1 回答
958 浏览

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 中的可分配数组是否存储在堆栈中,而不是堆中?

0 投票
1 回答
142 浏览

arrays - 派生类型访问时间与数组访问时间

我有一个与多维数组或派生类型的访问时间有关的问题。我写了一个运行良好的算法。但是,该算法的主要部分是%通过不同的类型引用一些数据。例如,这是我的代码中最昂贵的循环:

正如您所看到的,大多数时候我通过访问一些变量,%并且大多数数组都有“可分配”的,复数或整数。我读过有时使用派生类型可能会导致计算速度变慢,因此我决定重写我的算法以直接在没有类型的数组上工作。现在只使用数组的相同循环如下所示:

我预计上面的代码会比我使用派生类型的代码运行得更快。所以我检查了时间。以下是这部分代码的 CPU 时间:

  1. 0.1s 为派生类型方法(第一个代码)
  2. 数组方法需要 3.2 秒(第二个代码)(慢约 30 倍)

-O2在编译期间只使用该选项和 ifort 英特尔编译器。在上面的代码 no_elems >> no_fl 中,大多数数组和类型都很复杂。很明显,两种算法的唯一区别是内存访问时间。

为什么这两种情况的执行时间存在巨大差异?

编辑#1

我试图做一个简短的例子,但是我无法像使用完整代码一样获得类似的结果......两种情况的时间几乎相同——数组稍微快一点。

我可以向您展示对我来说完全陌生的东西:我有一个类型:

然后,在一个大循环的某个时刻,我计算如下值:

在哪里:

elOld 是以另一种类型定义的元素数组

然后我有我已经向你展示过的循环,但如果我会这样做:

而不是:

程序变得明显变慢了...(使用 type(elemen) :: tmp_element),这意味着访问简单数组 e_Gxa(:) 比访问类型数组中的复杂变量 Gxa 慢,即 this%elOld(:)%甲。仅更改几行代码可能会更改可见的执行时间。我已经用 gfortran 检查了它,但结果是一样的。这是我正在谈论的完整代码的一部分:modskminv_fast.f90。很抱歉发布完整的模块,但是当我将代码分成小块时,我无法获得相同的结果。