Challenge

Week 11 - Simulation of Flow through a pipe in OpenFoam

  1. Introduction:

The fluid dynamics of internal flow through a pipe is a fascinating topic that has widespread applications in various industries, including refrigeration and air conditioning. In this simulation, we will explore the behavior of a steady, laminar, incompressible flow of fluid through a wedge-shaped pipe. By examining the velocity profile of the fluid, we can gain insights into the pressure difference created by pumps, air handling units, and fans that drive the flow.

  1. Assumptions:

We make the following assumptions in our simulation: the flow is steady and laminar, and there is no velocity in the radial direction. Additionally, we assume that there is no acceleration since the flow is steady, and the Reynolds number for the laminar flow is 2100. For simplicity, we will only consider the wedge shape of the pipe, which is axis-symmetric. Finally, we will use the Hagen-Poiseuille equation to describe the governing equation of the fluid flow.

  1. Significance:

The study of fluid flow through pipes has numerous practical applications in various fields, from engineering to medicine. Understanding the behavior of the fluid velocity profile and pressure drop can help optimize the design of piping systems for efficient transport of fluids. Our simulation aims to provide insights into the flow dynamics of a wedge-shaped pipe, which can help improve the performance of pumps, air handling units, and fans used in refrigeration and air conditioning systems. By using OpenFOAM to simulate the flow, we can gain a deeper understanding of the complex fluid dynamics that govern internal flow in pipes.

Matlab coding and script for blockMeshDict file

% simulation of a flow in a pipe

clear

close all

clc

% defining input values from Hagen Poiseuille

% laminar flow

Re=2100;

% diameter of pipe

D=0.02;

% radius of pipe

R=D/2;

% wedge angle

theta=4;

% hydrodynamic entry length L

L=0.06*Re*D;

% assumed characteristic length

L_c=L+0.3;

% dynamic viscosity of water

mu=0.89e-3;

% density of water

rho=997;

% kinematic viscosity

nu=mu/rho;

% calculating average velocity

v_avg=(mu*Re)/(rho*D);

% calculating maximum velocity at the centerline of pipe

u_max=2*v_avg;

% darcy friction factor

f=64/Re;

% pressure drop for the laminar flow

delta_p=(32*mu*v_avg*L)/D^2;

% finding vertices

v0=[0 0 0 ];

v1=[0 R*cosd(0.5*theta) -R*sind(0.5*theta)];

v2=[0 R*cosd(0.5*theta) R*sind(0.5*theta)];

v3=[L 0 0 ];

v4=[L R*cosd(0.5*theta) -R*sind(0.5*theta)];

v5=[L R*cosd(0.5*theta) R*sind(0.5*theta)];

%% writing the script for blockMeshDict file

% creating permission to write the file

f1=fopen('blockMeshDict.txt','w');

fprintf(f1,'%s','/*--------------------------------*- C++ -*----------------------------------*');

fprintf(f1,'n');

fprintf(f1,'%s',' ========= |');

fprintf(f1,'n');

fprintf(f1,'%s',' \ / F ield | OpenFOAM: The Open Source CFD Toolboxn');

fprintf(f1,'n');

fprintf(f1,'%s',' \ / O peration | Website: https://openfoam.orgn');

fprintf(f1,'n');

fprintf(f1,'%s',' \ / A nd | Version: 8n');

fprintf(f1,'n');

fprintf(f1,'%s',' \/ M anipulation |');

fprintf(f1,'n');

fprintf(f1,'%s','*---------------------------------------------------------------------------*/');

fprintf(f1,'nFoamFilen');

fprintf(f1,'{n');

fprintf(f1,' version 2.0;n');

fprintf(f1,' format ascii;n');

fprintf(f1,' class dictionary;n');

fprintf(f1,' object blockMeshDict;n');

fprintf(f1,'}n');

fprintf(f1,'%s','// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //');

fprintf(f1,'n');

fprintf(f1,'n');

fprintf(f1,'convertToMeters 1;n');

fprintf(f1,'n');

fprintf(f1,'verticesn');

fprintf(f1,'(n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v0(1),v0(2),v0(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v1(1),v1(2),v1(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v2(1),v2(2),v2(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v3(1),v3(2),v3(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v4(1),v4(2),v4(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'(');

fprintf(f1,'%f %f %f',v5(1),v5(2),v5(3));

fprintf(f1,')');

fprintf(f1,'n');

fprintf(f1,');n');

fprintf(f1,'n');

fprintf(f1,'blocksn');

fprintf(f1,'%s','(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4));

fprintf(f1,'%s','hex (0 1 2 0 3 4 5 3)');

fprintf(f1,'%s',blanks(1));

fprintf(f1,'%s','(50 1 200)');

fprintf(f1,'%s',blanks(1));

fprintf(f1,'%s','simpleGrading (0.4 1 1)');

fprintf(f1,'n');

fprintf(f1,');n');

fprintf(f1,'n');

fprintf(f1,'%s','edges');

fprintf(f1,'n');

fprintf(f1,'%s','(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4));

fprintf(f1,'%s','arc 1 2 (');

fprintf(f1,'%f %f %f',0,R,0);

fprintf(f1,'%s',')');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4));

fprintf(f1,'%s','arc 4 5 (');

fprintf(f1,'%f %f %f',L,R,0);

fprintf(f1,'%s',')');

fprintf(f1,'n');

fprintf(f1,'%s',');');

fprintf(f1,'n');

fprintf(f1,'n');

fprintf(f1,'%s','boundary');

fprintf(f1,'n');

fprintf(f1,'%s','(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'axis');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type empty;');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(0 3 3 0)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'inlet');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type patch;');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(0 1 2 0)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'pipe_surface');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type wall;');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(1 4 5 2)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'outlet');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type patch');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(3 4 5 3)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'front');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type wedge');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(0 3 5 2)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'back');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'{');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'type wedge');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'faces');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),'(');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(12),'(0 1 4 3)');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(8),');');

fprintf(f1,'n');

fprintf(f1,'%s',blanks(4),'}');

fprintf(f1,'n');

fprintf(f1,'%s',');');

fprintf(f1,'n');

fprintf(f1,'%s','mergePatchPairs');

fprintf(f1,'n');

fprintf(f1,'%s','(');

fprintf(f1,'n');

fprintf(f1,'%s',');');

fprintf(f1,'n');

fprintf(f1,'%s','// ************************************************************************* //');

fclose(f1);

Wedge profile of the pipe used in the blockMeshDict file

Creating geometry of the wedge.

/*--------------------------------*- C++ -*----------------------------------*
  =========                 |
  \      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \    /   O peration     | Website:  https://openfoam.org
    \  /    A nd           | Version:  8
     \/     M anipulation  |
*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1;

vertices
(
    (0.000000 0.000000 0.000000)// origin
    (0.000000 0.009994 -0.000349) // 1
    (0.000000 0.009994 0.000349) //2
    (2.520000 0.000000 0.000000) //3
    (2.520000 0.009994 -0.000349) //4
    (2.520000 0.009994 0.000349) //5
    
);

blocks
(
    hex (0 1 2 0 3 4 5 3) (50 1 200) simpleGrading (0.4 1 1)
);

edges
(
arc 1 2 (0 0.01 0)
arc 4 5 (2.52 0.01 0)
);

boundary
(
    axis
    {
        type empty;
        faces
        (
            (0 3 3 0)
        );
    }
    inlet
    {
        type patch;
        faces
        (
            (0 1 2 0)
        );
    }
    pipe_surface
    {
        type wall;
        faces
        (
            (1 4 5 2)
        );
    }
    outlet
    {
        type patch;
        faces
        (
            (3 4 5 3)
        
        );
     }
     front
     {
         type wedge;
         faces
         (
            (0 3 5 2)
          );
      }
      back
      {
         type wedge;
         faces
         (
             (0 1 4 3)  
          );
       }
       );
 );

mergePatchPairs
(
);

// ************************************************************************* //      

Control Dict

/*--------------------------------*- C++ -*----------------------------------*
  =========                 |
  \      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \    /   O peration     | Website:  https://openfoam.org
    \  /    A nd           | Version:  8
     \/     M anipulation  |
*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

application     icoFoam;

startFrom       startTime;

startTime       0;

stopAt          endTime;

endTime         10;

deltaT          0.01;

writeControl    timeStep;

writeInterval   10;

purgeWrite      0;

writeFormat     ascii;

writePrecision  6;

writeCompression off;

timeFormat      general;

timePrecision   6;

runTimeModifiable true;


// ************************************************************************* //

Transport properties

/*--------------------------------*- C++ -*----------------------------------*
  =========                 |
  \      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \    /   O peration     | Website:  https://openfoam.org
    \  /    A nd           | Version:  8
     \/     M anipulation  |
*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "constant";
    object      transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

nu              [0 2 -1 0 0 0 0] 8.9268e-07;


// ************************************************************************* //

Pressure

/*--------------------------------*- C++ -*----------------------------------*
  =========                 |
  \      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \    /   O peration     | Website:  https://openfoam.org
    \  /    A nd           | Version:  8
     \/     M anipulation  |
*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       volScalarField;
    object      p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions      [0 2 -2 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    axis
    {
        type            empty;
    }

    inlet
    {
        type            zeroGradient;
    }

    pipe_surface
    {
        type            zeroGradient;
    }
    outlet
    {
         type           fixedValue;
         value           uniform 0.0169;
    }
    front
    {
         type            wedge;
    } 
    back
    {
         type            wedge;
    }     
         
}

// ************************************************************************* //

Velocity

/*--------------------------------*- C++ -*----------------------------------*
  =========                 |
  \      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \    /   O peration     | Website:  https://openfoam.org
    \  /    A nd           | Version:  8
     \/     M anipulation  |
*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       volVectorField;
    object      U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions      [0 1 -1 0 0 0 0];

internalField   uniform (0.0937 0 0);

boundaryField
{
    axis
    {
        type            empty;
        
    }
    inlet
    {
        type            fixedValue;
        value           uniform (0.0937 0 0);
    }
    pipe_surface
    {
        type            fixedValue;
        value           uniform (0 0 0);
        
    }

    outlet
    {
        type            zeroGradient;
        
    }
    front
    {
         type            wedge;
    }
    back
    {
         type            wedge;
    }
    
}

// ************************************************************************* // 

Resulted geometry created by blockMeshDict file

Velocity distribution result by applying initial and boundary condition

Velocity distribution along the length of pipe (fully developed profile)

Simulation graph

Velocity profile at the inlet

Calculating shear stress numerically

%% calculating shear stress 

r=linspace(-0.01,0.01,100);
for i=1:length(r)
tau(i)=(2*mu*u_max*abs(r(i)))/R^2;
end
plot(r,tau ,'linewidth',3)
grid on 
xlabel('Radius of pipe in Meter')
ylabel('Shear stress in Pascal ')
title('Shear stress along the radius of pipe')
legend('Shear stress of the profile')

Shear stress graph from Matlab

Shear stress plots from OpenFOAM

The OpenFOAM results are tabulated as under

Results Hagen-Poiseuille equation Wedge angle 4
CFL number mean - 0.076
CFL number max - 0.304875
Clock time - 141 s
Execution time - 114.63 s
Umax 0.1875 m/sec 0.16 m/sec

Conclusion

In conclusion, we have successfully simulated the flow of a steady, laminar, incompressible fluid through a wedge-shaped pipe using OpenFOAM. The velocity profile was plotted at varying distances from the inlet, and we observed that the velocity gradually develops as it moves towards the center of the pipe and becomes maximum at the center. At the wall, the velocity suddenly drops to zero due to the no-slip condition. The velocity profile at hydrodynamically fully developed regions was found to be parabolic in nature. We also plotted the shear stress profile and observed some irregularities due to the finite volume method. However, by increasing the number of grid points, these irregularities can be reduced, albeit at the cost of increased computational time. Finally, we verified the accuracy of our simulation by comparing it to the Hagen-Poiseuille equation and found an error of 0.0275. Overall, our simulation provides valuable insights into the flow dynamics of internal flow through pipes and can be applied to various wedge angles since the flow is steady and incompressible.

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.