Skip to content
Snippets Groups Projects
Select Git revision
  • f88030af4eb954b094578b35d8704376de73ec76
  • master default protected
2 results

load_data.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    script_pipe_losses.py 26.17 KiB
    # *****************************************************************************
    # *****************************************************************************
    
    # 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()
    
    # *****************************************************************************
    # *****************************************************************************
    # *****************************************************************************
    # *****************************************************************************
    # *****************************************************************************
    # *****************************************************************************