2016-03-04 51 views
0

我正在使用一個外部fortran庫,它返回大量的數據,其類型爲REAL(kind=8)。但是,我需要將數據寫出爲REAL(kind=4)Fortran:將KIND = 8數組有效轉換爲KIND = 4

將大量數據轉換爲不同的KIND類型的最佳方法是什麼?

我天真地只是這樣做的那一刻:

REAL(KIND=8), ALLOCATABLE :: data64(:,:) 
REAL(KIND=4), ALLOCATABLE :: data32(:,:) 

# allocate arrays and call external function 
CALL some_external_function(data64) 

# Convert to 32bit using simple assignment 
data32 = data64 

# Write out 32bit data.... 
WRITE(UOUT) data32 

然而,這種方法需要我來分配,而不是一個兩個大數組,做了很多數據的複製 - 似乎有些低效既尊重內存和處理...

有沒有更聰明的方法?

BTW:矩陣的大小不一定很大 - 它們可能會有所不同,但大概在1000 x 1000左右(但這將在循環中出現100次)。現代機器不是問題,但正如其中一條評論所暗示的那樣,我正在尋找一種優雅的解決方案,它也非常高效!做分配似乎......懶惰和不雅行爲?

+0

@HighPerformanceMark:我寫了一個未格式化(二進制)文件;它需要KIND = 4,因爲其他程序期望這種格式的數據。 – ccbunney

+0

如果你正在做'I/O'轉換的速度並不重要,因爲它將比磁盤寫入快幾個數量級。也許你想要的是最有效率的解決方案,而不是最有效的解決方案。 – ja72

+0

如何一次轉換一行然後在文件中追加該行。 – ja72

回答

1

這裏有優雅的你

write(uout) real(data64,kind(data32)) 
+0

你的意思是'真實(data64,kind(data32))'這裏,而不是int? – ccbunney

+0

我不知道你可以像這樣使用int()和real()。謝謝! – ccbunney

相關問題