22 #include <gsl/gsl_matrix.h>
23 #include <lal/AVFactories.h>
24 #include <lal/DetectorSite.h>
25 #include <lal/LALStdlib.h>
26 #include <lal/PtoleMetric.h>
27 #include <lal/GetEarthTimes.h>
28 #include <lal/Factorial.h>
31 #define MIN_DURATION (LAL_DAYSID_SI/LAL_TWOPI)
32 #define MIN_MAXFREQ 1.
99 REAL8 omega_s, omega_o;
104 REAL8 cos_l, sin_l, sin_2l;
106 REAL8 cos_a, sin_a, sin_2a;
107 REAL8 cos_d, sin_d, sin_2d;
112 REAL8 tMidnight, tAutumn;
134 REAL8 D_sin_p_o_plus_s;
135 REAL8 D_sin_p_o_minus_s;
136 REAL8 D_cos_p_o_plus_s;
137 REAL8 D_cos_p_o_minus_s;
140 REAL8 sum1, sum2, sum3;
141 REAL8 next1, next2, next3;
193 sin_2l = sin( 2 * lat );
236 phi_o_f = phi_o_i + omega_o *
T;
238 sin_p_o = sin( phi_o_f );
239 cos_p_o = cos( phi_o_f );
240 D_sin_p_o = ( sin( phi_o_f ) - sin( phi_o_i ) ) / D_p_o;
241 D_cos_p_o = ( cos( phi_o_f ) - cos( phi_o_i ) ) / D_p_o;
242 D_sin_2p_o = ( sin( 2 * phi_o_f ) - sin( 2 * phi_o_i ) ) / 2.0 / D_p_o;
243 D_cos_2p_o = ( cos( 2 * phi_o_f ) - cos( 2 * phi_o_i ) ) / 2.0 / D_p_o;
246 phi_s_f = phi_s_i + omega_s *
T;
248 sin_p_s = sin( phi_s_f );
249 cos_p_s = cos( phi_s_f );
250 D_sin_p_s = ( sin( phi_s_f ) - sin( phi_s_i ) ) / D_p_s;
251 D_cos_p_s = ( cos( phi_s_f ) - cos( phi_s_i ) ) / D_p_s;
252 D_sin_2p_s = ( sin( 2 * phi_s_f ) - sin( 2 * phi_s_i ) ) / 2.0 / D_p_s;
253 D_cos_2p_s = ( cos( 2 * phi_s_f ) - cos( 2 * phi_s_i ) ) / 2.0 / D_p_s;
257 = ( sin( phi_o_f + phi_s_f ) - sin( phi_o_i + phi_s_i ) ) / ( D_p_o + D_p_s );
259 = ( sin( phi_o_f - phi_s_f ) - sin( phi_o_i - phi_s_i ) ) / ( D_p_o - D_p_s );
261 = ( cos( phi_o_f + phi_s_f ) - cos( phi_o_i + phi_s_i ) ) / ( D_p_o + D_p_s );
263 = ( cos( phi_o_f - phi_s_f ) - cos( phi_o_i - phi_s_i ) ) / ( D_p_o - D_p_s );
273 sum1 = next1 = D_p_o / 2.0;
274 sum2 = next2 = D_p_o / 3.0 / 2.0;
275 sum3 = next3 = D_p_o;
277 for (
j = 1;
j <= j_max;
j++ ) {
278 next1 *= -pow( D_p_o, 2.0 ) / ( 2.0 *
j + 1.0 ) / ( 2.0 *
j + 2.0 );
280 next2 *= -pow( D_p_o, 2.0 ) / ( 2.0 *
j + 2.0 ) / ( 2.0 *
j + 3.0 );
282 next3 *= -pow( 2.0 * D_p_o, 2.0 ) / ( 2.0 *
j + 1.0 ) / ( 2.0 *
j + 2.0 );
286 if ( D_p_o < D_p_o_crit ) {
287 D_sin_p_o = sin( phi_o_f ) * sum1 + cos( phi_o_f ) * sin( D_p_o ) / D_p_o;
288 D_cos_p_o = cos( phi_o_f ) * sum1 - sin( phi_o_f ) * sin( D_p_o ) / D_p_o;
290 = sin( 2.0 * phi_o_f ) * sum3 + cos( 2.0 * phi_o_f ) * sin( 2.0 * D_p_o ) / 2.0 / D_p_o;
292 = cos( 2.0 * phi_o_f ) * sum3 - sin( 2.0 * phi_o_f ) * sin( 2.0 * D_p_o ) / 2.0 / D_p_o;
299 R_o * D_sin_p_o + R_s * cos_l * D_sin_p_s;
302 R_o * cos_i * D_cos_p_o + R_s * cos_l * D_cos_p_s;
305 -R_o * sin_i * D_cos_p_o + R_s * sin_l;
308 R_o * ( sin_p_o / D_p_o + D_cos_p_o / D_p_o );
311 R_s * ( sin_p_s / D_p_s + D_cos_p_s / D_p_s );
314 R_o * ( -cos_p_o / D_p_o + D_sin_p_o / D_p_o );
317 if ( D_p_o < D_p_o_crit ) {
318 A[4] = R_o * ( cos( phi_o_f ) * sum1 / D_p_o + sin( phi_o_f ) * sum2 );
319 A[6] = R_o * ( sin( phi_o_f ) * sum1 / D_p_o - cos( phi_o_f ) * sum2 );
324 R_s * ( -cos_p_s / D_p_s + D_sin_p_s / D_p_s );
327 R_o * R_o * ( 1 + D_sin_2p_o );
330 R_o * R_s * ( D_sin_p_o_minus_s + D_sin_p_o_plus_s );
333 R_s * R_s * ( 1 + D_sin_2p_s );
336 R_o * R_o * D_cos_2p_o;
339 R_o * R_s * ( -D_cos_p_o_minus_s + D_cos_p_o_plus_s );
342 R_o * R_s * ( D_cos_p_o_minus_s + D_cos_p_o_plus_s );
345 R_s * R_s * D_cos_2p_s;
348 R_o * R_o * ( 1 - D_sin_2p_o );
351 R_o * R_s * ( D_sin_p_o_minus_s - D_sin_p_o_plus_s );
354 R_s * R_s * ( 1 - D_sin_2p_s );
357 R_o * R_s * D_sin_p_o;
360 R_s * R_s * D_sin_p_s;
363 R_o * R_s * D_cos_p_o;
366 R_s * R_s * D_cos_p_s;
374 A[6] * cos_i +
A[7] * cos_l;
377 A[6] * sin_i + R_s * sin_l / 2;
380 A[8] + 2 *
A[9] * cos_l +
A[10] * cos_l * cos_l;
383 A[11] * cos_i +
A[12] * cos_l +
A[13] * cos_i * cos_l +
A[14] * cos_l * cos_l;
386 A[15] * cos_i * cos_i + 2 *
A[16] * cos_i * cos_l +
A[17] * cos_l * cos_l;
389 -
A[11] * sin_i + 2 *
A[18] * sin_l -
A[13] * sin_i * cos_l +
A[19] * sin_2l;
392 A[15] * sin_i * cos_i - 2 *
A[20] * cos_i * sin_l +
A[16] * sin_i * cos_l -
A[21] * sin_2l;
395 A[15] * sin_i * sin_i - 4 *
A[20] * sin_i * sin_l + 2 * R_s * R_s * sin_l * sin_l;
401 Is[1] = ( 2 * sin( phi_o_i ) + 2 * omega_o *
T * cos_p_o + ( -2 + pow( omega_o *
T, 2 ) ) * sin_p_o ) / pow( omega_o *
T, 3 );
404 Is[2] = ( 2 * sin( phi_s_i ) + 2 * omega_s *
T * cos_p_s + ( -2 + pow( omega_s *
T, 2 ) ) * sin_p_s ) / pow( omega_s *
T, 3 );
407 Is[3] = ( -2 * cos( phi_o_i ) + 2 * omega_o *
T * sin_p_o - ( -2 + pow( omega_o *
T, 2 ) ) * cos_p_o ) / pow( omega_o *
T, 3 );
411 Is[4] = ( -2 * cos( phi_s_i ) + 2 * omega_s *
T * sin_p_s - ( -2 + pow( omega_s *
T, 2 ) ) * cos_p_s ) / pow( omega_s *
T, 3 );
417 big_metric->
data[0] =
421 big_metric->
data[1] =
425 big_metric->
data[3] =
426 -
LAL_TWOPI *
f * cos_d * (
A[1] * sin_a +
A[2] * cos_a );
429 big_metric->
data[6] =
430 LAL_TWOPI *
f * ( -
A[1] * sin_d * cos_a +
A[2] * sin_d * sin_a +
A[3] * cos_d );
433 big_metric->
data[2] =
437 big_metric->
data[4] =
438 pow(
LAL_TWOPI, 2 ) *
f * cos_d *
T * ( -
B[1] * sin_a +
B[2] * cos_a );
441 big_metric->
data[7] =
442 pow(
LAL_TWOPI, 2 ) *
f *
T * ( -
B[1] * sin_d * cos_a -
B[2] * sin_d * sin_a +
B[3] * cos_d );
445 big_metric->
data[5] =
446 2 * pow(
LAL_PI *
f * cos_d, 2 ) * (
B[4] * sin_a * sin_a +
B[5] * sin_2a +
B[6] * cos_a * cos_a );
449 big_metric->
data[8] =
450 2 * pow(
LAL_PI *
f, 2 ) * cos_d * (
B[4] * sin_a * cos_a * sin_d -
B[5] * sin_a * sin_a * sin_d
451 -
B[7] * sin_a * cos_d +
B[5] * cos_a * cos_a * sin_d -
B[6] * sin_a * cos_a * sin_d
452 +
B[8] * cos_a * cos_d );
455 big_metric->
data[9] =
456 2 * pow(
LAL_PI *
f, 2 ) * (
B[4] * pow( cos_a * sin_d, 2 ) +
B[6] * pow( sin_a * sin_d, 2 )
457 +
B[9] * pow( cos_d, 2 ) -
B[5] * sin_2a * pow( sin_d, 2 ) -
B[8] * sin_a * sin_2d
458 -
B[7] * cos_a * sin_2d );
463 big_metric->
data[10] =
467 big_metric->
data[11] =
471 big_metric->
data[12] =
T * 2 * pow(
LAL_PI *
f, 2 ) *
T * ( -cos_d * sin_a * ( R_o * Is[1] + R_s * cos_l * Is[2] ) + cos_d * cos_a * ( R_o * cos_i * Is[3] + R_s * cos_l * Is[4] ) );
474 big_metric->
data[13] =
T * 2 * pow(
LAL_PI *
f, 2 ) *
T * ( -sin_d * cos_a * ( R_o * Is[1] + R_s * cos_l * Is[2] ) - sin_d * sin_a * ( R_o * cos_i * Is[3] + R_s * cos_l * Is[4] ) + cos_d * ( R_o * sin_i * Is[3] + R_s * sin_l / 3 ) );
563 metric->
data[0] = big_metric->
data[2]
564 - big_metric->
data[1] * big_metric->
data[1] / big_metric->
data[0];
566 metric->
data[1] = big_metric->
data[4]
567 - big_metric->
data[1] * big_metric->
data[3] / big_metric->
data[0];
569 metric->
data[2] = big_metric->
data[5]
570 - big_metric->
data[3] * big_metric->
data[3] / big_metric->
data[0];
572 metric->
data[3] = big_metric->
data[7]
573 - big_metric->
data[6] * big_metric->
data[1] / big_metric->
data[0];
575 metric->
data[4] = big_metric->
data[8]
576 - big_metric->
data[6] * big_metric->
data[3] / big_metric->
data[0];
578 metric->
data[5] = big_metric->
data[9]
579 - big_metric->
data[6] * big_metric->
data[6] / big_metric->
data[0];
583 metric->
data[6] = big_metric->
data[11]
584 - big_metric->
data[1] * big_metric->
data[10] / big_metric->
data[0];
587 metric->
data[7] = big_metric->
data[12]
588 - big_metric->
data[3] * big_metric->
data[10] / big_metric->
data[0];
591 metric->
data[8] = big_metric->
data[13]
592 - big_metric->
data[6] * big_metric->
data[10] / big_metric->
data[0];
595 metric->
data[9] = big_metric->
data[14]
596 - big_metric->
data[10] * big_metric->
data[10] / big_metric->
data[0];
747 for (
s = 0,
i = 1;
i < metric->
length;
s++ ) {
758 for (
i = 1;
i <
s;
i++ )
759 for (
j = 1;
j <=
i;
j++ ) {
760 INT4 i0 = (
i * (
i + 1 ) ) >> 1;
761 INT4 myj0 = (
j * (
j + 1 ) ) >> 1;
774 for (
i = 0;
i <
s;
i++ ) {
775 INT4 i0 =
i * (
i + 1 ) >> 1;
777 data[2 * i0] =
data[2 * i0 + 1] = 0.0;
810 while ( ( trylength = dim * ( dim + 1 ) / 2 ) <= length ) {
811 if ( length == trylength ) {
819 XLALPrintError(
"\nInput vector is inconsisten with symmetric quadratic matrix!\n\n" );
840 for (
size_t i = 0;
i < metric->size1; ++
i ) {
841 for (
size_t j =
i;
j < metric->size2; ++
j ) {
842 gsl_matrix_set( metric,
i,
j, (
847 gsl_matrix_set( metric,
j,
i, gsl_matrix_get( metric,
i,
j ) );
#define ABORT(statusptr, code, mesg)
#define XLAL_CHECK_LAL(sp, assertion,...)
#define ENDFAIL(statusptr)
#define TRY(func, statusptr)
#define ATTATCHSTATUSPTR(statusptr)
#define ASSERT(assertion, statusptr, code, mesg)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
#define BEGINFAIL(statusptr)
static const UINT8 LAL_FACT[]
int XLALGetEarthTimes(const LIGOTimeGPS *tepoch, REAL8 *tMidnight, REAL8 *tAutumn)
This function takes a GPS time from tepoch and uses it to assign tAutumn and tMidnight,...
#define PTOLEMETRICH_MSGEPARM
#define PTOLEMETRICH_EDIM
#define PTOLEMETRICH_MSGEMETRIC
#define PTOLEMETRICH_MSGENONULL
void LALPtoleMetric(LALStatus *status, REAL8Vector *metric, PtoleMetricIn *input)
Computes metric components for a pulsar search in the `‘Ptolemaic’' approximation; both the Earth's s...
#define PTOLEMETRICH_ENULL
void LALProjectMetric(LALStatus *stat, REAL8Vector *metric, BOOLEAN errors)
Project out the zeroth dimension of a metric.
#define PTOLEMETRICH_EPARM
#define PTOLEMETRICH_MSGEDIM
#define PTOLEMETRICH_EMETRIC
int XLALSpindownMetric(gsl_matrix *metric, double Tspan)
Frequency and frequency derivative components of the metric, suitable for a directed search with only...
#define PTOLEMETRICH_MSGENULL
#define PTOLEMETRICH_ENONULL
void LALPulsarMetric(LALStatus *stat, REAL8Vector **metric, PtoleMetricIn *input)
Unified "wrapper" to provide a uniform interface to LALPtoleMetric() and LALCoherentMetric().
int XLALFindMetricDim(const REAL8Vector *metric)
Figure out dimension of a REAL8Vector -encoded metric (see PMETRIC_INDEX() ).
@ LAL_PMETRIC_COH_PTOLE_ANALYTIC
COORDINATESYSTEM_EQUATORIAL
void LALDCreateVector(LALStatus *, REAL8Vector **, UINT4)
void LALDDestroyVector(LALStatus *, REAL8Vector **)
#define XLAL_CHECK(assertion,...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
REAL8 vertexLongitudeRadians
REAL8 vertexLatitudeRadians
This structure will likely be changed to match up better with those under StackMetric....
SkyPosition position
The equatorial coordinates at which the metric components are evaluated.
REAL4Vector * spindown
The (dimensionless) spindown parameters for which the metric components are evaluated.
REAL4 maxFreq
The maximum frequency to be searched, in Hz.
LALPulsarMetricType metricType
The type of metric to use: analytic, Ptolemaic or fully ephemeris-based.
const LALDetector * site
The detector site, used only for its latitude and longitude.
REAL4 duration
Duration of integration, in seconds.
LIGOTimeGPS epoch
When the coherent integration begins.