2015-08-28 53 views
-1

我的代碼中包含2049個元素的數組。其中1681被稱爲流體粒子,368被稱爲邊界粒子。 現在粒子排列1681 + 368 = 2049。我需要添加40個粒子到我的陣列。新的粒子必須在1681年之後添加。我的問題是,如何從我的陣列中移動368以添加在1681之後爲40的新數字,以成爲總數= 2088。 請注意,我必須不時添加相同的編號到我的陣列添加數字並將其移動到Fortran中的同一個數組中

+1

這是一個相當混亂的問題,你可以請嘗試使用一些適當的文本格式和一個更容易理解的解釋你正在尋找什麼?對我來說,這聽起來像你正在尋找可以動態增長的數組? – haraldkl

+0

是的,我想我的數組自動增長取決於我的條件 –

+1

http://stackoverflow.com/q/7468268/1004168 – agentp

回答

1

您需要分配一個新的數組並複製它們。例如:

real, allocatable::a(:),tmp(:) 
allocate(a(4)) 
a=(/1,2,3,4/) 
write(*,*)a 
allocate(tmp(5)) 
tmp(1:2)=a(1:2) 
tmp(4:5)=a(3:4) 
tmp(3)=0 
call move_alloc(tmp,a) 
write(*,*)a 

1.0 2.0 3.0 4.0

1.0 2.0 0.0 3.0 4.0

注意如果你真的有一個塵封已久的f95編譯器瓦特/ move_alloc最後一行必須替換爲:

deallocate(a) 
allocate(a(5)) 
a=tmp 
deallocate(tmp) 

這可能需要兩倍於使用move_alloc,因爲它實際上覆制了兩次。如果你發現自己在大型數組中執行此操作,則應該升級編譯器。

+0

還有更簡潔的'a = [a(:2),0.,a(3 :)]'。 – francescalus

+0

不是w/f95。我猜這是2008年的標準? (不適用於ifort 13,這是我認爲2003兼容的) – agentp

+1

重新分配賦值以及使用數組構造函數的方括號都是Fortran 2003.ifort需要/標準語義才能工作,並且存在錯誤在左側重新分配的東西也出現在數組構造函數中。 – IanH

相關問題