Design evaluation#
You use the RootSystem
class to
create and evaluate designs. To access this class from the
Optislang
instance,
you use the Project.root_system
property:
from ansys.optislang.core import Optislang
from ansys.optislang.core.project_parametric import Design
from ansys.optislang.core import examples
from pathlib import Path
# open project with defined parameters
parametric_project = examples.get_files("calculator_with_params")[1][0]
osl = Optislang(project_path=parametric_project)
# do not modify original file
osl.application.save_as(Path.cwd() / "parametric_project.opf")
# get root system
root_system = osl.application.project.root_system
Note
The Design evaluation use case aims for creating and evaluating designs on the project root level. It is intended to be used when optiSLang is is being used in other environments to manage a parametric workflow, expose input and output parameters (that is parameters and responses), and evaluate designs based on this parametric workflow. This use case does not cover the generation or monitoring of designs of optiSLang internal nested analysis systems, such as Sensitivity and Optimization systems. To support the Design evaluation use case, the optiSLang project must be prepared in a certain way:
Create the workflow and register parameters and responses at the root system level.
Connect the workflow to the root system using the Receive designs and Send back designs options.
For more information, see the Ten bar truss example and the optiSLang user documentation on generating workflows.
Create a design#
To create an instance of the Design
class, you can obtain a design with reference values from the
RootSystem
class
and either modify its parameters or specify design parameters from scratch.
Create a design from reference values#
If a design has all parameters specified in the project, you can use the
get_reference_design()
method to obtain the design’s reference values. You can then modify
parameter values using methods in the
Design
class.
# ...
from ansys.optislang.core.project_parametric import DesignVariable
reference_design = root_system.get_reference_design()
# modify parameter value using ``name`` and ``value``
reference_design.set_parameter_by_name(name="a", value=12)
# instance of ``DesignVariable`` or ``Parameter`` can be used as well
a = DesignVariable(name="a", value=12)
reference_design.set_parameter(parameter=a)
Create a design from scratch#
You can create a design from scratch by directly creating an instance of the
Design
class.
You do not have to provide parameters when initializing a new design.
# design created directly using Design() class
direct_design = Design(parameters={"a": 3, "b": 4})
# create empty design and add parameters afterward
empty_design = Design()
empty_design.set_parameter_by_name(name="a", value=3)
empty_design.set_parameter_by_name(name="c", value=4)
# Remove a parameter if desired
empty_design.remove_parameter(name="c")
# Remove all parameters if desired
empty_design.clear_parameters()
Verify design parameters#
To verify if the design contains all parameters defined in the
project, you use the
get_missing_parameters_names()
method. To verify if the design contains parameters that are not defined
in the project, you use the
get_undefined_parameters_names()
method. Running these verifications are not necessary though, because they
always run internally while evaluating the design.
# ...
missing_parameters = root_system.get_missing_parameters(empty_design)
undefined_parameters = root_system.get_undefined_parameters(direct_design)
Evaluate the design#
To evaluate a design, you use the
evaluate_design()
method.
This method returns the same Design
instance with updated results.
# ...
# single design
result_design = root_system.evaluate_design(design=reference_design)
Note
optiSLang retains only the last evaluated design at the project root system.
If results of previous designs are required for later usage, you must store
them locally. For example, you can store results as an instance of
the Design
class.
Finally, when you are done using this Optislang
instance, use the dispose()
method
to close it:
osl.dispose()