diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index 783518dfe5..360ecc6b07 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -122,6 +122,7 @@ $(derivedFvPatchFields)/directMappedFixedValue/directMappedFixedValueFvPatchFiel
$(derivedFvPatchFields)/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C
$(derivedFvPatchFields)/directMappedFlowRate/directMappedFlowRateFvPatchVectorField.C
$(derivedFvPatchFields)/fan/fanFvPatchFields.C
+$(derivedFvPatchFields)/fanPressure/fanPressureFvPatchScalarField.C
$(derivedFvPatchFields)/buoyantPressure/buoyantPressureFvPatchScalarField.C
$(derivedFvPatchFields)/fixedFluxPressure/fixedFluxPressureFvPatchScalarField.C
$(derivedFvPatchFields)/fixedInternalValueFvPatchField/fixedInternalValueFvPatchFields.C
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C
new file mode 100644
index 0000000000..db585345f1
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.C
@@ -0,0 +1,237 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd.
+ \\/ 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 "fanPressureFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ template<>
+ const char* Foam::NamedEnum
+ <
+ Foam::fanPressureFvPatchScalarField::fanFlowDirection,
+ 2
+ >::names[] =
+ {
+ "in",
+ "out"
+ };
+}
+
+const Foam::NamedEnum
+<
+ Foam::fanPressureFvPatchScalarField::fanFlowDirection,
+ 2
+> Foam::fanPressureFvPatchScalarField::fanFlowDirectionNames_;
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchScalarField(p, iF),
+ phiName_("phi"),
+ rhoName_("rho"),
+ p0_(p.size(), 0.0),
+ fanCurve_(),
+ direction_(ffdOut)
+{}
+
+
+Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField
+(
+ const fanPressureFvPatchScalarField& ptf,
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const fvPatchFieldMapper& mapper
+)
+:
+ fixedValueFvPatchScalarField(ptf, p, iF, mapper),
+ phiName_(ptf.phiName_),
+ rhoName_(ptf.rhoName_),
+ p0_(ptf.p0_, mapper),
+ fanCurve_(ptf.fanCurve_),
+ direction_(ptf.direction_)
+{}
+
+
+Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const dictionary& dict
+)
+:
+ fixedValueFvPatchScalarField(p, iF),
+ phiName_(dict.lookupOrDefault("phi", "phi")),
+ rhoName_(dict.lookupOrDefault("rho", "rho")),
+ p0_("p0", dict, p.size()),
+ fanCurve_(dict),
+ direction_(fanFlowDirectionNames_.read(dict.lookup("direction")))
+{
+ // Assign initial pressure by "value"
+ fvPatchField::operator==(scalarField("value", dict, p.size()));
+}
+
+
+Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField
+(
+ const fanPressureFvPatchScalarField& pfopsf
+)
+:
+ fixedValueFvPatchScalarField(pfopsf),
+ phiName_(pfopsf.phiName_),
+ rhoName_(pfopsf.rhoName_),
+ p0_(pfopsf.p0_),
+ fanCurve_(pfopsf.fanCurve_),
+ direction_(pfopsf.direction_)
+{}
+
+
+Foam::fanPressureFvPatchScalarField::fanPressureFvPatchScalarField
+(
+ const fanPressureFvPatchScalarField& pfopsf,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchScalarField(pfopsf, iF),
+ phiName_(pfopsf.phiName_),
+ rhoName_(pfopsf.rhoName_),
+ p0_(pfopsf.p0_),
+ fanCurve_(pfopsf.fanCurve_),
+ direction_(pfopsf.direction_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::fanPressureFvPatchScalarField::updateCoeffs()
+{
+ if (updated())
+ {
+ return;
+ }
+
+ // Retrieve flux field
+ const surfaceScalarField& phi =
+ db().lookupObject(phiName_);
+
+ const fvsPatchField& phip =
+ patch().patchField(phi);
+
+ int dir = 2*direction_ - 1;
+
+ // Average volumetric flow rate
+ scalar aveFlowRate = 0;
+
+ if (phi.dimensions() == dimVelocity*dimArea)
+ {
+ aveFlowRate = dir*gSum(phip)/gSum(patch().magSf());
+ }
+ else if (phi.dimensions() == dimVelocity*dimArea*dimDensity)
+ {
+ const scalarField& rhop =
+ patch().lookupPatchField(rhoName_);
+ aveFlowRate = dir*gSum(phip/rhop)/gSum(patch().magSf());
+ }
+ else
+ {
+ FatalErrorIn("fanPressureFvPatchScalarField::updateCoeffs()")
+ << "dimensions of phi are not correct"
+ << "\n on patch " << patch().name()
+ << " of field " << dimensionedInternalField().name()
+ << " in file " << dimensionedInternalField().objectPath() << nl
+ << exit(FatalError);
+ }
+
+ // Normal flow through fan
+ if (aveFlowRate >= 0.0)
+ {
+ // Pressure drop for this flow rate
+ const scalar pdFan = fanCurve_(aveFlowRate);
+
+ operator==(p0_ - dir*pdFan);
+ }
+ // Reverse flow
+ else
+ {
+ // Assume that fan has stalled if flow reversed
+ // i.e. apply dp for zero flow rate
+ const scalar pdFan = fanCurve_(0);
+
+ // Flow speed across patch
+ scalarField Up = phip/(patch().magSf());
+
+ // Pressure drop associated withback flow = dynamic pressure
+ scalarField pdBackFlow = 0.5*magSqr(Up);
+
+ if (phi.dimensions() == dimVelocity*dimArea*dimDensity)
+ {
+ const scalarField& rhop =
+ patch().lookupPatchField(rhoName_);
+ pdBackFlow /= rhop;
+ }
+
+ operator==(p0_ - dir*(pdBackFlow + pdFan));
+ }
+
+ fixedValueFvPatchScalarField::updateCoeffs();
+}
+
+
+void Foam::fanPressureFvPatchScalarField::write(Ostream& os) const
+{
+ fvPatchScalarField::write(os);
+ os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
+ os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
+ fanCurve_.write(os);
+ os.writeKeyword("direction")
+ << fanFlowDirectionNames_[direction_] << token::END_STATEMENT << nl;
+ p0_.writeEntry("p0", os);
+ writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makePatchTypeField
+ (
+ fvPatchScalarField,
+ fanPressureFvPatchScalarField
+ );
+};
+
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H
new file mode 100644
index 0000000000..7c3d9ff411
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H
@@ -0,0 +1,205 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd.
+ \\/ 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 .
+
+Class
+ Foam::fanPressureFvPatchScalarField
+
+Description
+ Assigns pressure inlet or outlet condition for a fan.
+
+ User specifies:
+ - pressure drop vs volumetric flow rate table (fan curve) file name;
+ - direction of normal flow through the fan, in or out;
+ - total pressure of the environment.
+
+ Example of the boundary condition specification:
+ \verbatim
+ inlet
+ {
+ type fanPressure;
+ fileName "fanCurve"; // Fan curve file name
+ outOfBounds clamp; // (error|warn|clamp|repeat)
+ direction in; // Direction of flow through fan
+ p0 uniform 0; // Environmental total pressure
+ value uniform 0; // Initial pressure
+ }
+
+ outlet
+ {
+ type fanPressure;
+ fileName "fanCurve"; // Fan curve file name
+ outOfBounds clamp; // (error|warn|clamp|repeat)
+ direction out; // Direction of flow through fan
+ p0 uniform 0; // Environmental total pressure
+ value uniform 0; // Initial pressure
+ }
+ \endverbatim
+
+See Also
+ Foam::interpolationTable and
+ Foam::timeVaryingFlowRateInletVelocityFvPatchVectorField
+
+SourceFiles
+ fanPressureFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fanPressureFvPatchScalarField_H
+#define fanPressureFvPatchScalarField_H
+
+#include "fvPatchFields.H"
+#include "fixedValueFvPatchFields.H"
+#include "interpolationTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class fanPressureFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class fanPressureFvPatchScalarField
+:
+ public fixedValueFvPatchScalarField
+{
+ // Private data
+
+ //- Name of the flux transporting the field
+ word phiName_;
+
+ //- Name of the density field
+ word rhoName_;
+
+ //- Total pressure
+ scalarField p0_;
+
+ //- Tabulated fan curve
+ interpolationTable fanCurve_;
+
+ //- Fan flow direction
+ enum fanFlowDirection
+ {
+ ffdIn,
+ ffdOut
+ };
+
+ static const NamedEnum fanFlowDirectionNames_;
+
+ //- Direction of flow through the fan relative to patch
+ fanFlowDirection direction_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("fanPressure");
+
+
+ // Constructors
+
+ //- Construct from patch and internal field
+ fanPressureFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&
+ );
+
+ //- Construct from patch, internal field and dictionary
+ fanPressureFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&,
+ const dictionary&
+ );
+
+ //- Construct by mapping given
+ // fanPressureFvPatchScalarField
+ // onto a new patch
+ fanPressureFvPatchScalarField
+ (
+ const fanPressureFvPatchScalarField&,
+ const fvPatch&,
+ const DimensionedField&,
+ const fvPatchFieldMapper&
+ );
+
+ //- Construct as copy
+ fanPressureFvPatchScalarField
+ (
+ const fanPressureFvPatchScalarField&
+ );
+
+ //- Construct and return a clone
+ virtual tmp clone() const
+ {
+ return tmp
+ (
+ new fanPressureFvPatchScalarField(*this)
+ );
+ }
+
+ //- Construct as copy setting internal field reference
+ fanPressureFvPatchScalarField
+ (
+ const fanPressureFvPatchScalarField&,
+ const DimensionedField&
+ );
+
+ //- Construct and return a clone setting internal field reference
+ virtual tmp clone
+ (
+ const DimensionedField& iF
+ ) const
+ {
+ return tmp
+ (
+ new fanPressureFvPatchScalarField
+ (
+ *this,
+ iF
+ )
+ );
+ }
+
+
+ // Member functions
+
+ //- Update the coefficients associated with the patch field
+ virtual void updateCoeffs();
+
+ //- Write
+ virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //