def setup(self, check=False): """ Creates the containing `Problem` and performs needed initializations. Parameters ---------- check : bool If setup should run checks. """ args = self.args group = MODELS[self._group_type](**args) local_vec_class = args.get('local_vector_class', 'default') if local_vec_class == 'default': vec_class = DefaultVector elif local_vec_class == 'petsc': vec_class = PETScVector if PETScVector is None: raise SkipTest('PETSc not available.') else: raise RuntimeError("Unrecognized local_vector_class '%s'" % local_vec_class) self.problem = prob = Problem(group) if args['assembled_jac']: jacobian_type = args.get('jacobian_type', 'dense') if jacobian_type == 'dense': prob.model.jacobian = DenseJacobian() elif jacobian_type == 'sparse-coo': prob.model.jacobian = COOJacobian() elif jacobian_type == 'sparse-csr': prob.model.jacobian = CSRJacobian() elif jacobian_type == 'sparse-csc': prob.model.jacobian = CSCJacobian() prob.model.linear_solver = self.linear_solver_class( **self.linear_solver_options) prob.model.nonlinear_solver = self.solver_class(**self.solver_options) prob.set_solver_print(level=0) prob.setup(check=check, local_vector_class=vec_class) fail, rele, abse = prob.run_model() if fail: raise RuntimeError('Problem run failed: re %f ; ae %f' % (rele, abse))
def test_direct_solver_comp(self): """ Test the direct solver on a component. """ for jac in ['dict', 'coo', 'csr', 'csc', 'dense']: prob = Problem(model=ImplComp4Test()) prob.model.nonlinear_solver = NewtonSolver() prob.model.linear_solver = DirectSolver() prob.set_solver_print(level=0) if jac == 'dict': pass elif jac == 'csr': prob.model.jacobian = CSRJacobian() elif jac == 'csc': prob.model.jacobian = CSCJacobian() elif jac == 'coo': prob.model.jacobian = COOJacobian() elif jac == 'dense': prob.model.jacobian = DenseJacobian() prob.setup(check=False) if jac == 'coo': with self.assertRaises(Exception) as context: prob.run_model() self.assertEqual( str(context.exception), "Direct solver is not compatible with matrix type COOMatrix in system ''." ) continue prob.run_model() assert_rel_error(self, prob['y'], [-1., 1.]) d_inputs, d_outputs, d_residuals = prob.model.get_linear_vectors() d_residuals.set_const(2.0) d_outputs.set_const(0.0) prob.model.run_solve_linear(['linear'], 'fwd') result = d_outputs.get_data() assert_rel_error(self, result, [-2., 2.]) d_outputs.set_const(2.0) d_residuals.set_const(0.0) prob.model.run_solve_linear(['linear'], 'rev') result = d_residuals.get_data() assert_rel_error(self, result, [2., -2.])