def test_incompatible_connections(self): class BadComp(om.ExplicitComponent): def setup(self): self.add_input('x2', 100.0, units='m') self.add_output('x3', 100.0) # Explicit Connection prob = om.Problem() prob.model.add_subsystem('src', SrcComp()) prob.model.add_subsystem('dest', BadComp()) prob.model.connect('src.x2', 'dest.x2') with self.assertRaises(Exception) as cm: prob.setup() expected_msg = "<model> <class Group>: Output units of 'degC' for 'src.x2' are incompatible with input units of 'm' for 'dest.x2'." self.assertEqual(expected_msg, str(cm.exception)) # Implicit Connection prob = om.Problem() prob.model.add_subsystem('src', SrcComp(), promotes=['x2']) prob.model.add_subsystem('dest', BadComp(), promotes=['x2']) with self.assertRaises(Exception) as cm: prob.setup() expected_msg = "<model> <class Group>: Output units of 'degC' for 'src.x2' are incompatible with input units of 'm' for 'dest.x2'." self.assertEqual(expected_msg, str(cm.exception))
def test_basic_implicit_conn(self): """Test units with all implicit connections.""" prob = om.Problem() prob.model.add_subsystem('px1', om.IndepVarComp('x1', 100.0), promotes_outputs=['x1']) prob.model.add_subsystem('src', SrcComp(), promotes_inputs=['x1'], promotes_outputs=['x2']) prob.model.add_subsystem('tgtF', TgtCompF(), promotes_inputs=['x2']) prob.model.add_subsystem('tgtC', TgtCompC(), promotes_inputs=['x2']) prob.model.add_subsystem('tgtK', TgtCompK(), promotes_inputs=['x2']) # Check the outputs after running to test the unit conversions prob.setup() prob.run_model() assert_near_equal(prob['x2'], 100.0, 1e-6) assert_near_equal(prob['tgtF.x3'], 212.0, 1e-6) assert_near_equal(prob['tgtC.x3'], 100.0, 1e-6) assert_near_equal(prob['tgtK.x3'], 373.15, 1e-6) # Check the total derivatives in forward mode wrt = ['x1'] of = ['tgtF.x3', 'tgtC.x3', 'tgtK.x3'] J = prob.compute_totals(of=of, wrt=wrt, return_format='flat_dict') assert_near_equal(J['tgtF.x3', 'x1'][0][0], 1.8, 1e-6) assert_near_equal(J['tgtC.x3', 'x1'][0][0], 1.0, 1e-6) assert_near_equal(J['tgtK.x3', 'x1'][0][0], 1.0, 1e-6) # Check the total derivatives in reverse mode 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['tgtF.x3', 'x1'][0][0], 1.8, 1e-6) assert_near_equal(J['tgtC.x3', 'x1'][0][0], 1.0, 1e-6) assert_near_equal(J['tgtK.x3', 'x1'][0][0], 1.0, 1e-6)
def test_incompatible_units(self): """Test error handling when only one of src and tgt have units.""" prob = om.Problem() prob.model.add_subsystem('px1', om.IndepVarComp('x1', 100.0), promotes_outputs=['x1']) prob.model.add_subsystem('src', SrcComp(), promotes_inputs=['x1']) prob.model.add_subsystem('tgt', om.ExecComp('yy=xx', xx={'value': 0.0, 'units': None})) prob.model.connect('src.x2', 'tgt.xx') msg = "Group (<model>): Output 'src.x2' with units of 'degC' is connected to input 'tgt.xx' which has no units." with assert_warning(UserWarning, msg): prob.setup()
def test_incompatible_units(self): """Test error handling when only one of src and tgt have units.""" prob = Problem(model=Group()) prob.model.add_subsystem('px1', IndepVarComp('x1', 100.0), promotes_outputs=['x1']) prob.model.add_subsystem('src', SrcComp(), promotes_inputs=['x1']) prob.model.add_subsystem('tgt', ExecComp('yy=xx', xx={'value': 0.0, 'units': 'unitless'})) prob.model.connect('src.x2', 'tgt.xx') msg = "Output 'src.x2' with units of 'degC' is connected to input 'tgt.xx' which has no units." with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") prob.setup() self.assertEqual(str(w[-1].message), msg)
def test_unit_conv_group(self, vec_class): if not vec_class: raise unittest.SkipTest("PETSc is not installed") prob = self.prob prob.model = Group() prob.model.add_subsystem('px1', IndepVarComp('x1', 100.0), promotes=['x1']) sub1 = prob.model.add_subsystem('sub1', Group()) sub2 = prob.model.add_subsystem('sub2', Group()) sub1.add_subsystem('src', SrcComp()) sub2.add_subsystem('tgtF', TgtCompF()) sub2.add_subsystem('tgtC', TgtCompC()) sub2.add_subsystem('tgtK', TgtCompK()) prob.model.connect('x1', 'sub1.src.x1') prob.model.connect('sub1.src.x2', 'sub2.tgtF.x2') prob.model.connect('sub1.src.x2', 'sub2.tgtC.x2') prob.model.connect('sub1.src.x2', 'sub2.tgtK.x2') sub2.approx_totals(method='cs') prob.setup(check=False, vector_class=vec_class) prob.run_model() assert_rel_error(self, prob['sub1.src.x2'], 100.0, 1e-6) assert_rel_error(self, prob['sub2.tgtF.x3'], 212.0, 1e-6) assert_rel_error(self, prob['sub2.tgtC.x3'], 100.0, 1e-6) assert_rel_error(self, prob['sub2.tgtK.x3'], 373.15, 1e-6) wrt = ['x1'] of = ['sub2.tgtF.x3', 'sub2.tgtC.x3', 'sub2.tgtK.x3'] J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, J['sub2.tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_rel_error(self, J['sub2.tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_rel_error(self, J['sub2.tgtK.x3']['x1'][0][0], 1.0, 1e-6) # Check the total derivatives in reverse mode prob.setup(check=False, vector_class=vec_class, mode='rev') prob.run_model() J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, J['sub2.tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_rel_error(self, J['sub2.tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_rel_error(self, J['sub2.tgtK.x3']['x1'][0][0], 1.0, 1e-6)
def test_unit_conv_group(self): prob = Problem() prob.model = Group() prob.model.add_subsystem('px1', IndepVarComp('x1', 100.0), promotes=['x1']) sub1 = prob.model.add_subsystem('sub1', Group()) sub2 = prob.model.add_subsystem('sub2', Group()) sub1.add_subsystem('src', SrcComp()) sub2.add_subsystem('tgtF', TgtCompF()) sub2.add_subsystem('tgtC', TgtCompC()) sub2.add_subsystem('tgtK', TgtCompK()) prob.model.connect('x1', 'sub1.src.x1') prob.model.connect('sub1.src.x2', 'sub2.tgtF.x2') prob.model.connect('sub1.src.x2', 'sub2.tgtC.x2') prob.model.connect('sub1.src.x2', 'sub2.tgtK.x2') sub2.approx_totals(method='fd') prob.setup(check=False) prob.run_model() assert_rel_error(self, prob['sub1.src.x2'], 100.0, 1e-6) assert_rel_error(self, prob['sub2.tgtF.x3'], 212.0, 1e-6) assert_rel_error(self, prob['sub2.tgtC.x3'], 100.0, 1e-6) assert_rel_error(self, prob['sub2.tgtK.x3'], 373.15, 1e-6) wrt = ['x1'] of = ['sub2.tgtF.x3', 'sub2.tgtC.x3', 'sub2.tgtK.x3'] J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, J['sub2.tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_rel_error(self, J['sub2.tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_rel_error(self, J['sub2.tgtK.x3']['x1'][0][0], 1.0, 1e-6) # Check the total derivatives in reverse mode prob.setup(check=False, mode='rev') prob.run_model() J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_rel_error(self, J['sub2.tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_rel_error(self, J['sub2.tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_rel_error(self, J['sub2.tgtK.x3']['x1'][0][0], 1.0, 1e-6)
def test_basic_grouped_bug_from_pycycle(self): prob = om.Problem() root = prob.model prob.model.add_subsystem('px1', om.IndepVarComp('x1', 100.0), promotes=['x1']) sub1 = prob.model.add_subsystem('sub1', om.Group(), promotes=['x2']) sub1.add_subsystem('src', SrcComp(), promotes=['x2']) root.add_subsystem('tgtF', TgtCompFMulti()) root.add_subsystem('tgtC', TgtCompC()) root.add_subsystem('tgtK', TgtCompK()) prob.model.connect('x1', 'sub1.src.x1') prob.model.connect('x2', 'tgtF.x2') prob.model.connect('x2', 'tgtC.x2') prob.model.connect('x2', 'tgtK.x2') prob.setup() prob.run_model() assert_near_equal(prob['x2'], 100.0, 1e-6) assert_near_equal(prob['tgtF.x3'], 212.0, 1e-6) assert_near_equal(prob['tgtC.x3'], 100.0, 1e-6) assert_near_equal(prob['tgtK.x3'], 373.15, 1e-6) wrt = ['x1'] of = ['tgtF.x3', 'tgtC.x3', 'tgtK.x3'] J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_near_equal(J['tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_near_equal(J['tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_near_equal(J['tgtK.x3']['x1'][0][0], 1.0, 1e-6) # Check the total derivatives in reverse mode prob.setup(check=False, mode='rev') prob.run_model() J = prob.compute_totals(of=of, wrt=wrt, return_format='dict') assert_near_equal(J['tgtF.x3']['x1'][0][0], 1.8, 1e-6) assert_near_equal(J['tgtC.x3']['x1'][0][0], 1.0, 1e-6) assert_near_equal(J['tgtK.x3']['x1'][0][0], 1.0, 1e-6)