def test_double_diamond_model_complex_step(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.root.sub1.comp1.fd_options['form'] = 'complex_step' prob.root.sub1.sub2.comp2.fd_options['form'] = 'complex_step' prob.root.sub1.sub2.comp3.fd_options['form'] = 'complex_step' prob.root.sub1.comp4.fd_options['form'] = 'complex_step' prob.root.sub3.comp5.fd_options['form'] = 'complex_step' prob.root.sub3.comp6.fd_options['form'] = 'complex_step' prob.root.comp7.fd_options['form'] = 'complex_step' prob.setup(check=False) prob.run() data = prob.check_partial_derivatives(out_stream=None) for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][2], 0.0, 1e-5)
def test_converge_diverge_groups(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.root.ln_solver = LinearGaussSeidel() prob.setup(check=False) prob.run() # Make sure value is fine. assert_rel_error(self, prob['comp7.y1'], -102.7, 1e-6) indep_list = ['p.x'] unknown_list = ['comp7.y1'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='fd', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6)
def test_converge_diverge_groups(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.root.ln_solver = ScipyGMRES() prob.root.ln_solver.options['precondition'] = True prob.root.sub1.ln_solver = DirectSolver() prob.root.sub3.ln_solver = DirectSolver() prob.setup(check=False) prob.run() # Make sure value is fine. assert_rel_error(self, prob['comp7.y1'], -102.7, 1e-6) indep_list = ['p.x'] unknown_list = ['comp7.y1'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='fd', return_format='dict') assert_rel_error(self, J['comp7.y1']['p.x'][0][0], -40.75, 1e-6)
def test_full_model_fd_double_diamond_grouped(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.setup(check=False) prob.run() prob.root.fd_options['force_fd'] = True indep_list = ['sub1.comp1.x1'] unknown_list = ['comp7.y1'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['sub1.comp1.x1'][0][0], -40.75, 1e-6) prob.root.fd_options['form'] = 'central' J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['sub1.comp1.x1'][0][0], -40.75, 1e-6)
def test_converge_diverge_groups(self): prob = Problem() prob.root = Group() prob.root.add('sub', ConvergeDivergeGroups()) indep_list = ['sub.p.x'] unknown_list = ['sub.comp7.y1'] prob.setup(check=False) prob.run() J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6)
def test_converge_diverge_groups(self): prob = Problem() root = prob.root = Group() root.add('sub', ConvergeDivergeGroups()) indep_list = ['sub.p.x'] unknown_list = ['sub.comp7.y1'] prob.setup(check=False) prob.run() J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6) # Piggyback here to test out user calls to group.assemble_jacobian. J, idx_dict = root.assemble_jacobian() rs, re, cs, ce = idx_dict[('sub.sub1.comp1', ('y1', 'x1'))] self.assertEqual(J[rs:re, cs:ce], 8)
def test_converge_diverge_groups(self): prob = Problem() root = prob.root = Group() root.add('sub', ConvergeDivergeGroups()) root.fd_options['force_fd'] = True root.fd_options['form'] = 'complex_step' # We can't reach our desired accuracy with this step size in fd, but # we can with cs (where step size is irrelevant.) root.fd_options['step_size'] = 1.0e-4 prob.setup(check=False) prob.run() indep_list = ['sub.p.x'] unknown_list = ['sub.comp7.y1'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['sub.comp7.y1']['sub.p.x'][0][0], -40.75, 1e-6)
def test_full_model_fd_double_diamond_grouped_par_sys(self): prob = Problem() root = prob.root = Group() par = root.add('par', ParallelGroup()) par.add('sub', ConvergeDivergeGroups()) prob.setup(check=False) prob.run() prob.root.fd_options['force_fd'] = True # Make sure we don't get a key error. data = prob.check_total_derivatives(out_stream=None)
def test_double_diamond_model(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def test_double_diamond_model(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.setup(check=False) prob.run() data = prob.check_partial_derivatives(out_stream=None) for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][2], 0.0, 1e-5) self.assertEqual(len(data), 7) # Piggyback a test for the 'comps' option. data = prob.check_partial_derivatives(out_stream=None, comps=['sub1.sub2.comp3', 'comp7']) self.assertEqual(len(data), 2) self.assertTrue('sub1.sub2.comp3' in data) self.assertTrue('comp7' in data) with self.assertRaises(RuntimeError) as cm: data = prob.check_partial_derivatives(out_stream=None, comps=['sub1', 'bogus']) expected_msg = "The following are not valid comp names: ['bogus', 'sub1']" self.assertEqual(str(cm.exception), expected_msg) # This is a good test to piggyback the compact_print test mystream = StringIO() prob.check_partial_derivatives(out_stream=mystream, compact_print=True) text = mystream.getvalue() expected = "'y1' wrt 'x1' | 8.0000e+00 | 8.0000e+00 | 8.0000e+00 | 2.0013e-06 | 2.0013e-06 | 2.5016e-07 | 2.5016e-07" self.assertTrue(expected in text)
def test_full_model_fd_double_diamond_grouped(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.root.deriv_options['type'] = 'fd' prob.setup(check=False) prob.run() indep_list = ['sub1.comp1.x1'] unknown_list = ['comp7.y1'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['sub1.comp1.x1'][0][0], -40.75, 1e-6) # Cheat a bit so I can twiddle mode OptionsDictionary.locked = False prob.root.deriv_options['form'] = 'central' J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp7.y1']['sub1.comp1.x1'][0][0], -40.75, 1e-6)