TNO Intern

Commit 77abd589 authored by Florian Knappers's avatar Florian Knappers
Browse files

start of simuliate()

parent 41a074a4
Loading
Loading
Loading
Loading
+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
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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()