
[Sponsors] 
October 1, 2009, 13:43 
How to setup cyclic BCs in simpleFOAM

#1 
New Member
Huang
Join Date: Sep 2009
Posts: 11
Rep Power: 8 
I am trying to simulate fully developed turbulent flow in a square duct with cyclic BC in simpleFoam with KEpsilon model. The mesh was generated in pointwise, with cyclic BCs automatically specified. here attach my setup files, but it fail to get a converged solution. Any hits? Thanks in advance.
0/U &p dimensions [0 1 1 0 0 0 0]; internalField uniform (0.329 0 0); boundaryField { Cyclic { type cyclic; value uniform (0.329 0 0); } Wall { type fixedValue; value uniform (0 0 0); } } dimensions [0 2 2 0 0 0 0]; internalField uniform 0; boundaryField { Cyclic { type cyclic; } Wall { type zeroGradient; } } and I also set Ubar in constant/transportProperties Ubar Ubar [ 0 1 1 0 0 0 0 ] (0.329 0 0 ); transportModel Newtonian; nu nu [ 0 2 1 0 0 0 0 ] 1.003e06; in system/fvSchemes I set SIMPLE { nNonOrthogonalCorrectors 0; pRefCell 0; pRefValue 0; } I has been trying for days, but got no good results, even if I turned off turbulence. the maximum stream velocity from simpleFoam is 0.329, so the mass is not conserved. Last edited by hhuang84; October 1, 2009 at 17:17. 

October 7, 2009, 10:38 

#2 
Senior Member
Daniel WEI (老魏)
Join Date: Mar 2009
Location: Beijing, China
Posts: 689
Blog Entries: 9
Rep Power: 13 
How about this,
Code:
Cyclic { type cyclic; }
__________________
~ Daniel WEI  Boeing Research & Technology  China Beijing, China 

October 7, 2009, 14:51 

#3 
New Member
Huang
Join Date: Sep 2009
Posts: 11
Rep Power: 8 
Any other solvers that can implement the periodic boundary conditions?


October 7, 2009, 18:48 

#4 
Senior Member

Have you looked into channelFoam? It can handle cyclics, while simpleFoam doesnt by default (I think).
Regards, Jose Santos 

October 7, 2009, 19:51 

#5 
New Member
Huang
Join Date: Sep 2009
Posts: 11
Rep Power: 8 
However, if I just wanna run a laminar or RANS , what solver can I chose?


October 8, 2009, 10:08 

#7 
Senior Member

For laminar, change LESModel in channelFoam to laminar. For RANS I guess you need to make your own solver, combining eg pisoFoam (as suggested above) and channelFoam.
Regards, Jose Santos 

October 14, 2009, 10:41 

#8 
New Member
ouafa
Join Date: Jul 2009
Posts: 14
Rep Power: 9 
hi everybody,
i try to run the biperiodic tutorial channelOoddles initially proposed in LES, with the solver simpleFoam for steady RANS using the Komega SST model and taking the same parameters Ubar and nu. so i add the term gradP like in the channelOoddles solver in the Ueqn but the result was a laminar regime even after long time simulations. k and omega are not zero. can someone help me please, here after my proposed: fvVectorMatrix UEqn ( fvm::div(phi, U) + turbulence>divDevReff(U) == flowDirection*gradP ); UEqn.relax(); eqnResidual = solve ( UEqn == fvc::grad(p) ).initialResidual(); maxResidual = max(eqnResidual, maxResidual);  p.boundaryField().updateCoeffs(); volScalarField AU =UEqn.A(); volScalarField rUA = 1.0/UEqn.A(); U = UEqn.H()/AU; phi = fvc::interpolate(U) & mesh.Sf(); adjustPhi(phi, U, p); // Nonorthogonal pressure corrector loop for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) { fvScalarMatrix pEqn ( fvm::laplacian(1.0/AU, p) == fvc::div(phi) ); pEqn.setReference(pRefCell, pRefValue); // retain the residual from the first iteration if (nonOrth == 0) { eqnResidual = pEqn.solve().initialResidual(); maxResidual = max(eqnResidual, maxResidual); } else { pEqn.solve(); } if (nonOrth == nNonOrthCorr) { phi = pEqn.flux(); } } # include "continuityErrs.H" // Explicitly relax pressure for momentum corrector p.relax(); // Momentum corrector U = fvc::grad(p)/AU; U.correctBoundaryConditions(); // Correct driving force for a constant mass flow rate // Extract the velocity in the flow direction dimensionedScalar magUbarStar = (flowDirection & U)().weightedAverage(mesh.V()); // Calculate the pressure gradient increment needed to // adjust the average flowrate to the correct value dimensionedScalar gragPplus = (magUbar  magUbarStar)/rUA.weightedAverage(mesh.V()); U += flowDirection*rUA*gragPplus; gradP += gragPplus; Info<< "Uncorrected Ubar = " << magUbarStar.value() << tab << "pressure gradient = " << gradP.value() << endl; 

August 31, 2011, 17:25 
channel flow with simpleFoam aka simpleChannelFoam

#9 
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 573
Rep Power: 20 
This is an old thread, but its close to what I would like to discuss. I have made some changes to simpleFoam using channelFoam as a guide to model steadystate channel flow using RANS. I noticed this thread that was left hanging....has anyone managed to get periodic boundary conditions in simpleFoam to work WITHOUT direct mapped patches? Ubar and gradP diverge after a few hundred iterations. Thoughts? Below is my code so far.
Dan Code:
/**\ =========  \\ / F ield  OpenFOAM: The Open Source CFD Toolbox \\ / O peration  \\ / A nd  Copyright held by original author \\/ M anipulation   License This file is part of OpenFOAM. OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 021101301 USA Application simpleChannelFoam Description Steadystate solver for incompressible, laminar or turbulent flow with periodic boundary conditions \**/ #include "fvCFD.H" #include "singlePhaseTransportModel.H" #include "IFstream.H" //added #include "OFstream.H" //added #include "RASModel.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { # include "setRootCase.H" # include "createTime.H" # include "createMesh.H" # include "readTransportProperties.H" //added from channelFoam # include "createFields.H" # include "initContinuityErrs.H" # include "createGradP.H" //added from channelFoam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; while (runTime.loop()) { Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" # include "initConvergenceCheck.H" p.storePrevIter(); // Pressurevelocity SIMPLE corrector turbulence>correct();//moved here //solve the Uequation tmp<fvVectorMatrix> UEqn ( fvm::div(phi, U) + turbulence>divDevReff(U) == flowDirection*gradP ); UEqn().relax(); eqnResidual = solve ( UEqn() == fvc::grad(p) ).initialResidual(); maxResidual = max(eqnResidual, maxResidual); //end solving the Uequation //solve the pequation with SIMPLE Algorithm p.boundaryField().updateCoeffs(); volScalarField rUA = 1.0/UEqn().A();//added U = rUA*UEqn().H(); UEqn.clear(); phi = fvc::interpolate(U) & mesh.Sf(); adjustPhi(phi, U, p); // Nonorthogonal pressure corrector loop for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) { fvScalarMatrix pEqn ( fvm::laplacian(rUA, p) == fvc::div(phi) ); pEqn.setReference(pRefCell, pRefValue); // Retain the residual from the first iteration if (nonOrth == 0) { eqnResidual = pEqn.solve().initialResidual(); maxResidual = max(eqnResidual, maxResidual); } else { pEqn.solve(); } if (nonOrth == nNonOrthCorr) { phi = pEqn.flux(); } } # include "continuityErrs.H" // Explicitly relax pressure for momentum corrector p.relax(); // Momentum corrector U = rUA*fvc::grad(p); U.correctBoundaryConditions(); //end solve the pequation with SIMPLE Algorithm // Correct driving force for a constant mass flow rate // Extract the velocity in the flow direction dimensionedScalar magUbarStar = (flowDirection & U)().weightedAverage(mesh.V()); // Calculate the pressure gradient increment needed to // adjust the average flowrate to the correct value dimensionedScalar gragPplus = (magUbar  magUbarStar)/rUA.weightedAverage(mesh.V()); U += flowDirection*rUA*gragPplus; gradP += gragPplus; // Solve the turbulence equations and correct the turbulence viscosity after U has been updated //turbulence>correct(); Info<< "Uncorrected Ubar = " << magUbarStar.value() << tab << "pressure gradient = " << gradP.value() << endl; runTime.write(); #include "writeGradP.H" //added from channelFoam Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; # include "convergenceCheck.H" } Info<< "End\n" << endl; return 0; } // ************************************************************************* // Last edited by chegdan; August 31, 2011 at 19:20. 

July 11, 2012, 08:01 

#10 
New Member
Join Date: Apr 2012
Posts: 6
Rep Power: 6 
Dear Dan,
in the thread above about „channel flow with simpleFoam aka simpleChannelFoam“ you wrote about having problems with convergence of Ubar and gradP. I'm having the same problem right now (not surprising since I'm using a quite similar solver) and I'm not able to find the problem. Have you been able to identify or even solve the problem of the solver you posted? It would be great to get some feedback :) Kind Regards Tom 

July 11, 2012, 10:15 

#11  
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 573
Rep Power: 20 
Quote:
Not yet. Regards, Dan 

July 16, 2012, 06:32 

#12 
New Member
Join Date: Apr 2012
Posts: 6
Rep Power: 6 
Dear Dan,
Dear Foamers, the solver posted above by Dan should be correct. A very similar solver I used is running quite fine by considering the following aspects: 1. it is absolutely vital to use an upwind scheme for solving U (can be changed in the fvSchemesdictionary if not set by default) 2. relaxationFactors for pressure and velocity must be reduced and should not be bigger than p 0.15; U 0.5; (The relaxation factors can be changed in the fvSolution dictionary) 3. one should take at least 8000 iterationsteps ( set in the controldictfile), although in some cases 4000 iterations might be sufficient as well. I made best experiences with 10000 steps. In particular, I posted this for Dan in the hope of giving him, and anybody else having the same problem and reading this thread, an helpful answer, but I fear this is coming to late. Kind Regards Tom 

July 16, 2012, 07:01 

#13 
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 573
Rep Power: 20 
Tom,
Thanks. I'll give it a try and If I can add anything I'll get back here and post it. Thanks. Dan 

Thread Tools  
Display Modes  


Similar Threads  
Thread  Thread Starter  Forum  Replies  Last Post 
Cyclic BCs in PointwiseOpenFOAM export  cnsidero  OpenFOAM Meshing & Mesh Conversion  18  July 30, 2013 09:36 
Problems with Cyclic & init. BCs for turbulent (keps) pipe flow  florian_krause  OpenFOAM  3  December 1, 2012 05:11 
Pressure instability with rhoSimpleFoam  daniel_mills  OpenFOAM Running, Solving & CFD  44  February 17, 2011 18:08 
Cyclic BC's: Possible face ordering problem? (Channel flow)  sega  OpenFOAM Native Meshers: blockMesh  3  September 28, 2010 12:46 
Recommended setup for cyclic turbomachinery computations  hani  OpenFOAM Running, Solving & CFD  5  January 25, 2006 04:11 