2017-02-22 23 views
1

我试图使用复杂步骤获取OpenMDAO中一个简单组件的派生。虽然我有分析衍生物,但我想比较性能和复杂步骤。这是更大设计问题的一部分。在OpenMDAO组件中复杂步骤不能按预期工作

这里是一个小例子:

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

class SpatialBeamDisp(Component): 

    def __init__(self, ny): 
     super(SpatialBeamDisp, self).__init__() 

     self.ny = ny 

     self.add_param('disp_aug', val=np.zeros(((self.ny+1)*6), dtype='complex')) 
     self.add_output('disp', val=np.zeros((self.ny, 6), dtype='complex')) 

     # Comment out this line to use analytic derivatives 
     self.deriv_options['type'] = 'cs' 

    def solve_nonlinear(self, params, unknowns, resids): 
     # Obtain the relevant portions of disp_aug and store the reshaped 
     # displacements in disp 
     unknowns['disp'] = params['disp_aug'][:-6].reshape((self.ny, 6)) 

    def linearize(self, params, unknowns, resids): 
     jac = self.alloc_jacobian() 
     n = self.ny * 6 
     jac['disp', 'disp_aug'] = np.hstack((np.eye((n)), np.zeros((n, 6)))) 
     return jac 

top = Problem() 

root = top.root = Group() 

n = 5 

disp_aug = np.random.random(((n+1) * 6)) 

root.add('disp_input', IndepVarComp('disp_aug', disp_aug), promotes=['*']) 

root.add('disp_', SpatialBeamDisp(n), promotes=['*']) 

top.setup() 
top.run_once() 
top.check_partial_derivatives(compact_print=True) 

运行该代码原样产生一个不正确的雅可比,而注释出self.deriv_options['type' = 'cs'线和使用该解析表达式产生正确的雅可比。

我在Ubuntu上使用OpenMDAO 1.7.3和numpy 1.10.2。

我是否设置错误的复杂步骤衍生物?如果是这样的话,我应该如何编写这个组件才能具备复杂的功能?

+0

我已经解决了这个问题,为了达到我的目的,摆脱了重塑线并用一个明确的赋值循环取代了它,尽管我仍然觉得原来的代码展示已经奏效。 –

回答

0

问题是内存/指针相关的问题。基本上,当你完成切片和整形时,最后会看到原始数组,然后将其分配给unknowns['disp']。这项任务破坏了OpenMDAO指向它用来完成复杂步骤计算的原始数据的指针。您可以通过更改分配给索要数据复制到当前的存储位置,而不是明确地解决这个问题:

def solve_nonlinear(self, params, unknowns, resids): 
    # Obtain the relevant portions of disp_aug and store the reshaped 
    # displacements in disp 
    unknowns['disp'][:] = params['disp_aug'][:-6].reshape((self.ny, 6)) 

必须有OpenMDAO的CS代码的潜在错误,使得这一任务的保护需要虽然。这个问题没有显示出fd,只有cs。