1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2004-2010 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
13 the Free Software Foundation, either version 3 of the License, or
14 (at your 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, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
28 #include "VectorSpaceM.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
38 template<class Form, class Cmpt, int nCmpt>
39 inline VectorSpace<Form, Cmpt, nCmpt>::VectorSpace()
43 template<class Form, class Cmpt, int nCmpt>
44 inline VectorSpace<Form, Cmpt, nCmpt>::VectorSpace
46 const VectorSpace<Form, Cmpt, nCmpt>& vs
49 VectorSpaceOps<nCmpt,0>::eqOp(*this, vs, eqOp<Cmpt>());
53 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
55 template<class Form, class Cmpt, int nCmpt>
56 inline label VectorSpace<Form, Cmpt, nCmpt>::size() const
62 template<class Form, class Cmpt, int nCmpt>
63 inline const Cmpt& VectorSpace<Form, Cmpt, nCmpt>::component
73 "VectorSpace<Form, Cmpt, nCmpt>::component(direction) const"
74 ) << "index out of range"
83 template<class Form, class Cmpt, int nCmpt>
84 inline Cmpt& VectorSpace<Form, Cmpt, nCmpt>::component
92 FatalErrorIn("VectorSpace<Form, Cmpt, nCmpt>::component(direction)")
93 << "index out of range"
102 template<class Form, class Cmpt, int nCmpt>
103 inline void VectorSpace<Form, Cmpt, nCmpt>::component
114 "VectorSpace<Form, Cmpt, nCmpt>::component(Cmpt&, direction) const"
115 ) << "index out of range"
116 << abort(FatalError);
124 template<class Form, class Cmpt, int nCmpt>
125 inline void VectorSpace<Form, Cmpt, nCmpt>::replace
136 "VectorSpace<Form, Cmpt, nCmpt>::"
137 "replace(direction, const Cmpt&) const"
138 ) << "index out of range"
139 << abort(FatalError);
147 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
149 template<class Form, class Cmpt, int nCmpt>
150 inline const Cmpt& VectorSpace<Form, Cmpt, nCmpt>::operator[]
160 "VectorSpace<Form, Cmpt, nCmpt>::operator[](direction d) const"
161 ) << "index out of range"
162 << abort(FatalError);
170 template<class Form, class Cmpt, int nCmpt>
171 inline Cmpt& VectorSpace<Form, Cmpt, nCmpt>::operator[]
179 FatalErrorIn("VectorSpace<Form, Cmpt, nCmpt>::operator[](direction d)")
180 << "index out of range"
181 << abort(FatalError);
189 template<class Form, class Cmpt, int nCmpt>
190 inline void VectorSpace<Form, Cmpt, nCmpt>::operator=
192 const VectorSpace<Form, Cmpt, nCmpt>& vs
195 VectorSpaceOps<nCmpt,0>::eqOp(*this, vs, eqOp<Cmpt>());
199 template<class Form, class Cmpt, int nCmpt>
200 inline void VectorSpace<Form, Cmpt, nCmpt>::operator+=
202 const VectorSpace<Form, Cmpt, nCmpt>& vs
205 VectorSpaceOps<nCmpt,0>::eqOp(*this, vs, plusEqOp<Cmpt>());
209 template<class Form, class Cmpt, int nCmpt>
210 inline void VectorSpace<Form, Cmpt, nCmpt>::operator-=
212 const VectorSpace<Form, Cmpt, nCmpt>& vs
215 VectorSpaceOps<nCmpt,0>::eqOp(*this, vs, minusEqOp<Cmpt>());
219 template<class Form, class Cmpt, int nCmpt>
220 inline void VectorSpace<Form, Cmpt, nCmpt>::operator*=
225 VectorSpaceOps<nCmpt,0>::eqOpS(*this, s, multiplyEqOp2<Cmpt, scalar>());
229 template<class Form, class Cmpt, int nCmpt>
230 inline void VectorSpace<Form, Cmpt, nCmpt>::operator/=
235 VectorSpaceOps<nCmpt,0>::eqOpS(*this, s, divideEqOp2<Cmpt, scalar>());
239 // * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
241 template<class Form, class Cmpt, int nCmpt>
242 inline Cmpt& setComponent
244 VectorSpace<Form, Cmpt, nCmpt>& vs,
248 return vs.component(d);
252 template<class Form, class Cmpt, int nCmpt>
253 inline const Cmpt& component
255 const VectorSpace<Form, Cmpt, nCmpt>& vs,
259 return vs.component(d);
264 // Equivalent to outer-products between the Form and itself
266 template<class Form, class Cmpt, int nCmpt>
267 inline typename powProduct<Form, 0>::type pow
269 const VectorSpace<Form, Cmpt, nCmpt>&,
270 typename powProduct<Form, 0>::type
271 = pTraits<typename powProduct<Form, 0>::type>::zero
278 template<class Form, class Cmpt, int nCmpt>
279 inline typename powProduct<Form, 1>::type pow
281 const VectorSpace<Form, Cmpt, nCmpt>& v,
282 typename powProduct<Form, 1>::type
283 = pTraits<typename powProduct<Form, 1>::type>::zero
286 return static_cast<const Form&>(v);
290 // Form^2 = sqr(Form)
291 template<class Form, class Cmpt, int nCmpt>
292 inline typename powProduct<Form, 2>::type pow
294 const VectorSpace<Form, Cmpt, nCmpt>& v,
295 typename powProduct<Form, 2>::type
296 = pTraits<typename powProduct<Form, 2>::type>::zero
299 return sqr(static_cast<const Form&>(v));
303 template<class Form, class Cmpt, int nCmpt>
306 const VectorSpace<Form, Cmpt, nCmpt>& vs
309 scalar ms = magSqr(vs.v_[0]);
310 VectorSpaceOps<nCmpt,1>::SeqOp(ms, vs, plusEqMagSqrOp2<scalar, Cmpt>());
315 template<class Form, class Cmpt, int nCmpt>
318 const VectorSpace<Form, Cmpt, nCmpt>& vs
321 return ::sqrt(magSqr(static_cast<const Form&>(vs)));
325 template<class Form, class Cmpt, int nCmpt>
326 inline VectorSpace<Form, Cmpt, nCmpt> cmptMultiply
328 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
329 const VectorSpace<Form, Cmpt, nCmpt>& vs2
333 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, cmptMultiplyOp<Cmpt>());
338 template<class Form, class Cmpt, int nCmpt>
339 inline VectorSpace<Form, Cmpt, nCmpt> cmptDivide
341 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
342 const VectorSpace<Form, Cmpt, nCmpt>& vs2
346 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, cmptDivideOp<Cmpt>());
351 template<class Form, class Cmpt, int nCmpt>
352 inline VectorSpace<Form, Cmpt, nCmpt> stabilise
354 const VectorSpace<Form, Cmpt, nCmpt>& vs,
359 VectorSpaceOps<nCmpt,0>::opVS(v, vs, small, stabiliseOp<Cmpt>());
364 template<class Form, class Cmpt, int nCmpt>
367 const VectorSpace<Form, Cmpt, nCmpt>& vs
370 Cmpt cMax = vs.v_[0];
371 VectorSpaceOps<nCmpt,1>::SeqOp(cMax, vs, maxEqOp<Cmpt>());
376 template<class Form, class Cmpt, int nCmpt>
379 const VectorSpace<Form, Cmpt, nCmpt>& vs
382 Cmpt cMin = vs.v_[0];
383 VectorSpaceOps<nCmpt,1>::SeqOp(cMin, vs, minEqOp<Cmpt>());
388 template<class Form, class Cmpt, int nCmpt>
391 const VectorSpace<Form, Cmpt, nCmpt>& vs
395 VectorSpaceOps<nCmpt,1>::SeqOp(sum, vs, plusEqOp<Cmpt>());
400 template<class Form, class Cmpt, int nCmpt>
403 const VectorSpace<Form, Cmpt, nCmpt>& vs
406 return cmptSum(vs)/nCmpt;
409 template<class Form, class Cmpt, int nCmpt>
410 inline Cmpt cmptProduct
412 const VectorSpace<Form, Cmpt, nCmpt>& vs
415 Cmpt product = vs.v_[0];
416 VectorSpaceOps<nCmpt,1>::SeqOp(product, vs, multiplyEqOp<Cmpt>());
421 template<class Form, class Cmpt, int nCmpt>
424 const VectorSpace<Form, Cmpt, nCmpt>& vs
428 VectorSpaceOps<nCmpt,0>::eqOp(v, vs, eqMagOp<Cmpt>());
433 template<class Form, class Cmpt, int nCmpt>
436 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
437 const VectorSpace<Form, Cmpt, nCmpt>& vs2
441 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, maxOp<Cmpt>());
446 template<class Form, class Cmpt, int nCmpt>
449 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
450 const VectorSpace<Form, Cmpt, nCmpt>& vs2
454 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, minOp<Cmpt>());
459 template<class Form, class Cmpt, int nCmpt>
462 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
463 const VectorSpace<Form, Cmpt, nCmpt>& vs2
467 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, minModOp<Cmpt>());
473 inline Type dot(const scalar s, const Type& t)
480 inline Type dot(const Type& t, const scalar s)
488 class Form1, class Cmpt1, int nCmpt1,
489 class Form2, class Cmpt2, int nCmpt2
491 inline typename innerProduct<Form1, Form2>::type dot
493 const VectorSpace<Form1, Cmpt1, nCmpt1>& t1,
494 const VectorSpace<Form2, Cmpt2, nCmpt2>& t2
497 return static_cast<const Form1&>(t1) & static_cast<const Form2&>(t2);
501 // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
503 template<class Form, class Cmpt, int nCmpt>
504 inline Form operator-
506 const VectorSpace<Form, Cmpt, nCmpt>& vs
510 VectorSpaceOps<nCmpt,0>::eqOp(v, vs, eqMinusOp<Cmpt>());
515 template<class Form, class Cmpt, int nCmpt>
516 inline Form operator+
518 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
519 const VectorSpace<Form, Cmpt, nCmpt>& vs2
523 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, plusOp<Cmpt>());
527 template<class Form, class Cmpt, int nCmpt>
528 inline Form operator-
530 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
531 const VectorSpace<Form, Cmpt, nCmpt>& vs2
535 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, minusOp<Cmpt>());
540 template<class Form, class Cmpt, int nCmpt>
541 inline Form operator*
544 const VectorSpace<Form, Cmpt, nCmpt>& vs
548 VectorSpaceOps<nCmpt,0>::opSV(v, s, vs, multiplyOp3<Cmpt, scalar, Cmpt>());
553 template<class Form, class Cmpt, int nCmpt>
554 inline Form operator*
556 const VectorSpace<Form, Cmpt, nCmpt>& vs,
561 VectorSpaceOps<nCmpt,0>::opVS(v, vs, s, multiplyOp3<Cmpt, Cmpt, scalar>());
566 template<class Form, class Cmpt, int nCmpt>
567 inline Form operator/
569 const VectorSpace<Form, Cmpt, nCmpt>& vs,
574 VectorSpaceOps<nCmpt,0>::opVS(v, vs, s, divideOp3<Cmpt, Cmpt, scalar>());
579 template<class Form, class Cmpt, int nCmpt>
580 inline Form operator/
582 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
583 const VectorSpace<Form, Cmpt, nCmpt>& vs2
587 VectorSpaceOps<nCmpt,0>::op(v, vs1, vs2, divideOp<Cmpt>());
592 template<class Form, class Cmpt, int nCmpt>
593 inline Form operator/
596 const VectorSpace<Form, Cmpt, nCmpt>& vs
600 VectorSpaceOps<nCmpt,0>::opSV(v, s, vs, divideOp2<scalar, Cmpt>());
606 template<class Form, class Cmpt, int nCmpt>
607 inline Cmpt operator&&
609 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
610 const VectorSpace<Form, Cmpt, nCmpt>& vs2
613 Cmpt ddProd = vs1.v_[0]*vs2.v_[0];
614 for (int i=1; i<nCmpt; ++i)
616 ddProd += vs1.v_[i]*vs2.v_[i];
622 template<class Form, class Cmpt, int nCmpt>
623 inline bool operator==
625 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
626 const VectorSpace<Form, Cmpt, nCmpt>& vs2
630 for (int i=0; i<nCmpt; ++i)
632 if (!(eq &= (equal(vs1.v_[i], vs2.v_[i])))) break;
638 template<class Form, class Cmpt, int nCmpt>
639 inline bool operator!=
641 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
642 const VectorSpace<Form, Cmpt, nCmpt>& vs2
645 return !(vs1 == vs2);
649 template<class Form, class Cmpt, int nCmpt>
650 inline bool operator>
652 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
653 const VectorSpace<Form, Cmpt, nCmpt>& vs2
657 for (int i=0; i<nCmpt; ++i)
659 if (!(gt &= vs1.v_[i] > vs2.v_[i])) break;
665 template<class Form, class Cmpt, int nCmpt>
666 inline bool operator<
668 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
669 const VectorSpace<Form, Cmpt, nCmpt>& vs2
673 for (int i=0; i<nCmpt; ++i)
675 if (!(lt &= vs1.v_[i] < vs2.v_[i])) break;
681 template<class Form, class Cmpt, int nCmpt>
682 inline bool operator>=
684 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
685 const VectorSpace<Form, Cmpt, nCmpt>& vs2
692 template<class Form, class Cmpt, int nCmpt>
693 inline bool operator<=
695 const VectorSpace<Form, Cmpt, nCmpt>& vs1,
696 const VectorSpace<Form, Cmpt, nCmpt>& vs2
703 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
705 } // End namespace Foam
707 // ************************************************************************* //