/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 1991-2009 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::GeometricField Description Generic GeometricField class. SourceFiles GeometricFieldI.H GeometricField.C GeometricBoundaryField.C GeometricFieldFunctions.H GeometricFieldFunctions.C \*---------------------------------------------------------------------------*/ #ifndef GeometricField_H #define GeometricField_H #include "regIOobject.H" #include "dimensionedTypes.H" #include "DimensionedField.H" #include "FieldField.H" #include "lduInterfaceFieldPtrsList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { class dictionary; // Forward declaration of friend functions and operators template class PatchField, class GeoMesh> class GeometricField; template class PatchField, class GeoMesh> Ostream& operator<< ( Ostream&, const GeometricField& ); template class PatchField, class GeoMesh> Ostream& operator<< ( Ostream&, const tmp >& ); /*---------------------------------------------------------------------------*\ Class GeometricField Declaration \*---------------------------------------------------------------------------*/ template class PatchField, class GeoMesh> class GeometricField : public DimensionedField { // Private Member Functions //- Read from file if it is present bool readIfPresent(); //- Read old time field from file if it is present bool readOldTimeIfPresent(); public: // Public typedefs typedef typename GeoMesh::Mesh Mesh; typedef typename GeoMesh::BoundaryMesh BoundaryMesh; typedef DimensionedField DimensionedInternalField; typedef Field InternalField; typedef PatchField PatchFieldType; class GeometricBoundaryField : public FieldField { // Private data //- Reference to BoundaryMesh for which this field is defined const BoundaryMesh& bmesh_; public: // Constructors //- Construct from a BoundaryMesh, // reference to the internal field // and a patch type GeometricBoundaryField ( const BoundaryMesh&, const DimensionedInternalField&, const word& ); //- Construct from a BoundaryMesh, // reference to the internal field // and a wordList of patch types and optional the actual patch // types (to override constraint patches) GeometricBoundaryField ( const BoundaryMesh&, const DimensionedInternalField&, const wordList& wantedPatchTypes, const wordList& actualPatchTypes = wordList() ); //- Construct from a BoundaryMesh, // reference to the internal field // and a PtrList > GeometricBoundaryField ( const BoundaryMesh&, const DimensionedInternalField&, const PtrList >& ); //- Construct as copy setting the reference to the internal field GeometricBoundaryField ( const DimensionedInternalField&, const GeometricBoundaryField& ); //- Construct as copy // Dangerous because Field may be set to a field which gets deleted // Need new type of BoundaryField, one which is part of a geometric // field for which snGrad etc. may be called and a free standing // BoundaryField for which such operations are unavailable. GeometricBoundaryField ( const GeometricBoundaryField& ); //- Construct from dictionary GeometricBoundaryField ( const BoundaryMesh&, const DimensionedInternalField&, const dictionary& ); // Member functions //- Update the boundary condition coefficients void updateCoeffs(); //- Evaluate boundary conditions void evaluate(); //- Return a list of the patch types wordList types() const; //- Return BoundaryField of the cell values neighbouring // the boundary GeometricBoundaryField boundaryInternalField() const; //- Return a list of pointers for each patch field with only those // pointing to interfaces being set lduInterfaceFieldPtrsList interfaces() const; //- Write boundary field as dictionary entry void writeEntry(const word& keyword, Ostream& os) const; // Member operators //- Assignment to BoundaryField void operator=(const GeometricBoundaryField&); //- Assignment to FieldField void operator=(const FieldField&); //- Assignment to Type void operator=(const Type&); //- Forced assignment to // BoundaryField void operator==(const GeometricBoundaryField&); //- Forced assignment to FieldField void operator==(const FieldField&); //- Forced assignment to Type void operator==(const Type&); }; private: // Private data //- Current time index. // Used to trigger the storing of the old-time value mutable label timeIndex_; //- Pointer to old time field mutable GeometricField* field0Ptr_; //- Pointer to previous iteration (used for under-relaxation) mutable GeometricField* fieldPrevIterPtr_; //- Boundary Type field containing boundary field values GeometricBoundaryField boundaryField_; // Private Member Functions //- Read the field from the dictionary tmp readField(const dictionary&); //- Read the field from the given stream tmp readField(Istream& is); public: //- Runtime type information TypeName("GeometricField"); // Public typedefs typedef typename Field::cmptType cmptType; // Static Member Functions //- Return a null geometric field inline static const GeometricField& null(); // Constructors //- Constructor given IOobject, mesh, dimensions and patch type. // This allocates storage for the field but not values. // Used only within this class to create TEMPORARY variables GeometricField ( const IOobject&, const Mesh&, const dimensionSet&, const word& patchFieldType=PatchField::calculatedType() ); //- Constructor given IOobject, mesh, dimensions and patch types. // This allocates storage for the field but not values. // Used only within this class to create TEMPORARY variables GeometricField ( const IOobject&, const Mesh&, const dimensionSet&, const wordList& wantedPatchTypes, const wordList& actualPatchTypes = wordList() ); //- Constructor given IOobject, mesh, dimensioned and patch type. GeometricField ( const IOobject&, const Mesh&, const dimensioned&, const word& patchFieldType=PatchField::calculatedType() ); //- Constructor given IOobject, mesh, dimensioned and patch types. GeometricField ( const IOobject&, const Mesh&, const dimensioned&, const wordList& wantedPatchTypes, const wordList& actualPatchTypes = wordList() ); //- Constructor from components GeometricField ( const IOobject&, const Mesh&, const dimensionSet&, const Field&, const PtrList >& ); //- Construct and read given IOobject GeometricField ( const IOobject&, const Mesh& ); //- Construct and read from given stream GeometricField ( const IOobject&, const Mesh&, Istream& ); //- Construct from dictionary GeometricField ( const IOobject&, const Mesh&, const dictionary& ); //- Construct as copy GeometricField ( const GeometricField& ); //- Construct as copy of tmp deleting argument #ifdef ConstructFromTmp GeometricField ( const tmp >& ); #endif //- Construct as copy resetting IO parameters GeometricField ( const IOobject&, const GeometricField& ); //- Construct as copy resetting name GeometricField ( const word& newName, const GeometricField& ); //- Construct as copy resetting name #ifdef ConstructFromTmp GeometricField ( const word& newName, const tmp >& ); #endif //- Construct as copy resetting IO parameters and patch type GeometricField ( const IOobject&, const GeometricField&, const word& patchFieldType ); //- Construct as copy resetting IO parameters and boundary types GeometricField ( const IOobject&, const GeometricField&, const wordList& patchFieldTypes, const wordList& actualPatchTypes = wordList() ); //- Destructor virtual ~GeometricField(); // Member Functions //- Return dimensioned internal field DimensionedInternalField& dimensionedInternalField(); //- Return dimensioned internal field inline const DimensionedInternalField& dimensionedInternalField() const; //- Return internal field InternalField& internalField(); //- Return internal field inline const InternalField& internalField() const; //- Return reference to GeometricBoundaryField GeometricBoundaryField& boundaryField(); //- Return reference to GeometricBoundaryField for const field inline const GeometricBoundaryField& boundaryField() const; //- Return the time index of the field inline label timeIndex() const; //- Return the time index of the field inline label& timeIndex(); //- Store the old-time fields void storeOldTimes() const; //- Store the old-time field void storeOldTime() const; //- Return the number of old time fields stored label nOldTimes() const; //- Return old time field const GeometricField& oldTime() const; //- Return non-const old time field // (Not a good idea but it is used for sub-cycling) GeometricField& oldTime(); //- Store the field as the previous iteration value void storePrevIter() const; //- Return previous iteration field const GeometricField& prevIter() const; //- Correct boundary field void correctBoundaryConditions(); //- Does the field need a reference level for solution bool needReference() const; //- Return a component of the field tmp > component ( const direction ) const; //- WriteData member function required by regIOobject bool writeData(Ostream&) const; //- Return transpose (only if it is a tensor field) tmp > T() const; //- Relax field (for steady-state solution). // alpha = 1 : no relaxation // alpha < 1 : relaxation // alpha = 0 : do nothing void relax(const scalar alpha); //- Relax field (for steady-state solution). // alpha is read from controlDict void relax(); // Member function *this operators void negate(); void replace ( const direction, const GeometricField& ); void replace ( const direction, const dimensioned& ); void max(const dimensioned&); void min(const dimensioned&); void max ( const GeometricField&, const dimensioned& ); void min ( const GeometricField&, const dimensioned& ); void scale ( const GeometricField&, const GeometricField& ); void scale ( const GeometricField&, const dimensioned& ); // Member operators void operator=(const GeometricField&); void operator=(const tmp >&); void operator=(const dimensioned&); void operator==(const tmp >&); void operator==(const dimensioned&); void operator+=(const GeometricField&); void operator+=(const tmp >&); void operator-=(const GeometricField&); void operator-=(const tmp >&); void operator*=(const GeometricField&); void operator*=(const tmp >&); void operator/=(const GeometricField&); void operator/=(const tmp >&); void operator+=(const dimensioned&); void operator-=(const dimensioned&); void operator*=(const dimensioned&); void operator/=(const dimensioned&); // Ostream operators friend Ostream& operator<< ( Ostream&, const GeometricField& ); friend Ostream& operator<< ( Ostream&, const tmp >& ); }; template class PatchField, class GeoMesh> Ostream& operator<< ( Ostream&, const typename GeometricField:: GeometricBoundaryField& ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "GeometricFieldI.H" #ifdef NoRepository # include "GeometricField.C" #endif #include "GeometricFieldFunctions.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //