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

boundaryFoam.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     boundaryFoam
00026 
00027 Description
00028     Steady-state solver for 1D turbulent flow, typically to generate boundary
00029     layer conditions at an inlet, for use in a simulation.
00030 
00031     Boundary layer code to calculate the U, k and epsilon distributions.
00032     Used to create inlet boundary conditions for experimental comparisons
00033     for which U and k have not been measured.
00034     Turbulence model is runtime selectable.
00035 
00036 Usage
00037     - boundaryFoam [OPTION]
00038 
00039     @param -case <dir> \n
00040     Specify the case directory
00041 
00042     @param -parallel \n
00043     Run the case in parallel
00044 
00045     @param -help \n
00046     Display short usage message
00047 
00048     @param -doc \n
00049     Display Doxygen documentation page
00050 
00051     @param -srcDoc \n
00052     Display source code
00053 
00054 \*---------------------------------------------------------------------------*/
00055 
00056 #include <finiteVolume/fvCFD.H>
00057 #include <incompressibleTransportModels/singlePhaseTransportModel.H>
00058 #include <incompressibleRASModels/RASModel.H>
00059 #include <finiteVolume/wallFvPatch.H>
00060 #include <sampling/makeGraph.H>
00061 
00062 
00063 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00064 
00065 int main(int argc, char *argv[])
00066 {
00067     #include <OpenFOAM/setRootCase.H>
00068 
00069     #include <OpenFOAM/createTime.H>
00070     #include <OpenFOAM/createMesh.H>
00071     #include "createFields.H"
00072 
00073     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
00074 
00075     Info<< "\nStarting time loop\n" << endl;
00076 
00077     while (runTime.loop())
00078     {
00079         Info<< "Time = " << runTime.timeName() << nl << endl;
00080 
00081         fvVectorMatrix divR = turbulence->divDevReff(U);
00082         divR.source() = flowMask & divR.source();
00083 
00084         fvVectorMatrix UEqn
00085         (
00086             divR == gradP
00087         );
00088 
00089         UEqn.relax();
00090 
00091         UEqn.solve();
00092 
00093 
00094         // Correct driving force for a constant mass flow rate
00095 
00096         dimensionedVector UbarStar = flowMask & U.weightedAverage(mesh.V());
00097 
00098         U += (Ubar - UbarStar);
00099         gradP += (Ubar - UbarStar)/(1.0/UEqn.A())().weightedAverage(mesh.V());
00100 
00101         label id = y.size() - 1;
00102 
00103         scalar wallShearStress =
00104             flowDirection & turbulence->R()()[id] & wallNormal;
00105 
00106         scalar yplusWall
00107 //            = ::sqrt(mag(wallShearStress))*y[id]/laminarTransport.nu()()[id];
00108             = ::sqrt(mag(wallShearStress))*y[id]/turbulence->nuEff()()[id];
00109 
00110         Info<< "Uncorrected Ubar = " << (flowDirection & UbarStar.value())<< tab
00111             << "pressure gradient = " << (flowDirection & gradP.value()) << tab
00112             << "min y+ = " << yplusWall << endl;
00113 
00114 
00115         turbulence->correct();
00116 
00117 
00118         if (runTime.outputTime())
00119         {
00120             volSymmTensorField R
00121             (
00122                 IOobject
00123                 (
00124                     "R",
00125                     runTime.timeName(),
00126                     mesh,
00127                     IOobject::NO_READ,
00128                     IOobject::AUTO_WRITE
00129                 ),
00130                 turbulence->R()
00131             );
00132 
00133             runTime.write();
00134 
00135             const word& gFormat = runTime.graphFormat();
00136 
00137             makeGraph(y, flowDirection & U, "Uf", gFormat);
00138 
00139             makeGraph(y, laminarTransport.nu(), gFormat);
00140 
00141             makeGraph(y, turbulence->k(), gFormat);
00142             makeGraph(y, turbulence->epsilon(), gFormat);
00143 
00144             //makeGraph(y, flowDirection & R & flowDirection, "Rff", gFormat);
00145             //makeGraph(y, wallNormal & R & wallNormal, "Rww", gFormat);
00146             //makeGraph(y, flowDirection & R & wallNormal, "Rfw", gFormat);
00147 
00148             //makeGraph(y, sqrt(R.component(tensor::XX)), "u", gFormat);
00149             //makeGraph(y, sqrt(R.component(tensor::YY)), "v", gFormat);
00150             //makeGraph(y, sqrt(R.component(tensor::ZZ)), "w", gFormat);
00151             makeGraph(y, R.component(tensor::XY), "uv", gFormat);
00152 
00153             makeGraph(y, mag(fvc::grad(U)), "gammaDot", gFormat);
00154         }
00155 
00156         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
00157             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
00158             << nl << endl;
00159     }
00160 
00161     Info<< "End\n" << endl;
00162 
00163     return 0;
00164 }
00165 
00166 
00167 // ************************ vim: set sw=4 sts=4 et: ************************ //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines