casacore
Loading...
Searching...
No Matches
Precession.h
Go to the documentation of this file.
1//# Precession.h: Precession class
2//# Copyright (C) 1995,1996,1997,1998,1999,2002,2003
3//# Associated Universities, Inc. Washington DC, USA.
4//#
5//# This library is free software; you can redistribute it and/or modify it
6//# under the terms of the GNU Library General Public License as published by
7//# the Free Software Foundation; either version 2 of the License, or (at your
8//# option) any later version.
9//#
10//# This library is distributed in the hope that it will be useful, but WITHOUT
11//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13//# License for more details.
14//#
15//# You should have received a copy of the GNU Library General Public License
16//# along with this library; if not, write to the Free Software Foundation,
17//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18//#
19//# Correspondence concerning AIPS++ should be addressed as follows:
20//# Internet email: aips2-request@nrao.edu.
21//# Postal address: AIPS++ Project Office
22//# National Radio Astronomy Observatory
23//# 520 Edgemont Road
24//# Charlottesville, VA 22903-2475 USA
25//#
26//#
27//# $Id$
28
29#ifndef MEASURES_PRECESSION_H
30#define MEASURES_PRECESSION_H
31
32//# Includes
33#include <casacore/casa/aips.h>
34#include <casacore/casa/Quanta/Euler.h>
35#include <casacore/scimath/Functionals/Polynomial.h>
36
37namespace casacore { //# NAMESPACE CASACORE - BEGIN
38
39//# Forward Declarations
40
41// <summary> Precession class and calculations </summary>
42
43// <use visibility=export>
44
45// <reviewed reviewer="Tim Cornwell" date="1996/07/01" tests="tMeasMath"
46// demos="">
47// </reviewed>
48
49// <prerequisite>
50// <li> <linkto class=Measure>Measure</linkto> class for use
51// <li> <linkto class=Euler>Euler</linkto> class for format
52// <li> <linkto class=MeasData>MeasData</linkto> class for constants
53// <li> <linkto class=MeasTable>MeasTable</linkto> class for other data
54// </prerequisite>
55//
56// <etymology>
57// Precession
58// </etymology>
59//
60// <synopsis>
61// Precession forms the class for precession calculations. It is a simple
62// container with the selected method, and the mean epoch. It acts as a cache
63// for values and their derivatives, to enable fast calculations for time
64// epochs close together (see the <em>aipsrc</em> variable
65// <em>measures.precession.d_interval</em>. <br>
66// The calculation method is selected from one of the following:
67// <ul>
68// <li> Precession::STANDARD (at 1995/09/04 the IAU1976 definition,
69// at 2004/01/01 the IAU2000 defeinition))
70// <li> Precession::NONE (precession of zero returned
71// <li> Precession::IAU1976
72// <li> Precession::B1950
73// <li> Precession::IAU2000
74// </ul>
75// Epochs can be specified as the MJD (with defined constants
76// MeasData::MJD2000 and MeasData::MJD1950 or the actual MJD),
77// leading to the following constructors:
78// <ul>
79// <li> Precession() default; assuming JD2000, STANDARD
80// <li> Precession(method) assuming the correct default epoch of
81// JD2000 or JD1950 depending on method
82// <li> Precession(method,epoch) with epoch Double(MJD) (Note: not
83// valid for IAU2000: in that case always JD2000 assumed)
84// </ul>
85// Actual precession for a certain Epoch (TT for IAU2000) is calculated by
86// the () operator
87// as Precession(epoch), with epoch Double MJD. Values returned as an
88// <linkto class=Euler>Euler</linkto>.
89// The derivative (d<sup>-1</sup>) can be obtained as well by
90// derivative(epoch). <br>
91// A Precession can be re-initialed with a different method and/or zero
92// epoch with the <src>init()</src> functions (same format as constructors).
93// To bypass the full calculation actual returned values are calculated
94// using the derivative if within about 2 hours (error less than about
95// 10<sup>-5</sup> mas). A call to refresh() will re-initiate calculations
96// from scratch.<br>
97// The following details can be set with the
98// <linkto class=Aipsrc>Aipsrc</linkto> mechanism:
99// <ul>
100// <li> measures.precession.d_interval: approximation interval as time
101// (fraction of days is default unit) over which linear approximation
102// is used (default is 0.1 day).
103// </ul>
104// </synopsis>
105//
106// <example>
107// <srcblock>
108// #include <casacore/measures/Measures.h>
109// MVDirection pos(Quantity(10,"degree"),Quantity(-10.5,"degree"));
110// // direction RA=10; DEC=-10.5
111// Precession mine(Precession::IAU1976); // define precession type
112// RotMatrix rotat(mine(45837.0)); // rotation matrix for 84/05/17
113// MVDirection new = rotat*pos; // apply precession
114// rotat = RotMatrix(mine(45839.0)); // interpolate new precession
115// // assuming d_interval set large
116// </srcblock>
117// </example>
118//
119// <motivation>
120// To calculate the precession angles. An alternate route could have been
121// a global function, but having a simple container allows caching of some
122// calculations for speed.<br>
123// Using MJD (JD-2400000.5) rather than JD is for precision reasons.
124// </motivation>
125//
126// <todo asof="2003/09/18">
127// <li> Adjust on 2004/01/01
128// </todo>
129
131 public:
132 //# Constants
133 // Default interval to be used for linear approximation (in days)
134 static const Double INTV;
135
136 //# Enumerations
137 // Types of known precession calculations (at 1995/09/04 STANDARD ==
138 // IAU1976), from 2004/01/01 will be IAU2000)
139
144
145 //# Constructors
146 // Default constructor, generates default J2000 precession identification
148 // Copy constructor (deep copy)
149 Precession(const Precession &other);
150 // Constructor with epoch in Julian days
151 explicit Precession(PrecessionTypes type, Double catepoch=0);
152 // Copy assignment (deep copy)
154
155 //# Destructor
157
158 //# Operators
159 // Return the precession angles (for IAU2000 including
160 // the IAU 2000 corrections) at the specified epoch (in MJD; TT for IAU2000).
161 const Euler &operator()(Double epoch);
162
163 //# General Member Functions
164 // Return derivative of precession (d<sup>-1</sup>)
165 const Euler &derivative(Double epoch);
166 // Re-initialise Precession object
167 // <group>
168 void init();
169 void init(PrecessionTypes type, Double catepoch=0);
170 // </group>
171 // Refresh calculations
172 void refresh();
173
174 private:
175 //# Data members
176 // Method to be used
178 // Fixed epoch to be used (MJD)
180 // Fixed epoch in centuries from base epoch
182 // Length of century (depending on Bessel or Julian days)
184 // Reference epoch;
186 // Check epoch
188 // Polynomial coefficients for zeta,z,theta
190 // Cached calculated angles
192 // Cached derivatives
194 // To reference results, and use a few in interim calculations, results are
195 // saced in a circular buffer.
196 // Current result pointer
198 // Last calculation
200 // Interpolation interval aipsrc registration
202
203 //# Member functions
204 // Make a copy
205 void copy(const Precession &other);
206 // Create correct default fixedEpoch and catalogue epoch data
207 void fillEpoch();
208 // Calculate precession angles for time t
210};
211
212
213} //# NAMESPACE CASACORE - END
214
215#endif
void init()
Re-initialise Precession object.
Euler result_p[4]
Last calculation.
Definition Precession.h:199
Precession(PrecessionTypes type, Double catepoch=0)
Constructor with epoch in Julian days.
Double cent_p
Length of century (depending on Bessel or Julian days)
Definition Precession.h:183
void calcPrec(Double t)
Calculate precession angles for time t.
void copy(const Precession &other)
Make a copy.
void refresh()
Refresh calculations.
PrecessionTypes
Types of known precession calculations (at 1995/09/04 STANDARD == IAU1976), from 2004/01/01 will be I...
Definition Precession.h:140
Int lres_p
To reference results, and use a few in interim calculations, results are saced in a circular buffer.
Definition Precession.h:197
static uInt myInterval_reg
Interpolation interval aipsrc registration.
Definition Precession.h:201
static const Double INTV
Default interval to be used for linear approximation (in days)
Definition Precession.h:134
Precession()
Default constructor, generates default J2000 precession identification.
void fillEpoch()
Create correct default fixedEpoch and catalogue epoch data.
Double pval_p[3]
Cached calculated angles.
Definition Precession.h:191
Double T_p
Fixed epoch in centuries from base epoch.
Definition Precession.h:181
void init(PrecessionTypes type, Double catepoch=0)
Double refEpoch_p
Reference epoch;.
Definition Precession.h:185
Precession(const Precession &other)
Copy constructor (deep copy)
const Euler & operator()(Double epoch)
Return the precession angles (for IAU2000 including the IAU 2000 corrections) at the specified epoch ...
Double fixedEpoch_p
Fixed epoch to be used (MJD)
Definition Precession.h:179
Double dval_p[3]
Cached derivatives.
Definition Precession.h:193
const Euler & derivative(Double epoch)
Return derivative of precession (d-1)
PrecessionTypes method_p
Method to be used.
Definition Precession.h:177
Polynomial< Double > zeta_p[3]
Polynomial coefficients for zeta,z,theta.
Definition Precession.h:189
Double checkEpoch_p
Check epoch.
Definition Precession.h:187
Precession & operator=(const Precession &other)
Copy assignment (deep copy)
this file contains all the compiler specific defines
Definition mainpage.dox:28
unsigned int uInt
Definition aipstype.h:51
int Int
Definition aipstype.h:50
double Double
Definition aipstype.h:55