/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\/ 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 3 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, see . \*---------------------------------------------------------------------------*/ #include "basicThermo.H" /* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ namespace Foam { defineTypeNameAndDebug(basicThermo, 0); defineRunTimeSelectionTable(basicThermo, fvMesh); } const Foam::word Foam::basicThermo::dictName("thermophysicalProperties"); // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::volScalarField& Foam::basicThermo::lookupOrConstruct ( const fvMesh& mesh, const char* name ) const { if (!mesh.objectRegistry::foundObject(name)) { volScalarField* fPtr ( new volScalarField ( IOobject ( name, mesh.time().timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ) ); // Transfer ownership of this object to the objectRegistry fPtr->store(fPtr); } return const_cast ( mesh.objectRegistry::lookupObject(name) ); } Foam::basicThermo::basicThermo ( const fvMesh& mesh, const word& phaseName ) : IOdictionary ( IOobject ( phasePropertyName(dictName, phaseName), mesh.time().constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ) ), phaseName_(phaseName), p_(lookupOrConstruct(mesh, "p")), T_ ( IOobject ( phasePropertyName("T"), mesh.time().timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ), alpha_ ( IOobject ( phasePropertyName("thermo:alpha"), mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, dimensionSet(1, -1, -1, 0, 0) ), dpdt_(lookupOrDefault("dpdt", true)) {} Foam::basicThermo::basicThermo ( const fvMesh& mesh, const dictionary& dict, const word& phaseName ) : IOdictionary ( IOobject ( phasePropertyName(dictName, phaseName), mesh.time().constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), dict ), phaseName_(phaseName), p_(lookupOrConstruct(mesh, "p")), T_ ( IOobject ( phasePropertyName("T"), mesh.time().timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ), alpha_ ( IOobject ( phasePropertyName("thermo:alpha"), mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, dimensionSet(1, -1, -1, 0, 0) ) {} // * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // Foam::autoPtr Foam::basicThermo::New ( const fvMesh& mesh, const word& phaseName ) { return New(mesh, phaseName); } // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // Foam::basicThermo::~basicThermo() {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // const Foam::basicThermo& Foam::basicThermo::lookupThermo ( const fvPatchScalarField& pf ) { if (pf.db().foundObject(dictName)) { return pf.db().lookupObject(dictName); } else { HashTable thermos = pf.db().lookupClass(); for ( HashTable::iterator iter = thermos.begin(); iter != thermos.end(); ++iter ) { if ( &(iter()->he().dimensionedInternalField()) == &(pf.dimensionedInternalField()) ) { return *iter(); } } } return pf.db().lookupObject(dictName); } void Foam::basicThermo::validate ( const string& app, const word& a ) const { if (!(he().name() == phasePropertyName(a))) { FatalErrorIn(app) << "Supported energy type is " << phasePropertyName(a) << ", thermodynamics package provides " << he().name() << exit(FatalError); } } void Foam::basicThermo::validate ( const string& app, const word& a, const word& b ) const { if ( !( he().name() == phasePropertyName(a) || he().name() == phasePropertyName(b) ) ) { FatalErrorIn(app) << "Supported energy types are " << phasePropertyName(a) << " and " << phasePropertyName(b) << ", thermodynamics package provides " << he().name() << exit(FatalError); } } void Foam::basicThermo::validate ( const string& app, const word& a, const word& b, const word& c ) const { if ( !( he().name() == phasePropertyName(a) || he().name() == phasePropertyName(b) || he().name() == phasePropertyName(c) ) ) { FatalErrorIn(app) << "Supported energy types are " << phasePropertyName(a) << ", " << phasePropertyName(b) << " and " << phasePropertyName(c) << ", thermodynamics package provides " << he().name() << exit(FatalError); } } void Foam::basicThermo::validate ( const string& app, const word& a, const word& b, const word& c, const word& d ) const { if ( !( he().name() == phasePropertyName(a) || he().name() == phasePropertyName(b) || he().name() == phasePropertyName(c) || he().name() == phasePropertyName(d) ) ) { FatalErrorIn(app) << "Supported energy types are " << phasePropertyName(a) << ", " << phasePropertyName(b) << ", " << phasePropertyName(c) << " and " << phasePropertyName(d) << ", thermodynamics package provides " << he().name() << exit(FatalError); } } Foam::wordList Foam::basicThermo::splitThermoName ( const word& thermoName, const int nCmpt ) { wordList cmpts(nCmpt); string::size_type beg=0, end=0, endb=0, endc=0; int i = 0; while ( (endb = thermoName.find('<', beg)) != string::npos || (endc = thermoName.find(',', beg)) != string::npos ) { if (endb == string::npos) { end = endc; } else if ((endc = thermoName.find(',', beg)) != string::npos) { end = min(endb, endc); } else { end = endb; } if (beg < end) { cmpts[i] = thermoName.substr(beg, end-beg); cmpts[i++].replaceAll(">",""); } beg = end + 1; } if (beg < thermoName.size()) { cmpts[i] = thermoName.substr(beg, string::npos); cmpts[i++].replaceAll(">",""); } return cmpts; } Foam::volScalarField& Foam::basicThermo::p() { return p_; } const Foam::volScalarField& Foam::basicThermo::p() const { return p_; } const Foam::volScalarField& Foam::basicThermo::T() const { return T_; } const Foam::volScalarField& Foam::basicThermo::alpha() const { return alpha_; } bool Foam::basicThermo::read() { return regIOobject::read(); } // ************************************************************************* //