问题标签 [fortran2008]
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.
concurrency - 什么时候应该使用 DO CONCURRENT,什么时候应该使用 OpenMP?
我知道这个和这个,但我再次问,因为第一个链接现在已经很老了,第二个链接似乎没有得出结论性的答案。有没有达成共识?
我的问题很简单:
我有一个DO
循环,其中包含可以同时运行的元素。我使用哪种方法?
下面是在简单立方晶格上生成粒子的代码。
- npart是粒子数
- npart_edge和npart_face分别是沿边和面的
- space是晶格间距
- Rx , Ry , Rz是位置数组
- x , y , z是决定晶格位置的临时变量
请注意,在 CONCURRENT 情况下 x,y 和 z 必须是数组,但在 OpenMP 情况下则不然,因为它们可以定义为 PRIVATE。
我也使用DO CONCURRENT
(据我从上面的链接了解,它使用 SIMD):
还是我使用 OpenMP?
我的测试:
将 64 个粒子放入一个边 10 的盒子中:
将 100000 个粒子放在一个边 100 的盒子中:
使用该DO CONCURRENT
构造似乎给了我至少一个数量级的更好性能。这是在 i7-4790K 上完成的。此外,并发的优势似乎随着规模的增加而减少。
arrays - gfortran(mac os x):错误:(1)处的数组规范有超过 7 个维度
我正在使用 El Capitan 10.11.6 并从 homebrew 安装 gcc 6.1.0。我有一个具有 >7 维数组的 Fortran 程序 test.f。我编译使用
我认为 Fortran 2008 可以处理高达 15 维的数组。但是,我仍然得到以下信息:
我做错了什么?
fortran - 限制其他模块过程对模块过程的访问
我最近发现了 Fortran 2008 的新特性,即SUBMODULE
s。
请看一下我的最小工作示例。编译后在终端上放如下:
也就是说,它应该是模块程序,sub1
并且sub2
可以CALL
相互连接,一切正常。
由于代码架构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程 (sub1
和sub2
) 彼此不可见。我可以这样做吗?
oop - 带有延迟函数和 non_overridable 关键字的分段错误
我正在开发一个面向对象的 Fortran 代码,用于具有抽象类型支持的多态性的数值优化。因为这是一个很好的 TDD 实践,所以我尝试在抽象类型中编写所有优化测试class(generic_optimizer)
,然后应该由每个实例化的类运行,例如,由type(newton_raphson)
.
所有优化测试都具有对 的调用call my_problem%solve(...)
,它被定义为deferred
抽象类型,当然每个派生类型都有不同的实现。
问题是:如果在每个非抽象类中我将延迟函数定义为non_overridable
,则会出现分段错误,例如:
经过反复试验,我注意到如果删除non_overridable
声明,我可以避免错误。在这种情况下,这不是问题,但我想强制执行这一点,因为此代码不太可能存在两级多态性。相反,我是否违反了标准中的任何要求?
这是重现错误的示例代码。我一直在用 gfortran 5.3.0 和 6.1.0 对其进行测试。
fortran - 将指向复杂 Fortran 数组虚部的“指针”传递给 BLAS 例程
我想将指向复杂 Fortran 数组的虚部的“指针”传递给仅对实数进行操作的 BLAS 函数。我的意思是 C 语言意义上的“指针”,因为我不希望涉及任何数据复制。
例如,考虑下面的简单代码(我的实际代码稍微复杂一些):
不幸的是,%re
并且%im
仅在 Fortran 2008 中指定。此外,我不确定标准是否允许将复杂的部分选择器应用于数组的各个元素,因为我的编译器都不支持。
gfortran
抱怨“非派生类型变量的意外'%'”。
还有其他方法可以实现我的需要吗?
fortran - 以下 Fortran 'do concurrent' 循环是否有效?
我不认为下面的do concurrent
Fortran 循环是有效的,因为acc
每次迭代都会修改。但是,gfortran 没有给我任何警告,并且结果值在acc
55 处是正确的。它是否有效?
fortran - 重载二元运算符时可以避免临时存储吗?
我正在为向量类使用运算符重载
工作得很好。但是,当我实施时:
并在函数vec_add_sv和子例程vector_assign中放入 write 语句我注意到当我使用
它调用了vec_add_sv函数和vector_assign子程序。这表明vec_add_sv函数为其返回创建了一个临时向量,然后将该临时向量传递给vector_assign子例程。结果是我循环了我的向量元素两次。
有没有办法在不创建临时存储的情况下实现二元运算符?
我认识到,如果您执行 A = B + ( C * D ) 之类的操作,则需要一个临时的,然后 (C * D) 会创建一个在 B + temp 中使用的临时。但如果我只做一个操作 A = B + C
我想要相当于
接口operator(+)要求模块过程是函数而不是子例程
arrays - 在 Fortran 中是否有用于将数组初始化为零的内在函数?
有没有办法在 Fortran 中将数组(向量,矩阵,甚至标量)设置为零?2003/2008 年似乎将 Fortran 提升到了一个非常现代的水平,我想知道他们是否包含一种简单的方法来将数组值设置为零而不必这样做
其中 X 是行数,Y 是二维矩阵中的列数。这可以推广到任意多个维度,但原理是一样的。
在 Matlab 中,这很容易用 zeros 函数完成,即
现代 Fortran 似乎将很多人们喜欢的关于 Matlab 和其他语言的东西融入到它的曲目中,所以我只是好奇他们是否有这个简单而基本的任务的内在特性。
或者,也许在现代 Fortran 中,不需要通过初始化数组来清除内存中任何先前存储的值?
我想一个更短的方法就是去
但是关于内在的问题仍然存在。
fortran - 如何独立设置整数和小数精度?
我正在学习 Fortran(使用 Fortran 2008 标准),并且想独立设置实变量的整数部分精度和小数部分精度。我该怎么做呢?
例如,假设我想声明一个实数变量,其整数部分精度为 3,小数部分精度为 8。
上述规范中的示例数字是 123.12345678,但 1234.1234567 不满足给定要求。
fortran - 在 Fortran 2008 中恢复异步系统调用的成语
如果我进行系统调用,例如:
我想并行调用这些,然后检查它们的进展情况,它们是否已完成,最后采取一些行动。但是,轮询 exitstat 并没有给我这些信息。检查我没有等待的系统调用是否已经完成的正确习惯用法是什么?
从这里: https ://gcc.gnu.org/onlinedocs/gfortran/EXECUTE_005fCOMMAND_005fLINE.html
它没有出现任何可选参数:
- 退出状态
- CMDSTAT
- CMDMSG
提供此信息。
是否有推荐的现代 Fortran 程序涉及将锁定文件作为调用的一部分编写?还是不同的异步调用?