Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / primitives / VectorSpace / products.H
blob935e2aaf454a045e26af08363774b7e10867d70c
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 InNamespace
25     Foam
27 Description
28     Traits classes for inner and outer products of primitives.
30 \*---------------------------------------------------------------------------*/
32 #ifndef products_H
33 #define products_H
35 #include "pTraits.H"
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39 namespace Foam
42 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
44 template<class Cmpt, int rank>
45 class typeOfRank
46 {};
49 template<class Cmpt, int rank>
50 class symmTypeOfRank
51 {};
54 template<class arg1, class arg2>
55 class typeOfSum
57 public:
59     typedef arg1 type;
63 template<class arg1, class arg2>
64 class outerProduct
66 public:
68     typedef typename typeOfRank
69     <
70         typename pTraits<arg1>::cmptType,
71         int(pTraits<arg1>::rank) + int(pTraits<arg2>::rank)
72     >::type type;
76 template<class arg1, class arg2>
77 class crossProduct
79 public:
81     typedef typename typeOfRank
82     <
83         typename pTraits<arg2>::cmptType,
84         int(pTraits<arg1>::rank) + int(pTraits<arg2>::rank) - 1
85     >::type type;
88 template<class arg1, class arg2>
89 class innerProduct
91 public:
93     typedef typename typeOfRank
94     <
95         typename pTraits<arg1>::cmptType,
96         int(pTraits<arg1>::rank) + int(pTraits<arg2>::rank) - 2
97     >::type type;
100 template<class arg1, class arg2>
101 class scalarProduct
103 public:
105     typedef typename pTraits<arg1>::cmptType type;
109 template<class arg1, int arg2>
110 class powProduct
112 public:
114     typedef typename symmTypeOfRank
115     <
116         typename pTraits<arg1>::cmptType,
117         arg2*int(pTraits<arg1>::rank)
118     >::type type;
122 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
124 } // End namespace Foam
126 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
128 #endif
130 // ************************************************************************* //