1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright held by original author
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 applyWallFunctionBounaryConditions
29 Updates OpenFOAM RAS cases to use the new (v1.6) wall function framework
31 Attempts to determine whether case is compressible or incompressible, or
32 can be supplied with -compressible command line argument
34 \*---------------------------------------------------------------------------*/
39 #include "volFields.H"
40 #include "surfaceFields.H"
42 #include "incompressible/RAS/derivedFvPatchFields/wallFunctions/epsilonWallFunctions/epsilonWallFunction/epsilonWallFunctionFvPatchScalarField.H"
43 #include "incompressible/RAS/derivedFvPatchFields/wallFunctions/kqRWallFunctions/kqRWallFunction/kqRWallFunctionFvPatchField.H"
44 #include "incompressible/RAS/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutWallFunction/nutWallFunctionFvPatchScalarField.H"
45 #include "incompressible/RAS/derivedFvPatchFields/wallFunctions/omegaWallFunctions/omegaWallFunction/omegaWallFunctionFvPatchScalarField.H"
47 #include "compressible/RAS/derivedFvPatchFields/wallFunctions/epsilonWallFunctions/epsilonWallFunction/epsilonWallFunctionFvPatchScalarField.H"
48 #include "compressible/RAS/derivedFvPatchFields/wallFunctions/kqRWallFunctions/kqRWallFunction/kqRWallFunctionFvPatchField.H"
49 #include "compressible/RAS/derivedFvPatchFields/wallFunctions/mutWallFunctions/mutWallFunction/mutWallFunctionFvPatchScalarField.H"
50 #include "compressible/RAS/derivedFvPatchFields/wallFunctions/omegaWallFunctions/omegaWallFunction/omegaWallFunctionFvPatchScalarField.H"
54 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
56 bool caseIsCompressible(const fvMesh& mesh)
62 mesh.time().timeName(),
68 if (phiHeader.headerOk())
70 surfaceScalarField phi(phiHeader, mesh);
71 if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
77 // Attempt density field
81 mesh.time().timeName(),
87 if (rhoHeader.headerOk())
89 volScalarField rho(rhoHeader, mesh);
90 if (rho.dimensions() == dimDensity)
96 // Attempt pressure field
100 mesh.time().timeName(),
106 if (pHeader.headerOk())
108 volScalarField p(pHeader, mesh);
109 if (p.dimensions() == dimMass/sqr(dimTime)/dimLength)
115 // If none of the above are true, assume that the case is incompressible
120 void createVolScalarField
123 const word& fieldName,
124 const dimensionSet& dims
130 mesh.time().timeName(),
136 if (!fieldHeader.headerOk())
138 Info<< "Creating field " << fieldName << nl << endl;
145 mesh.time().timeName(),
151 dimensionedScalar("zero", dims, 0.0)
159 void replaceBoundaryType
162 const word& fieldName,
163 const word& boundaryType,
164 const string& boundaryValue
170 mesh.time().timeName(),
176 if (!header.headerOk())
181 Info<< "Updating boundary types for field " << header.name() << endl;
183 const word oldTypeName = IOdictionary::typeName;
184 const_cast<word&>(IOdictionary::typeName) = word::null;
186 IOdictionary dict(header);
188 const_cast<word&>(IOdictionary::typeName) = oldTypeName;
189 const_cast<word&>(dict.type()) = dict.headerClassName();
191 // Make a backup of the old field
192 word backupName(dict.name() + ".old");
193 Info<< " copying " << dict.name() << " to "
194 << backupName << endl;
195 IOdictionary dictOld = dict;
196 dictOld.rename(backupName);
197 dictOld.regIOobject::write();
199 // Loop through boundary patches and update
200 const polyBoundaryMesh& bMesh = mesh.boundaryMesh();
201 dictionary& boundaryDict = dict.subDict("boundaryField");
202 forAll(bMesh, patchI)
204 if (bMesh[patchI].isWall())
206 word patchName = bMesh[patchI].name();
207 dictionary& oldPatch = boundaryDict.subDict(patchName);
209 dictionary newPatch(dictionary::null);
210 newPatch.add("type", boundaryType);
211 newPatch.add("value", ("uniform " + boundaryValue).c_str());
217 Info<< " writing updated " << dict.name() << nl << endl;
218 dict.regIOobject::write();
222 void updateCompressibleCase(const fvMesh& mesh)
224 Info<< "Case treated as compressible" << nl << endl;
229 dimArea/dimTime*dimDensity
235 compressible::RASModels::mutWallFunctionFvPatchScalarField::typeName,
242 compressible::RASModels::epsilonWallFunctionFvPatchScalarField::
250 compressible::RASModels::omegaWallFunctionFvPatchScalarField::typeName,
257 compressible::RASModels::kqRWallFunctionFvPatchField<scalar>::typeName,
264 compressible::RASModels::kqRWallFunctionFvPatchField<scalar>::typeName,
271 compressible::RASModels::kqRWallFunctionFvPatchField<symmTensor>::
278 void updateIncompressibleCase(const fvMesh& mesh)
280 Info<< "Case treated as incompressible" << nl << endl;
281 createVolScalarField(mesh, "nut", dimArea/dimTime);
287 incompressible::RASModels::nutWallFunctionFvPatchScalarField::typeName,
294 incompressible::RASModels::epsilonWallFunctionFvPatchScalarField::
302 incompressible::RASModels::omegaWallFunctionFvPatchScalarField::
310 incompressible::RASModels::kqRWallFunctionFvPatchField<scalar>::
318 incompressible::RASModels::kqRWallFunctionFvPatchField<scalar>::
326 incompressible::RASModels::kqRWallFunctionFvPatchField<symmTensor>::
333 int main(int argc, char *argv[])
335 #include "addTimeOptions.H"
336 argList::validOptions.insert("compressible", "");
338 #include "setRootCase.H"
339 #include "createTime.H"
340 #include "createMesh.H"
342 bool compressible = args.optionFound("compressible");
344 Info<< "Updating turbulence fields to operate using new run time "
345 << "selectable" << nl << "wall functions"
348 if (compressible || caseIsCompressible(mesh))
350 updateCompressibleCase(mesh);
354 updateIncompressibleCase(mesh);
357 Info<< "End\n" << endl;
363 // ************************************************************************* //