Loading pythermogis/__init__.py +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 pythermogis/statistics/calculate_thick_perm_trans.py +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 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 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 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 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: 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 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
pythermogis/statistics/calculate_thick_perm_trans.py +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 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 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 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 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: 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