标签: intel-fortran

编译具有多个部分的Fortran程序

我对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

很明显,我需要以某种方式链接它们.但是,我不知道怎么做

fortran fortran90 intel-fortran

5
推荐指数
1
解决办法
4530
查看次数

forrtl:warning(402):堡垒:(1)

我在运行时收到以下警告:

...
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)

arrays fortran intel-fortran

5
推荐指数
1
解决办法
4021
查看次数

在总结两个数组的乘积时,gfortran或ifort编译器会明智地使用SIMD指令吗?

我有一些用numpy编写的代码,我正在考虑将它移植到Fortran以获得更好的性能.

我做过几次的一个操作就是将两个数组的元素乘积相加:

sum(A*B)
Run Code Online (Sandbox Code Playgroud)

看起来融合的乘法 - 加法指令会对此有所帮助.我当前的处理器不支持这些说明,所以我还无法测试.但是,我可能会升级到支持FMA3(Intel Haswell处理器)的新处理器.

有没有人知道用"-march = native"(或ifort等价物)编译程序是否足以让编译器(gfortran或ifort)明智地使用SIMD指令来优化代码,或者你认为我会必须要编译器或代码?

fortran simd gfortran fma intel-fortran

5
推荐指数
1
解决办法
2338
查看次数

Fortran PURE功能

在我看来,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并发循环中调用吗?

fortran gfortran intel-fortran

5
推荐指数
2
解决办法
280
查看次数

在声明类型中分配参数声明类型时,ifort发生严重错误

请考虑以下代码

  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)

fortran intel-fortran

5
推荐指数
0
解决办法
98
查看次数

Fortran 2D阵列初始化

以下程序使用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只允许非标准阵列初始化?

fortran gfortran intel-fortran

4
推荐指数
1
解决办法
4454
查看次数

警告消息 (402):为参数临时创建的数组

我不断收到警告消息:

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)

format io fortran fortran90 intel-fortran

4
推荐指数
1
解决办法
5875
查看次数

调用 gfortran 而不是 mpif90

我正在尝试使用 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 gfortran intel-fortran

4
推荐指数
1
解决办法
9604
查看次数

Fortran 动态库,在运行时加载?

是否可以让 Fortran 程序在运行时加载 Fortran 库?如果是这样,是否可以修改一个函数并只重新编译库,让原来编译的程序在运行时调用库中修改后的函数?

如果有人能提供一个关于如何实现这一点的最小工作示例,那就太好了。

macos fortran runtime shared-libraries intel-fortran

4
推荐指数
1
解决办法
1761
查看次数

TRUE 的数值相当于 -1?

我正在 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

4
推荐指数
1
解决办法
2005
查看次数