Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / coordinateSystems / coordinateSystem.H
blob39d44be74a335a4f22a7aae69d2057d4bdf58c1a
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::coordinateSystem
27 Description
28     A cartesian coordinate system and the base class for other coordinate
29     system specifications.
31     All systems are defined by an origin point and a coordinateRotation.
32     For convenience, the dictionary constructor forms allow a few shortcuts:
33     - the default origin corresponds to <em>(0 0 0)</em>
34     - if the @c type is not otherwise specified, a Cartesian coordinateSystem
35       is implicit
37     @verbatim
38         flipped
39         {
40             origin  (0 0 0);
41             coordinateRotation
42             {
43                 type        STARCDRotation;
44                 rotation    (0 0 90);
45             }
46         }
47     @endverbatim
49     - if an axes specification (eg, e3/e1) is used, the coordinateRotation
50       sub-dictionary can be dropped.
52     @verbatim
53         flipped     // the same, specified as axes
54         {
55             origin  (0 0 0);
56             coordinateRotation
57             {
58                 type    axes;
59                 e3      (1 0 0);
60                 e1      (0 0 -1);
61             }
62         }
63         flipped     // the same, using all the shortcuts
64         {
65             e3      (1 0 0);
66             e1      (0 0 -1);
67         }
68     @endverbatim
70     - if a sub-dictionary coordinateSystem is found within the dictionary, it
71       will be used. This provides a convenient means of embedding
72       coordinateSystem information in another dictionary.
73       This is used, for example, in the porousZones:
75     @verbatim
76         1
77         (
78         cat1
79         {
80             coordinateSystem
81             {
82                 origin  (0 0 0);
83                 coordinateRotation
84                 {
85                     type        STARCDRotation;
86                     rotation    (0 0 90);
87                 }
88             }
89             porosity        0.781;
90             Darcy
91             {
92                 d   d [0 -2 0 0 0]  (-1000 -1000 0.50753e+08);
93                 f   f [0 -1 0 0 0]  (-1000 -1000 12.83);
94             }
95         }
96         )
97     @endverbatim
99     - additionally, if the coordinateSystem points to a plain entry,
100       it can be used to reference one of the global coordinateSystems
102     @verbatim
103         1
104         (
105         cat1
106         {
107             coordinateSystem  system_10;
108             porosity        0.781;
109             Darcy
110             {
111                 d   d [0 -2 0 0 0]  (-1000 -1000 0.50753e+08);
112                 f   f [0 -1 0 0 0]  (-1000 -1000 12.83);
113             }
114         }
115         )
116     @endverbatim
117     For this to work correctly, the coordinateSystem constructor must be
118     supplied with both a dictionary and an objectRegistry.
120 See Also
121     coordinateSystems and coordinateSystems::New
123 SourceFiles
124     coordinateSystem.C
125     newCoordinateSystem.C
126 \*---------------------------------------------------------------------------*/
128 #ifndef coordinateSystem_H
129 #define coordinateSystem_H
131 #include "vector.H"
132 #include "Pair.H"
133 #include "point.H"
134 #include "tensor.H"
135 #include "vectorField.H"
136 #include "pointField.H"
137 #include "tmp.H"
138 #include "coordinateRotation.H"
139 #include "objectRegistry.H"
141 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
143 namespace Foam
146 // Forward declaration of friend functions and operators
147 class boundBox;
149 /*---------------------------------------------------------------------------*\
150                      Class coordinateSystem Declaration
151 \*---------------------------------------------------------------------------*/
153 class coordinateSystem
155     // Private data
157         //- Name of coordinate system
158         mutable word name_;
160         //- Optional note
161         mutable string note_;
163         //- Origin
164         mutable point origin_;
166         //- Local-to-Global transformation tensor
167         coordinateRotation R_;
169         //- Global-to-Local transformation tensor
170         tensor Rtr_;
173 protected:
175     // Protected Member Functions
177         //- Convert from local coordinate system to the global Cartesian system
178         //  with optional translation for the origin
179         virtual vector localToGlobal(const vector&, bool translate) const;
181         //- Convert from local coordinate system to the global Cartesian system
182         //  with optional translation for the origin
183         virtual tmp<vectorField> localToGlobal
184         (
185             const vectorField&,
186             bool translate
187         ) const;
189         //- Convert from global Cartesian system to the local coordinate system
190         //  with optional translation for the origin
191         virtual vector globalToLocal(const vector&, bool translate) const;
193         //- Convert from global Cartesian system to the local coordinate system
194         //  with optional translation for the origin
195         virtual tmp<vectorField> globalToLocal
196         (
197             const vectorField&,
198             bool translate
199         ) const;
202 public:
204     //- Runtime type information
205     TypeName("coordinateSystem");
207     //- Type reporting on min-max bounds on coordinate span
208     typedef FixedList<Pair<bool>, 3> spanInfo;
211     // Constructors
213         //- Construct null. This is equivalent to an identity coordinateSystem
214         coordinateSystem();
216         //- Construct copy with a different name
217         coordinateSystem
218         (
219             const word& name,
220             const coordinateSystem&
221         );
223         //- Construct from origin and rotation
224         coordinateSystem
225         (
226             const word& name,
227             const point& origin,
228             const coordinateRotation&
229         );
231         //- Construct from origin and 2 axes
232         coordinateSystem
233         (
234             const word& name,
235             const point& origin,
236             const vector& axis,
237             const vector& dirn
238         );
240         //- Construct from dictionary with a given name
241         coordinateSystem(const word& name, const dictionary&);
243         //- Construct from dictionary with default name
244         coordinateSystem(const dictionary&);
246         //- Construct from dictionary (default name)
247         //  With the ability to reference global coordinateSystems
248         coordinateSystem(const dictionary&, const objectRegistry&);
250         //- Construct from Istream
251         //  The Istream contains a word followed by a dictionary
252         coordinateSystem(Istream&);
254         //- Return clone
255         virtual autoPtr<coordinateSystem> clone() const
256         {
257             return autoPtr<coordinateSystem>(new coordinateSystem(*this));
258         }
261     // Declare run-time constructor selection table
263 #ifndef SWIG
264         declareRunTimeSelectionTable
265         (
266             autoPtr,
267             coordinateSystem,
268             dictionary,
269             (
270                 const word& name,
271                 const dictionary& dict
272             ),
273             (name, dict)
274         );
276         declareRunTimeSelectionTable
277         (
278             autoPtr,
279             coordinateSystem,
280             origRotation,
281             (
282                 const word& name,
283                 const point& origin,
284                 const coordinateRotation& cr
285             ),
286             (name, origin, cr)
287         );
288 #endif
291     // Selectors
293         //- Select constructed from dictionary
294         static autoPtr<coordinateSystem> New
295         (
296             const word& name,
297             const dictionary&
298         );
300         //- Select constructed from origin and rotation
301         static autoPtr<coordinateSystem> New
302         (
303             const word& coordType,
304             const word& name,
305             const point& origin,
306             const coordinateRotation&
307         );
309         //- Select constructed from Istream
310         static autoPtr<coordinateSystem> New(Istream& is);
313     // Destructor
315         virtual ~coordinateSystem();
318     // Member Functions
320         // Global information about the coordinate system
322             //- Directions in which the span is limited
323             virtual spanInfo spanLimited() const;
325             //- Span bounds
326             virtual boundBox spanBounds() const;
329       // Access
331         //- Return name
332         const word& name() const
333         {
334             return name_;
335         }
337         //- Return non-constant access to the optional note
338         string& note()
339         {
340             return note_;
341         }
343         //- Return the optional note
344         const string& note() const
345         {
346             return note_;
347         }
349         //- Return origin
350         const point& origin() const
351         {
352             return origin_;
353         }
355         //- Return coordinate rotation
356         const coordinateRotation& rotation() const
357         {
358             return R_;
359         }
361         //- Return local-to-global transformation tensor
362         const tensor& R() const
363         {
364             return R_;
365         }
367         //- Return local Cartesian x-axis
368         vector e1() const
369         {
370            return Rtr_.x();
371         }
373         //- Return local Cartesian y-axis
374         vector e2() const
375         {
376            return Rtr_.y();
377         }
379         //- Return local Cartesian z-axis
380         vector e3() const
381         {
382            return Rtr_.z();
383         }
385         //- Return axis (e3: local Cartesian z-axis)
386         // @deprecated method e3 is preferred
387         vector axis() const
388         {
389            return Rtr_.z();
390         }
392         //- Return direction (e1: local Cartesian x-axis)
393         // @deprecated method e1 is preferred
394         const vector direction() const
395         {
396             return Rtr_.x();
397         }
399         //- Return as dictionary of entries
400         //  @param [in] ignoreType drop type (cartesian, cylindrical, etc)
401         //  when generating the dictionary
402         virtual dictionary dict(bool ignoreType = false) const;
405         // Edit
407             //- Rename
408             virtual void rename(const word& newName)
409             {
410                 name_ = newName;
411             }
413             //- Edit access to origin
414             point& origin()
415             {
416                 return origin_;
417             }
420         // Write
422             //- Write
423             virtual void write(Ostream&) const;
425             //- Write dictionary
426             virtual void writeDict(Ostream&, bool subDict = true) const;
429         // Transformations
431         //- Convert from position in local coordinate system to
432         //  global Cartesian position
433         point globalPosition(const point& local) const
434         {
435             return localToGlobal(local, true);
436         }
438         //- Convert from position in local coordinate system to
439         //  global Cartesian position
440         tmp<pointField> globalPosition(const pointField& local) const
441         {
442             return localToGlobal(local, true);
443         }
445         //- Convert from vector components in local coordinate system
446         //  to global Cartesian vector
447         vector globalVector(const vector& local) const
448         {
449             return localToGlobal(local, false);
450         }
452         //- Convert from vector components in local coordinate system
453         //  to global Cartesian vector
454         tmp<vectorField> globalVector(const vectorField& local) const
455         {
456             return localToGlobal(local, false);
457         }
459         //- Convert from global Cartesian position to position in
460         //  local coordinate system
461         point localPosition(const point& global) const
462         {
463             return globalToLocal(global, true);
464         }
466         //- Convert from global Cartesian position to position in
467         //  local coordinate system
468         tmp<pointField> localPosition(const pointField& global) const
469         {
470             return globalToLocal(global, true);
471         }
473         //- Convert from global Cartesian vector to components in
474         //  local coordinate system
475         vector localVector(const vector& global) const
476         {
477             return globalToLocal(global, false);
478         }
480         //- Convert from global Cartesian vector to components in
481         //  local coordinate system
482         tmp<vectorField> localVector(const vectorField& global) const
483         {
484             return globalToLocal(global, false);
485         }
488     // Member Operators
490         //- Assign from dictionary
491         void operator=(const dictionary&);
494     // Friend Operators
496         friend bool operator!=
497         (
498             const coordinateSystem&,
499             const coordinateSystem&
500         );
502     // IOstream Operators
504         friend Ostream& operator<<(Ostream&, const coordinateSystem&);
508 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
510 } // End namespace Foam
512 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
514 #endif
516 // ************************************************************************* //