Я пытаюсь объявить ввод с целыми числами по умолчанию, но это не представляется возможным. Я делаю ошибку, или в ядре openmdao принудительно применяется плавающий режим.
Вот фрагменты кода, которые я пробовал;
Ожидаемый результат примерно такой: array ([1, 1, 1])
Полученный вывод: [1. 1. 1.]
from openmdao.api import ExplicitComponent, Problem, IndepVarComp
import numpy as np
class CompAddWithArrayIndices(ExplicitComponent):
"""Component for tests for declaring with array val and array indices."""
def setup(self):
self.add_input('x_a', val=np.ones(6,dtype=int))
self.add_input('x_b', val=[1]*5)
self.add_output('y')
p = Problem(model=CompAddWithArrayIndices())
p.setup()
p.run_model()
print(p['x_a'])
print(p['x_b'])
#%%
from openmdao.api import ExplicitComponent, Problem, IndepVarComp
import numpy as np
class CompAddWithArrayIndices(ExplicitComponent):
"""Component for tests for declaring with array val and array indices."""
def setup(self):
self.add_input('x_a', val=np.zeros(3,dtype=int))
self.add_output('y')
prob = Problem()
ivc=IndepVarComp()
prob.model.add_subsystem('ivc', ivc,promotes=['*'])
ivc.add_output('x_a', val=np.ones(3,dtype=int))
prob.model.add_subsystem('comp1', CompAddWithArrayIndices(),promotes=['*'])
prob.setup()
prob.run_model()
print(prob['x_a'])
Переменные, добавленные через add_inputs
или add_outputs
, будут преобразованы в числа с плавающей запятой или массивы с плавающей запятой. Если вы хотите, чтобы переменная была int или любого другого дискретного типа, вы должны использовать add_discrete_input
и add_discrete_output
. Такие переменные будут передаваться между системами на основе информации о соединении, но попытки вычислить их производные предприниматься не будут.
Поддержка дискретных переменных была добавлена в OpenMDAO v2.5 в качестве экспериментальной функции (она все еще разрабатывается). Идентификатор фиксации 709401e535cf6933215abd942d4b4d49dbf61b2b в основной ветке, что проблема с продвижением была исправлена. Убедитесь, что вы используете последнюю версию OpenMDAO из этой фиксации или более позднюю
аналогично в другом моем коде, когда я делаю переход с непрерывного на дискретный ввод / вывод для 1 массива ввода / вывода, я получаю сообщение об ошибке TypeError: compute () принимает 3 позиционных аргумента, но было дано 5 Я не делаю никаких других изменений кода
Может быть, вы используете класс, в котором метод вычислений был реализован со старой подписью (compute(inputs, outputs)
), а не новый с дискретными входами и выходами?
Если компонент содержит дискретные входы или выходы, вызывается более длинная форма вычисления с двумя дополнительными аргументами (дискретные_входы и дискретные_выводы).
эти переменные также становятся недоступными с уровня проблемы? потому что, если я заменю add_output и add_input на add_discrete_output и add_discrete_input в нижнем примере (во фрагменте кода выше), я получаю ошибку KeyError: «Имя переменной« x_a »не найдено».