Loading pythermogis/pytg3/doublet.py +104 −3 Original line number Diff line number Diff line from __future__ import annotations from typing import TYPE_CHECKING import numpy as np import xarray as xr from jpype import JClass from pydantic import BaseModel, ConfigDict from pythermogis.mock import create_logger_mock if TYPE_CHECKING: from pythermogis.pytg3.aquifer import Aquifer Loading Loading @@ -48,6 +53,102 @@ class ThermoGISDoublet: # TODO: how to handle chunksize? In settings? def simulate(self, mask_value: float = np.nan) -> ThermoGISDoubletResults: transmissivity_with_ntg = (self.aquifer.transmissivity * self.aquifer.ntg) / 1e3 output_arrays = xr.apply_ufunc( _run_doublet_at_location, self.aquifer.mask, self.aquifer.depth, self.aquifer.thickness, self.aquifer.porosity, self.aquifer.ntg, self.aquifer.temperature, self.aquifer.transmissivity, transmissivity_with_ntg, kwargs={"utc_input": self.settings.create_utc_input(), "mask_value": mask_value}, dask="parallelized", input_core_dims=[[], [], [], [], [], [], [], []], output_core_dims=[[], [], [], [], [], [], [], [], [], [], [], [], [], []], vectorize=True, ) return ThermoGISDoubletResults( power=output_arrays[0], heat_pump_power=output_arrays[1], capex=output_arrays[2], opex=output_arrays[3], utc=output_arrays[4], npv=output_arrays[5], hprod=output_arrays[6], cop=output_arrays[7], cophp=output_arrays[8], pres=output_arrays[9], flow_rate=output_arrays[10], welld=output_arrays[11], inj_temp=output_arrays[12], prd_temp=output_arrays[13], transmissivity_with_ntg=transmissivity_with_ntg, ) def _run_doublet_at_location( mask: float, depth: float, thickness: float, porosity: float, ntg: float, temperature: float, transmissivity: float, transmissivity_with_ntg: float, utc_input, mask_value: float, ) -> tuple: if np.any(np.isnan([depth, ntg, porosity, temperature, thickness, transmissivity, transmissivity_with_ntg])): return (np.nan,) * 14 def simulate(self) -> ThermoGISDoubletResults: ... No newline at end of file if not np.isnan(mask) or temperature < utc_input.minProdTemp(): return (mask_value,) * 14 doublet = JClass("thermogis.calc.utc.doublet.ThermoGisDoublet")(create_logger_mock(), utc_input) DoubletInput = JClass("thermogis.calc.utc.doublet.Doublet.DoubletInput") doublet_input = DoubletInput( -9999.0, thickness, transmissivity, transmissivity_with_ntg, ntg, depth, porosity, temperature, None, ) try: results = doublet.calculateDoubletPerformance(doublet_input) except Exception: return (mask_value,) * 14 if results is None or results.utc() == -9999.0: return (mask_value,) * 14 hprod = results.hprod() utc_cut = utc_input.utcCutoffDeep() if depth > utc_input.utcDeepDepth() else utc_input.utcCutoff() npv = 1e-6 * (utc_cut - results.utc()) * 3.6 * hprod * (1 - utc_input.taxRate()) return ( results.power(), results.hppower(), results.capex(), results.opex(), results.utc(), npv, hprod, results.cop(), results.cophp(), results.pres(), results.flow(), results.welld(), results.injectionTemp(), results.productionTemp(), ) No newline at end of file pythermogis/pytg3/settings.py +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ class Settings: instance.settings.setResultsDir("") return instance def create_utc_input(self) -> JClass: return self.settings.setupUTCParameters() @property def temperature_gradient(self) -> float: return self.settings.tempGradient() Loading Loading
pythermogis/pytg3/doublet.py +104 −3 Original line number Diff line number Diff line from __future__ import annotations from typing import TYPE_CHECKING import numpy as np import xarray as xr from jpype import JClass from pydantic import BaseModel, ConfigDict from pythermogis.mock import create_logger_mock if TYPE_CHECKING: from pythermogis.pytg3.aquifer import Aquifer Loading Loading @@ -48,6 +53,102 @@ class ThermoGISDoublet: # TODO: how to handle chunksize? In settings? def simulate(self, mask_value: float = np.nan) -> ThermoGISDoubletResults: transmissivity_with_ntg = (self.aquifer.transmissivity * self.aquifer.ntg) / 1e3 output_arrays = xr.apply_ufunc( _run_doublet_at_location, self.aquifer.mask, self.aquifer.depth, self.aquifer.thickness, self.aquifer.porosity, self.aquifer.ntg, self.aquifer.temperature, self.aquifer.transmissivity, transmissivity_with_ntg, kwargs={"utc_input": self.settings.create_utc_input(), "mask_value": mask_value}, dask="parallelized", input_core_dims=[[], [], [], [], [], [], [], []], output_core_dims=[[], [], [], [], [], [], [], [], [], [], [], [], [], []], vectorize=True, ) return ThermoGISDoubletResults( power=output_arrays[0], heat_pump_power=output_arrays[1], capex=output_arrays[2], opex=output_arrays[3], utc=output_arrays[4], npv=output_arrays[5], hprod=output_arrays[6], cop=output_arrays[7], cophp=output_arrays[8], pres=output_arrays[9], flow_rate=output_arrays[10], welld=output_arrays[11], inj_temp=output_arrays[12], prd_temp=output_arrays[13], transmissivity_with_ntg=transmissivity_with_ntg, ) def _run_doublet_at_location( mask: float, depth: float, thickness: float, porosity: float, ntg: float, temperature: float, transmissivity: float, transmissivity_with_ntg: float, utc_input, mask_value: float, ) -> tuple: if np.any(np.isnan([depth, ntg, porosity, temperature, thickness, transmissivity, transmissivity_with_ntg])): return (np.nan,) * 14 def simulate(self) -> ThermoGISDoubletResults: ... No newline at end of file if not np.isnan(mask) or temperature < utc_input.minProdTemp(): return (mask_value,) * 14 doublet = JClass("thermogis.calc.utc.doublet.ThermoGisDoublet")(create_logger_mock(), utc_input) DoubletInput = JClass("thermogis.calc.utc.doublet.Doublet.DoubletInput") doublet_input = DoubletInput( -9999.0, thickness, transmissivity, transmissivity_with_ntg, ntg, depth, porosity, temperature, None, ) try: results = doublet.calculateDoubletPerformance(doublet_input) except Exception: return (mask_value,) * 14 if results is None or results.utc() == -9999.0: return (mask_value,) * 14 hprod = results.hprod() utc_cut = utc_input.utcCutoffDeep() if depth > utc_input.utcDeepDepth() else utc_input.utcCutoff() npv = 1e-6 * (utc_cut - results.utc()) * 3.6 * hprod * (1 - utc_input.taxRate()) return ( results.power(), results.hppower(), results.capex(), results.opex(), results.utc(), npv, hprod, results.cop(), results.cophp(), results.pres(), results.flow(), results.welld(), results.injectionTemp(), results.productionTemp(), ) No newline at end of file
pythermogis/pytg3/settings.py +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ class Settings: instance.settings.setResultsDir("") return instance def create_utc_input(self) -> JClass: return self.settings.setupUTCParameters() @property def temperature_gradient(self) -> float: return self.settings.tempGradient() Loading