Ответ ниже того, на который вы ссылаетесь , кажется, объясняет, в чем заключается проблема с многопроцессорностью и созданием экземпляров FMU.
Я пытался с пафосом , предложенным в этот ответ , но столкнуться с той же проблемой:
from pyfmi import load_fmu
from multiprocessing import Pool
from os import chdir
from pathos.multiprocessing import Pool
def ep_intialization(id):
chdir('folder' + str(id))
model = load_fmu('BouncingBall.fmu')
model.initialize(0,10)
return {id:model}
id_list = [1,2]
cpus = 2
data = ((id) for id in id_list)
pool = Pool(cpus)
out = pool.map(ep_intialization, data)
Это дает:
MaybeEncodingError: Error sending result: '[{1: <pyfmi.fmi.FMUModelME2 object at 0x564e0c529290>}]'. Reason: 'TypeError('self._context,self._fmu,self.callBackFunctions,self.callbacks cannot be converted to a Python object for pickling',)'
Вот еще одна идея:
Я полагаю, экземпляр работает медленно, потому что EnergyPlus связывает множество библиотек с FMU. Если все компоненты, которые вы моделируете, имеют один и тот же интерфейс (вход, выход, параметры), вы, вероятно, можете использовать один FMU с дополнительным параметром, который переключается между моделями.
Это было бы намного эффективнее: вы нужно было бы только создать экземпляр одного FMU и вызвать его параллельно с другими параметрами и входами.
Пример:
Я никогда не работал с EnergyPlus, но, возможно, следующий пример проиллюстрирует подход :
У вас есть три варианта здания, и вы просто заинтересованы в общем тепловом потоке по всей площади зданий в зависимости от «погоды» (что бы это ни значило - возможно, много переменных) .
Объедините все три здания в одну модель EnergyPlus и создайте вокруг них if или case (псевдокод):
if (id_building == 1) {
[model the building one]
elseif (if_building == 2) {
[model the building two]
[...]
Определите «погоду» или что вам нужно в качестве входной переменной для FMU и определите id_building также как параметр . Определите общий тепловой поток в качестве выходной переменной.
Это позволит вам выбрать здание до начала моделирования.
Два требования:
- Синтаксис EnergyPlus позволяет , если или case структуры.
- Все ваши модели работают с одним и тем же интерфейсом (в нашем примере у нас есть переменная погоды как in и переменная как out)
Существует грязный обходной путь для второго требования: просто определите все переменные, которые нужны всем вашим моделям, и используйте только то, что вам нужно в соответствующем блоке if.