inverse_phase.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2007 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// psrchive/Util/tempo/inverse_phase.h
10
11#ifndef __P_inverse_phase_h
12#define __P_inverse_phase_h
13
14#include "true_math.h"
15#include "MJD.h"
16#include "Phase.h"
17
18#include <iostream>
19
20namespace Pulsar {
21
23 extern unsigned inverse_phase_calls;
25 extern unsigned inverse_phase_iterations;
26
28
46 template<typename P>
47 MJD inverse_phase (const P& predictor, const Phase& p, MJD guess)
48 {
49
50 MJD dt;
51 int gi = 0;
52
53 double precision = std::max (P::precision, MJD::precision);
55 std::cerr << "inverse_phase: precision=" << precision*1e6
56 << " us" << std::endl;
57
58 inverse_phase_calls ++;
59
60 for (gi=0; gi<10000; gi++) {
61
62 inverse_phase_iterations ++;
63
64 dt = (predictor.phase(guess) - p) / predictor.frequency(guess);
65
66 if (!::true_math::finite(dt.in_seconds()))
67 throw Error (InvalidState, "inverse_phase",
68 "dt not finite; freq=%lf", predictor.frequency(guess));
69
70 guess -= dt; // * converge_faster;
71
73 std::cerr << "inverse_phase: guess=" << guess.printdays(20)
74 << " dt=" << dt.in_seconds()*1e6 << " us" << std::endl;
75
76 if (fabs (dt.in_seconds()) < precision)
77 return guess;
78 }
79
80 std::cerr << "inverse_phase maximum iterations exceeded - error="
81 << dt.in_seconds() * 1e6 << "us" << std::endl;
82
83 return guess;
84 }
85
87
108
109 template<typename P>
110 MJD inverse_phase (const P& predictor, const Phase& p)
111 {
112 MJD guess = predictor.get_reftime()
113 + (p - predictor.get_refphase()) / predictor.get_reffrequency();
114
116 std::cerr << "inverse_phase: reftime=" << predictor.get_reftime()
117 << " refphase=" << predictor.get_refphase()
118 << " reffreq=" << predictor.get_reffrequency()
119 << " first guess = " << guess << std::endl;
120
121 return inverse_phase (predictor, p, guess);
122 }
123
124
125
126}
127
128#endif
static bool verbose
Verbosity flag.
Definition Predictor.h:47

Generated using doxygen 1.14.0