def test_problem_definition_no_model(cleanup): for extension in ["toml", "yml"]: clear_openmdao_registry() conf = FASTOADProblemConfigurator() with pytest.raises(ValidationError) as exc_info: conf.load(pth.join(DATA_FOLDER_PATH, "missing_model.%s" % extension)) assert exc_info.value.message == "'model' is a required property"
def test_problem_definition_correct_configuration(cleanup): for extension in ["toml", "yml"]: clear_openmdao_registry() conf = FASTOADProblemConfigurator() conf.load(pth.join(DATA_FOLDER_PATH, "valid_sellar.%s" % extension)) assert conf.input_file_path == pth.join(RESULTS_FOLDER_PATH, "inputs.xml") assert conf.output_file_path == pth.join(RESULTS_FOLDER_PATH, "outputs.xml")
def test_problem_definition_module_folder_as_one_string(cleanup): for extension in ["toml", "yml"]: clear_openmdao_registry() conf = FASTOADProblemConfigurator() conf.load( pth.join(pth.dirname(__file__), "data", "module_folder_as_one_string.%s" % extension)) conf.get_problem()
def test_problem_definition_no_module_folder(cleanup): for extension in ["toml", "yml"]: clear_openmdao_registry() conf = FASTOADProblemConfigurator() conf.load(pth.join(DATA_FOLDER_PATH, "no_module_folder.%s" % extension)) with pytest.raises(FastBundleLoaderUnknownFactoryNameError) as exc_info: conf.get_problem() assert exc_info.value.factory_name == "configuration_test.sellar.functions"
def test_problem_definition_incorrect_attribute(cleanup): for extension in ["toml", "yml"]: clear_openmdao_registry() conf = FASTOADProblemConfigurator() conf.load(pth.join(DATA_FOLDER_PATH, "invalid_attribute.%s" % extension)) with pytest.raises(FASTConfigurationBadOpenMDAOInstructionError) as exc_info: problem = conf.get_problem(read_inputs=False) assert exc_info.value.key == "model.cycle.other_group.nonlinear_solver"
def test_problem_definition(cleanup): """ Test conf definition from configuration files """ # no input file conf = FASTOADProblemConfigurator() with pytest.raises(FASTConfigurationError) as exc_info: conf.load( pth.join(pth.dirname(__file__), "data", "missing_input_file.toml")) assert exc_info.value.missing_key == KEY_INPUT_FILE # no output file conf = FASTOADProblemConfigurator() with pytest.raises(FASTConfigurationError) as exc_info: conf.load( pth.join(pth.dirname(__file__), "data", "missing_output_file.toml")) assert exc_info.value.missing_key == KEY_OUTPUT_FILE # Missing model definition conf = FASTOADProblemConfigurator() with pytest.raises(FASTConfigurationError) as exc_info: conf.load(pth.join(pth.dirname(__file__), "data", "missing_model.toml")) assert exc_info.value.missing_section == TABLE_MODEL # Incorrect attribute conf = FASTOADProblemConfigurator() conf.load(pth.join(pth.dirname(__file__), "data", "invalid_attribute.toml")) with pytest.raises( FASTConfigurationBadOpenMDAOInstructionError) as exc_info: problem = conf.get_problem(read_inputs=False) assert exc_info.value.key == "model.cycle.other_group.nonlinear_solver" # Reading of a minimal conf (model = ExplicitComponent) conf = FASTOADProblemConfigurator() conf.load(pth.join(pth.dirname(__file__), "data", "disc1.toml")) problem = conf.get_problem(read_inputs=False) assert isinstance(problem.model.system, om.ExplicitComponent) # Reading of correct conf definition conf = FASTOADProblemConfigurator() conf.load(pth.join(pth.dirname(__file__), "data", "valid_sellar.toml")) assert conf.input_file_path == pth.join(RESULTS_FOLDER_PATH, "inputs.xml") assert conf.output_file_path == pth.join(RESULTS_FOLDER_PATH, "outputs.xml") # Just running these methods to check there is no crash. As simple assemblies of # other methods, their results should already be unit-tested. conf.write_needed_inputs() problem = conf.get_problem(read_inputs=True) problem.setup() assert isinstance(problem.model.cycle, om.Group) assert isinstance(problem.model.cycle.disc1, om.ExplicitComponent) assert isinstance(problem.model.cycle.disc2, om.ExplicitComponent) assert isinstance(problem.model.functions, om.ExplicitComponent) assert isinstance(problem.driver, om.ScipyOptimizeDriver) assert problem.driver.options["optimizer"] == "SLSQP" assert isinstance(problem.model.cycle.nonlinear_solver, om.NonlinearBlockGS) problem.run_driver() problem.run_model() assert np.isnan(problem["f"])
def list_systems(configuration_file_path: str = None, out: Union[IO, str] = sys.stdout, overwrite: bool = False): """ Writes list of available systems. If configuration_file_path is given and if it defines paths where there are registered systems, they will be listed too. :param configuration_file_path: :param out: the output stream or a path for the output file :param overwrite: if True and out is a file path, the file will be written even if one already exists :raise FastFileExistsError: if overwrite==False and out is a file path and the file exists """ if configuration_file_path: conf = FASTOADProblemConfigurator(configuration_file_path) conf.load(configuration_file_path) # As the problem has been configured, BundleLoader now knows additional registered systems if isinstance(out, str): if not overwrite and pth.exists(out): raise FastFileExistsError( "File %s not written because it already exists. " "Use overwrite=True to bypass." % out, out, ) make_parent_dir(out) out_file = open(out, "w") else: out_file = out out_file.writelines([ "== AVAILABLE SYSTEM IDENTIFIERS " + "=" * 68 + "\n", "-" * 100 + "\n" ]) for identifier in sorted(OpenMDAOSystemRegistry.get_system_ids()): path = BundleLoader().get_factory_path(identifier) domain = OpenMDAOSystemRegistry.get_system_domain(identifier) description = OpenMDAOSystemRegistry.get_system_description(identifier) if description is None: description = "" out_file.write(" IDENTIFIER: %s\n" % identifier) out_file.write(" PATH: %s\n" % path) out_file.write(" DOMAIN: %s\n" % domain.value) out_file.write(" DESCRIPTION: %s\n" % tw.indent(tw.dedent(description), " ")) out_file.write("-" * 100 + "\n") out_file.write("=" * 100 + "\n") out_file.writelines([ "\n== AVAILABLE PROPULSION WRAPPER IDENTIFIERS " + "=" * 56 + "\n", "-" * 100 + "\n" ]) for identifier in sorted(RegisterPropulsion.get_model_ids()): path = BundleLoader().get_factory_path(identifier) description = RegisterPropulsion.get_service_description(identifier) if description is None: description = "" out_file.write(" IDENTIFIER: %s\n" % identifier) out_file.write(" PATH: %s\n" % path) out_file.write(" DESCRIPTION: %s\n" % tw.indent(tw.dedent(description), " ")) out_file.write("-" * 100 + "\n") out_file.write("=" * 100 + "\n") if isinstance(out, str): out_file.close() _LOGGER.info("System list written in %s", out_file)