Skip to content

Commit d8ef639

Browse files
authored
Merge pull request #364 from wouterpeere/Muovitech
Add turbocollector
2 parents dac4da0 + 0dd5c0b commit d8ef639

23 files changed

+492
-35
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
77

88
## [2.3.4] - Unpublished
99

10-
## Fixed
10+
###
11+
12+
- Added Turbocollector from Muovitech.
13+
14+
### Fixed
1115

1216
- Small bug in pressure drop lateral pipe.
1317
- Small bug in pressure drop calculation of separatus.

GHEtool/Examples/Hydratech.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""
2+
This files contains the code to create graphs for the borehole thermal resistance and pressure drop in a single U
3+
tube at different flow rates and temperatures.
4+
"""
5+
import matplotlib.pyplot as plt
6+
import numpy as np
7+
8+
from GHEtool import *
9+
10+
pipe = SingleUTube(1.5, 0.013, 0.016, 0.4, 0.035)
11+
12+
mpg = TemperatureDependentFluidData('MPG', 25, mass_percentage=False)
13+
meg = TemperatureDependentFluidData('MEG', 23, mass_percentage=False)
14+
thermox = TemperatureDependentFluidData('Thermox DTX', 23, mass_percentage=False)
15+
coolflow = TemperatureDependentFluidData('Coolflow NTP', 25, mass_percentage=False)
16+
17+
flow_rates = np.arange(0.1, 0.8, 0.01)
18+
19+
for temp in (-10, -5, 0, 5, 10):
20+
list_rb_mpg, list_rb_meg, list_rb_thermox, list_rb_coolflow = [], [], [], []
21+
list_dp_mpg, list_dp_meg, list_dp_thermox, list_dp_coolflow = [], [], [], []
22+
23+
for val in flow_rates:
24+
flow = ConstantFlowRate(vfr=val)
25+
26+
borehole_mpg = Borehole(mpg, pipe, flow)
27+
borehole_meg = Borehole(meg, pipe, flow)
28+
borehole_thermox = Borehole(thermox, pipe, flow)
29+
borehole_coolflow = Borehole(coolflow, pipe, flow)
30+
31+
list_rb_mpg.append(borehole_mpg.calculate_Rb(100, 0.7, 0.07, 2, temperature=temp))
32+
list_rb_meg.append(borehole_meg.calculate_Rb(100, 0.7, 0.07, 2, temperature=temp))
33+
list_rb_thermox.append(borehole_thermox.calculate_Rb(100, 0.7, 0.07, 2, temperature=temp))
34+
list_rb_coolflow.append(borehole_coolflow.calculate_Rb(100, 0.7, 0.07, 2, temperature=temp))
35+
36+
list_dp_mpg.append(pipe.pressure_drop(mpg, flow, 100 - 0.7, temperature=temp))
37+
list_dp_meg.append(pipe.pressure_drop(meg, flow, 100 - 0.7, temperature=temp))
38+
list_dp_thermox.append(pipe.pressure_drop(thermox, flow, 100 - 0.7, temperature=temp))
39+
list_dp_coolflow.append(pipe.pressure_drop(coolflow, flow, 100 - 0.7, temperature=temp))
40+
41+
plt.figure()
42+
plt.plot(flow_rates, list_rb_mpg, label="MPG 25 v/v%")
43+
plt.plot(flow_rates, list_rb_meg, label="MEG 23 v/v%")
44+
plt.plot(flow_rates, list_rb_thermox, label="Thermox DTX 23 v/v%")
45+
plt.plot(flow_rates, list_rb_coolflow, label="Coolflow NTP 25 v/v%")
46+
47+
plt.title(f'Borehole thermal resistance at {temp}°C')
48+
plt.ylabel('Effective borehole thermal resistance [W/(mK)]')
49+
plt.xlabel('Flow rate [l/s]')
50+
plt.legend()
51+
plt.savefig(f'resistance_{temp}.svg')
52+
plt.figure()
53+
54+
plt.plot(flow_rates, list_dp_mpg, label="MPG 25 v/v%")
55+
plt.plot(flow_rates, list_dp_meg, label="MEG 23 v/v%")
56+
plt.plot(flow_rates, list_dp_thermox, label="Thermox DTX 23 v/v%")
57+
plt.plot(flow_rates, list_dp_coolflow, label="Coolflow NTP 25 v/v%")
58+
59+
plt.title(f'Pressure drop at {temp}°C')
60+
plt.ylabel('Pressure drop [kPa]')
61+
plt.xlabel('Flow rate [l/s]')
62+
plt.legend()
63+
plt.savefig(f'pressure_{temp}.svg')

GHEtool/Examples/Muovitech_new.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
"""
2+
This files contains the code to create graphs for the borehole thermal resistance and pressure drop in a single DN32
3+
turbocollector for different fluids and flow rates.
4+
"""
5+
import matplotlib.pyplot as plt
6+
import numpy as np
7+
8+
from GHEtool import *
9+
10+
single_turbo_collector = Turbocollector(1.5, 0.013, 0.016, 0.035, 1)
11+
single_smooth = SingleUTube(1.5, 0.013, 0.016, 0.4, 0.035)
12+
double_turbo_collector = Turbocollector(1.5, 0.013, 0.016, 0.035, 2)
13+
double_smooth = DoubleUTube(1.5, 0.013, 0.016, 0.4, 0.035)
14+
15+
mpg = TemperatureDependentFluidData('MPG', 25, mass_percentage=False)
16+
meg = TemperatureDependentFluidData('MEG', 25, mass_percentage=False)
17+
water = TemperatureDependentFluidData('Water', 100, mass_percentage=False)
18+
19+
flow_rates = np.arange(0.1, 0.8, 0.01)
20+
21+
for fluid in (mpg, meg, water):
22+
list_rb_single_turbo, list_rb_single_smooth, list_rb_double_turbo, list_rb_double_smooth = [], [], [], []
23+
list_dp_single_turbo, list_dp_single_smooth, list_dp_double_turbo, list_dp_double_smooth = [], [], [], []
24+
25+
for val in flow_rates:
26+
flow = ConstantFlowRate(vfr=val)
27+
28+
borehole_single_turbo = Borehole(fluid, single_turbo_collector, flow)
29+
borehole_single_smooth = Borehole(fluid, single_smooth, flow)
30+
borehole_double_turbo = Borehole(fluid, double_turbo_collector, flow)
31+
borehole_double_smooth = Borehole(fluid, double_smooth, flow)
32+
33+
list_rb_single_turbo.append(borehole_single_turbo.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
34+
list_rb_single_smooth.append(borehole_single_smooth.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
35+
list_rb_double_turbo.append(borehole_double_turbo.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
36+
list_rb_double_smooth.append(borehole_double_smooth.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
37+
38+
list_dp_single_turbo.append(single_turbo_collector.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
39+
list_dp_single_smooth.append(single_smooth.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
40+
list_dp_double_turbo.append(double_turbo_collector.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
41+
list_dp_double_smooth.append(double_smooth.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
42+
43+
plt.figure()
44+
plt.plot(flow_rates, list_rb_single_turbo, label="Single turbo")
45+
plt.plot(flow_rates, list_rb_single_smooth, label="Single smooth")
46+
plt.plot(flow_rates, list_rb_double_turbo, label="Double turbo")
47+
plt.plot(flow_rates, list_rb_double_smooth, label="Double smooth")
48+
49+
plt.title(f'Borehole thermal resistance for {fluid._name}')
50+
plt.ylabel('Effective borehole thermal resistance [W/(mK)]')
51+
plt.xlabel('Flow rate [l/s]')
52+
plt.legend()
53+
plt.savefig(f'resistance_{fluid._name}.svg')
54+
plt.figure()
55+
56+
plt.plot(flow_rates, list_dp_single_turbo, label="Single turbo")
57+
plt.plot(flow_rates, list_dp_single_smooth, label="Single smooth")
58+
plt.plot(flow_rates, list_dp_double_turbo, label="Double turbo")
59+
plt.plot(flow_rates, list_dp_double_smooth, label="Double smooth")
60+
61+
plt.title(f'Pressure drop for {fluid._name}')
62+
plt.ylabel('Pressure drop [kPa]')
63+
plt.xlabel('Flow rate [l/s]')
64+
plt.legend()
65+
plt.show()
66+
plt.savefig(f'pressure_{fluid._name}.svg')

GHEtool/Examples/tilted_borefield.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@ def tilted():
4949
borefield.print_temperature_profile()
5050

5151

52-
if __name__ == "__main__":
52+
if __name__ == "__main__": # pragma: no-cover
5353
tilted()

GHEtool/Examples/turbocollector.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"""
2+
This files contains the code to create graphs for the borehole thermal resistance and pressure drop for a single and
3+
double DN32 turbocollector from Muovitech for different fluids (MPG 25 v/v%, MEG 25 v/v% and Water). The results are
4+
compared with the traditional single and double smooth pipe of DN32.
5+
6+
The correlations for both the convective heat transfer coefficient and the friction factor, which are used internally
7+
to calculate respectively the effective borehole thermal resistance and the pressure drop, were created by Niklas Hidman,
8+
Division of Fluid Dynamics, Department of Mechanical and Maritime Sciences, Chalmers University of Technology, Gothenburg, Sweden.
9+
The study can be found here: https://www.muovitech.com/studies/Thermohydraulic_performance_evaluation_250519.pdf
10+
"""
11+
import matplotlib.pyplot as plt
12+
import numpy as np
13+
14+
from GHEtool import *
15+
16+
17+
def create_graphs():
18+
single_turbo_collector = Turbocollector(1.5, 0.013, 0.016, 0.035, 1)
19+
single_smooth = SingleUTube(1.5, 0.013, 0.016, 0.4, 0.035)
20+
double_turbo_collector = Turbocollector(1.5, 0.013, 0.016, 0.035, 2)
21+
double_smooth = DoubleUTube(1.5, 0.013, 0.016, 0.4, 0.035)
22+
23+
mpg = TemperatureDependentFluidData('MPG', 25, mass_percentage=False)
24+
meg = TemperatureDependentFluidData('MEG', 25, mass_percentage=False)
25+
water = TemperatureDependentFluidData('Water', 100, mass_percentage=False)
26+
27+
flow_rates = np.arange(0.1, 0.8, 0.01)
28+
29+
for fluid in (mpg, meg, water):
30+
list_rb_single_turbo, list_rb_single_smooth, list_rb_double_turbo, list_rb_double_smooth = [], [], [], []
31+
list_dp_single_turbo, list_dp_single_smooth, list_dp_double_turbo, list_dp_double_smooth = [], [], [], []
32+
33+
for val in flow_rates:
34+
flow = ConstantFlowRate(vfr=val)
35+
36+
borehole_single_turbo = Borehole(fluid, single_turbo_collector, flow)
37+
borehole_single_smooth = Borehole(fluid, single_smooth, flow)
38+
borehole_double_turbo = Borehole(fluid, double_turbo_collector, flow)
39+
borehole_double_smooth = Borehole(fluid, double_smooth, flow)
40+
41+
list_rb_single_turbo.append(borehole_single_turbo.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
42+
list_rb_single_smooth.append(borehole_single_smooth.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
43+
list_rb_double_turbo.append(borehole_double_turbo.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
44+
list_rb_double_smooth.append(borehole_double_smooth.calculate_Rb(100, 0.7, 0.07, 2, temperature=5))
45+
46+
list_dp_single_turbo.append(single_turbo_collector.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
47+
list_dp_single_smooth.append(single_smooth.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
48+
list_dp_double_turbo.append(double_turbo_collector.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
49+
list_dp_double_smooth.append(double_smooth.pressure_drop(fluid, flow, 100 - 0.7, temperature=5))
50+
51+
plt.figure()
52+
plt.plot(flow_rates, list_rb_single_turbo, label="Single turbo")
53+
plt.plot(flow_rates, list_rb_single_smooth, label="Single smooth")
54+
plt.plot(flow_rates, list_rb_double_turbo, label="Double turbo")
55+
plt.plot(flow_rates, list_rb_double_smooth, label="Double smooth")
56+
57+
plt.title(f'Borehole thermal resistance for {fluid._name}')
58+
plt.ylabel('Effective borehole thermal resistance [W/(mK)]')
59+
plt.xlabel('Flow rate [l/s]')
60+
plt.legend()
61+
plt.figure()
62+
63+
plt.plot(flow_rates, list_dp_single_turbo, label="Single turbo")
64+
plt.plot(flow_rates, list_dp_single_smooth, label="Single smooth")
65+
plt.plot(flow_rates, list_dp_double_turbo, label="Double turbo")
66+
plt.plot(flow_rates, list_dp_double_smooth, label="Double smooth")
67+
68+
plt.title(f'Pressure drop for {fluid._name}')
69+
plt.ylabel('Pressure drop [kPa]')
70+
plt.xlabel('Flow rate [l/s]')
71+
plt.legend()
72+
plt.show()
73+
74+
75+
if __name__ == "__main__": # pragma: no-cover
76+
create_graphs()

GHEtool/Validation/validation_effective_borehole_thermal_resistance.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import pygfunction as gt
1313

1414
from GHEtool import Borefield, FOLDER
15-
from GHEtool.VariableClasses import FluidData, GroundConstantTemperature, DoubleUTube
15+
from GHEtool.VariableClasses import ConstantFluidData, ConstantFlowRate, GroundConstantTemperature, DoubleUTube
1616

1717

1818
def validate():
@@ -24,8 +24,8 @@ def validate():
2424

2525
# initiate borefield model
2626
borefield = Borefield()
27-
borefield.set_ground_parameters(ground_data)
28-
borefield.set_pipe_parameters(pipe_data)
27+
borefield.ground_data = ground_data
28+
borefield.pipe_data = pipe_data
2929
borefield.set_borefield(borefield_gt)
3030
borefield.Rb = 0.12
3131

@@ -41,8 +41,10 @@ def validate():
4141

4242
# calculate effective borehole thermal resistance (Rb*)
4343
for mfr in mfr_range:
44-
fluid_data = FluidData(mfr, 0.568, 998, 4180, 1e-3)
45-
borefield.set_fluid_parameters(fluid_data)
44+
fluid_data = ConstantFluidData(0.568, 998, 4180, 1e-3)
45+
flow_data = ConstantFlowRate(mfr=mfr)
46+
borefield.fluid_data = fluid_data
47+
borefield.flow_data = flow_data
4648
Rb.append(borefield.Rb)
4749
R_p.append(borefield.borehole.pipe_data.R_p)
4850
R_fp.append(borefield.borehole.pipe_data.R_f)

GHEtool/VariableClasses/FluidData/TemperatureDependentFluidData.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, name: str, percentage: float, mass_percentage: bool = True):
3030
Parameters
3131
----------
3232
name : str
33-
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA
33+
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA, Thermox DTX, Coolflow NTP
3434
percentage : float
3535
Percentage of the antifreeze [%]
3636
mass_percentage : bool
@@ -123,7 +123,7 @@ def _get_fluid(self, name: str, percentage: float) -> tuple:
123123
Parameters
124124
----------
125125
name : str
126-
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA
126+
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA, Thermox DTX, Coolflow NTP
127127
percentage : float
128128
Percentage of the antifreeze [%]
129129
@@ -166,7 +166,7 @@ def set_fluid(self, name: str, percentage: float) -> None:
166166
Parameters
167167
----------
168168
name : str
169-
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA
169+
Name of the antifreeze. Currently, there is: Water, MEG, MPG, MEA, MMA, Thermox DTX, Coolflow NTP
170170
percentage : float
171171
Percentage of the antifreeze [%]
172172

GHEtool/VariableClasses/PipeData/MultipleUTube.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ def __init__(self, k_g: float = None,
3030
Parameters
3131
----------
3232
k_g : float
33-
Grout thermal conductivity [W/mK]
33+
Grout thermal conductivity [W/(mK)]
3434
r_in : float
3535
Inner pipe radius [m]
3636
r_out : float
3737
Outer pipe radius [m]
3838
k_p : float
39-
Pipe thermal conductivity [W/mK]
39+
Pipe thermal conductivity [W/(mK)]
4040
D_s : float
4141
Distance of the pipe until center [m]
4242
number_of_pipes : int
@@ -99,6 +99,7 @@ def calculate_resistances(self, fluid_data: _FluidData, flow_rate_data: _FlowDat
9999
flow_rate_data.mfr(fluid_data=fluid_data, **kwargs) / self.number_of_pipes,
100100
self.r_in, fluid_data.mu(**kwargs), fluid_data.rho(**kwargs),
101101
fluid_data.k_f(**kwargs), fluid_data.cp(**kwargs), self.epsilon)
102+
102103
# Film thermal resistance [m.K/W]
103104
self.R_f = 1.0 / (h_f * 2 * np.pi * self.r_in)
104105

@@ -210,4 +211,5 @@ def __export__(self):
210211
'spacing [mm]': math.sqrt(self.pos[0][0] ** 2 + self.pos[0][1] ** 2) * 1000,
211212
'k_g [W/(m·K)]': self.k_g,
212213
'k_p [W/(m·K)]': self.k_p,
213-
'epsilon [mm]': self.epsilon * 1000}
214+
'epsilon [mm]': self.epsilon * 1000
215+
}

0 commit comments

Comments
 (0)