我试图用来forall分配动态数组,但gfortran并不喜欢这样.我还发现write一个forall块中禁止使用语句,我怀疑read语句也是如此.
forall块中不允许哪些其他功能/操作?
究竟什么是这个结构,除了有时do在顺序无关紧要时更换循环?我认为它会使编码更清晰,更优雅,尤其是在操作顺序不重要的时候显示,但是对于可以在内部进行的操作而言似乎相当严格forall.
这些限制的原因是什么,即它们保护/防止用户搞砸了什么?使用它是个好主意forall吗?如果是这样,为了什么目的?
现在在我正在处理的代码中只有一个forall块,如果我将它全部翻译成do循环,它将提供四个嵌套循环.哪种方式更好?
我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:
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此处的内部类型),在出现错误时输出字符串?
假设我有以下代码
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)
也就是说,号码前面有一个空格.如何摆脱那个空间?
几年前,我在简要介绍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)'中为 …
假设我有一个子程序,它接受两个数组作为输入.一个是意图(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中实现很少数值方法的项目.为此,我需要编写一些递归函数.这是我的代码.
!
! 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) 该程序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代码:
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 程序,但前几天在搜索以提醒自己使用它们时,我遇到了以下语句:
它(f77 的名单语言扩展)现已包含在 Fortran 90 语言中。但是,NAMELIST 是一个设计不佳的功能,应尽可能避免使用。
我只是想知道
我有一个 .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)