FreeFOAM The Cross-Platform CFD Toolkit
Hosted by SourceForge:
Get FreeFOAM at SourceForge.net.
            Fast, secure and Free Open Source software downloads

pisoFoam.C

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002   =========                 |
00003   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
00004    \\    /   O peration     |
00005     \\  /    A nd           | Copyright (C) 1991-2010 OpenCFD Ltd.
00006      \\/     M anipulation  |
00007 -------------------------------------------------------------------------------
00008 License
00009     This file is part of OpenFOAM.
00010 
00011     OpenFOAM is free software: you can redistribute it and/or modify it
00012     under the terms of the GNU General Public License as published by
00013     the Free Software Foundation, either version 3 of the License, or
00014     (at your option) any later version.
00015 
00016     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
00017     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
00019     for more details.
00020 
00021     You should have received a copy of the GNU General Public License
00022     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
00023 
00024 Application
00025     pisoFoam
00026 
00027 Description
00028     Transient solver for incompressible flow.
00029 
00030     Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.
00031 
00032 Usage
00033     - pisoFoam [OPTION]
00034 
00035     @param -case <dir> \n
00036     Specify the case directory
00037 
00038     @param -parallel \n
00039     Run the case in parallel
00040 
00041     @param -help \n
00042     Display short usage message
00043 
00044     @param -doc \n
00045     Display Doxygen documentation page
00046 
00047     @param -srcDoc \n
00048     Display source code
00049 
00050 \*---------------------------------------------------------------------------*/
00051 
00052 #include <finiteVolume/fvCFD.H>
00053 #include <incompressibleTransportModels/singlePhaseTransportModel.H>
00054 #include <incompressibleTurbulenceModel/turbulenceModel.H>
00055 
00056 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00057 
00058 int main(int argc, char *argv[])
00059 {
00060     #include <OpenFOAM/setRootCase.H>
00061 
00062     #include <OpenFOAM/createTime.H>
00063     #include <OpenFOAM/createMesh.H>
00064     #include "createFields.H"
00065     #include <finiteVolume/initContinuityErrs.H>
00066 
00067     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00068 
00069     Info<< "\nStarting time loop\n" << endl;
00070 
00071     while (runTime.loop())
00072     {
00073         Info<< "Time = " << runTime.timeName() << nl << endl;
00074 
00075         #include <finiteVolume/readPISOControls.H>
00076         #include <finiteVolume/CourantNo.H>
00077 
00078         // Pressure-velocity PISO corrector
00079         {
00080             // Momentum predictor
00081 
00082             fvVectorMatrix UEqn
00083             (
00084                 fvm::ddt(U)
00085               + fvm::div(phi, U)
00086               + turbulence->divDevReff(U)
00087             );
00088 
00089             UEqn.relax();
00090 
00091             if (momentumPredictor)
00092             {
00093                 solve(UEqn == -fvc::grad(p));
00094             }
00095 
00096             // --- PISO loop
00097 
00098             for (int corr=0; corr<nCorr; corr++)
00099             {
00100                 volScalarField rUA = 1.0/UEqn.A();
00101 
00102                 U = rUA*UEqn.H();
00103                 phi = (fvc::interpolate(U) & mesh.Sf())
00104                     + fvc::ddtPhiCorr(rUA, U, phi);
00105 
00106                 adjustPhi(phi, U, p);
00107 
00108                 // Non-orthogonal pressure corrector loop
00109                 for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
00110                 {
00111                     // Pressure corrector
00112 
00113                     fvScalarMatrix pEqn
00114                     (
00115                         fvm::laplacian(rUA, p) == fvc::div(phi)
00116                     );
00117 
00118                     pEqn.setReference(pRefCell, pRefValue);
00119 
00120                     if
00121                     (
00122                         corr == nCorr-1
00123                      && nonOrth == nNonOrthCorr
00124                     )
00125                     {
00126                         pEqn.solve(mesh.solver("pFinal"));
00127                     }
00128                     else
00129                     {
00130                         pEqn.solve();
00131                     }
00132 
00133                     if (nonOrth == nNonOrthCorr)
00134                     {
00135                         phi -= pEqn.flux();
00136                     }
00137                 }
00138 
00139                 #include <finiteVolume/continuityErrs.H>
00140 
00141                 U -= rUA*fvc::grad(p);
00142                 U.correctBoundaryConditions();
00143             }
00144         }
00145 
00146         turbulence->correct();
00147 
00148         runTime.write();
00149 
00150         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
00151             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
00152             << nl << endl;
00153     }
00154 
00155     Info<< "End\n" << endl;
00156 
00157     return 0;
00158 }
00159 
00160 
00161 // ************************ vim: set sw=4 sts=4 et: ************************ //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines