简体   繁体   中英

F# - Scope of variables

I have an F# code computing liquid flow. The code consist of 2 projects. The core library and project to run simulations. When I run a parametric study like

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

then I obtain correct result. When I run the code as:

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

Then for Re = 0.001, I get a wrong result. I have also tried Array.iter instead of for loop with the same result. When I compile my code and run it as exe with different input parameters then it works well.

Is there anything which could cause an incorrect result aside from mutation? May it be Garbage collector's fault? And is there any command which would completely clean up a memory at certain place? Something like:

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

I mutate values only in the core library not in the for loops. Therefore I would expect that as soon as for loop goes to next cycle or as soon as the end of Array.iter occurs everything inside is erased.

Thanks for any help, hint etc :)


So I have found what was wrong - Massif was right! :) In the coreLibrary, we use ConcurrentDictionary. We wanted to use Records instead of Classes (to be functional :D) and records do not allow to create the dictionary inside of the class, so the dictionary has been created outside of the class and linked into the record by member functions. So once the dll was loaded the dictionary has been created and stayed alive for ever... Now we changed the record into class and everything works fine. Thank you very much for your hints

So I have found what was wrong - Massif was right! :) In the coreLibrary, we use ConcurrentDictionary. We wanted to use Records instead of Classes (to be functional :D) and records do not allow to create the dictionary inside of the class, so the dictionary has been created outside of the class and linked into the record by member functions. So once the dll was loaded the dictionary has been created and stayed alive for ever... Now we changed the record into class and everything works fine. Thank you very much for your hints

What data types are you using? Is it possible that the floating-point types that you are using are introducing representation errors? What constitutes "correct" and "incorrect" output?

As a general rule, opening or not opening a library won't have any impact on the result of a calculation (assuming that the code still compiles!).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM