diff --git a/examples/script_design_capacity.py b/examples/script_design_capacity.py
new file mode 100644
index 0000000000000000000000000000000000000000..435c9473bd59fa90415c11f2240e62ae3b0a717a
--- /dev/null
+++ b/examples/script_design_capacity.py
@@ -0,0 +1,576 @@
+#******************************************************************************
+#******************************************************************************
+
+# TIP: this script requires the data found in the hyhetra-pipedata and hyhetra-
+# -fluiddata repositories
+
+pipedata_files = ['pipes/isoplus_singlepipes_s1.csv']
+        
+fluiddata_file = 'fluids/incropera2006_saturated_water.csv'
+
+# other files
+
+file_best2018 = 'papers/Best2018_design_flow_speeds.csv'
+
+file_sven2013 = 'papers/Sven2013_design_flow_speeds.csv'
+
+file_nussbaumer2016 = 'papers/Nussbaumer2016_design_flow_speeds.csv'
+
+file_euroheat2021 = 'papers/EuroHeat2021_design_flow_speeds.csv'
+
+# import libraries
+import numpy as np
+import matplotlib.pyplot as plt
+# topupheat
+import topupheat.pipes.fic as fic
+from topupheat.pipes.single import StandardisedPipe, StandardisedPipeDatabase
+import topupheat.pipes.utils as utils
+from topupheat.common import formulas as core
+
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+
+# specifications
+
+# maximum specific pressure drop
+
+list_max_specific_pressure_loss = [100, 200, 200, 200, 450] # Pa/m
+
+list_pipe_roughness = [0.1/1000, 0.1/1000, 0.05/1000, 0.01/1000, 0.1/1000]
+
+# district heating details
+
+dh_flow_temperature = 273.15+80 # K
+
+dh_return_temperature = 273.15+50 # 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
+
+#******************************************************************************
+
+# specify the pipes that should be considered using (DN,S) tuples
+
+list_pipe_tuples = [(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-ST'),
+                    (125, 1, 'isoplus', 'DRE-125-ST'),
+                    (150, 1, 'isoplus', 'DRE-150-ST'),
+                    (200, 1, 'isoplus', 'DRE-200-ST'),
+                    (250, 1, 'isoplus', 'DRE-250-ST'),
+                    (300, 1, 'isoplus', 'DRE-300-ST'),
+                    (350, 1, 'isoplus', 'DRE-350-ST'),
+                    (400, 1, 'isoplus', 'DRE-400-ST'),
+                    (450, 1, 'isoplus', 'DRE-450-ST'),
+                    (500, 1, 'isoplus', 'DRE-500-ST'),
+                    (600, 1, 'isoplus', 'DRE-600-ST'),
+                    (700, 1, 'isoplus', 'DRE-700-ST'),
+                    (800, 1, 'isoplus', 'DRE-800-ST'),
+                    (900, 1, 'isoplus', 'DRE-900-ST'),
+                    (1000, 1, 'isoplus', 'DRE-1000-S')]
+
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+
+# pipe data
+
+pipedb = StandardisedPipeDatabase(source=pipedata_files)
+
+# water data
+
+waterdb = fic.FluidDatabase(fluid='water', phase='l', source=fluiddata_file)
+
+#******************************************************************************
+#******************************************************************************
+
+# create the objects for the fluids in the flow and return pipes
+
+dh_flow = fic.Fluid(
+    phase='l',
+    temperature=dh_flow_temperature,
+    pressure=1e5,
+    db=waterdb)
+
+dh_return = fic.Fluid(
+    phase='l',
+    temperature=dh_return_temperature,
+    pressure=1e5,
+    db=waterdb)
+
+fluid_bulk = fic.Fluid(
+    phase='l',
+    temperature=temperature_fluid_bulk,
+    pressure=1e5,
+    db=waterdb)
+            
+#******************************************************************************
+#******************************************************************************
+
+# define the pipes under consideration for task 2
+
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+
+# 4) compute the maximum heat flow rate for a given maximum specific pressure drop
+# as a function of pipe diameters
+                   
+#******************************************************************************
+
+# dictionaries
+
+dict_heat_transfer_rate = {}
+
+dict_friction_factor = {}
+
+dict_fluid_speed = {}
+
+dict_reynolds_number = {}
+
+dict_specific_pressure_loss = {}
+
+# for each specific pressure loss level
+
+for j, max_specific_pressure_loss in enumerate(list_max_specific_pressure_loss):
+
+    # declare the final and intermediate variables
+    
+    list_heat_transfer_rate = []
+    
+    list_friction_factor = []
+    
+    list_fluid_speed = []
+    
+    list_reynolds_number = []
+    
+    list_specific_pressure_loss = []
+    
+    temp_fluid_speed, temp_reynolds_number, temp_friction_factor = 0, 0, 0
+    
+    # pipe object list
+    
+    list_dh_pipes = [
+        StandardisedPipe(
+            pipe_tuple=pipe_tuple,
+            e_eff=list_pipe_roughness[j],
+            db=pipedb)
+        for pipe_tuple in list_pipe_tuples]
+        
+    # for each pipe under consideration
+    
+    for i, pipe in enumerate(list_dh_pipes):
+                                            
+        #**********************************************************************
+        
+        # get an initial solution
+        # >> should be valid and as close to the actual solution as possible
+        # >> one option is to use explicit methods
+        
+        if i == 0:
+            
+            x0_fluid_speed = None
+            x0_reynolds_number = None
+            x0_friction_factor = None
+            
+        else:
+            
+            # use previous solution
+            
+            (x0_fluid_speed,
+             x0_reynolds_number,
+             x0_friction_factor) = (list_fluid_speed[i-1],
+                                    list_reynolds_number[i-1],
+                                    list_friction_factor[i-1])
+        
+        # flow regime
+        
+        # compute the flow speed that leads to the specified pressure loss
+        
+        temp_fluid_speed, temp_reynolds_number, temp_friction_factor = (
+            utils.find_specific_pressure_loss_matching_flow(
+                pipe, 
+                fluid_bulk,
+                max_specific_pressure_loss,
+                dff_model=fic.DFF_COLEBROOK_WHITE,
+                #dff_model=fic.DFF_HAALAND,
+                #dff_model=fic.DFF_NIKURADSE,
+                #dff_model=fic.DFF_PETHUKOV,
+                #dff_model=fic.DFF_BLASIUS,
+                #dff_model=fic.DFF_PRANDTL_NIKURADSE_KARMAN,
+                x0_friction_factor=x0_friction_factor,
+                x0_reynolds_number=x0_reynolds_number,
+                x0_fluid_speed=x0_fluid_speed)
+            )  
+        
+        temp_specific_pressure_loss = fic.SpecificPressureLossInPipe(
+            fluid_bulk.mass_density, 
+            pipe.d_int, 
+            temp_fluid_speed, 
+            temp_friction_factor)
+        
+        # store the results
+        
+        list_fluid_speed.append(temp_fluid_speed)
+        
+        list_reynolds_number.append(temp_reynolds_number)
+        
+        list_friction_factor.append(temp_friction_factor)
+        
+        list_specific_pressure_loss.append(temp_specific_pressure_loss)
+        
+        # compute the heat flow rate
+        
+        temp_heat_flow_rate = fic.HeatTransferRateInPipe(
+            temp_fluid_speed, 
+            dh_flow, 
+            dh_return, 
+            pipe,
+            fluid_bulk=fluid_bulk
+            )
+        
+        # store the result
+        
+        list_heat_transfer_rate.append(temp_heat_flow_rate)
+        
+    #**************************************************************************
+        
+    # add lists to the dicts
+    
+    dict_specific_pressure_loss.update(
+        {(max_specific_pressure_loss,list_pipe_roughness[j]):
+         list_specific_pressure_loss})
+        
+    dict_fluid_speed.update(
+        {(max_specific_pressure_loss,list_pipe_roughness[j]):
+         list_fluid_speed})
+    
+    dict_reynolds_number.update(
+        {(max_specific_pressure_loss,list_pipe_roughness[j]):
+         list_reynolds_number})
+    
+    dict_friction_factor.update(
+        {(max_specific_pressure_loss,list_pipe_roughness[j]):
+         list_friction_factor})
+    
+    dict_heat_transfer_rate.update(
+        {(max_specific_pressure_loss,list_pipe_roughness[j]):
+         list_heat_transfer_rate})
+    
+    #**************************************************************************
+    
+    # print('******************************************************************')
+    # print('******************************************************************')
+    # print('******************************************************************')
+    # print('******************************************************************')
+        
+#******************************************************************************
+
+isoplus_diameters = [20,
+                     25,
+                     32,
+                     40,
+                     50,
+                     65,
+                     80,
+                     100,
+                     125,
+                     150,
+                     200,
+                     250,
+                     300,
+                     350,
+                     400,
+                     450,
+                     500,
+                     600,
+                     700,
+                     800,
+                     900,
+                     1000]
+
+isoplus_mass_flow_rate_min_t_hour = [0.4,
+                                     0.8,
+                                     1.7,
+                                     2.5,
+                                     4.7,
+                                     9.3,
+                                     14.5,
+                                     28.5,
+                                     50.0,
+                                     82.0,
+                                     167.0,
+                                     300,
+                                     472,
+                                     610,
+                                     862,
+                                     1180,
+                                     1570,
+                                     2520,
+                                     3770,
+                                     5390,
+                                     7400,
+                                     9200]
+
+isoplus_mass_flow_rate_max_t_hour = [0.5,
+                                     1.0,
+                                     2.0,
+                                     3.0,
+                                     5.5,
+                                     11.0,
+                                     16.5,
+                                     33.0,
+                                     58.0,
+                                     95.0,
+                                     193.0,
+                                     348,
+                                     547,
+                                     705,
+                                     1000,
+                                     1370,
+                                     1820,
+                                     2920,
+                                     4370,
+                                     6240,
+                                     9500,
+                                     np.nan]
+
+isoplus_fluid_speed_min = [
+    core.MeanFluidSpeedViaVolumetricFlowRate(
+        core.VolumetricFlowRateFromMassFlowRate(
+            m*0.27777778, #t/h to kg/s
+            fluid_bulk.mass_density
+            ), 
+        fic.Pipe.CrossSectionalArea(fic.Pipe, isoplus_diameters[i]/1e3)
+        )
+    for i, m in enumerate(isoplus_mass_flow_rate_min_t_hour)]
+
+isoplus_fluid_speed_max = [
+    core.MeanFluidSpeedViaVolumetricFlowRate(
+        core.VolumetricFlowRateFromMassFlowRate(
+            m*0.27777778, #t/h to kg/s
+            fluid_bulk.mass_density
+            ), 
+        fic.Pipe.CrossSectionalArea(fic.Pipe, isoplus_diameters[i]/1e3)
+        )
+    for i, m in enumerate(isoplus_mass_flow_rate_max_t_hour)]
+
+# get data from Best et al. (2018)
+
+data_best2018 = np.genfromtxt(file_best2018,
+                              #dtype=(float,float,float,float),
+                              names=True,
+                              # skip_header=1,
+                              # skip_footer=0,
+                              delimiter=',')
+
+data_sven2013 = np.genfromtxt(file_sven2013,
+                              #dtype=(float,float,float,float),
+                              names=True,
+                              # skip_header=1,
+                              # skip_footer=0,
+                              delimiter=',')
+
+data_nussbaumer2016 = np.genfromtxt(
+    file_nussbaumer2016,
+    #dtype=(float,float,float,float),
+    names=True,
+    # skip_header=1,
+    # skip_footer=0,
+    delimiter=',')
+
+data_euroheat2021 = np.genfromtxt(
+    file_euroheat2021,
+    #dtype=(float,float,float,float),
+    names=True,
+    # skip_header=1,
+    # skip_footer=0,
+    delimiter=',')
+
+# list_pipe_diameters = [t[0] for t in list_pipe_tuples]
+
+list_pipe_diameters = [pipe.d_int*1000 for pipe in list_dh_pipes]
+
+# plot the max heat flow rate as function of pipe diameter (1st pos. in tuple)
+
+fig, ax = plt.subplots()
+
+for i, max_specific_pressure_loss in enumerate(list_max_specific_pressure_loss):
+
+    ax.plot(list_pipe_diameters,
+            [-y/1e6 for y in dict_heat_transfer_rate[
+                (max_specific_pressure_loss,list_pipe_roughness[i])]],
+            label='MSP='+str(max_specific_pressure_loss)+' Pa/m')
+
+ax.set(xlabel='Pipe internal diameter [mm]', 
+       ylabel='Heat Transfer Rate [MW]',
+       title='Maximum heat capacity')
+
+ax.legend()
+
+ax.grid()
+
+# fig.savefig("test.png")
+plt.show()
+    
+#******************************************************************************    
+
+# plot the max fluid speed as a function of pipe diameter (1st pos. in tuple)
+
+fig, ax = plt.subplots()
+
+fig.set_size_inches(12,8) # (15,10) (12,8) # (3,2) (3*2,2*2) (3*3,2*3)
+
+list_linestyle_our = ['rx-','bx-','gx-','cx-','yx-']
+
+list_linestyle_euroheat2021 = ['rs','bs','gs','cs','ys']
+
+list_linestyle_best2018 = ['r>--','b>--','g>--']
+
+list_linestyle_nussbaumer2016 = ['r<-.','b<-.','g<-.']
+
+published_results_labels_euroheat2021 = ['100_Pa_m_01mm',
+                                         '200_Pa_m_01mm',
+                                         '200_Pa_m_005mm',
+                                         '200_Pa_m_001mm',
+                                         '450_Pa_m_01mm']
+
+published_results_labels_best2018 = ['100_Pa_m','200_Pa_m','300_Pa_m']
+
+published_results_labels_nussbaumer2016 = ['100_Pa_m','200_Pa_m','300_Pa_m']
+
+legend_euroheat2021 = ['100 Pa/m, e=0.1mm',
+                       '200 Pa/m, e=0.1mm',
+                       '200 Pa/m, e=0.05mm',
+                       '200 Pa/m, e=0.01mm',
+                       '450 Pa/m, e=0.1mm']
+
+legend_best2018 = ['100 Pa/m, e=0.01mm',
+                   '200 Pa/m, e=0.01mm',
+                   '300 Pa/m, e=0.01mm']
+
+legend_nussbaumer2016 = ['100 Pa/m, e=0.01mm',
+                         '200 Pa/m, e=0.01mm',
+                         '300 Pa/m, e=0.01mm']
+
+# x,100_Pa_m_01mm,200_Pa_m_01mm,200_Pa_m_005mm,200_Pa_m_001mm,450_Pa_m_01mm
+
+for i, max_specific_pressure_loss in enumerate(list_max_specific_pressure_loss):
+
+    ax.plot(list_pipe_diameters,
+            [fluid_speed for fluid_speed in dict_fluid_speed[
+                (max_specific_pressure_loss,list_pipe_roughness[i])]],
+            #marker='s', linestyle='-',
+            list_linestyle_our[i],
+            label='topupheat, '+str(max_specific_pressure_loss)+' Pa/m, e='+str(list_pipe_roughness[i]*1e3)+' mm')
+
+for i, label in enumerate(published_results_labels_euroheat2021):
+            
+    ax.plot(data_euroheat2021['x']*1e3,
+            data_euroheat2021[label],
+            #marker='x', linestyle='-.',
+            list_linestyle_euroheat2021[i],
+            label='EuroHeat&Power (2021), '+str(legend_euroheat2021[i]))
+
+# for i, label in enumerate(published_results_labels_best2018):
+            
+#     ax.plot(data_best2018['x']*1e3,
+#             data_best2018[label],
+#             #marker='x', linestyle='-.',
+#             list_linestyle_best2018[i],
+#             label='Best et al. (2018), '+str(legend_best2018[i]))
+
+# for i, label in enumerate(published_results_labels_nussbaumer2016):
+            
+#     ax.plot(data_nussbaumer2016['x']*1e3,
+#             data_nussbaumer2016[label],
+#             #marker='x', linestyle='-.',
+#             list_linestyle_nussbaumer2016[i],
+#             label='Nussbaumer et al. (2016), '+str(legend_nussbaumer2016[i]))
+
+# ax.plot(data_sven2013['x']*1e3,
+#         data_sven2013['100_Pa_m'],
+#         #marker='x', linestyle='-.',
+#         'kd-.',
+#         label='Svend and Sven (2013), 100 Pa/m')
+
+#******************************************************************************
+ax.set(xlim=(0, 1000),ylim=(0, 9))
+ax.set(xlabel='Pipe internal diameter [mm]', 
+       ylabel='Fluid speed [m/s]',
+       title='Maximum mean fluid speed for a given specific pressure loss')
+
+ax.legend()
+
+ax.grid()
+
+# fig.savefig("test.png")
+plt.show()
+    
+#******************************************************************************    
+
+# plot the specific pressure loss as a function of pipe diameter
+
+fig, ax = plt.subplots()
+
+for i, max_specific_pressure_loss in enumerate(list_max_specific_pressure_loss):
+
+    ax.plot(list_pipe_diameters,
+            [spl for spl in dict_specific_pressure_loss[
+                (max_specific_pressure_loss,list_pipe_roughness[i])]],
+            label='MSP='+str(max_specific_pressure_loss)+' Pa/m')
+
+    # ax.plot(data_best2018['x']*1e3,
+    #         data_best2018[published_results_labels[i]],
+    #         #marker='o', linestyle='--',
+    #         list_linestyle_best2018[i],
+    #         label='Best et al. (2018), '+str(max_specific_pressure_loss)+' Pa/m')
+    
+    # ax.plot(data_nussbaumer2016['x']*1e3,
+    #         data_nussbaumer2016[published_results_labels[i]],
+    #         #marker='x', linestyle='-.',
+    #         list_linestyle_nussbaumer2016[i],
+    #         label='Nussbaumer et al. (2016), '+str(max_specific_pressure_loss)+' Pa/m')
+
+    
+ax.set(xlabel='Pipe internal diameter [mm]', 
+       ylabel='Specific pressure loss [Pa/m]',
+       title='...')
+
+ax.legend()
+
+ax.grid()
+
+# fig.savefig("test.png")
+plt.show()
+
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
+#******************************************************************************
\ No newline at end of file
diff --git a/examples/script_moody_diagram.py b/examples/script_moody_diagram.py
new file mode 100644
index 0000000000000000000000000000000000000000..76486e25563d9b07beb419f427abea5983435e8d
--- /dev/null
+++ b/examples/script_moody_diagram.py
@@ -0,0 +1,208 @@
+#******************************************************************************
+#******************************************************************************
+
+# TIP: this script requires the data found in the hyhetra-pipedata and hyhetra-
+# -fluiddata repositories
+
+pipedata_files = ['pipes/isoplus_singlepipes_s1.csv']
+
+fluiddata_file = 'fluids/incropera2006_saturated_water.csv'
+
+# import libraries
+import numpy as np
+import matplotlib.pyplot as plt
+import topupheat.pipes.fic as fic
+from topupheat.pipes.single import StandardisedPipe, StandardisedPipeDatabase
+
+#******************************************************************************
+#******************************************************************************
+
+# specify the pipes that should be considered 
+
+list_pipe_tuples = [(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-ST'),
+                    (125, 1, 'isoplus', 'DRE-125-ST'),
+                    (150, 1, 'isoplus', 'DRE-150-ST'),
+                    (200, 1, 'isoplus', 'DRE-200-ST')]
+
+# relative pipe roughness
+
+list_relative_pipe_roughness = [
+    5e-2,
+    2.5e-2,
+    1e-2,
+    5e-3,
+    2e-3,
+    1e-3,
+    5e-4,
+    2e-4,
+    1e-4,
+    5e-5,
+    2e-5,
+    1e-5,
+    0
+    ]
+
+labels_relative_pipe_roughness = [
+    '5e-2',
+    '2.5e-2',
+    '1e-2',
+    '5e-3',
+    '2e-3',
+    '1e-3',
+    '5e-4',
+    '2e-4',
+    '1e-4',
+    '5e-5',
+    '2e-5',
+    '1e-5',
+    '0']
+
+# specify the pipe that is to be considered individually
+
+selected_pipe_index = 5
+
+# moody diagram
+
+number_points_laminar = 5
+
+number_points_turbulent = 100
+
+#******************************************************************************
+#******************************************************************************
+
+# pipe data
+
+pipedb = StandardisedPipeDatabase(source=pipedata_files)
+
+# water data
+
+waterdb = fic.FluidDatabase(fluid='water', phase='l', source=fluiddata_file)
+
+#******************************************************************************
+#******************************************************************************
+
+# 1) plot the moody diagram
+
+#******************************************************************************
+
+# define the reynolds numbers' vector
+
+list_reynolds_number = (
+    np.logspace(0,
+                8, 
+                number_points_turbulent+number_points_laminar)
+    )
+
+# define the models to be used
+
+list_dff_models = [fic.DFF_COLEBROOK_WHITE]
+
+#******************************************************************************
+#******************************************************************************
+
+# variables
+
+dict_friction_factor = {}
+
+dict_pipe = {}
+
+# for each roughness value
+
+for relative_pipe_roughness in list_relative_pipe_roughness:
+    
+    # create the pipe instance
+    
+    pipe = StandardisedPipe(
+        pipe_tuple=list_pipe_tuples[selected_pipe_index],
+        e_rel=relative_pipe_roughness,
+        db=pipedb)
+    
+    dict_pipe[relative_pipe_roughness] = pipe
+
+    # for each dff model
+
+    for model in list_dff_models:
+    
+        # get the friction factors
+        
+        list_friction_factor = [fic.DarcyFrictionFactor(
+            re, 
+            pipe,
+            model=model) 
+            for re in list_reynolds_number]
+        
+        # store it
+        
+        dict_friction_factor[
+            (model, relative_pipe_roughness)] = list_friction_factor
+            
+        #**********************************************************************
+        #**********************************************************************
+        
+    #**************************************************************************
+    #**************************************************************************
+
+#******************************************************************************
+#******************************************************************************
+
+list_linestyle_our = ['ro-','go-','bx-',
+                      'rv-','g^-','bd-',
+                      'r<-','g>-','b.-',
+                      'ro--','go--','bx--',
+                      'rv--','g^--','bd--',
+                      'r<--','g>--','b.--']
+
+# plot
+
+fig, ax = plt.subplots()
+
+fig.set_size_inches(12,8)
+    
+for j, model in enumerate(list_dff_models):
+
+    for i, relative_pipe_roughness in enumerate(list_relative_pipe_roughness):
+
+        # plot them using a log scale
+        
+        linestyle_index = i+(j)*len(list_relative_pipe_roughness)
+        
+        ax.loglog(list_reynolds_number, 
+                  dict_friction_factor[(model, relative_pipe_roughness)],
+                  list_linestyle_our[linestyle_index],
+                  #label=model+', e/D='+labels_relative_pipe_roughness[i],
+                  label='CWE, e/D='+labels_relative_pipe_roughness[i])
+        
+        #**********************************************************************
+        
+    #**************************************************************************
+        
+#******************************************************************************
+#******************************************************************************
+    
+ax.set(xlabel='Reynolds number [-]', 
+       ylabel='Friction factor [-]',
+       title='Moody diagram')
+
+# plt.autoscale(enable=True, axis='x', tight=True)
+
+ax.grid(which='both')
+
+ax.legend() 
+
+# left, right = xlim()  # return the current xlim
+
+plt.xlim((0.6e3, 1e8))   # set the xlim to left, right
+plt.ylim((0.006, 0.1))   # set the xlim to left, right
+
+# fig.savefig("test.png")
+plt.show()
+    
+#******************************************************************************
+#******************************************************************************
\ No newline at end of file
diff --git a/examples/script_nikuradse_experiments.py b/examples/script_nikuradse_experiments.py
new file mode 100644
index 0000000000000000000000000000000000000000..cae7390478e1deb07ef00369c4a2fc610a0aa84d
--- /dev/null
+++ b/examples/script_nikuradse_experiments.py
@@ -0,0 +1,240 @@
+#******************************************************************************
+#******************************************************************************
+
+# TIP: this script requires the data found in the hyhetra-pipedata and hyhetra-
+# -fluiddata repositories
+
+pipedata_files = ['pipes/isoplus_singlepipes_s1.csv']
+
+fluiddata_file = 'fluids/incropera2006_saturated_water.csv'
+
+# Note: this script uses data published by Li and Huai (2016) about Nikuradse's
+# experiments. DOI:  https://doi.org/10.1371/journal.pone.0154408
+
+# The xls file included in the paper as an appendix should then be converted to
+# csv format and its two first lines (headers) replaced by the following one:
+# A_run,A_f,A_1/e,A_Re,B_run,B_f,B_1/e,B_Re,C_run,C_f,C_1/e,C_Re,D_run,D_f,D_1/e,D_Re,E_run,E_f,E_1/e,E_Re,F_run,F_f,F_1/e,F_Re    
+# How? copy the line above (minus the leading '# ') and paste it using a text editor
+
+nikuradse_file = 'papers/Li2016_edited.csv'
+
+# import libraries
+import numpy as np
+import matplotlib.pyplot as plt
+import topupheat.pipes.fic as fic
+from topupheat.pipes.single import StandardisedPipe, StandardisedPipeDatabase
+
+#******************************************************************************
+#******************************************************************************
+
+# specify the pipes that should be considered using (DN,S) tuples
+
+# 20,25,32,40,50,65,80,100,125,150,200
+
+list_pipe_tuples = [(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-ST'),
+                    (125, 1, 'isoplus', 'DRE-125-ST'),
+                    (150, 1, 'isoplus', 'DRE-150-ST'),
+                    (200, 1, 'isoplus', 'DRE-200-ST')]
+
+# relative pipe roughness
+
+list_relative_pipe_roughness = [
+    0.5/507,
+    0.5/252,
+    0.5/126,
+    0.5/60,
+    0.5/30.6,
+    0.5/15]
+
+labels_relative_pipe_roughness = [
+    '1/1014',
+    '1/504',
+    '1/252',
+    '1/120',
+    '1/61.2',
+    '1/30']
+
+# specify the pipe that is to be considered individually
+
+selected_pipe_index = 5
+
+# moody diagram
+
+number_points_laminar = 5
+
+number_points_turbulent = 100
+
+#******************************************************************************
+#******************************************************************************
+
+# pipe data
+
+pipedb = StandardisedPipeDatabase(source=pipedata_files)
+
+# water data
+
+waterdb = fic.FluidDatabase(fluid='water', phase='l', source=fluiddata_file)
+
+#******************************************************************************
+#******************************************************************************
+
+nikuradse_data = np.genfromtxt(nikuradse_file,
+                               #dtype=(float,float,float,float),
+                               names=True,
+                               #skip_header=0,
+                               # skip_header=1,
+                               # skip_footer=0,
+                               delimiter=',')
+
+nikuradse_experiments = ['A','B','C','D','E','F']
+
+nikuradse_data_length = [48, 38, 71, 72, 63, 70]
+
+nikuradse_data_f = {nikuradse_experiments[i]: 
+                    nikuradse_data[value+'_f'][0:nikuradse_data_length[i]]
+                    for i, value in enumerate(nikuradse_experiments)}
+
+nikuradse_data_re = {nikuradse_experiments[i]: 
+                     nikuradse_data[value+'_Re'][0:nikuradse_data_length[i]]
+                     for i, value in enumerate(nikuradse_experiments)}
+
+nikuradse_data_1e = {nikuradse_experiments[i]: 
+                     nikuradse_data[value+'_1e'][1]
+                     for i, value in enumerate(nikuradse_experiments)}
+
+#******************************************************************************
+#******************************************************************************
+
+# 1) plot the moody diagram
+
+#******************************************************************************
+
+# define the reynolds numbers' vector
+
+list_reynolds_number = (
+    np.logspace(0,
+                8, 
+                number_points_turbulent+number_points_laminar)
+    )
+
+# define the models to be used
+
+list_dff_models = [fic.DFF_COLEBROOK_WHITE]
+
+#******************************************************************************
+#******************************************************************************
+
+# variables
+
+dict_friction_factor = {}
+
+dict_pipe = {}
+
+# for each roughness value
+
+for relative_pipe_roughness in list_relative_pipe_roughness:
+    
+    # create the pipe instance
+    
+    pipe = StandardisedPipe(
+        pipe_tuple=list_pipe_tuples[selected_pipe_index],
+        e_rel=relative_pipe_roughness,
+        db=pipedb)
+    
+    dict_pipe[relative_pipe_roughness] = pipe
+
+    # for each dff model
+
+    for model in list_dff_models:
+    
+        # get the friction factors
+        
+        list_friction_factor = [fic.DarcyFrictionFactor(
+            re, 
+            pipe,
+            model=model) 
+            for re in list_reynolds_number]
+        
+        # store it
+        
+        dict_friction_factor[
+            (model, relative_pipe_roughness)] = list_friction_factor
+            
+        #**********************************************************************
+        #**********************************************************************
+        
+    #**************************************************************************
+    #**************************************************************************
+
+#******************************************************************************
+#******************************************************************************
+
+list_linestyle_our = ['rs-','rd-','rx-',
+                      'r^-','r>-','r<-']
+
+list_linestyle_nikuradse = ['bs','bd','bx',
+                            'b^','b>','b<']
+
+# plot
+
+fig, ax = plt.subplots()
+
+fig.set_size_inches(12,8)
+    
+for j, model in enumerate(list_dff_models):
+
+    for i, relative_pipe_roughness in enumerate(list_relative_pipe_roughness):
+
+        # plot them using a log scale
+        
+        linestyle_index = i+(j)*len(list_relative_pipe_roughness)
+        
+        ax.loglog(list_reynolds_number, 
+                  dict_friction_factor[(model, relative_pipe_roughness)],
+                  list_linestyle_our[linestyle_index],
+                  #label=model+', e/D='+labels_relative_pipe_roughness[i],
+                  label='CWE, e/D='+labels_relative_pipe_roughness[i])
+        
+        #**********************************************************************
+        
+    #**************************************************************************
+    
+#******************************************************************************
+
+for e, exp in enumerate(nikuradse_experiments):
+    
+    ax.loglog(nikuradse_data_re[exp], 
+              nikuradse_data_f[exp],
+              list_linestyle_nikuradse[e],
+              label='N33, e/D=1/'+str(round(2*nikuradse_data_1e[exp])))
+    
+#******************************************************************************
+    
+ax.set(xlabel='Reynolds number [-]', 
+       ylabel='Friction factor [-]',
+       title='Colebrook-White equation (CWE) vs results from Nikuradse (1933)')
+
+# plt.autoscale(enable=True, axis='x', tight=True)
+
+ax.grid(which='both')
+
+ax.legend() 
+
+# left, right = xlim()  # return the current xlim
+
+# plt.xlim((1e3, 1e8))   # set the xlim to left, right
+plt.xlim((1e3, 1e6))   # set the xlim to left, right
+plt.ylim((1.5e-2, 8e-2))   # set the xlim to left, right
+
+# fig.savefig("test.png")
+plt.show()
+    
+#******************************************************************************
+#******************************************************************************
\ No newline at end of file