我在FORTRAN 77中編寫了一個模擬程序,其中我需要從某些實驗數據中獲取參數值。數據來自互聯網數據庫,所以我已經預先下載了它,但是沒有簡單的數學模型可以用來連續提供數值 - 我只有離散的數據點。但是,我需要知道這個參數是否在x軸上有任何值,而不僅僅是我從數據庫中得到的離散值。實現高性能FORTRAN代碼查找的智能方法
爲了簡化,你可以說,我知道的f(x)
爲x
所有整數值的數值,需要一種方法來找到f(x)
任何實際x
值(從不以外的最小或最大x
我的知識)。
我的想法是獲取數據並進行線性插值,以便能夠獲取參數值;在僞代碼:
double xd = largest_data_x_lower_than(x)
double slope = (f(xd+dx)-f(xd))/dx // dx is the distance between two x values
double xtra = x-xd
double fofx = f(xd)+slope*xtra
要實現這一點,我需要對數據點進行某種查找。我可以通過從數據庫中獲取所有整數x
的值來簡化xd
的查找,以便xd = int(x)
和dx = 1
,但我仍然不知道如何實現f(xd)
的查找。
什麼是一個很好的實現方法?
在一次模擬運行期間,數值將被提取爲10^7到10^9次,因此性能至關重要。換句話說,每當我需要f(xd)
的值時,從IO中讀取數據不是一種選擇。
我目前在每行中有一對(製表符分隔)x,f(x)
的文本文件中的數據點,因此解決方案的獎勵點也提供了從那裏獲取數據的平滑方式,需要是。
FORTRAN 77由我正在工作的團隊強加於我。這是一個臨時職位,所以我決定迫使團隊繼續前行的好處不僅僅是學習:P如何將值讀入內存*只有一次*,而不必一直傳遞數組?這種查找是相當順利的 - 如果可能的話,我想避免在四個或五個地方添加一些額外的函數參數... – 2013-04-06 01:21:32
它是並行的,使用MPI - 換句話說,我運行該程序在一些單獨的進程中(但我不在進程內執行任何線程分支)。我認爲這個通用模塊將是最好的解決方案,以確保我能夠以安全的方式讀取文件 - 明天我會試試看,看看我能否實現它。好的; – 2013-04-07 21:19:31
好的;我現在已經決定採用一種可以在我的並行環境中安全線程工作的方法。我將讀入文件,並在主線程中創建一個足夠精細的x分辨率插值,然後將該線程廣播到所有其他線程。該向量將駐留在一個公共塊中,以避免將其作爲參數傳遞。如果遇到問題,這可能與方法的選擇無關,而是對我來說是一個笨拙的程序員,所以我現在會認爲這已經解決了。謝謝您的幫助! – 2013-04-08 16:42:48