2016-06-21 34 views
0

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

你可能知道他們在現代編程語言中稱爲循環和數組。那些是你那種東西的朋友。但同時'module'是fortran 90及以上的關鍵字,所以你不想命名你自己的modulemodule。 – innoSPG

+1

@innoSPG正式注意。但是我熟悉數組和循環,只是不確定如何爲fortran實現它們,我是fortran的新手。謝謝(你的)信息。 – Aspro

回答

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 

編輯

你的建議是正確的差不多。您忘記聲明pqcharacter(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(kind=8)real*8切換您real到8個字節(注意,不要做正確的方式,不便於攜帶但足以在你的情況)

不要忘記關閉您的文件,你完成交易時與它:

close(12) 
+0

另外,如果您有幸能夠訪問現代Fortran(2008+)編譯器,請使用'newunit'說明符。 – jlokimlin

+0

@Coriolis文件中的點是格式化的,而不是逗號,在這種情況下我該怎麼做? – Aspro

+0

@Aspro'read'語句中的第二個星號允許您定義格式。當使用星號時,程序會「按需要」讀取數據,實際上這應該足以處理空格分隔符。如果你想確定你的數據是如何讀取的,你應該定義一種格式。我建議你閱讀關於這個教程的教程,這太複雜了,無法在此處定義。 – Coriolis

相關問題