我最近开始维护大量科学计算密集型FORTRAN代码.尽管有谷歌和两本入门级书籍,但我很难掌握四十年前语言的所有细微差别.代码充斥着"提升性能".有没有人有任何关于将FORTRAN 去优化到CS 101级别的指南或实用建议?有谁知道FORTRAN代码优化是如何运作的?是否有任何典型的FORTRAN'陷阱'可能不会发生在Java/C++/.NET引发的开发人员接管FORTRAN 77/90代码库?
我在Fortran中有一个程序将结果保存到文件中.目前我使用打开文件
OPEN (1, FILE = 'Output.TXT')
Run Code Online (Sandbox Code Playgroud)
不过,我现在想运行一个循环,每次迭代的结果保存到文件'Output1.TXT','Output2.TXT','Output3.TXT',等等.
在Fortran中有一种简单的方法可以从循环计数器构造文件名i吗?
我无法理解Fortran 90的kind参数.据我所知,它不确定变量的精度(即浮点数或双精度数),也不确定变量的类型.
那么,它决定了什么,究竟是什么呢?
基本上有两种方法可以将数组传递给Fortran 90/95中的子程序:
PROGRAM ARRAY
INTEGER, ALLOCATABLE :: A(:,:)
INTEGER :: N
ALLOCATE(A(N,N))
CALL ARRAY_EXPLICIT(A,N)
! or
CALL ARRAY_ASSUMED(A)
END PROGRAM ARRAY
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N,N)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
SUBROUTINE ARRAY_ASSUMED(A)
INTEGER, ALLOCATABLE :: A(:,:)
N=SIZE(A,1)
! bla bla
END SUBROUTINE ARRAY_ASSUMED
Run Code Online (Sandbox Code Playgroud)
您需要第二个显式接口,通常是通过使用模块.
从FORTRAN77开始,我习惯了第一种选择,如果你传递整个数组,我认为这也是最有效的.
显式形状的好处是我也可以调用子例程并将数组视为向量而不是矩阵:
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N**2)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种很好的方法来使用第二个假定的形状界面来做这种事情而不复制它.
我正在参加Fortran 90课程,我正在寻找任何关于Fortran的好网站.
有谁知道吗?
在开始之前,我必须先说明我是FORTRAN的新手.我从1978年开始维护一段代码.它的目的是从文件中读取一些数据值,处理值,然后将处理后的值输出到另一个文本文件.
给出以下FORTRAN代码:
INTEGER NM,STUBS,I,J,K
PARAMETER (NM=67,STUBS=43)
INTEGER*4 MDS(STUBS,NM)
CALL OPEN$A(A$RDWR,'/home/test/data.txt', MAXPATHLEN,1)
CALL OPEN$A(A$WRIT,'out',11,2)
DO 90 I=1,2
READ(1,82) STUB
!-- data processing --!
WRITE(2,80) STUB,(MDS(I,J),J=1,24)
90 CONTINUE
80 FORMAT(/1X,A24,25I5)
82 FORMAT(1X,A24,25F5,1)
Run Code Online (Sandbox Code Playgroud)
我的问题是关于WRITE()声明.
我理解这(2,80)是指文件输出流打开并指向文件'out'并由数字2引用.我理解80指的是标签80引用的格式语句.
STUB用于存储从文件输入1读取的值.这些值是处理的值,并保存MDS(I,J)在!-- data processing --!我省略的部分中.
假设(MDS(I,J),J=1,24)将24个整数值写入输出文件,我是否正确?换句话说,循环从1到24?
我在其中一个fortran函数中初始化了一个变量.我在另一个功能中使用它.但价值并不相同.在其他函数调用我得到垃圾值.我如何保持初始值.
例如:
entry a() num_calls=0 entry b() num_calls= num_calls + 1
从条目"b"我得到num_calls作为一些垃圾
如何在Fortran中编写一个函数,它将输入和输出都作为参数?例如:
fun(integer input,integer output)
Run Code Online (Sandbox Code Playgroud)
我想利用输出值.我尝试过这样的东西,但输出变量没有保持值.
具体来说,我从Fortran调用一个C函数,它将输入和输出作为参数.我能够成功传递输入值,但输出变量没有获取值.
目的:创建一个程序,它接受两个单独的文件,打开并读取它们,将它们的内容分配给数组,对这些数组进行一些数学运算,创建一个带有产品编号的新数组,打印到一个新文件.够简单吧?
我的输入文件在开头有注释字符.一个问题是,它们是'#',它们是大多数绘图程序的注释字符,但不是FORTRAN.什么是告诉计算机不要查看这些字符的简单方法?由于我之前没有FORTRAN经验,我正在通过两个测试文件来完成这项工作.这是我到目前为止:
PROGRAM gain
IMPLICIT NONE
REAL, DIMENSION (1:4, 1:8) :: X, Y, Z
OPEN(1, FILE='test.out', &
STATUS='OLD', ACTION='READ') ! opens the first file
READ(1,*), X
OPEN(2, FILE='test2.out', &
STATUS='OLD', ACTION='READ') ! opens the second file
READ(2,*), Y
PRINT*, X, Y
Z = X*Y
! PRINT*, Z
OPEN(3, FILE='test3.out', STATUS='NEW', ACTION='WRITE') !creates a new file
WRITE(3,*), Z
CLOSE(1)
CLOSE(2)
CLOSE(3)
END PROGRAM
Run Code Online (Sandbox Code Playgroud)
PS.请不要用一堆代码猴子gobblety gook压倒我.我是一个总编程新手.我不懂所有的术语,这就是为什么我来到这里而不是在现有网站上寻求帮助的原因.谢谢.
我正在分析 Fortran 代码并有一个简单的问题。
我想知道下面代码中 100 和 200 处的“继续”语句的作用。
它会增加 i 和 j 计数器吗?如果是这样,那么条件不会if( .not. flg )包含flg循环中 flg 的“最后一个值”的值吗j = i+1 to N?
do 100 i = 1, N-1
flg = .false.
do 200 j = i+1, N
if( "my condition" ) flg = .true.
200 continue
if( .not. flg ) then
! do something here.
endif
100 continue
Run Code Online (Sandbox Code Playgroud)