diff --git a/examples/script_pipe_losses.py b/examples/script_pipe_losses.py new file mode 100644 index 0000000000000000000000000000000000000000..6c6116f1ece790abb2fc6b6e6ef641d60c56ad88 --- /dev/null +++ b/examples/script_pipe_losses.py @@ -0,0 +1,663 @@ +# ***************************************************************************** +# ***************************************************************************** + +# import libraries +import matplotlib.pyplot as plt +import math +# topupheat +import topupheat.pipes.fic as fic +from topupheat.pipes.single import StandardisedPipe, StandardisedPipeDatabase +from topupheat.pipes.twin import StandardisedTwinPipe +from topupheat.pipes.trenches import SupplyReturnPipeTrench, TwinPipeTrench +import topupheat.pipes.trenches as _tre + +# ***************************************************************************** +# ***************************************************************************** + +# pipe data +pipedata_files = [ + 'pipes/enerpipe_caldopex_single.csv', + 'pipes/enerpipe_caldopex_twin.csv', + 'pipes/isoplus_singlepipes_s1.csv', + 'pipes/isoplus_singlepipes_s2.csv', + 'pipes/isoplus_singlepipes_s3.csv', + 'pipes/isoplus_twin_disconti_s1.csv', + 'pipes/isoplus_twin_disconti_s2.csv', + 'pipes/isoplus_twin_disconti_s3.csv', + ] + +# ***************************************************************************** +# ***************************************************************************** + +# specifications + +# maximum specific pressure drop +list_max_specific_pressure_loss = [100] # Pa/m + +# district heating details +dh_flow_temperature = 273.15+100 # K +dh_return_temperature = 273.15+100 # K + +# temperature fluid bulk +temperature_fluid_bulk = 0.5*(dh_return_temperature+dh_flow_temperature) + +# ground temperature +ground_temperature = 273.15+10 # K + +# pipe absolute/effective roughness +pipe_e_eff = 0.01/1000 # m + +# pipe length +pipe_length = 1000 + +# pipe depth +pipe_depth = 0.8 + +# pipe soil +soil_k = 1 #0.5 + +# pipe distance +pipe_distance = 0.1 # plus diameter +ground_air_heat_transfer_coefficient = math.inf + +# single pipe method +# single_pipe_trench_config = (_tre.SHT_METHOD_DIRECT, _tre.TRGTPT_KRISCHER1936) +# single_pipe_trench_config = (_tre.SHT_METHOD_SYM_ASYM, _tre.TRGTPT_MULTIPOLE_ZERO_ORDER) +# single_pipe_trench_config = (_tre.SHT_METHOD_SYM_ASYM, _tre.TRGTPT_MULTIPOLE_FIRST_ORDER) +# single_pipe_trench_config = (_tre.SHT_METHOD_DIRECT, _tre.TRGTPT_MULTIPOLE_ZERO_ORDER) +single_pipe_trench_config = (_tre.SHT_METHOD_DIRECT, _tre.TRGTPT_MULTIPOLE_FIRST_ORDER) + +# twin pipe method +# twin_pipe_trench_config = (_tre.SHT_METHOD_SYM_ASYM, _tre.TRGTPT_MULTIPOLE_ZERO_ORDER) +# twin_pipe_trench_config = (_tre.SHT_METHOD_SYM_ASYM, _tre.TRGTPT_MULTIPOLE_FIRST_ORDER) +twin_pipe_trench_config = (_tre.SHT_METHOD_SYM_ASYM, _tre.TRGTPT_TWO_MODEL_APPROX) + +# ***************************************************************************** + +# specify the pipes +list_pipe_tuples = [ + # (20, 1, 'caldopex', '25-76'), + # (20, 2, 'caldopex', 'PLUS 25-91'), + # (25, 1, 'caldopex', '32-76'), + # (25, 2, 'caldopex', 'PLUS 32-91'), + # (32, 1, 'caldopex', '40-91'), + # (32, 2, 'caldopex', 'PLUS 40-111'), + # (40, 1, 'caldopex', '50-111'), + # (40, 2, 'caldopex', 'PLUS 50-126'), + # (50, 1, 'caldopex', '63-126'), + # (50, 2, 'caldopex', 'PLUS 63-142'), + # (65, 1, 'caldopex', '75-142'), + # (65, 2, 'caldopex', 'PLUS 75-162'), + # (80, 1, 'caldopex', '90-162'), + # (80, 2, 'caldopex', 'PLUS 90-182'), + # (100, 1, 'caldopex', '110-162'), + # (100, 2, 'caldopex', '110-182'), + # (100, 3, 'caldopex', 'PLUS 110-202'), + # (125, 1, 'caldopex', '125-182'), + # (125, 2, 'caldopex', 'PLUS 125-202'), + # (125, 3, 'caldopex', '140-202'), + # (150, 1, 'caldopex', '160-250'), + # (20, 1, 'caldopex', '25+25-91'), + # (20, 2, 'caldopex', 'PLUS 25+25-111'), + # (25, 1, 'caldopex', '32+32-111'), + # (25, 2, 'caldopex', 'PLUS 32+32-126'), + # (32, 1, 'caldopex', '40+40-126'), + # (32, 2, 'caldopex', 'PLUS 40+40-142'), + # (40, 1, 'caldopex', '50+50-162'), + # (40, 2, 'caldopex', 'PLUS 50+50-182'), + # (50, 1, 'caldopex', '63+63-182'), + # (50, 2, 'caldopex', 'PLUS 63+63-202'), + # (65, 1, 'caldopex', '75+75-202'), + (20, 1, 'isoplus', 'DRE-20-STD'), + (25, 1, 'isoplus', 'DRE-25-STD'), + (32, 1, 'isoplus', 'DRE-32-STD'), + (40, 1, 'isoplus', 'DRE-40-STD'), + (50, 1, 'isoplus', 'DRE-50-STD'), + (65, 1, 'isoplus', 'DRE-65-STD'), + (80, 1, 'isoplus', 'DRE-80-STD'), + (100, 1, 'isoplus', 'DRE-100-STD'), + (125, 1, 'isoplus', 'DRE-125-STD'), + (150, 1, 'isoplus', 'DRE-150-STD'), + (200, 1, 'isoplus', 'DRE-200-STD'), + (250, 1, 'isoplus', 'DRE-250-STD'), + (300, 1, 'isoplus', 'DRE-300-STD'), + (350, 1, 'isoplus', 'DRE-350-STD'), + (400, 1, 'isoplus', 'DRE-400-STD'), + (450, 1, 'isoplus', 'DRE-450-STD'), + (500, 1, 'isoplus', 'DRE-500-STD'), + (600, 1, 'isoplus', 'DRE-600-STD'), + (700, 1, 'isoplus', 'DRE-700-STD'), + (800, 1, 'isoplus', 'DRE-800-STD'), + (900, 1, 'isoplus', 'DRE-900-STD'), + (1000, 1, 'isoplus', 'DRE-1000-STD'), + (20, 2, 'isoplus', 'DRE-20-RE'), + (25, 2, 'isoplus', 'DRE-25-RE'), + (32, 2, 'isoplus', 'DRE-32-RE'), + (40, 2, 'isoplus', 'DRE-40-RE'), + (50, 2, 'isoplus', 'DRE-50-RE'), + (65, 2, 'isoplus', 'DRE-65-RE'), + (80, 2, 'isoplus', 'DRE-80-RE'), + (100, 2, 'isoplus', 'DRE-100-RE'), + (125, 2, 'isoplus', 'DRE-125-RE'), + (150, 2, 'isoplus', 'DRE-150-RE'), + (200, 2, 'isoplus', 'DRE-200-RE'), + (250, 2, 'isoplus', 'DRE-250-RE'), + (300, 2, 'isoplus', 'DRE-300-RE'), + (350, 2, 'isoplus', 'DRE-350-RE'), + (400, 2, 'isoplus', 'DRE-400-RE'), + (450, 2, 'isoplus', 'DRE-450-RE'), + (500, 2, 'isoplus', 'DRE-500-RE'), + (600, 2, 'isoplus', 'DRE-600-RE'), + (700, 2, 'isoplus', 'DRE-700-RE'), + (800, 2, 'isoplus', 'DRE-800-RE'), + (900, 2, 'isoplus', 'DRE-900-RE'), + (1000, 2, 'isoplus', 'DRE-1000-RE'), + (20, 3, 'isoplus', 'DRE-20-TWIRE'), + (25, 3, 'isoplus', 'DRE-25-TWIRE'), + (32, 3, 'isoplus', 'DRE-32-TWIRE'), + (40, 3, 'isoplus', 'DRE-40-TWIRE'), + (50, 3, 'isoplus', 'DRE-50-TWIRE'), + (65, 3, 'isoplus', 'DRE-65-TWIRE'), + (80, 3, 'isoplus', 'DRE-80-TWIRE'), + (100, 3, 'isoplus', 'DRE-100-TWIRE'), + (125, 3, 'isoplus', 'DRE-125-TWIRE'), + (150, 3, 'isoplus', 'DRE-150-TWIRE'), + (200, 3, 'isoplus', 'DRE-200-TWIRE'), + (250, 3, 'isoplus', 'DRE-250-TWIRE'), + (300, 3, 'isoplus', 'DRE-300-TWIRE'), + (350, 3, 'isoplus', 'DRE-350-TWIRE'), + (400, 3, 'isoplus', 'DRE-400-TWIRE'), + (450, 3, 'isoplus', 'DRE-450-TWIRE'), + (500, 3, 'isoplus', 'DRE-500-TWIRE'), + (600, 3, 'isoplus', 'DRE-600-TWIRE'), + (20, 1, 'isoplus', 'DRD-20-STD'), + (25, 1, 'isoplus', 'DRD-25-STD'), + (32, 1, 'isoplus', 'DRD-32-STD'), + (40, 1, 'isoplus', 'DRD-40-STD'), + (50, 1, 'isoplus', 'DRD-50-STD'), + (65, 1, 'isoplus', 'DRD-65-STD'), + (80, 1, 'isoplus', 'DRD-80-STD'), + (100, 1, 'isoplus', 'DRD-100-STD'), + (125, 1, 'isoplus', 'DRD-125-STD'), + (150, 1, 'isoplus', 'DRD-150-STD'), + (200, 1, 'isoplus', 'DRD-200-STD'), + (20, 2, 'isoplus', 'DRD-20-RE'), + (25, 2, 'isoplus', 'DRD-25-RE'), + (32, 2, 'isoplus', 'DRD-32-RE'), + (40, 2, 'isoplus', 'DRD-40-RE'), + (50, 2, 'isoplus', 'DRD-50-RE'), + (65, 2, 'isoplus', 'DRD-65-RE'), + (80, 2, 'isoplus', 'DRD-80-RE'), + (100, 2, 'isoplus', 'DRD-100-RE'), + (125, 2, 'isoplus', 'DRD-125-RE'), + (150, 2, 'isoplus', 'DRD-150-RE'), + (200, 2, 'isoplus', 'DRD-200-RE'), + (20, 3, 'isoplus', 'DRD-20-TWIRE'), + (25, 3, 'isoplus', 'DRD-25-TWIRE'), + (32, 3, 'isoplus', 'DRD-32-TWIRE'), + (40, 3, 'isoplus', 'DRD-40-TWIRE'), + (50, 3, 'isoplus', 'DRD-50-TWIRE'), + (65, 3, 'isoplus', 'DRD-65-TWIRE'), + (80, 3, 'isoplus', 'DRD-80-TWIRE'), + (100, 3, 'isoplus', 'DRD-100-TWIRE'), + (125, 3, 'isoplus', 'DRD-125-TWIRE'), + (150, 3, 'isoplus', 'DRD-150-TWIRE') + ] + +# specify the pipes +u_pipes = { + (20, 1, 'caldopex', '25-76'): 0, + (20, 2, 'caldopex', 'PLUS 25-91'): 0, + (25, 1, 'caldopex', '32-76'): 0, + (25, 2, 'caldopex', 'PLUS 32-91'): 0, + (32, 1, 'caldopex', '40-91'): 0, + (32, 2, 'caldopex', 'PLUS 40-111'): 0, + (40, 1, 'caldopex', '50-111'): 0, + (40, 2, 'caldopex', 'PLUS 50-126'): 0, + (50, 1, 'caldopex', '63-126'): 0, + (50, 2, 'caldopex', 'PLUS 63-142'): 0, + (65, 1, 'caldopex', '75-142'): 0, + (65, 2, 'caldopex', 'PLUS 75-162'): 0, + (80, 1, 'caldopex', '90-162'): 0, + (80, 2, 'caldopex', 'PLUS 90-182'): 0, + (100, 1, 'caldopex', '110-162'): 0, + (100, 2, 'caldopex', '110-182'): 0, + (100, 3, 'caldopex', 'PLUS 110-202'): 0, + (125, 1, 'caldopex', '125-182'): 0, + (125, 2, 'caldopex', 'PLUS 125-202'): 0, + (125, 3, 'caldopex', '140-202'): 0, + (150, 1, 'caldopex', '160-250'): 0, + (20, 1, 'caldopex', '25+25-91'): 0, + (20, 2, 'caldopex', 'PLUS 25+25-111'): 0, + (25, 1, 'caldopex', '32+32-111'): 0, + (25, 2, 'caldopex', 'PLUS 32+32-126'): 0, + (32, 1, 'caldopex', '40+40-126'): 0, + (32, 2, 'caldopex', 'PLUS 40+40-142'): 0, + (40, 1, 'caldopex', '50+50-162'): 0, + (40, 2, 'caldopex', 'PLUS 50+50-182'): 0, + (50, 1, 'caldopex', '63+63-182'): 0, + (50, 2, 'caldopex', 'PLUS 63+63-202'): 0, + (65, 1, 'caldopex', '75+75-202'): 0, + # single pipe, standard insulation + (20, 1, 'isoplus', 'DRE-20-STD'): 0.1295, + (25, 1, 'isoplus', 'DRE-25-STD'): 0.1564, + (32, 1, 'isoplus', 'DRE-32-STD'): 0.1589, + (40, 1, 'isoplus', 'DRE-40-STD'): 0.1810, + (50, 1, 'isoplus', 'DRE-50-STD'): 0.2013, + (65, 1, 'isoplus', 'DRE-65-STD'): 0.2325, + (80, 1, 'isoplus', 'DRE-80-STD'): 0.2418, + (100, 1, 'isoplus', 'DRE-100-STD'): 0.2543, + (125, 1, 'isoplus', 'DRE-125-STD'): 0.2880, + (150, 1, 'isoplus', 'DRE-150-STD'): 0.3369, + (200, 1, 'isoplus', 'DRE-200-STD'): 0.3686, + (250, 1, 'isoplus', 'DRE-250-STD'): 0.3637, + (300, 1, 'isoplus', 'DRE-300-STD'): 0.4126, + (350, 1, 'isoplus', 'DRE-350-STD'): 0.4009, + (400, 1, 'isoplus', 'DRE-400-STD'): 0.4222, + (450, 1, 'isoplus', 'DRE-450-STD'): 0.4242, + (500, 1, 'isoplus', 'DRE-500-STD'): 0.4149, + (600, 1, 'isoplus', 'DRE-600-STD'): 0.5002, + (700, 1, 'isoplus', 'DRE-700-STD'): 0.5665, + (800, 1, 'isoplus', 'DRE-800-STD'): 0.6372, + (900, 1, 'isoplus', 'DRE-900-STD'): 0.7027, + (1000, 1, 'isoplus', 'DRE-1000-STD'): 0.7742, + # single pipe, reinforced + (20, 2, 'isoplus', 'DRE-20-RE'): 0.1114, + (25, 2, 'isoplus', 'DRE-25-RE'): 0.1308, + (32, 2, 'isoplus', 'DRE-32-RE'): 0.1420, + (40, 2, 'isoplus', 'DRE-40-RE'): 0.1593, + (50, 2, 'isoplus', 'DRE-50-RE'): 0.1763, + (65, 2, 'isoplus', 'DRE-65-RE'): 0.1980, + (80, 2, 'isoplus', 'DRE-80-RE'): 0.2076, + (100, 2, 'isoplus', 'DRE-100-RE'): 0.2148, + (125, 2, 'isoplus', 'DRE-125-RE'): 0.2459, + (150, 2, 'isoplus', 'DRE-150-RE'): 0.2794, + (200, 2, 'isoplus', 'DRE-200-RE'): 0.2953, + (250, 2, 'isoplus', 'DRE-250-RE'): 0.2914, + (300, 2, 'isoplus', 'DRE-300-RE'): 0.3284, + (350, 2, 'isoplus', 'DRE-350-RE'): 0.3169, + (400, 2, 'isoplus', 'DRE-400-RE'): 0.3277, + (450, 2, 'isoplus', 'DRE-450-RE'): 0.3299, + (500, 2, 'isoplus', 'DRE-500-RE'): 0.3249, + (600, 2, 'isoplus', 'DRE-600-RE'): 0.3748, + (700, 2, 'isoplus', 'DRE-700-RE'): 0.4238, + (800, 2, 'isoplus', 'DRE-800-RE'): 0.4732, + (900, 2, 'isoplus', 'DRE-900-RE'): 0.5221, + (1000, 2, 'isoplus', 'DRE-1000-RE'): 0.5733, + # single pipe, twice reinforced + (20, 3, 'isoplus', 'DRE-20-TWIRE'): 0.10280, + (25, 3, 'isoplus', 'DRE-25-TWIRE'): 0.1191, + (32, 3, 'isoplus', 'DRE-32-TWIRE'): 0.1290, + (40, 3, 'isoplus', 'DRE-40-TWIRE'): 0.1432, + (50, 3, 'isoplus', 'DRE-50-TWIRE'): 0.1557, + (65, 3, 'isoplus', 'DRE-65-TWIRE'): 0.1744, + (80, 3, 'isoplus', 'DRE-80-TWIRE'): 0.1847, + (100, 3, 'isoplus', 'DRE-100-TWIRE'): 0.1905, + (125, 3, 'isoplus', 'DRE-125-TWIRE'): 0.2138, + (150, 3, 'isoplus', 'DRE-150-TWIRE'): 0.2343, + (200, 3, 'isoplus', 'DRE-200-TWIRE'): 0.2472, + (250, 3, 'isoplus', 'DRE-250-TWIRE'): 0.2468, + (300, 3, 'isoplus', 'DRE-300-TWIRE'): 0.2698, + (350, 3, 'isoplus', 'DRE-350-TWIRE'): 0.2605, + (400, 3, 'isoplus', 'DRE-400-TWIRE'): 0.2684, + (450, 3, 'isoplus', 'DRE-450-TWIRE'): 0.2703, + (500, 3, 'isoplus', 'DRE-500-TWIRE'): 0.2669, + (600, 3, 'isoplus', 'DRE-600-TWIRE'): 0.3065, + # isoplus twin disconti + (20, 1, 'isoplus', 'DRD-20-STD'): 0.1830, + (25, 1, 'isoplus', 'DRD-25-STD'): 0.1981, + (32, 1, 'isoplus', 'DRD-32-STD'): 0.2154, + (40, 1, 'isoplus', 'DRD-40-STD'): 0.2573, + (50, 1, 'isoplus', 'DRD-50-STD'): 0.2495, + (65, 1, 'isoplus', 'DRD-65-STD'): 0.2923, + (80, 1, 'isoplus', 'DRD-80-STD'): 0.3343, + (100, 1, 'isoplus', 'DRD-100-STD'): 0.3348, + (125, 1, 'isoplus', 'DRD-125-STD'): 0.3100, + (150, 1, 'isoplus', 'DRD-150-STD'): 0.3763, + (200, 1, 'isoplus', 'DRD-200-STD'): 0.4115, + (20, 2, 'isoplus', 'DRD-20-RE'): 0.1608, + (25, 2, 'isoplus', 'DRD-25-RE'): 0.1700, + (32, 2, 'isoplus', 'DRD-32-RE'): 0.1856, + (40, 2, 'isoplus', 'DRD-40-RE'): 0.2144, + (50, 2, 'isoplus', 'DRD-50-RE'): 0.2076, + (65, 2, 'isoplus', 'DRD-65-RE'): 0.2430, + (80, 2, 'isoplus', 'DRD-80-RE'): 0.2653, + (100, 2, 'isoplus', 'DRD-100-RE'): 0.2635, + (125, 2, 'isoplus', 'DRD-125-RE'): 0.2488, + (150, 2, 'isoplus', 'DRD-150-RE'): 0.2914, + (200, 2, 'isoplus', 'DRD-200-RE'): 0.3037, + (20, 3, 'isoplus', 'DRD-20-TWIRE'): 0.1423, + (25, 3, 'isoplus', 'DRD-25-TWIRE'): 0.1516, + (32, 3, 'isoplus', 'DRD-32-TWIRE'): 0.1661, + (40, 3, 'isoplus', 'DRD-40-TWIRE'): 0.1882, + (50, 3, 'isoplus', 'DRD-50-TWIRE'): 0.1833, + (65, 3, 'isoplus', 'DRD-65-TWIRE'): 0.2074, + (80, 3, 'isoplus', 'DRD-80-TWIRE'): 0.2199, + (100, 3, 'isoplus', 'DRD-100-TWIRE'): 0.2197, + (125, 3, 'isoplus', 'DRD-125-TWIRE'): 0.2126, + (150, 3, 'isoplus', 'DRD-150-TWIRE'): 0.2379 + } + +# ***************************************************************************** +# ***************************************************************************** + +# pipe data +pipedb = StandardisedPipeDatabase(source=pipedata_files) + +# fluid data +fluiddata_file = 'fluids/incropera2006_saturated_water.csv' +fluiddb = fic.FluidDatabase(fluid='water', phase='l', source=fluiddata_file) + +# ***************************************************************************** +# ***************************************************************************** + +# pipe tuples + +list_single_pipe_tuples = [ + pipe_tuple + for pipe_tuple in list_pipe_tuples + if not pipedb.is_twin[pipe_tuple] + ] + +list_twin_pipe_tuples = [ + pipe_tuple + for pipe_tuple in list_pipe_tuples + if pipedb.is_twin[pipe_tuple] + ] + +# pipe objects + +list_single_pipes = [ + StandardisedPipe( + pipe_tuple=pipe_tuple, + e_eff=pipe_e_eff, # override pipe absolute roughness + length=pipe_length, # override the pipe length + db=pipedb) + for pipe_tuple in list_single_pipe_tuples + ] + +list_twin_pipes = [ + StandardisedTwinPipe( + pipe_tuple=pipe_tuple, + e_eff=pipe_e_eff, # override pipe absolute roughness + length=pipe_length, # override the pipe length + db=pipedb) + for pipe_tuple in list_twin_pipe_tuples + ] + +# ***************************************************************************** +# ***************************************************************************** + +# 3) calculate the pipe efficiency as a function of the pipe diameter + +# ***************************************************************************** + +# create a list of pipe objects +dict_single_trench = {} +dict_single_capacity = {} +dict_single_heat_transfer_rate = {} +dict_twin_trench = {} +dict_twin_capacity = {} +dict_twin_heat_transfer_rate = {} + +# for each specific pressure loss level +for max_specific_pressure_loss in list_max_specific_pressure_loss: + + if len(list_single_pipe_tuples) != 0: + # single pipe trench + single_trench = SupplyReturnPipeTrench( + pipe_center_depth=[pipe_depth+pipe.d_cas/2 for pipe in list_single_pipes], + pipe_center_distance=[pipe_distance+pipe.d_cas for pipe in list_single_pipes], + fluid_db=fluiddb, + phase=fluiddb.fluid_LIQUID, + pressure=[1e5 for i in range(len(list_single_pipes))], + supply_temperature=[dh_flow_temperature for i in range(len(list_single_pipes))], + return_temperature=[dh_return_temperature for i in range(len(list_single_pipes))], + max_specific_pressure_loss=[max_specific_pressure_loss for i in range(len(list_single_pipes))], + supply_pipe=list_single_pipes + ) + assert single_trench.vector_mode + + # single pipe trench losses + qs, qr = single_trench.specific_heat_transfer_surroundings( + ground_thermal_conductivity=soil_k, + ground_air_heat_transfer_coefficient=ground_air_heat_transfer_coefficient, + temperature_surroundings=ground_temperature, + method=single_pipe_trench_config[0], + model=single_pipe_trench_config[1] + ) + single_trench_htr = [_qs+_qr for _qs, _qr in zip(qs, qr)] + + # add lists to the dicts + dict_single_trench.update( + {max_specific_pressure_loss: single_trench} + ) + dict_single_heat_transfer_rate.update( + {max_specific_pressure_loss: single_trench_htr} + ) + dict_single_capacity.update( + {max_specific_pressure_loss: single_trench.rated_heat_capacity()} + ) + + # ************************************************************************* + + if len(list_twin_pipes) != 0: + # twin pipe trench + twin_trench = TwinPipeTrench( + pipe_center_depth=[pipe_depth+pipe.d_cas/2 for pipe in list_twin_pipes], + fluid_db=fluiddb, + phase=fluiddb.fluid_LIQUID, + pressure=[1e5 for i in range(len(list_twin_pipes))], + supply_temperature=[dh_flow_temperature for i in range(len(list_twin_pipes))], + return_temperature=[dh_return_temperature for i in range(len(list_twin_pipes))], + max_specific_pressure_loss=[max_specific_pressure_loss for i in range(len(list_twin_pipes))], + supply_pipe=list_twin_pipes + ) + assert twin_trench.vector_mode + + # twin pipe trench losses + qs, qr = twin_trench.specific_heat_transfer_surroundings( + ground_thermal_conductivity=soil_k, + ground_air_heat_transfer_coefficient=ground_air_heat_transfer_coefficient, + temperature_surroundings=ground_temperature, + method=twin_pipe_trench_config[0], + model=twin_pipe_trench_config[1] + ) + twin_trench_htr = [_qs+_qr for _qs, _qr in zip(qs, qr)] + + # add lists to the dicts + dict_twin_trench.update( + {max_specific_pressure_loss: twin_trench} + ) + dict_twin_heat_transfer_rate.update( + {max_specific_pressure_loss: twin_trench_htr} + ) + dict_twin_capacity.update( + {max_specific_pressure_loss: twin_trench.rated_heat_capacity()} + ) + + # ************************************************************************* + +# ***************************************************************************** +# ***************************************************************************** + +# plot the pipe heat losses as a function of pipe specifiction + +fig, ax = plt.subplots() + +fig.set_size_inches(15,10) + +model_string_ids = ['-STD','-RE','-TWIRE'] + +single_pipe_tuples_per_tech = { + i: [pipe_tuple for pipe_tuple in list_single_pipe_tuples if model_string_ids[i] in pipe_tuple[3]] + for i, _str in enumerate(model_string_ids) + } + +twin_pipe_tuples_per_tech = { + i: [pipe_tuple for pipe_tuple in list_twin_pipe_tuples if model_string_ids[i] in pipe_tuple[3]] + for i, _str in enumerate(model_string_ids) + } + +for max_specific_pressure_loss in list_max_specific_pressure_loss: + for tech_index, _single_pipe_tuples in single_pipe_tuples_per_tech.items(): + + _indices = [list_single_pipe_tuples.index(pipe_tuple) for pipe_tuple in _single_pipe_tuples] + # single pipe + ax.plot( + [1000*list_single_pipes[index].d_int for index in _indices], + [2*u_pipes[pipe_tuple]*(temperature_fluid_bulk-ground_temperature) + for pipe_tuple in _single_pipe_tuples], + 'ro-', + markersize=10, + label='topupheat, tech '+str(model_string_ids[tech_index]) + ) + + for tech_index, _twin_pipe_tuples in twin_pipe_tuples_per_tech.items(): + + _indices = [list_twin_pipe_tuples.index(pipe_tuple) for pipe_tuple in _twin_pipe_tuples] + # twin pipe + ax.plot( + [1000*list_twin_pipes[index].d_int for index in _indices], + [u_pipes[pipe_tuple]*(temperature_fluid_bulk-ground_temperature) + for pipe_tuple in _twin_pipe_tuples], + 'bo-', + markersize=10, + label='topupheat, tech '+str(model_string_ids[tech_index]) + ) + + + # # single pipe + # ax.plot([1000*pipe.d_int for pipe in list_single_pipes], + # [u_pipes[pipe.pipe_tuple]*(temperature_fluid_bulk-ground_temperature) + # for pipe in list_single_pipes], + # 'ro', + # markersize=10, + # label='Single @ '+str(max_specific_pressure_loss)+' Pa/m') + + # # twin pipe + # ax.plot([1000*pipe.d_int for pipe in list_twin_pipes], + # [u_pipes[pipe.pipe_tuple]*(temperature_fluid_bulk-ground_temperature) + # for pipe in list_twin_pipes], + # 'go', + # markersize=10, + # label='Twin @ '+str(max_specific_pressure_loss)+' Pa/m') + + # ax.plot([1000*single_trench.supply_pipe.d_int + # for single_trench in dict_single_trench[max_specific_pressure_loss]], + # [qloss_line #sum(qloss_line) + # for qloss_line in dict_heat_losses[max_specific_pressure_loss]], + # 'ro-', + # markersize=10, + # label='Results @ '+str(max_specific_pressure_loss)+' Pa/m') + +# ax.plot([d_int*1000 for d_int in table_d_int], +# table_losses, +# 'bs-', +# markersize=10, +# label='Röder et al. (2021)') + +ax.plot([1000*pipe.d_int for pipe in list_single_pipes], + [dict_single_heat_transfer_rate[max_specific_pressure_loss][i] + for i, pipe_tuple in enumerate(list_single_pipe_tuples)], + 'gx', + markersize=10, + label='isoplus, 2x single') + +ax.plot([1000*pipe.d_int for pipe in list_twin_pipes], + [dict_twin_heat_transfer_rate[max_specific_pressure_loss][i] + for i, pipe_tuple in enumerate(list_twin_pipe_tuples)], + 'k^', + markersize=10, + label='isoplus, 1x twin') + +ax.set(xlabel='Nominal diameter (DN)', + ylabel='Specific heat losses [W/m]', + title='Specific heat losses as a function of pipe diameter') + +ax.grid() + +ax.legend() + +# fig.savefig("test.png") +plt.show() + +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** + +# plot the pipe heat losses as a function of pipe heat capacity + +# # Röder2021: http://doi.org/10.5278/ijsepm.6248 + +# table_phc = [0.07e6,0.08e6,0.1e6,0.2e6,0.35e6,0.6e6,0.800e6,1.495e6,2.05e6,3.95e6] +# table_losses = [7,8,9,8.5,12,16,18,22,31,33] # W/m +# list_losses = [heat/pipe_length for heat in list_heat_transfer_rate] + +# fig, ax = plt.subplots() + +# ax.plot([-pc for pc in list_pc], +# list_losses) + +# ax.plot(table_phc, +# table_losses) + +# ax.set(xlabel='pipe heat capacity (kW)', +# ylabel='Specific heat losses [-]', +# title='Specific heat losses as a function of pipe heat capacity') + +# ax.grid() + +# # fig.savefig("test.png") +# plt.show() + +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** + +# # plot the pipe heat capacity as a function of the pipe diameter + +# # Röder2021: http://doi.org/10.5278/ijsepm.6248 + +# fig, ax = plt.subplots() + +# fig.set_size_inches(15,10) + +# for max_specific_pressure_loss in list_max_specific_pressure_loss: + +# ax.plot([1000*pipe.d_int +# for pipe in dict_single_trench[max_specific_pressure_loss].supply_pipe], +# [htr/1e3 +# for htr in dict_single_capacity[max_specific_pressure_loss]], +# 'ro-', +# label='Results @ '+str(max_specific_pressure_loss)+' Pa/m') + +# # ***************************************************************************** + +# ax.plot(table_dn, +# #[d_int*1000 for d_int in table_d_int], +# table_power, +# 'bx-', +# label='Röder et al. (2021)') + +# ax.set(xlabel='Nominal diameter [mm]', +# ylabel='Heat transfer rate [kW]', +# title='Pipe design capacity comparison: own vs Röder et al. (2021)') + +# ax.grid() + +# ax.legend() + +# # fig.savefig("test.png") +# plt.show() + +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** +# ***************************************************************************** \ No newline at end of file