Laminar Pipe Flow convergence issues
Hi All,
I am new to OpenFoam and I am having a few issues getting a converged solution for laminar flow through a circular pipe (simplest problem I could think of to start with). I am using simpleFoam with (simulationType set to laminar in constant/turbulenceProperties and transportModel set to Newtonian in constant/transportProperties). My Reynolds number is about 20. Essentially everything runs without a problem except that the Initial residual for the two non axial components of the velocity do not converge. The axial component and the pressure converge nicely (and all of the final residual values look good along the way) but the initial residual of the two non axial components bounce around and don't settle down. I have tried altering the relaxation parameters but with little success. I have set the pressures at the ends of the pipe and have zeroGradient BCs for U. Mesh is a Hex mesh from gambit. When I look at the results in paraFoam it indicates that the axial velocity is approx 1.8 m/s while the non axial components (U_x and U_y) are of the order of 1.0e6 in a couple of regions (so the axial components are very small). Does anyone have an idea as to what i need to to get the Initial Residual of the non axial components to converge?. For what it is worth this problem does not seem to show up if I look at flows that have non negligible non axial components). My contents of fvSolution file and my 0/p and 0/U files are listed below. Thanks in advance and Kind Regards, Paul. solvers { p { solver GAMG; tolerance 1e08; relTol 0; smoother GaussSeidel; nPreSweeps 0; nPostSweeps 2; cacheAgglomeration true; nCellsInCoarsestLevel 20; agglomerator faceAreaPair; mergeLevels 1; } U { solver PBiCG; preconditioner DILU; tolerance 1e08; relTol 0; } nuTilda { solver smoothSolver; smoother GaussSeidel; nSweeps 2; tolerance 1e08; relTol 0.1; } } SIMPLE { nNonOrthogonalCorrectors 0; pRefCell 0; pRefValue 0; } relaxationFactors { default 0; p 0.3; U 0.7; nuTilda 1.0; } 0/p File dimensions [0 2 2 0 0 0 0]; internalField uniform 0; boundaryField { wall { type zeroGradient; } inlet { type fixedValue; value uniform 24; } outlet { type fixedValue; value uniform 0; } } 0/U file dimensions [0 1 1 0 0 0 0]; internalField uniform (0 0 0); boundaryField { wall { type fixedValue; value uniform (0 0 0); } inlet { type zeroGradient; } outlet { type zeroGradient; } } 
Hi,
I think your problem lies in your BCs . At the inlet I would define U as fixedValue (with velocity value for Re=20) and p as zeroGradient. At the outlet, U as zeroGradient and p = 0. Regards, Jose Santos 
Hi Jose,
Thanks for your reply. This boundary condition works. However, in this case the flow develops with distance (i.e. it has a development length), whereas I would like to model fully developed laminar pipe flow. Do you have any idea why fixing the pressures at both ends and setting zero gradients on the velocities should not work (converge)?. It is my understanding that this should be equivalent to having a pressure inlet at one end and a pressure outlet at the other. I have tried setting the inlet and the outlet to be pressureInletVelocity (see below) but I am not sure what I need to set the value to, so I just used uniform (0 0 0). It also seems to have issues converging the non axial components of the velocity (over thousands and thousands of iterations they seem to decrease very slowly with this approach rather than bouncing around, so it is not really ideal either). Kind Regards, Paul. inlet { type pressureInletVelocity; value uniform (0 0 0); } outlet { type pressureInletVelocity; value uniform (0 0 0); } 
Hi Paul
An approach similar to José's is to use the directMapped boundary condition, which maps some interior plane onto the inlet. In this manner you will avoid having a developing velocity profile even though you specify uniform conditions at time = 0. You can get a feel of how to use directMapped by looking into ~/OpenFOAM/OpenFOAM1.5.x/tutorials/oodles/pitzDailyDirectMapped (still working in 1.5 so the location of the tutorial has changed, however does not have access to 1.6.x at the moment). Especially look carefully in the Allrun file and notice/understand the use of changeDictionary in casefolder/system. Good luck and welcome Niels 
You could do something like in channelFoam, where you set the inlet/outlet as cyclics and give an average velocity to the solver. I've used this for laminar and turbulent flows in the past.

Hi all,
I have also used both approaches suggested by Niels and Laurence for periodic channels, and they work quite well. Let us know how it goes! Regards, Jose 
Hi all.
As Paul, I am using simpleFoam to obtain an incompressible steady state flow of water in a convergingdiverging nozzle without turbulence and wall friction (slip condition). I know the analytical solution by the Bernoulli equation. Initially, I was using the following boundary condition: Pin = fixedValue, Pout = fixedValue, Uin = pressureInletOutletVelocity, Uout = pressureInletOutletVelocity With these BC, I was unable to reach the analytical solution since the inlet velocity obtained was lower by 510% of the analytical one even with small grid size. The problem is that with large grid size, the convergence (number of iteration to have a constant value) is fast but not accurate and with small grid size, the convergence is very long (1000000 iterations) and inlet velocity results are 6% lower than the analytical one. I did the same with rhoSimpleFoam with water vapor and the same kind of result differences occured. After that, I tried the following BC: Pin = zeroGradient, Pout = fixedValue, Uin = fixedValue, Uout, zeroGradient The solution converge in about 400 iterations and for a small grid size about 600 iterations with good results compared to the analytical one with simpleFoam and rhoSimpleFoam. But I want to simulate twophase flow with inlet total pressure and outlet static pressure known and calculated other flow properties so I need the inlet and outlet pressure boundary condition to be set to : Pin = fixedValue, Pout = fixedValue. What is the problem with these BC and is it the same with the twoPhaseEulerFoam solver? Thank you very much to help me with this understanding problem. Sylvain University of Sherbrooke, Canada 
Hi Sylvain and Paul
As Laurance pointed out the method of applying a body force in a cyclic domain is also quite helpful in many situations where the method suggested by me does not work, e.g. period domain with convergingdiverging flows which could for instance be river dunes. The method, however, has a considerable drawback as is also the case in the setup by Sylvain, if certain measures are not taking. The drawback is a huge number of iterations, as the flow approaches the solutions in an asymptotic manner. What we have been doing in our group with respect to river dunes on cyclic domains, is to define some target value, e.g. the mass flux, and then adjust the magnitude of the body force as a function of the error in and the rate of change of this target function. This forces the solution onto the system, and the convergence is considerably faster. How this could be adjusted in Sylvain's is not clear to me, however I hope this has given you some inspiration to solve the problem at hand. A nice weekend to all of you:) Niels 
First of all, thank you everyone for your comments.
My main interest in this problem is as a test case to determine how well OpenFoam predicts the flow rate through a pipe for a prescribed pressure drop. While mapping and using cyclic BCs should work well for this case, I am not sure if they will be suitable for some of the other cases that I wish to look at. As things currently stand, I am using pressureInletVelocity BCs on both the inlet and outlet and I judge convergence based on the change in the mass flow rate through the system (i.e. using calcMassFlow). If the rate of change with the number of iterations drops below a certain threshold then I will deem the solution converged. For what it is worth, for pipe flow at Re=200, I get reasonable agreement with the analytic solution (within 1% when I correct for the area discretization (2% if I don't correct)) after about 5000 iterations. I have run the same problem in CFX (with the same mesh and CFX default solver settings) and while I get convergence (i.e. RMS residuals for all fields drop below 1.0e5 after 1088 iterations) the CFX result is out by about 11% (again correcting for the area discretization (12% if I don't correct)). If I compare the codes after the same number of iterations (i.e. 1088) the OpenFoam solution is out by 14.5%. However, I should stress that OpenFoam did the 1088 iterations roughly 6.3 times faster than CFX did them. in fact OpenFoam did the 5000 iterations faster than CFX did the 1088 iterations, so OpenFoam is the winner on speed and accuracy, well, at least for this problem. I suspect that the speed and accuracy results are not directly transferable to other problems but it is what I observed here, so it may prove helpful to anyone else who comes across similar issues or reads this post at a later date. Anyway, thanks again for your helpful suggestions. Kind Regards, Paul 
HI,
just a short comment. When comparing the speed, you should not forget the differences in CFX and OF. While CFX is using coupled solver, in OF you are using segregated to name the biggest difference. This would make a difference, of course. According to my experiences, coupled solver of CFX was a great help in more complicated flows with varying density (like combustion). Another important think, which you said and need to be stressed. The speed and accuracy conclusions works for this type of flow. It doest not say about other types of flow. (I'm not advocating for CFX, I'm happy OF user ;) ) matej 
Hi matej,
Yes I am aware that CFX uses a coupled solver while OpenFoam uses a segregated solver. That was why I was quite surprised that CFX did not do much better than it did. As I mentioned I doubt this comparison can be translated to other problems (where for example coupling should show significant benefits) but the results for this problem are fairly clear. Cheers, Paul. 
Quote:
I am using water for laminar pipe flow simulation to verify accuracy of the Openfoam codes. Pipe dimensions are D=4 mm, L=2 m and Re=1620. I have implemented the boundary condition that you used but, it has not been converging. Do you know what might be potential reason for this? In addition, Could you please let me know how I can calculate heat transfer coefficient and Nusselt number along the axial variation of the pipe using OpenFOAM? Thank you. 
All times are GMT 4. The time now is 11:02. 