void calcCompressibleYPlus ( const fvMesh& mesh, const Time& runTime, const volVectorField& U, volScalarField& yPlus ) { IOobject rhoHeader ( "rho", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ); if (!rhoHeader.headerOk()) { Info<< " no rho field" << endl; return; } Info<< "Reading field rho\n" << endl; volScalarField rho(rhoHeader, mesh); #include "compressibleCreatePhi.H" autoPtr<fluidThermo> pThermo(fluidThermo::New(mesh)); fluidThermo& thermo = pThermo(); autoPtr<compressible::turbulenceModel> turbulenceModel ( compressible::turbulenceModel::New ( rho, U, phi, thermo ) ); calcYPlus(turbulenceModel, mesh, U, yPlus); }
CompressibleFluidSolver::CompressibleFluidSolver( string name, shared_ptr<argList> args, shared_ptr<Time> runTime ) : foamFluidSolver( name, args, runTime ), pThermo ( basicPsiThermo::New( mesh ) ), thermo( pThermo() ), p( thermo.p() ), h( thermo.h() ), T( thermo.T() ), psi( thermo.psi() ), rho ( IOobject ( "rho", runTime->timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), thermo.rho() ), U ( IOobject ( "U", runTime->timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ), phi ( IOobject ( "phi", runTime->timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), linearInterpolate( rho * U ) & mesh.Sf() ), turbulence ( compressible::RASModel::New ( rho, U, phi, thermo ) ), Up ( IOobject ( "Up", runTime->timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, dimensionedVector4( "zero", dimless, vector4::zero ) ), DpDt( fvc::DDt( surfaceScalarField( "phiU", phi / fvc::interpolate( rho ) ), p ) ), ddtp( IOobject ( "ddtp", runTime->timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, dimensionedScalar( "zero", dimPressure / dimTime, 0.0 ) ), ddtrho( IOobject ( "ddtrho", runTime->timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, dimensionedScalar( "zero", dimDensity / dimTime, 0.0 ) ), cumulativeContErr( 0 ), convergenceTolerance( readScalar( mesh.solutionDict().subDict( "blockSolver" ).lookup( "convergenceTolerance" ) ) ), nOuterCorr( readLabel( mesh.solutionDict().subDict( "blockSolver" ).lookup( "nOuterCorrectors" ) ) ), acousticsPatchName( couplingProperties.lookup( "acousticsPatch" ) ), acousticsPatchID( mesh.boundaryMesh().findPatchID( acousticsPatchName ) ) { assert( nOuterCorr > 0 ); assert( convergenceTolerance < 1 ); assert( convergenceTolerance > 0 ); rho.oldTime(); h.oldTime(); U.oldTime(); p.oldTime(); // Ensure that the absolute tolerance of the linear solver is less than the // used convergence tolerance for the non-linear system. scalar absTolerance = readScalar( mesh.solutionDict().subDict( "solvers" ).subDict( "Up" ).lookup( "tolerance" ) ); assert( absTolerance < convergenceTolerance ); if ( absTolerance >= convergenceTolerance ) throw std::runtime_error( "The absolute tolerance for the linear solver Up should be smaller than blockSolver::convergenceTolerance in order to reach convergence of the non-linear system" ); }
void calcCompressibleYPlus ( const fvMesh& mesh, const Time& runTime, const volVectorField& U, volScalarField& yPlus ) { typedef compressible::RASModels::mutkWallFunctionFvPatchScalarField wallFunctionPatchField; IOobject rhoHeader ( "rho", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ); if (!rhoHeader.headerOk()) { Info<< " no rho field" << endl; return; } Info<< "Reading field rho\n" << endl; volScalarField rho(rhoHeader, mesh); #include "compressibleCreatePhi.H" autoPtr<basicThermo> pThermo ( basicThermo::New(mesh) ); basicThermo& thermo = pThermo(); autoPtr<compressible::RASModel> RASModel ( compressible::RASModel::New ( rho, U, phi, thermo ) ); const volScalarField::GeometricBoundaryField mutPatches = RASModel->mut()().boundaryField(); bool foundMutPatch = false; forAll(mutPatches, patchi) { if (isA<wallFunctionPatchField>(mutPatches[patchi])) { foundMutPatch = true; const wallFunctionPatchField& mutPw = dynamic_cast<const wallFunctionPatchField&> (mutPatches[patchi]); yPlus.boundaryField()[patchi] = mutPw.yPlus(); const scalarField& Yp = yPlus.boundaryField()[patchi]; Info<< "Patch " << patchi << " named " << mutPw.patch().name() << " y+ : min: " << gMin(Yp) << " max: " << gMax(Yp) << " average: " << gAverage(Yp) << nl << endl; } } if (!foundMutPatch) { Info<< " no " << wallFunctionPatchField::typeName << " patches" << endl; } }