From c84f2cee0af1e9b4d62fd362567eddec02f0f3c2 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Wed, 30 Jan 2013 15:55:57 +0000 Subject: [PATCH] ENH: Added new BC to interface with an external source using a mixed condition as a base --- src/finiteVolume/Make/files | 1 + .../externalCoupledMixedFvPatchField.C | 428 ++++++++++++++++++ .../externalCoupledMixedFvPatchField.H | 251 ++++++++++ .../externalCoupledMixedFvPatchFields.C | 42 ++ .../externalCoupledMixedFvPatchFields.H | 49 ++ .../externalCoupledMixedFvPatchFieldsFwd.H | 50 ++ 6 files changed, 821 insertions(+) create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.H create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.H create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFieldsFwd.H diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 47bdb976b3f..3bf9c8747d6 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -124,6 +124,7 @@ $(derivedFvPatchFields)/buoyantPressure/buoyantPressureFvPatchScalarField.C $(derivedFvPatchFields)/codedFixedValue/codedFixedValueFvPatchFields.C $(derivedFvPatchFields)/codedMixed/codedMixedFvPatchFields.C $(derivedFvPatchFields)/cylindricalInletVelocity/cylindricalInletVelocityFvPatchVectorField.C +$(derivedFvPatchFields)/externalCoupledMixed/externalCoupledMixedFvPatchFields.C $(derivedFvPatchFields)/fan/fanFvPatchFields.C $(derivedFvPatchFields)/fanPressure/fanPressureFvPatchScalarField.C $(derivedFvPatchFields)/fixedFluxPressure/fixedFluxPressureFvPatchScalarField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.C new file mode 100644 index 00000000000..ac38f37e58f --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.C @@ -0,0 +1,428 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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 "externalCoupledMixedFvPatchField.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" +#include "IFstream.H" +#include "OFstream.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template<class Type> +Foam::word Foam::externalCoupledMixedFvPatchField<Type>::lockName = "OpenFOAM"; + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class Type> +Foam::fileName Foam::externalCoupledMixedFvPatchField<Type>::baseDir() const +{ + word regionName(this->dimensionedInternalField().mesh().name()); + if (regionName == polyMesh::defaultRegion) + { + regionName = "."; + } + + return fileName(commsDir_/regionName/this->patch().name()); +} + + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::createLockFile() const +{ + if (log_) + { + Info<< type() << ": creating lock file" << endl; + } + + OFstream os(baseDir()/(lockName + ".lock")); + os << "waiting"; + os.flush(); +} + + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::removeLockFile() const +{ + if (log_) + { + Info<< type() << ": removing lock file" << endl; + } + + rm(baseDir()/(lockName + ".lock")); +} + + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::writeAndWait +( + const fileName& transferFile +) const +{ + if (log_) + { + Info<< type() << ": writing data to " << transferFile << endl; + } + + OFstream os(transferFile); + + if (Pstream::parRun()) + { + int tag = Pstream::msgType() + 1; + + List<Field<Type> > values(Pstream::nProcs()); + values[Pstream::myProcNo()].setSize(this->refValue().size()); + values[Pstream::myProcNo()] = this->refValue(); + Pstream::listCombineScatter(values, tag); + + List<Field<Type> > grads(Pstream::nProcs()); + grads[Pstream::myProcNo()].setSize(this->refGrad().size()); + grads[Pstream::myProcNo()] = this->refGrad(); + Pstream::listCombineScatter(grads, tag); + + List<scalarField> fracs(Pstream::nProcs()); + fracs[Pstream::myProcNo()].setSize(this->valueFraction().size()); + fracs[Pstream::myProcNo()] = this->valueFraction(); + Pstream::listCombineScatter(fracs, tag); + + if (Pstream::master()) + { + forAll(values, procI) + { + const Field<Type>& v = values[procI]; + const Field<Type>& g = grads[procI]; + const scalarField& f = fracs[procI]; + + forAll(v, faceI) + { + os << v[faceI] << token::SPACE + << g[faceI] << token::SPACE + << f[faceI] << nl; + } + } + } + } + else + { + forAll(this->patch(), faceI) + { + os << this->refValue()[faceI] << token::SPACE + << this->refGrad()[faceI] << token::SPACE + << this->valueFraction()[faceI] << nl; + } + } + + os.flush(); + + // remove lock file, signalling external source to execute + removeLockFile(); + + const fileName lockFile(baseDir()/(lockName + ".lock")); + + if (log_) + { + Info<< type() << ": beginning wait for lock file " << lockFile << endl; + } + + bool found = false; + label totalTime = 0; + + while (!found) + { + sleep(waitInterval_); + totalTime += waitInterval_; + + if (log_) + { + Info<< type() << ": wait time = " << totalTime << endl; + } + + if (totalTime > timeOut_) + { + FatalErrorIn + ( + "void Foam::externalCoupledMixedFvPatchField<Type>::" + "writeAndWait(const fileName&) const" + ) + << "Wait time exceeded time out time of " << timeOut_ << " s" + << abort(FatalError); + } + + IFstream is(lockFile); + + if (is.good()) + { + if (log_) + { + Info<< type() << ": found lock file " << lockFile << endl; + } + + found = true; + } + } + + // remove old data file from OpenFOAM + rm(transferFile); +} + + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::initialiseRead +( + IFstream& is +) const +{ + if (!is.good()) + { + FatalErrorIn + ( + "void Foam::externalCoupledMixedFvPatchField<Type>::" + "initialiseRead()" + ) + << "Unable to open data transfer file " << is.name() + << " for patch " << this->patch().name() + << exit(FatalError); + } + + if (Pstream::parRun()) + { + // fast-forward to relevant point in file + globalIndex gi(this->patch().size()); + const label offset = gi.offset(Pstream::myProcNo()); + + string line; + for (label i = 0; i < offset; i++) + { + if (is.good()) + { + is.getLine(line); + } + else + { + FatalErrorIn + ( + "void Foam::externalCoupledMixedFvPatchField<Type>::" + "initialiseRead()" + ) + << "Unable to distribute parallel data for file " + << is.name() << " for patch " << this->patch().name() + << exit(FatalError); + } + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Type> +Foam::externalCoupledMixedFvPatchField<Type>::externalCoupledMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF +) +: + mixedFvPatchField<Type>(p, iF), + commsDir_("unknown-commsDir"), + waitInterval_(0), + timeOut_(0), + calcFrequency_(0), + log_(false) +{ + this->refValue() = pTraits<Type>::zero; + this->refGrad() = pTraits<Type>::zero; + this->valueFraction() = 0.0; +} + + +template<class Type> +Foam::externalCoupledMixedFvPatchField<Type>::externalCoupledMixedFvPatchField +( + const externalCoupledMixedFvPatchField& ptf, + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchField<Type>(ptf, p, iF, mapper), + commsDir_(ptf.commsDir_), + fName_(ptf.fName_), + waitInterval_(ptf.waitInterval_), + timeOut_(ptf.timeOut_), + calcFrequency_(ptf.calcFrequency_), + log_(ptf.log_) +{} + + +template<class Type> +Foam::externalCoupledMixedFvPatchField<Type>::externalCoupledMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchField<Type>(p, iF), + commsDir_(dict.lookup("commsDir")), + fName_(dict.lookup("fileName")), + waitInterval_(dict.lookupOrDefault("waitInterval", 1)), + timeOut_(dict.lookupOrDefault("timeOut", 100*waitInterval_)), + calcFrequency_(dict.lookupOrDefault("calcFrequency", 1)), + log_(dict.lookupOrDefault("log", false)) +{ + if (dict.found("value")) + { + fvPatchField<Type>::operator= + ( + Field<Type>("value", dict, p.size()) + ); + } + else + { + fvPatchField<Type>::operator=(this->patchInternalField()); + } + + if (Pstream::master()) + { + commsDir_.expand(); + mkDir(baseDir()); + createLockFile(); + } + + // initialise as a fixed value + this->refValue() = *this; + this->refGrad() = pTraits<Type>::zero; + this->valueFraction() = 1.0; +} + + +template<class Type> +Foam::externalCoupledMixedFvPatchField<Type>::externalCoupledMixedFvPatchField +( + const externalCoupledMixedFvPatchField& ecmpf +) +: + mixedFvPatchField<Type>(ecmpf), + commsDir_(ecmpf.commsDir_), + fName_(ecmpf.fName_), + waitInterval_(ecmpf.waitInterval_), + timeOut_(ecmpf.timeOut_), + calcFrequency_(ecmpf.calcFrequency_), + log_(ecmpf.log_) +{} + + +template<class Type> +Foam::externalCoupledMixedFvPatchField<Type>::externalCoupledMixedFvPatchField +( + const externalCoupledMixedFvPatchField& ecmpf, + const DimensionedField<Type, volMesh>& iF +) +: + mixedFvPatchField<Type>(ecmpf, iF), + commsDir_(ecmpf.commsDir_), + fName_(ecmpf.fName_), + waitInterval_(ecmpf.waitInterval_), + timeOut_(ecmpf.timeOut_), + calcFrequency_(ecmpf.calcFrequency_), + log_(ecmpf.log_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::updateCoeffs() +{ + if (this->updated()) + { + return; + } + + if (this->db().time().timeIndex() % calcFrequency_ == 0) + { + fileName transferFile(baseDir()/fName_); + + // write data for external source and wait for response + writeAndWait(transferFile + ".out"); + + // read data passed back from external source + IFstream is(transferFile + ".in"); + + // pre-process the input transfer file + initialiseRead(is); + + // read data from file + forAll(this->patch(), faceI) + { + if (is.good()) + { + is >> this->refValue()[faceI] + >> this->refGrad()[faceI] + >> this->valueFraction()[faceI]; + } + else + { + FatalErrorIn + ( + "void Foam::externalCoupledMixedFvPatchField<Type>::" + "updateCoeffs()" + ) + << "Insufficient data for patch " << this->patch().name() + << " in file " << is.name() << exit(FatalError); + } + } + + // create lock file for external source + createLockFile(); + } + + mixedFvPatchField<Type>::updateCoeffs(); +} + + +template<class Type> +void Foam::externalCoupledMixedFvPatchField<Type>::write(Ostream& os) const +{ + mixedFvPatchField<Type>::write(os); + + os.writeKeyword("commsDir") << commsDir_ << token::END_STATEMENT << nl; + os.writeKeyword("fileName") << fName_ << token::END_STATEMENT << nl; + os.writeKeyword("waitInterval") << waitInterval_ << token::END_STATEMENT + << nl; + os.writeKeyword("timeOut") << timeOut_ << token::END_STATEMENT + << nl; + os.writeKeyword("calcFrequency") << calcFrequency_ << token::END_STATEMENT + << nl; + os.writeKeyword("log") << log_ << token::END_STATEMENT << nl; + + this->writeEntry("value", os); +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.H new file mode 100644 index 00000000000..229d9bad6c3 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchField.H @@ -0,0 +1,251 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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::externalCoupledMixedFvPatchField + +Group + grpGenericBoundaryConditions grpCoupledBoundaryConditions + +Description + This boundary condition provides an interface to an external application. + Values are transferred as plain text files, comprising of the constituent + pieces of the `mixed' condition, i.e. + + <value1> <gradient1> <valueFracion1> + <value2> <gradient2> <valueFracion2> + <value3> <gradient3> <valueFracion3> + ... + <valueN> <gradientN> <valueFracionN> + + At start-up, the boundary creates a lock file, e.g. + + $FOAM_CASE/comms/patchName/OpenFOAM.lock + + ... to signal the external source to wait. During the boundary condition + update, boundary values are written to file, e.g. + + $FOAM_CASE/comms/patchName/data.out + + The lock file is then removed, instructing the exterbal source to take + control of the program execution. When ready, the external program + should create the return values, e.g. to file + + $FOAM_CASE/comms/patchName/data.in + + ... and then re-instate the lock file. The boundary condition will then + read the return values, and pass program execution back to OpenFOAM. + + + \heading Patch usage + + \table + Property | Description | Required | Default value + commsDir | communications folder | yes | + fileName | data transfer file name | yes | + waitInterval | interval [s] between file checks | no | 1 + timeOut | time after which error invoked | no | 100*waitInterval + calcFrequency | calculation frequency | no | 1 + log | log program control | no | no + \endtable + + Example of the boundary condition specification: + \verbatim + myPatch + { + type externalCoupled; + commsDir "$FOAM_CASE/comms"; + fileName data; + } + \endverbatim + +SeeAlso + mixedFvPatchField + +SourceFiles + externalCoupledMixedFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef externalCoupledMixedFvPatchField_H +#define externalCoupledMixedFvPatchField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class IFstream; + +/*---------------------------------------------------------------------------*\ + Class externalCoupledMixedFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class externalCoupledMixedFvPatchField +: + public mixedFvPatchField<Type> +{ + +protected: + + // Private data + + //- Path to communications folder + fileName commsDir_; + + //- Name of data file + word fName_; + + //- Interval time between checking for return data [s] + label waitInterval_; + + //- Time out time [s] + label timeOut_; + + //- Calculation frequency + label calcFrequency_; + + //- Log flag + bool log_; + + + // Private Member Functions + + //- Return the file path to the base communications folder + fileName baseDir() const; + + //- Create lock file + void createLockFile() const; + + //- Remove lock file + void removeLockFile() const; + + //- Wait and remove lock file + void writeAndWait(const fileName& transferFile) const; + + //- Initialise input stream for reading + void initialiseRead(IFstream& is) const; + + +public: + + //- Runtime type information + TypeName("externalCoupled"); + + //- Name of lock file + static word lockName; + + + // Constructors + + //- Construct from patch and internal field + externalCoupledMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + externalCoupledMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given externalCoupledMixedFvPatchField + // onto a new patch + externalCoupledMixedFvPatchField + ( + const externalCoupledMixedFvPatchField<Type>&, + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + externalCoupledMixedFvPatchField + ( + const externalCoupledMixedFvPatchField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchField<Type> > clone() const + { + return tmp<fvPatchField<Type> > + ( + new externalCoupledMixedFvPatchField<Type>(*this) + ); + } + + //- Construct as copy setting internal field reference + externalCoupledMixedFvPatchField + ( + const externalCoupledMixedFvPatchField&, + const DimensionedField<Type, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchField<Type> > clone + ( + const DimensionedField<Type, volMesh>& iF + ) const + { + return tmp<fvPatchField<Type> > + ( + new externalCoupledMixedFvPatchField<Type>(*this, iF) + ); + } + + + // Member functions + + // Evaluation functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "externalCoupledMixedFvPatchField.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.C new file mode 100644 index 00000000000..42ab10636d5 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.C @@ -0,0 +1,42 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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 "externalCoupledMixedFvPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +makePatchFields(externalCoupledMixed); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.H b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.H new file mode 100644 index 00000000000..36d457004b0 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFields.H @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef externalCoupledMixedFvPatchFields_H +#define externalCoupledMixedFvPatchFields_H + +#include "externalCoupledMixedFvPatchField.H" +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeFieldTypedefs(externalCoupledMixed); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFieldsFwd.H b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFieldsFwd.H new file mode 100644 index 00000000000..7aae5c7b502 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/externalCoupledMixed/externalCoupledMixedFvPatchFieldsFwd.H @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef externalCoupledMixedFvPatchFieldsFwd_H +#define externalCoupledMixedFvPatchFieldsFwd_H + +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template<class Type> class externalCoupledMixedFvPatchField; + +makePatchTypeFieldTypedefs(externalCoupledMixed); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- GitLab