From 5606ae844f671a6417d08c7e918b39b0b21ee4d6 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 10:41:36 -0700 Subject: [PATCH 01/12] HIP-RA-X README references --- src/hip_ra_x/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hip_ra_x/README.md b/src/hip_ra_x/README.md index 588b5414..d0862e85 100644 --- a/src/hip_ra_x/README.md +++ b/src/hip_ra_x/README.md @@ -1,3 +1,9 @@ -# HIP-RA-X +# HIP-RA: Heat In Place - Resource Assessment + +See: +1. [Heat in Place calculation: Muffler, P., and Raffaele Cataldi. "Methods for regional assessment of geothermal resources." Geothermics 7.2-4 (1978): 53-89.](https://github.com/NREL/GEOPHIRES-X/blob/95e21226faee12128b9ad5d5b12bbd662d02949b/References/Muffler-Cataldi_1978_%20HIP-RA.pdf) +1. [Garg, S.K. and J. Combs. 2011. A Reexamination of the USGS Volumetric "Heat in Place" Method. Stanford University, 36th Workshop on Geothermal Reservoir Engineering; SGP-TR-191, 5 pp.](https://github.com/NREL/GEOPHIRES-X/blob/95e21226faee12128b9ad5d5b12bbd662d02949b/References/Garg-Combs_2011_HIP-RA-Reexamination.pdf) + +## HIP-RA-X HIP-RA-X is the successor version to HIP-RA. From 600bb7d5369cc6cb10f0720076cbd387bb276cbe Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 10:54:10 -0700 Subject: [PATCH 02/12] Generate updated geophires-request.json --- src/geophires_x_schema_generator/geophires-request.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index de1ff81f..fb1e4cc8 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -1103,7 +1103,7 @@ "maximum": 200.0 }, "Economic Model": { - "description": "Specify the economic model to calculate the levelized cost of energy.1: Fixed Charge Rate (FCR); 2: Standard Levelized Cost; 3: BICYCLE; 4: Simple (CLGS)", + "description": "Specify the economic model to calculate the levelized cost of energy. 1: Fixed Charge Rate (FCR); 2: Standard Levelized Cost; 3: BICYCLE; 4: Simple (CLGS)", "type": "integer", "units": null, "category": "Economics", @@ -1824,7 +1824,7 @@ "maximum": 50000 }, "CO2 produced by Natural Gas": { - "description": "CO2 intensity of buring natural gas (how much CO2 is produced per kWh of heat produced (0.407855 lbs/kWh))", + "description": "CO2 intensity of burning natural gas (how much CO2 is produced per kWh of heat produced (0.070324961 lbs/kWh; https://www.epa.gov/energy/greenhouse-gases-equivalencies-calculator-calculations-and-references))", "type": "number", "units": "lbs/kWh", "category": "Economics", From 4791285ca247f67b4a79374e8de99b7ba396db86 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:06:31 -0700 Subject: [PATCH 03/12] Generate HIP-RA-X JSON schema --- src/geophires_x_schema_generator/.gitignore | 5 +- src/geophires_x_schema_generator/__init__.py | 37 ++-- .../hip-ra-x-request.json | 173 ++++++++++++++++++ src/geophires_x_schema_generator/main.py | 25 +-- 4 files changed, 217 insertions(+), 23 deletions(-) create mode 100644 src/geophires_x_schema_generator/hip-ra-x-request.json diff --git a/src/geophires_x_schema_generator/.gitignore b/src/geophires_x_schema_generator/.gitignore index c30948cb..a1de5eca 100644 --- a/src/geophires_x_schema_generator/.gitignore +++ b/src/geophires_x_schema_generator/.gitignore @@ -1 +1,4 @@ -parameters.rst +*parameters.rst +all_messages_conf.log +!geophires-request.json +!hip-ra-x-request.json diff --git a/src/geophires_x_schema_generator/__init__.py b/src/geophires_x_schema_generator/__init__.py index c0868395..0f965f22 100644 --- a/src/geophires_x_schema_generator/__init__.py +++ b/src/geophires_x_schema_generator/__init__.py @@ -24,6 +24,7 @@ from geophires_x.SUTRAReservoir import SUTRAReservoir from geophires_x.SUTRAWellBores import SUTRAWellBores from geophires_x.TDPReservoir import TDPReservoir +from hip_ra_x.hip_ra_x import HIP_RA_X class GeophiresXSchemaGenerator: @@ -41,17 +42,9 @@ def _get_dummy_model(self): sys.argv = stash_sys_argv os.chdir(stash_cwd) - def get_parameters_json(self) -> Tuple[str, str]: + def get_parameter_sources(self) -> list[Tuple[Any, str]]: dummy_model = self._get_dummy_model() - - def with_category(param_dict: dict, category: str): - def _with_cat(p: Parameter, cat: str): - p.parameter_category = cat - return p - - return {k: _with_cat(v, category) for k, v in param_dict.items()} - - parameter_sources = [ + return [ (dummy_model.reserv, 'Reservoir'), (TDPReservoir(dummy_model), 'Reservoir'), (LHSReservoir(dummy_model), 'Reservoir'), @@ -72,6 +65,19 @@ def _with_cat(p: Parameter, cat: str): (EconomicsAddOns(dummy_model), 'Economics'), ] + def get_schema_title(self) -> str: + return 'GEOPHIRES' + + def get_parameters_json(self) -> Tuple[str, str]: + + def with_category(param_dict: dict, category: str): + def _with_cat(p: Parameter, cat: str): + p.parameter_category = cat + return p + + return {k: _with_cat(v, category) for k, v in param_dict.items()} + + parameter_sources = self.get_parameter_sources() output_params = {} input_params = {} for param_source in parameter_sources: @@ -112,7 +118,7 @@ def generate_json_schema(self) -> dict: 'definitions': {}, '$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', - 'title': 'GEOPHIRES Schema', + 'title': f'{self.get_schema_title()} Schema', 'required': required, 'properties': properties, } @@ -230,3 +236,12 @@ def _get_min_and_max(param: dict, default_val='') -> Tuple: max_val = max(param['AllowableRange']) return (min_val, max_val) + + +class HipRaXSchemaGenerator(GeophiresXSchemaGenerator): + def get_parameter_sources(self) -> list[Tuple[Any, str]]: + dummy_model = HIP_RA_X() + return [(dummy_model, 'Default')] + + def get_schema_title(self) -> str: + return 'HIP-RA-X' diff --git a/src/geophires_x_schema_generator/hip-ra-x-request.json b/src/geophires_x_schema_generator/hip-ra-x-request.json new file mode 100644 index 00000000..626aab5f --- /dev/null +++ b/src/geophires_x_schema_generator/hip-ra-x-request.json @@ -0,0 +1,173 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "title": "HIP-RA-X Schema", + "required": [ + "Reservoir Temperature", + "Rejection Temperature", + "Reservoir Porosity", + "Reservoir Area", + "Reservoir Thickness", + "Reservoir Life Cycle", + "Rock Heat Capacity", + "Fluid Specific Heat Capacity", + "Density Of Reservoir Fluid", + "Density Of Reservoir Rock" + ], + "properties": { + "Reservoir Temperature": { + "description": "Reservoir Temperature [150 dec-C]", + "type": "number", + "units": "degC", + "category": "Default", + "default": 0.0, + "minimum": 50, + "maximum": 1000 + }, + "Rejection Temperature": { + "description": "Rejection Temperature [25 dec-C]", + "type": "number", + "units": "degC", + "category": "Default", + "default": 0.0, + "minimum": 0.1, + "maximum": 200 + }, + "Reservoir Porosity": { + "description": "Reservoir Porosity [18%]", + "type": "number", + "units": "%", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 + }, + "Reservoir Area": { + "description": "Reservoir Area [81 km2]", + "type": "number", + "units": "km**2", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 10000.0 + }, + "Reservoir Thickness": { + "description": "Reservoir Thickness [0.286 km]", + "type": "number", + "units": "kilometer", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 10000.0 + }, + "Reservoir Life Cycle": { + "description": "Reservoir Life Cycle [30 years]", + "type": "integer", + "units": "yr", + "category": "Default", + "default": null, + "minimum": 1, + "maximum": 100 + }, + "Rock Heat Capacity": { + "description": "Rock Heat Capacity [2.84E+12 kJ/km3C]", + "type": "number", + "units": "kJ/km**3C", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 100000000000000.0 + }, + "Fluid Specific Heat Capacity": { + "description": "Specific Heat Capacity Of Water [4.18 kJ/kgC]", + "type": "number", + "units": "kJ/kgC", + "category": "Default", + "default": 0.0, + "minimum": 3.0, + "maximum": 10.0 + }, + "Density Of Reservoir Fluid": { + "description": "Density Of Water [1.0E+12 kg/km3]", + "type": "number", + "units": "kg/km**3", + "category": "Default", + "default": 0.0, + "minimum": 100000000000.0, + "maximum": 10000000000000.0 + }, + "Density Of Reservoir Rock": { + "description": "Density Of Rock [2.55E+12 kg/km3]", + "type": "number", + "units": "kg/km**3", + "category": "Default", + "default": 0.0, + "minimum": 100000000000.0, + "maximum": 10000000000000.0 + }, + "Rock Recoverable Heat": { + "description": "percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", + "type": "number", + "units": "", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 + }, + "Fluid Recoverable Heat": { + "description": "percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", + "type": "number", + "units": "", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 + }, + "Recoverable Fluid Factor": { + "description": "percent of fluid that is recoverable from the reservoir (0.5 = 50%)", + "type": "number", + "units": "", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 + }, + "Reservoir Depth": { + "description": "depth to top of reservoir (km). Calculated based on an assumed gradient and the reservoir temperature if no value given", + "type": "number", + "units": "kilometer", + "category": "Default", + "default": 0.0, + "minimum": 0.001, + "maximum": 15.0 + }, + "Reservoir Pressure": { + "description": "pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and reservoir depth & water density if no value given", + "type": "number", + "units": "mPa", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 10000.0 + }, + "Recoverable Heat from Rock": { + "description": "percent of fluid that is recoverable from the reservoir (0.75 = 75%)", + "type": "number", + "units": "", + "category": "Default", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 + }, + "HTML Output File": { + "description": "Provide a HTML output name if you want to have HTML output (no output if not provided)", + "type": "string", + "units": null, + "category": "Default", + "default": null, + "minimum": null, + "maximum": null + } + } +} diff --git a/src/geophires_x_schema_generator/main.py b/src/geophires_x_schema_generator/main.py index d02b039f..7dfeea9a 100644 --- a/src/geophires_x_schema_generator/main.py +++ b/src/geophires_x_schema_generator/main.py @@ -3,6 +3,7 @@ from pathlib import Path from geophires_x_schema_generator import GeophiresXSchemaGenerator +from geophires_x_schema_generator import HipRaXSchemaGenerator if __name__ == '__main__': parser = argparse.ArgumentParser() @@ -20,18 +21,20 @@ build_dir.mkdir(exist_ok=True) - build_path = Path(build_dir, 'geophires-request.json') + def build(json_file_name: str, generator: GeophiresXSchemaGenerator, rst_file_name: str): + build_path = Path(build_dir, json_file_name) + schema_json = generator.generate_json_schema() - generator = GeophiresXSchemaGenerator() + with open(build_path, 'w') as f: + f.write(json.dumps(schema_json, indent=2)) + print(f'Wrote JSON schema file to {build_path}.') - schema_json = generator.generate_json_schema() + rst = generator.generate_parameters_reference_rst() - with open(build_path, 'w') as f: - f.write(json.dumps(schema_json, indent=2)) - print(f'Wrote schema file to {build_path}.') + build_path_rst = Path(build_dir, rst_file_name) + with open(build_path_rst, 'w') as f: + f.write(rst) + print(f'Wrote RST file to {build_path_rst}.') - rst = generator.generate_parameters_reference_rst() - - build_path_rst = Path(build_dir, 'parameters.rst') - with open(build_path_rst, 'w') as f: - f.write(rst) + build('geophires-request.json', GeophiresXSchemaGenerator(), 'parameters.rst') + build('hip-ra-x-request.json', HipRaXSchemaGenerator(), 'hip_ra_x_parameters.rst') From 27a1c8a83c8c765978b2648e1ef6de2cbbfb33aa Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:26:25 -0700 Subject: [PATCH 04/12] Use null category instead of potentially confusing 'Default' for HIP-RA-X params. Include HIP-RA-X parameters in sphinx docs --- .gitignore | 3 ++ docs/index.rst | 1 + src/geophires_x_schema_generator/__init__.py | 13 +++---- .../geophires-request.json | 2 +- .../hip-ra-x-request.json | 34 +++++++++---------- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 51095ee9..78f3fa8f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ requirements.txt .DS_Store *.lock *.json +all_messages_conf.log # C extensions *.so @@ -81,6 +82,8 @@ docs/reference/geophires-request.json docs/reference/parameters.rst docs/geophires-request.json docs/parameters.rst +docs/hip-ra-x-request.json +docs/hip_ra_x_parameters.rst _site/ /docs/geophires_x.rstx /docs/temperature.txt diff --git a/docs/index.rst b/docs/index.rst index 157002af..a48bbd68 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,6 +8,7 @@ Contents overview parameters How-to-extend-GEOPHIRES-X + hip_ra_x_parameters Monte-Carlo-User-Guide .. reference/index diff --git a/src/geophires_x_schema_generator/__init__.py b/src/geophires_x_schema_generator/__init__.py index 0f965f22..59293508 100644 --- a/src/geophires_x_schema_generator/__init__.py +++ b/src/geophires_x_schema_generator/__init__.py @@ -66,7 +66,7 @@ def get_parameter_sources(self) -> list[Tuple[Any, str]]: ] def get_schema_title(self) -> str: - return 'GEOPHIRES' + return 'GEOPHIRES-X' def get_parameters_json(self) -> Tuple[str, str]: @@ -138,10 +138,11 @@ def generate_parameters_reference_rst(self) -> str: input_params_by_category[category][input_param_name] = input_param def get_input_params_table(category_params, category_name) -> str: + category_display = category_name if category_name is not None else '' input_rst = f""" -{category_name} -{'-' * len(category_name)} - .. list-table:: {category_name} Parameters +{category_display} +{'-' * len(category_display)} + .. list-table:: {category_display}{' ' if len(category_display) > 0 else ''}Parameters :header-rows: 1 * - Name @@ -176,7 +177,7 @@ def get_input_params_table(category_params, category_name) -> str: output_rst = self.get_output_params_table_rst(output_params_json) - rst = f"""Parameters + rst = f"""{self.get_schema_title()} Parameters ========== .. contents:: @@ -241,7 +242,7 @@ def _get_min_and_max(param: dict, default_val='') -> Tuple: class HipRaXSchemaGenerator(GeophiresXSchemaGenerator): def get_parameter_sources(self) -> list[Tuple[Any, str]]: dummy_model = HIP_RA_X() - return [(dummy_model, 'Default')] + return [(dummy_model, None)] def get_schema_title(self) -> str: return 'HIP-RA-X' diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index fb1e4cc8..107a043e 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -2,7 +2,7 @@ "definitions": {}, "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", - "title": "GEOPHIRES Schema", + "title": "GEOPHIRES-X Schema", "required": [ "Reservoir Model", "Reservoir Depth", diff --git a/src/geophires_x_schema_generator/hip-ra-x-request.json b/src/geophires_x_schema_generator/hip-ra-x-request.json index 626aab5f..0319dbe3 100644 --- a/src/geophires_x_schema_generator/hip-ra-x-request.json +++ b/src/geophires_x_schema_generator/hip-ra-x-request.json @@ -20,7 +20,7 @@ "description": "Reservoir Temperature [150 dec-C]", "type": "number", "units": "degC", - "category": "Default", + "category": null, "default": 0.0, "minimum": 50, "maximum": 1000 @@ -29,7 +29,7 @@ "description": "Rejection Temperature [25 dec-C]", "type": "number", "units": "degC", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.1, "maximum": 200 @@ -38,7 +38,7 @@ "description": "Reservoir Porosity [18%]", "type": "number", "units": "%", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 100.0 @@ -47,7 +47,7 @@ "description": "Reservoir Area [81 km2]", "type": "number", "units": "km**2", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 10000.0 @@ -56,7 +56,7 @@ "description": "Reservoir Thickness [0.286 km]", "type": "number", "units": "kilometer", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 10000.0 @@ -65,7 +65,7 @@ "description": "Reservoir Life Cycle [30 years]", "type": "integer", "units": "yr", - "category": "Default", + "category": null, "default": null, "minimum": 1, "maximum": 100 @@ -74,7 +74,7 @@ "description": "Rock Heat Capacity [2.84E+12 kJ/km3C]", "type": "number", "units": "kJ/km**3C", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 100000000000000.0 @@ -83,7 +83,7 @@ "description": "Specific Heat Capacity Of Water [4.18 kJ/kgC]", "type": "number", "units": "kJ/kgC", - "category": "Default", + "category": null, "default": 0.0, "minimum": 3.0, "maximum": 10.0 @@ -92,7 +92,7 @@ "description": "Density Of Water [1.0E+12 kg/km3]", "type": "number", "units": "kg/km**3", - "category": "Default", + "category": null, "default": 0.0, "minimum": 100000000000.0, "maximum": 10000000000000.0 @@ -101,7 +101,7 @@ "description": "Density Of Rock [2.55E+12 kg/km3]", "type": "number", "units": "kg/km**3", - "category": "Default", + "category": null, "default": 0.0, "minimum": 100000000000.0, "maximum": 10000000000000.0 @@ -110,7 +110,7 @@ "description": "percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", "type": "number", "units": "", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 1.0 @@ -119,7 +119,7 @@ "description": "percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", "type": "number", "units": "", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 1.0 @@ -128,7 +128,7 @@ "description": "percent of fluid that is recoverable from the reservoir (0.5 = 50%)", "type": "number", "units": "", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 1.0 @@ -137,7 +137,7 @@ "description": "depth to top of reservoir (km). Calculated based on an assumed gradient and the reservoir temperature if no value given", "type": "number", "units": "kilometer", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.001, "maximum": 15.0 @@ -146,7 +146,7 @@ "description": "pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and reservoir depth & water density if no value given", "type": "number", "units": "mPa", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 10000.0 @@ -155,7 +155,7 @@ "description": "percent of fluid that is recoverable from the reservoir (0.75 = 75%)", "type": "number", "units": "", - "category": "Default", + "category": null, "default": 0.0, "minimum": 0.0, "maximum": 1.0 @@ -164,7 +164,7 @@ "description": "Provide a HTML output name if you want to have HTML output (no output if not provided)", "type": "string", "units": null, - "category": "Default", + "category": null, "default": null, "minimum": null, "maximum": null From 0bdc3e1ebf90ae9487caf879bc6ebdfd4820596f Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:34:50 -0700 Subject: [PATCH 05/12] HIP-RA-X params reference links in READMEs --- README.rst | 8 ++++++++ src/hip_ra_x/README.md | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/README.rst b/README.rst index d4ea51bf..10bfa656 100644 --- a/README.rst +++ b/README.rst @@ -349,6 +349,14 @@ Extending GEOPHIRES-X - `Extension example: SUTRA `__ + +HIP-RA: Heat in Place - Resource Assessment +------------------------------------------- + +* `HIP-RA-X README `__ +* `HIP-RA-X Parameters Reference `__ +.. TODO switch over to https://nrel.github.io/GEOPHIRES-X/hip_ra_x_parameters.html once merged + Monte Carlo ----------- diff --git a/src/hip_ra_x/README.md b/src/hip_ra_x/README.md index d0862e85..b160f269 100644 --- a/src/hip_ra_x/README.md +++ b/src/hip_ra_x/README.md @@ -7,3 +7,7 @@ See: ## HIP-RA-X HIP-RA-X is the successor version to HIP-RA. + +## Parameters + +[Parameters Reference](https://softwareengineerprogrammer.github.io/GEOPHIRES-X/hip_ra_x_parameters.html) From 1f0d8179f6a10b59e55ae614dfbb91afd12c92cb Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:41:32 -0700 Subject: [PATCH 06/12] Fix multi-line tooltip texts --- .../hip-ra-x-request.json | 8 +++---- src/hip_ra_x/hip_ra_x.py | 24 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/geophires_x_schema_generator/hip-ra-x-request.json b/src/geophires_x_schema_generator/hip-ra-x-request.json index 0319dbe3..da71ed20 100644 --- a/src/geophires_x_schema_generator/hip-ra-x-request.json +++ b/src/geophires_x_schema_generator/hip-ra-x-request.json @@ -107,7 +107,7 @@ "maximum": 10000000000000.0 }, "Rock Recoverable Heat": { - "description": "percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", + "description": "percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", "type": "number", "units": "", "category": null, @@ -116,7 +116,7 @@ "maximum": 1.0 }, "Fluid Recoverable Heat": { - "description": "percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", + "description": "percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs, 0.43 for low-T reservoirs (Garg and Combs (2011)", "type": "number", "units": "", "category": null, @@ -134,7 +134,7 @@ "maximum": 1.0 }, "Reservoir Depth": { - "description": "depth to top of reservoir (km). Calculated based on an assumed gradient and the reservoir temperature if no value given", + "description": "depth to top of reservoir (km). Calculated based on an assumed gradient and the reservoir temperature if no value given", "type": "number", "units": "kilometer", "category": null, @@ -143,7 +143,7 @@ "maximum": 15.0 }, "Reservoir Pressure": { - "description": "pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and reservoir depth & water density if no value given", + "description": "pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and reservoir depth & water density if no value given", "type": "number", "units": "mPa", "category": null, diff --git a/src/hip_ra_x/hip_ra_x.py b/src/hip_ra_x/hip_ra_x.py index 810b9f5b..fd77d837 100644 --- a/src/hip_ra_x/hip_ra_x.py +++ b/src/hip_ra_x/hip_ra_x.py @@ -260,10 +260,10 @@ def parameter_dict_entry(param: Parameter) -> Parameter: PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH, Required=False, - ErrMessage='assume 0.66 for high-T reservoirs (>150C), 0.43 for low-T reservoirs \ - (>90, Garg and Combs (2011)', - ToolTipText='percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs,\ - 0.43 for low-T reservoirs (Garg and Combs (2011)', + ErrMessage='assume 0.66 for high-T reservoirs (>150C), 0.43 for low-T reservoirs ' + '(>90, Garg and Combs (2011)', + ToolTipText='percent of heat that is recoverable from the rock in the reservoir 0.66 for high-T reservoirs, ' + '0.43 for low-T reservoirs (Garg and Combs (2011)', ) ) self.fluid_recoverable_heat: Parameter = parameter_dict_entry( @@ -276,10 +276,10 @@ def parameter_dict_entry(param: Parameter) -> Parameter: PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH, Required=False, - ErrMessage='assume 0.66 for high-T reservoirs (>150C), 0.43 for low-T reservoirs \ - (>90, Garg and Combs (2011)', - ToolTipText='percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs,\ - 0.43 for low-T reservoirs (Garg and Combs (2011)', + ErrMessage='assume 0.66 for high-T reservoirs (>150C), 0.43 for low-T reservoirs ' + '(>90, Garg and Combs (2011)', + ToolTipText='percent of heat that is recoverable from the fluid in the reservoir 0.66 for high-T reservoirs, ' + '0.43 for low-T reservoirs (Garg and Combs (2011)', ) ) self.recoverable_fluid_factor: Parameter = parameter_dict_entry( @@ -308,8 +308,8 @@ def parameter_dict_entry(param: Parameter) -> Parameter: Required=False, Provided=False, ErrMessage='calculate based on an assumed gradient of 30 C/km and the reservoir temperature', - ToolTipText='depth to top of reservoir (km). Calculated based on an assumed gradient \ - and the reservoir temperature if no value given', + ToolTipText='depth to top of reservoir (km). Calculated based on an assumed gradient ' + 'and the reservoir temperature if no value given', ) ) self.reservoir_pressure: Parameter = parameter_dict_entry( @@ -324,8 +324,8 @@ def parameter_dict_entry(param: Parameter) -> Parameter: Required=False, Provided=False, ErrMessage='calculate assuming hydrostatic pressure and the reservoir depth & water density', - ToolTipText='pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and \ - reservoir depth & water density if no value given', + ToolTipText='pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and ' + 'reservoir depth & water density if no value given', ) ) self.recoverable_rock_heat: Parameter = parameter_dict_entry( From c0c1b5d365f97612736013bd6c824bc20d231879 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:12:46 -0700 Subject: [PATCH 07/12] Fix HIP-RA degC references in tooltip text --- src/geophires_x_schema_generator/hip-ra-x-request.json | 4 ++-- src/hip_ra_x/hip_ra_x.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/geophires_x_schema_generator/hip-ra-x-request.json b/src/geophires_x_schema_generator/hip-ra-x-request.json index da71ed20..a22da93d 100644 --- a/src/geophires_x_schema_generator/hip-ra-x-request.json +++ b/src/geophires_x_schema_generator/hip-ra-x-request.json @@ -17,7 +17,7 @@ ], "properties": { "Reservoir Temperature": { - "description": "Reservoir Temperature [150 dec-C]", + "description": "Reservoir Temperature [150 degC]", "type": "number", "units": "degC", "category": null, @@ -26,7 +26,7 @@ "maximum": 1000 }, "Rejection Temperature": { - "description": "Rejection Temperature [25 dec-C]", + "description": "Rejection Temperature [25 degC]", "type": "number", "units": "degC", "category": null, diff --git a/src/hip_ra_x/hip_ra_x.py b/src/hip_ra_x/hip_ra_x.py index fd77d837..fc40c02c 100644 --- a/src/hip_ra_x/hip_ra_x.py +++ b/src/hip_ra_x/hip_ra_x.py @@ -119,8 +119,8 @@ def parameter_dict_entry(param: Parameter) -> Parameter: PreferredUnits=TemperatureUnit.CELSIUS, CurrentUnits=TemperatureUnit.CELSIUS, Required=True, - ErrMessage='assume default reservoir temperature (150 deg-C)', - ToolTipText='Reservoir Temperature [150 dec-C]', + ErrMessage='assume default reservoir temperature (150 degC)', + ToolTipText='Reservoir Temperature [150 degC]', ) ) self.rejection_temperature: Parameter = parameter_dict_entry( @@ -133,8 +133,8 @@ def parameter_dict_entry(param: Parameter) -> Parameter: PreferredUnits=TemperatureUnit.CELSIUS, CurrentUnits=TemperatureUnit.CELSIUS, Required=True, - ErrMessage='assume default rejection temperature (25 deg-C)', - ToolTipText='Rejection Temperature [25 dec-C]', + ErrMessage='assume default rejection temperature (25 degC)', + ToolTipText='Rejection Temperature [25 degC]', ) ) self.reservoir_porosity: Parameter = parameter_dict_entry( From 7889701100d6cbd2731f2016b7b806388270fdd1 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:52:59 -0700 Subject: [PATCH 08/12] Fix README.rst syntax error --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 10bfa656..5e0e8cee 100644 --- a/README.rst +++ b/README.rst @@ -355,6 +355,7 @@ HIP-RA: Heat in Place - Resource Assessment * `HIP-RA-X README `__ * `HIP-RA-X Parameters Reference `__ + .. TODO switch over to https://nrel.github.io/GEOPHIRES-X/hip_ra_x_parameters.html once merged Monte Carlo From 11264b54c306f6140acf499152f5aa919c20fcb2 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:43:19 -0700 Subject: [PATCH 09/12] remove py38-incompatible type annotations --- src/geophires_x_schema_generator/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/geophires_x_schema_generator/__init__.py b/src/geophires_x_schema_generator/__init__.py index 59293508..f7f54a18 100644 --- a/src/geophires_x_schema_generator/__init__.py +++ b/src/geophires_x_schema_generator/__init__.py @@ -42,7 +42,10 @@ def _get_dummy_model(self): sys.argv = stash_sys_argv os.chdir(stash_cwd) - def get_parameter_sources(self) -> list[Tuple[Any, str]]: + def get_parameter_sources(self) -> list: + """ + :rtype: list[Tuple[Any, str]] + """ dummy_model = self._get_dummy_model() return [ (dummy_model.reserv, 'Reservoir'), @@ -240,7 +243,10 @@ def _get_min_and_max(param: dict, default_val='') -> Tuple: class HipRaXSchemaGenerator(GeophiresXSchemaGenerator): - def get_parameter_sources(self) -> list[Tuple[Any, str]]: + def get_parameter_sources(self) -> list: + """ + :rtype: list[Tuple[Any, str]] + """ dummy_model = HIP_RA_X() return [(dummy_model, None)] From 811bff60168f4930d2cd78cbdf72cb6ca5150161 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:43:36 -0700 Subject: [PATCH 10/12] update hip-ra unit test broken by tooltip text copy edit --- tests/hip_ra_x_tests/test_hip_ra_x.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/hip_ra_x_tests/test_hip_ra_x.py b/tests/hip_ra_x_tests/test_hip_ra_x.py index 648e0443..08d095db 100644 --- a/tests/hip_ra_x_tests/test_hip_ra_x.py +++ b/tests/hip_ra_x_tests/test_hip_ra_x.py @@ -380,8 +380,8 @@ def test_initialization_with_default_parameters(self): assert hip_ra.reservoir_temperature.PreferredUnits == TemperatureUnit.CELSIUS assert hip_ra.reservoir_temperature.CurrentUnits == TemperatureUnit.CELSIUS assert hip_ra.reservoir_temperature.Required is True - assert hip_ra.reservoir_temperature.ErrMessage == 'assume default reservoir temperature (150 deg-C)' - assert hip_ra.reservoir_temperature.ToolTipText == 'Reservoir Temperature [150 dec-C]' + assert hip_ra.reservoir_temperature.ErrMessage == 'assume default reservoir temperature (150 degC)' + assert hip_ra.reservoir_temperature.ToolTipText == 'Reservoir Temperature [150 degC]' assert hip_ra.rejection_temperature.value == 25.0 assert hip_ra.reservoir_porosity.value == 18.0 From b0eb245ea9c7b0a7ff56faa6e0fee79125e441da Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:44:23 -0700 Subject: [PATCH 11/12] Remove erroneously duplicated calculate_cost_MUSD method from WellDrillingCostCorrelation --- src/geophires_x/OptionList.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/geophires_x/OptionList.py b/src/geophires_x/OptionList.py index 8abf17a5..2c7273cc 100644 --- a/src/geophires_x/OptionList.py +++ b/src/geophires_x/OptionList.py @@ -178,9 +178,6 @@ class WellDrillingCostCorrelation(GeophiresInputEnum): VERTICAL_LARGE_IDEAL = 16, "vertical open-hole, large diameter, ideal", -0.00240, 752.93946, 524337.65380 DEVIATED_LARGE_IDEAL = 17, "deviated liner, large diameter, ideal", 0.00376, 762.52696, 765103.07690 - def calculate_cost_MUSD(self, meters) -> float: - return (self._c2 * meters ** 2 + self._c1 * meters + self._c0) * 1E-6 - def __init__(self, int_value: int, _: str, c2: float, c1: float, c0: float): self._c2 = c2 self._c1 = c1 From 1f47d6207c4d1458b949ac2cc470b453951d27ac Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 5 Sep 2024 09:29:47 -0700 Subject: [PATCH 12/12] Add SBT to docs/schema generation --- src/geophires_x/SBTReservoir.py | 24 +- src/geophires_x_schema_generator/__init__.py | 6 + .../geophires-request.json | 216 +++++++++++++++++- 3 files changed, 228 insertions(+), 18 deletions(-) diff --git a/src/geophires_x/SBTReservoir.py b/src/geophires_x/SBTReservoir.py index 41856951..9f42b1cc 100644 --- a/src/geophires_x/SBTReservoir.py +++ b/src/geophires_x/SBTReservoir.py @@ -190,8 +190,8 @@ def __init__(self, model: Model): AllowableRange=[1, 2], UnitType=Units.NONE, ErrMessage="assume constant user-provided flowrate (1)", - ToolTipText="Must be 1 or 2. '1' means the user provides a constant mass flow rate. \ - '1' means the user provides an excel file with a mass flow rate profile." + ToolTipText="Must be 1 or 2. '1' means the user provides a constant mass flow rate. " + "'1' means the user provides an excel file with a mass flow rate profile." ) self.flow_rate_file = self.ParameterDict[self.flow_rate_file.Name] = strParameter( "Flowrate File", @@ -206,8 +206,8 @@ def __init__(self, model: Model): AllowableRange=[1, 2], UnitType=Units.NONE, ErrMessage="assume constant user-provided injection temperature (1)", - ToolTipText="Must be 1 or 2. '1' means the user provides a constant injection temperature. \ - '1' means the user provides an excel file with an injection temperature profile." + ToolTipText="Must be 1 or 2. '1' means the user provides a constant injection temperature. " + "'1' means the user provides an excel file with an injection temperature profile." ) self.injection_temperature_file = self.ParameterDict[self.injection_temperature_file.Name] = strParameter( "Injection Temperature File", @@ -222,9 +222,9 @@ def __init__(self, model: Model): AllowableRange=[1, 5], UnitType=Units.NONE, ErrMessage="assume default SBT accuracy desired (1)", - ToolTipText="Must be 1, 2, 3, 4 or 5 with 1 lowest accuracy and 5 highest accuracy. \ - Lowest accuracy runs fastest. Accuracy level impacts number of discretizations for \ - numerical integration and decision tree thresholds in SBT algorithm." + ToolTipText="Must be 1, 2, 3, 4 or 5 with 1 lowest accuracy and 5 highest accuracy. " + "Lowest accuracy runs fastest. Accuracy level impacts number of discretizations for " + "numerical integration and decision tree thresholds in SBT algorithm." ) self.percent_implicit = self.ParameterDict[self.percent_implicit.Name] = floatParameter( "SBT Percent Implicit Euler Scheme", @@ -235,11 +235,11 @@ def __init__(self, model: Model): PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH, ErrMessage="assume default percent implicit (1.0)", - ToolTipText="Should be between 0 and 1. Most stable is setting it to 1 which results in \ - a fully implicit Euler scheme when calculating the fluid temperature at each time step. \ - With a value of 0, the convective term is modelled using explicit Euler. \ - A value of 0.5 would model the convective term 50% explicit and 50% implicit, \ - which may be slightly more accurate than fully implicit." + ToolTipText="Should be between 0 and 1. Most stable is setting it to 1 which results in " + "a fully implicit Euler scheme when calculating the fluid temperature at each time step. " + "With a value of 0, the convective term is modelled using explicit Euler. " + "A value of 0.5 would model the convective term 50% explicit and 50% implicit, " + "which may be slightly more accurate than fully implicit." ) self.initial_timestep_count = self.ParameterDict[self.initial_timestep_count.Name] = intParameter( 'SBT Initial Timestep Count', diff --git a/src/geophires_x_schema_generator/__init__.py b/src/geophires_x_schema_generator/__init__.py index f7f54a18..fe4485b1 100644 --- a/src/geophires_x_schema_generator/__init__.py +++ b/src/geophires_x_schema_generator/__init__.py @@ -7,6 +7,9 @@ # Ruff disabled because imports are order-dependent # ruff: noqa: I001 from geophires_x.Model import Model +from geophires_x.SBTEconomics import SBTEconomics +from geophires_x.SBTReservoir import SBTReservoir +from geophires_x.SBTWellbores import SBTWellbores from geophires_x.SFReservoir import SFReservoir from geophires_x.LHSReservoir import LHSReservoir @@ -54,15 +57,18 @@ def get_parameter_sources(self) -> list: (MPFReservoir(dummy_model), 'Reservoir'), (SFReservoir(dummy_model), 'Reservoir'), (CylindricalReservoir(dummy_model), 'Reservoir'), + (SBTReservoir(dummy_model), 'Reservoir'), (SUTRAReservoir(dummy_model), 'Reservoir'), (dummy_model.wellbores, 'Well Bores'), (AGSWellBores(dummy_model), 'Well Bores'), + (SBTWellbores(dummy_model), 'Well Bores'), (SUTRAWellBores(dummy_model), 'Well Bores'), (dummy_model.surfaceplant, 'Surface Plant'), (SurfacePlantAGS(dummy_model), 'Surface Plant'), (SurfacePlantSUTRA(dummy_model), 'Surface Plant'), (dummy_model.economics, 'Economics'), (AGSEconomics(dummy_model), 'Economics'), + (SBTEconomics(dummy_model), 'Economics'), (SUTRAEconomics(dummy_model), 'Economics'), (EconomicsCCUS(dummy_model), 'Economics'), (EconomicsAddOns(dummy_model), 'Economics'), diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index 107a043e..c85cd4a9 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -42,13 +42,13 @@ ], "properties": { "Reservoir Model": { - "description": "0: Simple cylindrical; 1: Multiple Parallel Fractures; 2: 1-D Linear Heat Sweep; 3: Single Fracture m/A Thermal Drawdown; 4: Annual Percentage Thermal Drawdown; 5: User-Provided Temperature Profile; 6: TOUGH2 Simulator; 7: SUTRA", + "description": "0: Simple cylindrical; 1: Multiple Parallel Fractures; 2: 1-D Linear Heat Sweep; 3: Single Fracture m/A Thermal Drawdown; 4: Annual Percentage Thermal Drawdown; 5: User-Provided Temperature Profile; 6: TOUGH2 Simulator; 7: SUTRA; 8: SBT", "type": "integer", "units": null, "category": "Reservoir", "default": 4, "minimum": 0, - "maximum": 7, + "maximum": 8, "enum_values": [ { "name": "CYLINDRICAL", @@ -89,6 +89,11 @@ "name": "SUTRA", "value": "SUTRA", "int_value": 7 + }, + { + "name": "SBT", + "value": "SBT", + "int_value": 8 } ] }, @@ -462,6 +467,96 @@ "minimum": 0.0, "maximum": 150 }, + "Flowrate Model": { + "description": "Must be 1 or 2. '1' means the user provides a constant mass flow rate. '1' means the user provides an excel file with a mass flow rate profile.", + "type": "integer", + "units": null, + "category": "Reservoir", + "default": "", + "minimum": 1, + "maximum": 2 + }, + "Flowrate File": { + "description": "Excel file with a mass flow rate profile", + "type": "string", + "units": null, + "category": "Reservoir", + "default": "", + "minimum": null, + "maximum": null + }, + "Injection Temperature Model": { + "description": "Must be 1 or 2. '1' means the user provides a constant injection temperature. '1' means the user provides an excel file with an injection temperature profile.", + "type": "integer", + "units": null, + "category": "Reservoir", + "default": "", + "minimum": 1, + "maximum": 2 + }, + "Injection Temperature File": { + "description": "Excel file with an injection temperature profile", + "type": "string", + "units": null, + "category": "Reservoir", + "default": "", + "minimum": null, + "maximum": null + }, + "SBT Accuracy Desired": { + "description": "Must be 1, 2, 3, 4 or 5 with 1 lowest accuracy and 5 highest accuracy. Lowest accuracy runs fastest. Accuracy level impacts number of discretizations for numerical integration and decision tree thresholds in SBT algorithm.", + "type": "integer", + "units": null, + "category": "Reservoir", + "default": 1, + "minimum": 1, + "maximum": 5 + }, + "SBT Percent Implicit Euler Scheme": { + "description": "Should be between 0 and 1. Most stable is setting it to 1 which results in a fully implicit Euler scheme when calculating the fluid temperature at each time step. With a value of 0, the convective term is modelled using explicit Euler. A value of 0.5 would model the convective term 50% explicit and 50% implicit, which may be slightly more accurate than fully implicit.", + "type": "number", + "units": "", + "category": "Reservoir", + "default": 1.0, + "minimum": 0.0, + "maximum": 1.0 + }, + "SBT Initial Timestep Count": { + "description": "The number of timesteps in the first ~3 hours of model", + "type": "integer", + "units": null, + "category": "Reservoir", + "default": 5, + "minimum": 1, + "maximum": 150 + }, + "SBT Final Timestep Count": { + "description": "The number of timesteps after the first ~3 hours of model", + "type": "number", + "units": null, + "category": "Reservoir", + "default": 70, + "minimum": 5, + "maximum": 1000 + }, + "SBT Initial to Final Timestep Transition": { + "description": "The time in secs at which the time arrays switches from closely spaced linear to logarithmic", + "type": "number", + "units": "sec", + "category": "Reservoir", + "default": 9900, + "minimum": 1, + "maximum": 40000000 + }, + "SBT Generate Wireframe Graphics": { + "description": "Switch to control the generation of a wireframe drawing of a SBT wells configuration", + "type": "boolean", + "units": null, + "category": "Reservoir", + "default": false, + "minimum": null, + "maximum": null + }, "SUTRA Annual Heat File Name": { "description": "SUTRA file with heat stored, heat supplied and efficiency for each year", "type": "string", @@ -697,13 +792,13 @@ "maximum": 1.8e+30 }, "Closed-loop Configuration": { - "description": "1: utube; 2: coaxial; 3: vertical; 4: L", + "description": "1: utube; 2: coaxial; 3: vertical; 4: L; 5: EavorLoop", "type": "integer", "units": null, "category": "Well Bores", "default": 3, "minimum": 1, - "maximum": 4, + "maximum": 5, "enum_values": [ { "name": "ULOOP", @@ -724,17 +819,22 @@ "name": "L", "value": "L", "int_value": 4 + }, + { + "name": "EAVORLOOP", + "value": "EavorLoop", + "int_value": 5 } ] }, "Well Geometry Configuration": { - "description": "1: utube; 2: coaxial; 3: vertical; 4: L", + "description": "1: utube; 2: coaxial; 3: vertical; 4: L; 5: EavorLoop", "type": "integer", "units": null, "category": "Well Bores", "default": 3, "minimum": 1, - "maximum": 4, + "maximum": 5, "enum_values": [ { "name": "ULOOP", @@ -755,6 +855,11 @@ "name": "L", "value": "L", "int_value": 4 + }, + { + "name": "EAVORLOOP", + "value": "EavorLoop", + "int_value": 5 } ] }, @@ -833,6 +938,69 @@ "minimum": 0.01, "maximum": 100.0 }, + "Vertical Section Length": { + "description": "length/depth to the bottom of the vertical wellbores", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 2000.0, + "minimum": 0.01, + "maximum": 10000.0 + }, + "Vertical Wellbore Spacing": { + "description": "Horizontal distance between vertical wellbores", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 100.0, + "minimum": 0.01, + "maximum": 10000.0 + }, + "Lateral Spacing": { + "description": "Horizontal distance between laterals", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 100.0, + "minimum": 0.01, + "maximum": 10000.0 + }, + "Lateral Inclination Angle": { + "description": "Inclination of the lateral section, where 0 degrees would mean vertical while 90 degrees is pure horizontal", + "type": "number", + "units": "degrees", + "category": "Well Bores", + "default": 20.0, + "minimum": 0.0, + "maximum": 89.999999 + }, + "Discretization Length": { + "description": "distance between sample point along length of model", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 250.0, + "minimum": 0.01, + "maximum": 10000.0 + }, + "Junction Depth": { + "description": "vertical depth where the different laterals branch out (where the multilateral section starts, second deepest depth of model)", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 4000.0, + "minimum": 1000, + "maximum": 15000.0 + }, + "Lateral Endpoint Depth": { + "description": "vertical depth where the lateral section ends (tip of the multilateral section, deepest depth of model)", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 7000.0, + "minimum": 1000, + "maximum": 15000.0 + }, "End-Use Option": { "description": "Select the end-use application of the geofluid heat: 1: Electricity; 2: Direct-Use Heat; 31: Cogeneration Topping Cycle, Heat sales considered as extra income; 32: Cogeneration Topping Cycle, Electricity sales considered as extra income; 41: Cogeneration Bottoming Cycle, Heat sales considered as extra income; 42: Cogeneration Bottoming Cycle, Electricity sales considered as extra income; 51: Cogeneration Parallel Cycle, Heat sales considered as extra income; 52: Cogeneration Parallel Cycle, Electricity sales considered as extra income", "type": "integer", @@ -1048,6 +1216,42 @@ "minimum": 1, "maximum": 14 }, + "Working Fluid Heat Capacity": { + "description": "Heat capacity of the working fluid", + "type": "number", + "units": "J/kg/K", + "category": "Surface Plant", + "default": 4200.0, + "minimum": 0.0, + "maximum": 10000.0 + }, + "Working Fluid Density": { + "description": "Density of the working fluid", + "type": "number", + "units": "kg/m**3", + "category": "Surface Plant", + "default": 1000.0, + "minimum": 0.0, + "maximum": 10000.0 + }, + "Working Fluid Thermal Conductivity": { + "description": "Thermal conductivity of the working fluid", + "type": "number", + "units": "W/m/K", + "category": "Surface Plant", + "default": 0.68, + "minimum": 0.0, + "maximum": 10.0 + }, + "Working Fluid Dynamic Viscosity": { + "description": "Dynamic viscosity of the working fluid", + "type": "number", + "units": "PaSec", + "category": "Surface Plant", + "default": 0.0006, + "minimum": 0.0, + "maximum": 1 + }, "Dead-state Pressure": { "description": "", "type": "number",