我在fortran中有一段代码。代码将'pq'作为用户的输入,并且是单点。我没有这样做,而是想从文件points.txt中读取一组点'pq'并运行它来获得那些点数,而不是仅仅一个用户输入。可能吗?代码如下:
program prop
use module
implicit none
character(len=80) :: ErrorMsg
character(2) :: xy
real(8) :: Conc(20) = 0.d0
character(len=20) :: fn, fl
real(8) :: Mmolar, Tcritical, Pcritical, Tmininimum, Tmaximum, x, y
call Init_module()
write(*,*) 'Insert the gas name:'
read(*,*) fn
write(*,*) 'Insert the gas library:'
read(*,*) fl
write(*,*) 'Insert the copule pq:'
read(*,*) pq
write(*,*) 'Insert the value of ', pq(1:1)
read(*,*) x
write(*,*) 'Insert the value of ', pq(2:2)
read(*,*) y
write(*,*) 'Pres = ', Pres( pq, x, y, ErrorMsg)
write(*,*) 'Temp = ', Temperature( pq, x, y, ErrorMsg)
call ReleaseObjects()
end program prop
我没有从上面代码中的用户读取pq作为单点x,y,而是想从file.txt中读取一组点,例如50个点,然后运行子程序Pres和Temperature。 文件的每一行包含一个点x,y和x,每行中的y由几个空格字符分隔。 file.txt的前几行是:
Ts
500
0.04781564 159.81587875
0.20396084 165.46398084
0.08159885 166.81382894
0.03879184 164.17497877
0.12585959 165.37000305
0.09895530 165.95997769
0.10389518 170.74235496
必须注意浮点数的长度和符号可以变化。 file.txt最初是通过python编写的,格式为x,y为'%-12.8f %-12.8f\n'%
。我有以下代码来尝试阅读该文件,但我无法从第3行开始阅读:
real, allocatable :: x(:),y(:)
integer :: np
open(12,file=trim('file.txt'),status='old', &
access='sequential', form='formatted', action='read' )
read(12,*)pq
write(*,*)'pq:', pq
read(12,*)np
write(*,*)'number of points:',np
allocate (x(np))
allocate (y(np))
do i=1,np
read(12,*)x(i),y(i)
write(*,*)x(i),y(i)
enddo
答案 0 :(得分:0)
不使用带有星号(*)的READ
语句作为要求用户输入的第一个参数,而是使用文件标识符。您需要OPEN
包含点集的文件,假设它是ASCII:
OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old')
我认为这个命令的参数非常明确。 然后假设您的文件包含多行x和y值,您可以通过执行以下操作来读取文件的每一行:
READ(10,*) x,y
如果您有多个要阅读的要点,如果您知道要读取的点数,只需使用DO
,否则为DO WHILE
。以50分为例,这样的事情应该有效:
OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old') ! Open file
DO i=1,50
READ(10,*) x,y
write(*,*) 'Pres = ', Pres( pq, x, y, ErrorMsg)
write(*,*) 'Temp = ', Temperature( pq, x, y, ErrorMsg)
END DO
CLOSE(10) ! Close file
修改强>
您的建议几乎是正确的。您忘记将pq
声明为character(len=2)
。你不应该因为这个原因而通过第1行。
正如我所说,有一个空格分隔符,由星号自然处理为格式。无论如何,如果要完全匹配格式,请使用与编写数据相同的格式。阅读你的格式Python,我假设你用空格分隔符写了两个浮点数,实际上如果算上数字的字符数:
0.04781564 159.81587875
^^^^^^^^^^^^|^^^^^^^^^^^^
1 12|1 12
|
space
在Fortran中提供以下格式:
read(12,'(f12.8,1X,f12.8)') x(i),y(i)
X表示Fortran格式的空格分隔符。
然后你可以用相同的格式在屏幕上写下数据来检查:
write(*,'(f12.8,1X,f12.8)') x(i),y(i)
它给出了:
pq:Ts
number of points: 500
0.04781564 159.81587219
0.20396084 165.46397400
0.08159885 166.81382751
0.03879184 164.17497253
0.12585959 165.37001038
0.09895530 165.95997620
0.10389518 170.74235535
你可能已经注意到你在最后的数字上丢失了精确度。这是因为你声明了一个简单的真实(4个字节)。根据您的编译器,使用real
或real(kind=8)
将real*8
切换为8个字节(请注意,这不是正确的方法,不是可移植但在您的情况下足够)
完成处理后,请不要忘记关闭文件:
close(12)