问题标签 [fortran2018]
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 中使用 bignum
对于为科学计算而设计的语言——甚至 50 年前,我惊讶地发现 Fortran 2018 没有用于 bignum 或 bigInt 类型的任意精度的本机类型,并且怀疑我做错了什么。这个的标准流程是什么?
我在想:
这会产生
fortran - 如何在 Fortran 2018 中访问远程团队
我编写了一个使用团队的简短 Fortran 程序,但它没有按预期运行。我想知道我的编程语法是否正确,或者我的编译器中是否存在错误。
我一直在阅读一本关于 Fortran 2018 及其一些较新的实现(包括团队)的书。很少有教科书谈论团队,而我能找到的唯一一本没有提供任何程序示例。我编写、编译并运行了一个非常短的程序,该程序应该打印一个团队的值,同时在另一个团队中工作。语法看起来相当简单,但程序不起作用。我已经使用 OpenCoarrays 2.7.1 编译器以及 2.8.0 版本编译了该程序。
如果我使用 5 个处理器运行程序cafrun -np 5 remote_team2
,我希望屏幕上会打印出如下内容:
相反,我得到以下信息:
我不明白为什么它不打印对面队号中的图像数量,然后打印当前队号中的图像数量。相反,它只打印两次相同的内容,表明方括号索引“[]”不起作用。
我究竟做错了什么?是否有任何 Fortran 2018 程序员可以解释这一点?
谢谢你的时间。
史蒂夫莱昂内尔,感谢有关使用change team
声明调查关联选项的建议。我的书提到了这个选项,但不幸的是,再一次,没有例子。
根据书中描述的语法,我将程序修改为如下所示:
但是,现在我的编译器给我的change team
语句一个语法错误。错误内容如下:
编译器还给出以下错误消息:
似乎认为我正在尝试将其team_number
用作函数,而不是用作索引选项,如书中所述。
没有任何已发布的工作示例可言,无论是在书中还是在网上,我都不知道编译器要我做什么。该书通常显示这些定义的“参考书”表示。所以我永远不太确定这些陈述实际上应该是什么样子。但是,就我编写这两个语句的方式而言,它们使用的选项与书中描述的相同。非常感谢任何建议或想法。
fortran - 在fortran中使用MPI_PUT,不同等级使用c_loc有不同的位移
我将 MPI 等级分开以计算数组的不同部分,然后我想将这些切片放置/发送到不参与计算的不同等级上。该等级是新通信器的主人,该通信器设置为对数组执行其他操作(平均、IO 等)。我让它与 MPI_isend 和 MPI_irecv 一起工作,现在我想尝试 MPI_Put。
我已经! if (.not.allocated(diag_comm)) then
注释掉了,因为我尝试对所有计算 r 的排名进行此操作,但我得到了相同的结果。我在我的 Makefile 中编译mpiifort -O0 -fpe0 -init=snan,arrays -no-wrap-margin -traceback -stand f18
和运行。mpirun -n 12 ./$@.x : -n 6 ./$@.x
我正在使用的 mpiifort 版本是
输出 ( write (6,*) loc_base, grk
) 很奇怪。
排名 12-17 是不参与“计算 r”的排名,但我不确定为什么c_loc(r(1,1))
这些排名不同。此外,等级 0 也不同。
我的实际问题是
1)如何计算displacement
变量?我做得对吗?等级之间是否应该有所不同,因为在这种情况下会有所不同?
2) 为什么c_loc(r(1,1))
12-17 的排名不同?这与这是一个 SPMD 程序有关吗?为什么等级 0 不同?
3)我可以与所有队伍进行单向沟通而不是只与一个队伍沟通吗?我让每个等级调用 mpi_isend,然后当我以另一种方式执行此操作时,我只是在所有等级发送中循环调用 mpi_irecv。我可以用 MPI_Put 做类似的事情吗?我应该使用 MPI_Get 吗?还有什么?
4)我如何让它工作?这只是我自己的一个教育例子,而我真正需要做的事情要复杂得多。
c++ - Fortran 2018 混合 C++ 空指针段错误
我有一个简单的程序,它使用新的 Fortran 2018 语义结合了 C++ 和 Fortran。我的示例基于https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/697150中评论 #12 中提供的内容。我的示例使用英特尔编译器(2019 update5)运行良好,但是当我使用检查指针标志时,一旦我调用 Fortran 子例程,它就会因段错误而崩溃。使用 gfortran (9.2.0),程序正确执行,但退出时出现堆栈粉碎错误。
C++
Fortran
退出时我从 gfortran 得到的错误消息是:
使用地址清理,错误消息是
module - 在创建单独的模块过程时,您会在什么情况下在子模块中使用“模块过程”?
我了解 Fortran 2008+ 中子模块的一般好处,但我无法理解其中一种语法选项的好处。
如果我想创建单独的模块过程(过程主体在子模块中),我需要在父模块中创建一个接口。该接口必须包含子例程或函数标识符以及参数列表和意图。这一切都说得通。
然后子模块包含过程的实现,但是可以选择语法:我可以重复子例程或函数的签名,或者,我可以简单地使用“模块过程”之后的接口名称。我打算打出一个例子,但fortran wiki完美地显示了它。
我的问题是:使用“模块过程”而不是“模块函数”或“模块子例程”的替代语法有什么好处,即过程类型、参数和意图在子模块文件中不重复?似乎这只会使代码维护复杂化,因为现在需要打开两个文件才能理解子例程或函数。我是否在这里遗漏了一些隐藏的好处(除了保存副本/粘贴)?
arrays - 在 fortran 2018 中编写类的最佳方式(代码审查)
我尝试用现代 fortran(2018 年?)编写代码,我的目标之一是能够将像这样的子例程(旧的 fortran 77)转换为最新的 fortran(2018 年?)
到目前为止,我能够写出这样的东西(见下文),但我只对标量变量成功了。当我必须使用数组时,我有点卡住了。特别是我应该分配然后给数组 Bini 一些值(旧 fortran 子例程中的公共块)。然后在类中定义的函数(find_bin_nobin)中使用这些数组。感谢任何建议以及对代码的任何正式改进。非常感谢!