标签: intel-fortran

输出的格式字符串取决于变量

我想有一个Fortran写语句格式化依赖于某些变量.例如,我可以写:

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)

哪里nvari = 3.但是,如果在某些情况下,我实际上有4个变量(即nvari = 4).我想写这样的东西:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)

现在,nvari可以是任何东西,输出将按我喜欢的方式工作.我怎样才能做出类似这样的工作?

formatting fortran fortran90 intel-fortran

13
推荐指数
3
解决办法
2万
查看次数

生成编译器定义的预处理器宏列表

使用gcc和gfortran我可以生成编译器定义的预处理器宏列表(编辑以反映ouah的答案)

gcc -E -dM - < /dev/null
Run Code Online (Sandbox Code Playgroud)

gfortran -cpp -E -dM /dev/null
Run Code Online (Sandbox Code Playgroud)

分别(至少在Linux上).

我如何对英特尔编译器icc和ifort做同样的事情?我知道对于ifort这些宏是在这里定义的,但我希望能够自己生成这个列表,因为使用的确切宏及其值将取决于所使用的编译器选项.我也知道这个预先设计的项目.

c preprocessor fortran icc intel-fortran

10
推荐指数
2
解决办法
2774
查看次数

gfortran线长度限制

有没有办法在gfortran编译器中禁用行长度限制?我正在从ifort移植到gfortran,我想知道是否有一个简单的方法可以不经过代码并在需要的地方手动引入行继续.

line-breaks gfortran intel-fortran

10
推荐指数
1
解决办法
2739
查看次数

Fortran 90模块的神秘本质

Fortran 90模块是渐渐消失的生物.我使用(奇异)模块一段时间取得了一些成功(使用英特尔Visual Fortran和Visual Studio 2010进行编译).然后我写了另一个模块并尝试在另一个函数中使用它,然后才收到此错误:

 error #7002: Error in opening the compiled module file.  Check INCLUDE paths.
Run Code Online (Sandbox Code Playgroud)

所以我删除了有问题的模块.但是现在我在尝试访问原始模块后收到了同样的错误!

我怎样才能找到这些神秘的生物?为什么一个模块工作但不是两个?我假设我需要删除并重新编译它们,或者告诉编译器以某种方式包含它们.我知道源代码的文件位置,但不知道它们编译的位置.

fortran visual-studio-2010 fortran90 fortran95 intel-fortran

8
推荐指数
1
解决办法
1万
查看次数

英特尔Fortran - 检查界限不提供行号

ifort在mpi环境中使用intel fortran编译器().事实证明,当我使用标志编译时,我的代码有一个缓冲区溢出-g -O2 -check bounds.运行一段时间后,我收到此消息:

forrtl: severe (408): fort: (2): Subscript #1 of the array XX has value 4 which is greater than the upper bound of 3

Image            PC                Routine            Line        Source             
program.exe      00000000006E757E  Unknown               Unknown  Unknown
program.exe      00000000006E6016  Unknown               Unknown  Unknown
program.exe      00000000006905B2  Unknown               Unknown  Unknown
program.exe      0000000000642E6B  Unknown               Unknown  Unknown
program.exe      0000000000643381  Unknown               Unknown  Unknown
program.exe      00000000005F33FB  Unknown               Unknown  Unknown
program.exe      00000000004139E7  Unknown               Unknown  Unknown
program.exe      000000000040A6B4  Unknown               Unknown  Unknown
program.exe      0000000000409D2C  Unknown …
Run Code Online (Sandbox Code Playgroud)

fortran command-line-arguments intel-fortran

8
推荐指数
1
解决办法
4804
查看次数

错误:找不到 CMAKE_Fortran_COMPILER。Visual Studio 2017 企业版代替 MinGW

cmake-gui我有一个项目,已成功配置并生成mingw

但是当我想配置或构建它(cmake -G "Visual Studio 15 2017" )时Visual Studio 2017 EnterpriseIntel Parallel Studio 2017 (Visual Fortran Compiler)我收到以下错误:

The Fortran compiler identification is unknown
CMake Error at CMakeLists.txt:17 (PROJECT):
  No CMAKE_Fortran_COMPILER could be found.
Run Code Online (Sandbox Code Playgroud)

所以我该怎么做?

编辑:

当我使用时cmake -G "Visual Studio 15 2017"我得到:

-- The Fortran compiler identification is unknown
CMake Error at CMakeLists.txt:17 (PROJECT):
  No CMAKE_Fortran_COMPILER could be found.



-- Configuring incomplete, errors occurred!
See also "F:/FreshElmer - Copy (3)/elmerfem/CMakeFiles/CMakeOutput.log".
See …
Run Code Online (Sandbox Code Playgroud)

windows mingw cmake visual-studio intel-fortran

8
推荐指数
0
解决办法
3469
查看次数

Fortran 2003源文件的正确后缀 - 英特尔Fortran编译器

我写了一小段代码,试图遵守Fortran 2003标准.代码可以在github上找到.

这是我的makefile:

FC = gfortran
FLGS = -g -pg -std=f2003 -I. -fbounds-check
DEPS = camx.prm
OBJ = unit-test-hadvppm.o hadvppm.o

#linker macro
%.o: %.f03 $(DEPS)
        $(FC) -c -o $@ $< $(FLGS)

#build targets

gnu-amd64-linux: $(OBJ)
        $(FC) -o $@ $^ $(FLGS)

clean: gnu-amd64-linux
        rm *.o
Run Code Online (Sandbox Code Playgroud)

使用上面的makefile和gfortran编译代码没有问题.

但是,如果我尝试用iFort编译它,只需使用

ifort -o ifort-amd64-linux unit-test-hadvppm.f03 hadvppm.f03
Run Code Online (Sandbox Code Playgroud)

它不起作用,请参阅下面的输出.我想这与.f03免费文件格式有关.iFort中有一个标志,类似于gfortran的-std = f2003标志吗?我试着在iFort文档中找到这个,我应该更加努力吗?

在此输入图像描述

compiler-construction fortran intel-fortran

7
推荐指数
2
解决办法
2638
查看次数


以非特定于编译器的方式更改 Fortran 中的目录

我希望更改 Fortran 90 代码中的工作目录。是否可以以非特定于编译器的方式执行此操作?这是我的代码:

program change_directory
    integer :: ierr

    call system("mkdir -p myfolder/")
    !call system("cd myfolder/")   !doesn't work
    ierr = chdir("myfolder")
    if (ierr.NE.0) then
        write(*,'(A)') "warning: change of directory unsuccessful"
    end if

    open(unit=33,file="myfile.txt",iostat=ierr)
    if (ierr.EQ.0) then
        write(unit=33,fmt='(A)') "Test message"
        close(unit=33)
    end if
end program change_directory
Run Code Online (Sandbox Code Playgroud)

显然,cd myfolder/在系统调用中使用是行不通的。英特尔参考资料说我需要添加“ use ifport”。不过, GCC 参考文献中没有这样的提及。省略“ ”,我可以毫无问题地use ifport编译上面的代码。ifort然而,当我把它放进去时,它不会用 gcc 编译(因为 gcc 没有该ifport模块)——不仅如此,它也不会在 Intel Fortran 下编译——我收到以下错误:

$ ifort change_dir.f90 -o change_dir
change_dir.f90(5): error …
Run Code Online (Sandbox Code Playgroud)

directory gcc fortran intel-fortran

7
推荐指数
1
解决办法
2776
查看次数

Fortran 的“最终”子程序在实际使用中是否足够可靠?

现代 Fortran 包含各种面向对象的思想,包括通过FINAL关键字“析构函数”的概念。

MODULE mobject
  TYPE :: tobject
    ! Data declarations
  CONTAINS
    FINAL :: finalize
  END TYPE
CONTAINS
  SUBROUTINE finalize(object)
    TYPE(tobject) object
    ...
  END SUBROUTINE
END MODULE
Run Code Online (Sandbox Code Playgroud)

然而,这个功能可靠吗?值得注意的是,我注意到有关何时以及是否会调用它的不一致,英特尔 Fortran 19 和 GFortan 7、8 之间存在主要差异:

  • GFortran 无法销毁存储在数组中的对象。
  • 英特尔 Fortran:
    • 在分配时执行虚假和潜在的多余破坏,甚至可能在包含垃圾数据的内存上,以及
    • 从函数返回时执行对析构函数的虚假调用。

我注意到 gfortran-7.4.0 和 gfortran-8.2.1.2 之间没有区别。

这些不一致给我带来了一些关于析构函数的实际可用性的问题。是否有任何一种行为完全符合标准?这个标准不清楚吗?标准是否可能包含导致不直观行为的条款?

详细分析(代码见下)

  • 程序块。Gfortran 不会为在 PROGRAM 块中声明的实例调用析构函数,而 Ifort 会(参见run1示例)。

  • 标量对象。对于声明为标量的实例,如果变量已经看到任何形式的初始化,Gfortran 和 IFort 都会调用析构函数。然而,英特尔 Fortran 在分配函数返回值时,也会调用它

    • 在用函数中的数据覆盖之前在堆栈上的未初始化对象上,以及
    • 似乎在newObject函数的末尾。

    然而,这可以通过在执行任何清理之前显式检查对象是否已初始化来防止。

这意味着,程序员必须明确检查实例是否已初始化。

  • 数组中的对象。如果对象包含在数组中,并且数组超出范围,

    • Gfortran 不会调用析构函数。
    • 英特尔 Fortran 可能会调用析构函数,具体取决于给定数组成员的初始化方式。
    • 数组是否声明没有区别allocatable …

fortran gfortran fortran2003 intel-fortran

7
推荐指数
1
解决办法
338
查看次数