【问题标题】:Error when finite differencing group with PBO带 PBO 的有限差分群时出错
【发布时间】:2016-02-24 00:32:51
【问题描述】:

所以我试图在一个组中进行有限差分,但我遇到了错误

  File "/usr/local/lib/python2.7/site-packages/openmdao/core/system.py", line 531, in fd_jacobian
    target_input[idx] += step
TypeError: '_ByObjWrapper' object does not support indexing

我已经追踪到它试图对 pass_by_obj 变量进行有限差分这一事实。当您对一个组件进行有限差分时,有限差分和 pbo 有效,但当您跨组进行有限差分时则失败。这是一个例子:

import numpy as np
from openmdao.api import Group, Problem, Component, ScipyGMRES, ExecComp, IndepVarComp, NLGaussSeidel

class C1(Component):
    def __init__(self):
        super(C1, self).__init__()
        self.add_param('x', shape=1)
        self.add_param('B', val=0, pass_by_obj=True)
        self.add_output('y', shape=1)
        self.fd_options['force_fd'] = True

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['y'] = 4.0*params['x']*params['B']

class C2(Component):
    def __init__(self):
        super(C2, self).__init__()
        self.add_param('y', shape=1)
        self.add_output('z', shape=1)
        self.fd_options['force_fd'] = True

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['z'] = 2.0*params['y']

class FDGroup(Group):
    def __init__(self):
        super(FDGroup, self).__init__()
        self.add('c1', C1(), promotes=['*'])
        self.add('c2', C2(), promotes=['*'])
        self.fd_options['force_fd'] = True # Comment and then it works

class RootGroup(Group):
    def __init__(self):
        super(RootGroup, self).__init__()
        self.add('x', IndepVarComp('x', 0.0), promotes=['*'])
        self.add('B', IndepVarComp('B', 0, pass_by_obj=True), promotes=['*'])
        self.add('fd_group', FDGroup(), promotes=['*'])


p = Problem()
p.root = RootGroup()
p.setup(check=False)
p['x'] = 1.5
p['B'] = 2
p.run()
test_grad = open('test_grad.txt', 'w')
total_gradients = p.check_total_derivatives(out_stream=test_grad)

print
print "Derivative 1 - FWD", total_gradients['z', 'x']['J_fwd']
print "Derivative 1 - FD", total_gradients['z', 'x']['J_fd']

print p['z']

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    感谢您提供错误报告和测试。我已经解决了这个问题。拉取请求已启动,可能会在一天内被接受,但如果您想早点尝试,可以从我的分支拉下它。

    https://github.com/OpenMDAO/OpenMDAO/pull/482

    【讨论】:

    • 非常感谢!我发现了另一个相关的错误。如果您添加 pbo 输出,那么当您跨组进行有限差异时,它也会失败。使用与上面相同的示例,如果您添加到 C1 组件: self.add_output('pbo_output', val=0, pass_by_obj=True) 那么您会收到错误: File "/usr/local/lib/python2.7/ site-packages/openmdao/core/system.py", line 590, in fd_jacobian jac[u_name, p_name][:, col] = result TypeError: float() argument must be a string or a number
    • 我应该考虑检查一下!无论如何,我已经修改了我的拉取请求以修复未知数。
    猜你喜欢
    • 2012-07-09
    • 2016-03-25
    • 2015-02-26
    • 1970-01-01
    • 2018-11-11
    • 2015-08-24
    • 2013-01-10
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多