TNO Intern

Commit 1f9e131c authored by Hen Brett's avatar Hen Brett 🐔
Browse files

Merge branch '85-incorporate-new-thermogis-jar' into 'main'

Resolve "incorporate new thermogis jar"

Closes #85

See merge request !103
parents cec4b020 4ef8be42
Loading
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -18,3 +18,7 @@ Another bug was fixed, this occured when sampling for transmissivity with high o
Additional Functionality:
    - two functions have been added to print out the environment variables THERMOGIS_JAR and JAVA_HOME. This enables users to debug if their are issues with their installation.

## v1.2.3 (27-11-2025)
Updating the Java jar which has a fixed implementation of the heat pump. Before the heat pump cop was not being correctly calculated. There is a test added to test_pythermogis_doublet_benchmark.py to showcase how the new heatpump mode 
should be used.
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "pythermogis"
version = "1.2.1"
version = "1.2.2"
description = "This repository is used as a python API for the ThermoGIS Doublet simulations"
authors = [
    { name = "Hen Brett", email = "hen.brett@tno.nl" },
+244 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ from unittest import TestCase

from pythermogis import *


class ThermoGISDoubletBenchmark(TestCase):
    """
    This is a series of tests which produce the same results found in the Java code and in test_ThermoGISDoublet_Benchmark, but using the ntended pythermogis implementation
@@ -9,12 +10,15 @@ class ThermoGISDoubletBenchmark(TestCase):

    def test_calculateDoubletPerformanceTest(self):
        viscosity_mode = get_viscosity_mode("kestin")
        utc_properties = (instantiate_utc_properties_builder()
        utc_properties = (
            instantiate_utc_properties_builder()
            .setDhReturnTemp(40)
            .setViscosityMode(viscosity_mode)
                          .build())
            .build()
        )

        input_data = xr.Dataset({
        input_data = xr.Dataset(
            {
                "thickness_mean": ((), 100),
                "thickness_sd": ((), 0.0),
                "ntg": ((), 1.0),
@@ -23,9 +27,12 @@ class ThermoGISDoubletBenchmark(TestCase):
                "temperature": ((), 76),
                "ln_permeability_mean": ((), np.log(175)),
                "ln_permeability_sd": ((), 0.0),
        })
            }
        )

        results = calculate_doublet_performance_stochastic(input_data, utc_properties=utc_properties, rng_seed=0)
        results = calculate_doublet_performance_stochastic(
            input_data, utc_properties=utc_properties, rng_seed=0
        )

        # Assert
        self.assertTrue(np.isclose(17500, results.transmissivity.data[0], 0.001))
@@ -43,9 +50,12 @@ class ThermoGISDoubletBenchmark(TestCase):
        """
        # Arrange
        # Instantiate the UTC properties class
        utc_properties = self.setup_template_utc_properties_builder().setOpexBase(0).build()
        utc_properties = (
            self.setup_template_utc_properties_builder().setOpexBase(0).build()
        )

        input_data = xr.Dataset({
        input_data = xr.Dataset(
            {
                "thickness_mean": ((), 100),
                "thickness_sd": ((), 0.0),
                "ntg": ((), 1.0),
@@ -54,11 +64,13 @@ class ThermoGISDoubletBenchmark(TestCase):
                "temperature": ((), 76),
                "ln_permeability_mean": ((), np.log(175)),
                "ln_permeability_sd": ((), 0.0),
        })
            }
        )

        # Act
        results = calculate_doublet_performance_stochastic(input_data, utc_properties=utc_properties, rng_seed=0)

        results = calculate_doublet_performance_stochastic(
            input_data, utc_properties=utc_properties, rng_seed=0
        )

        # Assert
        self.assertTrue(np.isclose(17500, results.transmissivity.data[0], 0.001))
@@ -76,13 +88,18 @@ class ThermoGISDoubletBenchmark(TestCase):
        """
        # Arrange
        # Instantiate the UTC properties class
        utc_properties = (self.setup_template_utc_properties_builder().setCapexConst(0.5)
        utc_properties = (
            self.setup_template_utc_properties_builder()
            .setCapexConst(0.5)
            .setCapexVariable(1100)
            .setHeatExchangerEfficiency(0.4)
            .setDhReturnTemp(60)
                          .setHeatExchangerParasitic(0.1).build())
            .setHeatExchangerParasitic(0.1)
            .build()
        )

        input_data = xr.Dataset({
        input_data = xr.Dataset(
            {
                "thickness_mean": ((), 100),
                "thickness_sd": ((), 0.0),
                "ntg": ((), 1.0),
@@ -91,10 +108,13 @@ class ThermoGISDoubletBenchmark(TestCase):
                "temperature": ((), 76),
                "ln_permeability_mean": ((), np.log(175)),
                "ln_permeability_sd": ((), 0.0),
        })
            }
        )

        # Act
        results = calculate_doublet_performance_stochastic(input_data, utc_properties=utc_properties, rng_seed=0)
        results = calculate_doublet_performance_stochastic(
            input_data, utc_properties=utc_properties, rng_seed=0
        )

        # Assert
        self.assertTrue(np.isclose(17500, results.transmissivity.data[0], 0.001))
@@ -113,16 +133,19 @@ class ThermoGISDoubletBenchmark(TestCase):
        """
        # Arrange
        # Instantiate the UTC properties class
        utc_properties = (self.setup_template_utc_properties_builder()
        utc_properties = (
            self.setup_template_utc_properties_builder()
            .setCapexConst(0)
            .setCapexVariable(2300)
            .setHeatExchangerEfficiency(0.6)
            .setUseORC(True)
            .setHeatExchangerBasetemp(20)
            .setDhReturnTemp(60)
                          .build())
            .build()
        )

        input_data = xr.Dataset({
        input_data = xr.Dataset(
            {
                "thickness_mean": ((), 100),
                "thickness_sd": ((), 0.0),
                "ntg": ((), 1.0),
@@ -131,10 +154,13 @@ class ThermoGISDoubletBenchmark(TestCase):
                "temperature": ((), 100),
                "ln_permeability_mean": ((), np.log(175)),
                "ln_permeability_sd": ((), 0.0),
        })
            }
        )

        # Act
        results = calculate_doublet_performance_stochastic(input_data, utc_properties=utc_properties, rng_seed=0)
        results = calculate_doublet_performance_stochastic(
            input_data, utc_properties=utc_properties, rng_seed=0
        )

        # Assert
        self.assertTrue(np.isclose(17500, results.transmissivity.data[0], 0.001))
@@ -146,10 +172,62 @@ class ThermoGISDoubletBenchmark(TestCase):
        self.assertTrue(np.isclose(0.06459403120103477, results.cop.data[0], 0.001))
        self.assertTrue(np.isclose(12.44409167482118, results.capex.data[0], 0.001))

    def test_calculateDoubletPerformance_directHeat_and_heatpump(self):
        """
        This is a copy of a test from the Java ThermoGisDoubletTest.java script; to validate that this python implementation of the ThermoGIS Doublet
        returns the same values.
        """
        # Arrange
        # Instantiate the UTC properties class
        utc_properties = (
            self.setup_template_utc_properties_builder()
            .setOpexPerPower(100)
            .setOpexBase(0)
            .setHpDirectHeatInputTemp(70)
            .setUseHeatPump(True)
            .setDhReturnTemp(35)
            .build()
        )

        input_data = xr.Dataset(
            {
                "thickness_mean": ((), 100),
                "thickness_sd": ((), 0.0),
                "ntg": ((), 1.0),
                "porosity": ((), 0.0),
                "depth": ((), 2000),
                "temperature": ((), 50),
                "ln_permeability_mean": ((), np.log(175)),
                "ln_permeability_sd": ((), 0.0),
            }
        )

        # Act
        results = calculate_doublet_performance_stochastic(
            input_data, utc_properties=utc_properties, rng_seed=0
        )
        power_hpelec = results.heat_pump_power / (results.cophp - 1)
        power_ratio = results.power / (results.power + power_hpelec)


        # Assert
        self.assertTrue(np.isclose(5.856159806251526, results.power + power_hpelec, 0.1))
        self.assertTrue(np.isclose(8.83718197747828, results.utc * power_ratio, 0.1))
        self.assertTrue(np.isclose(17499.99940, 17500, 0.001))
        self.assertTrue(np.isclose(163.99771118164062, results.flow_rate, 0.001))
        self.assertTrue(np.isclose(60, results.pres, 0.001))
        self.assertTrue(np.isclose(4.97566556930542, results.power, 0.001))
        self.assertTrue(np.isclose(989.2578125, results.welld, 0.001))
        self.assertTrue(np.isclose(4.383212200392486, results.cop, 0.001))
        self.assertTrue(np.isclose(3.798196792602539, results.cophp, 0.001))
        self.assertTrue(np.isclose(10.401010755009017, results.utc, 0.001))
        self.assertTrue(np.isclose(16.50359210062243, results.capex, 0.001))

    def setup_template_utc_properties_builder(self):
        viscosity_mode = get_viscosity_mode("kestin")

        return (instantiate_utc_properties_builder()
        return (
            instantiate_utc_properties_builder()
            .setSalinityGradient(47.0)
            .setDrillingTime(1)
            .setTaxRate(20)
@@ -162,4 +240,5 @@ class ThermoGISDoubletBenchmark(TestCase):
            .setWellCostZ(1050)
            .setWellCostZ2(0.3)
            .setDhReturnTemp(40)
         .setViscosityMode(viscosity_mode))
 No newline at end of file
            .setViscosityMode(viscosity_mode)
        )
 No newline at end of file
Loading