1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "dimensionedType.H"
29 #include "dictionary.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
39 dimensioned<Type> dimensioned<Type>::lookupOrDefault
42 const dictionary& dict,
43 const Type& defaultValue,
44 const dimensionSet& dims
47 Type value = dict.lookupOrDefault<Type>(name, defaultValue);
48 return dimensioned<Type>(name, dims, value);
53 dimensioned<Type> dimensioned<Type>::lookupOrAddToDict
57 const Type& defaultValue,
58 const dimensionSet& dims
61 Type value = dict.lookupOrAddDefault<Type>(name, defaultValue);
62 return dimensioned<Type>(name, dims, value);
66 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
69 dimensioned<Type>::dimensioned
72 const dimensionSet& dimSet,
83 dimensioned<Type>::dimensioned
86 const dimensioned<Type>& dt
90 dimensions_(dt.dimensions_),
96 dimensioned<Type>::dimensioned
103 value_(pTraits<Type>(is))
107 template <class Type>
108 dimensioned<Type>::dimensioned
116 value_(pTraits<Type>(is))
120 template <class Type>
121 dimensioned<Type>::dimensioned
124 const dimensionSet& dimSet,
130 value_(pTraits<Type>(is))
134 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
136 template <class Type>
137 const word& dimensioned<Type>::name() const
142 template <class Type>
143 word& dimensioned<Type>::name()
149 template <class Type>
150 const dimensionSet& dimensioned<Type>::dimensions() const
155 template <class Type>
156 dimensionSet& dimensioned<Type>::dimensions()
162 template <class Type>
163 const Type& dimensioned<Type>::value() const
168 template <class Type>
169 Type& dimensioned<Type>::value()
175 template <class Type>
176 dimensioned<typename dimensioned<Type>::cmptType> dimensioned<Type>::component
181 return dimensioned<cmptType>
183 name_ + ".component(" + Foam::name(d) + ')',
190 template <class Type>
191 void dimensioned<Type>::replace
194 const dimensioned<typename dimensioned<Type>::cmptType>& dc
197 dimensions_ = dc.dimensions();
198 value_.replace(d, dc.value());
202 template <class Type>
203 bool dimensioned<Type>::readIfPresent(const dictionary& dict)
205 return dict.readIfPresent(name_, value_);
209 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
211 template <class Type>
212 dimensioned<typename dimensioned<Type>::cmptType> dimensioned<Type>::operator[]
221 template <class Type>
222 void dimensioned<Type>::operator+=
224 const dimensioned<Type>& dt
227 dimensions_ += dt.dimensions_;
232 template <class Type>
233 void dimensioned<Type>::operator-=
235 const dimensioned<Type>& dt
238 dimensions_ -= dt.dimensions_;
243 template <class Type>
244 void dimensioned<Type>::operator*=
253 template <class Type>
254 void dimensioned<Type>::operator/=
263 // * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
265 template<class Type, int r>
266 dimensioned<typename powProduct<Type, r>::type>
267 pow(const dimensioned<Type>& dt, typename powProduct<Type, r>::type)
269 return dimensioned<typename powProduct<Type, r>::type>
271 "pow(" + dt.name() + ',' + name(r) + ')',
272 pow(dt.dimensions(), r),
278 dimensioned<typename outerProduct<Type, Type>::type>
279 sqr(const dimensioned<Type>& dt)
281 return dimensioned<typename outerProduct<Type, Type>::type>
283 "sqr(" + dt.name() + ')',
284 sqr(dt.dimensions()),
290 dimensioned<scalar> magSqr(const dimensioned<Type>& dt)
292 return dimensioned<scalar>
294 "magSqr(" + dt.name() + ')',
295 magSqr(dt.dimensions()),
301 dimensioned<scalar> mag(const dimensioned<Type>& dt)
303 return dimensioned<scalar>
305 "mag(" + dt.name() + ')',
312 template <class Type>
313 dimensioned<Type> max
315 const dimensioned<Type>& dt1,
316 const dimensioned<Type>& dt2
319 if (dt1.dimensions() != dt2.dimensions())
321 FatalErrorIn("max(const dimensioned<Type>&, const dimensioned<Type>&)")
322 << "dimensions of arguments are not equal"
323 << abort(FatalError);
326 return dimensioned<Type>
328 "max(" + dt1.name() + ',' + dt2.name() + ')',
330 max(dt1.value(), dt2.value())
335 template <class Type>
336 dimensioned<Type> min
338 const dimensioned<Type>& dt1,
339 const dimensioned<Type>& dt2
342 if (dt1.dimensions() != dt2.dimensions())
344 FatalErrorIn("min(const dimensioned<Type>&, const dimensioned<Type>&)")
345 << "dimensions of arguments are not equal"
346 << abort(FatalError);
349 return dimensioned<Type>
351 "min(" + dt1.name() + ',' + dt2.name() + ')',
353 min(dt1.value(), dt2.value())
358 // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
360 template <class Type>
361 Istream& operator>>(Istream& is, dimensioned<Type>& dt)
363 // do a stream read op for a Type and a dimensions()et
364 is >> dt.name_ >> dt.dimensions_ >> dt.value_;
366 // Check state of Istream
367 is.check("Istream& operator>>(Istream&, dimensioned<Type>&)");
373 template <class Type>
374 Ostream& operator<<(Ostream& os, const dimensioned<Type>& dt)
376 // do a stream write op for a dimensions()et
377 os << dt.name() << token::SPACE
378 << dt.dimensions() << token::SPACE
381 // Check state of Ostream
382 os.check("Ostream& operator<<(Ostream&, const dimensioned<Type>&)");
388 // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
390 template <class Type>
393 const dimensioned<Type>& dt1,
394 const dimensioned<Type>& dt2
397 return dt1.value() > dt2.value();
401 template <class Type>
404 const dimensioned<Type>& dt1,
405 const dimensioned<Type>& dt2
408 return dt1.value() < dt2.value();
412 template <class Type>
413 dimensioned<Type> operator+
415 const dimensioned<Type>& dt1,
416 const dimensioned<Type>& dt2
419 return dimensioned<Type>
421 '(' + dt1.name() + '+' + dt2.name() + ')',
422 dt1.dimensions() + dt2.dimensions(),
423 dt1.value() + dt2.value()
428 template <class Type>
429 dimensioned<Type> operator-(const dimensioned<Type>& dt)
431 return dimensioned<Type>
440 template <class Type>
441 dimensioned<Type> operator-
443 const dimensioned<Type>& dt1,
444 const dimensioned<Type>& dt2
447 return dimensioned<Type>
449 '(' + dt1.name() + '-' + dt2.name() + ')',
450 dt1.dimensions() - dt2.dimensions(),
451 dt1.value() - dt2.value()
456 template <class Type>
457 dimensioned<Type> operator*
459 const dimensioned<scalar>& ds,
460 const dimensioned<Type>& dt
463 return dimensioned<Type>
465 '(' + ds.name() + '*' + dt.name() + ')',
466 ds.dimensions() * dt.dimensions(),
467 ds.value() * dt.value()
472 template <class Type>
473 dimensioned<Type> operator/
475 const dimensioned<Type>& dt,
476 const dimensioned<scalar>& ds
479 return dimensioned<Type>
481 '(' + dt.name() + '|' + ds.name() + ')',
482 dt.dimensions()/ds.dimensions(),
483 dt.value()/ds.value()
491 #define PRODUCT_OPERATOR(product, op, opFunc) \
493 template<class Type1, class Type2> \
494 dimensioned<typename product<Type1, Type2>::type> \
495 operator op(const dimensioned<Type1>& dt1, const dimensioned<Type2>& dt2) \
497 return dimensioned<typename product<Type1, Type2>::type> \
499 '(' + dt1.name() + #op + dt2.name() + ')', \
500 dt1.dimensions() op dt2.dimensions(), \
501 dt1.value() op dt2.value() \
505 template<class Type, class Form, class Cmpt, int nCmpt> \
506 dimensioned<typename product<Type, Form>::type> \
509 const dimensioned<Type>& dt1, \
510 const VectorSpace<Form,Cmpt,nCmpt>& t2 \
513 return dimensioned<typename product<Type, Form>::type> \
515 '(' + dt1.name() + #op + name(t2) + ')', \
517 dt1.value() op static_cast<const Form&>(t2) \
521 template<class Type, class Form, class Cmpt, int nCmpt> \
522 dimensioned<typename product<Form, Type>::type> \
525 const VectorSpace<Form,Cmpt,nCmpt>& t1, \
526 const dimensioned<Type>& dt2 \
529 return dimensioned<typename product<Form, Type>::type> \
531 '(' + name(t1) + #op + dt2.name() + ')', \
533 static_cast<const Form&>(t1) op dt2.value() \
538 PRODUCT_OPERATOR(outerProduct, *, outer)
539 PRODUCT_OPERATOR(crossProduct, ^, cross)
540 PRODUCT_OPERATOR(innerProduct, &, dot)
541 PRODUCT_OPERATOR(scalarProduct, &&, dotdot)
543 #undef PRODUCT_OPERATOR
546 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
548 } // End namespace Foam
550 // ************************************************************************* //