标签: fortran95

Fortran forall限制

我试图用来forall分配动态数组,但gfortran并不喜欢这样.我还发现write一个forall块中禁止使用语句,我怀疑read语句也是如此.

forall块中不允许哪些其他功能/操作?

究竟什么是这个结构,除了有时do在顺序无关紧要时更换循环?我认为它会使编码更清晰,更优雅,尤其是在操作顺序不重要的时候显示,但是对于可以在内部进行的操作而言似乎相当严格forall.

这些限制的原因是什么,即它们保护/防止用户搞砸了什么?使用它是个好主意forall吗?如果是这样,为了什么目的?

现在在我正在处理的代码中只有一个forall块,如果我将它全部翻译成do循环,它将提供四个嵌套循环.哪种方式更好?

fortran loops fortran95

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

纯Fortran程序中的I/O.

我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:

pure real function func1(output_unit,a)
    implicit none
    integer :: a, output_unit

    if (a < 0) then
        write(output_unit,*) 'Error in function func1: argument must be a nonnegative integer. It is ', a
    else
    func1 = a/3

    endif
    return
end function func1
Run Code Online (Sandbox Code Playgroud)

但是,不允许纯函数将IO语句赋予外部文件,因此我尝试将单元号传递给函数,例如output_unit = 6,这是默认输出.gfortran仍然认为这是非法的.有没有解决的办法?是否有可能使函数成为派生类型(而不是real此处的内部类型),在出现错误时输出字符串?

io error-handling fortran gfortran fortran95

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

使用write打印时如何删除前导空格?

假设我有以下代码

program fortran
  open(900, FILE='SOMETHING')   
  write(900, *) '21'    
end program fortran
Run Code Online (Sandbox Code Playgroud)

文件格式为

 21
Run Code Online (Sandbox Code Playgroud)

也就是说,号码前面有一个空格.如何摆脱那个空间?

fortran fortran95

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

在fortran90中智能打印整数

几年前,我在简要介绍Fortran77之后,正在学习Fortran90.在Fortran中打印整数时,必须指定要为打印整数保留的空格数.考虑这个程序......

implicit none

integer :: i
i = 123

write(*, '(A, I3, A)')  "'", i, "'"  !3 spaces for output = no padding
write(*, '(A, I5, A)')  "'", i, "'"  !5 is too many, so output is padded
write(*, '(A, I2, A)')  "'", i, "'"  !2 is too few, so output is jibberish
write(*, '(A, I:, A)')  "'", i, "'"  !Default behavior

end program
Run Code Online (Sandbox Code Playgroud)

...生成以下输出.

'123'
'  123'
'**'
'         123'
Run Code Online (Sandbox Code Playgroud)

当我不知道整数中有多少位数时,如何为整数打印分配正确的空间量?

更新:如果您的编译器符合F95,您可以使用I0编辑描述符(即,在上面的示例'(A, I0, A)'中为 …

format fortran fortran90 fortran95

6
推荐指数
1
解决办法
3110
查看次数

Fortran:将同一个数组作为两个伪参数传递给子程序

假设我有一个子程序,它接受两个数组作为输入.一个是意图(in),另一个是intent(out).后者以任意方式来自前者.但是,如果我为两个伪参数传递相同的实际参数,该怎么办?通常,结果将不是子例程的预期结果.请参阅下面的代码段.

问题是,编译器似乎并不关心,即使我已经给出了意图标志.我正在使用英特尔Visual Fortran Composer 12,具有所有诊断功能.有没有更好的方法来编写子程序,或者我缺少一些编译器选项,以使代码更安全?

module foo

    contains

    subroutine sub_a()
        implicit none
        real::array(10,10)

        call sub_b(array,array)

    end subroutine

    subroutine sub_b(array1,array2)
        implicit none
        real,intent(in)::array1(10,10)
        real,intent(out)::array2(10,10)

        !array2 is derived from array1 somehow

    end subroutine

end module foo
Run Code Online (Sandbox Code Playgroud)

fortran fortran95

6
推荐指数
1
解决办法
1385
查看次数

FORTRAN功能

我正在开发一个需要在FORTRAN中实现很少数值方法的项目.为此,我需要编写一些递归函数.这是我的代码.

!     
! File:   main.F95
!

RECURSIVE FUNCTION integrate(n) RESULT(rv)
    IMPLICIT NONE
    DOUBLE PRECISION :: rv
    INTEGER, INTENT(IN) :: n
    DOUBLE PRECISION, PARAMETER :: minusone = -1.0
    IF (n == 1) THEN
        rv = 10 !exp(minusone)
        RETURN
    ELSE
        rv = 1 - (n * integrate(n - 1))
        RETURN
    END IF
END FUNCTION integrate

RECURSIVE FUNCTION factorial(n) RESULT(res)
    INTEGER res, n
    IF (n .EQ. 0) THEN
        res = 1
    ELSE
        res = n * factorial(n - 1)
    END IF
END

PROGRAM …
Run Code Online (Sandbox Code Playgroud)

recursion fortran function fortran95

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

使用ifort进行数组复制的程序崩溃

该程序Illegal instruction: 4在MacOSX Lion和ifort(IFORT)12.1.0 20111011上崩溃

program foo
      real, pointer :: a(:,:), b(:,:)
      allocate(a(5400, 5400))
      allocate(b(5400, 3600))
      a=1.0
      b(:, 1:3600) = a(:, 1:3600)

      print *, a
      print *, b

      deallocate(a)
      deallocate(b)

end program 
Run Code Online (Sandbox Code Playgroud)

同一个程序与gfortran一起使用.我没有看到任何问题.有任何想法吗 ?展开副本并在列上执行显式循环适用于两个编译器.

请注意,使用allocatable而不是指针我没有问题.

如果语句在模块内部,则行为相同.我在ifort(IFORT)12.1.3 20120130上确认了相同的行为.

显然,Linux和ifort 12.1.5没有问题

我尝试使用以下链接选项增加堆栈大小

ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90

但我仍然得到同样的错误.增加ulimit -s到同样的问题.

编辑2:我做了一些调试,显然当数组拼接操作时会出现问题

      b(:, 1:3600) = a(:, 1:3600)
Run Code Online (Sandbox Code Playgroud)

涉及可疑接近16 M数据的值.

我正在比较所产生的操作码,但如果有办法看到更具交际性的中间代码形式,我很乐意欣赏它.

fortran fortran95 intel-fortran

6
推荐指数
2
解决办法
2311
查看次数

Fortran 95中的数值精度:

我有以下Fortran代码:

Program Strange
   Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209;
   Real(Kind=8)::Pi2=3.1415926535897932384626433832795028841971693993751058209_8;

   Print*, "Pi1=", Pi1;
   Print*, "Pi2=", Pi2;

End Program Strange
Run Code Online (Sandbox Code Playgroud)

我用gfortran编译,输出是:

 Pi1=   3.1415927410125732     
 Pi2=   3.1415926535897931
Run Code Online (Sandbox Code Playgroud)

当然第二个是正确的,但是应该是这样吗?似乎Pi1作为单个精度数字输入到内存,然后放入双精度内存插槽.但这对我来说似乎是一个错误.我对么?

fortran gfortran numerical-analysis fortran95

6
推荐指数
1
解决办法
1268
查看次数

Fortran 中是否应该避免使用名单,如果是这样,推荐的替代方法是什么?

我经常使用名称列表功能将参数列表灵活输入到 FORTRAN 程序,但前几天在搜索以提醒自己使用它们时,我遇到了以下语句

它(f77 的名单语言扩展)现已包含在 Fortran 90 语言中。但是,NAMELIST 是一个设计不佳的功能,应尽可能避免使用。

我只是想知道

  1. 如果这是普遍持有的观点?
  2. 如果是,为什么会这样?
  3. 建议的参数输入替代方案是什么?(我当然使用 netcdf 进行网格数据文件输入,我在这里考虑的是运行时参数设置)。

fortran fortran90 fortran95

6
推荐指数
1
解决办法
471
查看次数

在fortran中如何从fortran中的.dat文件中逐行读取所有字符串

我有一个 .dat 文件,我试图从中逐行读取并打印它。任何人都可以请帮助如何在fortran中做到这一点?

提前致谢!

数据:

REMARK    GENERATED BY TRJCONV
TITLE     UNNAMED t=   0.00000
REMARK    THIS IS A SIMULATION BOX
CRYST1   26.178   26.178   26.178  90.00  90.00  90.00 P 1           1
MODEL        1
ATOM      1  S2  LJ2     1      17.000  15.030  11.630  1.00  0.00            
ATOM      2  S2  LJ2     2      13.290  11.340  15.900  1.00  0.00            
ATOM      3  S2  LJ2     3      17.030  23.070  14.750  1.00  0.00            
ATOM      4  S2  LJ2     4      15.360  14.840   9.480  1.00  0.00            
ATOM      5  S2  LJ2     5      15.780   4.560   9.580  1.00 …
Run Code Online (Sandbox Code Playgroud)

fortran fortran90 fortran95

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