2017-02-22 39 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。