Требуются ли операции подключения для обеспечения соблюдения порядка выполнения в OpenMDAO?

#openmdao

#openmdao

Вопрос:

Я попытался обернуть три внешних кода с помощью OpenMDAO, используя компонент без параметров и неизвестных. Это связано с тем, что три кода принимают только входные и выходные файлы, и нет необходимости «подключать» входную переменную к выходной переменной. Однако коды не соответствуют последовательности (поскольку, очевидно, у них нет информации о зависимостях). Затем я увидел, что правильный способ сделать это — использовать ExternalCodeComponent , но даже тогда нам все равно нужно подключить вход к выходу через вызов connect .

Это единственный способ указать зависимость, используя метод connect для вывода одного компонента и ввода другого? Кажется излишним передавать выходные данные второму компоненту, когда выходные данные уже находятся во входном файле для следующего компонента. Если это обязательно, будет ли работать просто отправлять фиктивные значения через другой компонент, который никогда не используется, просто для определения зависимости?

Приветствия.

Ответ №1:

Вы можете установить порядок выполнения для подсистем в группе с помощью метода set order .

 def set_order(self, new_order):
    """ Specifies a new execution order for this system. This should only
    be called after all subsystems have been added.

    Args
    ----
    new_order : list of str
        List of system names in desired new execution order.
    """
  

Если вы хотите увидеть текущий порядок для этой системы, вы можете вызвать:

 my_system.list_order()
  

Вы должны быть осторожны, так как вы можете использовать set_order , чтобы заставить вещи выполняться в порядке, не соответствующем потоку данных.

Обратите внимание, это было быстрое решение вашего вопроса, но я думаю, что, вероятно, в целом для OpenMDAO лучше иметь некоторое представление о базовом потоке данных, чтобы другие функции, такие как средство просмотра потока данных, отображали вещи правильно. Очевидно, что вы можете заставить это работать, передавая что-то номинально в изолированный компонент и из него. Кроме того, если вы выполняете градиентную оптимизацию, соединения также не позволят OpenMDAO исключить эту часть модели как не относящуюся к вычислению производной.

Комментарии:

1. Может ли set_order (или, если на то пошло, поддерживает ли OpenMDAO) одновременный запуск двух компонентов, которые зависят только от выходных данных предыдущего компонента, или каждый компонент должен выполняться последовательно (в этом случае set_order может принудительно выполнять порядок). Как устанавливается порядок, когда выполняется подключение из вывода кода A к выводу кода B и C? Это порядок, в котором выполняются соединения?

2. Если вы хотите выполнить два (или более) компонента одновременно, поместите параллельно выполняющиеся компоненты в параллельную группу (в отличие от стандартной группы). Вам придется работать с MPI.

3. вы можете запускать несколько компонентов параллельно, используя параллельную группу. Вот несколько документов, которые показывают, как это сделать: openmdao.readthedocs.io/en/1.7.2/usr-guide/examples /…

4. Да, я пытался избежать MPI в этом конкретном случае. Однако я знаю о части MPI. Спасибо.