调用子程序以获得点列表而不是单个点

时间:2016-06-21 10:24:54

标签: fortran points file-read

我在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

1 个答案:

答案 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个字节)。根据您的编译器,使用realreal(kind=8)real*8切换为8个字节(请注意,这不是正确的方法,不是可移植但在您的情况下足够)

完成处理后,请不要忘记关闭文件:

close(12)