问题标签 [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 - 用于可分配数组的 Openmp 并行工作共享
我想对 Fortran 90 中的数组进行一些元素计算,同时使用 openmp 并行化我的代码。我现在有以下代码:
我现在想用可分配数组替换静态数组 x 和 r,所以我输入:
但是该程序以串行方式运行而没有错误,并且编译器不考虑“!$ omp并行工作共享”这一行。
在这种情况下,我应该使用哪些选项来并行化?我尝试过omp parallel do
使用循环,但速度要慢得多。
我在 windows 上用 gfortran 5.1.0 编译我的代码:
arrays - Fortran:选择可分配数组的等级
我正在尝试编写一个程序,我希望可分配数组A
的等级为 1、2 或 3,具体取决于我在运行时的输入。我想这样做是因为后续的操作A
是相似的,并且我在一个模块中定义了一个work
带有模块过程的接口,当它被执行时A
,会给出所需的结果。
我目前正在做的是这样的:
如果我能以某种方式选择 的等级,事情会容易得多A
,因为这样就if
不需要这些陈述了。也许这是不可能的,但感谢所有帮助。
fortran - Recover storage of NON-allocatable large arrays in Fortran
The deallocate statement is used to recover storage of an allocatable array that is no more needed. What about non-allocatable arrays? Suppose (in the main and only program) there is a declaration like
This array is used once and then no more. What if I want to make it's space free?
pointers - 指向包含可分配数组的派生类型的指针
一般来说,我想重命名通过子例程参数传递的派生类型中的可分配变量。用 'derived%type_xx' 写所有东西并不是那么令人愉快。此外,我不想花费额外的内存将派生类型的值复制到一个新变量,这会花费新分配的内存。此外,由于许多原因,我知道可分配数组比指针更受欢迎。我尝试定义指向可分配变量的指针,但失败了。我尝试这样做是因为我想简化我的代码,既要可读又不要太长。我想知道是否有实现目标的方法?谢谢。
这是演示代码:
这就是失败的原因:
这似乎是一个小问题,但我想在未来阅读我的代码而不会感到太多痛苦。那么最好的选择是什么?非常感谢。
data-structures - 如何将可分配的用户定义(派生类型,数据结构)变量的大小传递给fortran中的子例程?
我想创建一个派生类型变量(又名结构或用户定义的变量),在一个子程序中计算它并在另一个子程序中使用它。该结构的两个组件都是可分配的数组。我想知道如何告诉子程序这些数组的大小。我知道如何使用派生类型执行此操作的唯一方法是在分配时,但我只能分配一次。非派生类型的可分配数组在子例程的开头和接口中被声明为特定大小:
但是我该如何为派生类型的数组做到这一点呢?
如果它们有用,请提供更多详细信息:我确实有一个模块:
主代码和子程序都使用它并使用新类型定义我的变量:
我还有一个界面,我把它放在我的主要代码的开头:
我尝试在主代码中分配结构变量的组件
但是当我在写入该变量时运行具有较大值 n 和 m 的代码时遇到了麻烦(无效写入,地址在堆栈 1 上)。所以我尝试在创建它的子例程中分配它,然后当另一个子例程尝试读取它时导致无效读取。(尽管这两个问题仅在大型系统和使用 valgrind 时才明显。)
我可以通过将结构变量的组件作为常规变量传递给第二个子例程来运行代码,而不是传递完整的结构。“但它应该能够与结构变量一起使用!!”
arrays - 将可分配数组的子数组传递给具有右边界的子例程
在我正在编写的并行程序中,我定义了许多多维数组(实际上只是 1D、2D 或 3D),它们在执行期间allocatable
分配有负下限。我这样做的原因是,在2D示例中,每个进程处理14 x 14矩阵并与 四个相邻进程共享2层A
的重叠,因此矩阵分配有 bounds ,其中“内部”部分该矩阵对应于从 1 到10的索引。(斜体代表选择/输入依赖)。(-1:12,-1:12)
问题是在这样做时我没有意识到不可能依赖这个 Fortran2003 功能,因此不可能call mysub(A(:,i),...)
在调用者单元A
中使用实际边界(-1和12 ),因为A(:,i)
它是一个表达式,而不仅仅是一个变量。
如果我将整个数组传递A
给子程序,问题就解决了,正如前面链接的答案中所解释的那样,但这将迫使我编写一个“更大”且不那么通用的子程序,相反,它意味着对一个维子数组。
是否可以通过子程序知道实际变量边界的方式将数组的子allocatable
数组(例如)传递给子程序?A(:,1)
fortran - 从名称列表中读取可分配数组
我正在使用 GNU Fortran (GCC) 4.8.2
我想从名单中读取可分配数组。但是我事先不知道有多少元素必须读入可分配数组,所以我不能在读取名单之前分配它。
这是我的名单:namelist.nml:
这是我的程序:namelist.f08:
如果我取消注释标记的行,程序可以工作,但是,正如我之前所说,我不能在之前分配来读取名单。有谁知道如何做到这一点?
arrays - 设计带有数组组件的派生类型
我一直在努力寻找有关设计派生类型的任何具体信息。我认为讨论这个问题的最佳方式是通过几个选项。我用派生类型的不同应用编写了一些代码部分。我更愿意为 、 和 使用nparts
动态index
数组refs
。我省略了实际使用该结构的代码部分(没有任何代码,因为我编造了它),但显示了一个示例,并且在例程中我打算至少使用该结构中的所有值一次。
选项 A:在派生类型中使用静态数组。缺点是我必须在编译时猜测数组大小。
选项 B:在派生类型中使用动态数组。
选项 C:最小化派生类型中使用的动态数组的数量,并强制assembly
成为数组。请注意,在这个版本中,我们有一堆未使用的内存。例如,nparts
并且index
需要内存packs
时间,因为assembly(packs,packs,nboxes)
.
选项 D:选项 C 的另一种排列。
问题:
do
哪个版本是为所示循环示例设计派生类型的正确/预期方法?考虑到我想要动态数组功能,哪个版本最优化?- 可能和上面有关。内存是如何分配和访问的?使用是否
SEQUENCE
值得?我认为分配的数组无论如何都不会按顺序显示。这难道不是表明选项 C 是最好的,因为每个部分assembly
都较小吗? - 我应该将这个派生类型拆分为多个派生类型,还是完全摆脱它而只使用变量?我将在多个例程中使用这个派生类型,并将它放在一个模块中。
fortran - Fortran 可分配的内部存储器表示
我想知道 fortran 可分配数组的内部存储器表示是什么。
我理解这比原始指针复杂一点,因为形状和等级也必须存储。
我也猜它依赖于实现,因为我在Fortran 2003 标准中找不到信息。
但是,我想知道使用哪种结构来表示可分配数组(即使只有一个编译器)。
我知道这个问题有点宽泛,但任何帮助将不胜感激。
fortran - 传递用户定义的数据类型可分配数组
我可以使用可分配数组作为其数据类型来定义用户定义的数据类型。
当我们仍在同一个子程序中时,分配工作完美。但我不知道如何将这种类型的用户定义数据类型作为子例程参数传递。
英特尔编译器显示错误# 6530
:
代码已在下面共享以显示错误。它是用 FORTRAN 77 编写的。我在 FORTRAN 77 中工作,因为我必须将此代码附加到仅接受 FORTRAN 77 文件的 Abaqus 用户子程序中。
编译时的程序给出如下所示的错误:
一定有办法解决这个问题。我想远离常见的块或模块。无论如何我不能在 Fortran 中使用模块。
为了避免这个错误,我在主程序中使用了可分配变量以及调用子程序。然后编译程序,但在执行时,它显示错误“分配已多次完成”。
最后我想我将不得不使用一些全局常量......我猜。