diff --git a/docs/source/alfacase_definitions/AnnulusDescription.txt b/docs/source/alfacase_definitions/AnnulusDescription.txt index 7a17b52d2..9edd9e671 100644 --- a/docs/source/alfacase_definitions/AnnulusDescription.txt +++ b/docs/source/alfacase_definitions/AnnulusDescription.txt @@ -8,7 +8,7 @@ has_annulus_flow: bool pvt_model: \ :class:`Optional `\[str] = None initial_conditions: \ :class:`InitialConditionsDescription `\ = InitialConditionsDescription() - gas_lift_valve_equipment: \ :class:`Dict `\[str, \ :class:`GasLiftValveEquipmentDescription `\] = {} + equipment: \ :class:`AnnulusEquipmentDescription `\ = AnnulusEquipmentDescription() top_node: str .. tab:: Schema @@ -18,6 +18,5 @@ has_annulus_flow: boolean pvt_model: string # optional initial_conditions: \ :class:`initial_conditions_description_schema `\ # optional - gas_lift_valve_equipment: # optional - string: \ :class:`gas_lift_valve_equipment_description_schema ` + equipment: \ :class:`annulus_equipment_description_schema `\ # optional top_node: string diff --git a/docs/source/alfacase_definitions/AnnulusEquipmentDescription.txt b/docs/source/alfacase_definitions/AnnulusEquipmentDescription.txt new file mode 100644 index 000000000..616d15dc4 --- /dev/null +++ b/docs/source/alfacase_definitions/AnnulusEquipmentDescription.txt @@ -0,0 +1,18 @@ +.. rubric:: Definitions + +.. tab:: CaseDescription + + .. parsed-literal:: + + class AnnulusEquipmentDescription + leaks: \ :class:`Dict `\[str, \ :class:`LeakEquipmentDescription `\] = {} + gas_lift_valves: \ :class:`Dict `\[str, \ :class:`GasLiftValveEquipmentDescription `\] = {} + +.. tab:: Schema + + .. parsed-literal:: + + leaks: # optional + string: \ :class:`leak_equipment_description_schema ` + gas_lift_valves: # optional + string: \ :class:`gas_lift_valve_equipment_description_schema ` diff --git a/src/alfasim_sdk/__init__.py b/src/alfasim_sdk/__init__.py index f6aebb26e..12595224f 100644 --- a/src/alfasim_sdk/__init__.py +++ b/src/alfasim_sdk/__init__.py @@ -51,6 +51,7 @@ def get_alfasim_sdk_api_path(): EnvironmentPropertyDescription, ) from alfasim_sdk._internal.alfacase.case_description import EquipmentDescription +from alfasim_sdk._internal.alfacase.case_description import AnnulusEquipmentDescription from alfasim_sdk._internal.alfacase.case_description import FluidDescription from alfasim_sdk._internal.alfacase.case_description import FormationDescription from alfasim_sdk._internal.alfacase.case_description import FormationLayerDescription diff --git a/src/alfasim_sdk/_internal/alfacase/alfacase_to_case.py b/src/alfasim_sdk/_internal/alfacase/alfacase_to_case.py index e45ffe5db..1b7d2acd9 100644 --- a/src/alfasim_sdk/_internal/alfacase/alfacase_to_case.py +++ b/src/alfasim_sdk/_internal/alfacase/alfacase_to_case.py @@ -1360,9 +1360,12 @@ def generate_trend_description( def load_positional_pipe_trend_description( document: DescriptionDocument, ) -> List[case_description.PositionalPipeTrendDescription]: - alfacase_to_case_description = get_case_description_attribute_loader_dict( - case_description.PositionalPipeTrendDescription - ) + alfacase_to_case_description = { + "curve_names": load_value, + "location": get_enum_loader(enum_class=constants.OutputAttachmentLocation), + "element_name": load_value, + "position": get_scalar_loader(from_unit="m"), + } return [ generate_trend_description( alfacase_document, @@ -1492,7 +1495,7 @@ def load_annulus_description( "pvt_model": load_value, "top_node": load_value, "initial_conditions": load_initial_conditions_description, - "gas_lift_valve_equipment": load_gas_lift_valve_equipment_description, + "equipment": load_annulus_equipment_description, } case_values = to_case_values(document, alfacase_to_case_description) item_description = case_description.AnnulusDescription(**case_values) @@ -1730,6 +1733,21 @@ def load_wall_description( for alfacase_document in document ] +def load_leak_equipment_description( + document: DescriptionDocument, +) -> List[case_description.WallDescription]: + alfacase_to_case_description = get_case_description_attribute_loader_dict( + case_description.LeakEquipmentDescription + ) + + return { + key.data: _generate_description( + DescriptionDocument(value, document.file_path), + alfacase_to_case_description, + case_description.LeakEquipmentDescription, + ) + for key, value in document.content.items() + } def load_equipment_description( document: DescriptionDocument, @@ -1749,6 +1767,19 @@ def load_equipment_description( case_description.EquipmentDescription, ) +def load_annulus_equipment_description( + document: DescriptionDocument, +) -> case_description.EquipmentDescription: + alfacase_to_case_description = { + "gas_lift_valves": load_gas_lift_valve_equipment_description, + "leaks": load_leak_equipment_description, + } + return _generate_description( + document, + alfacase_to_case_description, + case_description.AnnulusEquipmentDescription, + ) + def load_x_and_y_description( document: DescriptionDocument, diff --git a/src/alfasim_sdk/_internal/alfacase/case_description.py b/src/alfasim_sdk/_internal/alfacase/case_description.py index 034cb9b84..52280e2ac 100644 --- a/src/alfasim_sdk/_internal/alfacase/case_description.py +++ b/src/alfasim_sdk/_internal/alfacase/case_description.py @@ -1818,10 +1818,20 @@ class GasLiftValveEquipmentDescription: discharge_coeff = attrib_scalar(category="dimensionless") +@attr.s() +class AnnulusEquipmentDescription: + """ + .. include:: /alfacase_definitions/EquipmentDescription.txt @ramon check this later + """ + + leaks = attrib_dict_of(LeakEquipmentDescription) + gas_lift_valves = attrib_dict_of(GasLiftValveEquipmentDescription) + + @attr.s(slots=True, kw_only=True) class AnnulusDescription: """ - .. include:: /alfacase_definitions/AnnulusDescription.txt + .. include:: /alfacase_definitions/AnnulusDescription.txt @ramon change this later """ has_annulus_flow: bool = attr.ib(validator=instance_of(bool)) @@ -1829,7 +1839,7 @@ class AnnulusDescription: default=None, validator=optional(instance_of(str)) ) initial_conditions = attrib_instance(InitialConditionsDescription) - gas_lift_valve_equipment = attrib_dict_of(GasLiftValveEquipmentDescription) + equipment = attrib_instance(AnnulusEquipmentDescription) top_node: str = attr.ib(validator=instance_of(str)) diff --git a/src/alfasim_sdk/_internal/alfacase/schema.py b/src/alfasim_sdk/_internal/alfacase/schema.py index 40563142f..332d7add6 100644 --- a/src/alfasim_sdk/_internal/alfacase/schema.py +++ b/src/alfasim_sdk/_internal/alfacase/schema.py @@ -926,6 +926,12 @@ Optional("wall_layer_container"): Seq(wall_layer_description_schema), } ) +annulus_equipment_description_schema = Map( + { + Optional("leaks"): MapPattern(Str(), leak_equipment_description_schema), + Optional("gas_lift_valves"): MapPattern(Str(), gas_lift_valve_equipment_description_schema), + } +) equipment_description_schema = Map( { Optional("mass_sources"): MapPattern(Str(), mass_source_equipment_description_schema), @@ -990,7 +996,7 @@ "has_annulus_flow": Bool(), Optional("pvt_model"): Str(), Optional("initial_conditions"): initial_conditions_description_schema, - Optional("gas_lift_valve_equipment"): MapPattern(Str(), gas_lift_valve_equipment_description_schema), + Optional("equipment"): annulus_equipment_description_schema, "top_node": Str(), } ) @@ -1060,5 +1066,5 @@ Optional("walls"): Seq(wall_description_schema), } ) -# [[[end]]] (checksum: 7831a597443e52a67a878e61ea546187) +# [[[end]]] (checksum: 23201f736ec577dad1d8948215d7cef3) # fmt: on diff --git a/tests/alfacase/test_alfacase_to_case.py b/tests/alfacase/test_alfacase_to_case.py index 6857bc2c7..240575f4c 100644 --- a/tests/alfacase/test_alfacase_to_case.py +++ b/tests/alfacase/test_alfacase_to_case.py @@ -414,6 +414,10 @@ def ensure_description_has_all_properties( description_expected=filled_case_descriptions.EQUIPMENT_DESCRIPTION, schema=schema.equipment_description_schema, ), + "AnnulusEquipmentDescription": AlfacaseTestConfig( + description_expected=filled_case_descriptions.ANNULUS_EQUIPMENT_DESCRIPTION, + schema=schema.annulus_equipment_description_schema, + ), "PipeDescription": AlfacaseTestConfig( description_expected=filled_case_descriptions.PIPE_DESCRIPTION, schema=schema.pipe_description_schema, diff --git a/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusDescription_.txt b/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusDescription_.txt index 7a17b52d2..9edd9e671 100644 --- a/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusDescription_.txt +++ b/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusDescription_.txt @@ -8,7 +8,7 @@ has_annulus_flow: bool pvt_model: \ :class:`Optional `\[str] = None initial_conditions: \ :class:`InitialConditionsDescription `\ = InitialConditionsDescription() - gas_lift_valve_equipment: \ :class:`Dict `\[str, \ :class:`GasLiftValveEquipmentDescription `\] = {} + equipment: \ :class:`AnnulusEquipmentDescription `\ = AnnulusEquipmentDescription() top_node: str .. tab:: Schema @@ -18,6 +18,5 @@ has_annulus_flow: boolean pvt_model: string # optional initial_conditions: \ :class:`initial_conditions_description_schema `\ # optional - gas_lift_valve_equipment: # optional - string: \ :class:`gas_lift_valve_equipment_description_schema ` + equipment: \ :class:`annulus_equipment_description_schema `\ # optional top_node: string diff --git a/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusEquipmentDescription_.txt b/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusEquipmentDescription_.txt new file mode 100644 index 000000000..616d15dc4 --- /dev/null +++ b/tests/alfacase/test_generate_case_description_docstring/test_generate_case_description_docstring_AnnulusEquipmentDescription_.txt @@ -0,0 +1,18 @@ +.. rubric:: Definitions + +.. tab:: CaseDescription + + .. parsed-literal:: + + class AnnulusEquipmentDescription + leaks: \ :class:`Dict `\[str, \ :class:`LeakEquipmentDescription `\] = {} + gas_lift_valves: \ :class:`Dict `\[str, \ :class:`GasLiftValveEquipmentDescription `\] = {} + +.. tab:: Schema + + .. parsed-literal:: + + leaks: # optional + string: \ :class:`leak_equipment_description_schema ` + gas_lift_valves: # optional + string: \ :class:`gas_lift_valve_equipment_description_schema ` diff --git a/tests/alfacase/test_generate_case_schema.py b/tests/alfacase/test_generate_case_schema.py index 8e780abef..8869f58db 100644 --- a/tests/alfacase/test_generate_case_schema.py +++ b/tests/alfacase/test_generate_case_schema.py @@ -402,6 +402,7 @@ def test_get_cases_class(): obtained = {class_.__name__ for class_ in list_of_classes_that_needs_schema} expected = { "AnnulusDescription", + "AnnulusEquipmentDescription", "BipDescription", "CaseDescription", "CaseOutputDescription", diff --git a/tests/alfacase/test_generate_case_schema/test_generate_schema_for_all_cases.txt b/tests/alfacase/test_generate_case_schema/test_generate_schema_for_all_cases.txt index 79e8faa00..07e379a79 100644 --- a/tests/alfacase/test_generate_case_schema/test_generate_schema_for_all_cases.txt +++ b/tests/alfacase/test_generate_case_schema/test_generate_schema_for_all_cases.txt @@ -982,6 +982,13 @@ wall_description_schema = Map( } ) +annulus_equipment_description_schema = Map( + { + Optional("leaks"): MapPattern(Str(), leak_equipment_description_schema), + Optional("gas_lift_valves"): MapPattern(Str(), gas_lift_valve_equipment_description_schema), + } +) + equipment_description_schema = Map( { Optional("mass_sources"): MapPattern(Str(), mass_source_equipment_description_schema), @@ -1052,7 +1059,7 @@ annulus_description_schema = Map( "has_annulus_flow": Bool(), Optional("pvt_model"): Str(), Optional("initial_conditions"): initial_conditions_description_schema, - Optional("gas_lift_valve_equipment"): MapPattern(Str(), gas_lift_valve_equipment_description_schema), + Optional("equipment"): annulus_equipment_description_schema, "top_node": Str(), } ) diff --git a/tests/common_testing/alfasim_sdk_common_testing/filled_case_descriptions.py b/tests/common_testing/alfasim_sdk_common_testing/filled_case_descriptions.py index be427dc9a..8b3e3bae8 100644 --- a/tests/common_testing/alfasim_sdk_common_testing/filled_case_descriptions.py +++ b/tests/common_testing/alfasim_sdk_common_testing/filled_case_descriptions.py @@ -424,7 +424,9 @@ pvt_model="gavea", top_node="mass_source_node", initial_conditions=INITIAL_CONDITIONS_DESCRIPTION, - gas_lift_valve_equipment={"My gas-lift valve": GAS_LIST_VALVE_DESCRIPTION}, + equipment=case_description.AnnulusEquipmentDescription( + gas_lift_valves={"My gas-lift valve": GAS_LIST_VALVE_DESCRIPTION}, + ), ) CASE_OUTPUT_DESCRIPTION = case_description.CaseOutputDescription( trends=TRENDS_OUTPUT_DESCRIPTION, @@ -492,6 +494,16 @@ opening_type=constants.ValveOpeningType.ConstantOpening, opening=Scalar("dimensionless", 42, "%"), ) +LEAK_EQUIPMENT_DESCRIPTION = case_description.LeakEquipmentDescription( + position=Scalar(350.0, "m"), + diameter=Scalar(0.025, "m"), + discharge_coefficient=Scalar(0.825, "-"), + location=LeakLocation.Annulus, + target_pipe_name="other_pipe", + target_position=Scalar(20.0, "m"), + target_location=LeakLocation.Main, + backflow=True, +) WALL_DESCRIPTION = case_description.WallDescription( name="Flowline", inner_roughness=Scalar(1, "mm"), @@ -509,6 +521,10 @@ compressors={"COMPRESSOR": COMPRESSOR_DESCRIPTION}, pigs={"PIG": PIG_DESCRIPTION}, ) +ANNULUS_EQUIPMENT_DESCRIPTION = case_description.AnnulusEquipmentDescription( + leaks={"LEAK": LEAK_EQUIPMENT_DESCRIPTION}, + gas_lift_valves={"GAS LIFT VALVE": GAS_LIST_VALVE_DESCRIPTION}, +) ENVIRONMENT_PROPERTY_DESCRIPTION = case_description.EnvironmentPropertyDescription( position=Scalar(1, "m"), temperature=Scalar(1, "degC"), @@ -763,17 +779,6 @@ ) ) -LEAK_EQUIPMENT_DESCRIPTION = case_description.LeakEquipmentDescription( - position=Scalar(350.0, "m"), - diameter=Scalar(0.025, "m"), - discharge_coefficient=Scalar(0.825, "-"), - location=LeakLocation.Annulus, - target_pipe_name="other_pipe", - target_position=Scalar(20.0, "m"), - target_location=LeakLocation.Main, - backflow=True, -) - PIG_DESCRIPTION = case_description.PigEquipmentDescription( position=Scalar(120.0, "m"), launch_times=Array([0.0, 50.0], "s"),