/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-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 . Class Foam::dimensionSet Description Dimension set for the base types. This type may be used to implement rigorous dimension checking for algebraic manipulation. SourceFiles dimensionSet.C dimensionSetIO.C dimensionSets.C \*---------------------------------------------------------------------------*/ #ifndef dimensionSet_H #define dimensionSet_H #include "bool.H" #include "dimensionedScalarFwd.H" #include "className.H" #include "scalarField.H" #include "PtrList.H" #include "HashTable.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // Forward declaration of friend functions and operators class dimensionSet; class dimensionSets; // Friend functions dimensionSet max(const dimensionSet&, const dimensionSet&); dimensionSet min(const dimensionSet&, const dimensionSet&); dimensionSet cmptMultiply(const dimensionSet&, const dimensionSet&); dimensionSet cmptDivide(const dimensionSet&, const dimensionSet&); dimensionSet pow(const dimensionSet&, const scalar); dimensionSet pow(const dimensionSet&, const dimensionedScalar&); dimensionSet pow(const dimensionedScalar&, const dimensionSet&); dimensionSet sqr(const dimensionSet&); dimensionSet pow3(const dimensionSet&); dimensionSet pow4(const dimensionSet&); dimensionSet pow5(const dimensionSet&); dimensionSet pow6(const dimensionSet&); dimensionSet pow025(const dimensionSet&); dimensionSet sqrt(const dimensionSet&); dimensionSet cbrt(const dimensionSet&); dimensionSet magSqr(const dimensionSet&); dimensionSet mag(const dimensionSet&); dimensionSet sign(const dimensionSet&); dimensionSet pos(const dimensionSet&); dimensionSet neg(const dimensionSet&); dimensionSet inv(const dimensionSet&); // Function to check the argument is dimensionless // for transcendental functions dimensionSet trans(const dimensionSet&); // Return the argument; transformations do not change the dimensions dimensionSet transform(const dimensionSet&); // Friend operators dimensionSet operator-(const dimensionSet&); dimensionSet operator+(const dimensionSet&, const dimensionSet&); dimensionSet operator-(const dimensionSet&, const dimensionSet&); dimensionSet operator*(const dimensionSet&, const dimensionSet&); dimensionSet operator/(const dimensionSet&, const dimensionSet&); dimensionSet operator&(const dimensionSet&, const dimensionSet&); dimensionSet operator^(const dimensionSet&, const dimensionSet&); dimensionSet operator&&(const dimensionSet&, const dimensionSet&); // IOstream operators Istream& operator>>(Istream&, dimensionSet&); Ostream& operator<<(Ostream&, const dimensionSet&); /*---------------------------------------------------------------------------*\ Class dimensionSet Declaration \*---------------------------------------------------------------------------*/ class dimensionSet { public: // Member constants enum { nDimensions = 7 // Number of dimensions in SI is 7 }; //- Define an enumeration for the names of the dimension exponents enum dimensionType { MASS, // kilogram kg LENGTH, // metre m TIME, // second s TEMPERATURE, // Kelvin K MOLES, // mole mol CURRENT, // Ampere A LUMINOUS_INTENSITY // Candela Cd }; // Static data members static const scalar smallExponent; private: // Private classes class tokeniser { // Private data Istream& is_; List tokens_; label start_; label size_; // Private Member Functions void push(const token&); token pop(); void unpop(const token&); public: // Constructors tokeniser(Istream&); // Member Functions Istream& stream() { return is_; } bool hasToken() const; token nextToken(); void putBack(const token&); void splitWord(const word&); static bool valid(char c); static label priority(const token& t); }; //- Reset exponents to nearest integer if close to it. Used to // handle reading with insufficient precision. void round(const scalar tol); dimensionedScalar parse ( const label lastPrior, tokeniser& tis, const HashTable& ) const; // private data // dimensionSet stored as an array of dimension exponents scalar exponents_[nDimensions]; public: // Declare name of the class and its debug switch ClassName("dimensionSet"); // Constructors //- Construct given individual dimension exponents for all // seven dimensions dimensionSet ( const scalar mass, const scalar length, const scalar time, const scalar temperature, const scalar moles, const scalar current, const scalar luminousIntensity ); //- Construct given individual dimension exponents for first // five dimensions dimensionSet ( const scalar mass, const scalar length, const scalar time, const scalar temperature, const scalar moles ); //- Construct from Istream dimensionSet(Istream&); // Member functions //- Return true if it is dimensionless bool dimensionless() const; void reset(const dimensionSet&); // I/O //- Read using provided units. Used only in initial parsing Istream& read ( Istream& is, scalar& multiplier, const dictionary& ); //- Read using provided units Istream& read ( Istream& is, scalar& multiplier, const HashTable& ); //- Read using system units Istream& read ( Istream& is, scalar& multiplier ); //- Write using provided units Ostream& write ( Ostream& os, scalar& multiplier, const dimensionSets& ) const; //- Write using system units Ostream& write ( Ostream& os, scalar& multiplier ) const; // Member operators scalar operator[](const dimensionType) const; scalar& operator[](const dimensionType); scalar operator[](const label) const; scalar& operator[](const label); bool operator==(const dimensionSet&) const; bool operator!=(const dimensionSet&) const; bool operator=(const dimensionSet&) const; bool operator+=(const dimensionSet&) const; bool operator-=(const dimensionSet&) const; bool operator*=(const dimensionSet&); bool operator/=(const dimensionSet&); // Friend functions friend dimensionSet max(const dimensionSet&, const dimensionSet&); friend dimensionSet min(const dimensionSet&, const dimensionSet&); friend dimensionSet cmptMultiply ( const dimensionSet&, const dimensionSet& ); friend dimensionSet cmptDivide ( const dimensionSet&, const dimensionSet& ); friend dimensionSet pow(const dimensionSet&, const scalar); friend dimensionSet pow(const dimensionSet&, const dimensionedScalar&); friend dimensionSet pow(const dimensionedScalar&, const dimensionSet&); friend dimensionSet sqr(const dimensionSet&); friend dimensionSet pow3(const dimensionSet&); friend dimensionSet pow4(const dimensionSet&); friend dimensionSet pow5(const dimensionSet&); friend dimensionSet pow6(const dimensionSet&); friend dimensionSet pow025(const dimensionSet&); friend dimensionSet sqrt(const dimensionSet&); friend dimensionSet magSqr(const dimensionSet&); friend dimensionSet mag(const dimensionSet&); friend dimensionSet sign(const dimensionSet&); friend dimensionSet pos(const dimensionSet&); friend dimensionSet neg(const dimensionSet&); friend dimensionSet inv(const dimensionSet&); //- Function to check the argument is dimensionless // for transcendental functions friend dimensionSet trans(const dimensionSet&); friend dimensionSet atan2(const dimensionSet&, const dimensionSet&); //- Return the argument; transformations do not change the dimensions friend dimensionSet transform(const dimensionSet&); // Friend operators friend dimensionSet operator-(const dimensionSet&); friend dimensionSet operator+ ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator- ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator* ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator/ ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator& ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator^ ( const dimensionSet&, const dimensionSet& ); friend dimensionSet operator&& ( const dimensionSet&, const dimensionSet& ); // IOstream operators friend Istream& operator>>(Istream&, dimensionSet&); friend Ostream& operator<<(Ostream&, const dimensionSet&); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "dimensionSets.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //