Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / fields / FieldFields / FieldField / FieldField.H
bloba5367acea8b5bfa949196883c2f383fe4569b92a
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 Class
25     Foam::FieldField
27 Description
28     Generic field type.
30 SourceFiles
31     FieldField.C
33 \*---------------------------------------------------------------------------*/
35 #ifndef FieldField_H
36 #define FieldField_H
38 #include "tmp.H"
39 #include "PtrList.H"
40 #include "scalar.H"
41 #include "direction.H"
42 #include "VectorSpace.H"
44 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
46 namespace Foam
49 // Forward declaration of friend functions and operators
51 template<template<class> class Field, class Type>
52 class FieldField;
54 template<template<class> class Field, class Type>
55 Ostream& operator<<
57     Ostream&,
58     const FieldField<Field, Type>&
61 template<template<class> class Field, class Type>
62 Ostream& operator<<
64     Ostream&,
65     const tmp<FieldField<Field, Type> >&
69 /*---------------------------------------------------------------------------*\
70                            Class FieldField Declaration
71 \*---------------------------------------------------------------------------*/
73 template<template<class> class Field, class Type>
74 class FieldField
76     public refCount,
77     public PtrList<Field<Type> >
80 public:
82     //- Component type
83     typedef typename pTraits<Type>::cmptType cmptType;
86     // Constructors
88         //- Construct null
89         //  Used for temporary fields which are initialised after construction
90         FieldField();
92         //- Construct given size
93         //  Used for temporary fields which are initialised after construction
94         explicit FieldField(const label);
96         //- Construct using the Field sizes from the given FieldField
97         //  and the given Field type.
98         //  Used for temporary fields which are initialised after construction
99         FieldField(const word&, const FieldField<Field, Type>&);
101         //- Construct as copy
102         FieldField(const FieldField<Field, Type>&);
104         //- Construct as copy or re-use as specified.
105         FieldField(FieldField<Field, Type>&, bool reUse);
107         //- Construct as copy of a PtrList<Field, Type>
108         FieldField(const PtrList<Field<Type> >&);
110         //- Construct as copy of tmp<FieldField>
111 #       ifdef ConstructFromTmp
112         FieldField(const tmp<FieldField<Field, Type> >&);
113 #       endif
115         //- Construct from Istream
116         FieldField(Istream&);
118         //- Clone
119         tmp<FieldField<Field, Type> > clone() const;
121         //- Return a pointer to a new calculatedFvPatchFieldField created on
122         //  freestore without setting patchField values
123         template<class Type2>
124         static tmp<FieldField<Field, Type> > NewCalculatedType
125         (
126             const FieldField<Field, Type2>& ff
127         )
128 #       ifdef __INTEL_COMPILER
129         {
130             FieldField<Field, Type>* nffPtr
131             (
132                 new FieldField<Field, Type>(ff.size())
133             );
135             forAll(*nffPtr, i)
136             {
137                 nffPtr->set(i, Field<Type>::NewCalculatedType(ff[i]).ptr());
138             }
140             return tmp<FieldField<Field, Type> >(nffPtr);
141         }
142 #       else
143         ;
144 #       endif
146     // Member functions
148         //- Negate this field
149         void negate();
151         //- Return a component field of the field
152         tmp<FieldField<Field, cmptType> > component(const direction) const;
154         //- Replace a component field of the field
155         void replace(const direction, const FieldField<Field, cmptType>&);
157         //- Replace a component field of the field
158         void replace(const direction, const cmptType&);
160         //- Return the field transpose (only defined for second rank tensors)
161         tmp<FieldField<Field, Type> > T() const;
164     // Member operators
166         void operator=(const FieldField<Field, Type>&);
167         void operator=(const tmp<FieldField<Field, Type> >&);
168         void operator=(const Type&);
170         void operator+=(const FieldField<Field, Type>&);
171         void operator+=(const tmp<FieldField<Field, Type> >&);
173         void operator-=(const FieldField<Field, Type>&);
174         void operator-=(const tmp<FieldField<Field, Type> >&);
176         void operator*=(const FieldField<Field, scalar>&);
177         void operator*=(const tmp<FieldField<Field, scalar> >&);
179         void operator/=(const FieldField<Field, scalar>&);
180         void operator/=(const tmp<FieldField<Field, scalar> >&);
182         void operator+=(const Type&);
183         void operator-=(const Type&);
185         void operator*=(const scalar&);
186         void operator/=(const scalar&);
189     // IOstream operators
191 #ifndef SWIG
192         friend Ostream& operator<< <Field, Type>
193         (
194             Ostream&,
195             const FieldField<Field, Type>&
196         );
198         friend Ostream& operator<< <Field, Type>
199         (
200             Ostream&,
201             const tmp<FieldField<Field, Type> >&
202         );
203 #endif
207 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
209 } // End namespace Foam
211 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
213 #include "FieldFieldFunctions.H"
215 #ifdef NoRepository
216 #   include "FieldField.C"
217 #endif
219 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
221 #endif
223 // ************************************************************************* //