def test_debug_print_option_totals_color(self): prob = Problem() prob.model = FanInGrouped() prob.model.linear_solver = LinearBlockGS() prob.model.sub.linear_solver = LinearBlockGS() prob.model.add_design_var('iv.x1', parallel_deriv_color='par_dv') prob.model.add_design_var('iv.x2', parallel_deriv_color='par_dv') prob.model.add_design_var('iv.x3') prob.model.add_objective('c3.y') prob.driver.options['debug_print'] = ['totals'] prob.setup(check=False, mode='fwd') prob.set_solver_print(level=0) prob.run_driver() indep_list = ['iv.x1', 'iv.x2', 'iv.x3'] unknown_list = ['c3.y'] stdout = sys.stdout strout = StringIO() sys.stdout = strout try: _ = prob.compute_totals(unknown_list, indep_list, return_format='flat_dict', debug_print=not prob.comm.rank) finally: sys.stdout = stdout output = strout.getvalue() if not prob.comm.rank: self.assertTrue('Solving color: par_dv (iv.x1, iv.x2)' in output) self.assertTrue('Solving variable: iv.x3' in output)
def test_fan_in_parallel_sets_fwd(self): prob = om.Problem() prob.model = FanInGrouped() # An extra unconnected desvar was in the original test. prob.model.add_subsystem('p', om.IndepVarComp('x3', 0.0), promotes=['x3']) prob.model.linear_solver = om.LinearBlockGS() prob.model.sub.linear_solver = om.LinearBlockGS() prob.model.add_design_var('x1', parallel_deriv_color='par_dv') prob.model.add_design_var('x2', parallel_deriv_color='par_dv') prob.model.add_design_var('x3') prob.model.add_objective('c3.y') prob.setup(check=False, mode='fwd') prob.run_driver() indep_list = ['x1', 'x2'] unknown_list = ['c3.y'] J = prob.compute_totals(unknown_list, indep_list, return_format='flat_dict') assert_near_equal(J['c3.y', 'x1'][0][0], -6.0, 1e-6) assert_near_equal(J['c3.y', 'x2'][0][0], 35.0, 1e-6)
def test_debug_print_option_totals_color(self): prob = om.Problem() prob.model = FanInGrouped() # An extra unconnected desvar was in the original test. prob.model.add_subsystem('p', om.IndepVarComp('x3', 0.0), promotes=['x3']) prob.model.linear_solver = om.LinearBlockGS() prob.model.sub.linear_solver = om.LinearBlockGS() prob.model.add_design_var('x1', parallel_deriv_color='par_dv') prob.model.add_design_var('x2', parallel_deriv_color='par_dv') prob.model.add_design_var('x3') prob.model.add_objective('c3.y') prob.driver.options['debug_print'] = ['totals'] prob.setup(check=False, mode='fwd') prob.set_solver_print(level=0) prob.run_driver() indep_list = ['x1', 'x2', 'x3'] unknown_list = ['c3.y'] stdout = sys.stdout strout = StringIO() sys.stdout = strout try: _ = prob.compute_totals(unknown_list, indep_list, return_format='flat_dict', debug_print=not prob.comm.rank) finally: sys.stdout = stdout output = strout.getvalue() if not prob.comm.rank: self.assertTrue('Solving color: par_dv (x1, x2)' in output) self.assertTrue( 'In mode: fwd, Solving variable(s) using simul coloring:' in output) self.assertTrue("('p.x3', [2])" in output)
def test_minprocs_error(self): prob = Problem(FanInGrouped()) # require 2 procs for the ParallelGroup prob.model._proc_info['sub'] = (2, None, 1.0) # run cases on all procs prob.driver = DOEDriver(FullFactorialGenerator(levels=3)) prob.driver.options['parallel'] = True with self.assertRaises(RuntimeError) as context: prob.setup() self.assertEqual( str(context.exception), ": MPI process allocation failed: can't meet min_procs " "required for the following subsystems: ['sub']")
def test_fan_in_grouped(self): from openmdao.api import Problem from openmdao.test_suite.groups.parallel_groups import FanInGrouped from openmdao.api import DOEDriver, FullFactorialGenerator from openmdao.api import SqliteRecorder, CaseReader from mpi4py import MPI prob = Problem(FanInGrouped()) model = prob.model model.add_design_var('iv.x1', lower=0.0, upper=1.0) model.add_design_var('iv.x2', lower=0.0, upper=1.0) model.add_objective('c3.y') prob.driver = DOEDriver(FullFactorialGenerator(levels=3)) prob.driver.add_recorder(SqliteRecorder("cases.sql")) # run 2 cases at a time, each using 2 of our 4 procs doe_parallel = prob.driver.options['parallel'] = 2 prob.setup() prob.run_driver() prob.cleanup() rank = MPI.COMM_WORLD.rank # check recorded cases from each case file if rank < doe_parallel: filename = "cases.sql_%d" % rank cases = CaseReader(filename).driver_cases values = [] for n in range(cases.num_cases): outputs = cases.get_case(n).outputs values.append( (outputs['iv.x1'], outputs['iv.x2'], outputs['c3.y'])) self.assertEqual( "\n" + "\n".join([ "iv.x1: %5.2f, iv.x2: %5.2f, c3.y: %6.2f" % (x1, x2, y) for x1, x2, y in values ]), self.expect_text)
def test_fan_in_serial_sets_rev(self): prob = Problem() prob.model = FanInGrouped() prob.model.linear_solver = LinearBlockGS() prob.model.sub.linear_solver = LinearBlockGS() prob.model.add_design_var('iv.x1') prob.model.add_design_var('iv.x2') prob.model.add_objective('c3.y') prob.setup(vector_class=vector_class, check=False, mode='rev') prob.run_driver() indep_list = ['iv.x1', 'iv.x2'] unknown_list = ['c3.y'] J = prob.compute_totals(unknown_list, indep_list, return_format='dict') assert_rel_error(self, J['c3.y']['iv.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['c3.y']['iv.x2'][0][0], 35.0, 1e-6)
def test_fan_in_serial_sets_fwd(self): prob = om.Problem() prob.model = FanInGrouped() prob.model.linear_solver = om.LinearBlockGS() prob.model.sub.linear_solver = om.LinearBlockGS() prob.model.add_design_var('iv.x1') prob.model.add_design_var('iv.x2') prob.model.add_objective('c3.y') prob.setup(check=False, mode='fwd') prob.run_driver() indep_list = ['iv.x1', 'iv.x2'] unknown_list = ['c3.y'] J = prob.compute_totals(unknown_list, indep_list, return_format='flat_dict') assert_near_equal(J['c3.y', 'iv.x1'][0][0], -6.0, 1e-6) assert_near_equal(J['c3.y', 'iv.x2'][0][0], 35.0, 1e-6)
def test_fan_in_parallel_sets_fwd(self): prob = Problem() prob.model = FanInGrouped() prob.model.linear_solver = LinearBlockGS() prob.model.get_subsystem('sub').linear_solver = LinearBlockGS() prob.model.add_design_var('iv.x1', parallel_deriv_color='par_dv') prob.model.add_design_var('iv.x2', parallel_deriv_color='par_dv') prob.model.add_design_var('iv.x3') prob.model.add_objective('c3.y') prob.setup(vector_class=vector_class, check=False, mode='fwd') prob.run_driver() indep_list = ['iv.x1', 'iv.x2'] unknown_list = ['c3.y'] J = prob.compute_totals(unknown_list, indep_list, return_format='flat_dict') assert_rel_error(self, J['c3.y', 'iv.x1'][0][0], -6.0, 1e-6) assert_rel_error(self, J['c3.y', 'iv.x2'][0][0], 35.0, 1e-6)
def test_fan_in_grouped(self): # Test derivatives for fan-in-grouped topology. prob = Problem() prob.model = FanInGrouped() prob.model.linear_solver = self.linear_solver_class() prob.set_solver_print(level=0) prob.setup(check=False, mode='fwd') prob.run_model() wrt = ['iv.x1', 'iv.x2'] of = ['c3.y'] J = prob.compute_totals(of=of, wrt=wrt, return_format='flat_dict') assert_near_equal(J['c3.y', 'iv.x1'], [[-6.0]], 1e-6) assert_near_equal(J['c3.y', 'iv.x2'], [[35.0]], 1e-6) prob.setup(check=False, mode='rev') prob.run_model() J = prob.compute_totals(of=of, wrt=wrt, return_format='flat_dict') assert_near_equal(J['c3.y', 'iv.x1'], [[-6.0]], 1e-6) assert_near_equal(J['c3.y', 'iv.x2'], [[35.0]], 1e-6)
def test_fan_in_grouped_serial(self): # run cases on all procs (parallel model will run on single proc) doe_parallel = True prob = Problem(FanInGrouped()) model = prob.model model.add_design_var('iv.x1', lower=0.0, upper=1.0) model.add_design_var('iv.x2', lower=0.0, upper=1.0) model.add_objective('c3.y') prob.driver = DOEDriver(FullFactorialGenerator(levels=3)) prob.driver.add_recorder(SqliteRecorder("cases.sql")) prob.driver.options['parallel'] = doe_parallel prob.setup(check=False) failed, output = run_driver(prob) self.assertFalse(failed) prob.cleanup() expected = { 0: { 'iv.x1': np.array([0.]), 'iv.x2': np.array([0.]), 'c3.y': np.array([0.0]) }, 1: { 'iv.x1': np.array([.5]), 'iv.x2': np.array([0.]), 'c3.y': np.array([-3.0]) }, 2: { 'iv.x1': np.array([1.]), 'iv.x2': np.array([0.]), 'c3.y': np.array([-6.0]) }, 3: { 'iv.x1': np.array([0.]), 'iv.x2': np.array([.5]), 'c3.y': np.array([17.5]) }, 4: { 'iv.x1': np.array([.5]), 'iv.x2': np.array([.5]), 'c3.y': np.array([14.5]) }, 5: { 'iv.x1': np.array([1.]), 'iv.x2': np.array([.5]), 'c3.y': np.array([11.5]) }, 6: { 'iv.x1': np.array([0.]), 'iv.x2': np.array([1.]), 'c3.y': np.array([35.0]) }, 7: { 'iv.x1': np.array([.5]), 'iv.x2': np.array([1.]), 'c3.y': np.array([32.0]) }, 8: { 'iv.x1': np.array([1.]), 'iv.x2': np.array([1.]), 'c3.y': np.array([29.0]) }, } rank = prob.comm.rank size = prob.comm.size // doe_parallel num_cases = 0 # cases will be split across files for each proc up to the number requested filename = "cases.sql_%d" % rank expect_msg = "Cases from rank %d are being written to %s." % (rank, filename) self.assertTrue(expect_msg in output) cases = CaseReader(filename).driver_cases # cases recorded on this proc num_cases = cases.num_cases self.assertEqual(num_cases, len(expected) // size + (rank < len(expected) % size)) for n in range(num_cases): idx = n * size + rank # index of expected case outputs = cases.get_case(n).outputs self.assertEqual(outputs['iv.x1'], expected[idx]['iv.x1']) self.assertEqual(outputs['iv.x2'], expected[idx]['iv.x2']) self.assertEqual(outputs['c3.y'], expected[idx]['c3.y']) # total number of cases recorded across all requested procs num_cases = prob.comm.allgather(num_cases) self.assertEqual(sum(num_cases), len(expected))