From c64e2f1f9223221f2f577f87f782cec55e3e28b6 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 3 Jul 2024 09:32:00 -0700 Subject: [PATCH 01/24] Use True instead of 1 in example1.txt --- tests/examples/example1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/examples/example1.txt b/tests/examples/example1.txt index 79443b17..31038ac7 100644 --- a/tests/examples/example1.txt +++ b/tests/examples/example1.txt @@ -15,7 +15,7 @@ Number of Production Wells,2, ---[-] Number of Injection Wells,2, ---[-] Production Well Diameter,7, ---[inch] Injection Well Diameter,7, ---[inch] -Ramey Production Wellbore Model,1, ---0 if disabled 1 if enabled +Ramey Production Wellbore Model,True, Production Wellbore Temperature Drop,.5, ---[deg.C] Injection Wellbore Temperature Gain,0, ---[deg.C] Production Flow Rate per Well,55, ---[kg/s] From 5911a8fc5a4e19d90223568070b926251a012df1 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:19:45 -0700 Subject: [PATCH 02/24] .cookiecutterrc year update --- .cookiecutterrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cookiecutterrc b/.cookiecutterrc index 3aa0442e..41a6dd0a 100644 --- a/.cookiecutterrc +++ b/.cookiecutterrc @@ -58,4 +58,4 @@ default_context: version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" - year_to: "2023" + year_to: "2024" From 5df89031c60ed81552ae3b371de2eda3a47e401e Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:23:01 -0700 Subject: [PATCH 03/24] Add coveralls github action --- .github/workflows/github-actions.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 3ba915ce..f3d1be71 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -121,6 +121,10 @@ jobs: TOXPYTHON: '${{ matrix.toxpython }}' run: > tox -e ${{ matrix.tox_env }} -v + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} deploy_docs: name: Deploy docs to GitHub Pages From 47b2d974f8986c80fed9046785dc885bf1a53d2e Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:24:24 -0700 Subject: [PATCH 04/24] Revert "Add coveralls github action" This reverts commit 5df89031c60ed81552ae3b371de2eda3a47e401e. --- .github/workflows/github-actions.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index f3d1be71..3ba915ce 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -121,10 +121,6 @@ jobs: TOXPYTHON: '${{ matrix.toxpython }}' run: > tox -e ${{ matrix.tox_env }} -v - - name: Coveralls - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.GITHUB_TOKEN }} deploy_docs: name: Deploy docs to GitHub Pages From 708f0de49065f74cd71482ad6951fa1729d810e9 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:31:49 -0700 Subject: [PATCH 05/24] coveralls first steps trial-and-error --- .github/workflows/github-actions.yml | 1 + tox.ini | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 3ba915ce..74ffc4ae 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -121,6 +121,7 @@ jobs: TOXPYTHON: '${{ matrix.toxpython }}' run: > tox -e ${{ matrix.tox_env }} -v + - uses: coverallsapp/github-action@v2 deploy_docs: name: Deploy docs to GitHub Pages diff --git a/tox.ini b/tox.ini index ee8c2547..ce5b99e7 100644 --- a/tox.ini +++ b/tox.ini @@ -28,7 +28,7 @@ basepython = py310: {env:TOXPYTHON:python3.10} py311: {env:TOXPYTHON:python3.11} py312: {env:TOXPYTHON:python3.12} - {bootstrap,clean,check,report,docs}: {env:TOXPYTHON:python3} + {bootstrap,clean,check,report,docs,coveralls}: {env:TOXPYTHON:python3} setenv = PYTHONPATH={toxinidir}/tests PYTHONUNBUFFERED=yes @@ -74,7 +74,10 @@ commands = coverage html [testenv:clean] -commands = coverage erase +commands = + python setup.py clean + coverage erase skip_install = true deps = + setuptools coverage From c1c2995403a6ffe8a9478363b7d5adf746806fd4 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:39:13 -0700 Subject: [PATCH 06/24] coveralls as separate job --- .github/workflows/github-actions.yml | 30 +++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 74ffc4ae..c5c101ed 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -121,7 +121,35 @@ jobs: TOXPYTHON: '${{ matrix.toxpython }}' run: > tox -e ${{ matrix.tox_env }} -v - - uses: coverallsapp/github-action@v2 + + coveralls: + name: coveralls coverage + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + architecture: 'x64' + - name: install dependencies + run: | + python -mpip install --upgrade pip + python -mpip install --progress-bar=off -r ci/requirements.txt + virtualenv --version + pip --version + tox --version + pip list --format=freeze + - name: generate coverage report + env: + TOXPYTHON: '3.11' + run: | + tox -e report + + - name: Coveralls GitHub Action + uses: coverallsapp/github-action@v2.3.0 + deploy_docs: name: Deploy docs to GitHub Pages From cfd2a3fb0f434b6ab352349fd234ac3560c1060f Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:49:32 -0700 Subject: [PATCH 07/24] generate lcov --- .github/workflows/github-actions.yml | 2 +- tox.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index c5c101ed..afb41dd6 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -145,7 +145,7 @@ jobs: env: TOXPYTHON: '3.11' run: | - tox -e report + tox -e py311 - name: Coveralls GitHub Action uses: coverallsapp/github-action@v2.3.0 diff --git a/tox.ini b/tox.ini index ce5b99e7..a36bfe6c 100644 --- a/tox.ini +++ b/tox.ini @@ -39,7 +39,7 @@ deps = pytest pytest-cov commands = - {posargs:pytest --cov --cov-report=term-missing --cov-report=xml -vv tests} + {posargs:pytest --cov --cov-report=term-missing --cov-report=xml --cov-report=lcov -vv tests} [testenv:check] deps = From d97c825ae3053bebb2eb62a00fa1844799630849 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:55:27 -0700 Subject: [PATCH 08/24] lcov not necessary/generates duplicate results when present? --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index a36bfe6c..ce5b99e7 100644 --- a/tox.ini +++ b/tox.ini @@ -39,7 +39,7 @@ deps = pytest pytest-cov commands = - {posargs:pytest --cov --cov-report=term-missing --cov-report=xml --cov-report=lcov -vv tests} + {posargs:pytest --cov --cov-report=term-missing --cov-report=xml -vv tests} [testenv:check] deps = From eb5ba5e1660e7b32adaae1933e2b5ebdd008d4c0 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:05:37 -0700 Subject: [PATCH 09/24] Add coverage badge to README --- README.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 8bbc4a2c..30af50f2 100644 --- a/README.rst +++ b/README.rst @@ -20,6 +20,7 @@ Free software: `MIT license `__ * - tests - | |github-actions| + - | |coverage| * - package - | |commits-since| .. TODO add the following to package badge list once PyPy distribution enabled: |version| |wheel| |supported-versions| |supported-implementations| @@ -55,7 +56,9 @@ Free software: `MIT license `__ :target: https://nrel.github.io/GEOPHIRES-X :alt: Documentation Status -.. TODO coverage badge https://github.com/NREL/GEOPHIRES-Xx/issues/22 +.. |coverage| image:: https://coveralls.io/repos/github/softwareengineerprogrammer/GEOPHIRES-X/badge.svg + :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X + .. end-badges From 59a022a110ce5b063be071aa79354fb796717102 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:08:22 -0700 Subject: [PATCH 10/24] Make coverage dependent on test, only run on main branch --- .github/workflows/github-actions.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index afb41dd6..5f1d3f51 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -123,7 +123,9 @@ jobs: tox -e ${{ matrix.tox_env }} -v coveralls: - name: coveralls coverage + name: Upload coverage to Coveralls + if: github.ref == 'refs/heads/main' # Prevent from running on PRs, tags + needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From ec9d33d2b26aca1c91323f40a7925a3b23fad1d4 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:12:22 -0700 Subject: [PATCH 11/24] Fix tests badges rst table rendering --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 30af50f2..8350fca0 100644 --- a/README.rst +++ b/README.rst @@ -19,8 +19,7 @@ Free software: `MIT license `__ :stub-columns: 1 * - tests - - | |github-actions| - - | |coverage| + - | |github-actions| |coverage| * - package - | |commits-since| .. TODO add the following to package badge list once PyPy distribution enabled: |version| |wheel| |supported-versions| |supported-implementations| @@ -58,6 +57,7 @@ Free software: `MIT license `__ .. |coverage| image:: https://coveralls.io/repos/github/softwareengineerprogrammer/GEOPHIRES-X/badge.svg :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X + :alt: Coverage Status .. end-badges From 1eb3b51ed47017c5b5e23b6a88444cd3161e58e4 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:18:07 -0700 Subject: [PATCH 12/24] Fix badge link formatting weirdness (hopefully) --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 8350fca0..dae45df9 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,8 @@ Free software: `MIT license `__ :stub-columns: 1 * - tests - - | |github-actions| |coverage| + - | |github-actions| + |coverage| * - package - | |commits-since| .. TODO add the following to package badge list once PyPy distribution enabled: |version| |wheel| |supported-versions| |supported-implementations| From 2daf8a6cec37bc995f24dac2691d04f82f16cd82 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:39:13 -0700 Subject: [PATCH 13/24] Remove obsolete output validation tool --- .../GEOPHIRES-X_Output_Validation_Tool.py | 268 ------------------ 1 file changed, 268 deletions(-) delete mode 100644 src/geophires_x/GEOPHIRES-X_Output_Validation_Tool.py diff --git a/src/geophires_x/GEOPHIRES-X_Output_Validation_Tool.py b/src/geophires_x/GEOPHIRES-X_Output_Validation_Tool.py deleted file mode 100644 index c7f537e1..00000000 --- a/src/geophires_x/GEOPHIRES-X_Output_Validation_Tool.py +++ /dev/null @@ -1,268 +0,0 @@ -#! python -# -*- coding: utf-8 -*- -""" -Created on Wed November 16 10:43:04 2017 - -@author: Malcolm Ross V3 -""" - -# Framework for running Monte Carlo simulations uding GEOPHIRES v3.0 & HIP-RA 1.0 -# build date: November 2022 -# github address: https://github.com/malcolm-dsider/GEOPHIRES-X - -import os -import sys -import logging -import logging.config -import argparse -import uuid -import shutil -import subprocess -import multiprocessing - - -def convert_string_to_number(test_string): - # Initialize a translation table to remove non-numeric characters - translation_table = str.maketrans('', '', - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}~') - translation_table[176] = None # add and entry for the degree symbol - # Use str.translate() with the translation table to remove non-numeric characters - numeric_string = test_string.translate(translation_table) - return (float(numeric_string)) - -def main(): - # set up logging. - logging.config.fileConfig('logging.conf') - logger = logging.getLogger('root') - logger.info("Init " + str(__name__)) - - # set the starting directory to be the directory that this file is in - os.chdir(os.path.dirname(os.path.abspath(__file__))) - - # from the command line, read what we need to know: - # 0) Code_File: Python code to run (this file) - # 1) Input_file: The input parameter file that controls the executon of this program - # 2) Input_file contains the following lines (the group of following lines can be repeasted as many times as you want for different input parameter files): - # GEOPHIRES-X_Validation_Tool output file, with the results of the analysis, e.g., "D:\Work\GEOPHIRES3-master\Results\GEOPHIRES-X_Output_Validation_Tool_output.txt" - # GEOPHIRES-X input control file, with the parameters the user wishes to change, e.g., D:\Work\GEOPHIRES3-master\Examples\example1.txt - # GEOPHIRES-X output result file, with results from running the above input control file, e.g., D:\Work\GEOPHIRES3-master\Example1V3_output.txt - # Precomputed results file that we will be comparing against, e.g., D:\Work\GEOPHIRES3-master\Results\Example1V3.txt - # List of output files that you want used to compare and validate. List can be as long as you want, terminated with a blank line. - # This string in the search string that must appear in BOTH OUTPUT FILES IN EXACTLY THE SAME FORMAT, case, spelling, etc. or you must specify the equivilent string in the precomputed file - # adding a "|" and then the equivilent string in the precomputed file. The tool will look for this string(s) in both files, then extract the associated value (after the colon or =) and compare. - # If it is the same, do nothing. If it is not, report it. - # For values in a table, the search string is the name of the table, followed by a comma, then the number of lines to skip to get to the value you want to validate, then a comma, - # then the column number that contains the value you want to compare. - # e.g., - # Average Net Electricity Production - # Electricity breakeven price|LCOE - # Average Production Temperature - # Average Production Well Pump Pressure Drop - # Total capital costs|Total Capital Costs - # Total operating and maintenance costs - # Average Total Electricity Generation - # POWER GENERATION PROFILE, 34, 6 - # HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE, 34, 5 - # - # NOTE: new option: if you append % and a number to the search string, the comparison will be made based on "percent difference" rather than absolute, and the percent difference will be the number after the %, so - # Average Net Electricity Production%10 - # Will do the percent difference calculation and flag it as different if the difference is >10% - - # get the values off the command line - parser = argparse.ArgumentParser() - parser.add_argument("Input_file", help="Input_file") - args = parser.parse_args() - - # Open the input_file and read the first few lines - with open(args.Input_file, mode="r", encoding='UTF-8') as f1: - python_code_to_run = f1.readline().strip() - output_file = f1.readline().strip() - # open the output file into which we will write results - with open(output_file, mode="w", encoding='UTF-8') as f2: - - # This is where we start the loop of however many GEOPHIRES-X runs - while True: - input_control_file = f1.readline().strip() - if not input_control_file: break # we have reached the end of the job - output_result_file = f1.readline().strip() - if not output_result_file: break # we have reached the end of the job - - # run GEOPHIRES-X so we can get an output file to validate - sprocess = subprocess.Popen(["python", python_code_to_run, input_control_file, - output_result_file]) # allow stdout to be printed to screen: , stdout=subprocess.DEVNULL) - sprocess.wait() - - # we should now have a result in output_result_file so we can open it and the Precomputed_results_file - Precomputed_results_file = f1.readline().strip() - f2.write("\nComparing: " + output_result_file + " to " + Precomputed_results_file + "\n") - - # now read all the search strings into a list. Terminate when ths string length is 0 - search_strings = [] - while True: - line = f1.readline().strip() - if len(line) == 0: break - search_strings.append(line) - - # Read the all the lines in the output and precomputed files into lists - with open(output_result_file, mode="r", encoding='UTF-8') as f3: - output_lines = f3.readlines() - with open(Precomputed_results_file, mode="r") as f4: - precomputed_lines = f4.readlines() - - # now we have everything we need in lists, for each search string, search the outputs and precomputed results - for search_string in search_strings: - pair = search_string.split(",") # If pair has a ",", it must be a table search - pair3 = search_string.split( - "|") # If pair has a "|", it must have 2 different spellings for search string - if len(pair3) > 1: - search_string = pair3[0] - pc_search_string = pair3[1] - else: - pc_search_string = search_string - - percent_difference_calc = False - - # If len(pair) is 1, we have a simple entry - if len(pair) == 1: - if "%" in search_string: # must be doing a percent difference calculation - percent_difference_calc = True - p = search_string.strip().split("%") - search_string = p[0] - percent_difference = float(str(p[1]).strip()) - - # loop thru the output_result_file, looking for the search string - for output_line in output_lines: - result_value = precompute_value = None - if search_string in output_line: - pair = output_line.split(":") - if len(pair) == 1: pair = output_line.split( - "=") # If there isn't a ":" in search string, then we have an old-style outfile file, which uses "=" - result_value = convert_string_to_number(pair[1]) - # pair[1].strip() - # result_value = result_value.split(" ") #split on " " in case there are units - # result_value = float(result_value[0]) - break - for precomputed_line in precomputed_lines: - if pc_search_string in precomputed_line: - pair = precomputed_line.split(":") - if len(pair) == 1: pair = precomputed_line.split( - "=") # If there isn't a ":" in search string, then we have an old-style outfile file, which uses "=" - precomputed_value = convert_string_to_number(pair[1]) - # pair[1].strip() - # precomputed_value = precomputed_value.split(" ") - # precomputed_value = float(precomputed_value[0]) - break - - # if either is None, we didn't find a pair to compare - if result_value is not None and precomputed_value is not None: - # if we come here, then we have found values we need to compare - if not percent_difference_calc: - if result_value != precomputed_value: - f2.write("for " + search_string + ", values DO NOT MATCH! result value = " + str( - result_value) + "; precomputed value = " + str(precomputed_value) + "\n") - else: - pass # don't report anything if they match - else: - pd = 100.0 * (result_value - precomputed_value) / ( - (result_value + precomputed_value) / 2.0) - if pd > percent_difference: - f2.write("for " + search_string + ", values EXCEED A PERCENT DIFFERENCE OF " + str( - percent_difference) + "%! result value = " + str( - result_value) + "; precomputed value = " + str(precomputed_value) + "\n") - else: - pass # don't report anything if they match - else: - if result_value is None: f2.write( - search_string + " not found in: " + output_result_file + "\n") - if precompute_value is None: f2.write( - pc_search_string + " not found in: " + Precomputed_results_file + "\n") - - # if len(pair) is 3, then we have a entry that wants to compare values from a table - elif len(pair) == 3: - pc_search_string = search_string = pair[0] - pair3 = search_string.split( - "|") # If pair has a "|", it must have 2 different spellings for search string - if len(pair3) > 1: - search_string = pair3[0] - pc_search_string = pair3[1] - rows_to_skip = int(pair[1].strip()) - column_to_access = int(pair[2].strip()) - 1 - if "%" in search_string: # must be doing a percent difference calculation - percent_difference_calc = True - p = search_string.strip().split("%") - search_string = p[0] - percent_difference = float(str(p[1]).strip()) - - # loop thru the output_result_file, looking for the search string - row = -1 - for output_line in output_lines: - result_value = precompute_value = None - row = row + 1 - if search_string in output_line: - row_str = output_lines[row + rows_to_skip] # skip to the correct row - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - columns = row_str.strip().split(" ") - result_value = columns[column_to_access].strip() - result_value = result_value.split(" ") # split on " " in case there are units - result_value = float(result_value[0]) - break - row = -1 - for precomputed_line in precomputed_lines: - row = row + 1 - if pc_search_string in precomputed_line: - row_str = precomputed_lines[row + rows_to_skip] # skip to the correct row - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - row_str = row_str.replace(" ", " ") - columns = row_str.strip().split(" ") - precomputed_value = columns[column_to_access].strip() - precomputed_value = precomputed_value.split(" ") # split on " " in case there are units - precomputed_value = float(precomputed_value[0]) - break - - # if either is None, we didn't find a pair to compare - if result_value is not None and precomputed_value is not None: - # if we come here, then we have found values we need to compare - if not percent_difference_calc: - if result_value != precomputed_value: - f2.write("for " + search_string + ", values DO NOT MATCH! result value = " + str( - result_value) + "; precomputed value = " + str(precomputed_value) + "\n") - else: - pass # don't report anything if they match - else: - pd = 100.0 * (result_value - precomputed_value) / ( - (result_value + precomputed_value) / 2.0) - if pd > percent_difference: - f2.write("for " + search_string + ", values EXCEED A PERCENT DIFFERENCE OF " + str( - percent_difference) + "%! result value = " + str( - result_value) + "; precomputed value = " + str(precomputed_value) + "\n") - else: - pass # don't report anything if they match - else: - if result_value is None: f2.write( - search_string + " not found in: " + output_result_file + "\n") - if precompute_value is None: f2.write( - pc_search_string + " not found in: " + Precomputed_results_file + "\n") - - # write the result to the screen - with open(output_file, 'r', encoding='UTF-8') as f: - content = f.readlines() # store all output in one long list - # Now write each line to the screen - for line in content: sys.stdout.write(line) - - logger.info("Complete " + str(__name__) + ": " + sys._getframe().f_code.co_name) - - -if __name__ == "__main__": - # set up logging. - logging.config.fileConfig('logging.conf') - logger = logging.getLogger('root') - logger.info("Init " + str(__name__)) - - main() From 6b6b58a2f513f0fe71878d803434dc2beeb54e25 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:48:25 -0700 Subject: [PATCH 14/24] readme coverage badge tweaks --- README.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index dae45df9..ba2259d0 100644 --- a/README.rst +++ b/README.rst @@ -19,10 +19,10 @@ Free software: `MIT license `__ :stub-columns: 1 * - tests - - | |github-actions| - |coverage| + - | |github-actions| |coverage| * - package - | |commits-since| + .. TODO add the following to package badge list once PyPy distribution enabled: |version| |wheel| |supported-versions| |supported-implementations| .. * - docs .. - | |docs| @@ -57,10 +57,11 @@ Free software: `MIT license `__ :alt: Documentation Status .. |coverage| image:: https://coveralls.io/repos/github/softwareengineerprogrammer/GEOPHIRES-X/badge.svg - :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X + :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X?branch=main :alt: Coverage Status + .. end-badges Getting Started From 54aada149e9f29ce463fabda4f74463982ce6ecd Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:28:31 -0700 Subject: [PATCH 15/24] SUTRAEconomics enum read cleanup --- src/geophires_x/Economics.py | 2 +- src/geophires_x/SUTRAEconomics.py | 67 ++++++------------------------- 2 files changed, 13 insertions(+), 56 deletions(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 482c3755..562c7ac6 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -614,7 +614,7 @@ def __init__(self, model: Model): ValuesEnum=EconomicModel, Required=True, ErrMessage="assume default economic model (2)", - ToolTipText="Specify the economic model to calculate the levelized cost of energy." + + ToolTipText="Specify the economic model to calculate the levelized cost of energy. " + '; '.join([f'{it.int_value}: {it.value}' for it in EconomicModel]) ) self.ccstimfixed = self.ParameterDict[self.ccstimfixed.Name] = floatParameter( diff --git a/src/geophires_x/SUTRAEconomics.py b/src/geophires_x/SUTRAEconomics.py index eab23061..89537243 100644 --- a/src/geophires_x/SUTRAEconomics.py +++ b/src/geophires_x/SUTRAEconomics.py @@ -49,11 +49,12 @@ def __init__(self, model: Model): "Economic Model", value=EconomicModel.STANDARDIZED_LEVELIZED_COST, DefaultValue=EconomicModel.STANDARDIZED_LEVELIZED_COST, + ValuesEnum=EconomicModel, AllowableRange=[1, 2, 3], Required=True, ErrMessage="assume default economic model (2)", - ToolTipText="Specify the economic model to calculate the levelized cost of energy." - + " 1: Fixed Charge Rate Model, 2: Standard Levelized Cost Model, 3: BICYCLE Levelized Cost Model, 4: CLGS", + ToolTipText="Specify the economic model to calculate the levelized cost of energy. " + + '; '.join([f'{it.int_value}: {it.value}' for it in EconomicModel]) ) self.ccwellfixed = self.ParameterDict[self.ccwellfixed.Name] = floatParameter( @@ -297,7 +298,7 @@ def __init__(self, model: Model): CurrentUnits=CurrencyFrequencyUnit.KDOLLARSPERYEAR, ) - model.logger.info("Complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Complete {__class__!s}: {sys._getframe().f_code.co_name}') def read_parameters(self, model: Model) -> None: """ @@ -309,7 +310,7 @@ def read_parameters(self, model: Model) -> None: :type model: :class:`~geophires_x.Model.Model` :return: Nothing, but it does make calculations and set values in the model """ - model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Init {str(__class__)}: {sys._getframe().f_code.co_name}') # Deal with all the parameter values that the user has provided. They should really only provide values # that they want to change from the default values, but they can provide a value that is already set @@ -335,58 +336,14 @@ def read_parameters(self, model: Model) -> None: ReadParameter(ParameterReadIn, ParameterToModify, model) # handle special cases - if ParameterToModify.Name == "Economic Model": - if ParameterReadIn.sValue == '1': - self.econmodel.value = EconomicModel.FCR - elif ParameterReadIn.sValue == '2': - # use standard LCOE/LCOH calculation as found on wikipedia (requires an interest rate). - self.econmodel.value = EconomicModel.STANDARDIZED_LEVELIZED_COST - elif ParameterReadIn.sValue == '3': - # use Bicycle LCOE/LCOH model (requires several financial input parameters) - self.econmodel.value = EconomicModel.BICYCLE - else: - self.econmodel.value = EconomicModel.CLGS # CLGS - elif ParameterToModify.Name == "Well Drilling Cost Correlation": - if ParameterReadIn.sValue == '1': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_SMALL - elif ParameterReadIn.sValue == '2': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_SMALL - elif ParameterReadIn.sValue == '3': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_LARGE - elif ParameterReadIn.sValue == '4': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_LARGE - elif ParameterReadIn.sValue == '5': - ParameterToModify.value = WellDrillingCostCorrelation.SIMPLE - elif ParameterReadIn.sValue == '6': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_SMALL_INT1 - elif ParameterReadIn.sValue == '7': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_SMALL_INT2 - elif ParameterReadIn.sValue == '8': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_SMALL_INT1 - elif ParameterReadIn.sValue == '9': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_SMALL_INT2 - elif ParameterReadIn.sValue == '10': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_LARGE_INT1 - elif ParameterReadIn.sValue == '11': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_LARGE_INT2 - elif ParameterReadIn.sValue == '12': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_LARGE_INT1 - elif ParameterReadIn.sValue == '13': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_LARGE_INT2 - elif ParameterReadIn.sValue == '14': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_SMALL_IDEAL - elif ParameterReadIn.sValue == '15': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_SMALL_IDEAL - elif ParameterReadIn.sValue == '16': - ParameterToModify.value = WellDrillingCostCorrelation.VERTICAL_LARGE_IDEAL - elif ParameterReadIn.sValue == '17': - ParameterToModify.value = WellDrillingCostCorrelation.DEVIATED_LARGE_IDEAL - else: - ParameterToModify.value = WellDrillingCostCorrelation.SIMPLE # Assuming 'SIMPLE' is still a valid option + if ParameterToModify.Name == 'Economic Model': + self.econmodel.value = EconomicModel.from_input_string(ParameterReadIn.sValue) + elif ParameterToModify.Name == 'Well Drilling Cost Correlation': + ParameterToModify.value = WellDrillingCostCorrelation.from_input_string(ParameterReadIn.sValue) else: - model.logger.info("No parameters read because no content provided") + model.logger.info('No parameters read because no content provided') - model.logger.info("complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Complete {__class__!s}: {sys._getframe().f_code.co_name}') def Calculate(self, model: Model) -> None: """ @@ -396,7 +353,7 @@ def Calculate(self, model: Model) -> None: :type model: :class:`~geophires_x.Model.Model` :return: Nothing, but it does make calculations and set values in the model """ - model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Init {str(__class__)}: {sys._getframe().f_code.co_name}') # This is where all the calculations are made using all the values that have been set. # If you subclass this class, you can choose to run these calculations before (or after) your calculations, From 3a09d8ceb8339e5e37f011edbc4497647391b304 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:55:00 -0700 Subject: [PATCH 16/24] Fix TestBaseTestCase assertions --- tests/test_base_test_case.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_base_test_case.py b/tests/test_base_test_case.py index 2b89990e..1315f127 100644 --- a/tests/test_base_test_case.py +++ b/tests/test_base_test_case.py @@ -13,7 +13,11 @@ def test_assertAlmostEqualWithinPercentage(self): with self.assertRaises(AssertionError): self.assertAlmostEqualWithinPercentage(100, 0, percent=5) + + with self.assertRaises(AssertionError): self.assertAlmostEqualWithinPercentage(100, 94.5, percent=5) + + with self.assertRaises(AssertionError): self.assertAlmostEqualWithinPercentage(100, 105.5, percent=5) self.assertListAlmostEqual([1, 2, 3], [1.1, 2.2, 3.3], percent=10.5) From 308a0e0bd82d3af748b98a1014307fe539088c87 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:05:25 -0700 Subject: [PATCH 17/24] Specify main branch for coverage badge svg --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ba2259d0..97d12aea 100644 --- a/README.rst +++ b/README.rst @@ -56,7 +56,7 @@ Free software: `MIT license `__ :target: https://nrel.github.io/GEOPHIRES-X :alt: Documentation Status -.. |coverage| image:: https://coveralls.io/repos/github/softwareengineerprogrammer/GEOPHIRES-X/badge.svg +.. |coverage| image:: https://coveralls.io/repos/github/softwareengineerprogrammer/GEOPHIRES-X/badge.svg?branch=main :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X?branch=main :alt: Coverage Status From 40dd0f0db978fb1d337c1ada4d14a292e1bc9cd4 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:08:06 -0700 Subject: [PATCH 18/24] Line break between build badge & coverage badge --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 97d12aea..54886757 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,8 @@ Free software: `MIT license `__ :stub-columns: 1 * - tests - - | |github-actions| |coverage| + - | |github-actions| + | |coverage| * - package - | |commits-since| From 43c85f92834a553bd9c092519c2fb714f804a011 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:58:33 -0700 Subject: [PATCH 19/24] Add code style and license badges as referenced in https://github.com/NREL/GEOPHIRES-X/issues/22\#issuecomment-1939147177 --- README.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.rst b/README.rst index 54886757..64678879 100644 --- a/README.rst +++ b/README.rst @@ -23,6 +23,8 @@ Free software: `MIT license `__ | |coverage| * - package - | |commits-since| + | |code-style| + | |license| .. TODO add the following to package badge list once PyPy distribution enabled: |version| |wheel| |supported-versions| |supported-implementations| .. * - docs @@ -61,7 +63,13 @@ Free software: `MIT license `__ :target: https://coveralls.io/github/softwareengineerprogrammer/GEOPHIRES-X?branch=main :alt: Coverage Status +.. |code-style| image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/NREL/GEOPHIRES-X/blob/main/.pre-commit-config.yaml + :alt: Code Style: black +.. |license| image:: https://img.shields.io/badge/license-MIT-green.svg + :target: https://github.com/NREL/GEOPHIRES-X/blob/main/LICENSE + :alt: MIT license .. end-badges From 3f2adb4e572c757b7c892bb59a8665ac9a2016aa Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:10:24 -0700 Subject: [PATCH 20/24] Simplify example input parameters and show example output --- README.rst | 78 ++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/README.rst b/README.rst index 64678879..d123a699 100644 --- a/README.rst +++ b/README.rst @@ -90,7 +90,7 @@ Editable Installation (Recommended) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An editable installation is recommended for most users. It will allow you to run GEOPHIRES-X locally, -view its python files in an IDE or text editor, +view its Python files in an IDE or text editor, and create your own extensions as described in `How to extend GEOPHIRES-X `__. Prerequisites: @@ -169,52 +169,10 @@ Example usage in Python: client = GeophiresXClient() result = client.get_geophires_result( GeophiresInputParameters({ - "Reservoir Model": 1, - "Reservoir Depth": 3, - "Number of Segments": 1, - "Gradient 1": 50, - "Number of Production Wells": 2, - "Number of Injection Wells": 2, - "Production Well Diameter": 7, - "Injection Well Diameter": 7, - "Ramey Production Wellbore Model": 1, - "Production Wellbore Temperature Drop": .5, - "Injection Wellbore Temperature Gain": 0, - "Production Flow Rate per Well": 55, - "Fracture Shape": 3, - "Fracture Height": 900, - "Reservoir Volume Option": 3, - "Number of Fractures": 20, - "Reservoir Volume": 1000000000, - "Water Loss Fraction": .02, - "Productivity Index": 5, - "Injectivity Index": 5, - "Injection Temperature": 50, - "Maximum Drawdown": 1, - "Reservoir Heat Capacity": 1000, - "Reservoir Density": 2700, - "Reservoir Thermal Conductivity": 2.7, - "End-Use Option": 1, - "Power Plant Type": 2, - "Circulation Pump Efficiency": .8, - "Utilization Factor": .9, - "Surface Temperature": 20, - "Ambient Temperature": 20, - "Plant Lifetime": 30, - "Economic Model": 1, - "Fixed Charge Rate": .05, - "Inflation Rate During Construction": 0, - "Well Drilling and Completion Capital Cost Adjustment Factor": 1, - "Well Drilling Cost Correlation": 1, - "Reservoir Stimulation Capital Cost Adjustment Factor": 1, - "Surface Plant Capital Cost Adjustment Factor": 1, - "Field Gathering System Capital Cost Adjustment Factor": 1, - "Exploration Capital Cost Adjustment Factor": 1, - "Wellfield O&M Cost Adjustment Factor": 1, - "Surface Plant O&M Cost Adjustment Factor": 1, - "Water Cost Adjustment Factor": 1, - "Print Output to Console": 1, - "Time steps per year": 6 + "Gradient 1": "69", + "Reservoir Depth": "5", + "End-Use Option": "1", + "Power Plant Type": "4" }) ) @@ -225,6 +183,32 @@ If you followed the editable installation example above, put this code in ``my-g python main.py +You will then see output including a case report:: + + (venv) ➜ my-geophires-project python main.py + No valid plant outlet pressure provided. GEOPHIRES will assume default plant outlet pressure (100 kPa) + No valid plant outlet pressure provided. GEOPHIRES will assume default plant outlet pressure (100 kPa) + + ***************** + ***CASE REPORT*** + ***************** + + Simulation Metadata + ---------------------- + GEOPHIRES Version: 3.4.42 + Simulation Date: 2024-07-08 + Simulation Time: 10:07 + Calculation Time: 0.047 sec + + ***SUMMARY OF RESULTS*** + + End-Use Option: Electricity + Average Net Electricity Production: 23.94 MW + Electricity breakeven price: 5.04 cents/kWh + + [...] + + You may also pass parameters as a text file: .. code:: python From 0de2cd9231271e9a585eabf2d9c33a72f6cf1ee0 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:14:30 -0700 Subject: [PATCH 21/24] Move pip package installation instruction above editable installation to keep it from getting lost in the editable instructions --- README.rst | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index d123a699..571a9575 100644 --- a/README.rst +++ b/README.rst @@ -86,6 +86,17 @@ The short URL `bit.ly/GEOPHIRES `__ redirects to the s Installation ------------ +Pip Package +^^^^^^^^^^^ + +If you do not need to view or edit GEOPHIRES-X source code, you can consume GEOPHIRES-X as a regular, non-editable python package:: + + pip3 install https://github.com/NREL/GEOPHIRES-X/archive/main.zip + + +.. (Eventually package will be published to PyPi, enabling ``pip install geophires-x``) + + Editable Installation (Recommended) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -142,15 +153,6 @@ To update the editable installation with the latest GEOPHIRES version:: # resolve merge conflicts, if any pip install -e . -Pip Package -^^^^^^^^^^^ - -If you do not need to view or edit GEOPHIRES-X source code, you can consume GEOPHIRES-X as a regular, non-editable python package:: - - pip3 install https://github.com/NREL/GEOPHIRES-X/archive/main.zip - - -.. (Eventually package will be published to PyPi, enabling ``pip install geophires-x``) Usage From ded0c572f5dc49553b9e4811c69740fa1c890b59 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:34:56 -0700 Subject: [PATCH 22/24] Update Examples README section --- README.rst | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/README.rst b/README.rst index 571a9575..1fbd02bd 100644 --- a/README.rst +++ b/README.rst @@ -254,28 +254,33 @@ Documentation Examples -------- -A variety of example input ``.txt`` files are available in the `tests/examples directory of the repository `__: - -- `example1.txt `__ -- `example1_addons.txt `__ -- `example2.txt `__ -- `example3.txt `__ -- `example4.txt `__ -- `example5.txt `__ -- `example8.txt `__ -- `example9.txt `__ -- `example10_HP.txt `__ -- `example11_AC.txt `__ -- `example12_DH.txt `__ -- `example13.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.txt `__ -- `Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.txt `__ -- `SUTRAExample1.txt `__ -- `example_multiple_gradients.txt `__ +A variety of example input ``.txt`` and corresponding ```.out``` files are available in the `tests/examples directory of the repository `__: + +- `example1.txt `__ / `example1.out `__ +- `example1_addons.txt `__ / `example1_addons.out `__ +- `example2.txt `__ / `example2.out `__ +- `example3.txt `__ / `example3.out `__ +- `example4.txt `__ / `example4.out `__ +- `example5.txt `__ / `example5.out `__ +- `example8.txt `__ / `example8.out `__ +- `example9.txt `__ / `example9.out `__ +- `example10_HP.txt `__ / `example10_HP.out `__ +- `example11_AC.txt `__ / `example11_AC.out `__ +- `example12_DH.txt `__ / `example12_DH.out `__ +- `example13.txt `__ / `example13.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.out `__ +- `Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.txt `__ / `Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.out `__ +- `SUTRAExample1.txt `__ / `SUTRAExample1.out `__ +- `example_multiple_gradients.txt `__ / `example_multiple_gradients.out `__ +- `Fervo_Norbeck_Latimer_2023.txt `__ / `Fervo_Norbeck_Latimer_2023.out `__ +- `example_SHR-1.txt `__ / `example_SHR-1.out `__ +- `example_SHR-2.txt `__ / `example_SHR-2.out `__ + +An interactive table of examples is available at `gtp.scientificwebservices.com/geophires `__, under the Examples tab. Parameters ---------- From 2090eb3a758379be41524d6a39471b798ebbe4fa Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:35:51 -0700 Subject: [PATCH 23/24] Additional Documentation section header --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 1fbd02bd..f96b097c 100644 --- a/README.rst +++ b/README.rst @@ -299,8 +299,8 @@ Monte Carlo `Monte Carlo User Guide `__ -Other Documentation: --------------------- +Additional Documentation +------------------------ The `GEOPHIRES v2.0 (previous version's) user manual `__ describes GEOPHIRES's high-level software architecture. Theoretical basis for GEOPHIRES: `GEOPHIRES v2.0: updated geothermal techno‐economic simulation tool `__ From de55da1f7eaeb85548f68e02682ffad6c9c7fb78 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:39:28 -0700 Subject: [PATCH 24/24] Delete stray backticks --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f96b097c..2b577b8a 100644 --- a/README.rst +++ b/README.rst @@ -254,7 +254,7 @@ Documentation Examples -------- -A variety of example input ``.txt`` and corresponding ```.out``` files are available in the `tests/examples directory of the repository `__: +A variety of example input ``.txt`` and corresponding ``.out`` files are available in the `tests/examples directory of the repository `__: - `example1.txt `__ / `example1.out `__ - `example1_addons.txt `__ / `example1_addons.out `__