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

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

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

Ваше здоровье.


person Dime    schedule 12.10.2016    source источник


Ответы (1)


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

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 исключить эту часть модели как нерелевантную при расчете производной.

person Kenneth Moore    schedule 12.10.2016
comment
Может ли set_order (или, если уж на то пошло, OpenMDAO) поддерживать запуск двух компонентов, которые оба зависят только от вывода предыдущего компонента одновременно, или каждый компонент должен выполняться последовательно (в этом случае set_order может обеспечить соблюдение порядка). Как устанавливается порядок при соединении между выходом кода A и кодом B, и выходом C? Это порядок, в котором соединения сделаны? - person Dime; 13.10.2016
comment
Если вы хотите выполнять два (или более) компонента одновременно, поместите параллельно выполняющиеся компоненты в ParallelGroup (в отличие от стандартной группы). Вам придется работать с MPI. - person Rob Falck; 13.10.2016
comment
вы можете запускать несколько компонентов параллельно, используя параллельную группу. Вот несколько документов, которые показывают, как это сделать: parallel" rel="nofollow noreferrer">openmdao.readthedocs.io/en/1.7.2/usr-guide/examples/ - person Justin Gray; 13.10.2016
comment
Да, я пытался избежать MPI в этом конкретном случае. Я знаю о части MPI, хотя. Спасибо. - person Dime; 13.10.2016