2017-02-22 9 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だけで表示されます。

関連する問題