2014-01-16 82 views
0

我遇到以下問題。我有一個文件,我必須:
在fortran中修改數組

  1. 在細胞分裂創建NxN網格;
  2. 計數每個細胞中的粒子;
  3. 以特定方式編寫結果數字。

的問題是第三點:我必須寫一個N×N的陣列,每個數字代表每個細胞顆粒的總數字,但我不知道如何寫在文件中的NxN陣列。

program eccen 
    implicit none 
    integer, parameter:: grid=200 
    integer::i,j,k,n,m 
    real*8,allocatable::f(:,:) 
    real*8::xx(grid),yy(grid),mval,Mxval 
    real*8,allocatable::x(:),y(:) 

    open(10,file='coordXY.txt') 
    n=0 
    DO 
     READ(10,*,END=100) 
     n=n+1 
    END DO 

100  continue 
    rewind(10) 

    allocate(x(n),y(n)) 

    do i=1, n 
     read(10,*) x(i),y(i) 
    end do 

! create a grid 
    mval=-15. 
    Mxval=15. 
    do i=1, grid 
     xx(i) = mval + ((Mxval - mval)*(i-1))/(grid-1) 
     yy(i) = mval + ((Mxval - mval)*(i-1))/(grid-1) 
    end do 

    open(20,file='fluxXY.dat') 

! counts the paticles in each cell of the grid 


    allocate(f(grid,grid)) 
    f=0 
    do i=1,grid 
     do j=1,grid 
      m=0. 
      do k=1, n 
       if (x(k) > xx(i) .and. x(k) < xx(i+1) .and. & 
       & y(k) > yy(j) .and. y(k) < yy(j+1)) then 
        m=m+1 ! CONTA IL NUMERO DI PARTICELLE 
       end if 
      end do 
      f(i,j)=float(m+1)  
! THIS IS HOW I WRITE THE FILE BUT THIS SHOULD BE CHANGED 
      write(20,*) f(i,:) 

     end do 
     write(20,*) 
     print *,i 
    end do  
end program eccen 

非常感謝您的幫助!

+0

即使在學習你的示例程序之後,我仍然不得不承認在這裏要問什麼。你在問如何表示一個多維數組(矩陣,可以這麼說)以及如何寫出它? – Rook

+0

@ Idigas:是的,網格*網格矩陣(網格是x軸和y軸上的單元格數)。但在我的程序中,單元20中的文件只有3列和很多行。但是,我想要一個帶有網格*網格(列*行)的數組。 –

+0

不知道這三列看起來很難說,但試着用一種明確的格式進行編寫。 – francescalus

回答

0

[解決]

我終於解決了我所有的問題:使用ifort

  1. -no-wrap-margin - >工作!

  2. 使用ifort用@Stefan提示 - >工作!

  3. 單獨使用gfortran - >工作!

區別在於文件大小:使用1)解決方案時文件比2)解決方案稍大。 3)案件再次顯示了與其他案件相比文件大小的差異(高於其他兩個案件)。分別爲:

  1. 60kb;
  2. 40kb;
  3. 65kb。

對於grid = 50且輸入文件爲4001行和2行(132kb)的測試文件。

謝謝大家!!!!!

2

英特爾Fortran編譯器(ifort)執行適合3個雙精度數字的自動換行,而gfortran則不適用。

你應該建立一個明確的格式(由@francescalus提及):

1000 FORMAT(<grid>F16.8) 

在這種格式,變量grid可以直接使用。現在,你可以指定你的WRITE語句

write(20,1000) f(i,:) 
+2

'ifort'具有'-no-wrap-margin'編譯標誌(針對Windows的不同拼寫)。 ''不是可移植的,但是如果有人可以調用這個便攜式的話,那麼有些方法(包括'*(F ...)')。 – francescalus