diff --git a/examples/mapdl_motorbike_frame/project_setup.py b/examples/mapdl_motorbike_frame/project_setup.py index 10c1dae4e..286503277 100644 --- a/examples/mapdl_motorbike_frame/project_setup.py +++ b/examples/mapdl_motorbike_frame/project_setup.py @@ -74,6 +74,7 @@ def create_project( project_api = ProjectApi(client, proj.id) + # File definitions log.debug("=== Files") cwd = os.path.dirname(__file__) files = [] @@ -121,21 +122,46 @@ def create_project( log.debug("=== JobDefinition with simulation workflow and parameters") job_def = JobDefinition(name="JobDefinition.1", active=True) + # Parameter definitions + params = [] # Input params: Dimensions of three custom tubes - float_input_params = [] for i in range(1, 4): - float_input_params.extend( + params.extend( [ FloatParameterDefinition( - name="tube%i_radius" % i, lower_limit=4.0, upper_limit=20.0, default=12.0 + name="tube%i_radius" % i, + lower_limit=4.0, + upper_limit=20.0, + default=12.0, + mode="input", ), FloatParameterDefinition( - name="tube%i_thickness" % i, lower_limit=0.5, upper_limit=2.5, default=1.0 + name="tube%i_thickness" % i, + lower_limit=0.5, + upper_limit=2.5, + default=1.0, + mode="input", ), ] ) - - float_input_params = project_api.create_parameter_definitions(float_input_params) + # Input params: Custom types used for all the different tubes of the frame + for i in range(1, 22): + params.append( + StringParameterDefinition( + name="tube%s" % i, default="1", value_list=["1", "2", "3"], mode="input" + ) + ) + # Output params + for pname in ["weight", "torsion_stiffness", "max_stress"]: + params.append(FloatParameterDefinition(name=pname, mode="output")) + # Runtime stats from MAPDL out file + params.append(FloatParameterDefinition(name="mapdl_elapsed_time_obtain_license", mode="output")) + params.append(FloatParameterDefinition(name="mapdl_cp_time", mode="output")) + params.append(FloatParameterDefinition(name="mapdl_elapsed_time", mode="output")) + # Create parameter definitions in project + params = project_api.create_parameter_definitions(params) + + # Parameter mappings param_mappings = [] pi = 0 for i in range(1, 4): @@ -143,7 +169,7 @@ def create_project( ParameterMapping( key_string="radius(%i)" % i, tokenizer="=", - parameter_definition_id=float_input_params[pi].id, + parameter_definition_id=params[pi].id, file_id=file_ids["inp"], ) ) @@ -152,77 +178,57 @@ def create_project( ParameterMapping( key_string="thickness(%i)" % i, tokenizer="=", - parameter_definition_id=float_input_params[pi].id, + parameter_definition_id=params[pi].id, file_id=file_ids["inp"], ) ) pi += 1 - - # Input params: Custom types used for all the different tubes of the frame - str_input_params = [] - for i in range(1, 22): - str_input_params.append( - StringParameterDefinition(name="tube%s" % i, default="1", value_list=["1", "2", "3"]) - ) - str_input_params = project_api.create_parameter_definitions(str_input_params) - for i in range(1, 22): param_mappings.append( ParameterMapping( key_string="tubes(%i)" % i, tokenizer="=", - parameter_definition_id=str_input_params[i - 1].id, + parameter_definition_id=params[pi].id, file_id=file_ids["inp"], ) ) - - # Output Params - output_params = [] - for pname in ["weight", "torsion_stiffness", "max_stress"]: - output_params.append(FloatParameterDefinition(name=pname)) - output_params = project_api.create_parameter_definitions(output_params) - for pd in output_params: + pi += 1 + for name in ["weight", "torsion_stiffness", "max_stress"]: param_mappings.append( ParameterMapping( - key_string=pd.name, + key_string=name, tokenizer="=", - parameter_definition_id=pd.id, + parameter_definition_id=params[pi].id, file_id=file_ids["results"], ) ) - - stat_params = [] - # # Collect some runtime stats from MAPDL out file - stat_params.append(FloatParameterDefinition(name="mapdl_elapsed_time_obtain_license")) - stat_params.append(FloatParameterDefinition(name="mapdl_cp_time")) - stat_params.append(FloatParameterDefinition(name="mapdl_elapsed_time")) - stat_params = project_api.create_parameter_definitions(stat_params) - + pi += 1 param_mappings.append( ParameterMapping( key_string="Elapsed time spent obtaining a license", tokenizer=":", - parameter_definition_id=stat_params[0].id, + parameter_definition_id=params[pi].id, file_id=file_ids["out"], ) ) + pi += 1 param_mappings.append( ParameterMapping( key_string="CP Time (sec)", tokenizer="=", - parameter_definition_id=stat_params[1].id, + parameter_definition_id=params[pi].id, file_id=file_ids["out"], ) ) + pi += 1 param_mappings.append( ParameterMapping( key_string="Elapsed Time (sec)", tokenizer="=", - parameter_definition_id=stat_params[2].id, + parameter_definition_id=params[pi].id, file_id=file_ids["out"], ) ) - # For demonstration purpose we also define some parameter replacements # that refer to task definition properties param_mappings.append( @@ -259,6 +265,7 @@ def create_project( file_id=file_ids["inp"], ) ) + param_mappings = project_api.create_parameter_mappings(param_mappings) # Task definition task_def = TaskDefinition( @@ -292,8 +299,9 @@ def create_project( task_def.execution_script_id = file_ids["exec_mapdl"] task_defs = [task_def] + task_defs = project_api.create_task_definitions(task_defs) - # # Fitness definition + # Fitness definition fd = FitnessDefinition(error_fitness=10.0) fd.add_fitness_term( name="weight", @@ -315,28 +323,24 @@ def create_project( ) job_def.fitness_definition = fd - task_defs = project_api.create_task_definitions(task_defs) - param_mappings = project_api.create_parameter_mappings(param_mappings) - - job_def.parameter_definition_ids = [ - pd.id for pd in float_input_params + str_input_params + output_params + stat_params - ] + job_def.parameter_definition_ids = [pd.id for pd in params] job_def.parameter_mapping_ids = [pm.id for pm in param_mappings] job_def.task_definition_ids = [td.id for td in task_defs] # Create job_definition in project job_def = project_api.create_job_definitions([job_def])[0] - job_def = project_api.get_job_definitions()[0] - log.debug(f"=== Create {num_jobs} jobs") jobs = [] + params = project_api.get_parameter_definitions() + input_float_params = [p for p in params if p.mode == "input" and p.type == "float"] + input_str_params = [p for p in params if p.mode == "input" and p.type == "string"] for i in range(num_jobs): values = { p.name: p.lower_limit + random.random() * (p.upper_limit - p.lower_limit) - for p in float_input_params + for p in input_float_params } - values.update({p.name: random.choice(p.value_list) for p in str_input_params}) + values.update({p.name: random.choice(p.value_list) for p in input_str_params}) jobs.append( Job(name=f"Job.{i}", values=values, eval_status="pending", job_definition_id=job_def.id) ) diff --git a/examples/mapdl_tyre_performance/project_setup.py b/examples/mapdl_tyre_performance/project_setup.py index 30fbc1e70..a2752c73e 100644 --- a/examples/mapdl_tyre_performance/project_setup.py +++ b/examples/mapdl_tyre_performance/project_setup.py @@ -117,6 +117,7 @@ def create_project( lower_limit=-8.0, upper_limit=8.0, default=0.0, + mode="input", ), FloatParameterDefinition( name="inflation_pressure", @@ -124,6 +125,7 @@ def create_project( lower_limit=0.15e06, upper_limit=0.3e06, default=0.24e06, + mode="input", ), FloatParameterDefinition( name="rotational_velocity", @@ -131,6 +133,7 @@ def create_project( lower_limit=0.0, upper_limit=70.0, default=50.0, + mode="input", ), FloatParameterDefinition( name="translational_velocity", @@ -138,6 +141,7 @@ def create_project( lower_limit=0.0, upper_limit=30.0, default=20.0, + mode="input", ), ] input_params = project_api.create_parameter_definitions(input_params) @@ -173,8 +177,10 @@ def create_project( # Collect some runtime stats from MAPDL out file output_params = [ - FloatParameterDefinition(name="mapdl_cp_time", display_text="MAPDL CP Time"), - FloatParameterDefinition(name="mapdl_elapsed_time", display_text="MAPDL Elapsed Time"), + FloatParameterDefinition(name="mapdl_cp_time", display_text="MAPDL CP Time", mode="output"), + FloatParameterDefinition( + name="mapdl_elapsed_time", display_text="MAPDL Elapsed Time", mode="output" + ), ] output_params = project_api.create_parameter_definitions(output_params) diff --git a/examples/python_large_output/project_setup.py b/examples/python_large_output/project_setup.py index 79d4e993e..9fb85493b 100644 --- a/examples/python_large_output/project_setup.py +++ b/examples/python_large_output/project_setup.py @@ -94,7 +94,9 @@ def main(client, use_exec_script, python_version=None) -> Project: # Input params input_params = [ - IntParameterDefinition(name="size", lower_limit=1, upper_limit=1000, default=1), + IntParameterDefinition( + name="size", lower_limit=1, upper_limit=1000, default=1, mode="input" + ), ] input_params = project_api.create_parameter_definitions(input_params) diff --git a/examples/python_linked_multi_process_step/project_setup.py b/examples/python_linked_multi_process_step/project_setup.py index 6ef948aae..5a72de038 100644 --- a/examples/python_linked_multi_process_step/project_setup.py +++ b/examples/python_linked_multi_process_step/project_setup.py @@ -102,10 +102,13 @@ def main(client, num_task_definitions, num_jobs, start, inactive, python_version log.debug("=== Parameters") params = [ - FloatParameterDefinition(name="start", lower_limit=1.0, upper_limit=start), + FloatParameterDefinition(name="start", lower_limit=1.0, upper_limit=start, mode="input"), ] params.extend( - [FloatParameterDefinition(name=f"product{i}") for i in range(num_task_definitions)] + [ + FloatParameterDefinition(name=f"product{i}", mode="output") + for i in range(num_task_definitions) + ] ) params = project_api.create_parameter_definitions(params) job_def.parameter_definition_ids = [o.id for o in params] diff --git a/examples/python_multi_process_step/project_setup.py b/examples/python_multi_process_step/project_setup.py index 6ca547793..9d16a8d6c 100644 --- a/examples/python_multi_process_step/project_setup.py +++ b/examples/python_multi_process_step/project_setup.py @@ -160,15 +160,18 @@ def main( mappings = [] for i in range(num_task_definitions): new_params = [ - IntParameterDefinition(name=f"period{i}", lower_limit=1, upper_limit=period, units="s"), IntParameterDefinition( - name=f"duration{i}", lower_limit=0, upper_limit=duration, units="s" + name=f"period{i}", lower_limit=1, upper_limit=period, units="s", mode="input" ), - IntParameterDefinition(name=f"steps{i}", units=""), + IntParameterDefinition( + name=f"duration{i}", lower_limit=0, upper_limit=duration, units="s", mode="input" + ), + IntParameterDefinition(name=f"steps{i}", units="", mode="output"), StringParameterDefinition( name=f"color{i}", value_list=["red", "blue", "green", "yellow", "cyan"], default='"orange"', + mode="input", ), ] new_params = project_api.create_parameter_definitions(new_params) diff --git a/examples/python_two_bar_truss_problem/project_setup.py b/examples/python_two_bar_truss_problem/project_setup.py index f9581281d..bcb8324d4 100644 --- a/examples/python_two_bar_truss_problem/project_setup.py +++ b/examples/python_two_bar_truss_problem/project_setup.py @@ -108,25 +108,45 @@ def main(client, num_jobs, use_exec_script, python_version=None) -> Project: # Input params input_params = [ FloatParameterDefinition( - name="height", lower_limit=10, upper_limit=100.0, default=30, units="in" + name="height", lower_limit=10, upper_limit=100.0, default=30, units="in", mode="input" ), FloatParameterDefinition( - name="diameter", lower_limit=0.2, upper_limit=5, default=3, units="in" + name="diameter", lower_limit=0.2, upper_limit=5, default=3, units="in", mode="input" ), FloatParameterDefinition( - name="thickness", lower_limit=0.03, upper_limit=0.6, default=0.15, units="in" + name="thickness", + lower_limit=0.03, + upper_limit=0.6, + default=0.15, + units="in", + mode="input", ), FloatParameterDefinition( - name="separation_distance", lower_limit=40, upper_limit=150, default=60, units="in" + name="separation_distance", + lower_limit=40, + upper_limit=150, + default=60, + units="in", + mode="input", ), FloatParameterDefinition( - name="young_modulus", lower_limit=1e6, upper_limit=1e8, default=3e7, units="lbs in^-2" + name="young_modulus", + lower_limit=1e6, + upper_limit=1e8, + default=3e7, + units="lbs in^-2", + mode="input", ), FloatParameterDefinition( - name="density", lower_limit=0.1, upper_limit=0.6, default=0.3, units="lbs in^-2" + name="density", + lower_limit=0.1, + upper_limit=0.6, + default=0.3, + units="lbs in^-2", + mode="input", ), FloatParameterDefinition( - name="load", lower_limit=1e1, upper_limit=1e5, default=66e3, units="lbs" + name="load", lower_limit=1e1, upper_limit=1e5, default=66e3, units="lbs", mode="input" ), ] input_params = project_api.create_parameter_definitions(input_params) @@ -177,10 +197,10 @@ def main(client, num_jobs, use_exec_script, python_version=None) -> Project: ] output_params = [ - FloatParameterDefinition(name="weight", units="lbs"), - FloatParameterDefinition(name="stress", units="ksi"), - FloatParameterDefinition(name="buckling_stress", units="ksi"), - FloatParameterDefinition(name="deflection", units="in"), + FloatParameterDefinition(name="weight", units="lbs", mode="output"), + FloatParameterDefinition(name="stress", units="ksi", mode="output"), + FloatParameterDefinition(name="buckling_stress", units="ksi", mode="output"), + FloatParameterDefinition(name="deflection", units="in", mode="output"), ] output_params = project_api.create_parameter_definitions(output_params) diff --git a/src/ansys/hps/client/jms/resource/parameter_definition.py b/src/ansys/hps/client/jms/resource/parameter_definition.py index aedc81e15..a039d2d56 100644 --- a/src/ansys/hps/client/jms/resource/parameter_definition.py +++ b/src/ansys/hps/client/jms/resource/parameter_definition.py @@ -83,8 +83,8 @@ class FloatParameterDefinition(ParameterDefinition): Units for the parameter. display_text : str, optional Text to display as the parameter name. - mode : str - Indicates whether it's an input or output parameter. The mode is filled server-side. + mode : str, optional + Indicates whether it's an input or output parameter. If not provided, the server will default the mode to ``input``. type : str default : float, optional Default parameter value. @@ -172,8 +172,8 @@ class IntParameterDefinition(ParameterDefinition): Units for the parameter. display_text : str, optional Text to display as the parameter name. - mode : str - Indicates whether it's an input or output parameter. The mode is filled server-side. + mode : str, optional + Indicates whether it's an input or output parameter. If not provided, the server will default the mode to ``input``. type : str default : int, optional Default parameter value. @@ -257,8 +257,8 @@ class BoolParameterDefinition(ParameterDefinition): Units for the parameter. display_text : str, optional Text to display as the parameter name. - mode : str - Indicates whether it's an input or output parameter. The mode is filled server-side. + mode : str, optional + Indicates whether it's an input or output parameter. If not provided, the server will default the mode to ``input``. type : str default : bool, optional Default parameter value. @@ -326,8 +326,8 @@ class StringParameterDefinition(ParameterDefinition): Units for the parameter. display_text : str, optional Text to display as the parameter name. - mode : str - Indicates whether it's an input or output parameter. The mode is filled server-side. + mode : str, optional + Indicates whether it's an input or output parameter. If not provided, the server will default the mode to ``input``. type : str default : str, optional Default parameter value. diff --git a/src/ansys/hps/client/jms/schema/parameter_definition.py b/src/ansys/hps/client/jms/schema/parameter_definition.py index 665184b12..b43793d9a 100644 --- a/src/ansys/hps/client/jms/schema/parameter_definition.py +++ b/src/ansys/hps/client/jms/schema/parameter_definition.py @@ -49,10 +49,11 @@ class Meta(ObjectSchemaWithModificationInfo.Meta): ) mode = fields.String( - load_only=True, + allow_none=True, metadata={ "description": "Indicates whether it's an input " - "or output parameter. The mode is filled server-side." + "or output parameter. If not provided, the server " + "will default the mode to input." }, ) diff --git a/tests/jms/test_parameter_definitions.py b/tests/jms/test_parameter_definitions.py index 7b186dc8d..1c13cb753 100644 --- a/tests/jms/test_parameter_definitions.py +++ b/tests/jms/test_parameter_definitions.py @@ -160,7 +160,6 @@ def test_parameter_definition_serialization(): assert serialized_ip["type"] == "int" assert serialized_ip["name"] == "int_param" assert serialized_ip["upper_limit"] == 27 - assert not "mode" in serialized_ip.keys() sp = StringParameterDefinition(name="s_param", value_list=["l1", "l2"]) serialized_sp = StringParameterDefinitionSchema().dump(sp)