我对Fortran和整个英特尔编译器都非常陌生(我使用基于Windows的英特尔编译器和没有Visual Studio集成的IMSL库,因此只能使用命令行).
问题应该非常简单:我需要编译一个Fortran程序,它存储为四个不同的源代码部分.主程序(和一些子程序)存储在名为central.for的代码文件中,还有三个文件,我们称之为s1.for,s2.for和s3.for,每个文件只包含一个子程序(让称他们为sub1-sub3)而没有主程序.主程序调用存储在s1-s3和central.for中的子程序.
问题是我该如何编译它:
当我尝试编译central.for时,它给出了error LNK2019: unresolved external symbol _SUB1 referenced in function _MAIN__.同样,它为SUB2和SUB3提供相同的消息.
当我尝试编译s1.for-s3.for时,它给出了 error LNK2019: unresolved external symbol _MAIN__ referenced in function _main
很明显,我需要以某种方式链接它们.但是,我不知道怎么做
我在运行时收到以下警告:
...
forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #2
forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #3
forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #2
forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #3
...
Run Code Online (Sandbox Code Playgroud)
对于子例程/写入语句的每次调用.
子程序的调用:
integer :: l,kreise …Run Code Online (Sandbox Code Playgroud) 我有一些用numpy编写的代码,我正在考虑将它移植到Fortran以获得更好的性能.
我做过几次的一个操作就是将两个数组的元素乘积相加:
sum(A*B)
Run Code Online (Sandbox Code Playgroud)
看起来融合的乘法 - 加法指令会对此有所帮助.我当前的处理器不支持这些说明,所以我还无法测试.但是,我可能会升级到支持FMA3(Intel Haswell处理器)的新处理器.
有没有人知道用"-march = native"(或ifort等价物)编译程序是否足以让编译器(gfortran或ifort)明智地使用SIMD指令来优化代码,或者你认为我会必须要编译器或代码?
在我看来,Fortran中所谓的纯函数对于那些使用函数式编程的人来说并不算纯粹.所以这是我的问题.假设我有以下代码:
MODULE basics
IMPLICIT NONE
INTEGER, PARAMETER :: dp = kind(1.0d0)
REAL(dp), PARAMETER :: PI=3.1415926535897932_dp
REAL(dp), PARAMETER :: earthEquatorialRadius=6378.137_dp
END MODULE basics
MODULE myFunctions
USE basics
IMPLICIT NONE
PURE REAL(dp) FUNCTION sphericalArc(angleInRadians)
REAL(dp),INTENT(IN) :: angleInRadians
sphericalArc= 2.0*PI*earthEquatorialRadius*angleInRadians
END FUNCTION sphericalArc
END MODULE myFunctions
Run Code Online (Sandbox Code Playgroud)
函数sphericalArc没有副作用,所以它在这个意义上是纯粹的,但它使用全局常量.确实可以在函数内部定义参数PI和earthEquatorialRadius,但这是不可取的,因为我想在其他函数和子例程中使用它们.在每个函数或过程中定义dp类型会更加繁琐.
因此,从Fortran的角度来看,一个函数使用在函数之外定义的全局参数仍然被认为是纯粹的并且可以从do并发循环中调用吗?
请考虑以下代码
module t_test
implicit none
type ttt(tsize)
integer, len :: tsize
real x(tsize)
end type ttt
type :: t_rndom_diameter(t_rsize,t_csize)
integer, len :: t_rsize,t_csize
real :: x(t_rsize,t_csize)
type(ttt(tsize=:)), allocatable :: test_type
end type t_rndom_diameter
end module t_test
program p_test
USE t_test
implicit none
type(t_rndom_diameter(t_rsize=3,t_csize=3)) :: gdad
allocate(gdad% ttt(tsize=10) :: gdad % test_type)
end program
Run Code Online (Sandbox Code Playgroud)
它给了我一个灾难性的错误,而没有提到错误是什么:
catastrophic error: **Internal compiler error: segmentation violation signal raised** Please
report this error along with the circumstances in which it occurred in a Software Problem
Report. …Run Code Online (Sandbox Code Playgroud) 以下程序使用ifort(版本12)进行编译,但不使用GFortran编译(最高版本为4.8):
PROGRAM TEST
IMPLICIT NONE
REAL,DIMENSION(2,2)::X=(/1,2,3,4/)
WRITE(*,*) X
END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)
GFortran给出了错误
REAL,DIMENSION(2,2)::X=(/1,2,3,4/)
1
Error: Incompatible ranks 2 and 1 in assignment at (1)
Run Code Online (Sandbox Code Playgroud)
Ifort编译程序并给出预期的输出.这是GFortran中的错误还是intel fortran只允许非标准阵列初始化?
我不断收到警告消息:
forrtl: warning (402): fort: (1): In call to I/O Read routine, an array temporary was created for argument #1
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时。我在论坛上翻阅了有关同一问题的旧帖子(请参阅此处),但我不太确定答案是否适用于我手头的问题。谁能帮我摆脱这个警告信息?谢谢。
program main
implicit none
integer :: ndim, nrow, ncol
real, dimension(:,:), allocatable :: mat
ndim = 13
ncol = 1
allocate( mat(ncol,ndim))
call read_mat( mat, 'matrix.txt' )
contains
subroutine read_mat( mat, parafile)
implicit none
real, dimension(:,:), intent(out) :: mat
character(len=*), intent(in) :: parafile
character(len=500) :: par
character(len=80) :: fname1
integer :: n, m, pcnt, iostat
m = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 makefile 编译一个大型求解器。键入 make 时,将执行以下命令:
mpif90 -O2 -fpp -I/somePath/ -c precision.F90
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
gfortran: error: unrecognized command line option ‘-fpp’
Run Code Online (Sandbox Code Playgroud)
我输入which mpif90以查看它指向的位置:
/usr/local/intel14/impi/4.1.3.048/intel64/bin/mpif90
Run Code Online (Sandbox Code Playgroud)
我尝试手动输入命令以确保它与 没有任何关系,但makefile我遇到了同样的错误。为什么会gfortran被调用?这一定是一些链接错误,但我无法弄清楚。
是否可以让 Fortran 程序在运行时加载 Fortran 库?如果是这样,是否可以修改一个函数并只重新编译库,让原来编译的程序在运行时调用库中修改后的函数?
如果有人能提供一个关于如何实现这一点的最小工作示例,那就太好了。
我正在 Visual Studio 2012 中使用 Intel Fortran 来编译 Fortran 代码。当我尝试使用逻辑运算符时,我注意到独立的逻辑表达式会按预期产生 T 或 F。但是,如果我需要数字 T 或 F(0 或 1),当逻辑结果为 T 时我会得到 -1。
例如:
integer*4 a
a = 1
logicval = (node(5,L).gt.0)
numval = 1*(node(5,L).gt.0)
write(*,*) logicval, numval
Run Code Online (Sandbox Code Playgroud)
会输出
时间,-1
有没有办法可以重新定义分配给 T 和 F 的数值?
fortran logical-operators visual-studio visual-studio-2012 intel-fortran