es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Variables comunes para todos los subsistemas en OpenMDAO.

Estoy intentando construir un framework que comienza con la lectura de un archivo de entrada que contiene algunas claves y valores correspondientes. Luego actualizo las variables correspondientemente:

from Inertia import Inertia
...  

d = hf.read_input(fin)
locals().update(d)

Luego, estoy definiendo el grupo MDA:

class MDA(om.Group):

    class ObjCmp(om.ExplicitComponent):

        def setup(self):
            ...

        def setup_partials(self):
            ...

        def compute(self, inputs, outputs):
            ...

        def setup(self):
            ...

que contiene dos subsistemas (por ahora):

self.add_subsystem('d1', SomeModule(), promotes_inputs=['x1','x2'],
                        promotes_outputs=['y1','y2'])

self.add_subsystem('obj_cmp', self.ObjCmp(), promotes_inputs=['y1'],
                        promotes_outputs=['obj'])

Por razones de gestión, dado que el framework eventualmente contendrá un gran número de subsistemas, quiero mantener las clases que definen los subsistemas particulares en scripts separados, importados desde el script principal (el que define el Grupo).

El problema al que me enfrento es que si leo el archivo de entrada solo una vez en el nivel del script donde se define el Grupo (antes de ingresar a la clase Group()), las variables recuperadas de esta manera no están definidas en los niveles inferiores, por ejemplo, no las puedo usar dentro de SomeModule(). Normalmente definiría un método init() dentro de SomeModule() para poder pasar algunas variables:

def __init__(self, d):
    self.d = d

pero dado que instanciamos la clase SomeModule() dentro de self.add_subsystems(), no funciona. Agradecería mucho cualquier pista.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Podrías intentar pasar las variables al método add_subsystem como argumentos de palabras clave. Por ejemplo, si tienes una variable x que quieres pasar a SomeModule, podrías hacer:

    self.add_subsystem('d1', SomeModule(x=x), promotes_inputs=['x1', 'x2'], promotes_outputs=['y1', 'y2'])
    

    También podrías intentar usar el método set_input_defaults de la clase Group para establecer los valores predeterminados de las entradas de SomeModule. Por ejemplo, si quieres establecer el valor predeterminado de x en x_default, podrías hacer:

    self.set_input_defaults('d1.x', x_default)
    

    Puedes encontrar más información sobre estos métodos en la documentación de OpenMDAO.

Comments are closed.