2013-06-25 108 views
1

我在過去幾天編碼時似乎碰壁了。從我所知,有可能使Fortran數組的數組ALA Fortran array of variable size arraysfortran「陣列陣列」和「包裝」問題

type par 
    .... !data 
    integer :: location 
end type par 

type locations 
    ....! data 
    type (par), allocatable, dimension(:) :: pars 
end type locations 

type (par), allocatable, dimension(:) :: all_pars 
type (locations), allocatable, dimension(:) :: all_loc 

.... !read numpars, numlocs from file etc 

allocate(all_pars(numpars)) 
allocate(all_locs(numlocs)) 


!initialize all_pars 
do n = 1:numpars 
    .... 
    all_pars(n)%location = some_location 
enddo 

!get particles in each location 
do n = 1:numlocs 
    allocate(all_locs(n)%pars(count(all_pars(:)%location .ne. n))) 
    all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .ne. n)) !ERROR: An assignment of different structure types is invalid. 
enddo 

編譯器不同意我的上面的堆棧溢出示例代碼摺合流水線抱怨,但它確實確實有問題當我嘗試使用該數組來存儲包函數調用的結果時。我懷疑它可能是這樣的情況下,分配功能不符合預期,但由於代碼不編譯,我無法調試它....

包裝使用的squirrely想法來自http://flibs.sourceforge.net/fortran_aspects.html,大約一半在頁面下方。

我是一個Linux系統上運行,用ifort 12.1.3.293

任何的幫助深表感謝

回答

1

這可能是一個擴展的意見,而不是一個答案......

得到它編譯我修改你的發佈代碼爲;

program main 

implicit none 

integer :: numpars, numlocs, n 

type par 
    !data 
    integer :: location 
end type par 

type locations 
    ! data 
    type (par), allocatable, dimension(:) :: pars 
end type locations 

type (par), allocatable, dimension(:) :: all_pars 
type (locations), allocatable, dimension(:) :: all_locs 

!read numpars, numlocs from file etc 
numpars = 10 
numlocs = 4 
allocate(all_pars(numpars)) 
allocate(all_locs(numlocs)) 


!initialize all_pars 
all_pars(1:numpars:4)%location = 1 
all_pars(2:numpars:4)%location = 2 
all_pars(3:numpars:4)%location = 3 
all_pars(4:numpars:4)%location = 4 


!get particles in each location 
do n = 1,numlocs 
! allocate(all_locs(n)%pars(count(all_pars(:)%location .ne. n))) 
    all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .ne. n)) 
enddo 
end program 

它編譯與我的Mac與英特爾Fortran 13.something搭配。當然,既然你只發布了一個語法上略微不正確的代碼部分,我不能肯定這會告訴你很多。

由於您未顯示您的代碼使用implicit none,因此您的錯誤可能低於all_locall_locs之間的差異或其他類似問題。

請注意,Fortran可分配陣列在調用pack之前不需要分配all_locs(n)%pars,因此編譯器會爲您負責。但是,這不是你錯誤的根源。

+0

感謝您的迴應。我不打算製作一個真正的完整程序,只是爲了填補問題代碼。謝謝你這麼做,但這對我不起作用。我可以像編譯代碼一樣編譯代碼,但是它會將每個all_locs%pars數組保留爲我的調試器中未定義的值,並且實際上添加一條寫入語句會將變量顯示爲空白。我在Linux上與ifort 12.1.3.293 – walrus

+0

啊,我得到它的工作。您指定粒子位置的方式出了問題,而且確實需要分配語句(也許您可以詳細說明爲什麼我不需要它?)。據我所知,我的錯誤在位置類型定義中,但是當我解決了我的問題時,我修復了它。我有「類型(par),allocatable :: pars(:)」而不是上面指定的尺寸(:)。 – walrus

+0

@walrus您需要-assume realloc_lhs(包含在通過-standard-semantics啓用的選項中)命令行選項啓用自動重新分配ifort中賦值的左側。 – IanH