def test_simple_deriv_xfer(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.setup(check=False) prob.root.clear_dparams() prob.root.dumat[None].vec[:] = 0.0 prob.root.comp3.dpmat[None]['x1'] = 7. prob.root.comp3.dpmat[None]['x2'] = 11. prob.root._transfer_data(mode='rev', deriv=True) if not MPI or self.comm.rank == 0: self.assertEqual(prob.root.sub.comp1.dumat[None]['y'], 7.) if not MPI or self.comm.rank == 1: self.assertEqual(prob.root.sub.comp2.dumat[None]['y'], 11.) prob.root.clear_dparams() prob.root.comp3.dpmat[None]['x1'] = 0. prob.root.comp3.dpmat[None]['x2'] = 0. self.assertEqual(prob.root.comp3.dpmat[None]['x1'], 0.) self.assertEqual(prob.root.comp3.dpmat[None]['x2'], 0.) prob.root._transfer_data(mode='fwd', deriv=True) self.assertEqual(prob.root.comp3.dpmat[None]['x1'], 7.) self.assertEqual(prob.root.comp3.dpmat[None]['x2'], 11.)
def test_fan_in_grouped_GS_GS(self): prob = Problem() prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() prob.setup(check=False) prob.run() indep_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_metadata_recorded(self): prob = Problem(impl=impl) prob.root = FanInGrouped() rec = DumpRecorder(out=self.filename) rec.options['record_metadata'] = True rec.options['includes'] = ['p1.x1', 'p2.x2', 'comp3.y'] prob.driver.add_recorder(rec) prob.setup(check=False) rec.close() with open(self.expected_filename, 'r') as dumpfile: params = iteritems(prob.root.params) unknowns = iteritems(prob.root.unknowns) self.assertEqual("Metadata:\n", dumpfile.readline()) self.assertEqual("Params:\n", dumpfile.readline()) for name, metadata in params: fmat = " {0}: {1}\n".format(name, metadata) self.assertEqual(fmat, dumpfile.readline()) self.assertEqual("Unknowns:\n", dumpfile.readline()) for name, metadata in unknowns: fmat = " {0}: {1}\n".format(name, metadata) self.assertEqual(fmat, dumpfile.readline())
def test_fan_in_serial_sets(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() # Parallel Groups prob.driver.add_param('p1.x1') prob.driver.add_param('p2.x2') prob.driver.add_objective('comp3.y') prob.setup(check=False) prob.run() param_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(param_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6) J = prob.calc_gradient(param_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_fan_in_grouped(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = PetscKSP() param_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] prob.setup(check=False) prob.run() J = prob.calc_gradient(param_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6) J = prob.calc_gradient(param_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_fan_in_serial_sets_fwd(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() prob.root.ln_solver.options['mode'] = 'fwd' prob.root.sub.ln_solver.options['mode'] = 'fwd' prob.driver.add_desvar('p1.x1') prob.driver.add_desvar('p2.x2') prob.driver.add_objective('comp3.y') prob.setup(check=False) prob.run() indep_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_fan_in_parallel_sets_rev(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() prob.root.ln_solver.options['mode'] = 'rev' prob.root.sub.ln_solver.options['mode'] = 'rev' prob.driver.add_desvar('p1.x1') prob.driver.add_desvar('p2.x2') prob.driver.add_desvar('p3.x3') prob.driver.add_objective('comp3.y') prob.driver.parallel_derivs(['p1.x1', 'p2.x2']) if MPI: expected = [('p1.x1', 'p2.x2'), ('p3.x3', )] else: expected = [('p1.x1', ), ('p2.x2', ), ('p3.x3', )] self.assertEqual(prob.driver.desvars_of_interest(), expected) prob.setup(check=False) prob.run() indep_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_fan_in_parallel_sets_fwd(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() prob.root.ln_solver.options['mode'] = 'fwd' prob.root.sub.ln_solver.options['mode'] = 'fwd' prob.driver.add_desvar('p1.x1') prob.driver.add_desvar('p2.x2') prob.driver.add_desvar('p3.x3') prob.driver.add_objective('comp3.y') # make sure we can't mix inputs and outputs in parallel sets try: prob.driver.parallel_derivs(['p1.x1', 'comp3.y']) except Exception as err: self.assertEqual( str(err), "['p1.x1', 'comp3.y'] cannot be grouped because ['p1.x1'] are " "design vars and ['comp3.y'] are not.") else: self.fail("Exception expected") prob.driver.parallel_derivs(['p1.x1', 'p2.x2']) if MPI: expected = [('p1.x1', 'p2.x2'), ('p3.x3', )] else: expected = [('p1.x1', ), ('p2.x2', ), ('p3.x3', )] self.assertEqual(prob.driver.desvars_of_interest(), expected) # make sure we can't add a VOI to multiple groups if MPI: try: prob.driver.parallel_derivs(['p1.x1', 'p3.x3']) except Exception as err: self.assertEqual( str(err), "'p1.x1' cannot be added to VOI set ('p1.x1', 'p3.x3') " "because it already exists in VOI set: ('p1.x1', 'p2.x2')") else: self.fail("Exception expected") prob.setup(check=False) prob.run() indep_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_fan_in_grouped(self): prob = Problem() prob.root = FanInGrouped() prob.root.ln_solver = DirectSolver() prob.root.ln_solver.options['jacobian_method'] = 'assemble' prob.setup(check=False) prob.run() indep_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(indep_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6) J = prob.calc_gradient(indep_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)
def test_dump_converge_diverge_par(self): prob = Problem(impl=impl) prob.root = FanInGrouped() rec = DumpRecorder(out=self.filename) rec.options['record_metadata'] = False rec.options['record_params'] = True rec.options['record_resids'] = True rec.options['includes'] = ['p1.x1', 'p2.x2', 'comp3.y'] prob.driver.add_recorder(rec) prob.setup(check=False) prob.run() with open(self.expected_filename, 'r') as dumpfile: dump = dumpfile.readlines() self.assertEqual(dump[4], ' comp3.y: 29.0\n') self.assertEqual(dump[5], ' p1.x1: 1.0\n') self.assertEqual(dump[6], ' p2.x2: 1.0\n')
def test_fan_in_parallel_sets(self): prob = Problem(impl=impl) prob.root = FanInGrouped() prob.root.ln_solver = LinearGaussSeidel() prob.root.sub.ln_solver = LinearGaussSeidel() # auto calculated mode is fwd, so we don't have to set it explicitly # in the ln_solvers in order to have our voi subvecs allocated # properly. # Parallel Groups prob.driver.add_param('p1.x1') prob.driver.add_param('p2.x2') prob.driver.add_objective('comp3.y') # make sure we can't mix inputs and outputs in parallel sets try: prob.driver.parallel_derivs(['p1.x1', 'comp3.y']) except Exception as err: self.assertEqual( str(err), "['p1.x1', 'comp3.y'] cannot be grouped because ['p1.x1'] are " "params and ['comp3.y'] are not.") else: self.fail("Exception expected") prob.driver.parallel_derivs(['p1.x1', 'p2.x2']) self.assertEqual(prob.driver.params_of_interest(), [('p1.x1', 'p2.x2')]) # make sure we can't add a VOI to multiple groups try: prob.driver.parallel_derivs(['p1.x1', 'p3.x3']) except Exception as err: self.assertEqual( str(err), "'p1.x1' cannot be added to VOI set ('p1.x1', 'p3.x3') " "because it already exists in VOI set: ('p1.x1', 'p2.x2')") else: self.fail("Exception expected") prob.setup(check=False) prob.run() param_list = ['p1.x1', 'p2.x2'] unknown_list = ['comp3.y'] J = prob.calc_gradient(param_list, unknown_list, mode='rev', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6) J = prob.calc_gradient(param_list, unknown_list, mode='fwd', return_format='dict') assert_rel_error(self, J['comp3.y']['p1.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['comp3.y']['p2.x2'][0][0], 35.0, 1e-6)