2010-10-21 124 views
3

我有一個F#代碼計算液體流量。該代碼由2個項目組成。運行模擬的核心庫和項目。當我運行參數研究如F# - 變量範圍

open CoreLibrary 
for lbmViscosity in [0.1] do 
    for Re in [0.001; 0.5] do 
    for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do 
     simulation setup 
     let result = call CoreLibrary 
     save result to file 

然後我得到正確的結果。當我運行的代碼爲:

open CoreLibrary 
for lbmViscosity in [0.1] do 
    for Re in [0.1; 0.001; 0.5] do 
    for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do 
     simulation setup 
     let result = call CoreLibrary 
     save result to file 

然後,對於Re = 0.001,我得到了一個錯誤的結果。我也嘗試了Array.iter而不是for循環來獲得相同的結果。當我編譯我的代碼並將它作爲具有不同輸入參數的exe運行時,它運行良好。

除了突變之外,有什麼可能導致不正確的結果嗎?可能是垃圾收集器的錯?有什麼命令可以在某個地方完全清理內存嗎?類似於:

open CoreLibrary 
for lbmViscosity in [0.1] do 
    for Re in [0.1; 0.001; 0.5] do 
    for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do 
     clean everything 
     simulation setup 
     let result = call CoreLibrary 
     save result to file 

我只在覈心庫中的變異值不在for循環中。因此,我期望只要for循環進入下一個循環,或者Array.iter結束時,內部的所有內容都將被擦除。

感謝您的幫助,提示等:)


所以,我已經找到了什麼事 - 地塊是對的! :)在coreLibrary中,我們使用ConcurrentDictionary。我們希望使用記錄而不是類(功能:D),並且記錄不允許在類內部創建字典,因此字典已在類的外部創建並通過成員函數鏈接到記錄中。所以一旦dll載入字典已經創建並永遠保持活着...現在我們將記錄更改爲類,一切正常。非常感謝您的提示

+0

只要刪除'open CoreLibrary'行就不應該對代碼有任何影響。你可以從內部循環內粘貼確切的代碼行,或者找到一組具有相同問題的源代碼? – 2010-10-21 12:00:16

+0

開放的CoreLibrary應該無處不在。我修正了這一點。由於代碼複雜,我不確定我能否重現錯誤。我會盡量簡化代碼並將其作爲zip文件發佈。 – 2010-10-21 12:26:17

+2

我的猜測是CoreLibrary中的某些東西是在測試之間持續存在一個值(並且您承認它包含可變狀態) - 但是不知道那裏有什麼很難說。我在引用的代碼中看不到任何可能導致問題的內容。 – Massif 2010-10-21 12:26:34

回答

1

所以我發現有什麼問題 - Massif是對的! :)在coreLibrary中,我們使用ConcurrentDictionary。我們希望使用記錄而不是類(功能:D),並且記錄不允許在類內部創建字典,因此字典已在類的外部創建並通過成員函數鏈接到記錄中。所以一旦dll載入字典已經創建並永遠保持活着...現在我們將記錄更改爲類,一切正常。非常感謝您的提示

0

您使用的是什麼數據類型?您正在使用的浮點類型是否有可能引入表示錯誤?什麼構成「正確」和「不正確」的輸出?

作爲一般規則,打開或不打開庫不會對計算結果產生任何影響(假設代碼仍在編譯!)。