TSCW GACA - INPUT - Erstellung
Eines der Ziele des tscw_module
ist die Erstellung der Feldbelegungs- und Prozessdatendatein für TSCW zu vereinfachen.
Dafür wird für jede Datei zunächste eine Klasse erstellt, die mit den enstprechenden Werten belegt wird.
Anschließend kann jede Klasse als txt-Datei exportiert werden. Das Modul formartiert die Daten TSCW Konform und prüft die Datei auf mögliche Fehler.
Ein weiterer Vorteil ist, dass in einer Python-Umgebung mit den Parameter wie mit Variablen gerechnet werden kann oder bspw. verschiedene Etappen in einer for-Schleife implementiert werden können.
Felddaten
Um eine Felddaten-Datei für das GACA Modul zu erstellen, muss die Klasse GacaFieldData
erstellt und mit Daten belegt werden.
0. Importiere benötigte Module:
1import numpy as np
2from tscw_module import GacaFieldData, GacaProcessData
3import matplotlib.pyplot as plt
1. Initialisiere GacaFieldData:
4n_boreholes = 1
5n_fluid = 1
6tvd = 490 # [m] RS lzRT ()
7delta_z = tvd / 4 # [m] Dicke vertikal Schicht (äquidistant)
8medium_type_cavern = 'GAS' #
9medium_id_cavern = 'Nordverbundgas' # Name der Substanz, welche in TSCW/Stoffwerte/Bibliothek definiert wurde
10
11# Initialisiere GacaFieldData Class
12Gaca_field = GacaFieldData(n_boreholes,n_fluid,tvd,delta_z,
13 medium_type_cavern,medium_id_cavern)
2. Definition der radialen Stützstellen um das Bohrloch:
Die radialen Stützstellen werden in diesem Beispiel in dem array radial_vector_borehole()
definiert.
- radial_vector_borehole(radial_vector, aggregate_states):
- Parameters:
radial_vector (array [1 x m_borehole]) – Array der radialen Stützstellen
aggregate_states – Array mit den Aggregatzuständen (entweder ‘FLUID’ oder ‘SOLID’). Falls der Array nicht die gleiche Länge hat wie radial_vector, werden fehlende Elemente mit ‘SOLID’ hinzugefügt.
Die Unterteilung sollte so erfolgen, dass alle revelanten Installationselemente in radialer Richtung erfasst werden.
Beim Ausführen der Funktion add_boreholeVector()
wird intern eine für beiden Größen therm. Leitfähigkeit \(\lambda\) und
Dichte * spez. Wärmeleitfähigkeit \(\rho \cdot c\) eine mit Nullen besetzte Matrix initialisiert.
Geometrisch besteht das Bohrlochmodell aus dieser Matrix, welche sich aus Gaca_field.p_borehole
Zeilen und Gaca_field.m_borehole
Spalten besteht.
Im nächsten Schritt werden den entsprechenden Matrix-Elementen Werte zugewiesen.
Die Matrix kann mit den Befehlen Gaca_field.thermal_conductivity
und Gaca_field.heat_capacity
inspiziert werden.
14radial_vector_borehole = np.array([0.0942, 0.1095, 0.1372, 0.1492, 0.2, 0.5, 1, 2, 4, 8, 16, 32, 64, 128]) # [m]
15 # Manuell werden beliebig viele Sützstellen mit Agregatzuständen beleget.
16 # Die restlichen sind automatisch 'SOLID'
17Gaca_field.add_boreholeVector(radial_vector_borehole,['FLUID','SOLID'])
18 # OPTIONAL: Kommentare der jeweiligen Stütztstelle beginnend ab dem ersten Element.
19Gaca_field.add_radialComment(['GAS','STAHL','RRSF','STAHL','ZEM','Gebirge---->'])
3. Definition der Materialeigenschaften um das Bohrloch:
Die entsprechenden Matrizen können Stoffwerten über die Funktion add_materialProperty()
hinzugefügt werden.
- add_materialProperty(top,bottom,heat_capacity,thermal_conductivity,name=None):
- Parameters:
top (int or float) – Start UK in z-Richtung [m]
bottom (int or float) – Ende UK in z-Richtung [m]
heat_capacity (array [1 x m_borehole]) – [MJ/(m3K)]
thermal_conductivity ([W/(m K)]) – [1 x m_borehole]
name (str, optional) – Name of the layer, will be displayed in .txt file when exported, defaults to None
20# Material Properties
21Gaca_field.add_materialProperty(0,250, # jeweils UK von Start und Ende angeben (range)
22 np.array([0.0000, 3.6000, 4.2000, 3.6000, 1.6000, 1.9200, 1.9200, # heat_capacity * rho [MJ/(m3K)]
23 1.9200, 1.9200, 1.9200, 1.9200, 1.9200, 1.9200, 1.9200]),
24 np.array([0.000, 50.000, 0.500, 50.000, 1.000, 2.330, 2.330, # thermal_conductivity [W/(m K)]
25 2.330, 2.330, 2.330, 2.330, 2.330, 2.330, 2.330]),'Schicht 1') # Name
26
27Gaca_field.add_materialProperty(350,500,
28 np.array([0.0000, 3.6000, 4.2000, 3.6000, 1.6000, 1.9500, 1.9500,
29 1.9500, 1.9500, 1.9500, 1.9500, 1.9500, 1.9500, 1.9500]),
30 np.array([0.000, 50.000, 0.500, 50.000, 1.000, 5.500, 5.500,
31 5.500, 5.500, 5.500, 5.500, 5.500, 5.500, 5.500]), 'Schicht 2' )
Schritt 2 + 3 - Objektorientiert (Empfohlen)
Note
Schritt 2 und 3 können alternativ auch mit einem etwas objektorientierten Ansatz durchgeführt werden. Anstatt die radialen Sützstellen als erstes zu definieren und später mit Werten zu belegen, werden erst Stützstellen für die geologische Formation und später einzelne Installationselemente hinzugefügt.
Es wird mit der Definition der radialen Sützstellen in der Formation begonnen.
15Gaca_field.initialise_formation(np.array([0.200, 0.500, 1.000, 2.000, 4.000,
16 8.000, 16.000, 32.000, 64.000, 128.0]))
Als nächstes werden den einzelnen geologischen Schichten mit den charachteristischen Stoffwerten hinzugefügt.
Die Funktion add_formation
ist analog zu add_materialProperty
.
- add_formation(top: float, bottom: float, material_data: dict, name: str = None)
- Parameters:
top (float) – start of layer [m]
bottom (float) – end of layer [m]
material_data (dict) – for example: {‘rho’: 1000, ‘cp’: 4180,’lambda’: 0.6} Units respt. in [kg/m3], [J/kg*K], [W/(m*K)],
name (str, optional) – _description_, defaults to None
17# add_formation(top:float, bottom:float, material_data:dict, name:str = None):
18# for example : material_data = {'rho': 1000, 'cp': 4180,'lambda': 0.6} Units respt. in [kg/m3], [J/kg*K], [W/(m*K)],
19Gaca_field.add_formation(0, 2*delta_z, material_data, 'Schicht1')
20Gaca_field.add_formation(3*delta_z, 4*delta_z, material_data , 'Schicht2')
Nachdem dei Geologie definiert worden ist, kann mit dem Hinzufügen von Installationselementen begonnen werden.
- add_element(starting_coor: tuple, end_coor: tuple, material_data: dict, name=None)
- Parameters:
starting_coor (tuple) – (z0, x0) - Top coordinates of element at the top left corner.
end_coor (tuple) – (z1, x1) - Bottom coordinates of element at the bottom right corner.
material_data (dict) – for example: {‘rho’: 1000, ‘cp’: 4180,’lambda’: 0.6} Units respt. in [kg/m3], [J/kg*K], [W/(m*K)],
name (_type_, optional) – Name, defaults to None
20Gaca_field.add_element((0, 0.0942), (Gaca_field.tvd, 0.1095), material_data) # 'Stahl'
21Gaca_field.add_element((0, 0.1095), (Gaca_field.tvd, 0.1372), material_data) # 'RRSF'
22Gaca_field.add_element((0, 0.1372), (Gaca_field.tvd, 0.1492), material_data) # 'Stahl'
23Gaca_field.add_element((0, 0.1492), (Gaca_field.tvd, 0.2), material_data) # 'Zement'
24# Definiere, welcher Index in Gaca_field.radial_borehole_vector der Strömungsraum ist.
25# Die jeweilige Spalte der Stoffmatrizen wird mit 0 gefüllt.
26Gaca_field.define_fluid_space(0, 'FLUID')
Note
Dieser Ansatz eignet sich vor allem für die Modellierung von komplizierteren Geometrien.
4. Temperatur und Neigung des Bohrlochs
32temparature_bh = np.transpose(np.tile(np.array([8, 12, 17, 22]),(Gaca_field.m_borehole, 1)))
33Gaca_field.add_temperature(temparature_bh,'borehole')
34Gaca_field.add_boreholeInclination('vertical')
5. Kaverneneigenschaften
36rad_kav = 30.3 # radius
37v_kav = 464366 # Volumen
38# Höhe des Zylinders, wenn das Volumen aus einem Zylinder mit zwei aufgesetzten Halbkugel approximiert wird.
39h = (v_kav - 4/3*np.pi*rad_kav**3) / (np.pi*rad_kav**2)
40density_salt = 2170 # [kg/m3]
41specific_heat_capacity_salt = 900 # [J/(kg*K)]
42heat_conductivity_salt = 5.5 # [W/(m*K)]
43height_cavern = h + 2*rad_kav # [m]
44volume_brine_equivalent = 30000 # [m3]
45radius_brine_level = rad_kav # [m]
46refdepth_cavern = tvd # [m] RS
47temperature_brine_equivalent = 30 # [°C]
48pressure_cavern = 9.8 # [MPa]
49
50
51# radiale Stützstellen in der Kaverne
52radial_vector_cavern = np.array([rad_kav, 35.18, 39.51, 43.85, 48.19, 52.52, 56.86, 61.19,
53 65.53, 69.87, 74.23, 78.54, 82.88, 87.22, 91.56, 95.90,
54 100.24, 104.58, 109.92, 113.26, 117.60, 121.90, 126.24,
55 135.00, 140.00, 145.00, 150.00])
56
57# temperatur
58temparature_cav = np.array([22.00]*radial_vector_cavern.shape[0]) # const temperature
59
60
61# Füge die Daten der Klasse hinzu
62Gaca_field.add_cavernVector(radial_vector_cavern)
63Gaca_field.add_temperature(temparature_cav,'cavern')
64Gaca_field.add_cavernCharacteristics(refdepth_cavern, density_salt, specific_heat_capacity_salt,heat_conductivity_salt,
65 height_cavern, volume_brine_equivalent, radius_brine_level,pressure_cavern, temperature_brine_equivalent)
6. Export
66save_folder = r'L:\Projekte\SG-UBT\40_Thermodynamik\TSCW_GACA_Bernburg\Gruppe1'
67project_name = 'BB_Bb122'
68Gaca_field.export_fieldData(save_folder,project_name, True)
Beim exportieren wird in der Konsole folgendes angezeigt:
Run sucessfull
L:\Projekte\SG-UBT\40_Thermodynamik\TSCW_GACA_Bernburg\Gruppe1\BB_Gruppe1_Bb122\BB_Gruppe1_Bb122_gaca.fd.txt
Backend TkAgg is interactive backend. Turning interactive mode on.
Exported L:\Projekte\SG-UBT\40_Thermodynamik\TSCW_GACA_Bernburg\Gruppe1\BB_Gruppe1_Bb122\BB_Gruppe1_Bb122_fd.pickle
Die Felddaten-Datei BB_Gruppe1_Bb122_gaca.fd.txt
ist:
NUMBER_BOREHOLES 1
N_FLUID 1
M_BOREHOLE 14 # (M)
P_BOREHOLE 4 # (P)
DL 122.5000 # [m]
M_CAVERN 27 # (MK)
MEDIUM_TYPE_CAVERN GAS
MEDIUM_ID_CAVERN Nordverbundgas
DEPTH_CAVERN 490.00 # Referenztiefe fuer Druck
RADIAL_VECTOR_BOREHOLE # [m]
#GAS STAHL RRSF STAHL ZEM Gebirge---->
0.0942 0.1095 0.1372 0.1492 0.2000 0.5000 1.0000 2.0000 4.0000 8.0000 16.0000 32.0000 64.0000 128.0000
COLUMN_CHARACTER_BOREHOLE # [/] der Radialelemente um die Bohrung (M Werte)
FLUID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID SOLID
HEAT_CAPACITY_BOREHOLE # [MJ/(K*m3)] Dichte * spez. Waermekapazitaet der Radialelemente um die Bohrung (P*M Werte)
#GAS STAHL RRSF STAHL ZEM Gebirge---->
0.000 3.600 4.200 3.600 1.600 1.920 1.920 1.920 1.920 1.920 1.920 1.920 1.920 1.920 # UK 122.50m - Schicht 1
0.000 3.600 4.200 3.600 1.600 1.920 1.920 1.920 1.920 1.920 1.920 1.920 1.920 1.920 # UK 245.00m - Schicht 1
0.000 3.600 4.200 3.600 1.600 1.950 1.950 1.950 1.950 1.950 1.950 1.950 1.950 1.950 # UK 367.50m - Schicht 2
0.000 3.600 4.200 3.600 1.600 1.950 1.950 1.950 1.950 1.950 1.950 1.950 1.950 1.950 # UK 490.00m - Schicht 2
THERMAL_CONDUCTIVITY_BOREHOLE # [W/(m*K)] Waermeleitfaehigkeit der Radialelemente um die Bohrung (P*M Werte)
#GAS STAHL RRSF STAHL ZEM Gebirge---->
0.000 50.000 0.500 50.000 1.000 2.330 2.330 2.330 2.330 2.330 2.330 2.330 2.330 2.330 # UK 122.50m - Schicht 1
0.000 50.000 0.500 50.000 1.000 2.330 2.330 2.330 2.330 2.330 2.330 2.330 2.330 2.330 # UK 245.00m - Schicht 1
0.000 50.000 0.500 50.000 1.000 5.500 5.500 5.500 5.500 5.500 5.500 5.500 5.500 5.500 # UK 367.50m - Schicht 2
0.000 50.000 0.500 50.000 1.000 5.500 5.500 5.500 5.500 5.500 5.500 5.500 5.500 5.500 # UK 490.00m - Schicht 2
TEMPERATURE_BOREHOLE # [deg C] Temperatur der Radialelemente um die Bohrung (P*M Werte)
#GAS STAHL RRSF STAHL ZEM Gebirge---->
8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 8.000 # UK 122.50m - Schicht 1
12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 12.000 # UK 245.00m - Schicht 1
17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 17.000 # UK 367.50m - Schicht 2
22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 22.000 # UK 490.00m - Schicht 2
WELL_VERTICALITY # [deg] Winkel zwischen Bohrlochachse und Bohrung (P Werte)
0.000 # UK 122.50m - Schicht 1
0.000 # UK 245.00m - Schicht 1
0.000 # UK 367.50m - Schicht 2
0.000 # UK 490.00m - Schicht 2
RADIAL_VECTOR_CAVERN # [m] (MK Werte)
30.3000 35.1800 39.5100 43.8500 48.1900 52.5200 56.8600 61.1900 65.5300 69.8700 74.2300 78.5400 82.8800 87.2200 91.5600 95.9000 100.2400 104.5800 109.9200 113.2600 117.6000 121.9000 126.2400 135.0000 140.0000 145.0000 150.0000
TEMPERATURE_CAVERN # [deg C] Temperatur der Radialelemente um die Kaverne (MK Werte)
22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000 22.0000
DENSITY_SALT 2170.00 #[kg/m3]
SPECIFIC_HEAT_CAPACITY_SALT 900.00 #[J/(kg*K)]
HEAT_CONDUCTIVITY_SALT 5.50 #[W/(m*K)]
HEIGHT_CAVERN 181.20 #[m]
VOLUME_BRINE_EQUIVALENT 30000.00 #[m3]
RADIUS_BRINE_LEVEL 30.30 #[m]
PRESSURE_CAVERN 9.80 #[MPa] at DEPTH_CAVERN 490.00m
TEMPERATURE_BRINE_EQUIVALENT 30 #[deg]
BB_Gruppe1_Bb122_fd.pickle
ist eine Binär-Datei der exportieren Felddatenklasse.
Sie kann mit dem Befehl in ein anderes Skript geladen werden.
1import pickle
2with open(field_data_picklePath, 'rb') as f:
3 field_data = pickle.load(f)
6. Geometrie QC
Es empfiehlt sich, vor dem Starten der Simulation die erstellte txt-Datei zu kontrollieren. Außerdem kann die Geometrie mit folgendem Befehl geplottet werden:
1 Gaca_field.plot_geometry([0, 0.5]) # radial range
2 plt.show()


Prozessdaten
Für die Prozessdaten wird die Klasse ProcessData
erstellt und mit Daten belegt.
1. Initialisierung
1coupled_annuli = [1]
2medium_type = ['GAS']
3medium_id = [medium_id_cavern]
4description = 'Gasspeicher Bernburg Bbg 122 Ausspeisung'
5PD_Ausspeisung = GacaProcessData(description, coupled_annuli, medium_type, medium_id, 'gaca')
2. Hinzufügen von Etappen
Etappen können chronologisch hinzugefügt werden. Dies hat den Vorteil, dass beispielsweise treppenstufige Aus- oder Einspeisungen in for-loops zu der Klasse hinzugefügt werden können (siehe unten). Beim Export der Klasse werden die Etappen automatisch nummeriert und formatiert. Wichtig ist dass die Parameter in einer ‘dict’ Klasse erstellt werden und die Schlüsselnamen den Parameternamen aus dem Handbuch entsprechen. Siehe dafür die Dokumentation von :py:func:add_stage
6# Initialisiere Parameter Dictionary
7ausspeisung_param = {
8'TERMINATION_ID': 6,
9'TERMINATION_QUANTITY': None,
10'DT_MAX': 1,
11'FLOW_RATE': None,
12'K_S': 0.2 ,
13'P_BOUNDARY_CONDITION': 'CAVERN',
14'BOUNDARY_PRESSURE': 0,
15'T_BOUNDARY_CONDITION': 'CAVERN',
16'BOUNDARY_TEMPERATURE': 0
17}
18
19flow_rate_array = np.array([2e5, 1.5e5, 1e5, 0.75e5, 0.3e5]) # verschiedene Raten
20termination_quantity_array = np.array([9.5, 7.5,6.31,6.03,1.1]) # verschiedene min. Drücke
21
22
23for flow_rate, termination_quantitiy in zip(flow_rate_array,termination_quantity_array): # for Schleife
24 ausspeisung_param['FLOW_RATE'] = flow_rate
25 ausspeisung_param['TERMINATION_QUANTITY'] = termination_quantitiy
26 PD_Ausspeisung.add_stage(ausspeisung_param)
2. Export
27save_folder = r'L:\Projekte\SG-UBT\40_Thermodynamik\TSCW_GACA_Bernburg\Gruppe1'
28project_name = 'BB_Bb122'
29PD_Ausspeisung.export_processData(save_folder,project_name, subfolder = 'Ausspeisung')
In der Konsole wird folgendes angezeigt:
L:\Projekte\SG-UBT\40_Thermodynamik\TSCW_GACA_Bernburg\Gruppe1\BB_Gruppe1\Ausspeisung\Bb122_gaca.pd.txt
Run sucessfull
Die entsprechende Prozessdatei hat folgende Gestalt:
DESCRIPTION Gasspeicher Bernburg Bbg 122 Ausspeisung
N_FLUID 1
NUMBER_OF_STAGES [/] 5
MEDIUM_TYPE
GAS
MEDIUM_ID
Nordverbundgas
COUPLED_ANNULI # [integer required!]
1
# ++++++++++++++++++++++++++++++++
STAGE 1
TERMINATION_ID 6
TERMINATION_QUANTITY 9.50
DT_MAX 1
FLOW_RATE 200000.00
K_S 0.20
P_BOUNDARY_CONDITION CAVERN
BOUNDARY_PRESSURE 0
T_BOUNDARY_CONDITION CAVERN
BOUNDARY_TEMPERATURE 0
# ++++++++++++++++++++++++++++++++
STAGE 2
TERMINATION_ID 6
TERMINATION_QUANTITY 7.50
DT_MAX 1
FLOW_RATE 150000.00
K_S 0.20
P_BOUNDARY_CONDITION CAVERN
BOUNDARY_PRESSURE 0
T_BOUNDARY_CONDITION CAVERN
BOUNDARY_TEMPERATURE 0
# ++++++++++++++++++++++++++++++++
STAGE 3
TERMINATION_ID 6
TERMINATION_QUANTITY 6.31
DT_MAX 1
FLOW_RATE 100000.00
K_S 0.20
P_BOUNDARY_CONDITION CAVERN
BOUNDARY_PRESSURE 0
T_BOUNDARY_CONDITION CAVERN
BOUNDARY_TEMPERATURE 0
# ++++++++++++++++++++++++++++++++
STAGE 4
TERMINATION_ID 6
TERMINATION_QUANTITY 6.03
DT_MAX 1
FLOW_RATE 75000.00
K_S 0.20
P_BOUNDARY_CONDITION CAVERN
BOUNDARY_PRESSURE 0
T_BOUNDARY_CONDITION CAVERN
BOUNDARY_TEMPERATURE 0
# ++++++++++++++++++++++++++++++++
STAGE 5
TERMINATION_ID 6
TERMINATION_QUANTITY 1.10
DT_MAX 1
FLOW_RATE 30000.00
K_S 0.20
P_BOUNDARY_CONDITION CAVERN
BOUNDARY_PRESSURE 0
T_BOUNDARY_CONDITION CAVERN
BOUNDARY_TEMPERATURE 0
Ordnerstruktur
Jeweils die Klasse der Feldbelgungs- und Prozessdatendatei haben die Variablen save_folder
(Path)
und ``project_name``(str) als Input.
Für die Ordner Struktur wird folgender Aufbau empfohlen.
Pro Projekt sollte die Variable save_folder
gleich sein, in dem folgenden Beispiel ist save_folder = Bernburg_Simulationen
Die Variable project_name
ist z.B. eine zu simulierende Bohrung in dem Projekt, von der sich die Feldbelegungsdatei unterscheidet.
Für jede Prozessdatendatei kann mit der Variable subfolder
ein eigener Ordner erstellt werden.
# ..... CODE
save_folder = Path(r'C:\Bernburg_Simulationen')
project_name = 'BB_Bb122'
# ..... CODE
# Export
Gaca_field.export_fieldData(save_folder,project_name) # Felddaten
PD_Ausspeisung.export_processData(save_folder,project_name, subfolder = 'Ausspeisung_5000m3h') # Prozessdaten
# ..... CODE
PD_Ausspeisung.export_processData(save_folder,project_name, subfolder = 'Einspeisung_3000m3h') # Prozessdaten
Der ausgeführte Code generiert in dem Ordner Bernburg_Simulationen
einen Unterordner BB_Bb122
in dem sich das entsprechende *_gaca.fd.txt
File befindet.
In den Unterordner befinden sich die jeweiligen Prozessdatendateien.
Mit dieser Ordnerstruktur lassen sich effektiv die jeweiligen Simulationen kategorisieren
In dem Überordner “BB_Bb122_Zylinder” befinden sich eine Hauptdatei, welche die Felddaten beinhaltet.
In jedem Unterordner gibt es eine entsprechende Prozessdatendatei.
Es gilt zu beachten dass jeder Unterordner, z.B. “Ausspeisung_5000m3h” nach Durchführung mit TSCW mit den Outputdateien befüllt wird.
Bernburg_Simulationen
| BB_Bb122
| ├── BB_Bb122.fd.txt
| ├── Ausspeisung_5000m3h
| │ ├── BB_Bb122Ausspeisung_5000m3h_gaca.pd.txt
| ├── Einspeisung_3000m3h
| │ ├── BB_Bb122Einspeisung_3000m3h_gaca.pd.txt