У меня F # код, вычисляющий поток жидкости.Код состоит из 2 проектов.Базовая библиотека и проект для запуска симуляции.Когда я запускаю параметрическое исследование, например
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.Поэтому я ожидаю, что как только цикл перейдет к следующему циклу или как только произойдет конец Array.iter, все внутри будет стерто.
Спасибо за любую помощь, подсказку и т. Д .:)
Итак, я нашел, что было не так - Массив был прав!:) В coreLibrary мы используем ConcurrentDictionary.Мы хотели использовать Records вместо Classes (чтобы быть функциональными: D), и записи не позволяют создавать словарь внутри класса, поэтому словарь был создан вне класса и связан с записью функциями-членами.Итак, как только DLL была загружена, словарь был создан и оставался в живых навсегда ... Теперь мы изменили запись на класс, и все работает отлично.Большое спасибо за ваши подсказки