View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002052 | OpenFOAM | Patch | public | 2016-04-15 20:34 | 2016-04-16 18:45 |
Reporter | jurich | Assigned To | henry | ||
Priority | normal | Severity | minor | Reproducibility | sometimes |
Status | resolved | Resolution | fixed | ||
Platform | GNU/Linux | OS | Ubuntu | OS Version | 14.04 |
Product Version | dev | ||||
Summary | 0002052: Incomplete implementation of QrPrevious_ in externalWallHeatFluxTemperatureFvPatchScalarField.C | ||||
Description | The QrPrevious_ field isn't fully implemented, so it doesn't correctly map when using reconstructPar. The following changes fixed the issue for me (in externalWallHeatFluxTemperatureFvPatchScalarField.C): (a) line 73 change to: QrPrevious_(p.size(),0.0), (b) add QrPrevious_.autoMap(m); after line 230 and (c) add QrPrevious_.rmap(tiptf.QrPrevious_, addr); after line 247. | ||||
Tags | No tags attached. | ||||
|
externalWallHeatFluxTemperatureFvPatchScalarField.C (10,634 bytes)
/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 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 <http://www.gnu.org/licenses/>. \*---------------------------------------------------------------------------*/ #include "externalWallHeatFluxTemperatureFvPatchScalarField.H" #include "addToRunTimeSelectionTable.H" #include "fvPatchFieldMapper.H" #include "volFields.H" #include "mappedPatchBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { template<> const char* NamedEnum < externalWallHeatFluxTemperatureFvPatchScalarField::operationMode, 3 >::names[] = { "fixed_heat_flux", "fixed_heat_transfer_coefficient", "unknown" }; } // End namespace Foam const Foam::NamedEnum < Foam::externalWallHeatFluxTemperatureFvPatchScalarField::operationMode, 3 > Foam::externalWallHeatFluxTemperatureFvPatchScalarField::operationModeNames; // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::externalWallHeatFluxTemperatureFvPatchScalarField:: externalWallHeatFluxTemperatureFvPatchScalarField ( const fvPatch& p, const DimensionedField<scalar, volMesh>& iF ) : mixedFvPatchScalarField(p, iF), temperatureCoupledBase(patch(), "undefined", "undefined", "undefined-K"), mode_(unknown), q_(p.size(), 0.0), h_(p.size(), 0.0), Ta_(p.size(), 0.0), QrPrevious_(p.size(), 0.0), QrRelaxation_(1), QrName_("undefined-Qr"), thicknessLayers_(), kappaLayers_() { refValue() = 0.0; refGrad() = 0.0; valueFraction() = 1.0; } Foam::externalWallHeatFluxTemperatureFvPatchScalarField:: externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField& ptf, const fvPatch& p, const DimensionedField<scalar, volMesh>& iF, const fvPatchFieldMapper& mapper ) : mixedFvPatchScalarField(ptf, p, iF, mapper), temperatureCoupledBase(patch(), ptf), mode_(ptf.mode_), q_(ptf.q_, mapper), h_(ptf.h_, mapper), Ta_(ptf.Ta_, mapper), QrPrevious_(ptf.QrPrevious_, mapper), QrRelaxation_(ptf.QrRelaxation_), QrName_(ptf.QrName_), thicknessLayers_(ptf.thicknessLayers_), kappaLayers_(ptf.kappaLayers_) {} Foam::externalWallHeatFluxTemperatureFvPatchScalarField:: externalWallHeatFluxTemperatureFvPatchScalarField ( const fvPatch& p, const DimensionedField<scalar, volMesh>& iF, const dictionary& dict ) : mixedFvPatchScalarField(p, iF), temperatureCoupledBase(patch(), dict), mode_(unknown), q_(p.size(), 0.0), h_(p.size(), 0.0), Ta_(p.size(), 0.0), QrPrevious_(p.size(), 0.0), QrRelaxation_(dict.lookupOrDefault<scalar>("relaxation", 1)), QrName_(dict.lookupOrDefault<word>("Qr", "none")), thicknessLayers_(), kappaLayers_() { if (dict.found("q") && !dict.found("h") && !dict.found("Ta")) { mode_ = fixedHeatFlux; q_ = scalarField("q", dict, p.size()); } else if (dict.found("h") && dict.found("Ta") && !dict.found("q")) { mode_ = fixedHeatTransferCoeff; h_ = scalarField("h", dict, p.size()); Ta_ = scalarField("Ta", dict, p.size()); if (dict.found("thicknessLayers")) { dict.lookup("thicknessLayers") >> thicknessLayers_; dict.lookup("kappaLayers") >> kappaLayers_; } } else { FatalErrorInFunction << "\n patch type '" << p.type() << "' either q or h and Ta were not found '" << "\n for patch " << p.name() << " of field " << dimensionedInternalField().name() << " in file " << dimensionedInternalField().objectPath() << exit(FatalError); } fvPatchScalarField::operator=(scalarField("value", dict, p.size())); if (dict.found("QrPrevious")) { QrPrevious_ = scalarField("QrPrevious", dict, p.size()); } if (dict.found("refValue")) { // Full restart refValue() = scalarField("refValue", dict, p.size()); refGrad() = scalarField("refGradient", dict, p.size()); valueFraction() = scalarField("valueFraction", dict, p.size()); } else { // Start from user entered data. Assume fixedValue. refValue() = *this; refGrad() = 0.0; valueFraction() = 1.0; } } Foam::externalWallHeatFluxTemperatureFvPatchScalarField:: externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField& tppsf ) : mixedFvPatchScalarField(tppsf), temperatureCoupledBase(tppsf), mode_(tppsf.mode_), q_(tppsf.q_), h_(tppsf.h_), Ta_(tppsf.Ta_), QrPrevious_(tppsf.QrPrevious_), QrRelaxation_(tppsf.QrRelaxation_), QrName_(tppsf.QrName_), thicknessLayers_(tppsf.thicknessLayers_), kappaLayers_(tppsf.kappaLayers_) {} Foam::externalWallHeatFluxTemperatureFvPatchScalarField:: externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField& tppsf, const DimensionedField<scalar, volMesh>& iF ) : mixedFvPatchScalarField(tppsf, iF), temperatureCoupledBase(patch(), tppsf), mode_(tppsf.mode_), q_(tppsf.q_), h_(tppsf.h_), Ta_(tppsf.Ta_), QrPrevious_(tppsf.QrPrevious_), QrRelaxation_(tppsf.QrRelaxation_), QrName_(tppsf.QrName_), thicknessLayers_(tppsf.thicknessLayers_), kappaLayers_(tppsf.kappaLayers_) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::externalWallHeatFluxTemperatureFvPatchScalarField::autoMap ( const fvPatchFieldMapper& m ) { mixedFvPatchScalarField::autoMap(m); q_.autoMap(m); h_.autoMap(m); Ta_.autoMap(m); QrPrevious_.autoMap(m); } void Foam::externalWallHeatFluxTemperatureFvPatchScalarField::rmap ( const fvPatchScalarField& ptf, const labelList& addr ) { mixedFvPatchScalarField::rmap(ptf, addr); const externalWallHeatFluxTemperatureFvPatchScalarField& tiptf = refCast<const externalWallHeatFluxTemperatureFvPatchScalarField>(ptf); q_.rmap(tiptf.q_, addr); h_.rmap(tiptf.h_, addr); Ta_.rmap(tiptf.Ta_, addr); QrPrevious_.rmap(tiptf.QrPrevious_, addr); } void Foam::externalWallHeatFluxTemperatureFvPatchScalarField::updateCoeffs() { if (updated()) { return; } const scalarField Tp(*this); scalarField hp(patch().size(), 0.0); scalarField Qr(Tp.size(), 0.0); if (QrName_ != "none") { Qr = patch().lookupPatchField<volScalarField, scalar>(QrName_); Qr = QrRelaxation_*Qr + (1.0 - QrRelaxation_)*QrPrevious_; QrPrevious_ = Qr; } switch (mode_) { case fixedHeatFlux: { refGrad() = (q_ + Qr)/kappa(Tp); refValue() = 0.0; valueFraction() = 0.0; break; } case fixedHeatTransferCoeff: { scalar totalSolidRes = 0.0; if (thicknessLayers_.size() > 0) { forAll(thicknessLayers_, iLayer) { const scalar l = thicknessLayers_[iLayer]; if (kappaLayers_[iLayer] > 0.0) { totalSolidRes += l/kappaLayers_[iLayer]; } } } hp = 1.0/(1.0/h_ + totalSolidRes); Qr /= Tp; refGrad() = 0.0; refValue() = hp*Ta_/(hp - Qr); valueFraction() = (hp - Qr)/((hp - Qr) + kappa(Tp)*patch().deltaCoeffs()); break; } default: { FatalErrorInFunction << "Illegal heat flux mode " << operationModeNames[mode_] << exit(FatalError); } } mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(kappa(Tp)*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " :" << " heat transfer rate:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } } void Foam::externalWallHeatFluxTemperatureFvPatchScalarField::write ( Ostream& os ) const { mixedFvPatchScalarField::write(os); temperatureCoupledBase::write(os); QrPrevious_.writeEntry("QrPrevious", os); os.writeKeyword("Qr")<< QrName_ << token::END_STATEMENT << nl; os.writeKeyword("relaxation")<< QrRelaxation_ << token::END_STATEMENT << nl; switch (mode_) { case fixedHeatFlux: { q_.writeEntry("q", os); break; } case fixedHeatTransferCoeff: { h_.writeEntry("h", os); Ta_.writeEntry("Ta", os); thicknessLayers_.writeEntry("thicknessLayers", os); kappaLayers_.writeEntry("kappaLayers", os); break; } default: { FatalErrorInFunction << "Illegal heat flux mode " << operationModeNames[mode_] << abort(FatalError); } } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { makePatchTypeField ( fvPatchScalarField, externalWallHeatFluxTemperatureFvPatchScalarField ); } // ************************************************************************* // |
|
externalWallHeatFluxTemperatureFvPatchScalarField.H (8,122 bytes)
/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 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 <http://www.gnu.org/licenses/>. Class Foam::externalWallHeatFluxTemperatureFvPatchScalarField Group grpThermoBoundaryConditions grpWallBoundaryConditions Description This boundary condition supplies a heat flux condition for temperature on an external wall. Optional thin thermal layer resistances can be specified through thicknessLayers and kappaLayers entries for the fixed heat transfer coefficient mode. The condition can operate in two modes: - fixed heat transfer coefficient: supply h and Ta - fixed heat flux: supply q where: \vartable h | heat transfer coefficient [W/m^2/K] Ta | ambient temperature [K] q | heat flux [W/m^2] \endvartable The thermal conductivity, \c kappa, can either be retrieved from the mesh database using the \c lookup option, or from a \c solidThermo thermophysical package. \heading Patch usage \table Property | Description | Required | Default value kappa | thermal conductivity option | yes | q | heat flux [W/m^2] | yes* | Ta | ambient temperature [K] | yes* | h | heat transfer coefficient [W/m^2/K] | yes*| thicknessLayers | list of thicknesses per layer [m] | yes | kappaLayers | list of thermal conductivites per layer [W/m/K] | yes | kappaName | name of thermal conductivity field | yes | Qr | name of the radiative field | no | no relaxation | relaxation factor for radiative field | no | 1 \endtable Example of the boundary condition specification: \verbatim myPatch { type externalWallHeatFluxTemperature; kappa fluidThermo; q uniform 1000; Ta uniform 300.0; h uniform 10.0; thicknessLayers (0.1 0.2 0.3 0.4); kappaLayers (1 2 3 4); value uniform 300.0; kappaName none; Qr none; relaxation 1; } \endverbatim Note: \li Only supply \c h and \c Ta, or \c q in the dictionary (see above) \li \c kappa and \c kappaName are inherited from temperatureCoupledBase. SeeAlso Foam::temperatureCoupledBase SourceFiles externalWallHeatFluxTemperatureFvPatchScalarField.C \*---------------------------------------------------------------------------*/ #ifndef solidWallHeatFluxTemperatureFvPatchScalarField_H #define solidWallHeatFluxTemperatureFvPatchScalarField_H #include "mixedFvPatchFields.H" #include "temperatureCoupledBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class externalWallHeatFluxTemperatureFvPatchScalarField Declaration \*---------------------------------------------------------------------------*/ class externalWallHeatFluxTemperatureFvPatchScalarField : public mixedFvPatchScalarField, public temperatureCoupledBase { public: // Public data //- Operation mode enumeration enum operationMode { fixedHeatFlux, fixedHeatTransferCoeff, unknown }; static const NamedEnum<operationMode, 3> operationModeNames; private: // Private data //- Operation mode operationMode mode_; //- Heat flux / [W/m2] scalarField q_; //- Heat transfer coefficient / [W/m2K] scalarField h_; //- Ambient temperature / [K] scalarField Ta_; //- Chache Qr for relaxation scalarField QrPrevious_; //- Relaxation for Qr scalar QrRelaxation_; //- Name of the radiative heat flux const word QrName_; //- Thickness of layers scalarList thicknessLayers_; //- Conductivity of layers scalarList kappaLayers_; public: //- Runtime type information TypeName("externalWallHeatFluxTemperature"); // Constructors //- Construct from patch and internal field externalWallHeatFluxTemperatureFvPatchScalarField ( const fvPatch&, const DimensionedField<scalar, volMesh>& ); //- Construct from patch, internal field and dictionary externalWallHeatFluxTemperatureFvPatchScalarField ( const fvPatch&, const DimensionedField<scalar, volMesh>&, const dictionary& ); //- Construct by mapping given // externalWallHeatFluxTemperatureFvPatchScalarField // onto a new patch externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField&, const fvPatch&, const DimensionedField<scalar, volMesh>&, const fvPatchFieldMapper& ); //- Construct as copy externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField& ); //- Construct and return a clone virtual tmp<fvPatchScalarField> clone() const { return tmp<fvPatchScalarField> ( new externalWallHeatFluxTemperatureFvPatchScalarField(*this) ); } //- Construct as copy setting internal field reference externalWallHeatFluxTemperatureFvPatchScalarField ( const externalWallHeatFluxTemperatureFvPatchScalarField&, const DimensionedField<scalar, volMesh>& ); //- Construct and return a clone setting internal field reference virtual tmp<fvPatchScalarField> clone ( const DimensionedField<scalar, volMesh>& iF ) const { return tmp<fvPatchScalarField> ( new externalWallHeatFluxTemperatureFvPatchScalarField(*this, iF) ); } // Member functions // Mapping functions //- Map (and resize as needed) from self given a mapping object virtual void autoMap ( const fvPatchFieldMapper& ); //- Reverse map the given fvPatchField onto this fvPatchField virtual void rmap ( const fvPatchScalarField&, const labelList& ); // Evaluation functions //- Update the coefficients associated with the patch field virtual void updateCoeffs(); // I-O //- Write void write(Ostream&) const; }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* // |
|
@Jurich: Many thanks for the report! The changes are consistent with what's done with the sibling field variables, therefore I only made the changes and tested if it built. If you could provide a modified tutorial case from OpenFOAM to use this boundary condition, it would be great for ensuring that this doesn't happen again in the future (in case this boundary condition gets new features). @Henry: Attached at the files with the fixes that Jurich proposed, which make perfect sense given that it's a scalar field like the sibling variables "q_", "h_" and "Ta_". The files are meant for the folder "src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/externalWallHeatFluxTemperature/". I also updated a little bit the description in the header file, to make it consistent with the other "turbulentTemperature*" classes for which I had provided updates some weeks ago, because all of them derive from "temperatureCoupledBase". |
|
Thanks Resolved by commit eda27b9e7513f33117ddc3ec0ae8b5d4c649fcb7 |
Date Modified | Username | Field | Change |
---|---|---|---|
2016-04-15 20:34 | jurich | New Issue | |
2016-04-16 16:06 | wyldckat | File Added: externalWallHeatFluxTemperatureFvPatchScalarField.C | |
2016-04-16 16:06 | wyldckat | File Added: externalWallHeatFluxTemperatureFvPatchScalarField.H | |
2016-04-16 16:12 | wyldckat | Note Added: 0006127 | |
2016-04-16 16:13 | wyldckat | Assigned To | => henry |
2016-04-16 16:13 | wyldckat | Status | new => assigned |
2016-04-16 18:45 | henry | Note Added: 0006129 | |
2016-04-16 18:45 | henry | Status | assigned => resolved |
2016-04-16 18:45 | henry | Resolution | open => fixed |