порядок вызовов compute_partials за одну итерацию - PullRequest
0 голосов
/ 29 марта 2019

Чтобы минимизировать количество повторных вычислений за итерацию, я использовал некоторые дополнительные переменные класса в методе compute, которые также используются в compute_partials ().

(см. Фрагмент кода ниже, это будет оченьясно, что я имею в виду.)

Вопрос в том;

, есть ли какой-либо случай, когда compute_partials () вызывается перед compute ().Есть ли риск использования compute () и compute_partials () аналогично приведенному ниже коду (см. Эти два метода)

class MomentOfInertiaComp(ExplicitComponent):

    def initialize(self):
        self.options.declare('num_elements', types=int)
        self.options.declare('b')
        self.compcou=0
        self.partcou =0

    def setup(self):
        num_elements = self.options['num_elements']

        self.add_input('h', shape=num_elements)
        self.add_output('I', shape=num_elements)

        rows = np.arange(num_elements)
        cols = np.arange(num_elements)
        self.declare_partials('I', 'h', rows=rows, cols=cols)

    def compute(self, inputs, outputs):
        b = self.options['b']

        # Instead of this line 
        # outputs['I'] = 1./12. * b * inputs['h'] ** 3

        # these 2 lines are used
        self.var=inputs['h'] ** 2
        outputs['I'] = 1./12. * b * inputs['h'] * self.var


        self.compcou += 1

    def compute_partials(self, inputs, partials):
        b = self.options['b']
        self.partcou += 1
        # instead of this 
        # partials['I', 'h'] = 1./4. * b * inputs['h'] ** 2
        # this is used
        partials['I', 'h'] = 1./4. * b * self.var

1 Ответ

1 голос
/ 29 марта 2019

Openmdao не гарантирует, что compute вызывается до compute_partials.Вы должны предположить, что полностью независимы.

...