Loading pythermogis/__init__.py +1 −1 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 pythermogis/statistics/calculate_thick_perm_trans.py +6 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 pythermogis/thermogis_classes/doublet.py +53 −39 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 Loading Loading @@ -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, Loading @@ -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 Loading @@ -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, Loading @@ -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] Loading Loading @@ -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, Loading Loading @@ -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 Loading @@ -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"]) pythermogis/thermogis_classes/jvm_start.py +2 −0 Original line number Diff line number Diff line import sys from importlib.resources import files import jpype import logging def get_jvm_path() -> str: Loading tests/resources/test_input/SLDNA/SLDNA__hc_accum.nc 0 → 100644 +33.7 KiB File added.No diff preview for this file type. View file Loading
pythermogis/__init__.py +1 −1 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
pythermogis/statistics/calculate_thick_perm_trans.py +6 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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
pythermogis/thermogis_classes/doublet.py +53 −39 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 Loading Loading @@ -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, Loading @@ -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 Loading @@ -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, Loading @@ -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] Loading Loading @@ -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, Loading Loading @@ -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 Loading @@ -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"])
pythermogis/thermogis_classes/jvm_start.py +2 −0 Original line number Diff line number Diff line import sys from importlib.resources import files import jpype import logging def get_jvm_path() -> str: Loading
tests/resources/test_input/SLDNA/SLDNA__hc_accum.nc 0 → 100644 +33.7 KiB File added.No diff preview for this file type. View file