TNO Intern

Commit 07f3c0d0 authored by Hen Brett's avatar Hen Brett 🐔
Browse files

Testing the speed of the doublet calculations

parent c6a04dba
Loading
Loading
Loading
Loading
+1 −1
Changes for pythermogis/__init__.py: 1 added line, 1 removed line.
Original line number Diff line number Diff line
from thermogis_classes.doublet import calculate_performance_of_single_location, calculate_doublet_performance
 No newline at end of file
from .thermogis_classes.doublet import calculate_performance_of_single_location, calculate_doublet_performance
 No newline at end of file
+6 −1
Changes for pythermogis/statistics/calculate_thick_perm_trans.py: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@ def generate_thickness_permeability_transmissivity_for_pvalue(thickness_mean: fl
    :return:
    thickness, permeability, transmissivity
    """
    if np.isnan(thickness_mean) | np.isnan(thickness_sd) | np.isnan(ln_permeability_mean) | np.isnan(ln_permeability_sd):
        return np.nan, np.nan, np.nan

    p_value_fraction = Pvalue / 100

    thickness_dist = stats.norm(loc=thickness_mean, scale=thickness_sd)
@@ -29,7 +32,9 @@ def generate_thickness_permeability_transmissivity_for_pvalue(thickness_mean: fl
    permeability_pvalue = np.exp(ln_permeability_dist.ppf(1 - p_value_fraction))

    # Sampling method for transmissivity
    transmissivity_samples = np.sort(np.exp(ln_permeability_dist.rvs(nSamples) + np.log(thickness_dist.rvs(nSamples))))
    thickness_samples = thickness_dist.rvs(nSamples)
    thickness_samples = np.where(thickness_samples < 0.0, 0.1, thickness_samples)   # Ensure no negative thicknesses
    transmissivity_samples = np.sort(np.exp(ln_permeability_dist.rvs(nSamples) + np.log(thickness_samples)))
    transmissivity_pvalue_sampled = transmissivity_samples[int((1 - p_value_fraction) * nSamples)]

    return thickness_pvalue, permeability_pvalue, transmissivity_pvalue_sampled
+53 −39
Changes for pythermogis/thermogis_classes/doublet.py: 53 added lines, 39 removed lines.
Original line number Diff line number Diff line
from typing import List

import timeit
import numpy as np
import xarray as xr
from jpype import JClass
@@ -61,6 +62,8 @@ def calculate_doublet_performance(input_data: xr.Dataset,
    output_data["temperature"] = input_data["temperature"].copy()

    # Calculate Thickness, Permeability and Transmissivity for each P-value

    start = timeit.default_timer()
    output_data["thickness"], output_data["permeability"], output_data["transmissivity"] = xr.apply_ufunc(generate_thickness_permeability_transmissivity_for_pvalue,
                                                             input_data.thickness_mean,
                                                             input_data.thickness_sd,
@@ -71,6 +74,8 @@ def calculate_doublet_performance(input_data: xr.Dataset,
                                                             output_core_dims=[[], [], []],
                                                             vectorize=True
                                                             )
    stop = timeit.default_timer()
    print('\nTime elapsed: %.1f seconds' % (stop - start))

    # Calculate transmissivity scaled by ntg and converted to Dm
    output_data[f"transmissivity_with_ntg"] = (output_data[f"transmissivity"] * input_data.ntg) / 1e3
@@ -80,6 +85,7 @@ def calculate_doublet_performance(input_data: xr.Dataset,
    doublet = instantiate_thermogis_doublet(input_params)

    # Calculate the doublet performance across all dimensions
    start = timeit.default_timer()
    output_data_arrays = xr.apply_ufunc(calculate_performance_of_single_location,
                                        input_data.mask,
                                        input_data.depth,
@@ -93,7 +99,11 @@ def calculate_doublet_performance(input_data: xr.Dataset,
                                        input_core_dims=[[], [], [], [], [], [], [], []],
                                        output_core_dims=[[], [], [], [], [], [], [], [], [], [], [], []],
                                        vectorize=True,
                                        dask="parallelized"
                                        )
    stop = timeit.default_timer()
    print('\nTime elapsed: %.1f seconds' % (stop - start))


    # Assign output DataArrays to the output_data object
    output_data["power"] = output_data_arrays[0]
@@ -154,38 +164,6 @@ def apply_input_params(input_params: dict) -> dict:
        return {key: input_params.get(key, input_params_basecase[key]) for key in input_params_basecase}


def instantiate_thermogis_doublet(input_params: dict):
    """
    Instantiate a ThermoGIS Doublet class, with a set random seed if provided
    :param rng_seed:
    :return:
        doublet, a JPype instantiated object of the ThermoGISDoublet class
    """
    # Start the jvm
    start_jvm()
    # Instantiate doublet class
    Logger = JClass("logging.Logger")
    Mockito = JClass("org.mockito.Mockito")
    RNG = JClass("tno.geoenergy.stochastic.RandomNumberGenerator")
    ThermoGISDoublet = JClass("thermogis.calc.doublet.ThermoGisDoublet")
    UTCPropertiesBuilder = JClass("thermogis.properties.builders.UTCPropertiesBuilder")

    # Instantiate the UTC properties class
    propsBuilder = UTCPropertiesBuilder()
    utc_properties = (propsBuilder
                      .setUseStimulation(input_params["use_stimulation"])
                      .setUseHeatPump(input_params["use_heat_pump"])
                      .setCalculateCop(input_params["calculate_cop"])
                      .setHpApplicationMode(input_params["hp_application_mode"])
                      .setHpDirectHeatInputTemp(input_params["hp_direct_heat_input_temp"])
                      .build())

    # Instantiate random number generator:
    rng = RNG(input_params["rng_seed"])

    # Create an instance of a ThermoGISDoublet
    doublet = ThermoGISDoublet(Mockito.mock(Logger), rng, utc_properties)
    return doublet


def calculate_performance_of_single_location(mask: float, depth: float, thickness: float, porosity: float, ntg: float, temperature: float, transmissivity: float, transmissivity_with_ntg: float, doublet=None,
@@ -261,6 +239,46 @@ def calculate_performance_of_single_location(mask: float, depth: float, thicknes
        "cophp"], output_values["pres"], output_values["flow_rate"], output_values["welld"]


def instantiate_thermogis_doublet(input_params: dict):
    """
    Instantiate a ThermoGIS Doublet class, with a set random seed if provided
    :param rng_seed:
    :return:
        doublet, a JPype instantiated object of the ThermoGISDoublet class
    """
    # Start the jvm
    start_jvm()
    # Instantiate doublet class
    Logger = JClass("logging.Logger")
    Mockito = JClass("org.mockito.Mockito")
    RNG = JClass("tno.geoenergy.stochastic.RandomNumberGenerator")
    ThermoGISDoublet = JClass("thermogis.calc.doublet.ThermoGisDoublet")
    UTCPropertiesBuilder = JClass("thermogis.properties.builders.UTCPropertiesBuilder")

    # Instantiate the UTC properties class
    propsBuilder = UTCPropertiesBuilder()
    utc_properties = (propsBuilder
                      .setUseStimulation(input_params["use_stimulation"])
                      .setUseHeatPump(input_params["use_heat_pump"])
                      .setCalculateCop(input_params["calculate_cop"])
                      .setHpApplicationMode(input_params["hp_application_mode"])
                      .setHpDirectHeatInputTemp(input_params["hp_direct_heat_input_temp"])
                      .build())

    # Instantiate random number generator:
    rng = RNG(input_params["rng_seed"])

    # Create an instance of a ThermoGISDoublet
    doublet = ThermoGISDoublet(Mockito.mock(Logger), rng, utc_properties)

    # Set parameters that do not change across cells
    doublet.doubletCalc1DData.setSurfaceTemperature(input_params["surface_temperature"])
    doublet.doubletCalc1DData.setUseHeatPump(input_params["use_heat_pump"])
    doublet.doubletCalc1DData.setDhReturnTemp(input_params["return_temperature"])


    return doublet

def set_doublet_parameters(doublet, transmissivity_with_ntg: float, depth: float, porosity: float, ntg: float, temperature: float, input_params: dict):
    """
    For a single location sets the necessary data on the doublet class, to then run a doublet simulation
@@ -285,16 +303,12 @@ def set_doublet_parameters(doublet, transmissivity_with_ntg: float, depth: float
    doublet.doubletCalc1DData.setDepth(depth)
    doublet.doubletCalc1DData.setPorosity(porosity)
    doublet.doubletCalc1DData.setNtg(ntg)
    doublet.doubletCalc1DData.setSurfaceTemperature(input_params["surface_temperature"])
    doublet.doubletCalc1DData.setReservoirTemp(temperature)
    doublet.doubletCalc1DData.setUseHeatPump(input_params["use_heat_pump"])

    if not input_params["use_heat_pump"]:
        injectionTemp = np.max([temperature - input_params["max_cooling_temperature_range"], input_params["return_temperature"]])
        doublet.doubletCalc1DData.setInjectionTemp(np.max([temperature - input_params["max_cooling_temperature_range"], input_params["return_temperature"]]))
    elif input_params["use_heat_pump"] and input_params["calculate_cop"] and not input_params["hp_application_mode"]:
        injectionTemp = doublet.calculateInjectionTempWithHeatPump(temperature, input_params["hp_direct_heat_input_temp"])
        doublet.doubletCalc1DData.setInjectionTemp(doublet.calculateInjectionTempWithHeatPump(temperature, input_params["hp_direct_heat_input_temp"]))
    else:
        injectionTemp = np.max([temperature - input_params["max_cooling_temperature_range"], input_params["hp_minimum_injection_temperature"]])
        doublet.doubletCalc1DData.setInjectionTemp(np.max([temperature - input_params["max_cooling_temperature_range"], input_params["hp_minimum_injection_temperature"]]))
    doublet.doubletCalc1DData.setInjectionTemp(injectionTemp)
    doublet.doubletCalc1DData.setDhReturnTemp(input_params["return_temperature"])
+2 −0
Changes for pythermogis/thermogis_classes/jvm_start.py: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
import sys
from importlib.resources import files

import jpype
import logging


def get_jvm_path() -> str:
+33.7 KiB

File added.

No diff preview for this file type.

Loading