2010-10-21 120 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

您使用的是什么数据类型?您正在使用的浮点类型是否有可能引入表示错误?什么构成“正确”和“不正确”的输出?

作为一般规则,打开或不打开库不会对计算结果产生任何影响(假设代码仍在编译!)。